aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2012-10-25 13:21:13 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2012-10-25 13:21:13 +0200
commit8421cfdca94795cdb6513d3d6c38abd3a416373b (patch)
treeb259bfa95d54a3dbc09033dc5040c6e27a0f1036
parentf4e033e836d36ee95103886032932bf823db5e3f (diff)
Imported Upstream version 1.0.2upstream/1.0.2
-rw-r--r--ChangeLog369
-rw-r--r--Makefile.in6
-rw-r--r--NEWS20
-rw-r--r--RELEASE37
-rw-r--r--aclocal.m41
-rw-r--r--common/Makefile.in6
-rw-r--r--common/m4/Makefile.in6
-rw-r--r--config.h.in11
-rwxr-xr-xconfigure453
-rw-r--r--configure.ac8
-rw-r--r--docs/Makefile.in6
-rw-r--r--docs/design/Makefile.in6
-rw-r--r--docs/design/part-buffering.txt2
-rw-r--r--docs/design/part-negotiation.txt6
-rw-r--r--docs/design/part-preroll.txt3
-rw-r--r--docs/design/part-qos.txt2
-rw-r--r--docs/design/part-sparsestreams.txt3
-rw-r--r--docs/design/part-stream-status.txt11
-rw-r--r--docs/design/part-synchronisation.txt61
-rw-r--r--docs/faq/Makefile.in6
-rw-r--r--docs/gst/Makefile.in6
-rw-r--r--docs/gst/html/GstBin.html2
-rw-r--r--docs/gst/html/GstElement.html7
-rw-r--r--docs/gst/html/GstElementFactory.html2
-rw-r--r--docs/gst/html/GstObject.html2
-rw-r--r--docs/gst/html/GstPad.html5
-rw-r--r--docs/gst/html/GstPadTemplate.html2
-rw-r--r--docs/gst/html/GstTypeFindFactory.html2
-rw-r--r--docs/gst/html/gst-building.html4
-rw-r--r--docs/gst/html/gst-running.html4
-rw-r--r--docs/gst/html/gstreamer-Gst.html4
-rw-r--r--docs/gst/html/gstreamer-GstBuffer.html2
-rw-r--r--docs/gst/html/gstreamer-GstCaps.html2
-rw-r--r--docs/gst/html/gstreamer-GstEvent.html2
-rw-r--r--docs/gst/html/gstreamer-GstGError.html2
-rw-r--r--docs/gst/html/gstreamer-GstIterator.html2
-rw-r--r--docs/gst/html/gstreamer-GstMessage.html2
-rw-r--r--docs/gst/html/gstreamer-GstQuery.html7
-rw-r--r--docs/gst/html/gstreamer-GstSample.html3
-rw-r--r--docs/gst/html/gstreamer-GstTagList.html2
-rw-r--r--docs/gst/html/gstreamer-GstVersion.html2
-rw-r--r--docs/gst/html/gstreamer.devhelp26
-rw-r--r--docs/gst/html/index.html2
-rw-r--r--docs/libs/Makefile.am2
-rw-r--r--docs/libs/Makefile.in8
-rw-r--r--docs/libs/html/GstBaseSrc.html6
-rw-r--r--docs/libs/html/GstBaseTransform.html4
-rw-r--r--docs/libs/html/GstCollectPads.html6
-rw-r--r--docs/libs/html/gstreamer-libs.devhelp26
-rw-r--r--docs/libs/html/index.html2
-rw-r--r--docs/manual/Makefile.in6
-rw-r--r--docs/manual/advanced-autoplugging.xml387
-rw-r--r--docs/manual/advanced-buffering.xml450
-rw-r--r--docs/manual/advanced-clocks.xml328
-rw-r--r--docs/manual/advanced-dataaccess.xml357
-rw-r--r--docs/manual/advanced-threads.xml425
-rw-r--r--docs/manual/appendix-compiling.xml76
-rw-r--r--docs/manual/basics-bins.xml11
-rw-r--r--docs/manual/basics-bus.xml4
-rw-r--r--docs/manual/basics-elements.xml2
-rw-r--r--docs/manual/basics-pads.xml2
-rw-r--r--docs/manual/communication.pngbin23023 -> 31212 bytes
-rw-r--r--docs/manual/gstreamer-overview.pngbin102694 -> 102876 bytes
-rw-r--r--docs/manual/highlevel-playback.xml (renamed from docs/manual/highlevel-components.xml)255
-rw-r--r--docs/manual/intro-gstreamer.xml3
-rw-r--r--docs/manual/manual.xml8
-rw-r--r--docs/manual/mime-world.pngbin41360 -> 48705 bytes
-rw-r--r--docs/manual/thread-buffering.pngbin22860 -> 23327 bytes
-rw-r--r--docs/plugins/Makefile.in6
-rw-r--r--docs/plugins/html/ch01.html2
-rw-r--r--docs/plugins/html/ch02.html2
-rw-r--r--docs/plugins/html/gstreamer-plugins-capsfilter.html6
-rw-r--r--docs/plugins/html/gstreamer-plugins-fakesink.html6
-rw-r--r--docs/plugins/html/gstreamer-plugins-fakesrc.html6
-rw-r--r--docs/plugins/html/gstreamer-plugins-fdsink.html4
-rw-r--r--docs/plugins/html/gstreamer-plugins-fdsrc.html6
-rw-r--r--docs/plugins/html/gstreamer-plugins-filesink.html6
-rw-r--r--docs/plugins/html/gstreamer-plugins-filesrc.html6
-rw-r--r--docs/plugins/html/gstreamer-plugins-funnel.html4
-rw-r--r--docs/plugins/html/gstreamer-plugins-identity.html4
-rw-r--r--docs/plugins/html/gstreamer-plugins-input-selector.html4
-rw-r--r--docs/plugins/html/gstreamer-plugins-multiqueue.html6
-rw-r--r--docs/plugins/html/gstreamer-plugins-output-selector.html4
-rw-r--r--docs/plugins/html/gstreamer-plugins-plugin-coreelements.html6
-rw-r--r--docs/plugins/html/gstreamer-plugins-queue.html4
-rw-r--r--docs/plugins/html/gstreamer-plugins-queue2.html4
-rw-r--r--docs/plugins/html/gstreamer-plugins-tee.html6
-rw-r--r--docs/plugins/html/gstreamer-plugins-typefind.html4
-rw-r--r--docs/plugins/html/gstreamer-plugins-valve.html4
-rw-r--r--docs/plugins/html/gstreamer-plugins.devhelp284
-rw-r--r--docs/plugins/html/index.html2
-rw-r--r--docs/plugins/inspect/plugin-coreelements.xml2
-rw-r--r--docs/pwg/Makefile.in6
-rw-r--r--docs/pwg/advanced-clock.xml30
-rw-r--r--docs/pwg/advanced-events.xml8
-rw-r--r--docs/pwg/advanced-negotiation.xml624
-rw-r--r--docs/pwg/advanced-qos.xml283
-rw-r--r--docs/pwg/building-boiler.xml10
-rw-r--r--docs/pwg/building-eventfn.xml16
-rw-r--r--docs/pwg/building-queryfn.xml72
-rw-r--r--docs/pwg/intro-basics.xml4
-rw-r--r--docs/pwg/pwg.xml16
-rw-r--r--docs/slides/Makefile.in6
-rw-r--r--docs/xsl/Makefile.in6
-rw-r--r--gst/Makefile.in6
-rw-r--r--gst/gst.c3
-rw-r--r--gst/gstallocator.c1
-rw-r--r--gst/gstbin.c2
-rw-r--r--gst/gstelement.c50
-rw-r--r--gst/gstelement.h6
-rw-r--r--gst/gstevent.c1
-rw-r--r--gst/gstinfo.c30
-rw-r--r--gst/gstpad.c2
-rw-r--r--gst/gstpad.h3
-rw-r--r--gst/gstpipeline.c2
-rw-r--r--gst/gstpoll.c4
-rw-r--r--gst/gstpreset.c1
-rw-r--r--gst/gstquery.c5
-rw-r--r--gst/gstsample.c2
-rw-r--r--gst/parse/Makefile.in6
-rw-r--r--gst/parse/grammar.tab.h37
-rw-r--r--gstreamer.doap10
-rw-r--r--gstreamer.spec2
-rw-r--r--libs/Makefile.in6
-rw-r--r--libs/gst/Makefile.in6
-rw-r--r--libs/gst/base/Makefile.in6
-rw-r--r--libs/gst/base/gstbaseparse.c2
-rw-r--r--libs/gst/base/gstbasesrc.c67
-rw-r--r--libs/gst/base/gstbasesrc.h2
-rw-r--r--libs/gst/base/gstcollectpads.c44
-rw-r--r--libs/gst/base/gstcollectpads.h4
-rw-r--r--libs/gst/check/Makefile.in6
-rw-r--r--libs/gst/check/libcheck/Makefile.am6
-rw-r--r--libs/gst/check/libcheck/Makefile.in18
-rw-r--r--libs/gst/controller/Makefile.in6
-rw-r--r--libs/gst/helpers/Makefile.in6
-rw-r--r--libs/gst/net/Makefile.in6
-rw-r--r--m4/Makefile.in6
-rw-r--r--m4/ax_pthread.m4309
-rw-r--r--pkgconfig/Makefile.in6
-rw-r--r--plugins/Makefile.in6
-rw-r--r--plugins/elements/Makefile.in6
-rw-r--r--po/af.gmobin15086 -> 15086 bytes
-rw-r--r--po/af.po2
-rw-r--r--po/az.gmobin1683 -> 1683 bytes
-rw-r--r--po/az.po2
-rw-r--r--po/be.gmobin5090 -> 5090 bytes
-rw-r--r--po/be.po2
-rw-r--r--po/bg.gmobin43541 -> 43541 bytes
-rw-r--r--po/bg.po2
-rw-r--r--po/ca.gmobin33891 -> 33891 bytes
-rw-r--r--po/ca.po2
-rw-r--r--po/cs.gmobin33422 -> 33422 bytes
-rw-r--r--po/cs.po2
-rw-r--r--po/da.gmobin32045 -> 32045 bytes
-rw-r--r--po/da.po2
-rw-r--r--po/de.gmobin33808 -> 33808 bytes
-rw-r--r--po/de.po2
-rw-r--r--po/el.gmobin44236 -> 44236 bytes
-rw-r--r--po/el.po2
-rw-r--r--po/en_GB.gmobin11570 -> 11570 bytes
-rw-r--r--po/en_GB.po2
-rw-r--r--po/eo.gmobin4307 -> 4307 bytes
-rw-r--r--po/eo.po2
-rw-r--r--po/es.gmobin33970 -> 33970 bytes
-rw-r--r--po/es.po2
-rw-r--r--po/eu.gmobin29611 -> 29611 bytes
-rw-r--r--po/eu.po2
-rw-r--r--po/fi.gmobin32473 -> 32473 bytes
-rw-r--r--po/fi.po2
-rw-r--r--po/fr.gmobin34098 -> 34098 bytes
-rw-r--r--po/fr.po2
-rw-r--r--po/gl.gmobin33732 -> 33732 bytes
-rw-r--r--po/gl.po2
-rw-r--r--po/gstreamer-1.0.pot10
-rw-r--r--po/hu.gmobin33412 -> 33412 bytes
-rw-r--r--po/hu.po2
-rw-r--r--po/id.gmobin31807 -> 31807 bytes
-rw-r--r--po/id.po2
-rw-r--r--po/it.gmobin33582 -> 33582 bytes
-rw-r--r--po/it.po2
-rw-r--r--po/ja.gmobin14089 -> 14089 bytes
-rw-r--r--po/ja.po2
-rw-r--r--po/lt.gmobin31450 -> 31450 bytes
-rw-r--r--po/lt.po2
-rw-r--r--po/nb.gmobin9881 -> 9881 bytes
-rw-r--r--po/nb.po2
-rw-r--r--po/nl.gmobin32860 -> 32860 bytes
-rw-r--r--po/nl.po2
-rw-r--r--po/pl.gmobin33187 -> 33187 bytes
-rw-r--r--po/pl.po2
-rw-r--r--po/pt_BR.gmobin33397 -> 33397 bytes
-rw-r--r--po/pt_BR.po2
-rw-r--r--po/ro.gmobin32820 -> 32820 bytes
-rw-r--r--po/ro.po2
-rw-r--r--po/ru.gmobin42869 -> 42869 bytes
-rw-r--r--po/ru.po2
-rw-r--r--po/rw.gmobin689 -> 689 bytes
-rw-r--r--po/rw.po2
-rw-r--r--po/sk.gmobin32963 -> 32963 bytes
-rw-r--r--po/sk.po2
-rw-r--r--po/sl.gmobin32774 -> 32774 bytes
-rw-r--r--po/sl.po2
-rw-r--r--po/sq.gmobin12731 -> 12731 bytes
-rw-r--r--po/sq.po2
-rw-r--r--po/sr.gmobin42372 -> 42372 bytes
-rw-r--r--po/sr.po2
-rw-r--r--po/sv.gmobin32355 -> 32355 bytes
-rw-r--r--po/sv.po2
-rw-r--r--po/tr.gmobin12104 -> 12104 bytes
-rw-r--r--po/tr.po2
-rw-r--r--po/uk.gmobin43112 -> 43112 bytes
-rw-r--r--po/uk.po2
-rw-r--r--po/vi.gmobin34602 -> 34602 bytes
-rw-r--r--po/vi.po2
-rw-r--r--po/zh_CN.gmobin25404 -> 25404 bytes
-rw-r--r--po/zh_CN.po2
-rw-r--r--po/zh_TW.gmobin7285 -> 7285 bytes
-rw-r--r--po/zh_TW.po2
-rw-r--r--tests/Makefile.in6
-rw-r--r--tests/benchmarks/Makefile.in6
-rw-r--r--tests/check/Makefile.in6
-rw-r--r--tests/examples/Makefile.in6
-rw-r--r--tests/examples/adapter/Makefile.in6
-rw-r--r--tests/examples/controller/Makefile.in6
-rw-r--r--tests/examples/helloworld/Makefile.in6
-rw-r--r--tests/examples/launch/Makefile.in6
-rw-r--r--tests/examples/manual/Makefile.am31
-rw-r--r--tests/examples/manual/Makefile.in121
-rw-r--r--tests/examples/manual/decodebin.c6
-rw-r--r--tests/examples/manual/dynamic.c330
-rw-r--r--tests/examples/manual/effectswitch.c192
-rw-r--r--tests/examples/manual/norebuffer.c153
-rw-r--r--tests/examples/manual/playbin.c6
-rw-r--r--tests/examples/manual/playsink.c126
-rw-r--r--tests/examples/manual/testrtpool.c235
-rw-r--r--tests/examples/memory/Makefile.in6
-rw-r--r--tests/examples/metadata/Makefile.in6
-rw-r--r--tests/examples/queue/Makefile.in6
-rw-r--r--tests/examples/stepping/Makefile.in6
-rw-r--r--tests/examples/streams/Makefile.am6
-rw-r--r--tests/examples/streams/Makefile.in16
-rw-r--r--tests/examples/typefind/Makefile.in6
-rw-r--r--tests/misc/Makefile.in6
-rw-r--r--tools/Makefile.in6
-rw-r--r--win32/common/config.h19
-rw-r--r--win32/common/gstversion.h2
247 files changed, 5185 insertions, 1639 deletions
diff --git a/ChangeLog b/ChangeLog
index 1335bd4..ef7250d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,9 +1,374 @@
+=== release 1.0.2 ===
+
+2012-10-25 Tim-Philipp Müller <tim@centricular.net>
+
+ * configure.ac:
+ releasing 1.0.2
+
+2012-10-25 00:04:49 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ Release 1.0.2
+
+2012-10-24 16:13:34 +0400 Руслан Ижбулатов <lrn1986@gmail.com>
+
+ * tests/examples/manual/Makefile.am:
+ examples: link testrtpool to pthreads
+ Fixes #686787
+
+2012-10-24 11:46:01 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstevent.c:
+ event: Allow GST_CLOCK_TIME_NONE as duration for GAP events
+
+2012-10-24 11:16:12 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: use new GCond for async state change
+ Use a new GCond, protected with the object lock, to signal completion
+ of the async state change. We can't reuse the live lock because that
+ one can be locked when the create function blocks.
+ Fixes https://bugzilla.gnome.org/show_bug.cgi?id=686723
+
+2012-10-22 20:25:43 +0200 Miguel Angel Cabrera Moya <madmac2501@gmail.com>
+
+ * gst/gstallocator.c:
+ allocator: fix memory leak in _fallback_mem_copy
+ https://bugzilla.gnome.org/show_bug.cgi?id=686658
+
+2012-10-22 20:33:06 +0200 Miguel Angel Cabrera Moya <madmac2501@gmail.com>
+
+ * gst/gstpreset.c:
+ preset: remove variable not read
+ https://bugzilla.gnome.org/show_bug.cgi?id=686659
+
+2012-10-22 15:04:26 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * configure.ac:
+ * libs/gst/check/libcheck/Makefile.am:
+ * m4/ax_pthread.m4:
+ * tests/examples/streams/Makefile.am:
+ configure: Properly check for pthread
+ The old check failed on Android for example.
+
+2012-10-22 10:25:40 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstinfo.c:
+ info: Don't use GST_DEBUG() in gst_debug_add_log_function() and related functions unconditionally
+ If GStreamer was not initialized yet this will cause g_warnings().
+
+2012-10-20 19:44:43 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * libs/gst/base/gstcollectpads.h:
+ collectpads: fix g-i annotation for GstCollectPadsBufferFunction
+ We pass ownership of the buffer to the function.
+
+2012-10-20 12:54:06 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * docs/libs/Makefile.am:
+ * gst/gst.c:
+ g_type_init() is no longer required and deprecated in glib >= 2.35.0
+ https://bugzilla.gnome.org/show_bug.cgi?id=686456
+
+2012-10-19 13:36:33 -0700 Michael Smith <msmith@rdio.com>
+
+ * gst/gstsample.c:
+ GstSample: fix typo in G-I annotations, allows creating GstSamples from bindings.
+
+2012-10-18 15:31:17 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpoll.c:
+ poll: Fix compiler warning about constness
+ passing argument 1 of 'g_mutex_lock' discards 'const' qualifier from pointer target type
+ passing argument 1 of 'g_mutex_unlock' discards 'const' qualifier from pointer target type
+
+2012-10-17 16:49:19 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstbin.c:
+ * gst/gstpipeline.c:
+ bin, pipeline: use gst_element_class_set_static_metadata()
+ So the strings aren't copied.
+
+2012-10-16 12:31:50 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ element: API: Add GstElement::post_message() vfunc
+ Conflicts:
+ gst/gstelement.h
+
+2012-10-16 11:54:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/advanced-events.xml:
+ pwg: link to caps and qos chapters
+
+2012-10-16 11:20:59 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/building-boiler.xml:
+ * docs/pwg/building-queryfn.xml:
+ * docs/pwg/pwg.xml:
+ pwg: add section about query function
+
+2012-10-16 11:12:38 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/building-eventfn.xml:
+ pwg: fix event function
+
+2012-10-15 19:56:36 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstcollectpads.c:
+ * libs/gst/base/gstcollectpads.h:
+ collectpads: minor docs fixes
+
+2012-10-15 19:55:42 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * libs/gst/base/gstcollectpads.c:
+ collectpads: fix buffer leak in clip_time
+
+2012-10-15 18:44:52 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstcollectpads.c:
+ collectpads: call clip function with user data
+
+2012-10-15 14:06:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/pwg.xml:
+ pwg: reorder some chapters
+ Reorder some chapter so that they match the steps done in the
+ element.
+
+2012-10-15 13:59:50 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/advanced-negotiation.xml:
+ pwg: small tweaks to negotiation
+
+2012-10-15 13:44:51 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/advanced-negotiation.xml:
+ pwg: improve negotiation documentation some more
+
+2012-10-15 12:10:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-negotiation.txt:
+ * docs/pwg/advanced-negotiation.xml:
+ pwg: update negotiation part
+
+2012-10-15 12:10:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-synchronisation.txt:
+ docs: update synchronization docs
+
+2012-10-12 16:58:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/advanced-negotiation.xml:
+ pwg: work on rewriting caps negotiation docs
+
+2012-10-12 16:09:26 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-negotiation.txt:
+ design: rename passthrough negotiation
+ Rename passthrough negotiation to transform negotiation to avoid
+ confusion with passthrough operation.
+
+2012-10-12 13:15:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/basics-elements.xml:
+ * docs/manual/basics-pads.xml:
+ manual: no more new-decoded-pad
+
+2012-10-12 13:13:32 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/advanced-dataaccess.xml:
+ * docs/manual/appendix-compiling.xml:
+ * docs/manual/manual.xml:
+ manual: move embedding elements to separate chapter
+
+2012-10-12 13:01:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/advanced-qos.xml:
+ pwg: small example for throttle
+
+2012-10-12 12:55:57 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/advanced-qos.xml:
+ * docs/pwg/pwg.xml:
+ pwg: add info about QoS
+
+2012-10-12 12:55:25 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/intro-basics.xml:
+ pwg: adds some more links
+
+2012-10-12 12:55:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-qos.txt:
+ qos: messages are posted, not dropped
+
+2012-10-12 10:35:43 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/communication.png:
+ * docs/manual/diagrams-general.svg:
+ * docs/manual/diagrams-pipelines.svg:
+ * docs/manual/gstreamer-overview.png:
+ * docs/manual/mime-world.png:
+ * docs/manual/thread-buffering.png:
+ manual: update graphics
+
+2012-10-11 17:10:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/advanced-buffering.xml:
+ * tests/examples/manual/.gitignore:
+ * tests/examples/manual/Makefile.am:
+ manual: add example of no-rebuffer buffering strategy
+
+2012-10-11 17:10:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/basics-bus.xml:
+ * docs/manual/intro-gstreamer.xml:
+ manual: small tweaks
+
+2012-10-11 17:09:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstquery.c:
+ query: buffering time left is in milliseconds
+
+2012-10-11 17:07:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/basics-bins.xml:
+ manual: add some text about bin state change order
+
+2012-10-10 16:43:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/highlevel-playback.xml:
+ * tests/examples/manual/Makefile.am:
+ manual: talk about playsink
+ Talk about playsink and give an example of its usage.
+
+2012-10-10 13:08:31 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/advanced-autoplugging.xml:
+ * docs/manual/highlevel-components.xml:
+ * docs/manual/highlevel-playback.xml:
+ * docs/manual/manual.xml:
+ * tests/examples/manual/Makefile.am:
+ manual: add something about uridecodebin
+
+2012-10-10 11:35:01 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstcollectpads.c:
+ collectpads: ensure all timestamps are in same time domain
+ ... by not only processing incoming buffers through a clip function,
+ but also other timestamps such as those coming from GAP event.
+
+2012-10-10 10:36:32 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * libs/gst/base/gstbaseparse.c:
+ * libs/gst/base/gstbasesrc.h:
+ docs: adjust some parameter mismatches
+
+2012-10-10 11:34:27 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Downgrade GST_WARNING to GST_INFO
+ It's usually not a problem if a query fails if there's no peer,
+ especially as it will happen during pad linking (caps query)
+ quite often and spams the logs.
+
+2012-10-09 17:06:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/advanced-autoplugging.xml:
+ * tests/examples/manual/.gitignore:
+ * tests/examples/manual/Makefile.am:
+ manual: remove outdated autoplugging section
+ Remove autoplugging chapter and point to decodebin/playbin examples.
+
+2012-10-09 16:12:01 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/advanced-threads.xml:
+ * tests/examples/manual/.gitignore:
+ * tests/examples/manual/Makefile.am:
+ manual: Talk about threading
+ Rework the threading chapter.
+ Talk about stream-status and give some examples on how to change
+ the thread priorities.
+
+2012-10-09 15:57:29 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-stream-status.txt:
+ design: improve stream-status document
+
+2012-10-09 15:31:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: retrieve the result from start_complete
+ gst_base_src_start_complete() can fail when the thread could not be
+ started, for example. Make sure it causes the state change to fail by
+ retrieving the result from _start_complete().
+
+2012-10-09 15:31:04 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: improve debug
+
+2012-10-09 10:24:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.h:
+ pad: small docs fixes and remove a 0.11 fixme
+
+2012-10-08 16:42:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-buffering.txt:
+ * docs/manual/advanced-buffering.xml:
+ * docs/manual/manual.xml:
+ manual: talk a bit about buffering
+
+2012-10-08 13:22:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/advanced-clocks.xml:
+ * docs/pwg/advanced-clock.xml:
+ docs: improve clock chapter
+
+2012-10-08 10:39:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/advanced-dataaccess.xml:
+ * tests/examples/manual/Makefile.am:
+ manual: add example for effect switching
+
+2012-10-08 09:11:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-preroll.txt:
+ * docs/design/part-sparsestreams.txt:
+ docs: small updates
+
+2012-10-07 16:48:25 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ Back to development (bug-fixing)
+
=== release 1.0.1 ===
-2012-10-07 Tim-Philipp Müller <tim@centricular.net>
+2012-10-07 13:10:33 +0100 Tim-Philipp Müller <tim@centricular.net>
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
* configure.ac:
- releasing 1.0.1
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ * win32/common/gstenumtypes.c:
+ * win32/common/gstversion.h:
+ Release 1.0.1
2012-10-07 00:15:49 +0100 Tim-Philipp Müller <tim@centricular.net>
diff --git a/Makefile.in b/Makefile.in
index eb25a94..30e208b 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -102,7 +102,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -407,6 +407,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -443,6 +446,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/NEWS b/NEWS
index 432cd8a..8cbffdb 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,22 @@
-This is GStreamer 1.0.1
+This is GStreamer 1.0.2
+
+Changes since 1.0.1:
+
+ * Parallel installability with 0.10.x series
+ * collectpads: ensure all timestamps are in same time domain
+ * gobject-introspection: fix GstSample annotations
+ * add GstElement::post_message() vfunc
+ * info: allow gst_debug_add_log_function() to be called before gst_init()
+ * event: allow GST_CLOCK_TIME_NONE as duration for GAP events
+ * documentation: new chapters and updates for the application development manual and the plugin writer's guide
+
+Bugs fixed since 1.0.1:
+
+ * 686456 : g_type_init is no longer required
+ * 686658 : allocator: fix memory leak in _fallback_mem_copy
+ * 686659 : preset: remove variable not read
+ * 686723 : basesrc: generic/states test in -base now hangs with appsrc
+ * 686787 : testrtpool must be linked to pthreads
Changes since 1.0.0:
diff --git a/RELEASE b/RELEASE
index 13831ce..7d37da9 100644
--- a/RELEASE
+++ b/RELEASE
@@ -1,5 +1,5 @@
-Release notes for GStreamer 1.0.1
+Release notes for GStreamer 1.0.2
The GStreamer team is proud to announce a new bug-fix release
@@ -43,26 +43,20 @@ contains a set of codecs plugins based on libav (formerly gst-ffmpeg)
Features of this release
* Parallel installability with 0.10.x series
- * Capsfilter prefers filter caps over passthrough now
- * Application Development Manual, Plugin Writer's Guide and other documentation updated and extended for 1.0
- * Bug fixes
+ * collectpads: ensure all timestamps are in same time domain
+ * gobject-introspection: fix GstSample annotations
+ * add GstElement::post_message() vfunc
+ * info: allow gst_debug_add_log_function() to be called before gst_init()
+ * event: allow GST_CLOCK_TIME_NONE as duration for GAP events
+ * documentation: new chapters and updates for the application development manual and the plugin writer's guide
Bugs fixed in this release
- * 680862 : " identity " with single-segment=true gives buffer.pts of CLOCK_TIME_NONE
- * 684538 : baseparse: no timestamps after seeking in mp3 or aac
- * 684755 : typo - whithin > within
- * 684765 : Plugins without a klass in the metadata crashes autoaudiosink
- * 684809 : proxypad don't hold a ref to their internal pad while streaming through it
- * 684970 : Don't register printf extension for %p when glib is not using system printf
- * 684981 : Pipeline hangs on PREROLLING negotiating caps
- * 685072 : memory: map(READ)/unmap clears the READONLY status
-
-API changes in this release
-
- - API additions:
-
- * gst_base_transform_set_prefer_passthrough ()
+ * 686456 : g_type_init is no longer required
+ * 686658 : allocator: fix memory leak in _fallback_mem_copy
+ * 686659 : preset: remove variable not read
+ * 686723 : basesrc: generic/states test in -base now hangs with appsrc
+ * 686787 : testrtpool must be linked to pthreads
==== Download ====
@@ -99,12 +93,11 @@ subscribe to the gstreamer-devel list.
Contributors to this release
- * Jan Schmidt
- * Josep Torra Valles
* Mark Nauwelaerts
- * Olivier Blin
- * Olivier Crête
+ * Michael Smith
+ * Miguel Angel Cabrera Moya
* Sebastian Dröge
* Tim-Philipp Müller
* Wim Taymans
+ * Руслан Ижбулатов
  \ No newline at end of file
diff --git a/aclocal.m4 b/aclocal.m4
index f989769..3211f16 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1181,6 +1181,7 @@ 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/ax_pthread.m4])
m4_include([m4/check-checks.m4])
m4_include([m4/gettext.m4])
m4_include([m4/iconv.m4])
diff --git a/common/Makefile.in b/common/Makefile.in
index 27dd5e0..e38a090 100644
--- a/common/Makefile.in
+++ b/common/Makefile.in
@@ -80,7 +80,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -339,6 +339,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -375,6 +378,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/common/m4/Makefile.in b/common/m4/Makefile.in
index ac9f419..05de253 100644
--- a/common/m4/Makefile.in
+++ b/common/m4/Makefile.in
@@ -80,7 +80,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -299,6 +299,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -335,6 +338,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/config.h.in b/config.h.in
index 514bd9d..d92c89e 100644
--- a/config.h.in
+++ b/config.h.in
@@ -208,8 +208,11 @@
/* 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 you have POSIX threads libraries and header files. */
+#undef HAVE_PTHREAD
+
+/* Have PTHREAD_PRIO_INHERIT. */
+#undef HAVE_PTHREAD_PRIO_INHERIT
/* Define if RDTSC is available */
#undef HAVE_RDTSC
@@ -344,6 +347,10 @@
/* directory where plugins are located */
#undef PLUGINDIR
+/* Define to necessary symbol if this constant uses a non-standard name on
+ your system. */
+#undef PTHREAD_CREATE_JOINABLE
+
/* The size of `char', as computed by sizeof. */
#undef SIZEOF_CHAR
diff --git a/configure b/configure
index 73f0c5e..39797b4 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for GStreamer 1.0.1.
+# Generated by GNU Autoconf 2.69 for GStreamer 1.0.2.
#
# Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer>.
#
@@ -591,8 +591,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='GStreamer'
PACKAGE_TARNAME='gstreamer'
-PACKAGE_VERSION='1.0.1'
-PACKAGE_STRING='GStreamer 1.0.1'
+PACKAGE_VERSION='1.0.2'
+PACKAGE_STRING='GStreamer 1.0.2'
PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer'
PACKAGE_URL=''
@@ -699,8 +699,12 @@ GMP_LIBS
WIN32_LIBS
HAVE_WINSOCK2_H_FALSE
HAVE_WINSOCK2_H_TRUE
-HAVE_PTHREAD_H_FALSE
-HAVE_PTHREAD_H_TRUE
+HAVE_PTHREAD_FALSE
+HAVE_PTHREAD_TRUE
+PTHREAD_CFLAGS
+PTHREAD_LIBS
+PTHREAD_CC
+ax_pthread_config
HAVE_SYS_TIMES_H_AND_UNISTD_H_FALSE
HAVE_SYS_TIMES_H_AND_UNISTD_H_TRUE
HAVE_SYS_SOCKET_H_FALSE
@@ -1633,7 +1637,7 @@ 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 1.0.1 to adapt to many kinds of systems.
+\`configure' configures GStreamer 1.0.2 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1704,7 +1708,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of GStreamer 1.0.1:";;
+ short | recursive ) echo "Configuration of GStreamer 1.0.2:";;
esac
cat <<\_ACEOF
@@ -1881,7 +1885,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-GStreamer configure 1.0.1
+GStreamer configure 1.0.2
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2654,7 +2658,7 @@ 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 1.0.1, which was
+It was created by GStreamer $as_me 1.0.2, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -3587,7 +3591,7 @@ fi
# Define the identity of the package.
PACKAGE='gstreamer'
- VERSION='1.0.1'
+ VERSION='1.0.2'
cat >>confdefs.h <<_ACEOF
@@ -3710,9 +3714,9 @@ $as_echo "$am_cv_prog_tar_ustar" >&6; }
- PACKAGE_VERSION_MAJOR=$(echo 1.0.1 | cut -d'.' -f1)
- PACKAGE_VERSION_MINOR=$(echo 1.0.1 | cut -d'.' -f2)
- PACKAGE_VERSION_MICRO=$(echo 1.0.1 | cut -d'.' -f3)
+ PACKAGE_VERSION_MAJOR=$(echo 1.0.2 | cut -d'.' -f1)
+ PACKAGE_VERSION_MINOR=$(echo 1.0.2 | cut -d'.' -f2)
+ PACKAGE_VERSION_MICRO=$(echo 1.0.2 | cut -d'.' -f3)
@@ -3723,7 +3727,7 @@ $as_echo "$am_cv_prog_tar_ustar" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking nano version" >&5
$as_echo_n "checking nano version... " >&6; }
- NANO=$(echo 1.0.1 | cut -d'.' -f4)
+ NANO=$(echo 1.0.2 | cut -d'.' -f4)
if test x"$NANO" = x || test "x$NANO" = "x0" ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: 0 (release)" >&5
@@ -8308,10 +8312,10 @@ fi
done
- GST_CURRENT=1
+ GST_CURRENT=2
GST_REVISION=0
- GST_AGE=1
- GST_LIBVERSION=1:0:1
+ GST_AGE=2
+ GST_LIBVERSION=2:0:2
@@ -23124,27 +23128,406 @@ fi
done
-for ac_header in pthread.h
-do :
- ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default
-"
-if test "x$ac_cv_header_pthread_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_PTHREAD_H 1
+
+
+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
+
+ax_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on True64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ save_LIBS="$LIBS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5
+$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; }
+ 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 pthread_join ();
+int
+main ()
+{
+return pthread_join ();
+ ;
+ return 0;
+}
_ACEOF
- HAVE_PTHREAD_H=yes
+if ac_fn_c_try_link "$LINENO"; then :
+ ax_pthread_ok=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
+$as_echo "$ax_pthread_ok" >&6; }
+ if test x"$ax_pthread_ok" = xno; then
+ PTHREAD_LIBS=""
+ PTHREAD_CFLAGS=""
+ fi
+ LIBS="$save_LIBS"
+ CFLAGS="$save_CFLAGS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try. Items starting with a "-" are
+# C compiler flags, and other items are library names, except for "none"
+# which indicates that we try without any flags at all, and "pthread-config"
+# which is a program returning the flags for the Pth emulation library.
+
+ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important. Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+# other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
+# -pthreads: Solaris/gcc
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+# doesn't hurt to check since this sometimes defines pthreads too;
+# also defines -D_REENTRANT)
+# ... -mt is also the pthreads flag for HP/aCC
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case ${host_os} in
+ solaris*)
+
+ # On Solaris (at least, for some versions), libc contains stubbed
+ # (non-functional) versions of the pthreads routines, so link-based
+ # tests will erroneously succeed. (We need to link with -pthreads/-mt/
+ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
+ # a function called by this macro, so we could check for that, but
+ # who knows whether they'll stub that too in a future libc.) So,
+ # we'll just look for -pthreads and -lpthread first:
+
+ ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags"
+ ;;
+
+ darwin*)
+ ax_pthread_flags="-pthread $ax_pthread_flags"
+ ;;
+esac
+
+if test x"$ax_pthread_ok" = xno; then
+for flag in $ax_pthread_flags; do
+
+ case $flag in
+ none)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5
+$as_echo_n "checking whether pthreads work without any flags... " >&6; }
+ ;;
+
+ -*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5
+$as_echo_n "checking whether pthreads work with $flag... " >&6; }
+ PTHREAD_CFLAGS="$flag"
+ ;;
+
+ pthread-config)
+ # Extract the first word of "pthread-config", so it can be a program name with args.
+set dummy pthread-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ax_pthread_config+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ax_pthread_config"; then
+ ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test.
else
- HAVE_PTHREAD_H=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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ax_pthread_config="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_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no"
+fi
+fi
+ax_pthread_config=$ac_cv_prog_ax_pthread_config
+if test -n "$ax_pthread_config"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5
+$as_echo "$ax_pthread_config" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test x"$ax_pthread_config" = xno; then continue; fi
+ PTHREAD_CFLAGS="`pthread-config --cflags`"
+ PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+ ;;
+
+ *)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5
+$as_echo_n "checking for the pthreads library -l$flag... " >&6; }
+ PTHREAD_LIBS="-l$flag"
+ ;;
+ esac
+
+ save_LIBS="$LIBS"
+ save_CFLAGS="$CFLAGS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+ # Check for various functions. We must include pthread.h,
+ # since some functions may be macros. (On the Sequent, we
+ # need a special flag -Kthread to make this header compile.)
+ # We check for pthread_join because it is in -lpthread on IRIX
+ # while pthread_create is in libc. We check for pthread_attr_init
+ # due to DEC craziness with -lpthreads. We check for
+ # pthread_cleanup_push because it is one of the few pthread
+ # functions on Solaris that doesn't have a non-functional libc stub.
+ # We try pthread_create on general principles.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <pthread.h>
+ static void routine(void *a) { a = 0; }
+ static void *start_routine(void *a) { return a; }
+int
+main ()
+{
+pthread_t th; pthread_attr_t attr;
+ pthread_create(&th, 0, start_routine, 0);
+ pthread_join(th, 0);
+ pthread_attr_init(&attr);
+ pthread_cleanup_push(routine, 0);
+ pthread_cleanup_pop(0) /* ; */
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ax_pthread_ok=yes
fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$save_LIBS"
+ CFLAGS="$save_CFLAGS"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
+$as_echo "$ax_pthread_ok" >&6; }
+ if test "x$ax_pthread_ok" = xyes; then
+ break;
+ fi
+
+ PTHREAD_LIBS=""
+ PTHREAD_CFLAGS=""
done
+fi
+
+# Various other checks:
+if test "x$ax_pthread_ok" = xyes; then
+ save_LIBS="$LIBS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+ # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5
+$as_echo_n "checking for joinable pthread attribute... " >&6; }
+ attr_name=unknown
+ for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <pthread.h>
+int
+main ()
+{
+int attr = $attr; return attr /* ; */
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ attr_name=$attr; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ done
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5
+$as_echo "$attr_name" >&6; }
+ if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
+
+cat >>confdefs.h <<_ACEOF
+#define PTHREAD_CREATE_JOINABLE $attr_name
+_ACEOF
+
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5
+$as_echo_n "checking if more special flags are required for pthreads... " >&6; }
+ flag=no
+ case ${host_os} in
+ aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";;
+ osf* | hpux*) flag="-D_REENTRANT";;
+ solaris*)
+ if test "$GCC" = "yes"; then
+ flag="-D_REENTRANT"
+ else
+ flag="-mt -D_REENTRANT"
+ fi
+ ;;
+ esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5
+$as_echo "${flag}" >&6; }
+ if test "x$flag" != xno; then
+ PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
+ fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5
+$as_echo_n "checking for PTHREAD_PRIO_INHERIT... " >&6; }
+if ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <pthread.h>
+int
+main ()
+{
+int i = PTHREAD_PRIO_INHERIT;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ax_cv_PTHREAD_PRIO_INHERIT=yes
+else
+ ax_cv_PTHREAD_PRIO_INHERIT=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: $ax_cv_PTHREAD_PRIO_INHERIT" >&5
+$as_echo "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; }
+ if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"; then :
+
+$as_echo "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h
+
+fi
+
+ LIBS="$save_LIBS"
+ CFLAGS="$save_CFLAGS"
+
+ # More AIX lossage: must compile with xlc_r or cc_r
+ if test x"$GCC" != xyes; then
+ for ac_prog in xlc_r cc_r
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_PTHREAD_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$PTHREAD_CC"; then
+ ac_cv_prog_PTHREAD_CC="$PTHREAD_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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_PTHREAD_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
+PTHREAD_CC=$ac_cv_prog_PTHREAD_CC
+if test -n "$PTHREAD_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5
+$as_echo "$PTHREAD_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$PTHREAD_CC" && break
+done
+test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}"
+
+ else
+ PTHREAD_CC=$CC
+ fi
+else
+ PTHREAD_CC="$CC"
+fi
+
+
+
+
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test x"$ax_pthread_ok" = xyes; then
+ HAVE_PTHREAD=yes
+ :
+else
+ ax_pthread_ok=no
+ HAVE_PTHREAD=no
+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 "x$HAVE_PTHREAD_H" = "xyes"; then
- HAVE_PTHREAD_H_TRUE=
- HAVE_PTHREAD_H_FALSE='#'
+ if test "x$HAVE_PTHREAD" = "xyes"; then
+ HAVE_PTHREAD_TRUE=
+ HAVE_PTHREAD_FALSE='#'
else
- HAVE_PTHREAD_H_TRUE='#'
- HAVE_PTHREAD_H_FALSE=
+ HAVE_PTHREAD_TRUE='#'
+ HAVE_PTHREAD_FALSE=
fi
@@ -26216,8 +26599,8 @@ if test -z "${HAVE_SYS_TIMES_H_AND_UNISTD_H_TRUE}" && test -z "${HAVE_SYS_TIMES_
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.
+if test -z "${HAVE_PTHREAD_TRUE}" && test -z "${HAVE_PTHREAD_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_PTHREAD\" 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
@@ -26641,7 +27024,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# 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 1.0.1, which was
+This file was extended by GStreamer $as_me 1.0.2, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -26707,7 +27090,7 @@ _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 1.0.1
+GStreamer config.status 1.0.2
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
diff --git a/configure.ac b/configure.ac
index 01daa95..9e5dd72 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4,7 +4,7 @@ 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
dnl
-AC_INIT(GStreamer, 1.0.1,
+AC_INIT(GStreamer, 1.0.2,
http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer,
gstreamer)
AG_GST_INIT
@@ -58,7 +58,7 @@ 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, 1, 0, 1)
+AS_LIBTOOL(GST, 2, 0, 2)
dnl *** autotools stuff ****
@@ -313,8 +313,8 @@ dnl Check for stdio_ext.f for __fbufsize
AC_CHECK_HEADERS([stdio_ext.h], [], [], [AC_INCLUDES_DEFAULT])
dnl check for pthreads
-AC_CHECK_HEADERS([pthread.h], [HAVE_PTHREAD_H=yes], [HAVE_PTHREAD_H=no], [AC_INCLUDES_DEFAULT])
-AM_CONDITIONAL(HAVE_PTHREAD_H, test "x$HAVE_PTHREAD_H" = "xyes")
+AX_PTHREAD([HAVE_PTHREAD=yes], [HAVE_PTHREAD=no])
+AM_CONDITIONAL(HAVE_PTHREAD, test "x$HAVE_PTHREAD" = "xyes")
dnl check for sys/prctl for setting thread name on Linux
AC_CHECK_HEADERS([sys/prctl.h], [], [], [AC_INCLUDES_DEFAULT])
diff --git a/docs/Makefile.in b/docs/Makefile.in
index e5b2015..9803127 100644
--- a/docs/Makefile.in
+++ b/docs/Makefile.in
@@ -81,7 +81,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -339,6 +339,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -375,6 +378,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/docs/design/Makefile.in b/docs/design/Makefile.in
index 8a305e0..29d2eff 100644
--- a/docs/design/Makefile.in
+++ b/docs/design/Makefile.in
@@ -80,7 +80,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -299,6 +299,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -335,6 +338,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/docs/design/part-buffering.txt b/docs/design/part-buffering.txt
index c1b3fb6..c36f948 100644
--- a/docs/design/part-buffering.txt
+++ b/docs/design/part-buffering.txt
@@ -50,7 +50,7 @@ Some use cases:
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
+ It is mostly desirable when the total duration of the file is not known, such
as in live streaming or when efficient seeking is not possible/required.
* Incremental download
diff --git a/docs/design/part-negotiation.txt b/docs/design/part-negotiation.txt
index bc94032..0a89bb6 100644
--- a/docs/design/part-negotiation.txt
+++ b/docs/design/part-negotiation.txt
@@ -339,9 +339,10 @@ We can identify 3 patterns in negotiation:
- A video/audio decoder
- usually uses gst_pad_use_fixed_caps()
- 2) Passthrough
- - Caps not modified
+ 2) Transform
+ - Caps not modified (passthrough)
- can do caps transform based on element property
+ - fixed caps get transformed into fixed caps
- videobox
3) Dynamic : can choose output format
@@ -349,3 +350,4 @@ We can identify 3 patterns in negotiation:
- depends on downstream caps, needs to do a CAPS query to find
transform.
- usually prefers to use the identity transform
+ - fixed caps can be transformed into unfixed caps.
diff --git a/docs/design/part-preroll.txt b/docs/design/part-preroll.txt
index 5b2630f..597c661 100644
--- a/docs/design/part-preroll.txt
+++ b/docs/design/part-preroll.txt
@@ -28,7 +28,8 @@ 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.
+ - an GAP event is received on a sinkpad.
+ - an EOS event 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.
diff --git a/docs/design/part-qos.txt b/docs/design/part-qos.txt
index daffa01..e80a7a1 100644
--- a/docs/design/part-qos.txt
+++ b/docs/design/part-qos.txt
@@ -84,7 +84,7 @@ 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
+clock (live) or it could be posted 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:
diff --git a/docs/design/part-sparsestreams.txt b/docs/design/part-sparsestreams.txt
index 269faa5..66b3d2f 100644
--- a/docs/design/part-sparsestreams.txt
+++ b/docs/design/part-sparsestreams.txt
@@ -11,6 +11,9 @@ 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.
+In 1.0, there is a GAP event that works in a similar fashion as the FILLER
+event in 0.8.
+
Use cases
~~~~~~~~~
diff --git a/docs/design/part-stream-status.txt b/docs/design/part-stream-status.txt
index d08538f..c7e1cd2 100644
--- a/docs/design/part-stream-status.txt
+++ b/docs/design/part-stream-status.txt
@@ -12,7 +12,7 @@ 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.
+ should be possible for the application to suggest a custom GstTaskPool.
- 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)
@@ -42,9 +42,9 @@ Use cases
- 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 configure the GstTask with a custom GstTaskPool to
+ manage the streaming thread or it can ignore the message which will make
+ the element use its default GstTaskPool.
- 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
@@ -86,8 +86,7 @@ Messages
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.
+ A GstTask/GThread controlling this streaming thread.
- "flow-return", GstFlowReturn
A status code for why the thread state changed. when threads are created
diff --git a/docs/design/part-synchronisation.txt b/docs/design/part-synchronisation.txt
index 68ac0f0..bdaa244 100644
--- a/docs/design/part-synchronisation.txt
+++ b/docs/design/part-synchronisation.txt
@@ -77,38 +77,38 @@ 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).
+ S: SEGMENT event preceeding the buffers.
+ - S.start: start field in the SEGMENT event
+ - S.stop: stop field in the SEGMENT event
+ - S.rate: rate field of SEGMENT event
+ - S.abs_rate: absolute value of rate field of SEGMENT event
+ - S.time: time field in the SEGMENT event
+ - S.base: a base time for the time.
+ - S.offset: an offset to apply to S.start or S.stop
+
+Valid buffers for synchronisation are those with B.timestamp between S.start
+and S.stop (after applying the S.offset). 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
+ if (S.rate > 0.0)
+ B.running_time = (B.timestamp - (S.start + S.offset)) / S.abs_rate + S.base
+ else
+ B.running_time = ((S.stop - S.offset) - B.timestamp) / S.abs_rate + S.base
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).
+S.start and S.offset and S.base == 0).
-For NS.rate > 1.0, the timestamps will be scaled down to increase the playback
+For S.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
+For negative rates, timestamps are received stop S.stop to S.start so that the
first buffer received will be transformed into B.running_time of 0 (B.timestamp ==
-NS.stop and NS.accum == 0).
+S.stop and S.accum == 0).
Synchronisation
@@ -123,7 +123,7 @@ As we have seen, we can get a running_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
+ B.running_time = (B.timestamp - (S.start + S.offset)) / S.abs_rate + S.base
We prefix C. and B. before the two running times to note how they were
calculated.
@@ -175,9 +175,9 @@ It is the stream time that is used for:
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
+ stream_time = (B.timestamp - S.start) * S.abs_applied_rate + S.time
-For negative rates, B.timestamp will go backwards from NS.stop to NS.start,
+For negative rates, B.timestamp will go backwards from S.stop to S.start,
making the stream time go backwards.
In the PLAYING state, it is also possible to use the pipeline clock to derive
@@ -187,21 +187,24 @@ 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.running_time = (B.timestamp - (S.start + S.offset)) / S.abs_rate + S.base
=>
- (B.timestamp - NS.start) / NS.abs_rate + NS.accum = absolute_time - base_time;
+ (B.timestamp - (S.start + S.offset)) / S.abs_rate + S.base = absolute_time - base_time;
=>
- (B.timestamp - NS.start) / NS.abs_rate = absolute_time - base_time - NS.accum;
+ (B.timestamp - (S.start + S.offset)) / S.abs_rate = absolute_time - base_time - S.base;
=>
- (B.timestamp - NS.start) = (absolute_time - base_time - NS.accum) * NS.abs_rate
+ (B.timestamp - (S.start + S.offset)) = (absolute_time - base_time - S.base) * S.abs_rate
- filling (B.timestamp - NS.start) in the above formule for stream time
+ =>
+ (B.timestamp - S.start) = S.offset + (absolute_time - base_time - S.base) * S.abs_rate
+
+ filling (B.timestamp - S.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
+ stream_time = (S.offset + (absolute_time - base_time - S.base) * S.abs_rate) * S.abs_applied_rate + S.time
This last formula is typically used in sinks to report the current position in
an accurate and efficient way.
diff --git a/docs/faq/Makefile.in b/docs/faq/Makefile.in
index 26b0f2c..312c2ff 100644
--- a/docs/faq/Makefile.in
+++ b/docs/faq/Makefile.in
@@ -105,7 +105,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -353,6 +353,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -389,6 +392,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/docs/gst/Makefile.in b/docs/gst/Makefile.in
index 1e001fa..3fe208f 100644
--- a/docs/gst/Makefile.in
+++ b/docs/gst/Makefile.in
@@ -101,7 +101,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -322,6 +322,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -358,6 +361,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/docs/gst/html/GstBin.html b/docs/gst/html/GstBin.html
index 5167655..7e37397 100644
--- a/docs/gst/html/GstBin.html
+++ b/docs/gst/html/GstBin.html
@@ -157,7 +157,7 @@ element is removed from the bin.
<p>
</p>
<div class="refsect2">
-<a name="idp8569680"></a><h3>Notes</h3>
+<a name="idp11985136"></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:
diff --git a/docs/gst/html/GstElement.html b/docs/gst/html/GstElement.html
index 43b6d4b..25cdeff 100644
--- a/docs/gst/html/GstElement.html
+++ b/docs/gst/html/GstElement.html
@@ -527,6 +527,8 @@ state will yield the running_time against the clock.</td>
gboolean (*send_event) (GstElement *element, GstEvent *event);
gboolean (*query) (GstElement *element, GstQuery *query);
+
+ gboolean (*post_message) (GstElement *element, GstMessage *message);
};
</pre>
<p>
@@ -605,6 +607,11 @@ functionality.
<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>
+<tr>
+<td><p><span class="term"><em class="structfield"><code><a name="GstElementClass.post-message"></a>post_message</code></em> ()</span></p></td>
+<td>called when a message is posted on the element. Chain up to
+the parent class' handler to have it posted on the bus.</td>
+</tr>
</tbody>
</table></div>
</div>
diff --git a/docs/gst/html/GstElementFactory.html b/docs/gst/html/GstElementFactory.html
index 1a44552..e6f2bc2 100644
--- a/docs/gst/html/GstElementFactory.html
+++ b/docs/gst/html/GstElementFactory.html
@@ -141,7 +141,7 @@ The following code example shows you how to create a GstFileSrc element.
<p>
</p>
<div class="example">
-<a name="idp20912512"></a><p class="title"><b>Example 6. Using an element factory</b></p>
+<a name="idp21432256"></a><p class="title"><b>Example 6. Using an element factory</b></p>
<div class="example-contents">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
diff --git a/docs/gst/html/GstObject.html b/docs/gst/html/GstObject.html
index 69c8d79..763b5eb 100644
--- a/docs/gst/html/GstObject.html
+++ b/docs/gst/html/GstObject.html
@@ -186,7 +186,7 @@ of the object.
<p>
</p>
<div class="refsect2">
-<a name="idp30161888"></a><h3>controlled properties</h3>
+<a name="idp28871792"></a><h3>controlled properties</h3>
<p>
Controlled properties offers a lightweight way to adjust gobject
properties over stream-time. It works by using time-stamped value pairs that
diff --git a/docs/gst/html/GstPad.html b/docs/gst/html/GstPad.html
index acd5e99..7c7abe1 100644
--- a/docs/gst/html/GstPad.html
+++ b/docs/gst/html/GstPad.html
@@ -1905,6 +1905,11 @@ The callback is allowed to modify the data pointer in <em class="parameter"><cod
<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>a <a class="link" href="GstPad.html#GstPadProbeReturn" title="enum GstPadProbeReturn"><span class="type">GstPadProbeReturn</span></a>
+</td>
+</tr>
</tbody>
</table></div>
</div>
diff --git a/docs/gst/html/GstPadTemplate.html b/docs/gst/html/GstPadTemplate.html
index b13b0fd..3d68044 100644
--- a/docs/gst/html/GstPadTemplate.html
+++ b/docs/gst/html/GstPadTemplate.html
@@ -132,7 +132,7 @@ or <a class="link" href="GstPad.html#gst-pad-new-from-static-template" title="gs
The following code example shows the code to create a pad from a padtemplate.
</p>
<div class="example">
-<a name="idp30516864"></a><p class="title"><b>Example 11. Create a pad from a padtemplate</b></p>
+<a name="idp30562032"></a><p class="title"><b>Example 11. Create a pad from a padtemplate</b></p>
<div class="example-contents">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
diff --git a/docs/gst/html/GstTypeFindFactory.html b/docs/gst/html/GstTypeFindFactory.html
index d971c26..7dc4a70 100644
--- a/docs/gst/html/GstTypeFindFactory.html
+++ b/docs/gst/html/GstTypeFindFactory.html
@@ -73,7 +73,7 @@ the section <GTKDOCLINK HREF="gstreamer-Writing-typefind-functions">
<p>
</p>
<div class="example">
-<a name="idp10697952"></a><p class="title"><b>Example 13. how to write a simple typefinder</b></p>
+<a name="idp27698816"></a><p class="title"><b>Example 13. how to write a simple typefinder</b></p>
<div class="example-contents">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
diff --git a/docs/gst/html/gst-building.html b/docs/gst/html/gst-building.html
index fef8dcd..e508552 100644
--- a/docs/gst/html/gst-building.html
+++ b/docs/gst/html/gst-building.html
@@ -31,7 +31,7 @@ How to build the GStreamer framework and applications using it.
<td valign="top" align="right"></td>
</tr></table></div>
<div class="refsect1">
-<a name="idp7713072"></a><h2>Building GStreamer on UNIX</h2>
+<a name="idp7759168"></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
@@ -92,7 +92,7 @@ How to build the GStreamer framework and applications using it.
</p>
</div>
<div class="refsect1">
-<a name="idp9473616"></a><h2>Building GStreamer Applications</h2>
+<a name="idp8634800"></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
diff --git a/docs/gst/html/gst-running.html b/docs/gst/html/gst-running.html
index d368184..da1fac7 100644
--- a/docs/gst/html/gst-running.html
+++ b/docs/gst/html/gst-running.html
@@ -31,9 +31,9 @@ How to run and debug your GStreamer application
<td valign="top" align="right"></td>
</tr></table></div>
<div class="refsect1">
-<a name="idp4095488"></a><h2>Running and debugging GStreamer Applications</h2>
+<a name="idp3330784"></a><h2>Running and debugging GStreamer Applications</h2>
<div class="refsect2">
-<a name="idp9461168"></a><h3>Environment variables</h3>
+<a name="idp8488400"></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>.
diff --git a/docs/gst/html/gstreamer-Gst.html b/docs/gst/html/gstreamer-Gst.html
index e93d2f9..299fba5 100644
--- a/docs/gst/html/gstreamer-Gst.html
+++ b/docs/gst/html/gstreamer-Gst.html
@@ -83,7 +83,7 @@ options, as shown in the following example.
<p>
</p>
<div class="example">
-<a name="idp9723616"></a><p class="title"><b>Example 1. Initializing the gstreamer library</b></p>
+<a name="idp11739936"></a><p class="title"><b>Example 1. Initializing the gstreamer library</b></p>
<div class="example-contents">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -119,7 +119,7 @@ You can also use GOption to initialize your own parameters as shown in
the next code fragment:
</p>
<div class="example">
-<a name="idp8478800"></a><p class="title"><b>Example 2. Initializing own parameters when initializing gstreamer</b></p>
+<a name="idp8067152"></a><p class="title"><b>Example 2. Initializing own parameters when initializing gstreamer</b></p>
<div class="example-contents">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
diff --git a/docs/gst/html/gstreamer-GstBuffer.html b/docs/gst/html/gstreamer-GstBuffer.html
index db02879..4f470a3 100644
--- a/docs/gst/html/gstreamer-GstBuffer.html
+++ b/docs/gst/html/gstreamer-GstBuffer.html
@@ -212,7 +212,7 @@ 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="idp14288080"></a><p class="title"><b>Example 3. Creating a buffer for a video frame</b></p>
+<a name="idp14292944"></a><p class="title"><b>Example 3. Creating a buffer for a video frame</b></p>
<div class="example-contents">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
diff --git a/docs/gst/html/gstreamer-GstCaps.html b/docs/gst/html/gstreamer-GstCaps.html
index 7fc7e91..dbad46c 100644
--- a/docs/gst/html/gstreamer-GstCaps.html
+++ b/docs/gst/html/gstreamer-GstCaps.html
@@ -160,7 +160,7 @@ A <a class="link" href="gstreamer-GstCaps.html#GstCaps" title="struct GstCaps"><
<p>
</p>
<div class="example">
-<a name="idp15247184"></a><p class="title"><b>Example 4. Creating caps</b></p>
+<a name="idp18325072"></a><p class="title"><b>Example 4. Creating caps</b></p>
<div class="example-contents">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
diff --git a/docs/gst/html/gstreamer-GstEvent.html b/docs/gst/html/gstreamer-GstEvent.html
index e5d9d28..5326873 100644
--- a/docs/gst/html/gstreamer-GstEvent.html
+++ b/docs/gst/html/gstreamer-GstEvent.html
@@ -206,7 +206,7 @@ To do that <a class="link" href="gstreamer-GstEvent.html#gst-event-new-seek" tit
the needed parameters to specify seeking time and mode.
</p>
<div class="example">
-<a name="idp22752240"></a><p class="title"><b>Example 8. performing a seek on a pipeline</b></p>
+<a name="idp23273888"></a><p class="title"><b>Example 8. performing a seek on a pipeline</b></p>
<div class="example-contents">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
diff --git a/docs/gst/html/gstreamer-GstGError.html b/docs/gst/html/gstreamer-GstGError.html
index 9cef2c1..0038528 100644
--- a/docs/gst/html/gstreamer-GstGError.html
+++ b/docs/gst/html/gstreamer-GstGError.html
@@ -115,7 +115,7 @@ Elements throw errors using the <a class="link" href="GstElement.html#GST-ELEMEN
<p>
</p>
<div class="example">
-<a name="idp9564400"></a><p class="title"><b>Example 7. Throwing an error</b></p>
+<a name="idp3647408"></a><p class="title"><b>Example 7. Throwing an error</b></p>
<div class="example-contents">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
diff --git a/docs/gst/html/gstreamer-GstIterator.html b/docs/gst/html/gstreamer-GstIterator.html
index c18d596..6dcec3b 100644
--- a/docs/gst/html/gstreamer-GstIterator.html
+++ b/docs/gst/html/gstreamer-GstIterator.html
@@ -122,7 +122,7 @@ The basic use pattern of an iterator is as follows:
<p>
</p>
<div class="example">
-<a name="idp23319008"></a><p class="title"><b>Example 9. Using an iterator</b></p>
+<a name="idp23894336"></a><p class="title"><b>Example 9. Using an iterator</b></p>
<div class="example-contents">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
diff --git a/docs/gst/html/gstreamer-GstMessage.html b/docs/gst/html/gstreamer-GstMessage.html
index 87408d8..6dc1a24 100644
--- a/docs/gst/html/gstreamer-GstMessage.html
+++ b/docs/gst/html/gstreamer-GstMessage.html
@@ -273,7 +273,7 @@ The basic use pattern of posting a message on a <a class="link" href="GstBus.htm
<p>
</p>
<div class="example">
-<a name="idp30847824"></a><p class="title"><b>Example 10. Posting a <a class="link" href="gstreamer-GstMessage.html#GstMessage" title="struct GstMessage"><span class="type">GstMessage</span></a></b></p>
+<a name="idp30603584"></a><p class="title"><b>Example 10. 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">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
diff --git a/docs/gst/html/gstreamer-GstQuery.html b/docs/gst/html/gstreamer-GstQuery.html
index 31d7af9..4a1a953 100644
--- a/docs/gst/html/gstreamer-GstQuery.html
+++ b/docs/gst/html/gstreamer-GstQuery.html
@@ -284,7 +284,7 @@ The following example shows how to query the duration of a pipeline:
<p>
</p>
<div class="example">
-<a name="idp40848832"></a><p class="title"><b>Example 12. Query duration on a pipeline</b></p>
+<a name="idp40600640"></a><p class="title"><b>Example 12. Query duration on a pipeline</b></p>
<div class="example-contents">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -2034,7 +2034,7 @@ Configures the buffering stats values in <em class="parameter"><code>query</code
</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>
+<td>amount of buffering time left in milliseconds</td>
</tr>
</tbody>
</table></div>
@@ -2074,7 +2074,8 @@ Extracts the buffering stats values from <em class="parameter"><code>query</code
</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>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>
diff --git a/docs/gst/html/gstreamer-GstSample.html b/docs/gst/html/gstreamer-GstSample.html
index e500b1c..23fba64 100644
--- a/docs/gst/html/gstreamer-GstSample.html
+++ b/docs/gst/html/gstreamer-GstSample.html
@@ -198,7 +198,8 @@ Free-function: gst_sample_unref
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>segment</code></em> :</span></p></td>
-<td>transfer none) (allow-none): a <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a>, or NULL</td>
+<td>a <a class="link" href="gstreamer-GstSegment.html#GstSegment" title="struct GstSegment"><span class="type">GstSegment</span></a>, 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="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>info</code></em> :</span></p></td>
diff --git a/docs/gst/html/gstreamer-GstTagList.html b/docs/gst/html/gstreamer-GstTagList.html
index 534c36c..c7c2bea 100644
--- a/docs/gst/html/gstreamer-GstTagList.html
+++ b/docs/gst/html/gstreamer-GstTagList.html
@@ -359,7 +359,7 @@ In the table below this is shown for the cases that a tag exists in the list
<p>
</p>
<div class="table">
-<a name="idp45190816"></a><p class="title"><b>Table 1. merge mode</b></p>
+<a name="idp45324000"></a><p class="title"><b>Table 1. merge mode</b></p>
<div class="table-contents"><table summary="merge mode" border="1">
<colgroup>
<col>
diff --git a/docs/gst/html/gstreamer-GstVersion.html b/docs/gst/html/gstreamer-GstVersion.html
index 49e7b6c..4aab619 100644
--- a/docs/gst/html/gstreamer-GstVersion.html
+++ b/docs/gst/html/gstreamer-GstVersion.html
@@ -88,7 +88,7 @@ The minor version of GStreamer at compile time:
<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 class="programlisting">#define GST_VERSION_MICRO (2)
</pre>
<p>
The micro version of GStreamer at compile time:
diff --git a/docs/gst/html/gstreamer.devhelp2 b/docs/gst/html/gstreamer.devhelp2
index d67a6a5..a55a196 100644
--- a/docs/gst/html/gstreamer.devhelp2
+++ b/docs/gst/html/gstreamer.devhelp2
@@ -71,7 +71,7 @@
<sub name="Annotation Glossary" link="annotation-glossary.html"/>
</chapters>
<functions>
- <keyword type="" name="Environment variables" link="gst-running.html#idp9461168"/>
+ <keyword type="" name="Environment variables" link="gst-running.html#idp8488400"/>
<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"/>
@@ -105,7 +105,7 @@
<keyword type="function" name="gst_atomic_queue_peek ()" link="gstreamer-GstAtomicQueue.html#gst-atomic-queue-peek"/>
<keyword type="function" name="gst_atomic_queue_pop ()" link="gstreamer-GstAtomicQueue.html#gst-atomic-queue-pop"/>
<keyword type="function" name="gst_atomic_queue_length ()" link="gstreamer-GstAtomicQueue.html#gst-atomic-queue-length"/>
- <keyword type="" name="Notes" link="GstBin.html#idp8569680"/>
+ <keyword type="" name="Notes" link="GstBin.html#idp11985136"/>
<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"/>
@@ -906,7 +906,7 @@
<keyword type="function" name="gst_mini_object_replace ()" link="gstreamer-GstMiniObject.html#gst-mini-object-replace"/>
<keyword type="function" name="gst_mini_object_take ()" link="gstreamer-GstMiniObject.html#gst-mini-object-take"/>
<keyword type="function" name="gst_mini_object_steal ()" link="gstreamer-GstMiniObject.html#gst-mini-object-steal"/>
- <keyword type="" name="controlled properties" link="GstObject.html#idp30161888"/>
+ <keyword type="" name="controlled properties" link="GstObject.html#idp28871792"/>
<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"/>
diff --git a/docs/gst/html/index.html b/docs/gst/html/index.html
index 500c7ef..d93add7 100644
--- a/docs/gst/html/index.html
+++ b/docs/gst/html/index.html
@@ -15,7 +15,7 @@
<div>
<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">GStreamer 1.0 Core Reference Manual</p></th></tr></table></div>
<div><p class="releaseinfo">
- for GStreamer Core 1.0 (1.0.1)
+ for GStreamer Core 1.0 (1.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/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/</a>.
</p></div>
diff --git a/docs/libs/Makefile.am b/docs/libs/Makefile.am
index 60d7318..4c621b5 100644
--- a/docs/libs/Makefile.am
+++ b/docs/libs/Makefile.am
@@ -37,7 +37,7 @@ 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)"
+SCANOBJ_OPTIONS=--type-init-func="gst_init(&argc,&argv)"
# Header files to ignore when scanning.
IGNORE_HFILES = \
diff --git a/docs/libs/Makefile.in b/docs/libs/Makefile.in
index dcf060b..7f55925 100644
--- a/docs/libs/Makefile.in
+++ b/docs/libs/Makefile.in
@@ -101,7 +101,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -322,6 +322,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -358,6 +361,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
@@ -446,7 +450,7 @@ 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)"
+SCANOBJ_OPTIONS = --type-init-func="gst_init(&argc,&argv)"
# Header files to ignore when scanning.
IGNORE_HFILES = \
diff --git a/docs/libs/html/GstBaseSrc.html b/docs/libs/html/GstBaseSrc.html
index 87d8910..b572cb3 100644
--- a/docs/libs/html/GstBaseSrc.html
+++ b/docs/libs/html/GstBaseSrc.html
@@ -68,7 +68,7 @@ enum <a class="link" href="GstBaseSrc.html#GstBaseSrcFlags" title
<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><span class="type">gint64</span> start</code></em>,
<em class="parameter"><code><span class="type">gint64</span> stop</code></em>,
- <em class="parameter"><code><span class="type">gint64</span> position</code></em>);
+ <em class="parameter"><code><span class="type">gint64</span> 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="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="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);
<span class="returnvalue">void</span> <a class="link" href="GstBaseSrc.html#gst-base-src-get-allocator" title="gst_base_src_get_allocator ()">gst_base_src_get_allocator</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>,
@@ -248,7 +248,7 @@ should install a pad template in its class_init function, like so:
<p>
</p>
<div class="refsect2">
-<a name="idp34470512"></a><h3>Controlled shutdown of live sources in applications</h3>
+<a name="idp6837152"></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
@@ -779,7 +779,7 @@ read.
<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><span class="type">gint64</span> start</code></em>,
<em class="parameter"><code><span class="type">gint64</span> stop</code></em>,
- <em class="parameter"><code><span class="type">gint64</span> position</code></em>);</pre>
+ <em class="parameter"><code><span class="type">gint64</span> time</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,
diff --git a/docs/libs/html/GstBaseTransform.html b/docs/libs/html/GstBaseTransform.html
index 05f8e35..2104627 100644
--- a/docs/libs/html/GstBaseTransform.html
+++ b/docs/libs/html/GstBaseTransform.html
@@ -118,7 +118,7 @@ It provides for:
<p>
</p>
<div class="refsect2">
-<a name="idp35617104"></a><h3>Use Cases</h3>
+<a name="idp6797872"></a><h3>Use Cases</h3>
<p>
</p>
<div class="orderedlist"><ol class="orderedlist" type="1">
@@ -258,7 +258,7 @@ It provides for:
</p>
<hr>
<div class="refsect2">
-<a name="idp38847872"></a><h3>Sub-class settable flags on GstBaseTransform</h3>
+<a name="idp9811680"></a><h3>Sub-class settable flags on GstBaseTransform</h3>
<p>
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
diff --git a/docs/libs/html/GstCollectPads.html b/docs/libs/html/GstCollectPads.html
index 8e5c47e..a25c9f0 100644
--- a/docs/libs/html/GstCollectPads.html
+++ b/docs/libs/html/GstCollectPads.html
@@ -300,7 +300,7 @@ and NULL <em class="parameter"><code>data</code></em>.
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
-<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#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>
@@ -443,7 +443,7 @@ This function takes ownership of <em class="parameter"><code>inbuffer</code></em
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>inbuffer</code></em> :</span></p></td>
-<td>the input <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>
+<td>the input <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#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>
@@ -1162,7 +1162,7 @@ MT safe.
<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 <span class="type">GstCollectPad2ClipFunction</span> for more info.
+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">
diff --git a/docs/libs/html/gstreamer-libs.devhelp2 b/docs/libs/html/gstreamer-libs.devhelp2
index 317249f..9d5099a 100644
--- a/docs/libs/html/gstreamer-libs.devhelp2
+++ b/docs/libs/html/gstreamer-libs.devhelp2
@@ -64,7 +64,7 @@
<keyword type="macro" name="GST_BASE_PARSE_LOST_SYNC()" link="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-LOST-SYNC:CAPS"/>
<keyword type="macro" name="GST_BASE_PARSE_SINK_PAD()" link="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-SINK-PAD:CAPS"/>
<keyword type="macro" name="GST_BASE_PARSE_SRC_PAD()" link="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-SRC-PAD:CAPS"/>
- <keyword type="" name="Controlled shutdown of live sources in applications" link="GstBaseSrc.html#idp34470512"/>
+ <keyword type="" name="Controlled shutdown of live sources in applications" link="GstBaseSrc.html#idp6837152"/>
<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"/>
@@ -130,8 +130,8 @@
<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#idp35617104"/>
- <keyword type="" name="Sub-class settable flags on GstBaseTransform" link="GstBaseTransform.html#idp38847872"/>
+ <keyword type="" name="Use Cases" link="GstBaseTransform.html#idp6797872"/>
+ <keyword type="" name="Sub-class settable flags on GstBaseTransform" link="GstBaseTransform.html#idp9811680"/>
<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"/>
diff --git a/docs/libs/html/index.html b/docs/libs/html/index.html
index 1468796..98ba67c 100644
--- a/docs/libs/html/index.html
+++ b/docs/libs/html/index.html
@@ -15,7 +15,7 @@
<div>
<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">GStreamer 1.0 Library Reference Manual</p></th></tr></table></div>
<div><p class="releaseinfo">
- for GStreamer Library 1.0 (1.0.1)
+ for GStreamer Library 1.0 (1.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>
diff --git a/docs/manual/Makefile.in b/docs/manual/Makefile.in
index d63af75..ba67747 100644
--- a/docs/manual/Makefile.in
+++ b/docs/manual/Makefile.in
@@ -105,7 +105,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -353,6 +353,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -389,6 +392,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/docs/manual/advanced-autoplugging.xml b/docs/manual/advanced-autoplugging.xml
index 984617b..5f7a0e0 100644
--- a/docs/manual/advanced-autoplugging.xml
+++ b/docs/manual/advanced-autoplugging.xml
@@ -10,7 +10,7 @@
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
+ <xref linkend="chapter-playback-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
@@ -234,390 +234,9 @@ main (gint argc,
<sect1 id="section-dynamic">
<title>Dynamically autoplugging a pipeline</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 media 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_metadata (GST_ELEMENT_FACTORY (feature), GST_ELEMENT_METADATA_KLASS);
- 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 (),
- (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, GstCaps *caps);
-
-static GstElement *audiosink;
-
-static void
-cb_newpad (GstElement *element,
- GstPad *pad,
- gpointer data)
-{
- GstCaps *caps;
-
- caps = gst_pad_query_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_query_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,
- GstCaps *caps)
-{
- GstObject *parent = GST_OBJECT (GST_OBJECT_PARENT (pad));
- const gchar *media;
- 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 */
- media = gst_structure_get_name (gst_caps_get_structure (caps, 0));
- if (g_strrstr (media, "video")) {
- g_print ("Omitting link for pad %s:%s because media type %s is non-audio\n",
- GST_OBJECT_NAME (parent), GST_OBJECT_NAME (pad), media);
- return;
- }
-
- /* can it link to the audiopad? */
- audiocaps = gst_pad_query_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",
- media, 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"/>.
+ See <xref linkend="chapter-playback-components"/> for using the high
+ level object that you can use to dynamically construct pipelines.
</para>
</sect1>
</chapter>
diff --git a/docs/manual/advanced-buffering.xml b/docs/manual/advanced-buffering.xml
new file mode 100644
index 0000000..6d1660f
--- /dev/null
+++ b/docs/manual/advanced-buffering.xml
@@ -0,0 +1,450 @@
+<chapter id="chapter-buffering">
+ <title>Buffering</title>
+ <para>
+ 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.
+ </para>
+ <para>
+ &GStreamer; provides support for the following use cases:
+ <itemizedlist>
+ <listitem>
+ <para>
+ Buffering up to a specific amount of data, in memory, before starting
+ playback so that network fluctuations are minimized.
+ See <xref linkend="section-buffering-stream"/>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Download of the network file to a local disk with fast seeking in the
+ downloaded data. This is similar to the quicktime/youtube players.
+ See <xref linkend="section-buffering-download"/>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Caching of (semi)-live streams to a local, on disk, ringbuffer with
+ seeking in the cached area. This is similar to tivo-like timeshifting.
+ See <xref linkend="section-buffering-timeshift"/>.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ &GStreamer; can provide the application with progress reports about the
+ current buffering state as well as let the application decide on how
+ to buffer and when the buffering stops.
+ </para>
+ <para>
+ In the most simple case, the application has to listen for BUFFERING
+ messages on the bus. If the percent indicator inside the BUFFERING message
+ is smaller than 100, the pipeline is buffering. When a message is
+ received with 100 percent, buffering is complete. In the buffering state,
+ the application should keep the pipeline in the PAUSED state. When buffering
+ completes, it can put the pipeline (back) in the PLAYING state.
+ </para>
+ <para>
+ What follows is an example of how the message handler could deal with
+ the BUFFERING messages. We will see more advanced methods in
+ <xref linkend="section-buffering-strategies"/>.
+ </para>
+ <programlisting>
+<![CDATA[
+ [...]
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_BUFFERING:{
+ gint percent;
+
+ /* no state management needed for live pipelines */
+ if (is_live)
+ break;
+
+ gst_message_parse_buffering (message, &percent);
+
+ 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) {
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ }
+ } else {
+ /* buffering busy */
+ if (buffering == FALSE && target_state == GST_STATE_PLAYING) {
+ /* we were not buffering but PLAYING, PAUSE the pipeline. */
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ }
+ buffering = TRUE;
+ }
+ break;
+ case ...
+
+ [...]
+]]>
+ </programlisting>
+
+ <sect1 id="section-buffering-stream">
+ <title>Stream buffering </title>
+ <programlisting>
+ +---------+ +---------+ +-------+
+ | httpsrc | | buffer | | demux |
+ | src - sink src - sink ....
+ +---------+ +---------+ +-------+
+ </programlisting>
+ <para>
+ In this case we are reading from a slow network source into a buffer
+ element (such as queue2).
+ </para>
+ <para>
+ The buffer element has a low and high watermark expressed in bytes. The
+ buffer uses the watermarks as follows:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ 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.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ When the high watermark is hit, a BUFFERING message with 100% will be
+ posted, which instructs the application to continue playback.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ 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.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ During playback, the queue level will fluctuate between the high and
+ the low watermark as a way to compensate for network irregularities.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ 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 known,
+ such as in live streaming or when efficient seeking is not
+ possible/required.
+ </para>
+ <para>
+ The problem is configuring a good low and high watermark. Here are some
+ ideas:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ It is possible to measure the network bandwidth and configure the
+ low/high watermarks in such a way that buffering takes a fixed
+ amount of time.
+ </para>
+ <para>
+ The queue2 element in &GStreamer; core has the max-size-time property
+ that, together with the use-rate-estimate property, does exactly
+ that. Also the playbin buffer-duration property uses the rate estimate
+ to scale the amount of data that is buffered.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Based on the codec bitrate, it is also possible to set the watermarks
+ in such a way that a fixed amount of data is buffered before playback
+ starts. Normally, the buffering element doesn't know about the
+ bitrate of the stream but it can get this with a query.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Start with a fixed amount of bytes, measure the time between
+ rebuffering and increase the queue size until the time between
+ rebuffering is within the application's chosen limits.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ The buffering element can be inserted anywhere in the pipeline. You could,
+ for example, insert the buffering element before a decoder. This would
+ make it possible to set the low/high watermarks based on time.
+ </para>
+ <para>
+ The buffering flag on playbin, performs buffering on the parsed data.
+ Another advantage of doing the buffering at a later stage is that you can
+ let the demuxer operate in pull mode. When reading data from a slow
+ network drive (with filesrc) this can be an interesting way to buffer.
+ </para>
+ </sect1>
+
+ <sect1 id="section-buffering-download">
+ <title>Download buffering </title>
+ <programlisting>
+ +---------+ +---------+ +-------+
+ | httpsrc | | buffer | | demux |
+ | src - sink src - sink ....
+ +---------+ +----|----+ +-------+
+ V
+ file
+ </programlisting>
+ <para>
+ If we know the server is streaming a fixed length file to the client,
+ the application can choose to download the entire file on disk. The
+ buffer element will provide a push or pull based srcpad to the demuxer
+ to navigate in the downloaded file.
+ </para>
+ <para>
+ This mode is only suitable when the client can determine the length of
+ the file on the server.
+ </para>
+ <para>
+ 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. See <xref linkend="section-buffering-strategies"/>.
+ </para>
+ </sect1>
+
+ <sect1 id="section-buffering-timeshift">
+ <title>Timeshift buffering </title>
+ <programlisting>
+ +---------+ +---------+ +-------+
+ | httpsrc | | buffer | | demux |
+ | src - sink src - sink ....
+ +---------+ +----|----+ +-------+
+ V
+ file-ringbuffer
+ </programlisting>
+ <para>
+ 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 ringbuffer one can seek further back in time.
+ </para>
+ <para>
+ 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.
+ </para>
+ </sect1>
+
+ <sect1 id="section-buffering-live">
+ <title>Live buffering </title>
+ <para>
+ In live pipelines we usually introduce some fixed 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).
+ </para>
+ <para>
+ 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.
+ </para>
+ </sect1>
+
+ <sect1 id="section-buffering-strategies">
+ <title>Buffering strategies </title>
+ <para>
+ What follows are some ideas for implementing different buffering
+ strategies based on the buffering messages and buffering query.
+ </para>
+
+ <sect2 id="section-buffering-norebuffer">
+ <title>No-rebuffer strategy </title>
+ <para>
+ We would like to buffer enough data in the pipeline so that playback
+ continues without interruptions. What we need to know to implement
+ this is know the total remaining playback time in the file and the
+ total remaining download time. If the buffering time is less than the
+ playback time, we can start playback without interruptions.
+ </para>
+ <para>
+ We have all this information available with the DURATION, POSITION and
+ BUFFERING queries. We need to periodically execute the buffering query
+ to get the current buffering status. We also need to have a large
+ enough buffer to hold the complete file, worst case. It is best to
+ use this buffering strategy with download buffering (see
+ <xref linkend="section-buffering-download"/>).
+ </para>
+ <para>
+ This is what the code would look like:
+ </para>
+ <programlisting>
+<!-- example-begin norebuffer.c a -->
+<![CDATA[
+#include <gst/gst.h>
+
+GstState target_state;
+static gboolean is_live;
+static gboolean is_buffering;
+
+static gboolean
+buffer_timeout (gpointer data)
+{
+ GstElement *pipeline = data;
+ GstQuery *query;
+ gboolean busy;
+ gint percent;
+ gint64 estimated_total;
+ gint64 position, duration;
+ guint64 play_left;
+
+ query = gst_query_new_buffering (GST_FORMAT_TIME);
+
+ if (!gst_element_query (pipeline, query))
+ return TRUE;
+
+ gst_query_parse_buffering_percent (query, &busy, &percent);
+ gst_query_parse_buffering_range (query, NULL, NULL, NULL, &estimated_total);
+
+ if (estimated_total == -1)
+ estimated_total = 0;
+
+ /* calculate the remaining playback time */
+ if (!gst_element_query_position (pipeline, GST_FORMAT_TIME, &position))
+ position = -1;
+ if (!gst_element_query_duration (pipeline, GST_FORMAT_TIME, &duration))
+ duration = -1;
+
+ if (duration != -1 && position != -1)
+ play_left = GST_TIME_AS_MSECONDS (duration - position);
+ else
+ play_left = 0;
+
+ g_message ("play_left %" G_GUINT64_FORMAT", estimated_total %" G_GUINT64_FORMAT
+ ", percent %d", play_left, estimated_total, percent);
+
+ /* we are buffering or the estimated download time is bigger than the
+ * remaining playback time. We keep buffering. */
+ is_buffering = (busy || estimated_total * 1.1 > play_left);
+
+ if (!is_buffering)
+ gst_element_set_state (pipeline, target_state);
+
+ return is_buffering;
+}
+
+static void
+on_message_buffering (GstBus *bus, GstMessage *message, gpointer user_data)
+{
+ GstElement *pipeline = user_data;
+ gint percent;
+
+ /* no state management needed for live pipelines */
+ if (is_live)
+ return;
+
+ gst_message_parse_buffering (message, &percent);
+
+ if (percent < 100) {
+ /* buffering busy */
+ if (is_buffering == FALSE) {
+ is_buffering = TRUE;
+ if (target_state == GST_STATE_PLAYING) {
+ /* we were not buffering but PLAYING, PAUSE the pipeline. */
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ }
+ }
+ }
+}
+
+static void
+on_message_async_done (GstBus *bus, GstMessage *message, gpointer user_data)
+{
+ GstElement *pipeline = user_data;
+
+ if (is_buffering == FALSE)
+ gst_element_set_state (pipeline, target_state);
+ else
+ g_timeout_add (500, buffer_timeout, pipeline);
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GstElement *pipeline;
+ GMainLoop *loop;
+ GstBus *bus;
+ GstStateChangeReturn ret;
+
+ /* 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 */
+ pipeline = gst_element_factory_make ("playbin", "pipeline");
+ g_object_set (G_OBJECT (pipeline), "uri", argv[1], NULL);
+ g_object_set (G_OBJECT (pipeline), "flags", 0x697 , NULL);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_signal_watch (bus);
+
+ g_signal_connect (bus, "message::buffering",
+ (GCallback) on_message_buffering, pipeline);
+ g_signal_connect (bus, "message::async-done",
+ (GCallback) on_message_async_done, pipeline);
+ gst_object_unref (bus);
+
+ is_buffering = FALSE;
+ target_state = GST_STATE_PLAYING;
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+
+ switch (ret) {
+ case GST_STATE_CHANGE_SUCCESS:
+ is_live = FALSE;
+ break;
+
+ case GST_STATE_CHANGE_FAILURE:
+ g_warning ("failed to PAUSE");
+ return -1;
+
+ case GST_STATE_CHANGE_NO_PREROLL:
+ is_live = TRUE;
+ break;
+
+ default:
+ break;
+ }
+
+ /* now run */
+ g_main_loop_run (loop);
+
+ /* also clean up */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (pipeline));
+ g_main_loop_unref (loop);
+
+ return 0;
+}
+]]>
+<!-- example-end norebuffer.c a -->
+ </programlisting>
+ <para>
+ See how we set the pipeline to the PAUSED state first. We will receive
+ buffering messages during the preroll state when buffering is needed.
+ When we are prerolled (on_message_async_done) we see if buffering is
+ going on, if not, we start playback. If buffering was going on, we start
+ a timeout to poll the buffering state. If the estimated time to download
+ is less than the remaining playback time, we start playback.
+ </para>
+ </sect2>
+ </sect1>
+</chapter>
diff --git a/docs/manual/advanced-clocks.xml b/docs/manual/advanced-clocks.xml
index c23cf3c..d6c8007 100644
--- a/docs/manual/advanced-clocks.xml
+++ b/docs/manual/advanced-clocks.xml
@@ -1,91 +1,295 @@
<chapter id="chapter-clocks">
- <title>Clocks in GStreamer</title>
+ <title>Clocks and synchronization 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.
+ 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>
-
<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.
+ &GStreamer; provides support for the following use cases:
+ <itemizedlist>
+ <listitem>
+ <para>
+ Non-live sources with access faster than playback rate. This is
+ the case where one is reading media from a file and playing it
+ back in a synchronized fashion. In this case, multiple streams need
+ to be synchronized, like audio, video and subtitles.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Capture and synchronized muxing/mixing of media from multiple live
+ sources. This is a typical use case where you record audio and
+ video from a microphone/camera and mux it into a file for
+ storage.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Streaming from (slow) network streams with buffering. This is the
+ typical web streaming case where you access content from a streaming
+ server with http.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Capture from live source and and playback to live source with
+ configurable latency. This is used when, for example, capture from
+ a camera, apply an effect and display the result. It is also used
+ when streaming low latency content over a network with UDP.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Simultaneous live capture and playback from prerecorded content.
+ This is used in audio recording cases where you play a previously
+ recorded audio and record new samples, the purpose is to have the
+ new audio perfectly in sync with the previously recorded data.
+ </para>
+ </listitem>
+ </itemizedlist>
</para>
+ <para>
+ &GStreamer; uses a <classname>GstClock</classname> object, buffer
+ timestamps and a SEGMENT event to synchronize streams in a pipeline
+ as we will see in the next sections.
+ </para>
+
+ <sect1 id="section-clock-time-types" xreflabel="Clock running-time">
+ <title>Clock running-time </title>
+ <para>
+ In a typical computer, there are many sources that can be used as a
+ time source, e.g., the system time, soundcards, CPU performance
+ counters, ... For this reason, there are many
+ <classname>GstClock</classname> implementations available in &GStreamer;.
+ The clock time doesn't always start from 0 or from some known value.
+ Some clocks start counting from some known start date, other clocks start
+ counting since last reboot, etc...
+ </para>
+ <para>
+ A <classname>GstClock</classname> returns the
+ <emphasis role="strong">absolute-time</emphasis>
+ according to that clock with <function>gst_clock_get_time ()</function>.
+ The absolute-time (or clock time) of a clock is monotonically increasing.
+ From the absolute-time is a <emphasis role="strong">running-time</emphasis>
+ calculated, which is simply the difference between a previous snapshot
+ of the absolute-time called the <emphasis role="strong">base-time</emphasis>.
+ So:
+ </para>
+ <para>
+ running-time = absolute-time - base-time
+ </para>
+ <para>
+ A &GStreamer; <classname>GstPipeline</classname> object maintains a
+ <classname>GstClock</classname> object and a base-time when it goes
+ to the PLAYING state. The pipeline gives a handle to the selected
+ <classname>GstClock</classname> to each element in the pipeline along
+ with selected base-time. The pipeline will select a base-time in such
+ a way that the running-time reflects the total time spent in the
+ PLAYING state. As a result, when the pipeline is PAUSED, the
+ running-time stands still.
+ </para>
+ <para>
+ Because all objects in the pipeline have the same clock and base-time,
+ they can thus all calculate the running-time according to the pipeline
+ clock.
+ </para>
+ </sect1>
+
+ <sect1 id="section-buffer-running-time" xreflabel="Buffer running-time">
+ <title>Buffer running-time</title>
+ <para>
+ To calculate a buffer running-time, we need a buffer timestamp and
+ the SEGMENT event that preceeded the buffer. First we can convert
+ the SEGMENT event into a <classname>GstSegment</classname> object
+ and then we can use the
+ <function>gst_segment_to_running_time ()</function> function to
+ perform the calculation of the buffer running-time.
+ </para>
+ <para>
+ Synchronization is now a matter of making sure that a buffer with a
+ certain running-time is played when the clock reaches the same
+ running-time. Usually this task is done by sink elements. Sink also
+ have to take into account the latency configured in the pipeline and
+ add this to the buffer running-time before synchronizing to the
+ pipeline clock.
+ </para>
+ <para>
+ Non-live sources timestamp buffers with a running-time starting
+ from 0. After a flushing seek, they will produce buffers again
+ from a running-time of 0.
+ </para>
+ <para>
+ Live sources need to timestamp buffers with a running-time matching
+ the pipeline running-time when the first byte of the buffer was
+ captured.
+ </para>
+ </sect1>
+
+ <sect1 id="section-buffer-stream-time" xreflabel="Buffer stream-time">
+ <title>Buffer stream-time</title>
+ <para>
+ The buffer stream-time, also known as the position in the stream,
+ is calculated from the buffer timestamps and the preceeding SEGMENT
+ event. It represents the time inside the media as a value between
+ 0 and the total duration of the media.
+ </para>
+ <para>
+ The stream-time is used in:
+ <itemizedlist>
+ <listitem>
+ <para>
+ Report the current position in the stream with the POSITION
+ query.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The position used in the seek events and queries.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The position used to synchronize controlled values.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ The stream-time is never used to synchronize streams, this is only
+ done with the running-time.
+ </para>
+ </sect1>
- <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-time-overview" xreflabel="Time overview">
+ <title>Time overview</title>
+ <para>
+ Here is an overview of the various timelines used in &GStreamer;.
+ </para>
+ <para>
+ The image below represents the different times in the pipeline when
+ playing a 100ms sample and repeating the part between 50ms and
+ 100ms.
+ </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>
+
+ <para>
+ You can see how the running-time of a buffer always increments
+ monotonically along with the clock-time. Buffers are played when their
+ running-time is equal to the clock-time - base-time. The stream-time
+ represents the position in the stream and jumps backwards when
+ repeating.
+ </para>
+ </sect1>
<sect1 id="section-clocks-providers">
<title>Clock providers</title>
-
+ <para>
+ A clock provider is an element in the pipeline that can provide
+ a <classname>GstClock</classname> object. The clock object needs to
+ report an absoulute-time that is monotonocally increasing when the
+ element is in the PLAYING state. It is allowed to pause the clock
+ while the element is PAUSED.
+ </para>
<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.
+ samples. This is only true by approximation. In fact, the audio
+ device has an internal clock based on the number of samples played
+ that we can expose.
</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.
+ If an element with an internal clock needs to synchronize, it needs
+ to estimate when a time according to the pipeline clock will take
+ place according to the internal clock. To estimate this, it needs
+ to slave its clock to the pipeline clock.
</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.
+ If the pipeline clock is exactly the internal clock of an element,
+ the element can skip the slaving step and directly use the pipeline
+ clock to schedule playback. This can be both faster and more
+ accurate.
+ Therefore, generally, elements with an internal clock like audio
+ input or output devices will be a clock provider for the pipeline.
</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.
+ When the pipeline goes to the PLAYING state, it will go over all
+ elements in the pipeline from sink to source and ask each element
+ if they can provide a clock. The last element that can provide a
+ clock will be used as the clock provider in the pipeline.
+ This algorithm prefers a clock from an audio sink in a typical
+ playback pipeline and a clock from source elements in a typical
+ capture pipeline.
</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>.
+ There exist some bus messages to let you know about the clock and
+ clock providers in the pipeline. You can see what clock is selected
+ in the pipeline by looking at the NEW_CLOCK message on the bus.
+ When a clock provider is removed from the pipeline, a CLOCK_LOST
+ message is posted and the application should go to PAUSED and back
+ to PLAYING to select a new clock.
+ </para>
+ </sect1>
+
+ <sect1 id="section-clocks-latency">
+ <title>Latency</title>
+ <para>
+ The latency is the time it takes for a sample captured at timestamp X
+ 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.
</para>
<para>
- For more information on how to write elements that conform to this
- required behaviour, see the Plugin Writer's Guide.
+ 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.
</para>
+
+ <sect2 id="section-latency-compensation">
+ <title>Latency compensation</title>
+ <para>
+ Before the pipeline goes to the PLAYING state, it will, in addition to
+ selecting a clock and calculating a base-time, calculate the latency
+ in the pipeline. It does this by doing a LATENCY query on all the sinks
+ in the pipeline. The pipeline then selects the maximum latency in the
+ pipeline and configures this with a LATENCY event.
+ </para>
+ <para>
+ All sink elements will delay playback by the value in the LATENCY event.
+ Since all sinks delay with the same amount of time, they will be
+ relative in sync.
+ </para>
+ </sect2>
+
+ <sect2 id="section-latency-dynamic">
+ <title>Dynamic Latency</title>
+ <para>
+ Adding/removing elements to/from a pipeline or changing element
+ properties can change the latency in a pipeline. An element can
+ request a latency change in the pipeline by posting a LATENCY
+ message on the bus. The application can then decide to query and
+ redistribute a new latency or not. Changing the latency in a
+ pipeline might cause visual or audible glitches and should
+ therefore only be done by the application when it is allowed.
+ </para>
+ </sect2>
</sect1>
</chapter>
diff --git a/docs/manual/advanced-dataaccess.xml b/docs/manual/advanced-dataaccess.xml
index 28fc56c..983d757 100644
--- a/docs/manual/advanced-dataaccess.xml
+++ b/docs/manual/advanced-dataaccess.xml
@@ -1248,6 +1248,7 @@ main (int argc, char **argv)
in the pipeline, it is possible that the pipeline needs to
negotiate a new format and this can fail. Usually you can fix this
by inserting the right converter elements where needed.
+ See also <xref linkend="section-dynamic-changing"/>.
</para>
</listitem>
</itemizedlist>
@@ -1262,77 +1263,313 @@ main (int argc, char **argv)
<sect2 id="section-dynamic-changing">
<title>Changing elements in a pipeline</title>
<para>
- WRITEME
+ In the next example we look at the following chain of elements:
</para>
- </sect2>
- </sect1>
+ <programlisting>
+ - ----. .----------. .---- -
+ element1 | | element2 | | element3
+ src -> sink src -> sink
+ - ----' '----------' '---- -
+ </programlisting>
+ <para>
+ We want to change element2 by element4 while the pipeline is in
+ the PLAYING state. Let's say that element2 is a visualization and
+ that you want to switch the visualization in the pipeline.
+ </para>
+ <para>
+ We can't just unlink element2's sinkpad from element1's source
+ pad because that would leave element1's source pad
+ unlinked and would cause a streaming error in the pipeline when
+ data is pushed on the source pad.
+ The technique is to block the dataflow from element1's source pad
+ before we change element2 by element4 and then resume dataflow
+ as shown in the following steps:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Block element1's source pad with a blocking pad probe. When the
+ pad is blocked, the probe callback will be called.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Inside the block callback nothing is flowing between element1
+ and element2 and nothing will flow until unblocked.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Unlink element1 and element2.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Make sure data is flushed out of element2. Some elements might
+ internally keep some data, you need to make sure not to lose data
+ by forcing it out of element2. You can do this by pushing EOS into
+ element2, like this:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Put an event probe on element2's source pad.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Send EOS to element2's sinkpad. This makes sure the all the
+ data inside element2 is forced out.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Wait for the EOS event to appear on element2's source pad.
+ When the EOS is received, drop it and remove the event
+ probe.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+ <listitem>
+ <para>
+ Unlink element2 and element3. You can now also remove element2
+ from the pipeline and set the state to NULL.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Add element4 to the pipeline, if not already added. Link element4
+ and element3. Link element1 and element4.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Make sure element4 is in the same state as the rest of the elements
+ in the pipeline. It should be at least in the PAUSED state before
+ it can receive buffers and events.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Unblock element1's source pad probe. This will let new data into
+ element4 and continue streaming.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ The above algorithm works when the source pad is blocked, i.e. when
+ there is dataflow in the pipeline. If there is no dataflow, there is
+ also no point in changing the element (just yet) so this algorithm can
+ be used in the PAUSED state as well.
+ </para>
+ <para>
+ Let show you how this works with an example. This example changes the
+ video effect on a simple pipeline every second.
+ </para>
+ <programlisting>
+<!-- example-begin effectswitch.c -->
+<![CDATA[
+#include <gst/gst.h>
- <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 a call to
- <function>gst_plugin_register_static ()</function>. As soon as you
- call <function>gst_plugin_register_static ()</function>, 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>
+static gchar *opt_effects = NULL;
- <programlisting>
-<![CDATA[
-/*
- * Here, you would write the actual plugin code.
- */
+#define DEFAULT_EFFECTS "identity,exclusion,navigationtest," \
+ "agingtv,videoflip,vertigotv,gaussianblur,shagadelictv,edgetv"
+
+static GstPad *blockpad;
+static GstElement *conv_before;
+static GstElement *conv_after;
+static GstElement *cur_effect;
+static GstElement *pipeline;
+
+static GQueue effects = G_QUEUE_INIT;
+
+static GstPadProbeReturn
+event_probe_cb (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
+{
+ GMainLoop *loop = user_data;
+ GstElement *next;
+
+ if (GST_EVENT_TYPE (GST_PAD_PROBE_INFO_DATA (info)) != GST_EVENT_EOS)
+ return GST_PAD_PROBE_OK;
+
+ gst_pad_remove_probe (pad, GST_PAD_PROBE_INFO_ID (info));
+
+ /* push current event back into the queue */
+ g_queue_push_tail (&effects, gst_object_ref (cur_effect));
+ /* take next effect from the queue */
+ next = g_queue_pop_head (&effects);
+ if (next == NULL) {
+ GST_DEBUG_OBJECT (pad, "no more effects");
+ g_main_loop_quit (loop);
+ return GST_PAD_PROBE_DROP;
+ }
+
+ g_print ("Switching from '%s' to '%s'..\n", GST_OBJECT_NAME (cur_effect),
+ GST_OBJECT_NAME (next));
+
+ gst_element_set_state (cur_effect, GST_STATE_NULL);
+
+ /* remove unlinks automatically */
+ GST_DEBUG_OBJECT (pipeline, "removing %" GST_PTR_FORMAT, cur_effect);
+ gst_bin_remove (GST_BIN (pipeline), cur_effect);
-[..]
+ GST_DEBUG_OBJECT (pipeline, "adding %" GST_PTR_FORMAT, next);
+ gst_bin_add (GST_BIN (pipeline), next);
+
+ GST_DEBUG_OBJECT (pipeline, "linking..");
+ gst_element_link_many (conv_before, next, conv_after, NULL);
+
+ gst_element_set_state (next, GST_STATE_PLAYING);
+
+ cur_effect = next;
+ GST_DEBUG_OBJECT (pipeline, "done");
+
+ return GST_PAD_PROBE_DROP;
+}
+
+static GstPadProbeReturn
+pad_probe_cb (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
+{
+ GstPad *srcpad, *sinkpad;
+
+ GST_DEBUG_OBJECT (pad, "pad is blocked now");
+
+ /* remove the probe first */
+ gst_pad_remove_probe (pad, GST_PAD_PROBE_INFO_ID (info));
+
+ /* install new probe for EOS */
+ srcpad = gst_element_get_static_pad (cur_effect, "src");
+ gst_pad_add_probe (srcpad, GST_PAD_PROBE_TYPE_BLOCK |
+ GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, event_probe_cb, user_data, NULL);
+ gst_object_unref (srcpad);
+
+ /* push EOS into the element, the probe will be fired when the
+ * EOS leaves the effect and it has thus drained all of its data */
+ sinkpad = gst_element_get_static_pad (cur_effect, "sink");
+ gst_pad_send_event (sinkpad, gst_event_new_eos ());
+ gst_object_unref (sinkpad);
+
+ return GST_PAD_PROBE_OK;
+}
static gboolean
-register_elements (GstPlugin *plugin)
+timeout_cb (gpointer user_data)
{
- return gst_element_register (plugin, "my-element-name",
- GST_RANK_NONE, MY_PLUGIN_TYPE);
+ gst_pad_add_probe (blockpad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
+ pad_probe_cb, user_data, NULL);
+
+ return TRUE;
}
-static
-my_code_init (void)
+static gboolean
+bus_cb (GstBus * bus, GstMessage * msg, gpointer user_data)
{
- ...
-
- gst_plugin_register_static (
- GST_VERSION_MAJOR,
- GST_VERSION_MINOR,
- "my-private-plugins",
- "Private elements of my application",
- register_elements,
- VERSION,
- "LGPL",
- "my-application-source",
- "my-application",
- "http://www.my-application.net/")
-
- ...
+ GMainLoop *loop = user_data;
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_ERROR:{
+ GError *err = NULL;
+ gchar *dbg;
+
+ gst_message_parse_error (msg, &err, &dbg);
+ gst_object_default_error (msg->src, err, dbg);
+ g_error_free (err);
+ g_free (dbg);
+ g_main_loop_quit (loop);
+ break;
+ }
+ default:
+ break;
+ }
+ return TRUE;
+}
+
+int
+main (int argc, char **argv)
+{
+ GOptionEntry options[] = {
+ {"effects", 'e', 0, G_OPTION_ARG_STRING, &opt_effects,
+ "Effects to use (comma-separated list of element names)", NULL},
+ {NULL}
+ };
+ GOptionContext *ctx;
+ GError *err = NULL;
+ GMainLoop *loop;
+ GstElement *src, *sink;
+ gchar **effect_names, **e;
+
+ ctx = g_option_context_new ("");
+ g_option_context_add_main_entries (ctx, options, NULL);
+ g_option_context_add_group (ctx, gst_init_get_option_group ());
+ if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
+ g_print ("Error initializing: %s\n", err->message);
+ return 1;
+ }
+ g_option_context_free (ctx);
+
+ if (opt_effects != NULL)
+ effect_names = g_strsplit (opt_effects, ",", -1);
+ else
+ effect_names = g_strsplit (DEFAULT_EFFECTS, ",", -1);
+
+ for (e = effect_names; e != NULL && *e != NULL; ++e) {
+ GstElement *el;
+
+ el = gst_element_factory_make (*e, NULL);
+ if (el) {
+ g_print ("Adding effect '%s'\n", *e);
+ g_queue_push_tail (&effects, el);
+ }
+ }
+
+ pipeline = gst_pipeline_new ("pipeline");
+
+ src = gst_element_factory_make ("videotestsrc", NULL);
+ g_object_set (src, "is-live", TRUE, NULL);
+
+ blockpad = gst_element_get_static_pad (src, "src");
+
+ conv_before = gst_element_factory_make ("videoconvert", NULL);
+
+ cur_effect = g_queue_pop_head (&effects);
+
+ conv_after = gst_element_factory_make ("videoconvert", NULL);
+
+ sink = gst_element_factory_make ("ximagesink", NULL);
+
+ gst_bin_add_many (GST_BIN (pipeline), src, conv_before, cur_effect,
+ conv_after, sink, NULL);
+
+ gst_element_link_many (src, conv_before, cur_effect, conv_after,
+ sink, NULL);
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+ gst_bus_add_watch (GST_ELEMENT_BUS (pipeline), bus_cb, loop);
+
+ g_timeout_add_seconds (1, timeout_cb, loop);
+
+ g_main_loop_run (loop);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ return 0;
}
]]>
- </programlisting>
+<!-- example-end effectswitch.c -->
+ </programlisting>
+ <para>
+ Note how we added videoconvert elements before and after the effect.
+ This is needed because some elements might operate in different
+ colorspaces than other elements. By inserting the conversion elements
+ you ensure that the right format can be negotiated at any time.
+ </para>
+ </sect2>
</sect1>
+
</chapter>
diff --git a/docs/manual/advanced-threads.xml b/docs/manual/advanced-threads.xml
index cabdcf5..5925640 100644
--- a/docs/manual/advanced-threads.xml
+++ b/docs/manual/advanced-threads.xml
@@ -7,11 +7,412 @@
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.
+ See <xref linkend="section-threads-uses"/>.
</para>
+ <para>
+ &GStreamer; can also notify you when threads are created so that you can
+ configure things such as the thread priority or the threadpool to use.
+ See <xref linkend="section-threads-status"/>.
+ </para>
+
+ <sect1 id="section-threads-scheduling">
+ <title>Scheduling in &GStreamer;</title>
+ <para>
+ Each element in the &GStreamer; pipeline decides how it is going to
+ be scheduled. Elements can choose if their pads are to be scheduled
+ push-based or pull-based. An element can, for example, choose to start
+ a thread to start pulling from the sink pad or/and start pushing on
+ the source pad. An element can also choose to use the upstream or
+ downstream thread for its data processing in push and pull mode
+ respectively. &GStreamer; does not pose any restrictions on how the
+ element chooses to be scheduled. See the Plugin Writer Guide for more
+ details.
+ </para>
+ <para>
+ What will happen in any case is that some elements will start a thread
+ for their data processing, called the <quote>streaming threads</quote>.
+ The streaming threads, or <classname>GstTask</classname> objects, are
+ created from a <classname>GstTaskPool</classname> when the element
+ needs to make a streaming thread. In the next section we see how we
+ can receive notifications of the tasks and pools.
+ </para>
+ </sect1>
+
+ <sect1 id="section-threads-status">
+ <title>Configuring Threads in &GStreamer;</title>
+ <para>
+ A STREAM_STATUS message is posted on the bus to inform you about the
+ status of the streaming threads. You will get the following information
+ from the message:
+ <itemizedlist>
+ <listitem>
+ <para>
+ When a new thread is about to be created, you will be notified
+ of this with a GST_STREAM_STATUS_TYPE_CREATE type. It is then
+ possible to configure a <classname>GstTaskPool</classname> in
+ the <classname>GstTask</classname>. The custom taskpool will
+ provide custom threads for the task to implement the streaming
+ threads.
+ </para>
+ <para>
+ This message needs to be handled synchronously if you want to
+ configure a custom taskpool. If you don't configure the taskpool
+ on the task when this message returns, the task will use its
+ default pool.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ When a thread is entered or left. This is the moment where you
+ could configure thread priorities. You also get a notification
+ when a thread is destroyed.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ You get messages when the thread starts, pauses and stops. This
+ could be used to visualize the status of streaming threads in
+ a gui application.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ </para>
+ <para>
+ We will now look at some examples in the next sections.
+ </para>
+
+ <sect2 id="section-threads-rt">
+ <title>Boost priority of a thread</title>
+ <programlisting>
+ .----------. .----------.
+ | faksesrc | | fakesink |
+ | src->sink |
+ '----------' '----------'
+ </programlisting>
+ <para>
+ Let's look at the simple pipeline above. We would like to boost
+ the priority of the streaming thread.
+ It will be the fakesrc element that starts the streaming thread for
+ generating the fake data pushing them to the peer fakesink.
+ The flow for changing the priority would go like this:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ 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.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The application will react to the STREAM_STATUS messages with a
+ sync bus handler. It will then configure a custom
+ <classname>GstTaskPool</classname> on the
+ <classname>GstTask</classname> inside the message. The custom
+ taskpool is responsible for creating the threads. In this
+ example we will make a thread with a higher priority.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Alternatively, since the sync message is called in the thread
+ context, you can use thread ENTER/LEAVE notifications to
+ change the priority or scheduling pollicy of the current thread.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ In a first step we need to implement a custom
+ <classname>GstTaskPool</classname> that we can configure on the task.
+ Below is the implementation of a <classname>GstTaskPool</classname>
+ subclass that uses pthreads to create a SCHED_RR real-time thread.
+ Note that creating real-time threads might require extra priveleges.
+ </para>
+ <programlisting>
+<!-- example-begin testrtpool.c a -->
+<!--
+#include <gst/gst.h>
+
+#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);
+
+-->
+<!-- example-end testrtpool.c a-->
+<!-- example-begin testrtpool.c b -->
+<![CDATA[
+#include <pthread.h>
+
+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 */
+}
+
+static void
+default_cleanup (GstTaskPool * 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;
+
+ tid = g_slice_new0 (TestRTId);
+
+ pthread_attr_init (&attr);
+ if ((res = pthread_attr_setschedpolicy (&attr, SCHED_RR)) != 0)
+ g_warning ("setschedpolicy: failure: %p", g_strerror (res));
+
+ param.sched_priority = 50;
+ if ((res = pthread_attr_setschedparam (&attr, &param)) != 0)
+ g_warning ("setschedparam: failure: %p", g_strerror (res));
+
+ if ((res = pthread_attr_setinheritsched (&attr, PTHREAD_EXPLICIT_SCHED)) != 0)
+ g_warning ("setinheritsched: failure: %p", g_strerror (res));
+
+ 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;
+
+ pthread_join (tid->thread, NULL);
+
+ g_slice_free (TestRTId, tid);
+}
+
+static void
+test_rt_pool_class_init (TestRTPoolClass * klass)
+{
+ GstTaskPoolClass *gsttaskpool_class;
+
+ gsttaskpool_class = (GstTaskPoolClass *) klass;
+
+ 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)
+{
+}
+
+GstTaskPool *
+test_rt_pool_new (void)
+{
+ GstTaskPool *pool;
+
+ pool = g_object_new (TEST_TYPE_RT_POOL, NULL);
+
+ return pool;
+}
+]]>
+<!-- example-end testrtpool.c b -->
+ </programlisting>
+ <para>
+ The important function to implement when writing an taskpool is the
+ <quote>push</quote> function. The implementation should start a thread
+ that calls the given function. More involved implementations might
+ want to keep some threads around in a pool because creating and
+ destroying threads is not always the fastest operation.
+ </para>
+ <para>
+ In a next step we need to actually configure the custom taskpool when
+ the fakesrc needs it. For this we intercept the STREAM_STATUS messages
+ with a sync handler.
+ </para>
+ <programlisting>
+<!-- example-begin testrtpool.c c -->
+<![CDATA[
+static GMainLoop* loop;
+
+static void
+on_stream_status (GstBus *bus,
+ GstMessage *message,
+ gpointer user_data)
+{
+ GstStreamStatusType type;
+ GstElement *owner;
+ const GValue *val;
+ GstTask *task = NULL;
+
+ gst_message_parse_stream_status (message, &type, &owner);
+
+ val = gst_message_get_stream_status_object (message);
+
+ /* 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) {
+ GstTaskPool *pool;
+
+ pool = test_rt_pool_new();
+
+ gst_task_set_pool (task, pool);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+on_error (GstBus *bus,
+ GstMessage *message,
+ gpointer user_data)
+{
+ g_message ("received ERROR");
+ g_main_loop_quit (loop);
+}
+
+static void
+on_eos (GstBus *bus,
+ GstMessage *message,
+ gpointer user_data)
+{
+ g_main_loop_quit (loop);
+}
+
+int
+main (int argc, char *argv[])
+{
+ GstElement *bin, *fakesrc, *fakesink;
+ GstBus *bus;
+ GstStateChangeReturn ret;
+
+ 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);
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* get the bus, we need to install a sync handler */
+ bus = gst_pipeline_get_bus (GST_PIPELINE (bin));
+ gst_bus_enable_sync_message_emission (bus);
+ gst_bus_add_signal_watch (bus);
+
+ g_signal_connect (bus, "sync-message::stream-status",
+ (GCallback) on_stream_status, NULL);
+ g_signal_connect (bus, "message::error",
+ (GCallback) on_error, NULL);
+ g_signal_connect (bus, "message::eos",
+ (GCallback) on_eos, NULL);
+
+ /* start playing */
+ ret = gst_element_set_state (bin, GST_STATE_PLAYING);
+ if (ret != GST_STATE_CHANGE_SUCCESS) {
+ g_message ("failed to change state");
+ return -1;
+ }
+
+ /* Run event loop listening for bus messages until EOS or ERROR */
+ g_main_loop_run (loop);
+
+ /* stop the bin */
+ gst_element_set_state (bin, GST_STATE_NULL);
+ gst_object_unref (bus);
+ g_main_loop_unref (loop);
+
+ return 0;
+}
+]]>
+<!-- example-end testrtpool.c c -->
+ </programlisting>
+ <para>
+ Note that this program likely needs root permissions in order to
+ create real-time threads. When the thread can't be created, the
+ state change function will fail, which we catch in the application
+ above.
+ </para>
+ <para>
+ When there are multiple threads in the pipeline, you will receive
+ multiple STREAM_STATUS messages. You should use the owner of the
+ message, which is likely the pad or the element that starts the
+ thread, to figure out what the function of this thread is in the
+ context of the application.
+ </para>
+ </sect2>
+ </sect1>
<sect1 id="section-threads-uses">
<title>When would you want to force a thread?</title>
<para>
+ We have seen that threads are created by elements but it is also
+ possible to insert elements in the pipeline for the sole purpose of
+ forcing a new thread in the pipeline.
+ </para>
+ <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.
@@ -24,7 +425,8 @@
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.
+ loss. See also <xref linkend="section-buffering-stream"/> about network
+ buffering with queue2.
</para>
<figure float="1" id="section-thread-buffering-img">
<title>Data buffering, from a networked source</title>
@@ -58,7 +460,7 @@
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
+ provider/consumer 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>
@@ -76,23 +478,4 @@
</para>
</sect1>
- <sect1 id="section-threads-scheduling">
- <title>Scheduling in &GStreamer;</title>
-
- <para>
- Each element in the &GStreamer; pipeline decides how it is going to
- be scheduled. Elements can choose to be scheduled push-based or
- pull-based.
- If elements support random access to data, such as file sources,
- then elements downstream in the pipeline can ask to schedule the random
- access elements in pull-based mode. Data is pulled from upstream
- and pushed downstream. If pull-mode is not supported, the element can
- decide to operate in push-mode.
- </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-compiling.xml b/docs/manual/appendix-compiling.xml
new file mode 100644
index 0000000..2d83c98
--- /dev/null
+++ b/docs/manual/appendix-compiling.xml
@@ -0,0 +1,76 @@
+<chapter id="chapter-compiling">
+ <title>Compiling</title>
+ <para>
+ This section talks about the different things you can do when building
+ and shipping your applications and plugins.
+ </para>
+
+ <sect1 id="section-compiling-embedding">
+ <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 a call to
+ <function>gst_plugin_register_static ()</function>. As soon as you
+ call <function>gst_plugin_register_static ()</function>, 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>
+<![CDATA[
+/*
+ * 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);
+}
+
+static
+my_code_init (void)
+{
+ ...
+
+ gst_plugin_register_static (
+ GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "my-private-plugins",
+ "Private elements of my application",
+ register_elements,
+ VERSION,
+ "LGPL",
+ "my-application-source",
+ "my-application",
+ "http://www.my-application.net/")
+
+ ...
+}
+]]>
+ </programlisting>
+ </sect1>
+</chapter>
diff --git a/docs/manual/basics-bins.xml b/docs/manual/basics-bins.xml
index 1e3155e..882f3d1 100644
--- a/docs/manual/basics-bins.xml
+++ b/docs/manual/basics-bins.xml
@@ -163,8 +163,17 @@ main (int argc,
of the top-level pipeline to start up the pipeline or shut it down.
</para>
<para>
+ The bin will perform the state changes on all its children from the
+ sink element to the source element. This ensures that the downstream
+ element is ready to receive data when the upstream element is brought
+ to PAUSED or PLAYING. Similarly when shutting down, the sink elements
+ will be set to READY or NULL first, which will cause the upstream
+ elements to receive a FLUSHING error and stop the streaming threads
+ before the elements are set to the READY or NULL state.
+ </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"
+ already running, , e.g. from within a "pad-added"
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
diff --git a/docs/manual/basics-bus.xml b/docs/manual/basics-bus.xml
index 46e037a..d040c8d 100644
--- a/docs/manual/basics-bus.xml
+++ b/docs/manual/basics-bus.xml
@@ -2,7 +2,7 @@
<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
+ the streaming 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.
@@ -255,7 +255,7 @@ g_signal_connect (bus, "message::eos", G_CALLBACK (cb_message_eos), NULL);
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>.
+ ()</function>. See also <xref linkend="chapter-buffering"/>.
</para>
</listitem>
<listitem>
diff --git a/docs/manual/basics-elements.xml b/docs/manual/basics-elements.xml
index 33b805f..8f81493 100644
--- a/docs/manual/basics-elements.xml
+++ b/docs/manual/basics-elements.xml
@@ -557,7 +557,7 @@ main (int argc,
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
+ from within a "pad-added" 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>.
diff --git a/docs/manual/basics-pads.xml b/docs/manual/basics-pads.xml
index 91c6a5a..c490a25 100644
--- a/docs/manual/basics-pads.xml
+++ b/docs/manual/basics-pads.xml
@@ -120,7 +120,7 @@ main (int argc,
<!-- 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
+ the "pad-added" 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
diff --git a/docs/manual/communication.png b/docs/manual/communication.png
index 2d136c6..2b11ed5 100644
--- a/docs/manual/communication.png
+++ b/docs/manual/communication.png
Binary files differ
diff --git a/docs/manual/gstreamer-overview.png b/docs/manual/gstreamer-overview.png
index b762ab2..bb2df9b 100644
--- a/docs/manual/gstreamer-overview.png
+++ b/docs/manual/gstreamer-overview.png
Binary files differ
diff --git a/docs/manual/highlevel-components.xml b/docs/manual/highlevel-playback.xml
index b82c26c..27d2d1f 100644
--- a/docs/manual/highlevel-components.xml
+++ b/docs/manual/highlevel-playback.xml
@@ -1,5 +1,5 @@
-<chapter id="chapter-components">
- <title>Components</title>
+<chapter id="chapter-playback-components">
+ <title>Playback Components</title>
<para>
&GStreamer; includes several higher-level components to simplify an
@@ -193,9 +193,12 @@ main (gint argc,
responsible for reporting the error to the user.
</para>
<programlisting><!-- example-begin decodebin.c a -->
-#include &lt;gst/gst.h&gt;
+<![CDATA[
+#include <gst/gst.h>
+]]>
<!-- example-end decodebin.c a -->
-[.. my_bus_callback goes here ..]<!-- example-begin decodebin.c b --><!--
+[.. my_bus_callback goes here ..]<!-- example-begin decodebin.c b -->
+<!--
static gboolean
my_bus_callback (GstBus *bus,
GstMessage *message,
@@ -230,6 +233,7 @@ my_bus_callback (GstBus *bus,
}
--><!-- example-end decodebin.c b -->
<!-- example-begin decodebin.c c -->
+<![CDATA[
GstElement *pipeline, *audio;
static void
@@ -274,12 +278,12 @@ main (gint argc,
GstBus *bus;
/* init GStreamer */
- gst_init (&amp;argc, &amp;argv);
+ gst_init (&argc, &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]);
+ g_print ("Usage: %s <filename>\n", argv[0]);
return -1;
}
@@ -319,8 +323,8 @@ main (gint argc,
return 0;
}
+]]>
<!-- example-end decodebin.c c --></programlisting>
-
<para>
Decodebin, similar to playbin, supports the following features:
</para>
@@ -366,11 +370,248 @@ main (gint argc,
command <command>gst-launch-1.0 filesrc location=file.ogg ! decodebin
! audioconvert ! audioresample ! autoaudiosink</command>.
</para>
+ </sect1>
+
+ <sect1 id="section-components-uridecodebin">
+ <title>URIDecodebin</title>
<para>
The uridecodebin element is very similar to decodebin, only that it
automatically plugs a source plugin based on the protocol of the URI
given.
</para>
+ <para>
+ Uridecodebin will also automatically insert buffering elements when
+ the uri is a slow network source. The buffering element will post
+ BUFFERING messages that the application needs to handle as explained
+ in <xref linkend="chapter-buffering"/>.
+ The following properties can be used to configure the buffering method:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ The buffer-size property allows you to configure a maximum size in
+ bytes for the buffer element.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The buffer-duration property allows you to configure a maximum size
+ in time for the buffer element. The time will be estimated based on
+ the bitrate of the network.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ With the download property you can enable the download buffering
+ method as described in <xref linkend="section-buffering-download"/>.
+ Setting this option to TRUE will only enable download buffering
+ for selected formats such as quicktime, flash video, avi and
+ webm.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ You can also enable buffering on the parsed/demuxed data with the
+ use-buffering property. This is interesting to enable buffering
+ on slower random access media such as a network file server.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ URIDecodebin can be easily tested on the commandline, e.g. by using the
+ command <command>gst-launch-1.0 uridecodebin uri=file:///file.ogg !
+ ! audioconvert ! audioresample ! autoaudiosink</command>.
+ </para>
</sect1>
+ <sect1 id="section-components-playsink">
+ <title>Playsink</title>
+ <para>
+ The playsink element is a powerful sink element. It has request pads
+ for raw decoded audio, video and text and it will configure itself to
+ play the media streams. It has the following features:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ It exposes GstStreamVolume, GstVideoOverlay, GstNavigation and
+ GstColorBalance interfaces and automatically plugs software
+ elements to implement the interfaces when needed.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ It will automatically plug conversion elements.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Can optionally render visualizations when there is no video input.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Configurable sink elements.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Configurable audio/video sync offset to fine-tune synchronization
+ in badly muxed files.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Support for taking a snapshot of the last video frame.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Below is an example of how you can use playsink. We use a uridecodebin
+ element to decode into raw audio and video streams which we then link
+ to the playsink request pads. We only link the first audio and video
+ pads, you could use an input-selector to link all pads.
+ </para>
+ <programlisting>
+<!-- example-begin playsink.c a -->
+<![CDATA[
+#include <gst/gst.h>
+]]>
+<!-- example-end playsink.c a -->
+[.. my_bus_callback goes here ..]
+<!-- example-begin playsink.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 playsink.c b -->
+<!-- example-begin playsink.c c -->
+<![CDATA[
+GstElement *pipeline, *sink;
+
+static void
+cb_pad_added (GstElement *dec,
+ GstPad *pad,
+ gpointer data)
+{
+ GstCaps *caps;
+ GstStructure *str;
+ const gchar *name;
+ GstPadTemplate *templ;
+ GstElementClass *klass;
+
+ /* check media type */
+ caps = gst_pad_query_caps (pad, NULL);
+ str = gst_caps_get_structure (caps, 0);
+ name = gst_structure_get_name (str);
+
+ klass = GST_ELEMENT_GET_CLASS (sink);
+
+ if (g_str_has_prefix (name, "audio")) {
+ templ = gst_element_class_get_pad_template (klass, "audio_sink");
+ } else if (g_str_has_prefix (name, "video")) {
+ templ = gst_element_class_get_pad_template (klass, "video_sink");
+ } else if (g_str_has_prefix (name, "text")) {
+ templ = gst_element_class_get_pad_template (klass, "text_sink");
+ } else {
+ templ = NULL;
+ }
+
+ if (templ) {
+ GstPad *sinkpad;
+
+ sinkpad = gst_element_request_pad (sink, templ, NULL, NULL);
+
+ if (!gst_pad_is_linked (sinkpad))
+ gst_pad_link (pad, sinkpad);
+
+ gst_object_unref (sinkpad);
+ }
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GMainLoop *loop;
+ GstElement *dec;
+ 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 <uri>\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);
+
+ dec = gst_element_factory_make ("uridecodebin", "source");
+ g_object_set (G_OBJECT (dec), "uri", argv[1], NULL);
+ g_signal_connect (dec, "pad-added", G_CALLBACK (cb_pad_added), NULL);
+
+ /* create audio output */
+ sink = gst_element_factory_make ("playsink", "sink");
+ gst_util_set_object_arg (G_OBJECT (sink), "flags",
+ "soft-colorbalance+soft-volume+vis+text+audio+video");
+ gst_bin_add_many (GST_BIN (pipeline), dec, sink, NULL);
+
+ /* 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 playsink.c c -->
+ </programlisting>
+ <para>
+ This example will show audio and video depending on what you
+ give it. Try this example on an audio file and you will see that
+ it shows visualizations. You can change the visualization at runtime by
+ changing the vis-plugin property.
+ </para>
+ </sect1>
</chapter>
diff --git a/docs/manual/intro-gstreamer.xml b/docs/manual/intro-gstreamer.xml
index 1e40c97..38329e8 100644
--- a/docs/manual/intro-gstreamer.xml
+++ b/docs/manual/intro-gstreamer.xml
@@ -55,7 +55,8 @@
<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 mechanism for synchronization</para></listitem>
+ <listitem><para>over 250 plug-ins providing more than 1000 elements</para></listitem>
<listitem><para>a set of tools</para></listitem>
</itemizedlist>
</para>
diff --git a/docs/manual/manual.xml b/docs/manual/manual.xml
index 14f32d1..6462ccc 100644
--- a/docs/manual/manual.xml
+++ b/docs/manual/manual.xml
@@ -41,16 +41,18 @@
<!ENTITY METADATA SYSTEM "advanced-metadata.xml">
<!ENTITY INTERFACES SYSTEM "advanced-interfaces.xml">
<!ENTITY CLOCKS SYSTEM "advanced-clocks.xml">
+<!ENTITY BUFFERING SYSTEM "advanced-buffering.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 COMPONENTS SYSTEM "highlevel-components.xml">
+<!ENTITY PLAYBACK SYSTEM "highlevel-playback.xml">
<!-- Appendices -->
<!ENTITY PROGRAMS SYSTEM "appendix-programs.xml">
+<!ENTITY COMPILING SYSTEM "appendix-compiling.xml">
<!ENTITY CHECKLIST SYSTEM "appendix-checklist.xml">
<!ENTITY PORTING SYSTEM "appendix-porting.xml">
<!ENTITY INTEGRATION SYSTEM "appendix-integration.xml">
@@ -172,6 +174,7 @@
&METADATA;
&INTERFACES;
&CLOCKS;
+ &BUFFERING;
&DPARAMS;
&THREADS;
&AUTOPLUGGING;
@@ -199,7 +202,7 @@
</para>
</partintro>
- &COMPONENTS;
+ &PLAYBACK;
</part>
@@ -255,6 +258,7 @@
-->
&PROGRAMS;
+ &COMPILING;
&CHECKLIST;
&PORTING;
&INTEGRATION;
diff --git a/docs/manual/mime-world.png b/docs/manual/mime-world.png
index 97b9557..f1e51f2 100644
--- a/docs/manual/mime-world.png
+++ b/docs/manual/mime-world.png
Binary files differ
diff --git a/docs/manual/thread-buffering.png b/docs/manual/thread-buffering.png
index e0886c1..006c602 100644
--- a/docs/manual/thread-buffering.png
+++ b/docs/manual/thread-buffering.png
Binary files differ
diff --git a/docs/plugins/Makefile.in b/docs/plugins/Makefile.in
index 02830bb..0e29152 100644
--- a/docs/plugins/Makefile.in
+++ b/docs/plugins/Makefile.in
@@ -99,7 +99,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -318,6 +318,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -354,6 +357,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/docs/plugins/html/ch01.html b/docs/plugins/html/ch01.html
index 8c59924..7f28375 100644
--- a/docs/plugins/html/ch01.html
+++ b/docs/plugins/html/ch01.html
@@ -21,7 +21,7 @@
</tr></table>
<div class="chapter">
<div class="titlepage"><div><div><h2 class="title">
-<a name="idp546320"></a>gstreamer Elements</h2></div></div></div>
+<a name="idp4169040"></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>
diff --git a/docs/plugins/html/ch02.html b/docs/plugins/html/ch02.html
index 9861817..1c56097 100644
--- a/docs/plugins/html/ch02.html
+++ b/docs/plugins/html/ch02.html
@@ -21,7 +21,7 @@
</tr></table>
<div class="chapter">
<div class="titlepage"><div><div><h2 class="title">
-<a name="idp3821056"></a>gstreamer Plugins</h2></div></div></div>
+<a name="idp273520"></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> GStreamer core elements</span>
</dt></dl></div>
diff --git a/docs/plugins/html/gstreamer-plugins-capsfilter.html b/docs/plugins/html/gstreamer-plugins-capsfilter.html
index 0f0b28d..b860166 100644
--- a/docs/plugins/html/gstreamer-plugins-capsfilter.html
+++ b/docs/plugins/html/gstreamer-plugins-capsfilter.html
@@ -70,7 +70,7 @@ data format.
<p>
</p>
<div class="refsect2">
-<a name="idp7718544"></a><h3>Example launch line</h3>
+<a name="idp6769312"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -88,7 +88,7 @@ data format.
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp8004944"></a><h3>Element Information</h3>
+<a name="idp8040384"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
@@ -111,7 +111,7 @@ data format.
</div>
<hr>
<div class="refsect2">
-<a name="idp134944"></a><h3>Element Pads</h3>
+<a name="idm8384"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
diff --git a/docs/plugins/html/gstreamer-plugins-fakesink.html b/docs/plugins/html/gstreamer-plugins-fakesink.html
index 8a6445e..e9747b9 100644
--- a/docs/plugins/html/gstreamer-plugins-fakesink.html
+++ b/docs/plugins/html/gstreamer-plugins-fakesink.html
@@ -86,7 +86,7 @@ Dummy sink that swallows everything.
<p>
</p>
<div class="refsect2">
-<a name="idp9553712"></a><h3>Example launch line</h3>
+<a name="idp5610160"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -104,7 +104,7 @@ Dummy sink that swallows everything.
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp9556320"></a><h3>Element Information</h3>
+<a name="idp10697840"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
@@ -127,7 +127,7 @@ Dummy sink that swallows everything.
</div>
<hr>
<div class="refsect2">
-<a name="idp7211360"></a><h3>Element Pads</h3>
+<a name="idp10705376"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
diff --git a/docs/plugins/html/gstreamer-plugins-fakesrc.html b/docs/plugins/html/gstreamer-plugins-fakesrc.html
index f3044a9..1e53cca 100644
--- a/docs/plugins/html/gstreamer-plugins-fakesrc.html
+++ b/docs/plugins/html/gstreamer-plugins-fakesrc.html
@@ -102,7 +102,7 @@ basic <span class="application">GStreamer</span> core functionality is:
<p>
</p>
<div class="refsect2">
-<a name="idp8516432"></a><h3>Example launch line</h3>
+<a name="idp8917984"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -124,7 +124,7 @@ Last reviewed on 2008-06-20 (0.10.21)
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp8519616"></a><h3>Element Information</h3>
+<a name="idp8921168"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
@@ -147,7 +147,7 @@ Last reviewed on 2008-06-20 (0.10.21)
</div>
<hr>
<div class="refsect2">
-<a name="idp8527024"></a><h3>Element Pads</h3>
+<a name="idp8928576"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
diff --git a/docs/plugins/html/gstreamer-plugins-fdsink.html b/docs/plugins/html/gstreamer-plugins-fdsink.html
index 21c8077..81aa805 100644
--- a/docs/plugins/html/gstreamer-plugins-fdsink.html
+++ b/docs/plugins/html/gstreamer-plugins-fdsink.html
@@ -85,7 +85,7 @@ Last reviewed on 2006-04-28 (0.10.6)
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp7622240"></a><h3>Element Information</h3>
+<a name="idp6257216"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
@@ -108,7 +108,7 @@ Last reviewed on 2006-04-28 (0.10.6)
</div>
<hr>
<div class="refsect2">
-<a name="idp7657744"></a><h3>Element Pads</h3>
+<a name="idp5945264"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
diff --git a/docs/plugins/html/gstreamer-plugins-fdsrc.html b/docs/plugins/html/gstreamer-plugins-fdsrc.html
index 04a1570..b40e4c4 100644
--- a/docs/plugins/html/gstreamer-plugins-fdsrc.html
+++ b/docs/plugins/html/gstreamer-plugins-fdsrc.html
@@ -97,7 +97,7 @@ The message's structure contains one field:
<p>
</p>
<div class="refsect2">
-<a name="idp9288096"></a><h3>Example launch line</h3>
+<a name="idp5656528"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -119,7 +119,7 @@ Last reviewed on 2008-06-20 (0.10.21)
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp9291200"></a><h3>Element Information</h3>
+<a name="idp5659632"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
@@ -142,7 +142,7 @@ Last reviewed on 2008-06-20 (0.10.21)
</div>
<hr>
<div class="refsect2">
-<a name="idp9591808"></a><h3>Element Pads</h3>
+<a name="idp8604976"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
diff --git a/docs/plugins/html/gstreamer-plugins-filesink.html b/docs/plugins/html/gstreamer-plugins-filesink.html
index db6e97f..f6fb907 100644
--- a/docs/plugins/html/gstreamer-plugins-filesink.html
+++ b/docs/plugins/html/gstreamer-plugins-filesink.html
@@ -80,7 +80,7 @@ Write incoming data to a file in the local file system.
<p>
</p>
<div class="refsect2">
-<a name="idp6010672"></a><h3>Example launch line</h3>
+<a name="idp5970928"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -98,7 +98,7 @@ Write incoming data to a file in the local file system.
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp6013232"></a><h3>Element Information</h3>
+<a name="idp5973488"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
@@ -121,7 +121,7 @@ Write incoming data to a file in the local file system.
</div>
<hr>
<div class="refsect2">
-<a name="idp6020640"></a><h3>Element Pads</h3>
+<a name="idp5980896"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
diff --git a/docs/plugins/html/gstreamer-plugins-filesrc.html b/docs/plugins/html/gstreamer-plugins-filesrc.html
index 69cb79f..a9c98eb 100644
--- a/docs/plugins/html/gstreamer-plugins-filesrc.html
+++ b/docs/plugins/html/gstreamer-plugins-filesrc.html
@@ -82,7 +82,7 @@ Read data from a file in the local file system.
<p>
</p>
<div class="refsect2">
-<a name="idp7329248"></a><h3>Example launch line</h3>
+<a name="idp8226560"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -100,7 +100,7 @@ Read data from a file in the local file system.
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp7331856"></a><h3>Element Information</h3>
+<a name="idp8229168"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
@@ -123,7 +123,7 @@ Read data from a file in the local file system.
</div>
<hr>
<div class="refsect2">
-<a name="idp9626240"></a><h3>Element Pads</h3>
+<a name="idp8236624"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
diff --git a/docs/plugins/html/gstreamer-plugins-funnel.html b/docs/plugins/html/gstreamer-plugins-funnel.html
index 17468cc..bbcde44 100644
--- a/docs/plugins/html/gstreamer-plugins-funnel.html
+++ b/docs/plugins/html/gstreamer-plugins-funnel.html
@@ -68,7 +68,7 @@ immediately when they arrive.
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp7279280"></a><h3>Element Information</h3>
+<a name="idp7509888"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
@@ -91,7 +91,7 @@ immediately when they arrive.
</div>
<hr>
<div class="refsect2">
-<a name="idp5555680"></a><h3>Element Pads</h3>
+<a name="idp7802976"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
diff --git a/docs/plugins/html/gstreamer-plugins-identity.html b/docs/plugins/html/gstreamer-plugins-identity.html
index 7a4b50e..a431f82 100644
--- a/docs/plugins/html/gstreamer-plugins-identity.html
+++ b/docs/plugins/html/gstreamer-plugins-identity.html
@@ -90,7 +90,7 @@ useful diagnostic functions, such as offset and timestamp checking.
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp10160416"></a><h3>Element Information</h3>
+<a name="idp11020544"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
@@ -113,7 +113,7 @@ useful diagnostic functions, such as offset and timestamp checking.
</div>
<hr>
<div class="refsect2">
-<a name="idp10167872"></a><h3>Element Pads</h3>
+<a name="idp11028000"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
diff --git a/docs/plugins/html/gstreamer-plugins-input-selector.html b/docs/plugins/html/gstreamer-plugins-input-selector.html
index 503e522..fe14fca 100644
--- a/docs/plugins/html/gstreamer-plugins-input-selector.html
+++ b/docs/plugins/html/gstreamer-plugins-input-selector.html
@@ -105,7 +105,7 @@ properties, which users may find useful, namely:
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp8999888"></a><h3>Element Information</h3>
+<a name="idp11352080"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
@@ -128,7 +128,7 @@ properties, which users may find useful, namely:
</div>
<hr>
<div class="refsect2">
-<a name="idp9007424"></a><h3>Element Pads</h3>
+<a name="idp11359616"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
diff --git a/docs/plugins/html/gstreamer-plugins-multiqueue.html b/docs/plugins/html/gstreamer-plugins-multiqueue.html
index d100671..cc0f183 100644
--- a/docs/plugins/html/gstreamer-plugins-multiqueue.html
+++ b/docs/plugins/html/gstreamer-plugins-multiqueue.html
@@ -83,7 +83,7 @@
<p>
</p>
<div class="refsect2">
-<a name="idp9479760"></a><p>
+<a name="idp9147568"></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>
@@ -173,7 +173,7 @@ Last reviewed on 2008-01-25 (0.10.17)
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp10309440"></a><h3>Element Information</h3>
+<a name="idp11591264"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
@@ -196,7 +196,7 @@ Last reviewed on 2008-01-25 (0.10.17)
</div>
<hr>
<div class="refsect2">
-<a name="idp10316896"></a><h3>Element Pads</h3>
+<a name="idp11598720"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
diff --git a/docs/plugins/html/gstreamer-plugins-output-selector.html b/docs/plugins/html/gstreamer-plugins-output-selector.html
index 2349848..6850e8a 100644
--- a/docs/plugins/html/gstreamer-plugins-output-selector.html
+++ b/docs/plugins/html/gstreamer-plugins-output-selector.html
@@ -70,7 +70,7 @@ Direct input stream to one out of N output pads.
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp5357952"></a><h3>Element Information</h3>
+<a name="idp10673888"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
@@ -93,7 +93,7 @@ Direct input stream to one out of N output pads.
</div>
<hr>
<div class="refsect2">
-<a name="idp10642464"></a><h3>Element Pads</h3>
+<a name="idp5443200"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
diff --git a/docs/plugins/html/gstreamer-plugins-plugin-coreelements.html b/docs/plugins/html/gstreamer-plugins-plugin-coreelements.html
index a606a24..1fd3126 100644
--- a/docs/plugins/html/gstreamer-plugins-plugin-coreelements.html
+++ b/docs/plugins/html/gstreamer-plugins-plugin-coreelements.html
@@ -28,7 +28,7 @@
<td valign="top" align="right"></td>
</tr></table></div>
<div class="refsect1">
-<a name="idp6936016"></a><h2>Plugin Information</h2>
+<a name="idp11737760"></a><h2>Plugin Information</h2>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
@@ -38,7 +38,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.0.1</td>
+<td>1.0.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
@@ -56,7 +56,7 @@
</table></div>
</div>
<div class="refsect1">
-<a name="idp10559648"></a><h2>Elements</h2>
+<a name="idp8002864"></a><h2>Elements</h2>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
diff --git a/docs/plugins/html/gstreamer-plugins-queue.html b/docs/plugins/html/gstreamer-plugins-queue.html
index c1c9f75..371aa6a 100644
--- a/docs/plugins/html/gstreamer-plugins-queue.html
+++ b/docs/plugins/html/gstreamer-plugins-queue.html
@@ -122,7 +122,7 @@ up. Both signals are emitted from the context of the streaming thread.
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp10717648"></a><h3>Element Information</h3>
+<a name="idp11887200"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
@@ -145,7 +145,7 @@ up. Both signals are emitted from the context of the streaming thread.
</div>
<hr>
<div class="refsect2">
-<a name="idp10725104"></a><h3>Element Pads</h3>
+<a name="idp11894656"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
diff --git a/docs/plugins/html/gstreamer-plugins-queue2.html b/docs/plugins/html/gstreamer-plugins-queue2.html
index 945aeb1..286ab05 100644
--- a/docs/plugins/html/gstreamer-plugins-queue2.html
+++ b/docs/plugins/html/gstreamer-plugins-queue2.html
@@ -110,7 +110,7 @@ Last reviewed on 2009-07-10 (0.10.24)
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp10988336"></a><h3>Element Information</h3>
+<a name="idp12065680"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
@@ -133,7 +133,7 @@ Last reviewed on 2009-07-10 (0.10.24)
</div>
<hr>
<div class="refsect2">
-<a name="idp10995744"></a><h3>Element Pads</h3>
+<a name="idp12073088"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
diff --git a/docs/plugins/html/gstreamer-plugins-tee.html b/docs/plugins/html/gstreamer-plugins-tee.html
index 10ea870..0698ad7 100644
--- a/docs/plugins/html/gstreamer-plugins-tee.html
+++ b/docs/plugins/html/gstreamer-plugins-tee.html
@@ -83,7 +83,7 @@ branch would stall the other branches.
<p>
</p>
<div class="refsect2">
-<a name="idp5968864"></a><h3>Example launch line</h3>
+<a name="idp11758608"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -102,7 +102,7 @@ element.
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp5971584"></a><h3>Element Information</h3>
+<a name="idp11761328"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
@@ -125,7 +125,7 @@ element.
</div>
<hr>
<div class="refsect2">
-<a name="idp11108624"></a><h3>Element Pads</h3>
+<a name="idp12171152"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
diff --git a/docs/plugins/html/gstreamer-plugins-typefind.html b/docs/plugins/html/gstreamer-plugins-typefind.html
index c3bce0f..84edaa7 100644
--- a/docs/plugins/html/gstreamer-plugins-typefind.html
+++ b/docs/plugins/html/gstreamer-plugins-typefind.html
@@ -90,7 +90,7 @@ Plugins can register custom typefinders by using <a href="http://gstreamer.freed
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp9392352"></a><h3>Element Information</h3>
+<a name="idp8383824"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
@@ -113,7 +113,7 @@ Plugins can register custom typefinders by using <a href="http://gstreamer.freed
</div>
<hr>
<div class="refsect2">
-<a name="idp9399760"></a><h3>Element Pads</h3>
+<a name="idp8391232"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
diff --git a/docs/plugins/html/gstreamer-plugins-valve.html b/docs/plugins/html/gstreamer-plugins-valve.html
index bb6f732..f7a6e8a 100644
--- a/docs/plugins/html/gstreamer-plugins-valve.html
+++ b/docs/plugins/html/gstreamer-plugins-valve.html
@@ -81,7 +81,7 @@ Documentation last reviewed on 2010-12-30 (0.10.31)
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp5663680"></a><h3>Element Information</h3>
+<a name="idp7026960"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
@@ -104,7 +104,7 @@ Documentation last reviewed on 2010-12-30 (0.10.31)
</div>
<hr>
<div class="refsect2">
-<a name="idp4984144"></a><h3>Element Pads</h3>
+<a name="idp6648192"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
diff --git a/docs/plugins/html/gstreamer-plugins.devhelp2 b/docs/plugins/html/gstreamer-plugins.devhelp2
index 1c45f5a..5ffdc59 100644
--- a/docs/plugins/html/gstreamer-plugins.devhelp2
+++ b/docs/plugins/html/gstreamer-plugins.devhelp2
@@ -26,14 +26,14 @@
</sub>
</chapters>
<functions>
- <keyword type="" name="Example launch line" link="gstreamer-plugins-capsfilter.html#idp7718544"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-capsfilter.html#idp8004944"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-capsfilter.html#idp134944"/>
+ <keyword type="" name="Example launch line" link="gstreamer-plugins-capsfilter.html#idp6769312"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-capsfilter.html#idp8040384"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-capsfilter.html#idm8384"/>
<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#idp8516432"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-fakesrc.html#idp8519616"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-fakesrc.html#idp8527024"/>
+ <keyword type="" name="Example launch line" link="gstreamer-plugins-fakesrc.html#idp8917984"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-fakesrc.html#idp8921168"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-fakesrc.html#idp8928576"/>
<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"/>
@@ -57,9 +57,9 @@
<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#idp9553712"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-fakesink.html#idp9556320"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-fakesink.html#idp7211360"/>
+ <keyword type="" name="Example launch line" link="gstreamer-plugins-fakesink.html#idp5610160"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-fakesink.html#idp10697840"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-fakesink.html#idp10705376"/>
<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"/>
@@ -72,19 +72,19 @@
<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#idp7622240"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-fdsink.html#idp7657744"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-fdsink.html#idp6257216"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-fdsink.html#idp5945264"/>
<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#idp9288096"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-fdsrc.html#idp9291200"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-fdsrc.html#idp9591808"/>
+ <keyword type="" name="Example launch line" link="gstreamer-plugins-fdsrc.html#idp5656528"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-fdsrc.html#idp5659632"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-fdsrc.html#idp8604976"/>
<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#idp7329248"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-filesrc.html#idp7331856"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-filesrc.html#idp9626240"/>
+ <keyword type="" name="Example launch line" link="gstreamer-plugins-filesrc.html#idp8226560"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-filesrc.html#idp8229168"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-filesrc.html#idp8236624"/>
<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"/>
@@ -92,19 +92,19 @@
<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#idp6010672"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-filesink.html#idp6013232"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-filesink.html#idp6020640"/>
+ <keyword type="" name="Example launch line" link="gstreamer-plugins-filesink.html#idp5970928"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-filesink.html#idp5973488"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-filesink.html#idp5980896"/>
<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#idp7279280"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-funnel.html#idp5555680"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-funnel.html#idp7509888"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-funnel.html#idp7802976"/>
<keyword type="struct" name="struct GstFunnel" link="gstreamer-plugins-funnel.html#GstFunnel-struct"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-identity.html#idp10160416"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-identity.html#idp10167872"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-identity.html#idp11020544"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-identity.html#idp11028000"/>
<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"/>
@@ -120,8 +120,8 @@
<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#idp8999888"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-input-selector.html#idp9007424"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-input-selector.html#idp11352080"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-input-selector.html#idp11359616"/>
<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"/>
@@ -131,9 +131,9 @@
<keyword type="property" name="The &quot;sync-mode&quot; property" link="gstreamer-plugins-input-selector.html#GstInputSelector--sync-mode"/>
<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#idp9479760"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-multiqueue.html#idp10309440"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-multiqueue.html#idp10316896"/>
+ <keyword type="" name="" link="gstreamer-plugins-multiqueue.html#idp9147568"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-multiqueue.html#idp11591264"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-multiqueue.html#idp11598720"/>
<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"/>
@@ -147,14 +147,14 @@
<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#idp5357952"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-output-selector.html#idp10642464"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-output-selector.html#idp10673888"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-output-selector.html#idp5443200"/>
<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#idp10717648"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-queue.html#idp10725104"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-queue.html#idp11887200"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-queue.html#idp11894656"/>
<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"/>
@@ -172,8 +172,8 @@
<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#idp10988336"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-queue2.html#idp10995744"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-queue2.html#idp12065680"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-queue2.html#idp12073088"/>
<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"/>
@@ -189,9 +189,9 @@
<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#idp5968864"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-tee.html#idp5971584"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-tee.html#idp11108624"/>
+ <keyword type="" name="Example launch line" link="gstreamer-plugins-tee.html#idp11758608"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-tee.html#idp11761328"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-tee.html#idp12171152"/>
<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"/>
@@ -201,16 +201,16 @@
<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#idp9392352"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-typefind.html#idp9399760"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-typefind.html#idp8383824"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-typefind.html#idp8391232"/>
<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#idp5663680"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-valve.html#idp4984144"/>
+ <keyword type="" name="Element Information" link="gstreamer-plugins-valve.html#idp7026960"/>
+ <keyword type="" name="Element Pads" link="gstreamer-plugins-valve.html#idp6648192"/>
<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"/>
diff --git a/docs/plugins/html/index.html b/docs/plugins/html/index.html
index ac26f6a..76907b7 100644
--- a/docs/plugins/html/index.html
+++ b/docs/plugins/html/index.html
@@ -15,7 +15,7 @@
<div>
<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">GStreamer Core Plugins 1.0 Plugins Reference Manual</p></th></tr></table></div>
<div><p class="releaseinfo">
- for GStreamer Core Plugins 1.0 (1.0.1)
+ for GStreamer Core Plugins 1.0 (1.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-plugins/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/</a>.
</p></div>
diff --git a/docs/plugins/inspect/plugin-coreelements.xml b/docs/plugins/inspect/plugin-coreelements.xml
index 1617bac..ed31aa3 100644
--- a/docs/plugins/inspect/plugin-coreelements.xml
+++ b/docs/plugins/inspect/plugin-coreelements.xml
@@ -3,7 +3,7 @@
<description> GStreamer core elements</description>
<filename>../../plugins/elements/.libs/libgstcoreelements.so</filename>
<basename>libgstcoreelements.so</basename>
- <version>1.0.1</version>
+ <version>1.0.2</version>
<license>LGPL</license>
<source>gstreamer</source>
<package>GStreamer source release</package>
diff --git a/docs/pwg/Makefile.in b/docs/pwg/Makefile.in
index 6919b13..473b2cb 100644
--- a/docs/pwg/Makefile.in
+++ b/docs/pwg/Makefile.in
@@ -105,7 +105,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -353,6 +353,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -389,6 +392,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/docs/pwg/advanced-clock.xml b/docs/pwg/advanced-clock.xml
index beb6bd7..89c1f29 100644
--- a/docs/pwg/advanced-clock.xml
+++ b/docs/pwg/advanced-clock.xml
@@ -73,7 +73,10 @@
<para>
Synchronization is now a matter of making sure that a buffer with a
certain running-time is played when the clock reaches the same
- running-time. Usually this task is done by sink elements.
+ running-time. Usually this task is done by sink elements. Sink also
+ have to take into account the latency configured in the pipeline and
+ add this to the buffer running-time before synchronizing to the
+ pipeline clock.
</para>
</sect1>
@@ -120,11 +123,11 @@
</sect2>
<sect2>
- <title>Parser elements </title>
+ <title>Parser/Decoder/Encoder elements </title>
<para>
- Parser elements must use the incomming timestamps and transfer those
- to the resulting output buffers. They are allowed to interpolate or
- reconstruct timestamps on missing input buffers when they can.
+ Parser/Decoder elements must use the incomming timestamps and transfer
+ those to the resulting output buffers. They are allowed to interpolate
+ or reconstruct timestamps on missing input buffers when they can.
</para>
</sect2>
@@ -139,8 +142,18 @@
buffer timestamps.
</para>
</sect2>
+
+ <sect2>
+ <title>Muxer elements</title>
+ <para>
+ Muxer elements should use the incomming buffer running-time to mux the
+ different streams together. They should copy the incomming running-time
+ to the outgoing buffers.
+ </para>
+ </sect2>
- <sect2> <title> Sink elements </title>
+ <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
@@ -148,8 +161,9 @@
</para>
<para>
The sink should then make sure that the sample with running-time is played
- exactly when the pipeline clock reaches that running-time. Some elements
- might use the clock API such as <function>gst_clock_id_wait()</function>
+ exactly when the pipeline clock reaches that running-time + latency.
+ Some elements might use the clock API such as
+ <function>gst_clock_id_wait()</function>
to perform this action. Other sinks might need to use other means of
scheduling timely playback of the data.
</para>
diff --git a/docs/pwg/advanced-events.xml b/docs/pwg/advanced-events.xml
index 5d10d55..997d5b3 100644
--- a/docs/pwg/advanced-events.xml
+++ b/docs/pwg/advanced-events.xml
@@ -200,7 +200,9 @@ gst_my_filter_sink_event (GstPad *pad, GstObject * parent, GstEvent * event)
<sect2 id="section-events-caps" xreflabel="Caps">
<title>Caps</title>
<para>
- WRITEME
+ The CAPS event contains the format description of the following
+ buffers. See <xref linkend="chapter-negotiation"/> for more
+ information about negotiation.
</para>
</sect2>
@@ -378,7 +380,9 @@ gst_my_filter_sink_event (GstPad *pad, GstObject * parent, GstEvent * event)
<sect2 id="section-events-qos" xreflabel="Quality Of Service (QOS)">
<title>Quality Of Service (QOS)</title>
<para>
- WRITEME
+ The QOS event contains a report about the current real-time
+ performance of the stream. See more info in
+ <xref linkend="chapter-advanced-qos"/>.
</para>
</sect2>
diff --git a/docs/pwg/advanced-negotiation.xml b/docs/pwg/advanced-negotiation.xml
index 6264ec2..bc0ecbb 100644
--- a/docs/pwg/advanced-negotiation.xml
+++ b/docs/pwg/advanced-negotiation.xml
@@ -1,185 +1,262 @@
<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>.
+ Caps negotiation is the act of finding a media format (GstCaps) between
+ elements that they can handle. This process in &GStreamer; can in most
+ cases find an optimal solution for the complete pipeline. In this section
+ we explain how this works.
</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>
+ <sect1 id="section-nego-basics">
+ <title>Caps negotiation basics</title>
<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.
+ In &GStreamer;, negotiation of the media format always follows the
+ following simple rules:
</para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ A downstream element suggest a format on its sinkpad and places the
+ suggestion in the result of the CAPS query performed on the sinkpad.
+ See also <xref linkend="section-nego-getcaps"/>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ An upstream element decides on a format. It sends the selected media
+ format downstream on its source pad with a CAPS event. Downstream
+ elements reconfigure themselves to handle the media type in the CAPS
+ event on the sinkpad.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ An upstream element can inform downstream that it would like to
+ suggest a new format by sending a RECONFIGURE event upstream. The
+ RECONFIGURE event simply instructs an upstream element to restart
+ the negotiation phase. Because the element that sent out the
+ RECONFIGURE event is now suggesting another format, the format
+ in the pipeline might change.
+ </para>
+ </listitem>
+ </itemizedlist>
<para>
- In order for caps negotiation on non-fixed links to work correctly,
- pads can optionally implement a query function that tells peer elements
- what formats it supports and/or prefers. When upstream renegotiation is
- triggered, this becomes important.
+ In addition to the CAPS and RECONFIGURE event and the CAPS query, there
+ is an ACCEPT_CAPS query to quickly check if a certain caps can
+ be accepted by an element.
</para>
<para>
- Downstream elements are notified of a newly set caps with a
- GST_EVENT_CAPS on the sinkpad. So when the vorbis decoder sets a caps on
- its source pad (to configure the output format), the converter will
- receive a caps event.
- When an element receives a buffer, it should check if it has received
- all needed format information in a CAPS event previously. If it hasn't,
- it should return an error from the chain function.
+ All negotiation follows these simple rules. Let's take a look at some
+ typical uses cases and how negotiation happens.
</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_static_template (..);
- gst_pad_use_fixed_caps (pad);
-[..]
- </programlisting>
+ <sect1 id="section-nego-usecases">
+ <title>Caps negotiation use cases</title>
<para>
- The fixed caps can then be set on the pad by calling
- <function>gst_pad_set_caps ()</function>.
+ In what follows we will look at some use cases for push-mode scheduling.
+ The pull-mode scheduling negotiation phase is discussed in
+ <xref linkend="section-nego-pullmode"/> and is actually similar as we
+ will see.
</para>
- <programlisting>
-[..]
- caps = gst_caps_new_simple ("audio/x-raw",
- "format", G_TYPE_STRING, GST_AUDIO_NE(F32),
- "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:
+ Since the sink pads only suggest formats and the source pads need to
+ decide, the most complicated work is done in the source pads.
+ We can identify 3 caps negotiation use cases for the source pads:
</para>
<itemizedlist>
<listitem>
<para>
- A typefinder, since the type found is part of the actual data stream
- and can thus not be re-negotiated.
+ Fixed negotiation. An element can output one format only.
+ See <xref linkend="section-nego-fixed"/>.
</para>
</listitem>
<listitem>
<para>
- Pretty much all demuxers, since the contained elementary data
- streams are defined in the file headers, and thus not
- renegotiable.
+ Transform negotiation. There is a (fixed) transform between the
+ input and output format of the element, usually based on some
+ element property. The caps that the element will produce depend
+ on the upstream caps and the caps that the element can accept
+ depend on the downstream caps.
+ See <xref linkend="section-nego-transform"/>.
</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.
+ Dynamic negotiation. An element can output many formats.
+ See <xref linkend="section-nego-dynamic"/>.
</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-fixed">
+ <title>Fixed negotiation</title>
+ <para>
+ In this case, the source pad can only produce a fixed format. Usually
+ this format is encoded inside the media. No downstream element can
+ ask for a different format, the only way that the source pad will
+ renegotiate is when the element decides to change the caps itself.
+ </para>
+ <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. The typefinder will look at the
+ stream of bytes, figure out the type, send a CAPS event with the
+ caps and then push buffers of the type.
+ </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>
+ <listitem>
+ <para>
+ Some sources that produce a fixed format.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ <function>gst_pad_use_fixed_caps()</function> is used on the source
+ pad with fixed caps. As long as the pad is not negotiated, the default
+ CAPS query will return the caps presented in the padtemplate. As soon
+ as the pad is negotiated, the CAPS query will return the negotiated
+ caps (and nothing else). These are the relevant code snippets for fixed
+ caps source pads.
+ </para>
+ <programlisting>
+<![CDATA[
+[..]
+ pad = gst_pad_new_from_static_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>
+<![CDATA[
+[..]
+ caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, GST_AUDIO_NE(F32),
+ "rate", G_TYPE_INT, <samplerate>,
+ "channels", G_TYPE_INT, <num-channels>, 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>
+ These types of elements also don't have a relation between the input
+ format and the output format, the input caps simply don't contain the
+ information needed to produce the output caps.
+ </para>
+ <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>
+ </sect2>
- <sect2 id="section-nego-downstream-embed"
- xreflabel="Negotiating caps embedded in input caps">
- <title>Negotiating caps embedded in input caps</title>
+ <sect2 id="section-nego-transform">
+ <title>Transform negotiation</title>
+ <para>
+ In this negotiation technique, there is a fixed transform between
+ the element input caps and the output caps. This transformation
+ could be parameterized by element properties but not by the
+ content of the stream (see <xref linkend="section-nego-fixed"/>
+ for that use-case).
+ </para>
<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. For those elements, all
- (downstream) caps negotiation can be done from the
- <function>_event ()</function> function when a GST_EVENT_CAPS is
- received on the sinkpad. This CAPS event is received whenever the
- format changes or when no format was negotiated yet. It will always
- be called before you receive the buffer in the format specified in
- the CAPS event.
+ The caps that the element can accept depend on the (fixed
+ transformation) downstream caps. The caps that the element can
+ produce depend on the (fixed transformation of) the upstream
+ caps.
</para>
<para>
- In the <function>_event ()</function>-function, the element can
- forward the CAPS event 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:
+ This type of element can usually set caps on its source pad from
+ the <function>_event()</function> function on the sink pad when
+ it received the CAPS event. This means that the caps transform
+ function transforms a fixed caps into another fixed caps.
+ Examples of elements include:
</para>
- <programlisting><!-- example-begin forwardcaps.c a --><!--
-#include "init.func"
-static GstCaps *
-gst_my_filter_getcaps (GstPad * pad)
+ <itemizedlist>
+ <listitem>
+ <para>
+ Videobox. It adds configurable border around a video frame
+ depending on object properties.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Identity elements. All elements that don't change the format
+ of the data, only the content. Video and audio effects are an
+ example. Other examples include elements that inspect the
+ stream.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Some decoders and encoders, where the output format is defined
+ by input format, like mulawdec and mulawenc. These decoders
+ usually have no headers that define the content of the stream.
+ They are usually more like conversion elements.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Below is an example of a negotiation steps of a typical transform
+ element. In the sink pad CAPS event handler, we compute the caps
+ for the source pad and set those.
+ </para>
+ <programlisting>
+<![CDATA[
+ [...]
+
+static gboolean
+gst_my_filter_setcaps (GstMyFilter *filter,
+ GstCaps *caps)
{
- return NULL;
+ GstStructure *structure;
+ int rate, channels;
+ gboolean ret;
+ GstCaps *outcaps;
+
+ structure = gst_caps_get_structure (caps, 0);
+ ret = gst_structure_get_int (structure, "rate", &rate);
+ ret = ret && gst_structure_get_int (structure, "channels", &channels);
+ if (!ret)
+ return FALSE;
+
+ outcaps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, GST_AUDIO_NE(S16),
+ "rate", G_TYPE_INT, samplerate,
+ "channels", G_TYPE_INT, channels, NULL);
+ ret = gst_pad_set_caps (filter->srcpad, outcaps);
+ gst_caps_unref (outcaps);
+
+ return ret;
}
---><!-- example-end forwardcaps.c a -->
-<!-- example-begin forwardcaps.c b -->
+
static gboolean
gst_my_filter_sink_event (GstPad *pad,
GstObject *parent,
@@ -192,19 +269,9 @@ gst_my_filter_sink_event (GstPad *pad,
case GST_EVENT_CAPS:
{
GstCaps *caps;
- GstStructure *s;
- gst_event_parse_caps (event, &amp;caps);
-
- /* forward-negotiate */
- ret = gst_pad_set_caps (filter-&gt;srcpad, caps);
- if (!ret)
- 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);
+ gst_event_parse_caps (event, &caps);
+ ret = gst_my_filter_setcaps (filter, caps);
break;
}
default:
@@ -213,77 +280,122 @@ gst_my_filter_sink_event (GstPad *pad,
}
return ret;
}
-<!-- 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>
+
+ [...]
+]]>
+ </programlisting>
+ </sect2>
+
+ <sect2 id="section-nego-dynamic">
+ <title>Dynamic negotiation</title>
+ <para>
+ A last negotiation method is the most complex and powerful dynamic
+ negotiation.
+ </para>
+ <para>
+ Like with the transform negotiation in
+ <xref linkend="section-nego-transform"/>, dynamic negotiation will
+ perform a transformation on the downstream/upstream caps. Unlike the
+ transform negotiation, this transform will convert fixed caps to
+ unfixed caps. This means that the sink pad input caps can be converted
+ into unfixed (multiple) formats. The source pad will have to choose a
+ format from all the possibilities. It would usually like to choose a
+ format that requires the least amount of effort to produce but it does
+ not have to be. The selection of the format should also depend on the
+ caps that can be accepted downstream (see a QUERY_CAPS function in
+ <xref linkend="section-nego-getcaps"/>).
+ </para>
+ <para>
+ A typical flow goes like this:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Caps are received on the sink pad of the element.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ If the element prefers to operate in passthrough mode, check
+ if downstream accepts the caps with the ACCEPT_CAPS query. If it
+ does, we can complete negotiation and we can operate in
+ passthrough mode.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Calculate the possible caps for the source pad.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Query the downstream peer pad for the list of possible
+ caps.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Select from the downstream list the first caps that you can
+ transform to and set this as the output caps. You might have to
+ fixate the caps to some reasonable defaults to construct
+ fixed caps.
+ </para>
+ </listitem>
+ </itemizedlist>
<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 or NULL when there is no peer.
+ Examples of this type of elements include:
</para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Converter elements such as videoconvert, audioconvert, audioresample,
+ videoscale, ...
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Source elements such as audiotestsrc, videotestsrc, v4l2src,
+ pulsesrc, ...
+ </para>
+ </listitem>
+ </itemizedlist>
<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 -->
+ <programlisting>
+<![CDATA[
static gboolean
gst_my_filter_setcaps (GstMyFilter *filter,
GstCaps *caps)
{
- if (gst_pad_set_caps (filter-&gt;sinkpad, caps)) {
- filter-&gt;passthrough = TRUE;
+ if (gst_pad_set_caps (filter->sinkpad, caps)) {
+ filter->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);
+ gst_structure_get_int (s, "channels", &filter->channels);
+ othercaps = gst_pad_get_allowed_caps (filter->srcpad);
others = gst_caps_get_structure (othercaps, 0);
gst_structure_set (others,
- "channels", G_TYPE_INT, filter-&gt;channels, NULL);
+ "channels", G_TYPE_INT, filter->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))
+ gst_pad_fixate_caps (filter->srcpad, newcaps);
+ if (!gst_pad_set_caps (filter->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);
+ filter->passthrough = FALSE;
+ gst_structure_get_int (s, "rate", &filter->from_samplerate);
others = gst_caps_get_structure (newcaps, 0);
- gst_structure_get_int (others, "rate", &amp;filter-&gt;to_samplerate);
+ gst_structure_get_int (others, "rate", &filter->to_samplerate);
}
return TRUE;
@@ -302,7 +414,7 @@ gst_my_filter_sink_event (GstPad *pad,
{
GstCaps *caps;
- gst_event_parse_caps (event, &amp;caps);
+ gst_event_parse_caps (event, &caps);
ret = gst_my_filter_setcaps (filter, caps);
break;
}
@@ -322,44 +434,17 @@ gst_my_filter_chain (GstPad *pad,
GstBuffer *out;
/* push on if in passthrough mode */
- if (filter-&gt;passthrough)
- return gst_pad_push (filter-&gt;srcpad, buf);
+ if (filter->passthrough)
+ return gst_pad_push (filter->srcpad, buf);
/* convert, push */
out = gst_my_filter_convert (filter, buf);
gst_buffer_unref (buf);
- return gst_pad_push (filter-&gt;srcpad, out);
+ return gst_pad_push (filter->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>_event
- ()</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>
+]]>
+ </programlisting>
</sect2>
</sect1>
@@ -389,19 +474,40 @@ gst_my_filter_chain (GstPad *pad,
<itemizedlist>
<listitem>
<para>
- Elements that can be reconfigured on the srcpad should check its
- NEED_RECONFIGURE flag with
- <function>gst_pad_check_reconfigure ()</function> and it should
- start renegotiation when the function returns TRUE.
+ Elements that want to propose a new format upstream need to first
+ check if the new caps are acceptable upstream with an ACCEPT_CAPS
+ query. Then they would send a RECONFIGURE event and be prepared to
+ answer the CAPS query with the new prefered format. It should be
+ noted that when there is no upstream element that can (or wants)
+ to renegotiate, the element needs to deal with the currently
+ configured format.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Elements that operate in transform negotiation according to
+ <xref linkend="section-nego-transform"/> pass the RECONFIGURE
+ event upstream. Because these elements simply do a fixed transform
+ based on the upstream caps, they need to send the event upstream
+ so that it can select a new format.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Elements that operate in fixed negotiation
+ (<xref linkend="section-nego-fixed"/>) drop the RECONFIGURE event.
+ These elements can't reconfigure and their output caps don't depend
+ on the upstream caps so the event can be dropped.
</para>
</listitem>
<listitem>
<para>
- Elements that want to propose a new format upstream need to send
- a RECONFIGURE event and be prepared to answer the CAPS query with
- the new prefered format. It should be noted that when there is no
- upstream element that can (or wants) to renegotiate, the element
- needs to deal with the currently configured format.
+ Elements that can be reconfigured on the source pad (source pads
+ implementing dynamic negotiation in
+ <xref linkend="section-nego-dynamic"/>) should check its
+ NEED_RECONFIGURE flag with
+ <function>gst_pad_check_reconfigure ()</function> and it should
+ start renegotiation when the function returns TRUE.
</para>
</listitem>
</itemizedlist>
@@ -419,10 +525,8 @@ gst_my_filter_chain (GstPad *pad,
</para>
<para>
</para>
- <programlisting><!-- example-begin getcaps.c a --><!--
-#include "init.func"
---><!-- example-end getcaps.c a -->
-<!-- example-begin getcaps.c b -->
+ <programlisting>
+<![CDATA[
static gboolean
gst_my_filter_query (GstPad *pad, GstObject * parent, GstQuery * query)
{
@@ -436,15 +540,15 @@ gst_my_filter_query (GstPad *pad, GstObject * parent, GstQuery * query)
GstCaps *temp, *caps, *filter, *tcaps;
gint i;
- otherpad = (pad == filter-&gt;srcpad) ? filter-&gt;sinkpad :
- filter-&gt;srcpad;
+ otherpad = (pad == filter->srcpad) ? filter->sinkpad :
+ filter->srcpad;
caps = gst_pad_get_allowed_caps (otherpad);
- gst_query_parse_caps (query, &amp;filter);
+ gst_query_parse_caps (query, &filter);
/* 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 (caps); i++) {
+ for (i = 0; i < gst_caps_get_size (caps); i++) {
GstStructure *structure = gst_caps_get_structure (caps, i);
gst_structure_remove_field (structure, "rate");
@@ -476,17 +580,17 @@ gst_my_filter_query (GstPad *pad, GstObject * parent, GstQuery * query)
}
return ret;
}
-<!-- 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>
+]]>
+ </programlisting>
+ </sect1>
+
+ <sect1 id="section-nego-pullmode">
+ <title>Pull-mode Caps negotiation</title>
+ <para>
+ WRITEME, the mechanism of pull-mode negotiation is not yet fully
+ understood.
+ </para>
+
<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.
diff --git a/docs/pwg/advanced-qos.xml b/docs/pwg/advanced-qos.xml
new file mode 100644
index 0000000..a6561bc
--- /dev/null
+++ b/docs/pwg/advanced-qos.xml
@@ -0,0 +1,283 @@
+<chapter id="chapter-advanced-qos">
+ <title>Quality Of Service (QoS)</title>
+
+ <para>
+ Quality of Service in &GStreamer; is about measuring and ajusting
+ 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.
+ </para>
+ <para>
+ When buffers arrive late in the sink, i.e. when their running-time is
+ smaller than that of the clock, we say that the pipeline is having a
+ quality of service problem. These are a few possible reasons:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ High CPU load, there is not enough CPU power to handle the stream,
+ causing buffers to arrive late in the sink.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Network problems
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Other resource problems such as disk load, memory bottlenecks etc
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ 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:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Short time "emergency" corrections based on latest observation in
+ the sinks.
+ </para>
+ <para>
+ Long term rate corrections based on trends observed in the sinks.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ It is also possible for the application to artificially introduce delay
+ between synchronized buffers, this is called throttling. It can be used
+ to limit or reduce the framerate, for example.
+ </para>
+
+ <sect1 id="section-measuring">
+ <title>Measuring QoS</title>
+ <para>
+ Elements that synchronize buffers on the pipeline clock will usually
+ measure the current QoS. They will also need to keep some statistics
+ in order to generate the QOS event.
+ </para>
+ <para>
+ For each buffer that arrives in the sink, the element needs to calculate
+ how late or how early it was. This is called the jitter. Negative jitter
+ values mean that the buffer was early, positive values mean that the
+ buffer was late. the jitter value gives an indication of how early/late
+ a buffer was.
+ </para>
+ <para>
+ A synchronizing element will also need to calculate how much time
+ elapsed between receiving two consecutive buffers. We call this the
+ processing time because that is the amount of time it takes for the
+ upstream element to produce/process the buffer. We can compare this
+ processing time to the duration of the buffer to have a measurement
+ of how fast upstream can produce data, called the proportion.
+ If, for example, upstream can produce a buffer in 0.5 seconds of 1
+ second long, it is operating at twice the required speed. If, on the
+ other hand, it takes 2 seconds to produce a buffer with 1 seconds worth
+ of data, upstream is producing buffers too slow and we won't be able to
+ keep sycnhronization. Usually, a running average is kept of the
+ proportion.
+ </para>
+ <para>
+ A synchronizing element also needs to measure its own performance in
+ order to figure out if the performace problem is upstream of itself.
+ </para>
+ <para>
+ These measurements are used to construct a QOS event that is sent
+ upstream. Note that a QoS event is sent for each buffer that arrives
+ in the sink.
+ </para>
+ </sect1>
+
+ <sect1 id="section-handling">
+ <title>Handling QoS</title>
+ <para>
+ An element will have to install an event function on its source pads
+ in order to receive QOS events. Usually, the element will need to
+ store the value of the QOS event and use them in the data processing
+ function. The element will need to use a lock to protect these QoS
+ values as shown in the example below. Also make sure to pass the
+ QoS event upstream.
+ </para>
+ <programlisting>
+<![CDATA[
+ [...]
+
+ case GST_EVENT_QOS:
+ {
+ GstQOSType type;
+ gdouble proportion;
+ GstClockTimeDiff diff;
+ GstClockTime timestamp;
+
+ gst_event_parse_qos (event, &type, &proportion, &diff, &timestamp);
+
+ GST_OBJECT_LOCK (decoder);
+ priv->qos_proportion = proportion;
+ priv->qos_timestamp = timestamp;
+ priv->qos_diff = diff;
+ GST_OBJECT_UNLOCK (decoder);
+
+ res = gst_pad_push_event (decoder->sinkpad, event);
+ break;
+ }
+
+ [...]
+]]>
+ </programlisting>
+ <para>
+ With the QoS values, there are two types of corrections that an element
+ can do:
+ </para>
+
+ <sect2 id="section-handling-short">
+ <title>Short term correction</title>
+ <para>
+ The timestamp and the jitter value in the QOS event can be used to
+ perform a short term correction. If the jitter is positive, the
+ previous buffer arrived late and we can be sure that a buffer with
+ a timestamp &lt; timestamp + jitter is also going to be late. We
+ can thus drop all buffers with a timestamp less than timestamp +
+ jitter.
+ </para>
+ <para>
+ If the buffer duration is known, a better estimation for the next
+ likely timestamp as: timestamp + 2 * jitter + duration.
+ </para>
+ <para>
+ A possible algorithm typically looks like this:
+ </para>
+ <programlisting>
+<![CDATA[
+ [...]
+
+ GST_OBJECT_LOCK (dec);
+ qos_proportion = priv->qos_proportion;
+ qos_timestamp = priv->qos_timestamp;
+ qos_diff = priv->qos_diff;
+ GST_OBJECT_UNLOCK (dec);
+
+ /* calculate the earliest valid timestamp */
+ if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (qos_timestamp))) {
+ if (G_UNLIKELY (qos_diff > 0)) {
+ earliest_time = qos_timestamp + 2 * qos_diff + frame_duration;
+ } else {
+ earliest_time = qos_timestamp + qos_diff;
+ }
+ } else {
+ earliest_time = GST_CLOCK_TIME_NONE;
+ }
+
+ /* compare earliest_time to running-time of next buffer */
+ if (earliest_time > timestamp)
+ goto drop_buffer;
+
+ [...]
+]]>
+ </programlisting>
+ </sect2>
+
+ <sect2 id="section-handling-long">
+ <title>Long term correction</title>
+ <para>
+ Long term corrections are a bit more difficult to perform. They
+ rely on the value of the propertion in the QOS event. Elements should
+ reduce the amount of resources they comsume by the proportion
+ field in the QoS message.
+ </para>
+ <para>
+ Here are some possible strategies to achieve this:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Permanently dropping frames or reducing the CPU or bandwidth
+ requirements of the element. Some decoders might be able to
+ skip decoding of B frames.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Switch to lower quality processing or reduce the algorithmic
+ complexity. Care should be taken that this doesn't introduce
+ disturbing visual or audible glitches.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Switch to a lower quality source to reduce network bandwidth.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Assign more CPU cycles to critical parts of the pipeline. This
+ could, for example, be done by increasing the thread priority.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ In all cases, elements should be prepared to go back to their normal
+ processing rate when the proportion member in the QOS event approaches
+ the ideal proportion of 1.0 again.
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="section-throttle">
+ <title>Throttling</title>
+ <para>
+ Elements synchronizing to the clock should expose a property to configure
+ them in throttle mode. 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.
+ </para>
+ <para>
+ 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.
+ </para>
+ <para>
+ 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.
+ </para>
+ <para>
+ The default sink base class, has the <quote>throttle-time</quote>
+ property for this feature. You can test this with:
+ <command>gst-launch-1.0 videotestsrc !
+ xvimagesink throttle-time=500000000</command>
+ </para>
+ </sect1>
+
+ <sect1 id="section-messages">
+ <title>QoS Messages</title>
+ <para>
+ In addition to the QOS events that are sent between elements in the
+ pipeline, there are also QOS messages posted on the pipeline bus to
+ inform the application of QoS decisions. The QOS message contains
+ the timestamps of when something was dropped along with the amount
+ of dropped vs processed items. Elements must post a QOS
+ message under these conditions:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ The element dropped a buffer because of QoS reasons.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ An element changes its processing strategy because of QoS reasons
+ (quality). This could include a decoder that decides to drop every
+ B frame to increase its processing speed or an effect element
+ switching to a lower quality algorithm.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+</chapter>
diff --git a/docs/pwg/building-boiler.xml b/docs/pwg/building-boiler.xml
index 7cba279..77d78ce 100644
--- a/docs/pwg/building-boiler.xml
+++ b/docs/pwg/building-boiler.xml
@@ -378,6 +378,7 @@ gst_my_filter_init (GstMyFilter * filter)
correct template would look like this:
</para>
<programlisting>
+<![CDATA[
static GstStaticPadTemplate sink_factory =
GST_STATIC_PAD_TEMPLATE (
"sink",
@@ -390,6 +391,7 @@ GST_STATIC_PAD_TEMPLATE (
"rate = (int) [ 8000, 96000 ]"
)
);
+]]>
</programlisting>
<para>
Values surrounded by curly brackets (<quote>{</quote> and
@@ -428,7 +430,9 @@ GST_STATIC_PAD_TEMPLATE (
Also, in this function, any supported element type in the plugin should
be registered.
</para>
- <programlisting><!-- example-begin register.func -->
+ <programlisting>
+<!-- example-begin register.func -->
+<![CDATA[
static gboolean
plugin_init (GstPlugin *plugin)
{
@@ -448,7 +452,9 @@ GST_PLUGIN_DEFINE (
"GStreamer",
"http://gstreamer.net/"
)
- <!-- example-end register.func --></programlisting>
+]]>
+<!-- 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
diff --git a/docs/pwg/building-eventfn.xml b/docs/pwg/building-eventfn.xml
index 51836ef..b72e376 100644
--- a/docs/pwg/building-eventfn.xml
+++ b/docs/pwg/building-eventfn.xml
@@ -13,18 +13,11 @@
Below follows a very simple event function that we install on the sink
pad of our element.
</para>
- <programlisting><!-- example-begin event.c a --><!--
-#include "init.func"
-#include "caps.func"
-static gboolean
-gst_my_filter_event (GstPad * pad, GstObject * parent, GstEvent * event)
-{
- return gst_pad_event_default (pad, parent, event);
-}
---><!-- example-end event.c a -->
+ <programlisting>
+<![CDATA[
static gboolean gst_my_filter_sink_event (GstPad *pad,
GstObject *parent,
- GstBuffer *buf);
+ GstEvent *event);
[..]
@@ -34,7 +27,7 @@ gst_my_filter_init (GstMyFilter * filter)
[..]
/* configure event function on the pad before adding
* the pad to the element */
- gst_pad_set_event_function (filter-&gt;sinkpad,
+ gst_pad_set_event_function (filter->sinkpad,
gst_my_filter_sink_event);
[..]
}
@@ -67,6 +60,7 @@ gst_my_filter_sink_event (GstPad *pad,
}
return ret;
}
+]]>
</programlisting>
<para>
It is a good idea to call the default event handler
diff --git a/docs/pwg/building-queryfn.xml b/docs/pwg/building-queryfn.xml
new file mode 100644
index 0000000..ad2e943
--- /dev/null
+++ b/docs/pwg/building-queryfn.xml
@@ -0,0 +1,72 @@
+
+<!-- ############ chapter ############# -->
+
+<chapter id="chapter-building-queryfn">
+ <title>The query function</title>
+ <para>
+ Through the query function, your element will receive queries that it
+ has to reply to. These are queries like position, duration but also
+ about the supported formats and scheduling modes your element supports.
+ Queries can travel both upstream and downstream, so you can receive them
+ on sink pads as well as source pads.
+ </para>
+ <para>
+ Below follows a very simple query function that we install on the source
+ pad of our element.
+ </para>
+ <programlisting>
+<![CDATA[
+static gboolean gst_my_filter_src_query (GstPad *pad,
+ GstObject *parent,
+ GstQuery *query);
+
+[..]
+
+static void
+gst_my_filter_init (GstMyFilter * filter)
+{
+[..]
+ /* configure event function on the pad before adding
+ * the pad to the element */
+ gst_pad_set_event_function (filter->srcpad,
+ gst_my_filter_src_event);
+[..]
+}
+
+static gboolean
+gst_my_filter_src_query (GstPad *pad,
+ GstObject *parent,
+ GstQuery *query)
+{
+ gboolean ret;
+ GstMyFilter *filter = GST_MY_FILTER (parent);
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_POSITION:
+ /* we should report the current position */
+ [...]
+ break;
+ case GST_QUERY_DURATION:
+ /* we should report the duration here */
+ [...]
+ break;
+ case GST_QUERY_CAPS:
+ /* we should report the supported caps here */
+ [...]
+ break;
+ default:
+ /* just call the default handler */
+ ret = gst_pad_query_default (pad, parent, query);
+ break;
+ }
+ return ret;
+}
+]]>
+ </programlisting>
+ <para>
+ It is a good idea to call the default query handler
+ <function>gst_pad_query_default ()</function> for unknown queries.
+ Depending on the query type, the default handler will forward
+ the query or simply unref it.
+ </para>
+</chapter>
diff --git a/docs/pwg/intro-basics.xml b/docs/pwg/intro-basics.xml
index 4a50e91..e864e5e 100644
--- a/docs/pwg/intro-basics.xml
+++ b/docs/pwg/intro-basics.xml
@@ -220,6 +220,7 @@
GstAllocator. Elements can ask a GstBufferPool or GstAllocator
from the downstream peer element. If downstream is able to provide
these objects, upstream can use them to allocate buffers.
+ See more in <xref linkend="chapter-allocation"/>.
</para>
<para>
Many sink elements have accelerated methods for copying data
@@ -254,7 +255,8 @@
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.
+ properties. See more about caps negotiation in
+ <xref linkend="chapter-negotiation"/>.
</para>
<!-- ############ sect2 ############# -->
diff --git a/docs/pwg/pwg.xml b/docs/pwg/pwg.xml
index 6d91f26..4f79709 100644
--- a/docs/pwg/pwg.xml
+++ b/docs/pwg/pwg.xml
@@ -18,22 +18,24 @@
<!ENTITY BUILDING_PADS SYSTEM "building-pads.xml">
<!ENTITY BUILDING_CHAINFN SYSTEM "building-chainfn.xml">
<!ENTITY BUILDING_EVENTFN SYSTEM "building-eventfn.xml">
+<!ENTITY BUILDING_QUERYFN SYSTEM "building-queryfn.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_REQUEST SYSTEM "advanced-request.xml">
+<!ENTITY ADVANCED_SCHEDULING SYSTEM "advanced-scheduling.xml">
<!ENTITY ADVANCED_NEGOTIATION SYSTEM "advanced-negotiation.xml">
<!ENTITY ADVANCED_ALLOCATION SYSTEM "advanced-allocation.xml">
-<!ENTITY ADVANCED_SCHEDULING SYSTEM "advanced-scheduling.xml">
<!ENTITY ADVANCED_TYPES SYSTEM "advanced-types.xml">
-<!ENTITY ADVANCED_REQUEST SYSTEM "advanced-request.xml">
+<!ENTITY ADVANCED_EVENTS SYSTEM "advanced-events.xml">
<!ENTITY ADVANCED_CLOCK SYSTEM "advanced-clock.xml">
+<!ENTITY ADVANCED_QOS SYSTEM "advanced-qos.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">
@@ -119,6 +121,7 @@
&BUILDING_PADS;
&BUILDING_CHAINFN;
&BUILDING_EVENTFN;
+ &BUILDING_QUERYFN;
&BUILDING_STATE;
&BUILDING_PROPS;
&BUILDING_SIGNALS;
@@ -140,16 +143,17 @@
</para>
</partintro>
+ &ADVANCED_REQUEST;
+ &ADVANCED_SCHEDULING;
&ADVANCED_NEGOTIATION;
&ADVANCED_ALLOCATION;
- &ADVANCED_SCHEDULING;
&ADVANCED_TYPES;
- &ADVANCED_REQUEST;
+ &ADVANCED_EVENTS;
&ADVANCED_CLOCK;
+ &ADVANCED_QOS;
&ADVANCED_DPARAMS;
&ADVANCED_INTERFACES;
&ADVANCED_TAGGING;
- &ADVANCED_EVENTS;
<!-- FIXME: add querying, event handling and conversion -->
diff --git a/docs/slides/Makefile.in b/docs/slides/Makefile.in
index c30c7ad..0579672 100644
--- a/docs/slides/Makefile.in
+++ b/docs/slides/Makefile.in
@@ -80,7 +80,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -299,6 +299,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -335,6 +338,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/docs/xsl/Makefile.in b/docs/xsl/Makefile.in
index 8f3a6ce..6a522b6 100644
--- a/docs/xsl/Makefile.in
+++ b/docs/xsl/Makefile.in
@@ -80,7 +80,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -299,6 +299,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -335,6 +338,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/gst/Makefile.in b/gst/Makefile.in
index bd3a622..0c96219 100644
--- a/gst/Makefile.in
+++ b/gst/Makefile.in
@@ -86,7 +86,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -496,6 +496,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -532,6 +535,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/gst/gst.c b/gst/gst.c
index 1be9773..c58e101 100644
--- a/gst/gst.c
+++ b/gst/gst.c
@@ -545,8 +545,9 @@ init_pre (GOptionContext * context, GOptionGroup * group, gpointer data,
GST_DEBUG ("already initialized");
return TRUE;
}
-
+#if !GLIB_CHECK_VERSION(2, 35, 0)
g_type_init ();
+#endif
#ifndef GST_DISABLE_GST_DEBUG
_priv_gst_debug_init ();
diff --git a/gst/gstallocator.c b/gst/gstallocator.c
index df5b04f..a80b9a1 100644
--- a/gst/gstallocator.c
+++ b/gst/gstallocator.c
@@ -106,6 +106,7 @@ _fallback_mem_copy (GstMemory * mem, gssize offset, gssize size)
copy = gst_allocator_alloc (mem->allocator, size, &params);
if (!gst_memory_map (copy, &dinfo, GST_MAP_WRITE)) {
GST_CAT_WARNING (GST_CAT_MEMORY, "could not write map memory %p", copy);
+ gst_allocator_free (mem->allocator, copy);
gst_memory_unmap (mem, &sinfo);
return NULL;
}
diff --git a/gst/gstbin.c b/gst/gstbin.c
index cc39027..550b7d6 100644
--- a/gst/gstbin.c
+++ b/gst/gstbin.c
@@ -441,7 +441,7 @@ gst_bin_class_init (GstBinClass * klass)
gobject_class->dispose = gst_bin_dispose;
- gst_element_class_set_metadata (gstelement_class, "Generic bin",
+ gst_element_class_set_static_metadata (gstelement_class, "Generic bin",
"Generic/Bin",
"Simple container object",
"Erik Walthinsen <omega@cse.ogi.edu>,"
diff --git a/gst/gstelement.c b/gst/gstelement.c
index c8205df..b4b87f4 100644
--- a/gst/gstelement.c
+++ b/gst/gstelement.c
@@ -130,6 +130,9 @@ static GstStateChangeReturn gst_element_set_state_func (GstElement * element,
static gboolean gst_element_set_clock_func (GstElement * element,
GstClock * clock);
static void gst_element_set_bus_func (GstElement * element, GstBus * bus);
+static gboolean gst_element_post_message_default (GstElement * element,
+ GstMessage * message);
+
static gboolean gst_element_default_send_event (GstElement * element,
GstEvent * event);
@@ -235,6 +238,7 @@ gst_element_class_init (GstElementClass * klass)
klass->query = GST_DEBUG_FUNCPTR (gst_element_default_query);
klass->send_event = GST_DEBUG_FUNCPTR (gst_element_default_send_event);
klass->numpadtemplates = 0;
+ klass->post_message = GST_DEBUG_FUNCPTR (gst_element_post_message_default);
klass->elementfactory = NULL;
}
@@ -1662,22 +1666,8 @@ gst_element_query (GstElement * element, GstQuery * 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)
+static gboolean
+gst_element_post_message_default (GstElement * element, GstMessage * message)
{
GstBus *bus;
gboolean result = FALSE;
@@ -1713,6 +1703,34 @@ no_bus:
}
/**
+ * 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)
+{
+ GstElementClass *klass;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
+
+ klass = GST_ELEMENT_GET_CLASS (element);
+ if (klass->post_message)
+ return klass->post_message (element, message);
+
+ return FALSE;
+}
+
+/**
* _gst_element_error_printf:
* @format: the printf-like format to use, or %NULL
*
diff --git a/gst/gstelement.h b/gst/gstelement.h
index 725dc34..df71720 100644
--- a/gst/gstelement.h
+++ b/gst/gstelement.h
@@ -591,6 +591,8 @@ struct _GstElement
* @send_event: send a #GstEvent to the element
* @query: perform a #GstQuery on the element
* @state_changed: called immediately after a new state was set.
+ * @post_message: called when a message is posted on the element. Chain up to
+ * the parent class' handler to have it posted on the bus.
*
* GStreamer element class. Override the vmethods to implement the element
* functionality.
@@ -645,8 +647,10 @@ struct _GstElementClass
gboolean (*query) (GstElement *element, GstQuery *query);
+ gboolean (*post_message) (GstElement *element, GstMessage *message);
+
/*< private >*/
- gpointer _gst_reserved[GST_PADDING_LARGE];
+ gpointer _gst_reserved[GST_PADDING_LARGE-1];
};
/* element class pad templates */
diff --git a/gst/gstevent.c b/gst/gstevent.c
index 188325d..87d4acb 100644
--- a/gst/gstevent.c
+++ b/gst/gstevent.c
@@ -568,7 +568,6 @@ gst_event_new_gap (GstClockTime timestamp, GstClockTime duration)
GstEvent *event;
g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID (timestamp), NULL);
- g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID (duration), NULL);
GST_CAT_TRACE (GST_CAT_EVENT, "creating gap %" GST_TIME_FORMAT " - "
"%" GST_TIME_FORMAT " (duration: %" GST_TIME_FORMAT ")",
diff --git a/gst/gstinfo.c b/gst/gstinfo.c
index eadb5e0..5929d10 100644
--- a/gst/gstinfo.c
+++ b/gst/gstinfo.c
@@ -129,6 +129,8 @@
#endif /* !GST_DISABLE_GST_DEBUG */
+extern gboolean gst_is_initialized (void);
+
/* 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)
@@ -1104,8 +1106,9 @@ gst_debug_add_log_function (GstLogFunction func, gpointer user_data,
__log_functions = g_slist_prepend (list, entry);
g_mutex_unlock (&__log_func_mutex);
- GST_DEBUG ("prepended log function %p (user data %p) to log functions",
- func, user_data);
+ if (gst_is_initialized ())
+ GST_DEBUG ("prepended log function %p (user data %p) to log functions",
+ func, user_data);
}
static gint
@@ -1180,8 +1183,9 @@ gst_debug_remove_log_function (GstLogFunction func)
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);
+ if (gst_is_initialized ())
+ GST_DEBUG ("removed log function %p %d times from log function list", func,
+ removals);
return removals;
}
@@ -1202,9 +1206,11 @@ gst_debug_remove_log_function_by_data (gpointer data)
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);
+
+ if (gst_is_initialized ())
+ GST_DEBUG
+ ("removed %d log functions with user data %p from log function list",
+ removals, data);
return removals;
}
@@ -1311,8 +1317,9 @@ gst_debug_reset_threshold (gpointer category, gpointer unused)
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);
+ if (gst_is_initialized ())
+ 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;
}
@@ -1338,8 +1345,9 @@ for_each_threshold_by_entry (gpointer data, gpointer user_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);
+ if (gst_is_initialized ())
+ 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);
}
}
diff --git a/gst/gstpad.c b/gst/gstpad.c
index 92891fa..e609fe2 100644
--- a/gst/gstpad.c
+++ b/gst/gstpad.c
@@ -3579,7 +3579,7 @@ sticky_failed:
}
no_peer:
{
- GST_WARNING_OBJECT (pad, "pad has no peer");
+ GST_INFO_OBJECT (pad, "pad has no peer");
GST_OBJECT_UNLOCK (pad);
return FALSE;
}
diff --git a/gst/gstpad.h b/gst/gstpad.h
index 676cd69..0378b5a 100644
--- a/gst/gstpad.h
+++ b/gst/gstpad.h
@@ -154,7 +154,6 @@ typedef enum {
* Note that the custom return values should not be exposed outside of the
* element scope.
*/
-/* FIXME 0.11: remove custom flow returns */
typedef enum {
/* custom success starts here */
GST_FLOW_CUSTOM_SUCCESS_2 = 102,
@@ -563,6 +562,8 @@ GstBufferList* gst_pad_probe_info_get_buffer_list (GstPadProbeInfo * info);
* blocking type.
*
* The callback is allowed to modify the data pointer in @info.
+ *
+ * Returns: a #GstPadProbeReturn
*/
typedef GstPadProbeReturn (*GstPadProbeCallback) (GstPad *pad, GstPadProbeInfo *info,
gpointer user_data);
diff --git a/gst/gstpipeline.c b/gst/gstpipeline.c
index c15f003..f92b5c3 100644
--- a/gst/gstpipeline.c
+++ b/gst/gstpipeline.c
@@ -182,7 +182,7 @@ gst_pipeline_class_init (GstPipelineClass * klass)
gobject_class->dispose = gst_pipeline_dispose;
- gst_element_class_set_metadata (gstelement_class, "Pipeline object",
+ gst_element_class_set_static_metadata (gstelement_class, "Pipeline object",
"Generic/Bin",
"Complete pipeline object",
"Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim@fluendo.com>");
diff --git a/gst/gstpoll.c b/gst/gstpoll.c
index 5a0a886..d790b31 100644
--- a/gst/gstpoll.c
+++ b/gst/gstpoll.c
@@ -271,7 +271,7 @@ find_index (GArray * array, GstPollFD * fd)
#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)
+selectable_fds (GstPoll * set)
{
guint i;
@@ -311,7 +311,7 @@ pollable_timeout (GstClockTime timeout)
#endif
static GstPollMode
-choose_mode (const GstPoll * set, GstClockTime timeout)
+choose_mode (GstPoll * set, GstClockTime timeout)
{
GstPollMode mode;
diff --git a/gst/gstpreset.c b/gst/gstpreset.c
index 4a97276..68a657c 100644
--- a/gst/gstpreset.c
+++ b/gst/gstpreset.c
@@ -390,7 +390,6 @@ preset_get_keyfile (GstPreset * preset)
if (presets)
g_key_file_free (presets);
presets = in_user;
- version = version_user;
}
}
diff --git a/gst/gstquery.c b/gst/gstquery.c
index 008cf55..25a4f38 100644
--- a/gst/gstquery.c
+++ b/gst/gstquery.c
@@ -1109,7 +1109,7 @@ gst_query_parse_buffering_percent (GstQuery * query, gboolean * busy,
* @mode: a buffering mode
* @avg_in: the average input rate
* @avg_out: the average output rate
- * @buffering_left: amount of buffering time left
+ * @buffering_left: amount of buffering time left in milliseconds
*
* Configures the buffering stats values in @query.
*/
@@ -1136,7 +1136,8 @@ gst_query_set_buffering_stats (GstQuery * query, GstBufferingMode mode,
* @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
+ * @buffering_left: (out) (allow-none): amount of buffering time left in
+ * milliseconds, or NULL
*
* Extracts the buffering stats values from @query.
*/
diff --git a/gst/gstsample.c b/gst/gstsample.c
index 93cb0b0..adfe6ba 100644
--- a/gst/gstsample.c
+++ b/gst/gstsample.c
@@ -84,7 +84,7 @@ _gst_sample_free (GstSample * sample)
* gst_sample_new:
* @buffer: (transfer none) (allow-none): a #GstBuffer, or NULL
* @caps: (transfer none) (allow-none): a #GstCaps, or NULL
- * @segment: transfer none) (allow-none): a #GstSegment, or NULL
+ * @segment: (transfer none) (allow-none): a #GstSegment, or NULL
* @info: (transfer full) (allow-none): a #GstStructure, or NULL
*
* Create a new #GstSample with the provided details.
diff --git a/gst/parse/Makefile.in b/gst/parse/Makefile.in
index b578d9e..78c7949 100644
--- a/gst/parse/Makefile.in
+++ b/gst/parse/Makefile.in
@@ -83,7 +83,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -339,6 +339,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -375,6 +378,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/gst/parse/grammar.tab.h b/gst/parse/grammar.tab.h
index 164198f..51454ce 100644
--- a/gst/parse/grammar.tab.h
+++ b/gst/parse/grammar.tab.h
@@ -1,8 +1,8 @@
-/* A Bison parser, made by GNU Bison 2.5. */
+/* A Bison parser, made by GNU Bison 2.6.2. */
/* Bison interface for Yacc-like parsers in C
- Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
+ Copyright (C) 1984, 1989-1990, 2000-2012 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
@@ -30,6 +30,15 @@
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
+#ifndef PRIV_GST_PARSE_YY_GRAMMAR_TAB_H
+# define PRIV_GST_PARSE_YY_GRAMMAR_TAB_H
+/* Enabling traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int priv_gst_parse_yydebug;
+#endif
/* Tokens. */
#ifndef YYTOKENTYPE
@@ -48,12 +57,10 @@
#endif
-
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
{
-
-/* Line 2068 of yacc.c */
+/* Line 2049 of yacc.c */
#line 632 "./grammar.y"
gchar *s;
@@ -64,9 +71,8 @@ typedef union YYSTYPE
graph_t *g;
-
-/* Line 2068 of yacc.c */
-#line 70 "grammar.tab.h"
+/* Line 2049 of yacc.c */
+#line 76 "grammar.tab.h"
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
@@ -74,5 +80,18 @@ typedef union YYSTYPE
#endif
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int priv_gst_parse_yyparse (void *YYPARSE_PARAM);
+#else
+int priv_gst_parse_yyparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int priv_gst_parse_yyparse (void *scanner, graph_t *graph);
+#else
+int priv_gst_parse_yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
-
+#endif /* !PRIV_GST_PARSE_YY_GRAMMAR_TAB_H */
diff --git a/gstreamer.doap b/gstreamer.doap
index ed20425..3245b60 100644
--- a/gstreamer.doap
+++ b/gstreamer.doap
@@ -40,6 +40,16 @@ hierarchy, and a set of media-agnostic core elements.
<release>
<Version>
+ <revision>1.0.2</revision>
+ <branch>1.0</branch>
+ <name></name>
+ <created>2012-10-24</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.0.2.tar.xz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
<revision>1.0.1</revision>
<branch>1.0</branch>
<name></name>
diff --git a/gstreamer.spec b/gstreamer.spec
index 33569de..12d3259 100644
--- a/gstreamer.spec
+++ b/gstreamer.spec
@@ -4,7 +4,7 @@
%define _glib2 2.32.0
Name: %{gstreamer}
-Version: 1.0.1
+Version: 1.0.2
Release: 1
Summary: GStreamer streaming media framework runtime
diff --git a/libs/Makefile.in b/libs/Makefile.in
index 21cff6c..96d1071 100644
--- a/libs/Makefile.in
+++ b/libs/Makefile.in
@@ -80,7 +80,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -339,6 +339,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -375,6 +378,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/libs/gst/Makefile.in b/libs/gst/Makefile.in
index 67d6d43..5aec43c 100644
--- a/libs/gst/Makefile.in
+++ b/libs/gst/Makefile.in
@@ -80,7 +80,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -338,6 +338,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -374,6 +377,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/libs/gst/base/Makefile.in b/libs/gst/base/Makefile.in
index 1183bb6..55a7370 100644
--- a/libs/gst/base/Makefile.in
+++ b/libs/gst/base/Makefile.in
@@ -85,7 +85,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -382,6 +382,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -418,6 +421,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/libs/gst/base/gstbaseparse.c b/libs/gst/base/gstbaseparse.c
index e1a705b..2053221 100644
--- a/libs/gst/base/gstbaseparse.c
+++ b/libs/gst/base/gstbaseparse.c
@@ -3343,7 +3343,7 @@ gst_base_parse_set_passthrough (GstBaseParse * parse, gboolean passthrough)
/**
* gst_base_parse_set_pts_interpolation:
* @parse: a #GstBaseParse
- * @passthrough: %TRUE if parser should interpolate PTS timestamps
+ * @pts_interpolate: %TRUE if parser should interpolate PTS timestamps
*
* By default, the base class will guess PTS timestamps using a simple
* interpolation (previous timestamp + duration), which is incorrect for
diff --git a/libs/gst/base/gstbasesrc.c b/libs/gst/base/gstbasesrc.c
index 556f05d..f8f3302 100644
--- a/libs/gst/base/gstbasesrc.c
+++ b/libs/gst/base/gstbasesrc.c
@@ -183,6 +183,12 @@ GST_DEBUG_CATEGORY_STATIC (gst_base_src_debug);
#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));
+
+#define GST_ASYNC_GET_COND(elem) (&GST_BASE_SRC_CAST(elem)->priv->async_cond)
+#define GST_ASYNC_WAIT(elem) g_cond_wait (GST_ASYNC_GET_COND (elem), GST_OBJECT_GET_LOCK (elem))
+#define GST_ASYNC_SIGNAL(elem) g_cond_signal (GST_ASYNC_GET_COND (elem));
+
+
/* BaseSrc signals and args */
enum
{
@@ -251,6 +257,8 @@ struct _GstBaseSrcPrivate
GstBufferPool *pool;
GstAllocator *allocator;
GstAllocationParams params;
+
+ GCond async_cond;
};
static GstElementClass *parent_class = NULL;
@@ -444,6 +452,7 @@ gst_base_src_init (GstBaseSrc * basesrc, gpointer g_class)
basesrc->priv->do_timestamp = DEFAULT_DO_TIMESTAMP;
g_atomic_int_set (&basesrc->priv->have_events, FALSE);
+ g_cond_init (&basesrc->priv->async_cond);
basesrc->priv->start_result = GST_FLOW_FLUSHING;
GST_OBJECT_FLAG_UNSET (basesrc, GST_BASE_SRC_FLAG_STARTED);
GST_OBJECT_FLAG_UNSET (basesrc, GST_BASE_SRC_FLAG_STARTING);
@@ -462,6 +471,7 @@ gst_base_src_finalize (GObject * object)
g_mutex_clear (&basesrc->live_lock);
g_cond_clear (&basesrc->live_cond);
+ g_cond_clear (&basesrc->priv->async_cond);
event_p = &basesrc->pending_seek;
gst_event_replace (event_p, NULL);
@@ -3091,6 +3101,8 @@ gst_base_src_start (GstBaseSrc * basesrc)
gboolean result;
GST_LIVE_LOCK (basesrc);
+
+ GST_OBJECT_LOCK (basesrc);
if (GST_BASE_SRC_IS_STARTING (basesrc))
goto was_starting;
if (GST_BASE_SRC_IS_STARTED (basesrc))
@@ -3098,12 +3110,12 @@ gst_base_src_start (GstBaseSrc * basesrc)
basesrc->priv->start_result = GST_FLOW_FLUSHING;
GST_OBJECT_FLAG_SET (basesrc, GST_BASE_SRC_FLAG_STARTING);
+ gst_segment_init (&basesrc->segment, basesrc->segment.format);
+ GST_OBJECT_UNLOCK (basesrc);
+
basesrc->num_buffers_left = basesrc->num_buffers;
basesrc->running = FALSE;
basesrc->priv->segment_pending = FALSE;
- GST_OBJECT_LOCK (basesrc);
- gst_segment_init (&basesrc->segment, basesrc->segment.format);
- GST_OBJECT_UNLOCK (basesrc);
GST_LIVE_UNLOCK (basesrc);
bclass = GST_BASE_SRC_GET_CLASS (basesrc);
@@ -3115,8 +3127,12 @@ gst_base_src_start (GstBaseSrc * basesrc)
if (!result)
goto could_not_start;
- if (!gst_base_src_is_async (basesrc))
+ if (!gst_base_src_is_async (basesrc)) {
gst_base_src_start_complete (basesrc, GST_FLOW_OK);
+ /* not really waiting here, we call this to get the result
+ * from the start_complete call */
+ result = gst_base_src_start_wait (basesrc) == GST_FLOW_OK;
+ }
return result;
@@ -3124,12 +3140,14 @@ gst_base_src_start (GstBaseSrc * basesrc)
was_starting:
{
GST_DEBUG_OBJECT (basesrc, "was starting");
+ GST_OBJECT_UNLOCK (basesrc);
GST_LIVE_UNLOCK (basesrc);
return TRUE;
}
was_started:
{
GST_DEBUG_OBJECT (basesrc, "was started");
+ GST_OBJECT_UNLOCK (basesrc);
GST_LIVE_UNLOCK (basesrc);
return TRUE;
}
@@ -3232,12 +3250,12 @@ gst_base_src_start_complete (GstBaseSrc * basesrc, GstFlowReturn ret)
goto no_get_range;
}
- GST_LIVE_LOCK (basesrc);
+ GST_OBJECT_LOCK (basesrc);
GST_OBJECT_FLAG_SET (basesrc, GST_BASE_SRC_FLAG_STARTED);
GST_OBJECT_FLAG_UNSET (basesrc, GST_BASE_SRC_FLAG_STARTING);
basesrc->priv->start_result = ret;
- GST_LIVE_SIGNAL (basesrc);
- GST_LIVE_UNLOCK (basesrc);
+ GST_ASYNC_SIGNAL (basesrc);
+ GST_OBJECT_UNLOCK (basesrc);
GST_PAD_STREAM_UNLOCK (basesrc->srcpad);
@@ -3263,11 +3281,11 @@ no_get_range:
}
error:
{
- GST_LIVE_LOCK (basesrc);
+ GST_OBJECT_LOCK (basesrc);
basesrc->priv->start_result = ret;
GST_OBJECT_FLAG_UNSET (basesrc, GST_BASE_SRC_FLAG_STARTING);
- GST_LIVE_SIGNAL (basesrc);
- GST_LIVE_UNLOCK (basesrc);
+ GST_ASYNC_SIGNAL (basesrc);
+ GST_OBJECT_UNLOCK (basesrc);
return;
}
}
@@ -3285,27 +3303,16 @@ gst_base_src_start_wait (GstBaseSrc * basesrc)
{
GstFlowReturn result;
- GST_LIVE_LOCK (basesrc);
- if (G_UNLIKELY (basesrc->priv->flushing))
- goto flushing;
-
+ GST_OBJECT_LOCK (basesrc);
while (GST_BASE_SRC_IS_STARTING (basesrc)) {
- GST_LIVE_WAIT (basesrc);
- if (G_UNLIKELY (basesrc->priv->flushing))
- goto flushing;
+ GST_ASYNC_WAIT (basesrc);
}
result = basesrc->priv->start_result;
- GST_LIVE_UNLOCK (basesrc);
+ GST_OBJECT_UNLOCK (basesrc);
- return result;
+ GST_DEBUG_OBJECT (basesrc, "got %s", gst_flow_get_name (result));
- /* ERRORS */
-flushing:
- {
- GST_DEBUG_OBJECT (basesrc, "we are flushing");
- GST_LIVE_UNLOCK (basesrc);
- return GST_FLOW_FLUSHING;
- }
+ return result;
}
static gboolean
@@ -3321,15 +3328,15 @@ gst_base_src_stop (GstBaseSrc * basesrc)
/* stop the task */
gst_pad_stop_task (basesrc->srcpad);
- GST_LIVE_LOCK (basesrc);
+ GST_OBJECT_LOCK (basesrc);
if (!GST_BASE_SRC_IS_STARTED (basesrc) && !GST_BASE_SRC_IS_STARTING (basesrc))
goto was_stopped;
GST_OBJECT_FLAG_UNSET (basesrc, GST_BASE_SRC_FLAG_STARTING);
GST_OBJECT_FLAG_UNSET (basesrc, GST_BASE_SRC_FLAG_STARTED);
basesrc->priv->start_result = GST_FLOW_FLUSHING;
- GST_LIVE_SIGNAL (basesrc);
- GST_LIVE_UNLOCK (basesrc);
+ GST_ASYNC_SIGNAL (basesrc);
+ GST_OBJECT_UNLOCK (basesrc);
bclass = GST_BASE_SRC_GET_CLASS (basesrc);
if (bclass->stop)
@@ -3342,7 +3349,7 @@ gst_base_src_stop (GstBaseSrc * basesrc)
was_stopped:
{
GST_DEBUG_OBJECT (basesrc, "was started");
- GST_LIVE_UNLOCK (basesrc);
+ GST_OBJECT_UNLOCK (basesrc);
return TRUE;
}
}
diff --git a/libs/gst/base/gstbasesrc.h b/libs/gst/base/gstbasesrc.h
index b0ae337..466f0fc 100644
--- a/libs/gst/base/gstbasesrc.h
+++ b/libs/gst/base/gstbasesrc.h
@@ -255,7 +255,7 @@ 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_new_seamless_segment (GstBaseSrc *src, gint64 start, gint64 stop, gint64 time);
gboolean gst_base_src_set_caps (GstBaseSrc *src, GstCaps *caps);
diff --git a/libs/gst/base/gstcollectpads.c b/libs/gst/base/gstcollectpads.c
index dfd46b8..9c9b003 100644
--- a/libs/gst/base/gstcollectpads.c
+++ b/libs/gst/base/gstcollectpads.c
@@ -524,7 +524,7 @@ gst_collect_pads_clip_running_time (GstCollectPads * pads,
* @user_data: 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 #GstCollectPad2ClipFunction for more info.
+ * on a pad managed by @pads. See #GstCollectPadsClipFunction for more info.
*/
void
gst_collect_pads_set_clip_function (GstCollectPads * pads,
@@ -1353,7 +1353,7 @@ gst_collect_pads_recalculate_waiting (GstCollectPads * pads)
}
/* check if the waiting state should be changed */
- comp_time = MAX (data->segment.start, data->segment.position);
+ comp_time = data->segment.position;
cmp_res = pads->priv->compare_func (pads, data, comp_time,
pads->priv->earliest_data, pads->priv->earliest_time,
pads->priv->compare_user_data);
@@ -1558,6 +1558,30 @@ exit:
}
+static GstClockTime
+gst_collect_pads_clip_time (GstCollectPads * pads, GstCollectData * data,
+ GstClockTime time)
+{
+ GstClockTime otime = time;
+ GstBuffer *in, *out = NULL;
+
+ if (pads->priv->clip_func) {
+ in = gst_buffer_new ();
+ GST_BUFFER_TIMESTAMP (in) = time;
+ pads->priv->clip_func (pads, data, in, &out, pads->priv->clip_user_data);
+ if (out) {
+ otime = GST_BUFFER_TIMESTAMP (out);
+ gst_buffer_unref (out);
+ } else {
+ /* FIXME should distinguish between ahead or after segment,
+ * let's assume after segment and use some large time ... */
+ otime = G_MAXINT64 / 2;
+ }
+ }
+
+ return otime;
+}
+
/**
* gst_collect_pads_event_default:
* @pads: the collectpads to use
@@ -1668,9 +1692,6 @@ gst_collect_pads_event_default (GstCollectPads * pads, GstCollectData * data,
GST_DEBUG_OBJECT (data->pad, "got segment %" GST_SEGMENT_FORMAT, &seg);
- /* sanitize to make sure; reasonably so at start */
- seg.position = seg.start;
-
/* default collection can not handle other segment formats than time */
if (buffer_func && seg.format != GST_FORMAT_TIME) {
GST_WARNING_OBJECT (pads, "GstCollectPads default collecting "
@@ -1678,14 +1699,20 @@ gst_collect_pads_event_default (GstCollectPads * pads, GstCollectData * data,
goto newsegment_done;
}
+ /* need to update segment first */
data->segment = seg;
GST_COLLECT_PADS_STATE_SET (data, GST_COLLECT_PADS_STATE_NEW_SEGMENT);
+ /* now we can use for e.g. running time */
+ seg.position = gst_collect_pads_clip_time (pads, data, seg.start);
+ /* update again */
+ data->segment = seg;
+
/* default muxing functionality */
if (!buffer_func)
goto newsegment_done;
- gst_collect_pads_handle_position_update (pads, data, seg.start);
+ gst_collect_pads_handle_position_update (pads, data, seg.position);
newsegment_done:
GST_COLLECT_PADS_STREAM_UNLOCK (pads);
@@ -1704,9 +1731,10 @@ gst_collect_pads_event_default (GstCollectPads * pads, GstCollectData * data,
start += duration;
/* we do not expect another buffer until after gap,
* so that is our position now */
- data->segment.position = start;
+ data->segment.position = gst_collect_pads_clip_time (pads, data, start);
- gst_collect_pads_handle_position_update (pads, data, start);
+ gst_collect_pads_handle_position_update (pads, data,
+ data->segment.position);
GST_COLLECT_PADS_STREAM_UNLOCK (pads);
goto eat;
diff --git a/libs/gst/base/gstcollectpads.h b/libs/gst/base/gstcollectpads.h
index ee1c038..c33ca4f 100644
--- a/libs/gst/base/gstcollectpads.h
+++ b/libs/gst/base/gstcollectpads.h
@@ -147,7 +147,7 @@ typedef GstFlowReturn (*GstCollectPadsFunction) (GstCollectPads *pads, gpointer
* GstCollectPadsBufferFunction:
* @pads: the #GstCollectPads that trigered the callback
* @data: the #GstCollectData of pad that has received the buffer
- * @buffer: the #GstBuffer
+ * @buffer: (transfer full): the #GstBuffer
* @user_data: user data passed to gst_collect_pads_set_buffer_function()
*
* A function that will be called when a (considered oldest) buffer can be muxed.
@@ -217,7 +217,7 @@ typedef gboolean (*GstCollectPadsQueryFunction) (GstCollectPads *pads, Gs
* GstCollectPadsClipFunction:
* @pads: a #GstCollectPads
* @data: a #GstCollectData
- * @inbuffer: the input #GstBuffer
+ * @inbuffer: (transfer full): the input #GstBuffer
* @outbuffer: the output #GstBuffer
* @user_data: user data
*
diff --git a/libs/gst/check/Makefile.in b/libs/gst/check/Makefile.in
index 3fa368b..96f2e16 100644
--- a/libs/gst/check/Makefile.in
+++ b/libs/gst/check/Makefile.in
@@ -85,7 +85,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -413,6 +413,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -449,6 +452,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/libs/gst/check/libcheck/Makefile.am b/libs/gst/check/libcheck/Makefile.am
index e7465e3..e814fc8 100644
--- a/libs/gst/check/libcheck/Makefile.am
+++ b/libs/gst/check/libcheck/Makefile.am
@@ -29,9 +29,9 @@ 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
+if HAVE_PTHREAD
+libcheckinternal_la_CFLAGS = $(PTHREAD_CFLAGS) -D_GNU_SOURCE -DHAVE_PTHREAD
+libcheckinternal_la_LIBADD = $(PTHREAD_LIBS)
else
libcheckinternal_la_CFLAGS = -D_GNU_SOURCE
libcheckinternal_la_LIBADD =
diff --git a/libs/gst/check/libcheck/Makefile.in b/libs/gst/check/libcheck/Makefile.in
index 910f594..874eaa0 100644
--- a/libs/gst/check/libcheck/Makefile.in
+++ b/libs/gst/check/libcheck/Makefile.in
@@ -83,7 +83,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -99,7 +99,9 @@ CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES = check.h
CONFIG_CLEAN_VPATH_FILES =
LTLIBRARIES = $(noinst_LTLIBRARIES)
-libcheckinternal_la_DEPENDENCIES =
+am__DEPENDENCIES_1 =
+@HAVE_PTHREAD_TRUE@libcheckinternal_la_DEPENDENCIES = \
+@HAVE_PTHREAD_TRUE@ $(am__DEPENDENCIES_1)
am__objects_1 = libcheckinternal_la-check.lo \
libcheckinternal_la-check_error.lo \
libcheckinternal_la-check_list.lo \
@@ -346,6 +348,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -382,6 +387,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
@@ -457,12 +463,12 @@ HFILES = \
noinst_HEADERS = $(HFILES)
libcheckinternal_la_SOURCES = $(CFILES) $(HFILES)
-@HAVE_PTHREAD_H_FALSE@libcheckinternal_la_CFLAGS = -D_GNU_SOURCE
+@HAVE_PTHREAD_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
+@HAVE_PTHREAD_TRUE@libcheckinternal_la_CFLAGS = $(PTHREAD_CFLAGS) -D_GNU_SOURCE -DHAVE_PTHREAD
+@HAVE_PTHREAD_FALSE@libcheckinternal_la_LIBADD =
+@HAVE_PTHREAD_TRUE@libcheckinternal_la_LIBADD = $(PTHREAD_LIBS)
all: all-am
.SUFFIXES:
diff --git a/libs/gst/controller/Makefile.in b/libs/gst/controller/Makefile.in
index 54a19ff..5402961 100644
--- a/libs/gst/controller/Makefile.in
+++ b/libs/gst/controller/Makefile.in
@@ -85,7 +85,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -378,6 +378,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -414,6 +417,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/libs/gst/helpers/Makefile.in b/libs/gst/helpers/Makefile.in
index d68803b..b50d309 100644
--- a/libs/gst/helpers/Makefile.in
+++ b/libs/gst/helpers/Makefile.in
@@ -82,7 +82,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -337,6 +337,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -373,6 +376,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/libs/gst/net/Makefile.in b/libs/gst/net/Makefile.in
index 7687c2e..1da3866 100644
--- a/libs/gst/net/Makefile.in
+++ b/libs/gst/net/Makefile.in
@@ -85,7 +85,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -376,6 +376,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -412,6 +415,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/m4/Makefile.in b/m4/Makefile.in
index e83c601..10ca2b3 100644
--- a/m4/Makefile.in
+++ b/m4/Makefile.in
@@ -80,7 +80,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -299,6 +299,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -335,6 +338,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/m4/ax_pthread.m4 b/m4/ax_pthread.m4
new file mode 100644
index 0000000..d90de34
--- /dev/null
+++ b/m4/ax_pthread.m4
@@ -0,0 +1,309 @@
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_pthread.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+#
+# DESCRIPTION
+#
+# This macro figures out how to build C programs using POSIX threads. It
+# sets the PTHREAD_LIBS output variable to the threads library and linker
+# flags, and the PTHREAD_CFLAGS output variable to any special C compiler
+# flags that are needed. (The user can also force certain compiler
+# flags/libs to be tested by setting these environment variables.)
+#
+# Also sets PTHREAD_CC to any special C compiler that is needed for
+# multi-threaded programs (defaults to the value of CC otherwise). (This
+# is necessary on AIX to use the special cc_r compiler alias.)
+#
+# NOTE: You are assumed to not only compile your program with these flags,
+# but also link it with them as well. e.g. you should link with
+# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
+#
+# If you are only building threads programs, you may wish to use these
+# variables in your default LIBS, CFLAGS, and CC:
+#
+# LIBS="$PTHREAD_LIBS $LIBS"
+# CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+# CC="$PTHREAD_CC"
+#
+# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
+# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name
+# (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
+#
+# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
+# PTHREAD_PRIO_INHERIT symbol is defined when compiling with
+# PTHREAD_CFLAGS.
+#
+# ACTION-IF-FOUND is a list of shell commands to run if a threads library
+# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it
+# is not found. If ACTION-IF-FOUND is not specified, the default action
+# will define HAVE_PTHREAD.
+#
+# Please let the authors know if this macro fails on any platform, or if
+# you have any other suggestions or comments. This macro was based on work
+# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help
+# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by
+# Alejandro Forero Cuervo to the autoconf macro repository. We are also
+# grateful for the helpful feedback of numerous users.
+#
+# Updated for Autoconf 2.68 by Daniel Richard G.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>
+# Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>
+#
+# 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, 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 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.
+
+#serial 18
+
+AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
+AC_DEFUN([AX_PTHREAD], [
+AC_REQUIRE([AC_CANONICAL_HOST])
+AC_LANG_PUSH([C])
+ax_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on True64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+ save_LIBS="$LIBS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
+ AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes)
+ AC_MSG_RESULT($ax_pthread_ok)
+ if test x"$ax_pthread_ok" = xno; then
+ PTHREAD_LIBS=""
+ PTHREAD_CFLAGS=""
+ fi
+ LIBS="$save_LIBS"
+ CFLAGS="$save_CFLAGS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try. Items starting with a "-" are
+# C compiler flags, and other items are library names, except for "none"
+# which indicates that we try without any flags at all, and "pthread-config"
+# which is a program returning the flags for the Pth emulation library.
+
+ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important. Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+# other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
+# -pthreads: Solaris/gcc
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+# doesn't hurt to check since this sometimes defines pthreads too;
+# also defines -D_REENTRANT)
+# ... -mt is also the pthreads flag for HP/aCC
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case ${host_os} in
+ solaris*)
+
+ # On Solaris (at least, for some versions), libc contains stubbed
+ # (non-functional) versions of the pthreads routines, so link-based
+ # tests will erroneously succeed. (We need to link with -pthreads/-mt/
+ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
+ # a function called by this macro, so we could check for that, but
+ # who knows whether they'll stub that too in a future libc.) So,
+ # we'll just look for -pthreads and -lpthread first:
+
+ ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags"
+ ;;
+
+ darwin*)
+ ax_pthread_flags="-pthread $ax_pthread_flags"
+ ;;
+esac
+
+if test x"$ax_pthread_ok" = xno; then
+for flag in $ax_pthread_flags; do
+
+ case $flag in
+ none)
+ AC_MSG_CHECKING([whether pthreads work without any flags])
+ ;;
+
+ -*)
+ AC_MSG_CHECKING([whether pthreads work with $flag])
+ PTHREAD_CFLAGS="$flag"
+ ;;
+
+ pthread-config)
+ AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no)
+ if test x"$ax_pthread_config" = xno; then continue; fi
+ PTHREAD_CFLAGS="`pthread-config --cflags`"
+ PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+ ;;
+
+ *)
+ AC_MSG_CHECKING([for the pthreads library -l$flag])
+ PTHREAD_LIBS="-l$flag"
+ ;;
+ esac
+
+ save_LIBS="$LIBS"
+ save_CFLAGS="$CFLAGS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+ # Check for various functions. We must include pthread.h,
+ # since some functions may be macros. (On the Sequent, we
+ # need a special flag -Kthread to make this header compile.)
+ # We check for pthread_join because it is in -lpthread on IRIX
+ # while pthread_create is in libc. We check for pthread_attr_init
+ # due to DEC craziness with -lpthreads. We check for
+ # pthread_cleanup_push because it is one of the few pthread
+ # functions on Solaris that doesn't have a non-functional libc stub.
+ # We try pthread_create on general principles.
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
+ static void routine(void *a) { a = 0; }
+ static void *start_routine(void *a) { return a; }],
+ [pthread_t th; pthread_attr_t attr;
+ pthread_create(&th, 0, start_routine, 0);
+ pthread_join(th, 0);
+ pthread_attr_init(&attr);
+ pthread_cleanup_push(routine, 0);
+ pthread_cleanup_pop(0) /* ; */])],
+ [ax_pthread_ok=yes],
+ [])
+
+ LIBS="$save_LIBS"
+ CFLAGS="$save_CFLAGS"
+
+ AC_MSG_RESULT($ax_pthread_ok)
+ if test "x$ax_pthread_ok" = xyes; then
+ break;
+ fi
+
+ PTHREAD_LIBS=""
+ PTHREAD_CFLAGS=""
+done
+fi
+
+# Various other checks:
+if test "x$ax_pthread_ok" = xyes; then
+ save_LIBS="$LIBS"
+ LIBS="$PTHREAD_LIBS $LIBS"
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+ # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+ AC_MSG_CHECKING([for joinable pthread attribute])
+ attr_name=unknown
+ for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
+ [int attr = $attr; return attr /* ; */])],
+ [attr_name=$attr; break],
+ [])
+ done
+ AC_MSG_RESULT($attr_name)
+ if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
+ AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,
+ [Define to necessary symbol if this constant
+ uses a non-standard name on your system.])
+ fi
+
+ AC_MSG_CHECKING([if more special flags are required for pthreads])
+ flag=no
+ case ${host_os} in
+ aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";;
+ osf* | hpux*) flag="-D_REENTRANT";;
+ solaris*)
+ if test "$GCC" = "yes"; then
+ flag="-D_REENTRANT"
+ else
+ flag="-mt -D_REENTRANT"
+ fi
+ ;;
+ esac
+ AC_MSG_RESULT(${flag})
+ if test "x$flag" != xno; then
+ PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
+ fi
+
+ AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
+ ax_cv_PTHREAD_PRIO_INHERIT, [
+ AC_LINK_IFELSE([
+ AC_LANG_PROGRAM([[#include <pthread.h>]], [[int i = PTHREAD_PRIO_INHERIT;]])],
+ [ax_cv_PTHREAD_PRIO_INHERIT=yes],
+ [ax_cv_PTHREAD_PRIO_INHERIT=no])
+ ])
+ AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"],
+ AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], 1, [Have PTHREAD_PRIO_INHERIT.]))
+
+ LIBS="$save_LIBS"
+ CFLAGS="$save_CFLAGS"
+
+ # More AIX lossage: must compile with xlc_r or cc_r
+ if test x"$GCC" != xyes; then
+ AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC})
+ else
+ PTHREAD_CC=$CC
+ fi
+else
+ PTHREAD_CC="$CC"
+fi
+
+AC_SUBST(PTHREAD_LIBS)
+AC_SUBST(PTHREAD_CFLAGS)
+AC_SUBST(PTHREAD_CC)
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test x"$ax_pthread_ok" = xyes; then
+ ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
+ :
+else
+ ax_pthread_ok=no
+ $2
+fi
+AC_LANG_POP
+])dnl AX_PTHREAD
diff --git a/pkgconfig/Makefile.in b/pkgconfig/Makefile.in
index 88585f5..f92e394 100644
--- a/pkgconfig/Makefile.in
+++ b/pkgconfig/Makefile.in
@@ -91,7 +91,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -343,6 +343,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -379,6 +382,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/plugins/Makefile.in b/plugins/Makefile.in
index b666215..dea363a 100644
--- a/plugins/Makefile.in
+++ b/plugins/Makefile.in
@@ -80,7 +80,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -338,6 +338,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -374,6 +377,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/plugins/elements/Makefile.in b/plugins/elements/Makefile.in
index 3bb168f..f3a15f3 100644
--- a/plugins/elements/Makefile.in
+++ b/plugins/elements/Makefile.in
@@ -83,7 +83,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -384,6 +384,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -420,6 +423,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/po/af.gmo b/po/af.gmo
index 0493a4f..31ea98d 100644
--- a/po/af.gmo
+++ b/po/af.gmo
Binary files differ
diff --git a/po/af.po b/po/af.po
index c8e924a..e0eb849 100644
--- a/po/af.po
+++ b/po/af.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.9.7\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/az.gmo b/po/az.gmo
index 69eb1b2..4cbd51b 100644
--- a/po/az.gmo
+++ b/po/az.gmo
Binary files differ
diff --git a/po/az.po b/po/az.po
index 769f4a3..8575797 100644
--- a/po/az.po
+++ b/po/az.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer-0.8.0\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/be.gmo b/po/be.gmo
index 74b5e91..b405c98 100644
--- a/po/be.gmo
+++ b/po/be.gmo
Binary files differ
diff --git a/po/be.po b/po/be.po
index 721f025..e21b622 100644
--- a/po/be.po
+++ b/po/be.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.9.7\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/bg.gmo b/po/bg.gmo
index 85ed3bf..8ebcab2 100644
--- a/po/bg.gmo
+++ b/po/bg.gmo
Binary files differ
diff --git a/po/bg.po b/po/bg.po
index e1b0ece..b9c5c2e 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/ca.gmo b/po/ca.gmo
index 5753867..495d667 100644
--- a/po/ca.gmo
+++ b/po/ca.gmo
Binary files differ
diff --git a/po/ca.po b/po/ca.po
index 710654a..b7308d6 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.30.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/cs.gmo b/po/cs.gmo
index 83e5ed5..f4ca8d4 100644
--- a/po/cs.gmo
+++ b/po/cs.gmo
Binary files differ
diff --git a/po/cs.po b/po/cs.po
index 32dcbec..1481a41 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\n"
"PO-Revision-Date: 2011-12-01 08:17+0100\n"
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
"Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n"
diff --git a/po/da.gmo b/po/da.gmo
index 33e089c..4521245 100644
--- a/po/da.gmo
+++ b/po/da.gmo
Binary files differ
diff --git a/po/da.po b/po/da.po
index 4e6cc89..d47e417 100644
--- a/po/da.po
+++ b/po/da.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.30.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/de.gmo b/po/de.gmo
index 0a09083..575cd91 100644
--- a/po/de.gmo
+++ b/po/de.gmo
Binary files differ
diff --git a/po/de.po b/po/de.po
index 8f8201a..b1176e1 100644
--- a/po/de.po
+++ b/po/de.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/el.gmo b/po/el.gmo
index a455013..2fbd84c 100644
--- a/po/el.gmo
+++ b/po/el.gmo
Binary files differ
diff --git a/po/el.po b/po/el.po
index 6627a62..b36f28a 100644
--- a/po/el.po
+++ b/po/el.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer-0.10.30.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/en_GB.gmo b/po/en_GB.gmo
index 97bc750..9ee9846 100644
--- a/po/en_GB.gmo
+++ b/po/en_GB.gmo
Binary files differ
diff --git a/po/en_GB.po b/po/en_GB.po
index 3467f8f..16b5d5a 100644
--- a/po/en_GB.po
+++ b/po/en_GB.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.8.1\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/eo.gmo b/po/eo.gmo
index 125a03b..e3d082b 100644
--- a/po/eo.gmo
+++ b/po/eo.gmo
Binary files differ
diff --git a/po/eo.po b/po/eo.po
index 0114bba..edec533 100644
--- a/po/eo.po
+++ b/po/eo.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\n"
"PO-Revision-Date: 2011-06-04 21:11+0100\n"
"Last-Translator: Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>\n"
"Language-Team: Esperanto <translation-team-eo@lists.sourceforge.net>\n"
diff --git a/po/es.gmo b/po/es.gmo
index 2650637..669361b 100644
--- a/po/es.gmo
+++ b/po/es.gmo
Binary files differ
diff --git a/po/es.po b/po/es.po
index 3c8fd52..1259a45 100644
--- a/po/es.po
+++ b/po/es.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\n"
"PO-Revision-Date: 2011-10-02 15:45+0200\n"
"Last-Translator: Jorge González González <aloriel@gmail.com>\n"
"Language-Team: Spanish <es@li.org>\n"
diff --git a/po/eu.gmo b/po/eu.gmo
index f431ebe..0e2f115 100644
--- a/po/eu.gmo
+++ b/po/eu.gmo
Binary files differ
diff --git a/po/eu.po b/po/eu.po
index 5579d6a..a266c88 100644
--- a/po/eu.po
+++ b/po/eu.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer-0.10.26.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/fi.gmo b/po/fi.gmo
index c14147e..5679a0a 100644
--- a/po/fi.gmo
+++ b/po/fi.gmo
Binary files differ
diff --git a/po/fi.po b/po/fi.po
index 56b1307..670f0c3 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.30.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/fr.gmo b/po/fr.gmo
index 0528a13..bf57f7f 100644
--- a/po/fr.gmo
+++ b/po/fr.gmo
Binary files differ
diff --git a/po/fr.po b/po/fr.po
index fabafa4..801d72f 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/gl.gmo b/po/gl.gmo
index cf363d1..62414d4 100644
--- a/po/gl.gmo
+++ b/po/gl.gmo
Binary files differ
diff --git a/po/gl.po b/po/gl.po
index 68ff249..2040757 100644
--- a/po/gl.po
+++ b/po/gl.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/gstreamer-1.0.pot b/po/gstreamer-1.0.pot
index 26de4c4..a7afb33 100644
--- a/po/gstreamer-1.0.pot
+++ b/po/gstreamer-1.0.pot
@@ -5,9 +5,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: gstreamer 1.0.1\n"
+"Project-Id-Version: gstreamer 1.0.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
@@ -98,7 +98,7 @@ msgstr ""
msgid "Show GStreamer Options"
msgstr ""
-#: gst/gst.c:931
+#: gst/gst.c:932
msgid "Unknown option"
msgstr ""
@@ -1048,11 +1048,11 @@ msgstr ""
msgid "empty pipeline not allowed"
msgstr ""
-#: libs/gst/base/gstbasesrc.c:2428
+#: libs/gst/base/gstbasesrc.c:2438
msgid "Internal clock error."
msgstr ""
-#: libs/gst/base/gstbasesrc.c:2780 libs/gst/base/gstbasesrc.c:2789
+#: libs/gst/base/gstbasesrc.c:2790 libs/gst/base/gstbasesrc.c:2799
#: libs/gst/base/gstbasesink.c:3767 plugins/elements/gstqueue.c:1188
#: plugins/elements/gstqueue2.c:2565
msgid "Internal data flow error."
diff --git a/po/hu.gmo b/po/hu.gmo
index 3d1a9bd..c2b3003 100644
--- a/po/hu.gmo
+++ b/po/hu.gmo
Binary files differ
diff --git a/po/hu.po b/po/hu.po
index 7c324dc..9809b56 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.30.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/id.gmo b/po/id.gmo
index 7d67d70..cbc7075 100644
--- a/po/id.gmo
+++ b/po/id.gmo
Binary files differ
diff --git a/po/id.po b/po/id.po
index df401e4..e4d924a 100644
--- a/po/id.po
+++ b/po/id.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\n"
"PO-Revision-Date: 2012-01-28 11:44+0700\n"
"Last-Translator: Andhika Padmawan <andhika.padmawan@gmail.com>\n"
"Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n"
diff --git a/po/it.gmo b/po/it.gmo
index 210dfc5..0cf2261 100644
--- a/po/it.gmo
+++ b/po/it.gmo
Binary files differ
diff --git a/po/it.po b/po/it.po
index 0ca767f..93728d9 100644
--- a/po/it.po
+++ b/po/it.po
@@ -106,7 +106,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.30.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/ja.gmo b/po/ja.gmo
index 849267d..4291958 100644
--- a/po/ja.gmo
+++ b/po/ja.gmo
Binary files differ
diff --git a/po/ja.po b/po/ja.po
index ff16663..58c9f8f 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.20.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/lt.gmo b/po/lt.gmo
index ee908a4..5648e40 100644
--- a/po/lt.gmo
+++ b/po/lt.gmo
Binary files differ
diff --git a/po/lt.po b/po/lt.po
index a72f537..2cdaa18 100644
--- a/po/lt.po
+++ b/po/lt.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.29.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/nb.gmo b/po/nb.gmo
index 6f6b37c..5f12813 100644
--- a/po/nb.gmo
+++ b/po/nb.gmo
Binary files differ
diff --git a/po/nb.po b/po/nb.po
index 4d2dfdd..54d15f9 100644
--- a/po/nb.po
+++ b/po/nb.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.30.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/nl.gmo b/po/nl.gmo
index f8edad9..1cce4a8 100644
--- a/po/nl.gmo
+++ b/po/nl.gmo
Binary files differ
diff --git a/po/nl.po b/po/nl.po
index dc62507..22476ff 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/pl.gmo b/po/pl.gmo
index 6e7d530..8f1befe 100644
--- a/po/pl.gmo
+++ b/po/pl.gmo
Binary files differ
diff --git a/po/pl.po b/po/pl.po
index 074e087..8fc877a 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo
index 8d24cca..3d52cb1 100644
--- a/po/pt_BR.gmo
+++ b/po/pt_BR.gmo
Binary files differ
diff --git a/po/pt_BR.po b/po/pt_BR.po
index ad3c969..5ef10d8 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer-0.10.31.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/ro.gmo b/po/ro.gmo
index 9c9b705..1286844 100644
--- a/po/ro.gmo
+++ b/po/ro.gmo
Binary files differ
diff --git a/po/ro.po b/po/ro.po
index b8b1571..74abd8c 100644
--- a/po/ro.po
+++ b/po/ro.po
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.29.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/ru.gmo b/po/ru.gmo
index 1cee399..e631cba 100644
--- a/po/ru.gmo
+++ b/po/ru.gmo
Binary files differ
diff --git a/po/ru.po b/po/ru.po
index 3d511a9..6cdbe2d 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer-0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/rw.gmo b/po/rw.gmo
index de829fb..8e71857 100644
--- a/po/rw.gmo
+++ b/po/rw.gmo
Binary files differ
diff --git a/po/rw.po b/po/rw.po
index 9806639..eec9bac 100644
--- a/po/rw.po
+++ b/po/rw.po
@@ -15,7 +15,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.8.8\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/sk.gmo b/po/sk.gmo
index ebdb3bb..8816a93 100644
--- a/po/sk.gmo
+++ b/po/sk.gmo
Binary files differ
diff --git a/po/sk.po b/po/sk.po
index 2671780..8a34bab 100644
--- a/po/sk.po
+++ b/po/sk.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.30.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/sl.gmo b/po/sl.gmo
index 0b4a08f..5621888 100644
--- a/po/sl.gmo
+++ b/po/sl.gmo
Binary files differ
diff --git a/po/sl.po b/po/sl.po
index 603887a..3b4929b 100644
--- a/po/sl.po
+++ b/po/sl.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\n"
"PO-Revision-Date: 2012-03-01 14:05+0100\n"
"Last-Translator: Klemen Košir <klemen.kosir@gmx.com>\n"
"Language-Team: Slovenian <translation-team-sl@lists.sourceforge.net>\n"
diff --git a/po/sq.gmo b/po/sq.gmo
index 76da38e..015b4e3 100644
--- a/po/sq.gmo
+++ b/po/sq.gmo
Binary files differ
diff --git a/po/sq.po b/po/sq.po
index 448c5fc..23eb6c9 100644
--- a/po/sq.po
+++ b/po/sq.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.8.4\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/sr.gmo b/po/sr.gmo
index c5c65d7..0e54450 100644
--- a/po/sr.gmo
+++ b/po/sr.gmo
Binary files differ
diff --git a/po/sr.po b/po/sr.po
index 4fffefe..3f7b15c 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer-0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\n"
"PO-Revision-Date: 2011-12-05 10:40+0200\n"
"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
"Language-Team: Serbian <gnu@prevod.org>\n"
diff --git a/po/sv.gmo b/po/sv.gmo
index 7cbeb8f..130daf5 100644
--- a/po/sv.gmo
+++ b/po/sv.gmo
Binary files differ
diff --git a/po/sv.po b/po/sv.po
index e0087d4..a744b25 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.31.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/tr.gmo b/po/tr.gmo
index 53a9529..35be958 100644
--- a/po/tr.gmo
+++ b/po/tr.gmo
Binary files differ
diff --git a/po/tr.po b/po/tr.po
index 999e65c..f4ed47a 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.8.0\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/uk.gmo b/po/uk.gmo
index 33d594c..2597c72 100644
--- a/po/uk.gmo
+++ b/po/uk.gmo
Binary files differ
diff --git a/po/uk.po b/po/uk.po
index a09a103..f59da01 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/vi.gmo b/po/vi.gmo
index 0be7025..2369279 100644
--- a/po/vi.gmo
+++ b/po/vi.gmo
Binary files differ
diff --git a/po/vi.po b/po/vi.po
index c85036b..fbc612f 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.29.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo
index 2faafa5..7ca7f55 100644
--- a/po/zh_CN.gmo
+++ b/po/zh_CN.gmo
Binary files differ
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 50144b2..a3105e5 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.25.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/po/zh_TW.gmo b/po/zh_TW.gmo
index 68e4d8d..ee285a2 100644
--- a/po/zh_TW.gmo
+++ b/po/zh_TW.gmo
Binary files differ
diff --git a/po/zh_TW.po b/po/zh_TW.po
index 3dd810a..ccce8cc 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gstreamer 0.8.8\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-10-07 12:26+0100\n"
+"POT-Creation-Date: 2012-10-24 13:55+0100\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"
diff --git a/tests/Makefile.in b/tests/Makefile.in
index ed1bbb3..d7fc3ca 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -80,7 +80,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -338,6 +338,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -374,6 +377,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/tests/benchmarks/Makefile.in b/tests/benchmarks/Makefile.in
index b7f3ff1..b8034a1 100644
--- a/tests/benchmarks/Makefile.in
+++ b/tests/benchmarks/Makefile.in
@@ -85,7 +85,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -375,6 +375,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -411,6 +414,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/tests/check/Makefile.in b/tests/check/Makefile.in
index 3f572df..2fcd657 100644
--- a/tests/check/Makefile.in
+++ b/tests/check/Makefile.in
@@ -104,7 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -969,6 +969,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -1005,6 +1008,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/tests/examples/Makefile.in b/tests/examples/Makefile.in
index a10532c..68eb34e 100644
--- a/tests/examples/Makefile.in
+++ b/tests/examples/Makefile.in
@@ -86,7 +86,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -344,6 +344,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -380,6 +383,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/tests/examples/adapter/Makefile.in b/tests/examples/adapter/Makefile.in
index 5f39a69..4a43b77 100644
--- a/tests/examples/adapter/Makefile.in
+++ b/tests/examples/adapter/Makefile.in
@@ -82,7 +82,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -335,6 +335,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -371,6 +374,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/tests/examples/controller/Makefile.in b/tests/examples/controller/Makefile.in
index 26737fa..d0629ae 100644
--- a/tests/examples/controller/Makefile.in
+++ b/tests/examples/controller/Makefile.in
@@ -83,7 +83,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -344,6 +344,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -380,6 +383,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/tests/examples/helloworld/Makefile.in b/tests/examples/helloworld/Makefile.in
index 4c5d16c..40db837 100644
--- a/tests/examples/helloworld/Makefile.in
+++ b/tests/examples/helloworld/Makefile.in
@@ -82,7 +82,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -334,6 +334,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -370,6 +373,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/tests/examples/launch/Makefile.in b/tests/examples/launch/Makefile.in
index 2f01e35..dbdff9a 100644
--- a/tests/examples/launch/Makefile.in
+++ b/tests/examples/launch/Makefile.in
@@ -82,7 +82,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -335,6 +335,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -371,6 +374,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/tests/examples/manual/Makefile.am b/tests/examples/manual/Makefile.am
index 6e79e67..30ac1b4 100644
--- a/tests/examples/manual/Makefile.am
+++ b/tests/examples/manual/Makefile.am
@@ -21,7 +21,6 @@ TESTS_ENVIRONMENT = \
EXTRA_DIST = extract.pl
EXAMPLES = \
- dynamic \
$(GNOME) \
elementcreate \
elementmake \
@@ -40,8 +39,12 @@ EXAMPLES = \
appsrc \
appsink \
dynformat \
+ effectswitch \
+ testrtpool \
+ norebuffer \
playbin \
- decodebin
+ decodebin \
+ playsink
BUILT_SOURCES = \
elementmake.c elementcreate.c elementget.c elementlink.c elementfactory.c \
@@ -51,13 +54,17 @@ BUILT_SOURCES = \
helloworld.c \
init.c \
query.c \
- typefind.c dynamic.c \
+ typefind.c \
blockprobe.c \
probe.c \
appsrc.c \
appsink.c \
dynformat.c \
- playbin.c decodebin.c
+ effectswitch.c \
+ testrtpool.c \
+ norebuffer.c \
+ playbin.c decodebin.c \
+ playsink.c
CLEANFILES = core core.* test-registry.* *.gcno *.gcda $(BUILT_SOURCES)
@@ -86,7 +93,7 @@ init.c: $(top_srcdir)/docs/manual/basics-init.xml
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
+typefind.c: $(top_srcdir)/docs/manual/advanced-autoplugging.xml
$(PERL_PATH) $(srcdir)/extract.pl $@ $<
blockprobe.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
@@ -104,7 +111,16 @@ appsink.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
dynformat.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
$(PERL_PATH) $(srcdir)/extract.pl $@ $<
-playbin.c decodebin.c: $(top_srcdir)/docs/manual/highlevel-components.xml
+effectswitch.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+norebuffer.c: $(top_srcdir)/docs/manual/advanced-buffering.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+playbin.c decodebin.c playsink.c: $(top_srcdir)/docs/manual/highlevel-playback.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+testrtpool.c: $(top_srcdir)/docs/manual/advanced-threads.xml
$(PERL_PATH) $(srcdir)/extract.pl $@ $<
TESTS = bin \
@@ -112,3 +128,6 @@ TESTS = bin \
ghostpad init
noinst_PROGRAMS = $(EXAMPLES)
+
+testrtpool_LDADD = $(GST_OBJ_LIBS) $(PTHREAD_LIBS)
+testrtpool_CFLAGS = $(GST_OBJ_CFLAGS) $(PTHREAD_CFLAGS)
diff --git a/tests/examples/manual/Makefile.in b/tests/examples/manual/Makefile.in
index 99b25f2..141598b 100644
--- a/tests/examples/manual/Makefile.in
+++ b/tests/examples/manual/Makefile.in
@@ -85,7 +85,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -101,14 +101,15 @@ 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) \
+am__EXEEXT_2 = $(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) \
blockprobe$(EXEEXT) probe$(EXEEXT) appsrc$(EXEEXT) \
- appsink$(EXEEXT) dynformat$(EXEEXT) playbin$(EXEEXT) \
- decodebin$(EXEEXT)
+ appsink$(EXEEXT) dynformat$(EXEEXT) effectswitch$(EXEEXT) \
+ testrtpool$(EXEEXT) norebuffer$(EXEEXT) playbin$(EXEEXT) \
+ decodebin$(EXEEXT) playsink$(EXEEXT)
PROGRAMS = $(noinst_PROGRAMS)
appsink_SOURCES = appsink.c
appsink_OBJECTS = appsink.$(OBJEXT)
@@ -144,18 +145,18 @@ decodebin_LDADD = $(LDADD)
decodebin_DEPENDENCIES = \
$(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
$(am__DEPENDENCIES_1)
-dynamic_SOURCES = dynamic.c
-dynamic_OBJECTS = dynamic.$(OBJEXT)
-dynamic_LDADD = $(LDADD)
-dynamic_DEPENDENCIES = \
- $(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
- $(am__DEPENDENCIES_1)
dynformat_SOURCES = dynformat.c
dynformat_OBJECTS = dynformat.$(OBJEXT)
dynformat_LDADD = $(LDADD)
dynformat_DEPENDENCIES = \
$(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
$(am__DEPENDENCIES_1)
+effectswitch_SOURCES = effectswitch.c
+effectswitch_OBJECTS = effectswitch.$(OBJEXT)
+effectswitch_LDADD = $(LDADD)
+effectswitch_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
+ $(am__DEPENDENCIES_1)
elementcreate_SOURCES = elementcreate.c
elementcreate_OBJECTS = elementcreate.$(OBJEXT)
elementcreate_LDADD = $(LDADD)
@@ -204,6 +205,12 @@ init_LDADD = $(LDADD)
init_DEPENDENCIES = \
$(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
$(am__DEPENDENCIES_1)
+norebuffer_SOURCES = norebuffer.c
+norebuffer_OBJECTS = norebuffer.$(OBJEXT)
+norebuffer_LDADD = $(LDADD)
+norebuffer_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
+ $(am__DEPENDENCIES_1)
pad_SOURCES = pad.c
pad_OBJECTS = pad.$(OBJEXT)
pad_LDADD = $(LDADD)
@@ -216,6 +223,12 @@ playbin_LDADD = $(LDADD)
playbin_DEPENDENCIES = \
$(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
$(am__DEPENDENCIES_1)
+playsink_SOURCES = playsink.c
+playsink_OBJECTS = playsink.$(OBJEXT)
+playsink_LDADD = $(LDADD)
+playsink_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
+ $(am__DEPENDENCIES_1)
probe_SOURCES = probe.c
probe_OBJECTS = probe.$(OBJEXT)
probe_LDADD = $(LDADD)
@@ -228,6 +241,12 @@ query_LDADD = $(LDADD)
query_DEPENDENCIES = \
$(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
$(am__DEPENDENCIES_1)
+testrtpool_SOURCES = testrtpool.c
+testrtpool_OBJECTS = testrtpool-testrtpool.$(OBJEXT)
+testrtpool_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+testrtpool_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(testrtpool_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
typefind_SOURCES = typefind.c
typefind_OBJECTS = typefind.$(OBJEXT)
typefind_LDADD = $(LDADD)
@@ -260,14 +279,16 @@ am__v_CCLD_0 = @echo " CCLD " $@;
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
am__v_GEN_0 = @echo " GEN " $@;
-SOURCES = appsink.c appsrc.c bin.c blockprobe.c decodebin.c dynamic.c \
- dynformat.c elementcreate.c elementfactory.c elementget.c \
- elementlink.c elementmake.c ghostpad.c helloworld.c init.c \
- pad.c playbin.c probe.c query.c typefind.c
+SOURCES = appsink.c appsrc.c bin.c blockprobe.c decodebin.c \
+ dynformat.c effectswitch.c elementcreate.c elementfactory.c \
+ elementget.c elementlink.c elementmake.c ghostpad.c \
+ helloworld.c init.c norebuffer.c pad.c playbin.c playsink.c \
+ probe.c query.c testrtpool.c typefind.c
DIST_SOURCES = appsink.c appsrc.c bin.c blockprobe.c decodebin.c \
- dynamic.c dynformat.c elementcreate.c elementfactory.c \
+ dynformat.c effectswitch.c elementcreate.c elementfactory.c \
elementget.c elementlink.c elementmake.c ghostpad.c \
- helloworld.c init.c pad.c playbin.c probe.c query.c typefind.c
+ helloworld.c init.c norebuffer.c pad.c playbin.c playsink.c \
+ probe.c query.c testrtpool.c typefind.c
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
@@ -468,6 +489,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -504,6 +528,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
@@ -574,7 +599,6 @@ TESTS_ENVIRONMENT = \
EXTRA_DIST = extract.pl
EXAMPLES = \
- dynamic \
$(GNOME) \
elementcreate \
elementmake \
@@ -593,8 +617,12 @@ EXAMPLES = \
appsrc \
appsink \
dynformat \
+ effectswitch \
+ testrtpool \
+ norebuffer \
playbin \
- decodebin
+ decodebin \
+ playsink
BUILT_SOURCES = \
elementmake.c elementcreate.c elementget.c elementlink.c elementfactory.c \
@@ -604,19 +632,25 @@ BUILT_SOURCES = \
helloworld.c \
init.c \
query.c \
- typefind.c dynamic.c \
+ typefind.c \
blockprobe.c \
probe.c \
appsrc.c \
appsink.c \
dynformat.c \
- playbin.c decodebin.c
+ effectswitch.c \
+ testrtpool.c \
+ norebuffer.c \
+ playbin.c decodebin.c \
+ playsink.c
CLEANFILES = core core.* test-registry.* *.gcno *.gcda $(BUILT_SOURCES)
AM_CFLAGS = $(GST_OBJ_CFLAGS)
LDADD = $(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
$(GST_OBJ_LIBS)
+testrtpool_LDADD = $(GST_OBJ_LIBS) $(PTHREAD_LIBS)
+testrtpool_CFLAGS = $(GST_OBJ_CFLAGS) $(PTHREAD_CFLAGS)
all: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) all-am
@@ -676,12 +710,12 @@ blockprobe$(EXEEXT): $(blockprobe_OBJECTS) $(blockprobe_DEPENDENCIES) $(EXTRA_bl
decodebin$(EXEEXT): $(decodebin_OBJECTS) $(decodebin_DEPENDENCIES) $(EXTRA_decodebin_DEPENDENCIES)
@rm -f decodebin$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(decodebin_OBJECTS) $(decodebin_LDADD) $(LIBS)
-dynamic$(EXEEXT): $(dynamic_OBJECTS) $(dynamic_DEPENDENCIES) $(EXTRA_dynamic_DEPENDENCIES)
- @rm -f dynamic$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(dynamic_OBJECTS) $(dynamic_LDADD) $(LIBS)
dynformat$(EXEEXT): $(dynformat_OBJECTS) $(dynformat_DEPENDENCIES) $(EXTRA_dynformat_DEPENDENCIES)
@rm -f dynformat$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(dynformat_OBJECTS) $(dynformat_LDADD) $(LIBS)
+effectswitch$(EXEEXT): $(effectswitch_OBJECTS) $(effectswitch_DEPENDENCIES) $(EXTRA_effectswitch_DEPENDENCIES)
+ @rm -f effectswitch$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(effectswitch_OBJECTS) $(effectswitch_LDADD) $(LIBS)
elementcreate$(EXEEXT): $(elementcreate_OBJECTS) $(elementcreate_DEPENDENCIES) $(EXTRA_elementcreate_DEPENDENCIES)
@rm -f elementcreate$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(elementcreate_OBJECTS) $(elementcreate_LDADD) $(LIBS)
@@ -706,18 +740,27 @@ helloworld$(EXEEXT): $(helloworld_OBJECTS) $(helloworld_DEPENDENCIES) $(EXTRA_he
init$(EXEEXT): $(init_OBJECTS) $(init_DEPENDENCIES) $(EXTRA_init_DEPENDENCIES)
@rm -f init$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(init_OBJECTS) $(init_LDADD) $(LIBS)
+norebuffer$(EXEEXT): $(norebuffer_OBJECTS) $(norebuffer_DEPENDENCIES) $(EXTRA_norebuffer_DEPENDENCIES)
+ @rm -f norebuffer$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(norebuffer_OBJECTS) $(norebuffer_LDADD) $(LIBS)
pad$(EXEEXT): $(pad_OBJECTS) $(pad_DEPENDENCIES) $(EXTRA_pad_DEPENDENCIES)
@rm -f pad$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(pad_OBJECTS) $(pad_LDADD) $(LIBS)
playbin$(EXEEXT): $(playbin_OBJECTS) $(playbin_DEPENDENCIES) $(EXTRA_playbin_DEPENDENCIES)
@rm -f playbin$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(playbin_OBJECTS) $(playbin_LDADD) $(LIBS)
+playsink$(EXEEXT): $(playsink_OBJECTS) $(playsink_DEPENDENCIES) $(EXTRA_playsink_DEPENDENCIES)
+ @rm -f playsink$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(playsink_OBJECTS) $(playsink_LDADD) $(LIBS)
probe$(EXEEXT): $(probe_OBJECTS) $(probe_DEPENDENCIES) $(EXTRA_probe_DEPENDENCIES)
@rm -f probe$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(probe_OBJECTS) $(probe_LDADD) $(LIBS)
query$(EXEEXT): $(query_OBJECTS) $(query_DEPENDENCIES) $(EXTRA_query_DEPENDENCIES)
@rm -f query$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(query_OBJECTS) $(query_LDADD) $(LIBS)
+testrtpool$(EXEEXT): $(testrtpool_OBJECTS) $(testrtpool_DEPENDENCIES) $(EXTRA_testrtpool_DEPENDENCIES)
+ @rm -f testrtpool$(EXEEXT)
+ $(AM_V_CCLD)$(testrtpool_LINK) $(testrtpool_OBJECTS) $(testrtpool_LDADD) $(LIBS)
typefind$(EXEEXT): $(typefind_OBJECTS) $(typefind_DEPENDENCIES) $(EXTRA_typefind_DEPENDENCIES)
@rm -f typefind$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(typefind_OBJECTS) $(typefind_LDADD) $(LIBS)
@@ -733,8 +776,8 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bin.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blockprobe.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)/dynformat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/effectswitch.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@
@@ -743,10 +786,13 @@ distclean-compile:
@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)/norebuffer.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)/playsink.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/probe.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/query.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testrtpool-testrtpool.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/typefind.Po@am__quote@
.c.o:
@@ -770,6 +816,20 @@ distclean-compile:
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+testrtpool-testrtpool.o: testrtpool.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testrtpool_CFLAGS) $(CFLAGS) -MT testrtpool-testrtpool.o -MD -MP -MF $(DEPDIR)/testrtpool-testrtpool.Tpo -c -o testrtpool-testrtpool.o `test -f 'testrtpool.c' || echo '$(srcdir)/'`testrtpool.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/testrtpool-testrtpool.Tpo $(DEPDIR)/testrtpool-testrtpool.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testrtpool.c' object='testrtpool-testrtpool.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testrtpool_CFLAGS) $(CFLAGS) -c -o testrtpool-testrtpool.o `test -f 'testrtpool.c' || echo '$(srcdir)/'`testrtpool.c
+
+testrtpool-testrtpool.obj: testrtpool.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testrtpool_CFLAGS) $(CFLAGS) -MT testrtpool-testrtpool.obj -MD -MP -MF $(DEPDIR)/testrtpool-testrtpool.Tpo -c -o testrtpool-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)/testrtpool-testrtpool.Tpo $(DEPDIR)/testrtpool-testrtpool.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='testrtpool.c' object='testrtpool-testrtpool.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testrtpool_CFLAGS) $(CFLAGS) -c -o testrtpool-testrtpool.obj `if test -f 'testrtpool.c'; then $(CYGPATH_W) 'testrtpool.c'; else $(CYGPATH_W) '$(srcdir)/testrtpool.c'; fi`
+
mostlyclean-libtool:
-rm -f *.lo
@@ -1099,7 +1159,7 @@ init.c: $(top_srcdir)/docs/manual/basics-init.xml
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
+typefind.c: $(top_srcdir)/docs/manual/advanced-autoplugging.xml
$(PERL_PATH) $(srcdir)/extract.pl $@ $<
blockprobe.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
@@ -1117,7 +1177,16 @@ appsink.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
dynformat.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
$(PERL_PATH) $(srcdir)/extract.pl $@ $<
-playbin.c decodebin.c: $(top_srcdir)/docs/manual/highlevel-components.xml
+effectswitch.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+norebuffer.c: $(top_srcdir)/docs/manual/advanced-buffering.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+playbin.c decodebin.c playsink.c: $(top_srcdir)/docs/manual/highlevel-playback.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+testrtpool.c: $(top_srcdir)/docs/manual/advanced-threads.xml
$(PERL_PATH) $(srcdir)/extract.pl $@ $<
# Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/tests/examples/manual/decodebin.c b/tests/examples/manual/decodebin.c
index 7985868..d18f2ad 100644
--- a/tests/examples/manual/decodebin.c
+++ b/tests/examples/manual/decodebin.c
@@ -1,8 +1,8 @@
-/*** block a from ../../../docs/manual/highlevel-components.xml ***/
+/*** block a from ../../../docs/manual/highlevel-playback.xml ***/
#include <gst/gst.h>
-/*** block b from ../../../docs/manual/highlevel-components.xml ***/
+/*** block b from ../../../docs/manual/highlevel-playback.xml ***/
static gboolean
my_bus_callback (GstBus *bus,
GstMessage *message,
@@ -36,7 +36,7 @@ my_bus_callback (GstBus *bus,
return TRUE;
}
-/*** block c from ../../../docs/manual/highlevel-components.xml ***/
+/*** block c from ../../../docs/manual/highlevel-playback.xml ***/
GstElement *pipeline, *audio;
static void
diff --git a/tests/examples/manual/dynamic.c b/tests/examples/manual/dynamic.c
deleted file mode 100644
index 355caa7..0000000
--- a/tests/examples/manual/dynamic.c
+++ /dev/null
@@ -1,330 +0,0 @@
-
-/*** 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_metadata (GST_ELEMENT_FACTORY (feature), GST_ELEMENT_METADATA_KLASS);
- 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 (),
- (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, GstCaps *caps);
-
-static GstElement *audiosink;
-
-static void
-cb_newpad (GstElement *element,
- GstPad *pad,
- gpointer data)
-{
- GstCaps *caps;
-
- caps = gst_pad_query_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_query_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,
- GstCaps *caps)
-{
- GstObject *parent = GST_OBJECT (GST_OBJECT_PARENT (pad));
- const gchar *media;
- 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 */
- media = gst_structure_get_name (gst_caps_get_structure (caps, 0));
- if (g_strrstr (media, "video")) {
- g_print ("Omitting link for pad %s:%s because media type %s is non-audio\n",
- GST_OBJECT_NAME (parent), GST_OBJECT_NAME (pad), media);
- return;
- }
-
- /* can it link to the audiopad? */
- audiocaps = gst_pad_query_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",
- media, 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/effectswitch.c b/tests/examples/manual/effectswitch.c
new file mode 100644
index 0000000..5cba9c0
--- /dev/null
+++ b/tests/examples/manual/effectswitch.c
@@ -0,0 +1,192 @@
+
+/*** block from ../../../docs/manual/advanced-dataaccess.xml ***/
+#include <gst/gst.h>
+
+static gchar *opt_effects = NULL;
+
+#define DEFAULT_EFFECTS "identity,exclusion,navigationtest," \
+ "agingtv,videoflip,vertigotv,gaussianblur,shagadelictv,edgetv"
+
+static GstPad *blockpad;
+static GstElement *conv_before;
+static GstElement *conv_after;
+static GstElement *cur_effect;
+static GstElement *pipeline;
+
+static GQueue effects = G_QUEUE_INIT;
+
+static GstPadProbeReturn
+event_probe_cb (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
+{
+ GMainLoop *loop = user_data;
+ GstElement *next;
+
+ if (GST_EVENT_TYPE (GST_PAD_PROBE_INFO_DATA (info)) != GST_EVENT_EOS)
+ return GST_PAD_PROBE_OK;
+
+ gst_pad_remove_probe (pad, GST_PAD_PROBE_INFO_ID (info));
+
+ /* push current event back into the queue */
+ g_queue_push_tail (&effects, gst_object_ref (cur_effect));
+ /* take next effect from the queue */
+ next = g_queue_pop_head (&effects);
+ if (next == NULL) {
+ GST_DEBUG_OBJECT (pad, "no more effects");
+ g_main_loop_quit (loop);
+ return GST_PAD_PROBE_DROP;
+ }
+
+ g_print ("Switching from '%s' to '%s'..\n", GST_OBJECT_NAME (cur_effect),
+ GST_OBJECT_NAME (next));
+
+ gst_element_set_state (cur_effect, GST_STATE_NULL);
+
+ /* remove unlinks automatically */
+ GST_DEBUG_OBJECT (pipeline, "removing %" GST_PTR_FORMAT, cur_effect);
+ gst_bin_remove (GST_BIN (pipeline), cur_effect);
+
+ GST_DEBUG_OBJECT (pipeline, "adding %" GST_PTR_FORMAT, next);
+ gst_bin_add (GST_BIN (pipeline), next);
+
+ GST_DEBUG_OBJECT (pipeline, "linking..");
+ gst_element_link_many (conv_before, next, conv_after, NULL);
+
+ gst_element_set_state (next, GST_STATE_PLAYING);
+
+ cur_effect = next;
+ GST_DEBUG_OBJECT (pipeline, "done");
+
+ return GST_PAD_PROBE_DROP;
+}
+
+static GstPadProbeReturn
+pad_probe_cb (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
+{
+ GstPad *srcpad, *sinkpad;
+
+ GST_DEBUG_OBJECT (pad, "pad is blocked now");
+
+ /* remove the probe first */
+ gst_pad_remove_probe (pad, GST_PAD_PROBE_INFO_ID (info));
+
+ /* install new probe for EOS */
+ srcpad = gst_element_get_static_pad (cur_effect, "src");
+ gst_pad_add_probe (srcpad, GST_PAD_PROBE_TYPE_BLOCK |
+ GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, event_probe_cb, user_data, NULL);
+ gst_object_unref (srcpad);
+
+ /* push EOS into the element, the probe will be fired when the
+ * EOS leaves the effect and it has thus drained all of its data */
+ sinkpad = gst_element_get_static_pad (cur_effect, "sink");
+ gst_pad_send_event (sinkpad, gst_event_new_eos ());
+ gst_object_unref (sinkpad);
+
+ return GST_PAD_PROBE_OK;
+}
+
+static gboolean
+timeout_cb (gpointer user_data)
+{
+ gst_pad_add_probe (blockpad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
+ pad_probe_cb, user_data, NULL);
+
+ return TRUE;
+}
+
+static gboolean
+bus_cb (GstBus * bus, GstMessage * msg, gpointer user_data)
+{
+ GMainLoop *loop = user_data;
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_ERROR:{
+ GError *err = NULL;
+ gchar *dbg;
+
+ gst_message_parse_error (msg, &err, &dbg);
+ gst_object_default_error (msg->src, err, dbg);
+ g_error_free (err);
+ g_free (dbg);
+ g_main_loop_quit (loop);
+ break;
+ }
+ default:
+ break;
+ }
+ return TRUE;
+}
+
+int
+main (int argc, char **argv)
+{
+ GOptionEntry options[] = {
+ {"effects", 'e', 0, G_OPTION_ARG_STRING, &opt_effects,
+ "Effects to use (comma-separated list of element names)", NULL},
+ {NULL}
+ };
+ GOptionContext *ctx;
+ GError *err = NULL;
+ GMainLoop *loop;
+ GstElement *src, *sink;
+ gchar **effect_names, **e;
+
+ ctx = g_option_context_new ("");
+ g_option_context_add_main_entries (ctx, options, NULL);
+ g_option_context_add_group (ctx, gst_init_get_option_group ());
+ if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
+ g_print ("Error initializing: %s\n", err->message);
+ return 1;
+ }
+ g_option_context_free (ctx);
+
+ if (opt_effects != NULL)
+ effect_names = g_strsplit (opt_effects, ",", -1);
+ else
+ effect_names = g_strsplit (DEFAULT_EFFECTS, ",", -1);
+
+ for (e = effect_names; e != NULL && *e != NULL; ++e) {
+ GstElement *el;
+
+ el = gst_element_factory_make (*e, NULL);
+ if (el) {
+ g_print ("Adding effect '%s'\n", *e);
+ g_queue_push_tail (&effects, el);
+ }
+ }
+
+ pipeline = gst_pipeline_new ("pipeline");
+
+ src = gst_element_factory_make ("videotestsrc", NULL);
+ g_object_set (src, "is-live", TRUE, NULL);
+
+ blockpad = gst_element_get_static_pad (src, "src");
+
+ conv_before = gst_element_factory_make ("videoconvert", NULL);
+
+ cur_effect = g_queue_pop_head (&effects);
+
+ conv_after = gst_element_factory_make ("videoconvert", NULL);
+
+ sink = gst_element_factory_make ("ximagesink", NULL);
+
+ gst_bin_add_many (GST_BIN (pipeline), src, conv_before, cur_effect,
+ conv_after, sink, NULL);
+
+ gst_element_link_many (src, conv_before, cur_effect, conv_after,
+ sink, NULL);
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+ gst_bus_add_watch (GST_ELEMENT_BUS (pipeline), bus_cb, loop);
+
+ g_timeout_add_seconds (1, timeout_cb, loop);
+
+ g_main_loop_run (loop);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ return 0;
+}
diff --git a/tests/examples/manual/norebuffer.c b/tests/examples/manual/norebuffer.c
new file mode 100644
index 0000000..67db10f
--- /dev/null
+++ b/tests/examples/manual/norebuffer.c
@@ -0,0 +1,153 @@
+
+/*** block a from ../../../docs/manual/advanced-buffering.xml ***/
+#include <gst/gst.h>
+
+GstState target_state;
+static gboolean is_live;
+static gboolean is_buffering;
+
+static gboolean
+buffer_timeout (gpointer data)
+{
+ GstElement *pipeline = data;
+ GstQuery *query;
+ gboolean busy;
+ gint percent;
+ gint64 estimated_total;
+ gint64 position, duration;
+ guint64 play_left;
+
+ query = gst_query_new_buffering (GST_FORMAT_TIME);
+
+ if (!gst_element_query (pipeline, query))
+ return TRUE;
+
+ gst_query_parse_buffering_percent (query, &busy, &percent);
+ gst_query_parse_buffering_range (query, NULL, NULL, NULL, &estimated_total);
+
+ if (estimated_total == -1)
+ estimated_total = 0;
+
+ /* calculate the remaining playback time */
+ if (!gst_element_query_position (pipeline, GST_FORMAT_TIME, &position))
+ position = -1;
+ if (!gst_element_query_duration (pipeline, GST_FORMAT_TIME, &duration))
+ duration = -1;
+
+ if (duration != -1 && position != -1)
+ play_left = GST_TIME_AS_MSECONDS (duration - position);
+ else
+ play_left = 0;
+
+ g_message ("play_left %" G_GUINT64_FORMAT", estimated_total %" G_GUINT64_FORMAT
+ ", percent %d", play_left, estimated_total, percent);
+
+ /* we are buffering or the estimated download time is bigger than the
+ * remaining playback time. We keep buffering. */
+ is_buffering = (busy || estimated_total * 1.1 > play_left);
+
+ if (!is_buffering)
+ gst_element_set_state (pipeline, target_state);
+
+ return is_buffering;
+}
+
+static void
+on_message_buffering (GstBus *bus, GstMessage *message, gpointer user_data)
+{
+ GstElement *pipeline = user_data;
+ gint percent;
+
+ /* no state management needed for live pipelines */
+ if (is_live)
+ return;
+
+ gst_message_parse_buffering (message, &percent);
+
+ if (percent < 100) {
+ /* buffering busy */
+ if (is_buffering == FALSE) {
+ is_buffering = TRUE;
+ if (target_state == GST_STATE_PLAYING) {
+ /* we were not buffering but PLAYING, PAUSE the pipeline. */
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ }
+ }
+ }
+}
+
+static void
+on_message_async_done (GstBus *bus, GstMessage *message, gpointer user_data)
+{
+ GstElement *pipeline = user_data;
+
+ if (is_buffering == FALSE)
+ gst_element_set_state (pipeline, target_state);
+ else
+ g_timeout_add (500, buffer_timeout, pipeline);
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GstElement *pipeline;
+ GMainLoop *loop;
+ GstBus *bus;
+ GstStateChangeReturn ret;
+
+ /* 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 */
+ pipeline = gst_element_factory_make ("playbin", "pipeline");
+ g_object_set (G_OBJECT (pipeline), "uri", argv[1], NULL);
+ g_object_set (G_OBJECT (pipeline), "flags", 0x697 , NULL);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_signal_watch (bus);
+
+ g_signal_connect (bus, "message::buffering",
+ (GCallback) on_message_buffering, pipeline);
+ g_signal_connect (bus, "message::async-done",
+ (GCallback) on_message_async_done, pipeline);
+ gst_object_unref (bus);
+
+ is_buffering = FALSE;
+ target_state = GST_STATE_PLAYING;
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+
+ switch (ret) {
+ case GST_STATE_CHANGE_SUCCESS:
+ is_live = FALSE;
+ break;
+
+ case GST_STATE_CHANGE_FAILURE:
+ g_warning ("failed to PAUSE");
+ return -1;
+
+ case GST_STATE_CHANGE_NO_PREROLL:
+ is_live = TRUE;
+ break;
+
+ default:
+ break;
+ }
+
+ /* now run */
+ g_main_loop_run (loop);
+
+ /* also clean up */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (pipeline));
+ g_main_loop_unref (loop);
+
+ return 0;
+}
diff --git a/tests/examples/manual/playbin.c b/tests/examples/manual/playbin.c
index 868b586..3534af3 100644
--- a/tests/examples/manual/playbin.c
+++ b/tests/examples/manual/playbin.c
@@ -1,8 +1,8 @@
-/*** block a from ../../../docs/manual/highlevel-components.xml ***/
+/*** block a from ../../../docs/manual/highlevel-playback.xml ***/
#include <gst/gst.h>
-/*** block b from ../../../docs/manual/highlevel-components.xml ***/
+/*** block b from ../../../docs/manual/highlevel-playback.xml ***/
static gboolean
my_bus_callback (GstBus *bus,
GstMessage *message,
@@ -36,7 +36,7 @@ my_bus_callback (GstBus *bus,
return TRUE;
}
-/*** block c from ../../../docs/manual/highlevel-components.xml ***/
+/*** block c from ../../../docs/manual/highlevel-playback.xml ***/
gint
main (gint argc,
gchar *argv[])
diff --git a/tests/examples/manual/playsink.c b/tests/examples/manual/playsink.c
new file mode 100644
index 0000000..b469ec2
--- /dev/null
+++ b/tests/examples/manual/playsink.c
@@ -0,0 +1,126 @@
+
+/*** block a from ../../../docs/manual/highlevel-playback.xml ***/
+#include <gst/gst.h>
+
+/*** block b from ../../../docs/manual/highlevel-playback.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-playback.xml ***/
+GstElement *pipeline, *sink;
+
+static void
+cb_pad_added (GstElement *dec,
+ GstPad *pad,
+ gpointer data)
+{
+ GstCaps *caps;
+ GstStructure *str;
+ const gchar *name;
+ GstPadTemplate *templ;
+ GstElementClass *klass;
+
+ /* check media type */
+ caps = gst_pad_query_caps (pad, NULL);
+ str = gst_caps_get_structure (caps, 0);
+ name = gst_structure_get_name (str);
+
+ klass = GST_ELEMENT_GET_CLASS (sink);
+
+ if (g_str_has_prefix (name, "audio")) {
+ templ = gst_element_class_get_pad_template (klass, "audio_sink");
+ } else if (g_str_has_prefix (name, "video")) {
+ templ = gst_element_class_get_pad_template (klass, "video_sink");
+ } else if (g_str_has_prefix (name, "text")) {
+ templ = gst_element_class_get_pad_template (klass, "text_sink");
+ } else {
+ templ = NULL;
+ }
+
+ if (templ) {
+ GstPad *sinkpad;
+
+ sinkpad = gst_element_request_pad (sink, templ, NULL, NULL);
+
+ if (!gst_pad_is_linked (sinkpad))
+ gst_pad_link (pad, sinkpad);
+
+ gst_object_unref (sinkpad);
+ }
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GMainLoop *loop;
+ GstElement *dec;
+ 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 <uri>\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);
+
+ dec = gst_element_factory_make ("uridecodebin", "source");
+ g_object_set (G_OBJECT (dec), "uri", argv[1], NULL);
+ g_signal_connect (dec, "pad-added", G_CALLBACK (cb_pad_added), NULL);
+
+ /* create audio output */
+ sink = gst_element_factory_make ("playsink", "sink");
+ gst_util_set_object_arg (G_OBJECT (sink), "flags",
+ "soft-colorbalance+soft-volume+vis+text+audio+video");
+ gst_bin_add_many (GST_BIN (pipeline), dec, sink, NULL);
+
+ /* 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/testrtpool.c b/tests/examples/manual/testrtpool.c
new file mode 100644
index 0000000..793969a
--- /dev/null
+++ b/tests/examples/manual/testrtpool.c
@@ -0,0 +1,235 @@
+
+/*** block a from ../../../docs/manual/advanced-threads.xml ***/
+#include <gst/gst.h>
+
+#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);
+
+
+/*** block b from ../../../docs/manual/advanced-threads.xml ***/
+#include <pthread.h>
+
+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 */
+}
+
+static void
+default_cleanup (GstTaskPool * 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;
+
+ tid = g_slice_new0 (TestRTId);
+
+ pthread_attr_init (&attr);
+ if ((res = pthread_attr_setschedpolicy (&attr, SCHED_RR)) != 0)
+ g_warning ("setschedpolicy: failure: %p", g_strerror (res));
+
+ param.sched_priority = 50;
+ if ((res = pthread_attr_setschedparam (&attr, &param)) != 0)
+ g_warning ("setschedparam: failure: %p", g_strerror (res));
+
+ if ((res = pthread_attr_setinheritsched (&attr, PTHREAD_EXPLICIT_SCHED)) != 0)
+ g_warning ("setinheritsched: failure: %p", g_strerror (res));
+
+ 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;
+
+ pthread_join (tid->thread, NULL);
+
+ g_slice_free (TestRTId, tid);
+}
+
+static void
+test_rt_pool_class_init (TestRTPoolClass * klass)
+{
+ GstTaskPoolClass *gsttaskpool_class;
+
+ gsttaskpool_class = (GstTaskPoolClass *) klass;
+
+ 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)
+{
+}
+
+GstTaskPool *
+test_rt_pool_new (void)
+{
+ GstTaskPool *pool;
+
+ pool = g_object_new (TEST_TYPE_RT_POOL, NULL);
+
+ return pool;
+}
+
+/*** block c from ../../../docs/manual/advanced-threads.xml ***/
+static GMainLoop* loop;
+
+static void
+on_stream_status (GstBus *bus,
+ GstMessage *message,
+ gpointer user_data)
+{
+ GstStreamStatusType type;
+ GstElement *owner;
+ const GValue *val;
+ GstTask *task = NULL;
+
+ gst_message_parse_stream_status (message, &type, &owner);
+
+ val = gst_message_get_stream_status_object (message);
+
+ /* 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) {
+ GstTaskPool *pool;
+
+ pool = test_rt_pool_new();
+
+ gst_task_set_pool (task, pool);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+on_error (GstBus *bus,
+ GstMessage *message,
+ gpointer user_data)
+{
+ g_message ("received ERROR");
+ g_main_loop_quit (loop);
+}
+
+static void
+on_eos (GstBus *bus,
+ GstMessage *message,
+ gpointer user_data)
+{
+ g_main_loop_quit (loop);
+}
+
+int
+main (int argc, char *argv[])
+{
+ GstElement *bin, *fakesrc, *fakesink;
+ GstBus *bus;
+ GstStateChangeReturn ret;
+
+ 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);
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* get the bus, we need to install a sync handler */
+ bus = gst_pipeline_get_bus (GST_PIPELINE (bin));
+ gst_bus_enable_sync_message_emission (bus);
+ gst_bus_add_signal_watch (bus);
+
+ g_signal_connect (bus, "sync-message::stream-status",
+ (GCallback) on_stream_status, NULL);
+ g_signal_connect (bus, "message::error",
+ (GCallback) on_error, NULL);
+ g_signal_connect (bus, "message::eos",
+ (GCallback) on_eos, NULL);
+
+ /* start playing */
+ ret = gst_element_set_state (bin, GST_STATE_PLAYING);
+ if (ret != GST_STATE_CHANGE_SUCCESS) {
+ g_message ("failed to change state");
+ return -1;
+ }
+
+ /* Run event loop listening for bus messages until EOS or ERROR */
+ g_main_loop_run (loop);
+
+ /* stop the bin */
+ gst_element_set_state (bin, GST_STATE_NULL);
+ gst_object_unref (bus);
+ g_main_loop_unref (loop);
+
+ return 0;
+}
diff --git a/tests/examples/memory/Makefile.in b/tests/examples/memory/Makefile.in
index b36358b..7fdcb61 100644
--- a/tests/examples/memory/Makefile.in
+++ b/tests/examples/memory/Makefile.in
@@ -82,7 +82,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -336,6 +336,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -372,6 +375,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/tests/examples/metadata/Makefile.in b/tests/examples/metadata/Makefile.in
index a3cb815..549cb8b 100644
--- a/tests/examples/metadata/Makefile.in
+++ b/tests/examples/metadata/Makefile.in
@@ -82,7 +82,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -334,6 +334,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -370,6 +373,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/tests/examples/queue/Makefile.in b/tests/examples/queue/Makefile.in
index d4bb1d6..0d2a400 100644
--- a/tests/examples/queue/Makefile.in
+++ b/tests/examples/queue/Makefile.in
@@ -82,7 +82,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -334,6 +334,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -370,6 +373,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/tests/examples/stepping/Makefile.in b/tests/examples/stepping/Makefile.in
index 5e5057a..92f76b3 100644
--- a/tests/examples/stepping/Makefile.in
+++ b/tests/examples/stepping/Makefile.in
@@ -82,7 +82,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -334,6 +334,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -370,6 +373,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/tests/examples/streams/Makefile.am b/tests/examples/streams/Makefile.am
index 910df0a..e1f87ac 100644
--- a/tests/examples/streams/Makefile.am
+++ b/tests/examples/streams/Makefile.am
@@ -1,5 +1,5 @@
noinst_PROGRAMS = stream-status
-if HAVE_PTHREAD_H
+if HAVE_PTHREAD
noinst_PROGRAMS += rtpool-test
endif
@@ -8,7 +8,7 @@ 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)
+rtpool_test_LDADD = $(GST_OBJ_LIBS) $(PTHREAD_LIBS)
+rtpool_test_CFLAGS = $(GST_OBJ_CFLAGS) $(PTHREAD_CFLAGS)
EXTRA_DIST = rtpool-test.c testrtpool.h testrtpool.c
diff --git a/tests/examples/streams/Makefile.in b/tests/examples/streams/Makefile.in
index 0d76343..2d183e5 100644
--- a/tests/examples/streams/Makefile.in
+++ b/tests/examples/streams/Makefile.in
@@ -53,7 +53,7 @@ build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
noinst_PROGRAMS = stream-status$(EXEEXT) $(am__EXEEXT_1)
-@HAVE_PTHREAD_H_TRUE@am__append_1 = rtpool-test
+@HAVE_PTHREAD_TRUE@am__append_1 = rtpool-test
subdir = tests/examples/streams
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -83,7 +83,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -98,13 +98,13 @@ 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)
+@HAVE_PTHREAD_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)
+rtpool_test_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
am__v_lt_0 = --silent
@@ -343,6 +343,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -379,6 +382,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
@@ -432,8 +436,8 @@ 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)
+rtpool_test_LDADD = $(GST_OBJ_LIBS) $(PTHREAD_LIBS)
+rtpool_test_CFLAGS = $(GST_OBJ_CFLAGS) $(PTHREAD_CFLAGS)
EXTRA_DIST = rtpool-test.c testrtpool.h testrtpool.c
all: all-am
diff --git a/tests/examples/typefind/Makefile.in b/tests/examples/typefind/Makefile.in
index 0858fd9..58fb158 100644
--- a/tests/examples/typefind/Makefile.in
+++ b/tests/examples/typefind/Makefile.in
@@ -82,7 +82,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -334,6 +334,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -370,6 +373,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/tests/misc/Makefile.in b/tests/misc/Makefile.in
index 5888927..cfe94f5 100644
--- a/tests/misc/Makefile.in
+++ b/tests/misc/Makefile.in
@@ -80,7 +80,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -299,6 +299,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -335,6 +338,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/tools/Makefile.in b/tools/Makefile.in
index a6495d9..5bc7dc4 100644
--- a/tools/Makefile.in
+++ b/tools/Makefile.in
@@ -88,7 +88,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.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)/common/m4/pkg.m4 $(top_srcdir)/m4/ax_pthread.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 \
@@ -400,6 +400,9 @@ PKG_CONFIG = @PKG_CONFIG@
PLUGINDIR = @PLUGINDIR@
POSUB = @POSUB@
PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
PYTHON = @PYTHON@
PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
PYTHON_PLATFORM = @PYTHON_PLATFORM@
@@ -436,6 +439,7 @@ am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
diff --git a/win32/common/config.h b/win32/common/config.h
index 674353d..62d46d1 100644
--- a/win32/common/config.h
+++ b/win32/common/config.h
@@ -62,7 +62,7 @@
#define GST_PACKAGE_ORIGIN "Unknown package origin"
/* GStreamer package release date/time for plugins as YYYY-MM-DD */
-#define GST_PACKAGE_RELEASE_DATETIME "2012-10-07"
+#define GST_PACKAGE_RELEASE_DATETIME "2012-10-24"
/* location of the installed gst-plugin-scanner */
#define GST_PLUGIN_SCANNER_INSTALLED LIBDIR "\\gst-plugin-scanner"
@@ -211,8 +211,11 @@
/* 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 you have POSIX threads libraries and header files. */
+#undef HAVE_PTHREAD
+
+/* Have PTHREAD_PRIO_INHERIT. */
+#undef HAVE_PTHREAD_PRIO_INHERIT
/* Define if RDTSC is available */
#undef HAVE_RDTSC
@@ -337,7 +340,7 @@
#define PACKAGE_NAME "GStreamer"
/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "GStreamer 1.0.1"
+#define PACKAGE_STRING "GStreamer 1.0.2"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "gstreamer"
@@ -346,7 +349,7 @@
#undef PACKAGE_URL
/* Define to the version of this package. */
-#define PACKAGE_VERSION "1.0.1"
+#define PACKAGE_VERSION "1.0.2"
/* directory where plugins are located */
#ifdef _DEBUG
@@ -355,6 +358,10 @@
# define PLUGINDIR PREFIX "\\lib\\gstreamer-1.0"
#endif
+/* Define to necessary symbol if this constant uses a non-standard name on
+ your system. */
+#undef PTHREAD_CREATE_JOINABLE
+
/* The size of `char', as computed by sizeof. */
#undef SIZEOF_CHAR
@@ -380,7 +387,7 @@
#undef USE_POISONING
/* Version number of package */
-#define VERSION "1.0.1"
+#define VERSION "1.0.2"
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
significant byte first (like Motorola and SPARC, unlike Intel). */
diff --git a/win32/common/gstversion.h b/win32/common/gstversion.h
index 0c9f112..432a3d2 100644
--- a/win32/common/gstversion.h
+++ b/win32/common/gstversion.h
@@ -57,7 +57,7 @@ G_BEGIN_DECLS
*
* The micro version of GStreamer at compile time:
*/
-#define GST_VERSION_MICRO (1)
+#define GST_VERSION_MICRO (2)
/**
* GST_VERSION_NANO:
*