+=== 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 13:10:33 +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/gstenumtypes.c:
+ * win32/common/gstversion.h:
+ Release 1.0.1
+
+2012-10-07 00:15:49 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * tests/check/gst/struct_i386.h:
+ * tests/check/libs/struct_i386.h:
+ tests: update struct_i386.h for ABI checks
+ Fixes make check on 32-bit x86.
+
+2012-10-06 17:26:21 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * tests/check/gst/struct_ppc32.h:
+ * tests/check/libs/struct_ppc32.h:
+ tests: update struct_ppc32.h for ABI checks
+ Fixes make check on 32-bit PowerPC.
+
+2012-10-06 14:55:35 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * common:
+ Automatic update of common submodule
+ From 6c0b52c to 6bb6951
+
+2012-10-06 12:08:34 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * tests/examples/manual/.gitignore:
+ examples: .gitignore more binaries from the manual
+
+2012-10-05 16:04:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/Makefile.am:
+ * docs/design/part-block.txt:
+ * docs/design/part-probes.txt:
+ docs: remove obsolete part-block document
+ Merge the part-block document into part-probes
+
+2012-10-05 09:42:59 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: resend dropped events
+ If we try to push sticky events but a probe dropped them, we don't mark
+ the event as received and mark the pad as PENDING_EVENTS. This ensures
+ that we resend the event the next time. For this we need to let the
+ custom flow return from the probe trickle up to
+ gst_pad_push_event_unchecked() so that we can differentiate between
+ OK and DROPPED probe returns.
+
+2012-10-05 07:14:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: don't store sticky events on flushing/EOS pads
+ Don't store sticky events on flushing or EOS pads. This was done
+ correctly for source pads but not for sink pads.
+
+2012-10-04 11:24:09 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * docs/libs/gstreamer-libs-sections.txt:
+ * libs/gst/base/gstbasetransform.c:
+ * win32/common/libgstbase.def:
+ docs: add Since markers for new API and add it to docs and .def file
+
+2012-10-04 11:50:58 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/advanced-dataaccess.xml:
+ * tests/examples/manual/Makefile.am:
+ manual: add dynamic capsfilter example
+
+2012-10-04 11:18:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gstcapsfilter.c:
+ capsfilter: don't prefer passthrough
+ Basetransform should not try to negotiate in passthrough mode but
+ respect the order of what we return in the transform_caps method.
+ A typical case is that you specify some specific new caps in the
+ caps property but also allow the current caps to pass.
+
+2012-10-04 11:15:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ * libs/gst/base/gstbasetransform.h:
+ basetrans: add an option to prefer passthrough
+ Basetransform attempts to do passthrough mode regardless of the order of
+ the transform_caps method. Add a method to disable this.
+ This is needed for elements like capsfilter that want to transform caps
+ based on the order of the caps property.
+
+2012-10-04 10:01:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetrans: improve some comments
+
+2012-10-03 17:17:02 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/advanced-autoplugging.xml:
+ * docs/manual/advanced-dataaccess.xml:
+ manual: talk some more about dynamic pipelines
+
+2012-10-03 13:49:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmeta.c:
+ meta: don't put essential logic in g_return_val_*
+
+2012-10-03 13:45:22 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/advanced-allocation.xml:
+ * libs/gst/net/gstnetaddressmeta.c:
+ * tests/check/gst/gstmeta.c:
+ meta: do metadata registration threadsafe
+ We need to use g_once to register the metadata implementations
+ only once.
+ See https://bugzilla.gnome.org/show_bug.cgi?id=685332
+
+2012-10-03 13:35:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstmeta.c:
+ meta: handle multiple implementation registration
+ First check that we can actually register the implementation before
+ making a GstMetaInfo. If we can't register we would otherwise end
+ up with an undefined type and an invalid GstMetaInfo.
+ It's possible that type registration fails because another metadata
+ with the same implementation name was already registered.
+
+2012-10-03 13:12:44 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/advanced-dataaccess.xml:
+ manual: use CDATA for code blocks
+ then we don't have to escape special token anymore.
+
+2012-10-03 13:09:00 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/advanced-dataaccess.xml:
+ * tests/examples/manual/Makefile.am:
+ manual: add partial preroll example with probes
+
+2012-10-03 10:53:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/advanced-dataaccess.xml:
+ manual: add more stuff about probes
+
+2012-10-02 17:23:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/advanced-dataaccess.xml:
+ manual: start talking about dynamic pipeline changes
+
+2012-10-02 16:47:05 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/advanced-dataaccess.xml:
+ manual: move section around
+
+2012-10-02 16:44:28 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/advanced-dataaccess.xml:
+ * tests/examples/manual/Makefile.am:
+ pwg: add appsink docs
+
+2012-10-02 16:15:19 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/advanced-dataaccess.xml:
+ * tests/examples/manual/Makefile.am:
+ pwg: rewite data-access chapter
+ Rewrite the data-access chapter so that we talk about appsrc instead
+ of the fakesrc hacks.
+
+2012-10-02 13:22:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/draft-klass.txt:
+ * docs/manual/advanced-dataaccess.xml:
+ * docs/manual/advanced-metadata.xml:
+ * docs/manual/appendix-integration.xml:
+ * gst/gstpreset.c:
+ * po/README:
+ * tools/gst-plot-timeline.py:
+ docs: some 0.10 -> 1.0 changes
+
+2012-10-02 13:12:39 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/advanced-allocation.xml:
+ pwg: add allocation query example
+
+2012-10-02 12:49:17 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/advanced-allocation.xml:
+ pwg: add bufferpool docs
+
+2012-10-02 11:34:47 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/appendix-programs.xml:
+ * docs/manual/manual.xml:
+ * docs/pwg/advanced-allocation.xml:
+ pwg: flesh out allocation docs
+ Add more examples.
+ Add example for implementing new metadata.
+ Add programs to the docs (again?), it seems to contain useful info.
+
+2012-10-01 16:59:41 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/titlepage.xml:
+ pwg: add new author
+
+2012-10-01 16:55:55 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/advanced-allocation.xml:
+ pwg: add allocation docs
+
+2012-10-01 16:46:03 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-buffer.txt:
+ * docs/design/part-bufferpool.txt:
+ * docs/design/part-meta.txt:
+ docs: update design docs
+
+2012-10-01 13:28:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-bufferpool.txt:
+ * docs/design/part-memory.txt:
+ * docs/pwg/advanced-allocation.xml:
+ * docs/pwg/pwg.xml:
+ docs: more docs fixes
+ Fix allocator design doc
+ Add beginning of allocation chapter in the pwg
+
+2012-10-01 11:47:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/appendix-checklist.xml:
+ * docs/pwg/appendix-porting.xml:
+ * docs/pwg/other-manager.xml:
+ * docs/pwg/other-ntoone.xml:
+ pwg: final cleanups for 1.0
+
+2012-10-01 11:24:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/advanced-events.xml:
+ * docs/pwg/other-base.xml:
+ pwg: fix events and base classes
+
+2012-10-01 10:40:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/advanced-tagging.xml:
+ pwg: fixup tag docs
+
+2012-10-01 09:48:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/advanced-interfaces.xml:
+ pwg: patch up the section about interfaces
+
+2012-09-30 04:05:36 +1000 Jan Schmidt <thaytan@noraisin.net>
+
+ * libs/gst/base/gstbasesrc.c:
+ basesrc: Fix seamless segment function
+ The 3rd parameter of gst_base_src_new_seamless_segment in
+ 0.10 is the time associated with the start of the new segment,
+ not the position in the new segment. Fix the name of the parameter,
+ the docs, and the implementation to match the needs of the only
+ extant consumer: DVD playback.
+
+2012-09-29 14:35:58 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gstvalue.c:
+ * tests/check/gst/gstcaps.c:
+ value: avoid duplicates when intersecting lists
+ Fixes negotiation taking a ridiculous amount of
+ time (multiple 10s of seconds on a core2) when
+ there are duplicate entries in lists.
+ Could have a negative performance impact on other
+ scenarios because we now have to iterate the
+ dest list to avoid duplicates, but we don't
+ have a lot of lists any more these days, and
+ they tend to be small anyway. The negatives
+ are hopefully countered by the positive effects
+ of reducing the list length early on in the
+ process. And in any case, it's the right thing
+ to do.
+ Based on patch by Andre Moreira Magalhaes.
+ https://bugzilla.gnome.org/show_bug.cgi?id=684981
+
+2012-09-29 00:27:03 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * docs/pwg/building-boiler.xml:
+ pwg: minor update
+ https://bugzilla.gnome.org/show_bug.cgi?id=621121
+
+2012-09-28 23:53:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/faq/dependencies.xml:
+ faq: add missing </para> tag
+
+2012-09-28 15:17:27 -0400 Olivier Crête <olivier.crete@collabora.com>
+
+ * gst/gstminiobject.c:
+ * tests/check/gst/gstmemory.c:
+ miniobject: Always reject WRITE locks on READONLY miniobjects
+ Verify that mapping a read-only memory as read doesnt make it writable
+
+2012-09-28 20:38:20 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * docs/faq/dependencies.xml:
+ * docs/random/autotools:
+ * docs/random/moving-plugins:
+ docs: purge all mention of liboil, update FAQ
+ https://bugzilla.gnome.org/show_bug.cgi?id=673285
+
+2012-09-28 16:03:15 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/advanced-clock.xml:
+ * docs/pwg/advanced-dparams.xml:
+ * docs/pwg/advanced-interfaces.xml:
+ pwg: update for 1.0
+ Rewrite clock part.
+ start on interfaces
+
+2012-09-28 13:25:49 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/advanced-request.xml:
+ pwg: rework dynamic pads docs
+
+2012-09-28 13:25:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/advanced-scheduling.xml:
+ pwg: rework scheduling docs
+
+2012-09-28 13:24:52 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/building-props.xml:
+ * docs/pwg/other-base.xml:
+ pwg: remove some GST_BOILERPLATE
+
+2012-09-28 11:18:11 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/design/part-activation.txt:
+ docs: update activation design docs
+
+2012-09-28 10:41:54 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ pad: fix activate docs
+
+2012-09-28 10:04:51 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/advanced-negotiation.xml:
+ pwg: fix more negotiation for 1.0
+
+2012-09-27 16:59:04 +0200 Olivier Blin <olivier.blin@softathome.com>
+
+ * gst/gstinfo.c:
+ info: do not register printf extension for %p
+ This happened when glib was not using system printf, and caused the
+ internal gstreamer printf extensions to be used for all %p printfs,
+ causing crashes.
+ https://bugzilla.gnome.org/show_bug.cgi?id=684970
+
+2012-09-27 17:21:53 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/advanced-negotiation.xml:
+ pwg: fix some negotiation to 1.0
+
+2012-09-27 14:42:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/building-props.xml:
+ * docs/pwg/building-state.xml:
+ * docs/pwg/building-testapp.xml:
+ pwg: more updates for 1.0
+
+2012-09-27 13:57:46 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/building-chainfn.xml:
+ * docs/pwg/building-eventfn.xml:
+ * docs/pwg/building-pads.xml:
+ * docs/pwg/pwg.xml:
+ pwg: more updates for 1.0
+
+2012-09-27 11:53:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/building-boiler.xml:
+ pwg: update boiler to 1.0
+
+2012-09-27 11:06:06 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * gst/gstghostpad.c:
+ ghostpad: also ref the internal pad for activate functions
+ Also take a ref to the internal pad in the activate functions
+
+2012-09-24 18:26:16 -0400 Olivier Crête <olivier.crete@collabora.com>
+
+ * gst/gstghostpad.c:
+ proxypad: Hold a reference to the internal pad while pushing through it
+ https://bugzilla.gnome.org/show_bug.cgi?id=684809
+
+2012-09-25 14:44:54 -0400 Olivier Crête <olivier.crete@collabora.com>
+
+ * tests/check/gst/gstghostpad.c:
+ tests: Test the case where ghost pads are removed while streaming
+ https://bugzilla.gnome.org/show_bug.cgi?id=684809
+
+2012-09-27 09:44:07 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/libs/libsabi.c:
+ * tests/check/libs/struct_arm.h:
+ * tests/check/libs/struct_hppa.h:
+ * tests/check/libs/struct_i386.h:
+ * tests/check/libs/struct_ppc32.h:
+ * tests/check/libs/struct_ppc64.h:
+ * tests/check/libs/struct_sparc.h:
+ * tests/check/libs/struct_x86_64.h:
+ tests: enable library abi checks
+
+2012-09-26 23:32:35 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ docs: fix up basesrc/basesink docs formatting
+
+2012-09-26 17:08:30 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/check/Makefile.am:
+ * tests/check/gst/struct_arm.h:
+ * tests/check/gst/struct_hppa.h:
+ * tests/check/gst/struct_i386.h:
+ * tests/check/gst/struct_ppc32.h:
+ * tests/check/gst/struct_ppc64.h:
+ * tests/check/gst/struct_sparc.h:
+ * tests/check/gst/struct_x86_64.h:
+ tests: add abi checks
+ Enable abi checks again.
+ Fix abi sizes for x86_64, copy the file to other archs.
+
+2012-09-26 16:26:48 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ * libs/gst/base/gstbasesrc.c:
+ update docs for 1.0 API
+
+2012-09-26 14:15:01 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/gsturi.c:
+ uri: use proper 'transfer floating' annotation
+ https://bugzilla.gnome.org/show_bug.cgi?id=664099
+
+2012-09-26 13:19:13 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * plugins/elements/gsttypefindelement.c:
+ * plugins/elements/gsttypefindelement.h:
+ typefind: send STREAM-START event
+ Send a STREAM_START event when we are operating in pull mode.
+ Fixes https://bugzilla.gnome.org/show_bug.cgi?id=684424
+
+2012-09-26 10:55:28 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/gstsegment.h:
+ segment: mark GstSegmentFlags as flags rather than enum
+ ... which really makes a difference when trying to serialize
+ a flags value which is a combination of flags, which is hard
+ to do as an enum type.
+
+2012-09-26 10:54:06 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * plugins/elements/gstidentity.c:
+ identity: retimestamp both pts and dts when doing so
+
+2012-09-26 15:01:42 +1000 Jan Schmidt <thaytan@noraisin.net>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: Move some run of the mill debug statements to LOG level
+
+2012-09-26 14:23:52 +1000 Jan Schmidt <thaytan@noraisin.net>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: Output timestamps after a seek.
+ Reinitialise the DTS after a seek so as to continue
+ generating timestamps when baseparse is not downstream
+ of a demuxer.
+ Fixes: #684538
+
+2012-09-25 17:06:45 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/appendix-programs.xml:
+ * docs/manual/basics-pads.xml:
+ * docs/pwg/advanced-types.xml:
+ * docs/pwg/building-boiler.xml:
+ * docs/pwg/building-pads.xml:
+ * docs/pwg/other-ntoone.xml:
+ * tools/gst-launch.1.in:
+ * tools/gst-typefind.1.in:
+ docs: updates
+ MIME-type -> Media type
+ Fix some old gst-inspect output
+
+2012-09-25 16:53:08 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/pwg/intro-basics.xml:
+ * docs/pwg/intro-preface.xml:
+ pwg: update for 1.0 API
+
+2012-09-25 15:11:33 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ docs: add section for metadata
+
+2012-09-25 13:09:38 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstelement.c:
+ * gst/gstelementfactory.c:
+ elementfactory: Fail if no valid element factory metadata is set
+
+2012-09-25 13:09:28 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstplugin.c:
+ plugin: Fail if no valid plugin metadata is set
+
+2012-09-25 15:06:43 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * plugins/elements/gstidentity.c:
+ identity: also track and store segment info in single segment mode
+
+2012-09-25 14:40:20 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/advanced-autoplugging.xml:
+ * docs/manual/advanced-dataaccess.xml:
+ * docs/manual/advanced-interfaces.xml:
+ * docs/manual/advanced-threads.xml:
+ * docs/manual/appendix-checklist.xml:
+ * docs/manual/appendix-integration.xml:
+ * docs/manual/appendix-porting.xml:
+ * docs/manual/basics-bins.xml:
+ * docs/manual/basics-bus.xml:
+ * docs/manual/basics-data.xml:
+ * docs/manual/basics-elements.xml:
+ * docs/manual/basics-helloworld.xml:
+ * docs/manual/highlevel-components.xml:
+ * docs/manual/intro-basics.xml:
+ * docs/manual/manual.xml:
+ * docs/random/porting-to-1.0.txt:
+ * tests/examples/manual/Makefile.am:
+ manual: fix up the manual
+ MIME-type -> media types
+ Fix up the manual in various places with the 1.0 way of doing things
+ such as probes, static elements, scheduling, ...
+ Add porting from 0.10 to 1.0 chapter.
+ Add probe example to build.
+ Remove some docs for remove components such as GstMixer and
+ GstPropertyProbe, XML...
+
+2012-09-24 16:50:50 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/manual/intro-gstreamer.xml:
+ docs: gst-python is no more
+ gst-python is no more and gst-libav is one of the main modules that
+ we release.
+
+2012-09-24 16:31:34 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.c:
+ docs: fix basesink docs
+
+2012-09-24 16:25:36 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * docs/faq/getting.xml:
+ * docs/faq/troubleshooting.xml:
+ * docs/faq/using.xml:
+ docs: update FAQ
+ Change versions.
+ Use tools with version prefix.
+
+2012-09-25 13:15:14 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/el.po:
+ * po/en_GB.po:
+ * po/eo.po:
+ * po/es.po:
+ * po/eu.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/gl.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/it.po:
+ * po/ja.po:
+ * po/lt.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ro.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sl.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update translations for typo fix
+
+2012-09-25 13:14:53 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * gst/gsttaglist.c:
+ taglist: fix typo in translated string
+ Spotted by Chris Leonard.
+ https://bugzilla.gnome.org/show_bug.cgi?id=684755
+
+2012-09-25 09:27:59 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpluginfeature.c:
+ pluginfeature: Remove 0.11.9X->1.0.0 version mangling
+
+2012-09-25 01:02:03 +0100 Josep Torra Valles <n770galaxy@gmail.com>
+
+ * tests/benchmarks/complexity.c:
+ * tests/benchmarks/gstpollstress.c:
+ benchmarks: printf format fixes to make intel compiler happy
+ https://bugzilla.gnome.org/show_bug.cgi?id=552657
+
+2012-09-25 00:55:59 +0100 Josep Torra Valles <n770galaxy@gmail.com>
+
+ * libs/gst/base/gsttypefindhelper.c:
+ * plugins/elements/gstfakesink.c:
+ * plugins/elements/gstfakesrc.c:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gsttee.c:
+ * tools/gst-launch.c:
+ * tools/tools.h:
+ Make intel compiler happier
+ https://bugzilla.gnome.org/show_bug.cgi?id=552657
+
+2012-09-24 16:31:54 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * win32/common/config.h:
+ * win32/common/gstversion.h:
+ Back to development (bug fixing)
+
+=== release 1.0.0 ===
+
+2012-09-24 12:19:16 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * NEWS:
+ * RELEASE:
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ Release 1.0.0
+
+2012-09-24 00:39:26 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * docs/random/porting-to-1.0.txt:
+ docs: update 0.11 references in porting guide
+
+2012-09-24 00:37:27 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * docs/random/porting-to-0.11.txt:
+ * docs/random/porting-to-1.0.txt:
+ docs: rename porting-to-0.11.txt to porting-to-1.0.txt
+
+2012-09-23 19:56:43 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * libs/gst/check/gstcheck.h:
+ check: fix FIXME printing for tcase_skip_broken_test()
+
+2012-09-23 17:30:50 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * docs/random/release:
+ docs: update release doc
+ Create tags for releases without the ugly RELEASE- prefix.
+
+2012-09-23 12:42:01 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * libs/gst/base/gstcollectpads.c:
+ collectpads: don't forward random stream-start event
+ It's not right, and we don't know what extra properties
+ that event might have set in future (e.g. sparseness).
+ This change means collectpad users need to create their
+ own stream-start event now. We could add a utility
+ function that creates a stream-start event based on
+ the input stream-start events.
+
+2012-09-22 16:07:15 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * common:
+ Automatic update of common submodule
+ From 4f962f7 to 6c0b52c
+
+2012-09-21 21:13:27 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * docs/manual/advanced-dparams.xml:
+ manual: update controller documentation
+
+2012-09-21 21:13:13 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * gst/gstobject.c:
+ object: update controller documentation
+
+2012-09-18 15:22:03 +0200 Bastian Winkler <buz@netbuz.org>
+
+ * tools/gst-launch.1.in:
+ man: Fix syntax for value lists in caps strings
+ Value lists use curly brackets instead of parentheses
+ https://bugzilla.gnome.org/show_bug.cgi?id=684293
+
+2012-09-20 14:48:17 -0400 Olivier Crête <olivier.crete@collabora.com>
+
+ * gst/gstpad.c:
+ * tests/check/gst/gstpad.c:
+ pad: Remove pad probes only once
+ Also add test to make sure that if a pad probe is removed while it's
+ callback is running, the cleanup_hook isn't called again if it
+ returns GST_PAD_PROBE_REMOVE
+
+2012-09-19 15:01:46 -0400 Olivier Crête <olivier.crete@collabora.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * win32/common/libgstreamer.def:
+ pad: Add functions to safely access GstProbeInfo data pointer
+ This is so that introspection based bindings can access it.
+ https://bugzilla.gnome.org/show_bug.cgi?id=684402
+
+2012-09-19 23:25:54 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * docs/manual/basics-bins.xml:
+ docs: remove reference to 0.8 GstBin API from manual
+ https://bugzilla.gnome.org/show_bug.cgi?id=684048
+
+2012-09-19 15:14:35 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * plugins/elements/gstidentity.c:
+ identity: transform GAP event in single segment mode
+
+2012-09-19 09:44:08 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * libs/gst/base/gstcollectpads.c:
+ docs: collectpads doc fixes
+
+2012-09-18 21:49:41 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetransform: check acquire result value
+ Check the result value from _buffer_pool_acquire() and return the
+ value when allocation failed.
+ Fixes https://bugzilla.gnome.org/show_bug.cgi?id=684285
+
+2012-09-18 12:14:34 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ pad: Fix refcount bug by unreffing the correct variable
+
+=== release 0.11.99 ===
+
+2012-09-17 17:56:44 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ Release 0.11.99
+
+2012-09-17 13:35:26 +0100 Tim-Philipp Müller <tim.muller@collabora.co.uk>
+
+ * configure.ac:
+ * gst/Makefile.am:
+ * gst/gst.h:
+ * libs/gst/base/Makefile.am:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/net/Makefile.am:
+ * win32/vs10/Common.props:
+ Remove GST_USE_UNSTABLE_API guard and defines
+
+2012-09-17 13:09:58 +0200 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * tests/check/gst/gstghostpad.c:
+ pad: Add parent parameter to the link and unlink functions
+ Fixes part of bug #683995.
+
+2012-09-16 23:20:46 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * gst/gststructure.c:
+ * gst/gstvalue.c:
+ * tests/check/gst/gsttag.c:
+ sample: add serialisation/deserialisation functions for GstSample
+ Since these things are inside taglists now, it would be good to be
+ able to print them and deserialise them.
+ https://bugzilla.gnome.org/show_bug.cgi?id=681322
+
+2012-09-15 21:56:07 +0200 Christian Fredrik Kalager Schaller <uraeus@linuxrisin.org>
+
+ * gstreamer.spec.in:
+ Switch to F18 naming of the package
+
+2012-09-15 18:43:39 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * docs/manual/advanced-autoplugging.xml:
+ * docs/manual/basics-elements.xml:
+ * tools/gst-inspect.c:
+ use gst_element_factory_get_metadata to replace obsolete API
+
+2012-09-14 17:52:14 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * docs/manual/advanced-metadata.xml:
+ * docs/manual/basics-bus.xml:
+ replace gst_tag_list_free with gst_tag_list_unref
+
+2012-09-14 17:00:23 +0200 Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
+
+ * tests/check/gst/gstcontroller.c:
+ * tests/check/gst/gstpreset.c:
+ * tests/check/libs/controller.c:
+ * tests/check/libs/test_transform.c:
+ * tests/check/pipelines/parse-launch.c:
+ * tests/examples/controller/control-sources.c:
+ replace gst_element_class_set_details_simple with gst_element_class_set_metadata
+
+2012-09-06 16:32:35 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * libs/gst/base/gstbasetransform.c:
+ basetrans: whitespace fix
+
+2012-09-14 14:08:18 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * docs/plugins/gstreamer-plugins-docs.sgml:
+ docs: indexers are no more
+ https://bugzilla.gnome.org/show_bug.cgi?id=684018
+
+2012-09-14 13:34:24 +0200 Wim Taymans <wim.taymans@collabora.co.uk>
+
+ * tests/examples/stepping/framestep1.c:
+ tests: fix for appsink return value addition
+
+2012-09-14 02:54:52 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * configure.ac:
+ Back to development
+
+=== release 0.11.94 ===
+
+2012-09-14 02:46:34 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * ChangeLog:
+ * configure.ac:
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/gstreamer-plugins.hierarchy:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ * gstreamer.doap:
+ * win32/common/config.h:
+ Release 0.11.94
+
+2012-09-14 01:28:46 +0100 Olivier Crête <olivier.crete@collabora.com>
+
+ * gst/gstpad.c:
+ pad: don't try to pretty-print event after we've given away ownership
+ Might cause crashes with debug logging enabled.
+ https://bugzilla.gnome.org/show_bug.cgi?id=683996
+
+2012-09-14 01:17:54 +0100 Tim-Philipp Müller <tim@centricular.net>
+
+ * po/af.po:
+ * po/az.po:
+ * po/be.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/el.po:
+ * po/en_GB.po:
+ * po/eo.po:
+ * po/es.po:
+ * po/eu.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/gl.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/it.po:
+ * po/ja.po:
+ * po/lt.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ro.po:
+ * po/ru.po:
+ * po/rw.po:
+ * po/sk.po:
+ * po/sl.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_TW.po:
+ po: update translations
+
2012-09-14 00:30:37 +0100 Tim-Philipp Müller <tim@centricular.net>
* gst/gstcompat.h:
$(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 \
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@
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@
-This is GStreamer 1.0.0
+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:
+
+ * 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
+
+Bugs fixed since 1.0.0:
+
+ * 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 additions since 1.0.0:
+
+ * gst_base_transform_set_prefer_passthrough()
New features in 1.0.0:
-Release notes for GStreamer 1.0.0
-The GStreamer project is pleased to announce the very first release of the
-new API and ABI-stable 1.x series of the GStreamer multimedia framework.
+Release notes for GStreamer 1.0.2
-The 1.x series is a stable series targeted at end users. It is not API or ABI
-compatible with the 0.10.x series. It can, however, be installed in parallel
-with the 0.10.x series and will not affect an existing 0.10.x installation.
-Major improvements include: more flexible memory handling; extensible and
-negotiable metadata for buffers; caps negotiation and renegotiation mechanisms,
-decoupled from buffer allocation; improved caps renegotiation; automatic
-re-sending of state for dynamic pipelines; reworked and more fine-grained pad
-probing; simpler and more descriptive audio and video caps; more efficient
-allocation of buffers, events and other mini objects; improved timestamp
-handling; support for gobject-inspection-based language bindings; countless
-other improvements.
+The GStreamer team is proud to announce a new bug-fix release
+in the 1.x stable series of the
+core of the GStreamer streaming media framework.
-Most of these changes involve the GStreamer plugin API. The application API
-has changed comparatively little, and most applications should be fairly easy
-to port to the new API. There is a porting guide available.
-The GStreamer team would like to thank everyone who helped bring this release
-about, whether by submitting patches, reporting bugs, testing, sponsoring
-development, attending hackfests, or simply supplying moral support.
+The 1.x series is a stable series targeted at end users.
+It is not API or ABI compatible with the stable 0.10.x series.
+It is, however, parallel installable with the 0.10.x series and
+will not affect an existing 0.10.x installation.
-This is the end of a long development process, but also the beginning of
-one. This release does not mark the pinnacle of perfection, but the point
-where the team is content with the API and stability and quality of the code
-base in general, especially compared to the old 0.10 series.
-There will be bugs to fix, and starting from this release there will be
-distinct bug-fixing and feature development cycles, with the goal of getting
-bug-fixes out quicker and unencumbered by other more risky changes. See
+The 1.x series has been reworked for more flexible memory handling, improved
+caps negotiation and re-negotiation, better handling of dynamic pipelines,
+and increased performance in general. It also features countless other feature
+additions and enhancements.
- http://gstreamer.freedesktop.org/wiki/ReleasePlanning/RoadMap
-for a tentative road map and possible schedule.
+This module, gstreamer, only contains core functionality.
+For actual media playback, you will need other modules.
+
+gst-plugins-base
+contains a basic set of well-supported plugins
+gst-plugins-good
+contains a set of well-supported plugins under our preferred license
+gst-plugins-ugly
+contains a set of well-supported plugins, but might pose problems for
+ distributors
+gst-plugins-bad
+contains a set of less supported plugins that haven't passed the
+ rigorous quality testing we expect, or are still missing documentation
+ and/or unit tests
+gst-libav
+contains a set of codecs plugins based on libav (formerly gst-ffmpeg)
-=== Modules
-This module, gstreamer, only contains core functionality.
-For actual media playback, you will also need other modules:
- gst-plugins-base : a basic set of well-supported plugins
- gst-plugins-good : a set of well-supported plugins under our preferred license
- gst-plugins-ugly : a set of well-supported plugins, but might pose problems
- for distributors
- gst-plugins-bad : a set of less supported plugins that haven't passed the
- rigorous quality testing we expect
- gst-libav : a set of codecs plugins based on libav (formerly gst-ffmpeg)
+
-==== Download
+Features of this release
+
+ * 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
-You can find source releases of gstreamer in the download directory:
+Bugs fixed in this release
+
+ * 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
- http://gstreamer.freedesktop.org/src/gstreamer/
+==== Download ====
-==== GStreamer Homepage
+You can find source releases of gstreamer in the download
+directory: http://gstreamer.freedesktop.org/src/gstreamer/
-More details can be found on the project's website:
+The git repository and details how to clone it can be found at
+http://cgit.freedesktop.org/gstreamer/gstreamer/
- http://gstreamer.freedesktop.org/
+==== Homepage ====
-==== Support and Bugs
+The project's website is http://gstreamer.freedesktop.org/
+
+==== Support and Bugs ====
We use GNOME's bugzilla for bug reports and feature requests:
+http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer
+
+Please submit patches via bugzilla as well.
+
+For help and support, please subscribe to and send questions to the
+gstreamer-devel mailing list (see below for details).
+
+There is also a #gstreamer IRC channel on the Freenode IRC network.
+
+==== Developers ====
+
+GStreamer is stored in Git, hosted at git.freedesktop.org, and can be cloned
+from there (see link above).
+
+Interested developers of the core library, plugins, and applications should
+subscribe to the gstreamer-devel list.
- http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer
- or
- http://gstreamer.freedesktop.org/bugs/
-
-==== Developers
-
-GStreamer is stored in Git, hosted at git.freedesktop.org, and can be
-cloned from there. Interested developers of the core library, plugins, and
-applications should subscribe to the gstreamer-devel list and/or pop into
-our #gstreamer IRC channel on Freenode.
-
-==== Contributors to this release
-
- Alban Browaeys
- Alessandro Decina
- Alexander Saprykin
- Andoni Morales Alastruey
- Andreas Frisch
- Andre Moreira Magalhaes (andrunko)
- Antoine Tremblay
- Anton Belka
- Arnaud Vrac
- Bastian Winkler
- Bastien Nocera
- Brian Cameron
- Christian Fredrik Kalager Schaller
- Christophe Fergeau
- Chun-wei Fan
- Colin Walters
- David Schleef
- David Svensson Fors
- Edward Hervey
- Evan Nemerson
- Fabrizio (Misto) Milo
- Havard Graff
- Idar Tollefsen
- Jan Schmidt
- Jason DeRose
- Jens Georg
- João Paulo Pizani Flor
- Johan Boulé
- Johan Dahlin
- Josep Torra
- Joshua M. Doe
- Koop Mast
- Lionel Landwerlin
- Luis de Bethencourt
- Mark Nauwelaerts
- Matej Knopp
- Miguel Angel Cabrera Moya
- Mike Ruprecht
- Oleksij Rempel
- Olivier Crête
- Peteris Krisjanis
- Philippe Normand
- Raimo Järvi
- René Stadler
- Reynaldo H. Verdejo Pinochet
- Ryan Lortie
- Sebastian Dröge
- Sebastian Rasmussen
- Sjoerd Simons
- Sreerenj Balachandran
- Stefan Kost
- Stefan Sauer
- Thiago Santos
- Thibault Saunier
- Thomas Vander Stichele
- Tim-Philipp Müller
- Víctor Manuel Jáquez Leal
- Vincent Penquerc'h
- Wim Taymans
- Youness Alaoui
- Руслан Ижбулатов
+
+Contributors to this release
+
+ * Mark Nauwelaerts
+ * Michael Smith
+ * Miguel Angel Cabrera Moya
+ * Sebastian Dröge
+ * Tim-Philipp Müller
+ * Wim Taymans
+ * Руслан Ижбулатов
+
\ No newline at end of file
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])
$(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 \
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@
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@
$(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 \
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@
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@
dnl Parse gstconfig.h and defines add the symbols and substitions
dnl
-dnl GST_CONFIGPATH=`$PKG_CONFIG --variable=includedir gstreamer-0.10`"/gst/gstconfig.h"
+dnl GST_CONFIGPATH=`$PKG_CONFIG --variable=includedir gstreamer-1.0`"/gst/gstconfig.h"
dnl AG_GST_PARSE_SUBSYSTEM_DISABLES(GST_CONFIGPATH)
dnl
AC_DEFUN([AG_GST_PARSE_SUBSYSTEM_DISABLES],
if echo $(FORMATS) | grep ps > /dev/null; then export SRC="$$SRC $(DOC).ps"; fi; \
if echo $(FORMATS) | grep pdf > /dev/null; then export SRC="$$SRC $(DOC).pdf"; fi; \
\
- # upload releases to both 0.10.X/ and head/ subdirectories \
- if test "x$(PACKAGE_VERSION_NANO)" = x0; then \
- export DIR=$(DOC_BASE)/gstreamer/$(VERSION)/$(DOC); \
- echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
- ssh $(DOC_SERVER) mkdir -p $$DIR; \
- rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \
- ssh $(DOC_SERVER) chmod -R g+w $$DIR; \
- fi; \
+ # upload releases to both X.Y/ and head/ subdirectories \
+ export DIR=$(DOC_BASE)/gstreamer/$(PACKAGE_VERSION_MAJOR).$(PACKAGE_VERSION_MINOR)/$(DOC); \
+ echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
+ ssh $(DOC_SERVER) mkdir -p $$DIR; \
+ rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \
+ ssh $(DOC_SERVER) chmod -R g+w $$DIR; \
\
export DIR=$(DOC_BASE)/gstreamer/head/$(DOC); \
echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
/* 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
/* 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
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for GStreamer 1.0.0.
+# Generated by GNU Autoconf 2.69 for GStreamer 1.0.2.
#
# Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer>.
#
# Identity of this package.
PACKAGE_NAME='GStreamer'
PACKAGE_TARNAME='gstreamer'
-PACKAGE_VERSION='1.0.0'
-PACKAGE_STRING='GStreamer 1.0.0'
+PACKAGE_VERSION='1.0.2'
+PACKAGE_STRING='GStreamer 1.0.2'
PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer'
PACKAGE_URL=''
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
# 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.0 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]...
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of GStreamer 1.0.0:";;
+ short | recursive ) echo "Configuration of GStreamer 1.0.2:";;
esac
cat <<\_ACEOF
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-GStreamer configure 1.0.0
+GStreamer configure 1.0.2
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
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.0, 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 $@
# Define the identity of the package.
PACKAGE='gstreamer'
- VERSION='1.0.0'
+ VERSION='1.0.2'
cat >>confdefs.h <<_ACEOF
- PACKAGE_VERSION_MAJOR=$(echo 1.0.0 | cut -d'.' -f1)
- PACKAGE_VERSION_MINOR=$(echo 1.0.0 | cut -d'.' -f2)
- PACKAGE_VERSION_MICRO=$(echo 1.0.0 | 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)
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking nano version" >&5
$as_echo_n "checking nano version... " >&6; }
- NANO=$(echo 1.0.0 | 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
AM_BACKSLASH='\'
-GST_VERSION_MAJOR=1
-GST_VERSION_MINOR=0
-GST_VERSION_MICRO=0
-GST_VERSION_NANO=0
+GST_VERSION_MAJOR=$PACKAGE_VERSION_MAJOR
+GST_VERSION_MINOR=$PACKAGE_VERSION_MINOR
+GST_VERSION_MICRO=$PACKAGE_VERSION_MICRO
+GST_VERSION_NANO=$PACKAGE_VERSION_NANO
done
- GST_CURRENT=0
+ GST_CURRENT=2
GST_REVISION=0
- GST_AGE=0
- GST_LIBVERSION=0:0:0
+ GST_AGE=2
+ GST_LIBVERSION=2:0:2
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
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
# 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.0, 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
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.0
+GStreamer config.status 1.0.2
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
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.0,
+AC_INIT(GStreamer, 1.0.2,
http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer,
gstreamer)
AG_GST_INIT
AC_SUBST(AM_DEFAULT_VERBOSITY)])
dnl GStreamer versioning, this is mostly informational
-dnl GST_VERSION_MAJOR=$PACKAGE_VERSION_MAJOR
-dnl GST_VERSION_MINOR=$PACKAGE_VERSION_MINOR
-dnl GST_VERSION_MICRO=$PACKAGE_VERSION_MICRO
-dnl GST_VERSION_NANO=$PACKAGE_VERSION_NANO
-dnl Change this to the above for non-pre
-GST_VERSION_MAJOR=1
-GST_VERSION_MINOR=0
-GST_VERSION_MICRO=0
-GST_VERSION_NANO=0
+GST_VERSION_MAJOR=$PACKAGE_VERSION_MAJOR
+GST_VERSION_MINOR=$PACKAGE_VERSION_MINOR
+GST_VERSION_MICRO=$PACKAGE_VERSION_MICRO
+GST_VERSION_NANO=$PACKAGE_VERSION_NANO
AC_SUBST(GST_VERSION_MAJOR)
AC_SUBST(GST_VERSION_MINOR)
AC_SUBST(GST_VERSION_MICRO)
dnl - interfaces added -> increment AGE
dnl - interfaces removed -> AGE = 0
dnl sets GST_LT_LDFLAGS
-AS_LIBTOOL(GST, 0, 0, 0)
+AS_LIBTOOL(GST, 2, 0, 2)
dnl *** autotools stuff ****
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])
$(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 \
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@
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@
draft-push-pull.txt \
draft-tagreading.txt \
part-activation.txt \
- part-block.txt \
part-buffering.txt \
part-caps.txt \
part-clocks.txt \
$(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 \
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@
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@
draft-push-pull.txt \
draft-tagreading.txt \
part-activation.txt \
- part-block.txt \
part-buffering.txt \
part-caps.txt \
part-clocks.txt \
The topic of defining the klass of elements should be based on use cases.
A list of classes that are used in a installation can be generated using:
-gst-inspect-0.10 -a | grep -ho Class:.* | cut -c8- | sed "s/\//\\n/g" | sort | uniq
+gst-inspect-1.0 -a | grep -ho Class:.* | cut -c8- | sed "s/\//\\n/g" | sort | uniq
Proposal
~~~~~~~~
Because the core does not know in which mode to activate a pad (PUSH or
PULL), it delegates that choice to a method on the pad, activate(). The
activate() function of a pad should choose whether to operate in PUSH or
-PULL mode. Once the choice is made, it should call one of the two
-mode-specific activation functions, activate_push() or activate_pull().
-The default activate() function will call activate_push(), as it is the
-default mechanism for data flow. A sink pad that supports either mode of
-operation might call activate_pull() if calling check_get_range()
-returns TRUE, and activate_push() otherwise.
+PULL mode. Once the choice is made, it should call activate_mode()
+with the selected activation mode.
+The default activate() function will call activate_mode() with
+#GST_PAD_MODE_PUSH, as it is the default mechanism for data flow.
+A sink pad that supports either mode of operation might call
+activate_mode(PULL) if the SCHEDULING query upstream contains the
+#GST_PAD_MODE_PULL scheduling mode, and activate_mode(PUSH) otherwise.
Consider the case fakesrc ! fakesink, where fakesink is configured to
operate in PULL mode. State changes in the pipeline will start with
fakesink, which is the most downstream element. The core will call
activate() on fakesink's sink pad. For fakesink to go into PULL mode, it
needs to implement a custom activate() function that will call
-activate_pull() on its sink pad (because the default is to use PUSH
-mode). activate_pull() is then responsible for starting the task that
-pulls from fakesrc:src. Clearly, fakesrc needs to be notified that
-fakesrc is about to pull on its src pad, even though the pipeline has
-not yet changed fakesrc's state. For this reason, activate_pull() must
-first call activate_pull() on fakesink:sink's peer before starting
-fakesink's task.
+activate_mode(PULL) on its sink pad (because the default is to
+use PUSH mode). activate_mode(PULL) is then responsible for starting
+the task that pulls from fakesrc:src. Clearly, fakesrc needs to be
+notified that fakesrc is about to pull on its src pad, even though the
+pipeline has not yet changed fakesrc's state. For this reason,
+GStreamer will first call call activate_mode(PULL) on fakesink:sink's
+peer before calling activate_mode(PULL) on fakesink:sinks.
In short, upstream elements operating in PULL mode must be ready to
-produce data in READY, after having activate_pull() called on their
-source pad. Also, a call to activate_pull() needs to propagate through
+produce data in READY, after having activate_mode(PULL) called on their
+source pad. Also, a call to activate_mode(PULL) needs to propagate through
the pipeline to every pad that a gst_pad_pull() will reach. In the case
-fakesrc ! identity ! fakesink, calling activate_pull() on identity's
+fakesrc ! identity ! fakesink, calling activate_mode(PULL) on identity's
source pad would need to activate its sink pad in pull mode as well,
which should propagate all the way to fakesrc.
If, on the other hand, fakesrc ! fakesink is operating in PUSH mode, the
activation sequence is different. First, activate() on fakesink:sink
-calls activate_push() on fakesink:sink. Then fakesrc's pads are
+calls activate_mode(PUSH) on fakesink:sink. Then fakesrc's pads are
activated: sources first, then sinks (of which fakesrc has none).
fakesrc:src's activation function is then called.
Note that it does not make sense to set an activation function on a
source pad. The peer of a source pad is downstream, meaning it should
have been activated first. If it was activated in PULL mode, the
-source pad should have already had activate_pull() called on it, and
+source pad should have already had activate_mode(PULL) called on it, and
thus needs no further activation. Otherwise it should be in PUSH mode,
which is the choice of the default activation function.
So, in the PUSH case, the default activation function chooses PUSH mode,
-which calls activate_push(), which will then start a task on the source
+which calls activate_mode(PUSH), which will then start a task on the source
pad and begin pushing. In this way PUSH scheduling is a bit easier,
because it follows the order of state changes in a pipeline. fakesink is
already in PAUSED with an active sink pad by the time fakesrc starts
Pad deactivation occurs when its parent goes into the READY state or when the
pad is deactivated explicitly by the application or element.
gst_pad_set_active() is called with a FALSE argument, which then calls
-activate_push() or activate_pull() with a FALSE argument, depending on the
-activation mode of the pad.
+activate_mode(PUSH) or activate_mode(PULL) with a FALSE argument, depending
+on the current activation mode of the pad.
Mode switching
~~~~~~~~~~~~~~
+++ /dev/null
-Pad block
----------
-
-The purpose of blocking a pad is to be notified of downstream dataflow
-and events. The notification can be used for
-
- - (Re)connecting/disconnecting the pad.
- - performing a seek
- - inspecting the data/events on the pad
-
-The pad block is performed on a source pad (push based) or sink pad (pull based)
-and will succeed when the following events happen on the pad:
-
- - gst_pad_push()
- - gst_pad_alloc_buffer()
- - gst_pad_push_event() except for FLUSH_START and FLUSH_STOP events.
- - gst_pad_pull_range () (on a sinkpad)
-
-
-Flushing
-~~~~~~~~
-
-The flushing event is used to clear any data out of the
-downstream elements.
-
-Generic case
-^^^^^^^^^^^^
-
-Consider the following pipeline:
-
- .-----. .-------. .-------.
- | src | | elem1 |\/ | elem2 |
- | src -> sink src -> sink src ....
- '-----' '-------'/\ '-------'
-
-Where elem1.src is blocked. If the pad block is taken (the callback
-is called or the sync block returned) no data is flowing in elem2.sink.
-In this situation, the streaming thread is blocked on a GCond and is
-waiting to be unblocked.
-
-When sending a flushing seek upstream on elem1.src, the FLUSH_START event
-will temporary unblock the streaming thread and make all pad functions that
-can trigger a block (_push/_query/_push_event/_pull_range) return
-GST_FLOW_FLUSHING. This will then eventually pause the streaming thread
-and release the STREAM_LOCK.
-
-Since no STREAM lock is taken after the pad block it is not needed to send
-the FLUSH_START event further downstream.
-
-The FLUSH_STOP will set the srcpad to non-flushing again and is dropped
-for the same reason. From then on, the new data after the flushing seek
-will be queued when the pad block is taken again.
-
-Case where the stream is blocking downstream
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-The example above is only valid if the elem1.src pad is really blocking
-(callback called or sync block returned).
-
-In the case where the stream is blocking further downstream (on elem2.src
-for example, or on a blocking queue), extra care has to be taken.
-
-Consider the following pipeline:
-
- .-----. .-------. .-------.
- | src | | elem1 |\/ | elem2 |
- | src -> sink src -> sink src .... Blocking somewhere downstream
- '-----' '-------'/\ '-------'
-
-A pad block has been requested by the user on elem1.src , but since the stream
-is blocking somewhere downstream, the callback is not called or the sync block
-does not return.
-
-In order for the block to happen, a FLUSH_START needs to be sent directly on
-the downstream blocking element/pad so that it releases the stream lock, and it
-gives a chance for the elem1.src pad to block.
-
-
-Use cases
-~~~~~~~~~
-
-Prerolling a partial pipeline
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
- .---------. .---------. .----------.
- | filesrc | | demuxer | .-----. | decoder1 |
- | src -> sink src1 ->|queue|-> sink src
- '---------' | | '-----' '----------' X
- | | .----------.
- | | .-----. | decoder2 |
- | src2 ->|queue|-> sink src
- '---------' '-----' '----------' X
-
-
-The purpose is to create the pipeline dynamically up to the
-decoders but not yet connect them to a sink and without losing
-any data.
-
-To do this, the source pads of the decoders is blocked so that no
-events or buffers can escape and we don't interrupt the stream.
-
-When all of the dynamic pad are created (no-more-pads emited by the
-branching point, ie, the demuxer or the queues filled) and the pads
-are blocked (blocked callback received) the pipeline is completely
-prerolled.
-
-It should then be possible to perform the following actions on the
-prerolled pipeline:
-
-- query duration/position
-- perform a flushing seek to preroll a new position
-- connect other elements and unblock the blocked pads.
-
-
-dynamically switching an element in a PLAYING pipeline
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-
- .----------. .----------. .----------.
- | element1 | | element2 | | element3 |
- ... src -> sink src -> sink ...
- '----------' '----------' '----------'
- .----------.
- | element4 |
- sink src
- '----------'
-
-The purpose is to replace element2 with element4 in the PLAYING
-pipeline.
-
- 1) block element1 src pad. This can be done async.
- 2) wait for block to happen. at that point nothing is flowing between
- element1 and element2 and nothing will flow until unblocked.
- 3) unlink element1 and element2
- 4) optional step: make sure data is flushed out of element2:
- 4a) pad event probe on element2 src
- 4b) send EOS to element2, this makes sure that element2 flushes
- out the last bits of data it holds.
- 4c) wait for EOS to appear in the probe, drop the EOS.
- 4d) remove the EOS pad event probe.
- 5) unlink element2 and element3
- 5a) optionally element2 can now be set to NULL and/or removed from the
- pipeline.
- 6) link element4 and element3
- 7) link element1 and element4 (FIXME, how about letting element4 know
- about the currently running segment?, see issues.)
- 8) make sure element4 is in the same state as the rest of the elements. The
- element should at least be PAUSED.
- 9) unblock element1 src
-
-The same flow can be used to replace an element in a PAUSED pipeline. Only
-special care has to be taken when performing step 2) which has to be done
-async or it might deadlock. In the async callback one can then perform the
-steps from 3). In a playing pipeline one can of course use the async block
-as well, so that there is a generic method for both PAUSED and PLAYING.
-
-The same flow works as well for any chain of multiple elements and might
-be implemented with a helper function in the future.
-
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
- 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
- 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.
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.
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:
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
~~~~~~~~~
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)
- 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
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
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
- 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.
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
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.
$(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 \
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@
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@
if echo $(FORMATS) | grep ps > /dev/null; then export SRC="$$SRC $(DOC).ps"; fi; \
if echo $(FORMATS) | grep pdf > /dev/null; then export SRC="$$SRC $(DOC).pdf"; fi; \
\
- # upload releases to both 0.10.X/ and head/ subdirectories \
- if test "x$(PACKAGE_VERSION_NANO)" = x0; then \
- export DIR=$(DOC_BASE)/gstreamer/$(VERSION)/$(DOC); \
- echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
- ssh $(DOC_SERVER) mkdir -p $$DIR; \
- rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \
- ssh $(DOC_SERVER) chmod -R g+w $$DIR; \
- fi; \
+ # upload releases to both X.Y/ and head/ subdirectories \
+ export DIR=$(DOC_BASE)/gstreamer/$(PACKAGE_VERSION_MAJOR).$(PACKAGE_VERSION_MINOR)/$(DOC); \
+ echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
+ ssh $(DOC_SERVER) mkdir -p $$DIR; \
+ rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \
+ ssh $(DOC_SERVER) chmod -R g+w $$DIR; \
\
export DIR=$(DOC_BASE)/gstreamer/head/$(DOC); \
echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
<para>
However, do realize that in no way you are forced to have all dependencies
installed. None of the core developers has all of them installed. GStreamer
-has only a few obligate dependencies : GLib 2.0, liboil, and very
+has only a few obligate dependencies : GLib 2.0, liborc, and very
common stuff like glibc, a C compiler, and so on. All of the other
dependencies are optional.
</para>
</answer>
</qandaentry>
-<qandaentry>
- <question id="dependencies-glib">
- <para>
-Does GStreamer use GTK+ 1.2/GLib 1.2 or GLib 2.0 ?
- </para>
- </question>
-
- <answer>
- <para>
-Since the 0.3.3 release of GStreamer, we use GLib 2.0 as the core library
-for GStreamer, which features a move of GObject from GTK+ 2.0 to GLib 2.0.
-If you want to compile using GTK+ 1.2/GLib 1.2, you need to get the
-0.3.1 or earlier release. It is of course not supported.
- </para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="dependencies-dxr">
- <para>
-Does GStreamer offer support for DVD decoder cards like dxr2/3 ?
- </para>
- </question>
-
- <answer>
- <para>
-We do have support for the dxr3, although dxr2 support is unknown.
-GStreamer can easily accommodate hardware acceleration by writing new
-device-specific elements.
- </para>
- </answer>
- </qandaentry>
-
<qandaentry>
<question id="dependencies-x">
<para>Is GStreamer X independent ?</para>
<answer>
<para>
-Yes, we have no X dependency in any of our core modules. There are GStreamer
-applications that run fine without any need for X. However, until our Linux
-Framebuffer or libsvga plugin is ready, you will not be able to play videos
-without X. In the future, there will probably be lots of different output
-plugins for video available.
+Yes, we have no hard X dependency in any of our modules. There are many
+GStreamer applications that run fine without any need for X, for example
+streaming servers, transcoding applications, or audio applications that
+don't output any video. Other applications output video to a framebuffer,
+custom-made hardware sinks, or via wayland.
</para>
</answer>
</qandaentry>
adding MIDI support to GStreamer we are very interested in getting in touch
with you.
</para>
+ <para>
+MIDI playback is provided by plugins such as wildmidi and timidity.
+ </para>
</answer>
</qandaentry>
<qandaentry>
<question id="dependencies-gnome">
- <para>Does GStreamer depend on GNOME ?</para>
+ <para>Does GStreamer depend on GNOME or GTK+ ?</para>
</question>
<answer>
<para>
-No. But many of the applications developed for GStreamer do, including our
-sample applications. There is nothing hindering people from developing
-applications using other toolkits however and we would happily help promote
-such efforts. A good example of an application using GStreamer, but which is
-not using GNOME is the
-<ulink url="http://mozstreamer.mozdev.org"><citetitle>
-Mozstreamer</citetitle></ulink> which uses Mozilla XUL.
+No. But many of the applications developed for GStreamer do, including some
+of our sample applications. Other applications use the Qt toolkit, or are
+written for Mac OS/X or Windows. We aim to provide API that is toolkit
+agnostic and can be used from any toolkit, desktop environment or operating
+system.
</para>
</answer>
</qandaentry>
<qandaentry>
<question id="gstreamer-versions-explained">
- <para>There seem to be different GStreamer versions, like 0.8 and 0.10?
+ <para>There seem to be different GStreamer versions, like 0.10 and 1.0?
What's up with that?</para>
</question>
<answer>
<para>
- GStreamer-0.8 and GStreamer-0.10 are the main version
+ GStreamer-0.10 and GStreamer-1.0 are the main version
'series' currently in use. For all practical purposes
you should think of them as two completely different libraries
which just happen to have a similar name. They can be installed
in parallel and are completely independent.
</para>
<para>
- For the 0.8 version you will need the 0.8 plugins and bindings
- (gst-plugins 0.8.x, gst-ffmpeg 0.8.x, gst-python 0.8.x etc.), while
- for the 0.10 version you will need the 0.10 plugins and bindings
- (ie. gst-plugins-base 0.10.x, gst-plugins-good 0.10.x,
- gst-plugins-ugly 0.10.x, gst-plugins-bad 0.10.x, gst-ffmpeg 0.10.x,
- gst-python 0.10.x). The micro version for each main version does
+ For the 0.10 version you will need the 0.10 plugins and bindings
+ (gst-plugins 0.10.x, gst-ffmpeg 0.10.x, gst-python 0.10.x etc.), while
+ for the 1.0 version you will need the 1.0 plugins and bindings
+ (ie. gst-plugins-base 1.0.x, gst-plugins-good 1.0.x,
+ gst-plugins-ugly 1.0.x, gst-plugins-bad 1.0.x, gst-ffmpeg 1.0.x,
+ gst-python 1.0.x). The micro version for each main version does
not have to match exactly, only the major versions needs to be the
same (ie. it may be that the current gst-plugins-good version is
- 0.10.6 and the current GStreamer core version is 0.10.13).
- GStreamer-0.10 will not see or use any of the GStreamer-0.8 plugins
+ 1.0.6 and the current GStreamer core version is 1.0.13).
+ GStreamer-1.0 will not see or use any of the GStreamer-0.10 plugins
and vice versa.
</para>
<para>
All GStreamer command line tools are suffixed with their main
- version, e.g. gst-launch-0.8 and gst-launch-0.10, or gst-inspect-0.8
- and gst-inspect-0.10. The corresponding GStreamer command line
- tools without a suffix (e.g. gst-launch) will default to the highest
- major version.
+ version, e.g. gst-launch-0.10 and gst-launch-1.0, or gst-inspect-0.10
+ and gst-inspect-1.0.
</para>
<para>
- Applications will use either GStreamer-0.8 or GStreamer-0.10, since
- the 0.8 and 0.10 API/ABI are not compatible.
+ Applications will use either GStreamer-0.10 or GStreamer-1.0, since
+ the 0.10 and 1.0 API/ABI are not compatible.
</para>
<para>
Odd-numbered versions such as 0.9.x, 0.11.x, etc. are unstable
<answer>
<para>
- You should download GStreamer-0.10. GStreamer-0.8 is not developed
- any longer and has not been maintained for almost two years (you
- may still find it packaged for your disto though, but that's most
- likely for legacy applications).
+ You should download GStreamer-1.0. GStreamer-0.10 is end-of-life.
</para>
</answer>
</qandaentry>
<para>
Well, start by checking if you really are missing the plug-in.
<programlisting>
-gst-inspect (plug-in)
+gst-inspect-1.0 (plug-in)
</programlisting>
and replace (plug-in) with the plug-in you think is missing.
If this doesn't return any result, then you either don't have it or your
<answer>
<para>
-GStreamer version 0.10 does not need this anymore. The registry will
+Since GStreamer version 0.10 this is not needed anymore. The registry will
be rebuilt automatically. If you suspect the registry is broken, just delete the
-<filename>registry.*.xml</filename> files under <filename>$HOME/.gstreamer-0.X/</filename>
+<filename>registry.*.xml</filename> files under <filename>$HOME/.gstreamer-1.X/</filename>
and run
<programlisting>
- gst-inspect
+ gst-inspect-1.0
</programlisting>
to rebuild the registry.
</para>
First of all, verify that you have a working registry and that you can
inspect them by typing
<programlisting>
-$ gst-inspect fakesrc
+$ gst-inspect-1.0 fakesrc
</programlisting>
This should print out a bunch of information about this particular element.
If this tells you that there is "no such element or plugin", you haven't
that you really should have : fakesrc and fakesink. They do nothing except
pass empty buffers. Type this at the command-line :
<programlisting>
-$ gst-launch -v fakesrc num-buffers=3 ! fakesink
+$ gst-launch-1.0 -v fakesrc silent=0 num-buffers=3 ! fakesink silent=0
</programlisting>
This will print out output that looks similar to this :
<programlisting>
link the audiotestsrc element to an output element that matches your hardware.
A (non-complete) list of output plug-ins for audio is
<itemizedlist>
+<listitem><para>pulsesink for Pulseaudio output</para></listitem>
<listitem><para>osssink for OSS output</para></listitem>
<listitem><para>esdsink for ESound output</para></listitem>
-<listitem><para>artsdsink for aRTs output (not ported to 0.10 yet)</para></listitem>
<listitem><para>alsasink for ALSA output</para></listitem>
<listitem><para>alsaspdifsink for ALSA S/PDIF output</para></listitem>
<listitem><para>jackaudiosink for JACK output</para></listitem>
</itemizedlist>
-First of all, run gst-inspect on the output plug-in you want to use to
-make sure you have it installed. For example, if you use OSS, run
+First of all, run gst-inspect-1.0 on the output plug-in you want to use to
+make sure you have it installed. For example, if you use Pulseaudio, run
<programlisting>
-$ gst-inspect osssink
+$ gst-inspect-1.0 pulsesink
</programlisting>
and see if that prints out a bunch of properties for the plug-in.
</para>
<para>
Then try to play the sine tone by running
<programlisting>
-$ gst-launch audiotestsrc ! audioconvert ! audioresample ! osssink
+$ gst-launch-1.0 audiotestsrc ! audioconvert ! audioresample ! pulsesink
</programlisting>
and see if you hear something. Make sure your volume is turned up,
but also make sure it is not too loud and you are not wearing your headphones.
command-line tool, which comes standard with GStreamer.
Invoked without any arguments,
<programlisting>
-$ gst-inspect
+$ gst-inspect-1.0
</programlisting>
will print out a listing of installed plugins.
To learn more about a particular plugin, pass its name on the command line.
For example,
<programlisting>
-$ gst-inspect volume
+$ gst-inspect-1.0 volume
</programlisting>
will give you information about the volume plugin.
</para>
- <para>
-Also, if you install the gst-editor package, you will have a graphical
-plugin browser available, gst-inspect-gui.
- </para>
</answer>
</qandaentry>
<answer>
<para>
You access the GStreamer command line interface using the command gst-launch.
-To decode an mp3 and play it through OSS, you could use
+To decode an mp3 and play it through Pulseaudio, you could use
<programlisting>
-gst-launch filesrc location=thesong.mp3 ! mad ! audioconvert !
-audioresample ! osssink
+gst-launch-1.0 filesrc location=thesong.mp3 ! mad ! pulsesink
</programlisting>.
More examples can be found in the gst-launch man page.
</para>
<para>
To automatically detect the right codec in a pipeline, try
<programlisting>
-gst-launch filesrc location=my-random-media-file.mpeg ! decodebin !
- audioconvert ! pulsesink
+gst-launch-1.0 filesrc location=my-random-media-file.mpeg ! decodebin !
+ pulsesink
</programlisting>.
or
<programlisting>
-gst-launch filesrc location=my-random-media-file.mpeg ! decodebin !
+gst-launch-1.0 filesrc location=my-random-media-file.mpeg ! decodebin !
videoconvert ! xvimagesink
</programlisting>
Something more complicated:
<programlisting>
-gst-launch filesrc location=my-random-media-file.mpeg ! decodebin name=decoder
+gst-launch-1.0 filesrc location=my-random-media-file.mpeg ! decodebin name=decoder
decoder. ! videoconvert ! xvimagesink
decoder. ! audioconvert ! pulsesink
</programlisting>
We also have a basic media playing plugin that will take care of most things
for you. This plugin is called playbin. Try this:
<programlisting>
-gst-launch playbin uri=file:///home/joe/my-random-media-file.mpeg
+gst-launch-1.0 playbin uri=file:///home/joe/my-random-media-file.mpeg
</programlisting>
This should play the file if the format is supported, ie. you have all the
necessary demuxing and decoding and some output plugins installed.
$(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 \
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@
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@
if echo $(FORMATS) | grep ps > /dev/null; then export SRC="$$SRC $(DOC).ps"; fi; \
if echo $(FORMATS) | grep pdf > /dev/null; then export SRC="$$SRC $(DOC).pdf"; fi; \
\
- # upload releases to both 0.10.X/ and head/ subdirectories \
- if test "x$(PACKAGE_VERSION_NANO)" = x0; then \
- export DIR=$(DOC_BASE)/gstreamer/$(VERSION)/$(DOC); \
- echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
- ssh $(DOC_SERVER) mkdir -p $$DIR; \
- rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \
- ssh $(DOC_SERVER) chmod -R g+w $$DIR; \
- fi; \
+ # upload releases to both X.Y/ and head/ subdirectories \
+ export DIR=$(DOC_BASE)/gstreamer/$(PACKAGE_VERSION_MAJOR).$(PACKAGE_VERSION_MINOR)/$(DOC); \
+ echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
+ ssh $(DOC_SERVER) mkdir -p $$DIR; \
+ rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \
+ ssh $(DOC_SERVER) chmod -R g+w $$DIR; \
\
export DIR=$(DOC_BASE)/gstreamer/head/$(DOC); \
echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
GST_ELEMENT_INFO
GST_ELEMENT_IS_LOCKED_STATE
+<SUBSECTION element-metadata>
GST_ELEMENT_METADATA_AUTHOR
GST_ELEMENT_METADATA_DESCRIPTION
GST_ELEMENT_METADATA_DOC_URI
<p>
</p>
<div class="refsect2">
-<a name="idp9938176"></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:
<em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
<em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> last_sync</code></em>);</pre>
<p>
-Sets the property of the <em class="parameter"><code>object</code></em>, according to the <a href="../gstreamer-1.0/GstControlSource.html"><span class="type">GstControlSources</span></a> that
+Sets the property of the <em class="parameter"><code>object</code></em>, according to the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html"><span class="type">GstControlSources</span></a> that
handle them and for the given timestamp.
</p>
<p>
<a name="GstControlSource.description"></a><h2>Description</h2>
<p>
The <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> is a base class for control value sources that could
-be used by <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstController.html"><span class="type">GstController</span></a> to get timestamp-value pairs.
+be used by <span class="type">GstController</span> to get timestamp-value pairs.
</p>
<p>
A <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> is used by first getting an instance, binding it to a
-<a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> (for example by using <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstController.html#gst-controller-set-control-source"><code class="function">gst_controller_set_control_source()</code></a>) and
-then by having it used by the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstController.html"><span class="type">GstController</span></a> or calling
+<a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> (for example by using <code class="function">gst_controller_set_control_source()</code>) and
+then by having it used by the <span class="type">GstController</span> or calling
<a class="link" href="GstControlSource.html#gst-control-source-get-value" title="gst_control_source_get_value ()"><code class="function">gst_control_source_get_value()</code></a> or <a class="link" href="GstControlSource.html#gst-control-source-get-value-array" title="gst_control_source_get_value_array ()"><code class="function">gst_control_source_get_value_array()</code></a>.
</p>
<p>
For implementing a new <a class="link" href="GstControlSource.html" title="GstControlSource"><span class="type">GstControlSource</span></a> one has to implement a
-<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstControlSource.html#GstControlSourceBind"><span class="type">GstControlSourceBind</span></a> method, which will depending on the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> set up
+<span class="type">GstControlSourceBind</span> method, which will depending on the <a href="http://library.gnome.org/devel/gobject/unstable/gobject-GParamSpec.html#GParamSpec"><span class="type">GParamSpec</span></a> set up
the control source for use and sets the <a class="link" href="GstControlSource.html#GstControlSourceGetValue" title="GstControlSourceGetValue ()"><span class="type">GstControlSourceGetValue</span></a> and
<a class="link" href="GstControlSource.html#GstControlSourceGetValueArray" title="GstControlSourceGetValueArray ()"><span class="type">GstControlSourceGetValueArray</span></a> functions. These are then used by
<a class="link" href="GstControlSource.html#gst-control-source-get-value" title="gst_control_source_get_value ()"><code class="function">gst_control_source_get_value()</code></a> or <a class="link" href="GstControlSource.html#gst-control-source-get-value-array" title="gst_control_source_get_value_array ()"><code class="function">gst_control_source_get_value_array()</code></a>
text,
debug)
#define <a class="link" href="GstElement.html#GST-ELEMENT-IS-LOCKED-STATE:CAPS" title="GST_ELEMENT_IS_LOCKED_STATE()">GST_ELEMENT_IS_LOCKED_STATE</a> (elem)
+
#define <a class="link" href="GstElement.html#GST-ELEMENT-METADATA-AUTHOR:CAPS" title="GST_ELEMENT_METADATA_AUTHOR">GST_ELEMENT_METADATA_AUTHOR</a>
#define <a class="link" href="GstElement.html#GST-ELEMENT-METADATA-DESCRIPTION:CAPS" title="GST_ELEMENT_METADATA_DESCRIPTION">GST_ELEMENT_METADATA_DESCRIPTION</a>
#define <a class="link" href="GstElement.html#GST-ELEMENT-METADATA-DOC-URI:CAPS" title="GST_ELEMENT_METADATA_DOC_URI">GST_ELEMENT_METADATA_DOC_URI</a>
gboolean (*send_event) (GstElement *element, GstEvent *event);
gboolean (*query) (GstElement *element, GstQuery *query);
+
+ gboolean (*post_message) (GstElement *element, GstMessage *message);
};
</pre>
<p>
<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>
<p>
</p>
<div class="example">
-<a name="idp18064352"></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>
GstElement <span class="gtkdoc opt">*</span>src<span class="gtkdoc opt">;</span>
GstElementFactory <span class="gtkdoc opt">*</span>srcfactory<span class="gtkdoc opt">;</span>
-<span class="function"><a href="../gstreamer-1.0/gstreamer-Gst.html#gst-init">gst_init</a></span> <span class="gtkdoc opt">(&</span>argc<span class="gtkdoc opt">, &</span>argv<span class="gtkdoc opt">);</span>
+<span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-Gst.html#gst-init">gst_init</a></span> <span class="gtkdoc opt">(&</span>argc<span class="gtkdoc opt">, &</span>argv<span class="gtkdoc opt">);</span>
-srcfactory <span class="gtkdoc opt">=</span> <span class="function"><a href="../gstreamer-1.0/GstElementFactory.html#gst-element-factory-find">gst_element_factory_find</a></span> <span class="gtkdoc opt">(</span><span class="string">"filesrc"</span><span class="gtkdoc opt">);</span>
+srcfactory <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElementFactory.html#gst-element-factory-find">gst_element_factory_find</a></span> <span class="gtkdoc opt">(</span><span class="string">"filesrc"</span><span class="gtkdoc opt">);</span>
<span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Warnings-and-Assertions.html#g-return-if-fail">g_return_if_fail</a></span> <span class="gtkdoc opt">(</span>srcfactory <span class="gtkdoc opt">!=</span> NULL<span class="gtkdoc opt">);</span>
-src <span class="gtkdoc opt">=</span> <span class="function"><a href="../gstreamer-1.0/GstElementFactory.html#gst-element-factory-create">gst_element_factory_create</a></span> <span class="gtkdoc opt">(</span>srcfactory<span class="gtkdoc opt">,</span> <span class="string">"src"</span><span class="gtkdoc opt">);</span>
+src <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElementFactory.html#gst-element-factory-create">gst_element_factory_create</a></span> <span class="gtkdoc opt">(</span>srcfactory<span class="gtkdoc opt">,</span> <span class="string">"src"</span><span class="gtkdoc opt">);</span>
<span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Warnings-and-Assertions.html#g-return-if-fail">g_return_if_fail</a></span> <span class="gtkdoc opt">(</span>src <span class="gtkdoc opt">!=</span> NULL<span class="gtkdoc opt">);</span>
<span class="gtkdoc opt">...</span></pre></td>
</tr>
<p>
</p>
<div class="refsect2">
-<a name="idp27685152"></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
<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_object_sync_values (<em class="parameter"><code><a class="link" href="GstObject.html" title="GstObject"><span class="type">GstObject</span></a> *object</code></em>,
<em class="parameter"><code><a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);</pre>
<p>
-Sets the properties of the object, according to the <a href="../gstreamer-1.0/GstControlSource.html"><span class="type">GstControlSources</span></a> that
+Sets the properties of the object, according to the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html"><span class="type">GstControlSources</span></a> that
(maybe) handle them and for the given timestamp.
</p>
<p>
<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *property_name</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> disabled</code></em>);</pre>
<p>
-This function is used to disable the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstController.html"><span class="type">GstController</span></a> on a property for
-some time, i.e. <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstController.html#gst-controller-sync-values"><code class="function">gst_controller_sync_values()</code></a> will do nothing for the
+This function is used to disable the <span class="type">GstController</span> on a property for
+some time, i.e. <code class="function">gst_controller_sync_values()</code> will do nothing for the
property.
</p>
<div class="variablelist"><table border="0">
<a class="link" href="GstPad.html#gst-pad-get-parent" title="gst_pad_get_parent()"><code class="function">gst_pad_get_parent()</code></a> will retrieve the <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> that owns the pad.
</p>
<p>
-After two pads are retrieved from an element with <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-get-pad"><code class="function">gst_element_get_pad()</code></a>,
+After two pads are retrieved from an element with <code class="function">gst_element_get_pad()</code>,
the pads can be linked with <a class="link" href="GstPad.html#gst-pad-link" title="gst_pad_link ()"><code class="function">gst_pad_link()</code></a>. (For quick links,
you can also use <a class="link" href="GstElement.html#gst-element-link" title="gst_element_link ()"><code class="function">gst_element_link()</code></a>, which will make the obvious
link for you if it's straightforward.). Pads can be unlinked again with
<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>
<p>
This function is installed on a source pad with
<a class="link" href="GstPad.html#gst-pad-set-getrange-function" title="gst_pad_set_getrange_function()"><code class="function">gst_pad_set_getrange_function()</code></a> and can only be called on source pads after
-they are successfully activated with <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#gst-pad-activate-pull"><code class="function">gst_pad_activate_pull()</code></a>.
+they are successfully activated with <a class="link" href="GstPad.html#gst-pad-activate-mode" title="gst_pad_activate_mode ()"><code class="function">gst_pad_activate_mode()</code></a> with the
+<a class="link" href="GstPad.html#GST-PAD-MODE-PULL:CAPS"><span class="type">GST_PAD_MODE_PULL</span></a>.
</p>
<p>
<em class="parameter"><code>offset</code></em> and <em class="parameter"><code>length</code></em> are always given in byte units. <em class="parameter"><code>offset</code></em> must normally be a value
<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_pad_proxy_query_accept_caps (<em class="parameter"><code><a class="link" href="GstPad.html" title="GstPad"><span class="type">GstPad</span></a> *pad</code></em>,
<em class="parameter"><code><a class="link" href="gstreamer-GstQuery.html#GstQuery" title="struct GstQuery"><span class="type">GstQuery</span></a> *query</code></em>);</pre>
<p>
-Calls <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#gst-pad-accept-caps"><code class="function">gst_pad_accept_caps()</code></a> for all internally linked pads of <em class="parameter"><code>pad</code></em> and
+Calls <code class="function">gst_pad_accept_caps()</code> for all internally linked pads of <em class="parameter"><code>pad</code></em> and
returns the intersection of the results.
</p>
<p>
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> notify</code></em>);</pre>
<p>
Sets the given activate function for <em class="parameter"><code>pad</code></em>. The activate function will
-dispatch to <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#gst-pad-activate-push"><code class="function">gst_pad_activate_push()</code></a> or <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#gst-pad-activate-pull"><code class="function">gst_pad_activate_pull()</code></a> to perform
-the actual activation. Only makes sense to set on sink pads.
+dispatch to <a class="link" href="GstPad.html#gst-pad-activate-mode" title="gst_pad_activate_mode ()"><code class="function">gst_pad_activate_mode()</code></a> to perform the actual activation.
+Only makes sense to set on sink pads.
</p>
<p>
Call this function if your sink pad can start a pull-based task.
<p>
Gets the capabilities this pad can produce or consume.
Note that this method doesn't necessarily return the caps set by
-<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#gst-pad-set-caps"><code class="function">gst_pad_set_caps()</code></a> - use <a class="link" href="GstPad.html#gst-pad-get-current-caps" title="gst_pad_get_current_caps ()"><code class="function">gst_pad_get_current_caps()</code></a> for that instead.
+<code class="function">gst_pad_set_caps()</code> - use <a class="link" href="GstPad.html#gst-pad-get-current-caps" title="gst_pad_get_current_caps ()"><code class="function">gst_pad_get_current_caps()</code></a> for that instead.
gst_pad_query_caps returns all possible caps a pad can operate with, using
the pad's CAPS query function, If the query fails, this function will return
<em class="parameter"><code>filter</code></em>, if not <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>, otherwise ANY.
function to perform the actual activation.
</p>
<p>
-If not <em class="parameter"><code>active</code></em>, checks the pad's current mode and calls
-<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#gst-pad-activate-push"><code class="function">gst_pad_activate_push()</code></a> or <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#gst-pad-activate-pull"><code class="function">gst_pad_activate_pull()</code></a>, as appropriate, with a
-FALSE argument.
+If not <em class="parameter"><code>active</code></em>, calls <a class="link" href="GstPad.html#gst-pad-activate-mode" title="gst_pad_activate_mode ()"><code class="function">gst_pad_activate_mode()</code></a> with the pad's current mode
+and a FALSE argument.
</p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
The following code example shows the code to create a pad from a padtemplate.
</p>
<div class="example">
-<a name="idp27943152"></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>
16
17</pre></td>
<td class="listing_code"><pre class="programlisting">GstStaticPadTemplate my_template <span class="gtkdoc opt">=</span>
-<span class="function"><a href="../gstreamer-1.0/GstPadTemplate.html#GST-STATIC-PAD-TEMPLATE:CAPS">GST_STATIC_PAD_TEMPLATE</a></span> <span class="gtkdoc opt">(</span>
+<span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPadTemplate.html#GST-STATIC-PAD-TEMPLATE:CAPS">GST_STATIC_PAD_TEMPLATE</a></span> <span class="gtkdoc opt">(</span>
<span class="string">"sink"</span><span class="gtkdoc opt">,</span> <span class="gtkdoc slc">// the name of the pad</span>
GST_PAD_SINK<span class="gtkdoc opt">,</span> <span class="gtkdoc slc">// the direction of the pad</span>
GST_PAD_ALWAYS<span class="gtkdoc opt">,</span> <span class="gtkdoc slc">// when this pad will be present</span>
- <span class="function"><a href="../gstreamer-1.0/gstreamer-GstCaps.html#GST-STATIC-CAPS">GST_STATIC_CAPS</a></span> <span class="gtkdoc opt">(</span> <span class="gtkdoc slc">// the capabilities of the padtemplate</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GST-STATIC-CAPS">GST_STATIC_CAPS</a></span> <span class="gtkdoc opt">(</span> <span class="gtkdoc slc">// the capabilities of the padtemplate</span>
<span class="string">"audio/x-raw, "</span>
<span class="string">"channels = (int) [ 1, 6 ]"</span>
<span class="gtkdoc opt">)</span>
<span class="function">my_method</span> <span class="gtkdoc opt">(</span><span class="gtkdoc kwb">void</span><span class="gtkdoc opt">)</span>
<span class="gtkdoc opt">{</span>
GstPad <span class="gtkdoc opt">*</span>pad<span class="gtkdoc opt">;</span>
- pad <span class="gtkdoc opt">=</span> <span class="function"><a href="../gstreamer-1.0/GstPad.html#gst-pad-new-from-static-template">gst_pad_new_from_static_template</a></span> <span class="gtkdoc opt">(&</span>my_template<span class="gtkdoc opt">,</span> <span class="string">"sink"</span><span class="gtkdoc opt">);</span>
+ pad <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#gst-pad-new-from-static-template">gst_pad_new_from_static_template</a></span> <span class="gtkdoc opt">(&</span>my_template<span class="gtkdoc opt">,</span> <span class="string">"sink"</span><span class="gtkdoc opt">);</span>
<span class="gtkdoc opt">...</span>
<span class="gtkdoc opt">}</span></pre></td>
</tr>
<span class="gtkdoc opt">{</span>
GstElementClass <span class="gtkdoc opt">*</span>gstelement_class <span class="gtkdoc opt">=</span> <span class="function">GST_ELEMENT_CLASS</span> <span class="gtkdoc opt">(</span>klass<span class="gtkdoc opt">);</span>
- <span class="function"><a href="../gstreamer-1.0/GstElement.html#gst-element-class-add-pad-template">gst_element_class_add_pad_template</a></span> <span class="gtkdoc opt">(</span>gstelement_class<span class="gtkdoc opt">,</span>
- <span class="function"><a href="../gstreamer-1.0/GstPadTemplate.html#gst-static-pad-template-get">gst_static_pad_template_get</a></span> <span class="gtkdoc opt">(&</span>my_template<span class="gtkdoc opt">));</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-class-add-pad-template">gst_element_class_add_pad_template</a></span> <span class="gtkdoc opt">(</span>gstelement_class<span class="gtkdoc opt">,</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPadTemplate.html#gst-static-pad-template-get">gst_static_pad_template_get</a></span> <span class="gtkdoc opt">(&</span>my_template<span class="gtkdoc opt">));</span>
<span class="gtkdoc opt">}</span></pre></td>
</tr>
</tbody>
6</pre></td>
<td class="listing_code"><pre class="programlisting">GstPluginFeature <span class="gtkdoc opt">*</span>loaded_feature<span class="gtkdoc opt">;</span>
-loaded_feature <span class="gtkdoc opt">=</span> <span class="function"><a href="../gstreamer-1.0/GstPluginFeature.html#gst-plugin-feature-load">gst_plugin_feature_load</a></span> <span class="gtkdoc opt">(</span>feature<span class="gtkdoc opt">);</span>
+loaded_feature <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPluginFeature.html#gst-plugin-feature-load">gst_plugin_feature_load</a></span> <span class="gtkdoc opt">(</span>feature<span class="gtkdoc opt">);</span>
<span class="gtkdoc slc">// presumably, we're no longer interested in the potentially-unloaded feature</span>
-<span class="function"><a href="../gstreamer-1.0/GstObject.html#gst-object-unref">gst_object_unref</a></span> <span class="gtkdoc opt">(</span>feature<span class="gtkdoc opt">);</span>
+<span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html#gst-object-unref">gst_object_unref</a></span> <span class="gtkdoc opt">(</span>feature<span class="gtkdoc opt">);</span>
feature <span class="gtkdoc opt">=</span> loaded_feature<span class="gtkdoc opt">;</span></pre></td>
</tr>
</tbody>
tagsetter <span class="gtkdoc opt">=</span> <span class="function">GST_TAG_SETTER</span> <span class="gtkdoc opt">(</span>element<span class="gtkdoc opt">);</span>
-merge_mode <span class="gtkdoc opt">=</span> <span class="function"><a href="../gstreamer-1.0/GstTagSetter.html#gst-tag-setter-get-tag-merge-mode">gst_tag_setter_get_tag_merge_mode</a></span> <span class="gtkdoc opt">(</span>tagsetter<span class="gtkdoc opt">);</span>
-application_tags <span class="gtkdoc opt">=</span> <span class="function"><a href="../gstreamer-1.0/GstTagSetter.html#gst-tag-setter-get-tag-list">gst_tag_setter_get_tag_list</a></span> <span class="gtkdoc opt">(</span>tagsetter<span class="gtkdoc opt">);</span>
+merge_mode <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstTagSetter.html#gst-tag-setter-get-tag-merge-mode">gst_tag_setter_get_tag_merge_mode</a></span> <span class="gtkdoc opt">(</span>tagsetter<span class="gtkdoc opt">);</span>
+application_tags <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstTagSetter.html#gst-tag-setter-get-tag-list">gst_tag_setter_get_tag_list</a></span> <span class="gtkdoc opt">(</span>tagsetter<span class="gtkdoc opt">);</span>
event_tags <span class="gtkdoc opt">= (</span><span class="gtkdoc kwb">const</span> GstTagList <span class="gtkdoc opt">*)</span> element<span class="gtkdoc opt">-></span>event_tags<span class="gtkdoc opt">;</span>
-<span class="function"><a href="../gstreamer-1.0/gstreamer-GstInfo.html#GST-LOG-OBJECT:CAPS">GST_LOG_OBJECT</a></span> <span class="gtkdoc opt">(</span>tagsetter<span class="gtkdoc opt">,</span> <span class="string">"merging tags, merge mode = %d"</span><span class="gtkdoc opt">,</span> merge_mode<span class="gtkdoc opt">);</span>
-<span class="function"><a href="../gstreamer-1.0/gstreamer-GstInfo.html#GST-LOG-OBJECT:CAPS">GST_LOG_OBJECT</a></span> <span class="gtkdoc opt">(</span>tagsetter<span class="gtkdoc opt">,</span> <span class="string">"event tags: %"</span> GST_PTR_FORMAT<span class="gtkdoc opt">,</span> event_tags<span class="gtkdoc opt">);</span>
-<span class="function"><a href="../gstreamer-1.0/gstreamer-GstInfo.html#GST-LOG-OBJECT:CAPS">GST_LOG_OBJECT</a></span> <span class="gtkdoc opt">(</span>tagsetter<span class="gtkdoc opt">,</span> <span class="string">"set tags: %"</span> GST_PTR_FORMAT<span class="gtkdoc opt">,</span> application_tags<span class="gtkdoc opt">);</span>
+<span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstInfo.html#GST-LOG-OBJECT:CAPS">GST_LOG_OBJECT</a></span> <span class="gtkdoc opt">(</span>tagsetter<span class="gtkdoc opt">,</span> <span class="string">"merging tags, merge mode = %d"</span><span class="gtkdoc opt">,</span> merge_mode<span class="gtkdoc opt">);</span>
+<span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstInfo.html#GST-LOG-OBJECT:CAPS">GST_LOG_OBJECT</a></span> <span class="gtkdoc opt">(</span>tagsetter<span class="gtkdoc opt">,</span> <span class="string">"event tags: %"</span> GST_PTR_FORMAT<span class="gtkdoc opt">,</span> event_tags<span class="gtkdoc opt">);</span>
+<span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstInfo.html#GST-LOG-OBJECT:CAPS">GST_LOG_OBJECT</a></span> <span class="gtkdoc opt">(</span>tagsetter<span class="gtkdoc opt">,</span> <span class="string">"set tags: %"</span> GST_PTR_FORMAT<span class="gtkdoc opt">,</span> application_tags<span class="gtkdoc opt">);</span>
-result <span class="gtkdoc opt">=</span> <span class="function"><a href="../gstreamer-1.0/gstreamer-GstTagList.html#gst-tag-list-merge">gst_tag_list_merge</a></span> <span class="gtkdoc opt">(</span>application_tags<span class="gtkdoc opt">,</span> event_tags<span class="gtkdoc opt">,</span> merge_mode<span class="gtkdoc opt">);</span>
+result <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#gst-tag-list-merge">gst_tag_list_merge</a></span> <span class="gtkdoc opt">(</span>application_tags<span class="gtkdoc opt">,</span> event_tags<span class="gtkdoc opt">,</span> merge_mode<span class="gtkdoc opt">);</span>
-<span class="function"><a href="../gstreamer-1.0/gstreamer-GstInfo.html#GST-LOG-OBJECT:CAPS">GST_LOG_OBJECT</a></span> <span class="gtkdoc opt">(</span>tagsetter<span class="gtkdoc opt">,</span> <span class="string">"final tags: %"</span> GST_PTR_FORMAT<span class="gtkdoc opt">,</span> result<span class="gtkdoc opt">);</span></pre></td>
+<span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstInfo.html#GST-LOG-OBJECT:CAPS">GST_LOG_OBJECT</a></span> <span class="gtkdoc opt">(</span>tagsetter<span class="gtkdoc opt">,</span> <span class="string">"final tags: %"</span> GST_PTR_FORMAT<span class="gtkdoc opt">,</span> result<span class="gtkdoc opt">);</span></pre></td>
</tr>
</tbody>
</table>
<p>
</p>
<div class="example">
-<a name="idp12151600"></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>
MyTypeFind <span class="gtkdoc opt">*</span>find <span class="gtkdoc opt">= (</span>MyTypeFind <span class="gtkdoc opt">*)</span> data<span class="gtkdoc opt">;</span>
<span class="keyword">if</span> <span class="gtkdoc opt">(</span>probability <span class="gtkdoc opt">></span> find<span class="gtkdoc opt">-></span>probability<span class="gtkdoc opt">) {</span>
find<span class="gtkdoc opt">-></span>probability <span class="gtkdoc opt">=</span> probability<span class="gtkdoc opt">;</span>
- <span class="function"><a href="../gstreamer-1.0/gstreamer-GstCaps.html#gst-caps-replace">gst_caps_replace</a></span> <span class="gtkdoc opt">(&</span>find<span class="gtkdoc opt">-></span>caps<span class="gtkdoc opt">,</span> caps<span class="gtkdoc opt">);</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#gst-caps-replace">gst_caps_replace</a></span> <span class="gtkdoc opt">(&</span>find<span class="gtkdoc opt">-></span>caps<span class="gtkdoc opt">,</span> caps<span class="gtkdoc opt">);</span>
<span class="gtkdoc opt">}</span>
<span class="gtkdoc opt">}</span>
<span class="gtkdoc kwb">static</span> GstCaps <span class="gtkdoc opt">*</span>
GList <span class="gtkdoc opt">*</span>walk<span class="gtkdoc opt">, *</span>type_list<span class="gtkdoc opt">;</span>
MyTypeFind find <span class="gtkdoc opt">= {</span>data<span class="gtkdoc opt">,</span> size<span class="gtkdoc opt">,</span> <span class="number">0</span><span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">};</span>
GstTypeFind gst_find <span class="gtkdoc opt">= {</span>my_peek<span class="gtkdoc opt">,</span> my_suggest<span class="gtkdoc opt">, &</span>find<span class="gtkdoc opt">, };</span>
- walk <span class="gtkdoc opt">=</span> type_list <span class="gtkdoc opt">=</span> <span class="function"><a href="../gstreamer-1.0/GstTypeFindFactory.html#gst-type-find-factory-get-list">gst_type_find_factory_get_list</a></span> <span class="gtkdoc opt">();</span>
+ walk <span class="gtkdoc opt">=</span> type_list <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstTypeFindFactory.html#gst-type-find-factory-get-list">gst_type_find_factory_get_list</a></span> <span class="gtkdoc opt">();</span>
<span class="keyword">while</span> <span class="gtkdoc opt">(</span>walk<span class="gtkdoc opt">) {</span>
GstTypeFindFactory <span class="gtkdoc opt">*</span>factory <span class="gtkdoc opt">=</span> <span class="function">GST_TYPE_FIND_FACTORY</span> <span class="gtkdoc opt">(</span>walk<span class="gtkdoc opt">-></span>data<span class="gtkdoc opt">);</span>
walk <span class="gtkdoc opt">=</span> <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#g-list-next">g_list_next</a></span> <span class="gtkdoc opt">(</span>walk<span class="gtkdoc opt">)</span>
- <span class="function"><a href="../gstreamer-1.0/GstTypeFindFactory.html#gst-type-find-factory-call-function">gst_type_find_factory_call_function</a></span> <span class="gtkdoc opt">(</span>factory<span class="gtkdoc opt">, &</span>gst_find<span class="gtkdoc opt">);</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstTypeFindFactory.html#gst-type-find-factory-call-function">gst_type_find_factory_call_function</a></span> <span class="gtkdoc opt">(</span>factory<span class="gtkdoc opt">, &</span>gst_find<span class="gtkdoc opt">);</span>
<span class="gtkdoc opt">}</span>
<span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#g-list-free">g_list_free</a></span> <span class="gtkdoc opt">(</span>type_list<span class="gtkdoc opt">);</span>
<span class="keyword">return</span> find<span class="gtkdoc opt">.</span>caps<span class="gtkdoc opt">;</span>
<td valign="top" align="right"></td>
</tr></table></div>
<div class="refsect1">
-<a name="idp9351824"></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
</p>
</div>
<div class="refsect1">
-<a name="idp9104480"></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
<td valign="top" align="right"></td>
</tr></table></div>
<div class="refsect1">
-<a name="idp11310672"></a><h2>Running and debugging GStreamer Applications</h2>
+<a name="idp3330784"></a><h2>Running and debugging GStreamer Applications</h2>
<div class="refsect2">
-<a name="idp9674784"></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>.
<p>
</p>
<div class="example">
-<a name="idp8067584"></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>
<span class="function">main</span> <span class="gtkdoc opt">(</span><span class="gtkdoc kwb">int</span> argc<span class="gtkdoc opt">,</span> <span class="gtkdoc kwb">char</span> <span class="gtkdoc opt">*</span>argv<span class="gtkdoc opt">[])</span>
<span class="gtkdoc opt">{</span>
<span class="gtkdoc slc">// initialize the GStreamer library</span>
- <span class="function"><a href="../gstreamer-1.0/gstreamer-Gst.html#gst-init">gst_init</a></span> <span class="gtkdoc opt">(&</span>argc<span class="gtkdoc opt">, &</span>argv<span class="gtkdoc opt">);</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-Gst.html#gst-init">gst_init</a></span> <span class="gtkdoc opt">(&</span>argc<span class="gtkdoc opt">, &</span>argv<span class="gtkdoc opt">);</span>
<span class="gtkdoc opt">...</span>
<span class="gtkdoc opt">}</span></pre></td>
</tr>
the next code fragment:
</p>
<div class="example">
-<a name="idp10934368"></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>
<span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Deprecated-Thread-APIs.html#g-thread-init">g_thread_init</a></span> <span class="gtkdoc opt">(</span>NULL<span class="gtkdoc opt">);</span>
ctx <span class="gtkdoc opt">=</span> <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Commandline-option-parser.html#g-option-context-new">g_option_context_new</a></span> <span class="gtkdoc opt">(</span><span class="string">"[ADDITIONAL ARGUMENTS]"</span><span class="gtkdoc opt">);</span>
<span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Commandline-option-parser.html#g-option-context-add-main-entries">g_option_context_add_main_entries</a></span> <span class="gtkdoc opt">(</span>ctx<span class="gtkdoc opt">,</span> options<span class="gtkdoc opt">,</span> GETTEXT_PACKAGE<span class="gtkdoc opt">);</span>
- <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Commandline-option-parser.html#g-option-context-add-group">g_option_context_add_group</a></span> <span class="gtkdoc opt">(</span>ctx<span class="gtkdoc opt">,</span> <span class="function"><a href="../gstreamer-1.0/gstreamer-Gst.html#gst-init-get-option-group">gst_init_get_option_group</a></span> <span class="gtkdoc opt">());</span>
+ <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Commandline-option-parser.html#g-option-context-add-group">g_option_context_add_group</a></span> <span class="gtkdoc opt">(</span>ctx<span class="gtkdoc opt">,</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-Gst.html#gst-init-get-option-group">gst_init_get_option_group</a></span> <span class="gtkdoc opt">());</span>
<span class="keyword">if</span> <span class="gtkdoc opt">(!</span><span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Commandline-option-parser.html#g-option-context-parse">g_option_context_parse</a></span> <span class="gtkdoc opt">(</span>ctx<span class="gtkdoc opt">, &</span>argc<span class="gtkdoc opt">, &</span>argv<span class="gtkdoc opt">, &</span>err<span class="gtkdoc opt">)) {</span>
- <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Warnings-and-Assertions.html#g-print">g_print</a></span> <span class="gtkdoc opt">(</span><span class="string">"Error initializing: %s</span><span class="gtkdoc esc">\n</span><span class="string">"</span><span class="gtkdoc opt">,</span> <span class="function"><a href="../gstreamer-1.0/gstreamer-GstInfo.html#GST-STR-NULL:CAPS">GST_STR_NULL</a></span> <span class="gtkdoc opt">(</span>err<span class="gtkdoc opt">-></span>message<span class="gtkdoc opt">));</span>
+ <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Warnings-and-Assertions.html#g-print">g_print</a></span> <span class="gtkdoc opt">(</span><span class="string">"Error initializing: %s</span><span class="gtkdoc esc">\n</span><span class="string">"</span><span class="gtkdoc opt">,</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstInfo.html#GST-STR-NULL:CAPS">GST_STR_NULL</a></span> <span class="gtkdoc opt">(</span>err<span class="gtkdoc opt">-></span>message<span class="gtkdoc opt">));</span>
<span class="function">exit</span> <span class="gtkdoc opt">(</span><span class="number">1</span><span class="gtkdoc opt">);</span>
<span class="gtkdoc opt">}</span>
<span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Commandline-option-parser.html#g-option-context-free">g_option_context_free</a></span> <span class="gtkdoc opt">(</span>ctx<span class="gtkdoc opt">);</span>
with a given width, height and bits per plane.
</p>
<div class="example">
-<a name="idp13459264"></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>
gint size<span class="gtkdoc opt">,</span> width<span class="gtkdoc opt">,</span> height<span class="gtkdoc opt">,</span> bpp<span class="gtkdoc opt">;</span>
<span class="gtkdoc opt">...</span>
size <span class="gtkdoc opt">=</span> width <span class="gtkdoc opt">*</span> height <span class="gtkdoc opt">*</span> bpp<span class="gtkdoc opt">;</span>
-buffer <span class="gtkdoc opt">=</span> <span class="function"><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#gst-buffer-new">gst_buffer_new</a></span> <span class="gtkdoc opt">();</span>
-memory <span class="gtkdoc opt">=</span> <span class="function"><a href="../gstreamer-1.0/GstAllocator.html#gst-allocator-alloc">gst_allocator_alloc</a></span> <span class="gtkdoc opt">(</span>NULL<span class="gtkdoc opt">,</span> size<span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span>
-<span class="function"><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#gst-buffer-insert-memory">gst_buffer_insert_memory</a></span> <span class="gtkdoc opt">(</span>buffer<span class="gtkdoc opt">, -</span><span class="number">1</span><span class="gtkdoc opt">,</span> memory<span class="gtkdoc opt">);</span>
+buffer <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#gst-buffer-new">gst_buffer_new</a></span> <span class="gtkdoc opt">();</span>
+memory <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html#gst-allocator-alloc">gst_allocator_alloc</a></span> <span class="gtkdoc opt">(</span>NULL<span class="gtkdoc opt">,</span> size<span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span>
+<span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#gst-buffer-insert-memory">gst_buffer_insert_memory</a></span> <span class="gtkdoc opt">(</span>buffer<span class="gtkdoc opt">, -</span><span class="number">1</span><span class="gtkdoc opt">,</span> memory<span class="gtkdoc opt">);</span>
<span class="gtkdoc opt">...</span></pre></td>
</tr>
</tbody>
<p>
Several flags of the buffer can be set and unset with the
<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-SET:CAPS" title="GST_BUFFER_FLAG_SET()"><code class="function">GST_BUFFER_FLAG_SET()</code></a> and <a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-UNSET:CAPS" title="GST_BUFFER_FLAG_UNSET()"><code class="function">GST_BUFFER_FLAG_UNSET()</code></a> macros. Use
-<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-IS-SET:CAPS" title="GST_BUFFER_FLAG_IS_SET()"><code class="function">GST_BUFFER_FLAG_IS_SET()</code></a> to test if a certain <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBufferFlag"><span class="type">GstBufferFlag</span></a> is set.
+<a class="link" href="gstreamer-GstBuffer.html#GST-BUFFER-FLAG-IS-SET:CAPS" title="GST_BUFFER_FLAG_IS_SET()"><code class="function">GST_BUFFER_FLAG_IS_SET()</code></a> to test if a certain <span class="type">GstBufferFlag</span> is set.
</p>
<p>
Buffers can be efficiently merged into a larger buffer with
<pre class="programlisting">#define GST_BUFFER_FLAGS(buf) GST_MINI_OBJECT_FLAGS(buf)
</pre>
<p>
-A flags word containing <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBufferFlag"><span class="type">GstBufferFlag</span></a> flags set on this buffer.
+A flags word containing <span class="type">GstBufferFlag</span> flags set on this buffer.
</p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>flag</code></em> :</span></p></td>
-<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBufferFlag"><span class="type">GstBufferFlag</span></a> to check.</td>
+<td>the <span class="type">GstBufferFlag</span> to check.</td>
</tr>
</tbody>
</table></div>
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>flag</code></em> :</span></p></td>
-<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBufferFlag"><span class="type">GstBufferFlag</span></a> to set.</td>
+<td>the <span class="type">GstBufferFlag</span> to set.</td>
</tr>
</tbody>
</table></div>
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>flag</code></em> :</span></p></td>
-<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBufferFlag"><span class="type">GstBufferFlag</span></a> to clear.</td>
+<td>the <span class="type">GstBufferFlag</span> to clear.</td>
</tr>
</tbody>
</table></div>
a description of the <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a>.
</p>
<p>
-Caps are exposed on the element pads using the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#gst-pad-get-caps"><code class="function">gst_pad_get_caps()</code></a> pad
+Caps are exposed on the element pads using the <code class="function">gst_pad_get_caps()</code> pad
function. This function describes the possible types that the pad can
handle or produce at runtime.
</p>
<p>
</p>
<div class="example">
-<a name="idp17423056"></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>
7
8</pre></td>
<td class="listing_code"><pre class="programlisting">GstCaps <span class="gtkdoc opt">*</span>caps<span class="gtkdoc opt">;</span>
-caps <span class="gtkdoc opt">=</span> <span class="function"><a href="../gstreamer-1.0/gstreamer-GstCaps.html#gst-caps-new-simple">gst_caps_new_simple</a></span> <span class="gtkdoc opt">(</span><span class="string">"video/x-raw"</span><span class="gtkdoc opt">,</span>
+caps <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#gst-caps-new-simple">gst_caps_new_simple</a></span> <span class="gtkdoc opt">(</span><span class="string">"video/x-raw"</span><span class="gtkdoc opt">,</span>
<span class="string">"format"</span><span class="gtkdoc opt">,</span> G_TYPE_STRING<span class="gtkdoc opt">,</span> <span class="string">"I420"</span><span class="gtkdoc opt">,</span>
<span class="string">"framerate"</span><span class="gtkdoc opt">,</span> GST_TYPE_FRACTION<span class="gtkdoc opt">,</span> <span class="number">25</span><span class="gtkdoc opt">,</span> <span class="number">1</span><span class="gtkdoc opt">,</span>
<span class="string">"pixel-aspect-ratio"</span><span class="gtkdoc opt">,</span> GST_TYPE_FRACTION<span class="gtkdoc opt">,</span> <span class="number">1</span><span class="gtkdoc opt">,</span> <span class="number">1</span><span class="gtkdoc opt">,</span>
<tbody>
<tr>
<td class="listing_lines" align="right"><pre>1</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="function"><a href="../gstreamer-1.0/gstreamer-GstInfo.html#GST-LOG:CAPS">GST_LOG</a></span> <span class="gtkdoc opt">(</span><span class="string">"caps are %"</span> GST_PTR_FORMAT<span class="gtkdoc opt">,</span> caps<span class="gtkdoc opt">);</span></pre></td>
+ <td class="listing_code"><pre class="programlisting"><span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstInfo.html#GST-LOG:CAPS">GST_LOG</a></span> <span class="gtkdoc opt">(</span><span class="string">"caps are %"</span> GST_PTR_FORMAT<span class="gtkdoc opt">,</span> caps<span class="gtkdoc opt">);</span></pre></td>
</tr>
</tbody>
</table>
the needed parameters to specify seeking time and mode.
</p>
<div class="example">
-<a name="idp22881984"></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>
<span class="gtkdoc opt">...</span>
<span class="gtkdoc slc">// construct a seek event to play the media from second 2 to 5, flush</span>
<span class="gtkdoc slc">// the pipeline to decrease latency.</span>
-event <span class="gtkdoc opt">=</span> <span class="function"><a href="../gstreamer-1.0/gstreamer-GstEvent.html#gst-event-new-seek">gst_event_new_seek</a></span> <span class="gtkdoc opt">(</span><span class="number">1.0</span><span class="gtkdoc opt">,</span>
+event <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#gst-event-new-seek">gst_event_new_seek</a></span> <span class="gtkdoc opt">(</span><span class="number">1.0</span><span class="gtkdoc opt">,</span>
GST_FORMAT_TIME<span class="gtkdoc opt">,</span>
GST_SEEK_FLAG_FLUSH<span class="gtkdoc opt">,</span>
GST_SEEK_TYPE_SET<span class="gtkdoc opt">,</span> <span class="number">2</span> <span class="gtkdoc opt">*</span> GST_SECOND<span class="gtkdoc opt">,</span>
GST_SEEK_TYPE_SET<span class="gtkdoc opt">,</span> <span class="number">5</span> <span class="gtkdoc opt">*</span> GST_SECOND<span class="gtkdoc opt">);</span>
<span class="gtkdoc opt">...</span>
-result <span class="gtkdoc opt">=</span> <span class="function"><a href="../gstreamer-1.0/GstElement.html#gst-element-send-event">gst_element_send_event</a></span> <span class="gtkdoc opt">(</span>pipeline<span class="gtkdoc opt">,</span> event<span class="gtkdoc opt">);</span>
+result <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-send-event">gst_element_send_event</a></span> <span class="gtkdoc opt">(</span>pipeline<span class="gtkdoc opt">,</span> event<span class="gtkdoc opt">);</span>
<span class="keyword">if</span> <span class="gtkdoc opt">(!</span>result<span class="gtkdoc opt">)</span>
<span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Message-Logging.html#g-warning">g_warning</a></span> <span class="gtkdoc opt">(</span><span class="string">"seek failed"</span><span class="gtkdoc opt">);</span>
<span class="gtkdoc opt">...</span></pre></td>
<p>
</p>
<div class="example">
-<a name="idp9463952"></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>
<tr>
<td class="listing_lines" align="right"><pre>1
2</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="function"><a href="../gstreamer-1.0/GstElement.html#GST-ELEMENT-ERROR:CAPS">GST_ELEMENT_ERROR</a></span> <span class="gtkdoc opt">(</span>src<span class="gtkdoc opt">,</span> RESOURCE<span class="gtkdoc opt">,</span> NOT_FOUND<span class="gtkdoc opt">,</span>
+ <td class="listing_code"><pre class="programlisting"><span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GST-ELEMENT-ERROR:CAPS">GST_ELEMENT_ERROR</a></span> <span class="gtkdoc opt">(</span>src<span class="gtkdoc opt">,</span> RESOURCE<span class="gtkdoc opt">,</span> NOT_FOUND<span class="gtkdoc opt">,</span>
<span class="gtkdoc opt">(</span><span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-I18N.html#gettext-macro">_</a></span><span class="gtkdoc opt">(</span><span class="string">"No file name specified for reading."</span><span class="gtkdoc opt">)), (</span>NULL<span class="gtkdoc opt">));</span></pre></td>
</tr>
</tbody>
<tr>
<td class="listing_lines" align="right"><pre>1
2</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="function"><a href="../gstreamer-1.0/gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-STATIC:CAPS">GST_DEBUG_CATEGORY_STATIC</a></span> <span class="gtkdoc opt">(</span>my_category<span class="gtkdoc opt">);</span> <span class="gtkdoc slc">// define category (statically)</span>
+ <td class="listing_code"><pre class="programlisting"><span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-STATIC:CAPS">GST_DEBUG_CATEGORY_STATIC</a></span> <span class="gtkdoc opt">(</span>my_category<span class="gtkdoc opt">);</span> <span class="gtkdoc slc">// define category (statically)</span>
<span class="gtkdoc ppc">#define GST_CAT_DEFAULT my_category</span> <span class="gtkdoc slc">// set as default</span><span class="gtkdoc ppc"></span></pre></td>
</tr>
</tbody>
<tr>
<td class="listing_lines" align="right"><pre>1
2</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="function"><a href="../gstreamer-1.0/gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-INIT:CAPS">GST_DEBUG_CATEGORY_INIT</a></span> <span class="gtkdoc opt">(</span>my_category<span class="gtkdoc opt">,</span> <span class="string">"my category"</span><span class="gtkdoc opt">,</span>
+ <td class="listing_code"><pre class="programlisting"><span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-INIT:CAPS">GST_DEBUG_CATEGORY_INIT</a></span> <span class="gtkdoc opt">(</span>my_category<span class="gtkdoc opt">,</span> <span class="string">"my category"</span><span class="gtkdoc opt">,</span>
<span class="number">0</span><span class="gtkdoc opt">,</span> <span class="string">"This is my very own"</span><span class="gtkdoc opt">);</span></pre></td>
</tr>
</tbody>
4
5
6</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="function"><a href="../gstreamer-1.0/gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-STATIC:CAPS">GST_DEBUG_CATEGORY_STATIC</a></span> <span class="gtkdoc opt">(</span>gst_myplugin_debug<span class="gtkdoc opt">);</span>
+ <td class="listing_code"><pre class="programlisting"><span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-STATIC:CAPS">GST_DEBUG_CATEGORY_STATIC</a></span> <span class="gtkdoc opt">(</span>gst_myplugin_debug<span class="gtkdoc opt">);</span>
<span class="gtkdoc ppc">#define GST_CAT_DEFAULT gst_myplugin_debug</span>
-<span class="function"><a href="../gstreamer-1.0/gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-STATIC:CAPS">GST_DEBUG_CATEGORY_STATIC</a></span> <span class="gtkdoc opt">(</span>GST_CAT_PERFORMANCE<span class="gtkdoc opt">);</span>
+<span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-STATIC:CAPS">GST_DEBUG_CATEGORY_STATIC</a></span> <span class="gtkdoc opt">(</span>GST_CAT_PERFORMANCE<span class="gtkdoc opt">);</span>
<span class="gtkdoc opt">...</span>
-<span class="function"><a href="../gstreamer-1.0/gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-INIT:CAPS">GST_DEBUG_CATEGORY_INIT</a></span> <span class="gtkdoc opt">(</span>gst_myplugin_debug<span class="gtkdoc opt">,</span> <span class="string">"myplugin"</span><span class="gtkdoc opt">,</span> <span class="number">0</span><span class="gtkdoc opt">,</span> <span class="string">"nice element"</span><span class="gtkdoc opt">);</span>
-<span class="function"><a href="../gstreamer-1.0/gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-GET:CAPS">GST_DEBUG_CATEGORY_GET</a></span> <span class="gtkdoc opt">(</span>GST_CAT_PERFORMANCE<span class="gtkdoc opt">,</span> <span class="string">"GST_PERFORMANCE"</span><span class="gtkdoc opt">);</span></pre></td>
+<span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-INIT:CAPS">GST_DEBUG_CATEGORY_INIT</a></span> <span class="gtkdoc opt">(</span>gst_myplugin_debug<span class="gtkdoc opt">,</span> <span class="string">"myplugin"</span><span class="gtkdoc opt">,</span> <span class="number">0</span><span class="gtkdoc opt">,</span> <span class="string">"nice element"</span><span class="gtkdoc opt">);</span>
+<span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstInfo.html#GST-DEBUG-CATEGORY-GET:CAPS">GST_DEBUG_CATEGORY_GET</a></span> <span class="gtkdoc opt">(</span>GST_CAT_PERFORMANCE<span class="gtkdoc opt">,</span> <span class="string">"GST_PERFORMANCE"</span><span class="gtkdoc opt">);</span></pre></td>
</tr>
</tbody>
</table>
<tbody>
<tr>
<td class="listing_lines" align="right"><pre>1</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="function">printf</span><span class="gtkdoc opt">(</span><span class="string">"%"</span> GST_TIME_FORMAT <span class="string">"</span><span class="gtkdoc esc">\n</span><span class="string">"</span><span class="gtkdoc opt">,</span> <span class="function"><a href="../gstreamer-1.0/gstreamer-GstInfo.html#GST-TIME-ARGS:CAPS">GST_TIME_ARGS</a></span><span class="gtkdoc opt">(</span>ts<span class="gtkdoc opt">));</span></pre></td>
+ <td class="listing_code"><pre class="programlisting"><span class="function">printf</span><span class="gtkdoc opt">(</span><span class="string">"%"</span> GST_TIME_FORMAT <span class="string">"</span><span class="gtkdoc esc">\n</span><span class="string">"</span><span class="gtkdoc opt">,</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstInfo.html#GST-TIME-ARGS:CAPS">GST_TIME_ARGS</a></span><span class="gtkdoc opt">(</span>ts<span class="gtkdoc opt">));</span></pre></td>
</tr>
</tbody>
</table>
<p>
</p>
<div class="example">
-<a name="idp21236752"></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>
<td class="listing_code"><pre class="programlisting">it <span class="gtkdoc opt">=</span> <span class="function">_get_iterator</span><span class="gtkdoc opt">(</span>object<span class="gtkdoc opt">);</span>
done <span class="gtkdoc opt">=</span> FALSE<span class="gtkdoc opt">;</span>
<span class="keyword">while</span> <span class="gtkdoc opt">(!</span>done<span class="gtkdoc opt">) {</span>
- <span class="keyword">switch</span> <span class="gtkdoc opt">(</span><span class="function"><a href="../gstreamer-1.0/gstreamer-GstIterator.html#gst-iterator-next">gst_iterator_next</a></span> <span class="gtkdoc opt">(</span>it<span class="gtkdoc opt">, &</span>item<span class="gtkdoc opt">)) {</span>
+ <span class="keyword">switch</span> <span class="gtkdoc opt">(</span><span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstIterator.html#gst-iterator-next">gst_iterator_next</a></span> <span class="gtkdoc opt">(</span>it<span class="gtkdoc opt">, &</span>item<span class="gtkdoc opt">)) {</span>
<span class="keyword">case</span> GST_ITERATOR_OK<span class="gtkdoc opt">:</span>
<span class="gtkdoc opt">...</span> use<span class="gtkdoc opt">/</span>change item here<span class="gtkdoc opt">...</span>
<span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#g-value-reset">g_value_reset</a></span> <span class="gtkdoc opt">(&</span>item<span class="gtkdoc opt">);</span>
<span class="keyword">break</span><span class="gtkdoc opt">;</span>
<span class="keyword">case</span> GST_ITERATOR_RESYNC<span class="gtkdoc opt">:</span>
<span class="gtkdoc opt">...</span>rollback changes to items<span class="gtkdoc opt">...</span>
- <span class="function"><a href="../gstreamer-1.0/gstreamer-GstIterator.html#gst-iterator-resync">gst_iterator_resync</a></span> <span class="gtkdoc opt">(</span>it<span class="gtkdoc opt">);</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstIterator.html#gst-iterator-resync">gst_iterator_resync</a></span> <span class="gtkdoc opt">(</span>it<span class="gtkdoc opt">);</span>
<span class="keyword">break</span><span class="gtkdoc opt">;</span>
<span class="keyword">case</span> GST_ITERATOR_ERROR<span class="gtkdoc opt">:</span>
<span class="gtkdoc opt">...</span>wrong parameters were given<span class="gtkdoc opt">...</span>
<span class="gtkdoc opt">}</span>
<span class="gtkdoc opt">}</span>
<span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#g-value-unset">g_value_unset</a></span> <span class="gtkdoc opt">(&</span>item<span class="gtkdoc opt">);</span>
-<span class="function"><a href="../gstreamer-1.0/gstreamer-GstIterator.html#gst-iterator-free">gst_iterator_free</a></span> <span class="gtkdoc opt">(</span>it<span class="gtkdoc opt">);</span></pre></td>
+<span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstIterator.html#gst-iterator-free">gst_iterator_free</a></span> <span class="gtkdoc opt">(</span>it<span class="gtkdoc opt">);</span></pre></td>
</tr>
</tbody>
</table>
<p>
</p>
<div class="example">
-<a name="idp29705072"></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>
<tr>
<td class="listing_lines" align="right"><pre>1</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="function"><a href="../gstreamer-1.0/GstBus.html#gst-bus-post">gst_bus_post</a></span> <span class="gtkdoc opt">(</span>bus<span class="gtkdoc opt">,</span> <span class="function"><a href="../gstreamer-1.0/gstreamer-GstMessage.html#gst-message-new-eos">gst_message_new_eos</a></span><span class="gtkdoc opt">());</span></pre></td>
+ <td class="listing_code"><pre class="programlisting"><span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBus.html#gst-bus-post">gst_bus_post</a></span> <span class="gtkdoc opt">(</span>bus<span class="gtkdoc opt">,</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#gst-message-new-eos">gst_message_new_eos</a></span><span class="gtkdoc opt">());</span></pre></td>
</tr>
</tbody>
</table>
16
17</pre></td>
<td class="listing_code"><pre class="programlisting"><span class="gtkdoc opt">...</span>
-<span class="keyword">switch</span> <span class="gtkdoc opt">(</span><span class="function"><a href="../gstreamer-1.0/gstreamer-GstMessage.html#GST-MESSAGE-TYPE:CAPS">GST_MESSAGE_TYPE</a></span> <span class="gtkdoc opt">(</span>msg<span class="gtkdoc opt">)) {</span>
+<span class="keyword">switch</span> <span class="gtkdoc opt">(</span><span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GST-MESSAGE-TYPE:CAPS">GST_MESSAGE_TYPE</a></span> <span class="gtkdoc opt">(</span>msg<span class="gtkdoc opt">)) {</span>
<span class="keyword">case</span> GST_MESSAGE_ERROR<span class="gtkdoc opt">: {</span>
GError <span class="gtkdoc opt">*</span>err <span class="gtkdoc opt">=</span> NULL<span class="gtkdoc opt">;</span>
gchar <span class="gtkdoc opt">*</span>dbg_info <span class="gtkdoc opt">=</span> NULL<span class="gtkdoc opt">;</span>
- <span class="function"><a href="../gstreamer-1.0/gstreamer-GstMessage.html#gst-message-parse-error">gst_message_parse_error</a></span> <span class="gtkdoc opt">(</span>msg<span class="gtkdoc opt">, &</span>err<span class="gtkdoc opt">, &</span>dbg_info<span class="gtkdoc opt">);</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#gst-message-parse-error">gst_message_parse_error</a></span> <span class="gtkdoc opt">(</span>msg<span class="gtkdoc opt">, &</span>err<span class="gtkdoc opt">, &</span>dbg_info<span class="gtkdoc opt">);</span>
<span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Warnings-and-Assertions.html#g-printerr">g_printerr</a></span> <span class="gtkdoc opt">(</span><span class="string">"ERROR from element %s: %s</span><span class="gtkdoc esc">\n</span><span class="string">"</span><span class="gtkdoc opt">,</span>
- <span class="function"><a href="../gstreamer-1.0/GstObject.html#GST-OBJECT-NAME:CAPS">GST_OBJECT_NAME</a></span> <span class="gtkdoc opt">(</span>msg<span class="gtkdoc opt">-></span>src<span class="gtkdoc opt">),</span> err<span class="gtkdoc opt">-></span>message<span class="gtkdoc opt">);</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html#GST-OBJECT-NAME:CAPS">GST_OBJECT_NAME</a></span> <span class="gtkdoc opt">(</span>msg<span class="gtkdoc opt">-></span>src<span class="gtkdoc opt">),</span> err<span class="gtkdoc opt">-></span>message<span class="gtkdoc opt">);</span>
<span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Warnings-and-Assertions.html#g-printerr">g_printerr</a></span> <span class="gtkdoc opt">(</span><span class="string">"Debugging info: %s</span><span class="gtkdoc esc">\n</span><span class="string">"</span><span class="gtkdoc opt">, (</span>dbg_info<span class="gtkdoc opt">)</span> ? dbg_info <span class="gtkdoc opt">:</span> <span class="string">"none"</span><span class="gtkdoc opt">);</span>
<span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#g-error-free">g_error_free</a></span> <span class="gtkdoc opt">(</span>err<span class="gtkdoc opt">);</span>
<span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free">g_free</a></span> <span class="gtkdoc opt">(</span>dbg_info<span class="gtkdoc opt">);</span>
13
14</pre></td>
<td class="listing_code"><pre class="programlisting"><span class="gtkdoc opt">...</span>
-<span class="keyword">switch</span> <span class="gtkdoc opt">(</span><span class="function"><a href="../gstreamer-1.0/gstreamer-GstMessage.html#GST-MESSAGE-TYPE:CAPS">GST_MESSAGE_TYPE</a></span> <span class="gtkdoc opt">(</span>msg<span class="gtkdoc opt">)) {</span>
+<span class="keyword">switch</span> <span class="gtkdoc opt">(</span><span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GST-MESSAGE-TYPE:CAPS">GST_MESSAGE_TYPE</a></span> <span class="gtkdoc opt">(</span>msg<span class="gtkdoc opt">)) {</span>
<span class="keyword">case</span> GST_MESSAGE_TAG<span class="gtkdoc opt">: {</span>
GstTagList <span class="gtkdoc opt">*</span>tags <span class="gtkdoc opt">=</span> NULL<span class="gtkdoc opt">;</span>
- <span class="function"><a href="../gstreamer-1.0/gstreamer-GstMessage.html#gst-message-parse-tag">gst_message_parse_tag</a></span> <span class="gtkdoc opt">(</span>msg<span class="gtkdoc opt">, &</span>tags<span class="gtkdoc opt">);</span>
- <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Warnings-and-Assertions.html#g-print">g_print</a></span> <span class="gtkdoc opt">(</span><span class="string">"Got tags from element %s</span><span class="gtkdoc esc">\n</span><span class="string">"</span><span class="gtkdoc opt">,</span> <span class="function"><a href="../gstreamer-1.0/GstObject.html#GST-OBJECT-NAME:CAPS">GST_OBJECT_NAME</a></span> <span class="gtkdoc opt">(</span>msg<span class="gtkdoc opt">-></span>src<span class="gtkdoc opt">));</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#gst-message-parse-tag">gst_message_parse_tag</a></span> <span class="gtkdoc opt">(</span>msg<span class="gtkdoc opt">, &</span>tags<span class="gtkdoc opt">);</span>
+ <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Warnings-and-Assertions.html#g-print">g_print</a></span> <span class="gtkdoc opt">(</span><span class="string">"Got tags from element %s</span><span class="gtkdoc esc">\n</span><span class="string">"</span><span class="gtkdoc opt">,</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html#GST-OBJECT-NAME:CAPS">GST_OBJECT_NAME</a></span> <span class="gtkdoc opt">(</span>msg<span class="gtkdoc opt">-></span>src<span class="gtkdoc opt">));</span>
<span class="function">handle_tags</span> <span class="gtkdoc opt">(</span>tags<span class="gtkdoc opt">);</span>
- <span class="function"><a href="../gstreamer-1.0/gstreamer-GstTagList.html#gst-tag-list-unref">gst_tag_list_unref</a></span> <span class="gtkdoc opt">(</span>tags<span class="gtkdoc opt">);</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#gst-tag-list-unref">gst_tag_list_unref</a></span> <span class="gtkdoc opt">(</span>tags<span class="gtkdoc opt">);</span>
<span class="keyword">break</span><span class="gtkdoc opt">;</span>
<span class="gtkdoc opt">}</span>
<span class="gtkdoc opt">...</span>
14
15</pre></td>
<td class="listing_code"><pre class="programlisting"><span class="gtkdoc opt">...</span>
-<span class="keyword">switch</span> <span class="gtkdoc opt">(</span><span class="function"><a href="../gstreamer-1.0/gstreamer-GstMessage.html#GST-MESSAGE-TYPE:CAPS">GST_MESSAGE_TYPE</a></span> <span class="gtkdoc opt">(</span>msg<span class="gtkdoc opt">)) {</span>
+<span class="keyword">switch</span> <span class="gtkdoc opt">(</span><span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GST-MESSAGE-TYPE:CAPS">GST_MESSAGE_TYPE</a></span> <span class="gtkdoc opt">(</span>msg<span class="gtkdoc opt">)) {</span>
<span class="keyword">case</span> GST_MESSAGE_STATE_CHANGED<span class="gtkdoc opt">: {</span>
GstState old_state<span class="gtkdoc opt">,</span> new_state<span class="gtkdoc opt">;</span>
- <span class="function"><a href="../gstreamer-1.0/gstreamer-GstMessage.html#gst-message-parse-state-changed">gst_message_parse_state_changed</a></span> <span class="gtkdoc opt">(</span>msg<span class="gtkdoc opt">, &</span>old_state<span class="gtkdoc opt">, &</span>new_state<span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#gst-message-parse-state-changed">gst_message_parse_state_changed</a></span> <span class="gtkdoc opt">(</span>msg<span class="gtkdoc opt">, &</span>old_state<span class="gtkdoc opt">, &</span>new_state<span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span>
<span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Warnings-and-Assertions.html#g-print">g_print</a></span> <span class="gtkdoc opt">(</span><span class="string">"Element %s changed state from %s to %s.</span><span class="gtkdoc esc">\n</span><span class="string">"</span><span class="gtkdoc opt">,</span>
- <span class="function"><a href="../gstreamer-1.0/GstObject.html#GST-OBJECT-NAME:CAPS">GST_OBJECT_NAME</a></span> <span class="gtkdoc opt">(</span>msg<span class="gtkdoc opt">-></span>src<span class="gtkdoc opt">),</span>
- <span class="function"><a href="../gstreamer-1.0/GstElement.html#gst-element-state-get-name">gst_element_state_get_name</a></span> <span class="gtkdoc opt">(</span>old_state<span class="gtkdoc opt">),</span>
- <span class="function"><a href="../gstreamer-1.0/GstElement.html#gst-element-state-get-name">gst_element_state_get_name</a></span> <span class="gtkdoc opt">(</span>new_state<span class="gtkdoc opt">));</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html#GST-OBJECT-NAME:CAPS">GST_OBJECT_NAME</a></span> <span class="gtkdoc opt">(</span>msg<span class="gtkdoc opt">-></span>src<span class="gtkdoc opt">),</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-state-get-name">gst_element_state_get_name</a></span> <span class="gtkdoc opt">(</span>old_state<span class="gtkdoc opt">),</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-state-get-name">gst_element_state_get_name</a></span> <span class="gtkdoc opt">(</span>new_state<span class="gtkdoc opt">));</span>
<span class="keyword">break</span><span class="gtkdoc opt">;</span>
<span class="gtkdoc opt">}</span>
<span class="gtkdoc opt">...</span>
<p>
</p>
<div class="example">
-<a name="idp39816480"></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>
13</pre></td>
<td class="listing_code"><pre class="programlisting">GstQuery <span class="gtkdoc opt">*</span>query<span class="gtkdoc opt">;</span>
gboolean res<span class="gtkdoc opt">;</span>
-query <span class="gtkdoc opt">=</span> <span class="function"><a href="../gstreamer-1.0/gstreamer-GstQuery.html#gst-query-new-duration">gst_query_new_duration</a></span> <span class="gtkdoc opt">(</span>GST_FORMAT_TIME<span class="gtkdoc opt">);</span>
-res <span class="gtkdoc opt">=</span> <span class="function"><a href="../gstreamer-1.0/GstElement.html#gst-element-query">gst_element_query</a></span> <span class="gtkdoc opt">(</span>pipeline<span class="gtkdoc opt">,</span> query<span class="gtkdoc opt">);</span>
+query <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#gst-query-new-duration">gst_query_new_duration</a></span> <span class="gtkdoc opt">(</span>GST_FORMAT_TIME<span class="gtkdoc opt">);</span>
+res <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-query">gst_element_query</a></span> <span class="gtkdoc opt">(</span>pipeline<span class="gtkdoc opt">,</span> query<span class="gtkdoc opt">);</span>
<span class="keyword">if</span> <span class="gtkdoc opt">(</span>res<span class="gtkdoc opt">) {</span>
gint64 duration<span class="gtkdoc opt">;</span>
- <span class="function"><a href="../gstreamer-1.0/gstreamer-GstQuery.html#gst-query-parse-duration">gst_query_parse_duration</a></span> <span class="gtkdoc opt">(</span>query<span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">, &</span>duration<span class="gtkdoc opt">);</span>
- <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Warnings-and-Assertions.html#g-print">g_print</a></span> <span class="gtkdoc opt">(</span><span class="string">"duration = %"</span>GST_TIME_FORMAT<span class="gtkdoc opt">,</span> <span class="function"><a href="../gstreamer-1.0/gstreamer-GstInfo.html#GST-TIME-ARGS:CAPS">GST_TIME_ARGS</a></span> <span class="gtkdoc opt">(</span>duration<span class="gtkdoc opt">));</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#gst-query-parse-duration">gst_query_parse_duration</a></span> <span class="gtkdoc opt">(</span>query<span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">, &</span>duration<span class="gtkdoc opt">);</span>
+ <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Warnings-and-Assertions.html#g-print">g_print</a></span> <span class="gtkdoc opt">(</span><span class="string">"duration = %"</span>GST_TIME_FORMAT<span class="gtkdoc opt">,</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstInfo.html#GST-TIME-ARGS:CAPS">GST_TIME_ARGS</a></span> <span class="gtkdoc opt">(</span>duration<span class="gtkdoc opt">));</span>
<span class="gtkdoc opt">}</span>
<span class="keyword">else</span> <span class="gtkdoc opt">{</span>
<span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Warnings-and-Assertions.html#g-print">g_print</a></span> <span class="gtkdoc opt">(</span><span class="string">"duration query failed..."</span><span class="gtkdoc opt">);</span>
<span class="gtkdoc opt">}</span>
-<span class="function"><a href="../gstreamer-1.0/gstreamer-GstQuery.html#gst-query-unref">gst_query_unref</a></span> <span class="gtkdoc opt">(</span>query<span class="gtkdoc opt">);</span></pre></td>
+<span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#gst-query-unref">gst_query_unref</a></span> <span class="gtkdoc opt">(</span>query<span class="gtkdoc opt">);</span></pre></td>
</tr>
</tbody>
</table>
</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>
</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>
</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>
<div class="refsect2">
<a name="GstSegmentFlags"></a><h3>enum GstSegmentFlags</h3>
<pre class="programlisting">typedef enum {
+ /*< flags >*/
GST_SEGMENT_FLAG_NONE = GST_SEEK_FLAG_NONE,
GST_SEGMENT_FLAG_RESET = GST_SEEK_FLAG_FLUSH,
GST_SEGMENT_FLAG_SKIP = GST_SEEK_FLAG_SKIP,
<tbody>
<tr>
<td class="listing_lines" align="right"><pre>1</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="function"><a href="../gstreamer-1.0/gstreamer-GstInfo.html#GST-LOG:CAPS">GST_LOG</a></span> <span class="gtkdoc opt">(</span><span class="string">"structure is %"</span> GST_PTR_FORMAT<span class="gtkdoc opt">,</span> structure<span class="gtkdoc opt">);</span></pre></td>
+ <td class="listing_code"><pre class="programlisting"><span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstInfo.html#GST-LOG:CAPS">GST_LOG</a></span> <span class="gtkdoc opt">(</span><span class="string">"structure is %"</span> GST_PTR_FORMAT<span class="gtkdoc opt">,</span> structure<span class="gtkdoc opt">);</span></pre></td>
</tr>
</tbody>
</table>
<p>
</p>
<div class="table">
-<a name="idp44054384"></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>
</tr>
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>a new element or NULL if none could be created. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+<td>a new element or NULL if none could be created. <span class="annotation">[transfer floating]</span>
</td>
</tr>
</tbody>
<tbody>
<tr>
<td class="listing_lines" align="right"><pre>1</pre></td>
- <td class="listing_code"><pre class="programlisting">guint32 fourcc <span class="gtkdoc opt">=</span> <span class="function"><a href="../gstreamer-1.0/gstreamer-GstValue.html#GST-MAKE-FOURCC:CAPS">GST_MAKE_FOURCC</a></span> <span class="gtkdoc opt">(</span><span class="string">'M'</span><span class="gtkdoc opt">,</span> <span class="string">'J'</span><span class="gtkdoc opt">,</span> <span class="string">'P'</span><span class="gtkdoc opt">,</span> <span class="string">'G'</span><span class="gtkdoc opt">);</span></pre></td>
+ <td class="listing_code"><pre class="programlisting">guint32 fourcc <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstValue.html#GST-MAKE-FOURCC:CAPS">GST_MAKE_FOURCC</a></span> <span class="gtkdoc opt">(</span><span class="string">'M'</span><span class="gtkdoc opt">,</span> <span class="string">'J'</span><span class="gtkdoc opt">,</span> <span class="string">'P'</span><span class="gtkdoc opt">,</span> <span class="string">'G'</span><span class="gtkdoc opt">);</span></pre></td>
</tr>
</tbody>
</table>
<tbody>
<tr>
<td class="listing_lines" align="right"><pre>1</pre></td>
- <td class="listing_code"><pre class="programlisting">guint32 fourcc <span class="gtkdoc opt">=</span> <span class="function"><a href="../gstreamer-1.0/gstreamer-GstValue.html#GST-STR-FOURCC:CAPS">GST_STR_FOURCC</a></span> <span class="gtkdoc opt">(</span><span class="string">"MJPG"</span><span class="gtkdoc opt">);</span></pre></td>
+ <td class="listing_code"><pre class="programlisting">guint32 fourcc <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstValue.html#GST-STR-FOURCC:CAPS">GST_STR_FOURCC</a></span> <span class="gtkdoc opt">(</span><span class="string">"MJPG"</span><span class="gtkdoc opt">);</span></pre></td>
</tr>
</tbody>
</table>
<tbody>
<tr>
<td class="listing_lines" align="right"><pre>1</pre></td>
- <td class="listing_code"><pre class="programlisting"><span class="function">printf</span> <span class="gtkdoc opt">(</span><span class="string">"fourcc: %"</span> GST_FOURCC_FORMAT <span class="string">"</span><span class="gtkdoc esc">\n</span><span class="string">"</span><span class="gtkdoc opt">,</span> <span class="function"><a href="../gstreamer-1.0/gstreamer-GstValue.html#GST-FOURCC-ARGS:CAPS">GST_FOURCC_ARGS</a></span> <span class="gtkdoc opt">(</span>fcc<span class="gtkdoc opt">));</span></pre></td>
+ <td class="listing_code"><pre class="programlisting"><span class="function">printf</span> <span class="gtkdoc opt">(</span><span class="string">"fourcc: %"</span> GST_FOURCC_FORMAT <span class="string">"</span><span class="gtkdoc esc">\n</span><span class="string">"</span><span class="gtkdoc opt">,</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstValue.html#GST-FOURCC-ARGS:CAPS">GST_FOURCC_ARGS</a></span> <span class="gtkdoc opt">(</span>fcc<span class="gtkdoc opt">));</span></pre></td>
</tr>
</tbody>
</table>
Determines if intersecting two values will produce a valid result.
Two values will produce a valid intersection if they have the same
type, or if there is a method (registered by
-<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstValue.html#gst-value-register-intersect-func"><code class="function">gst_value_register_intersect_func()</code></a>) to calculate the intersection.
+<code class="function">gst_value_register_intersect_func()</code>) to calculate the intersection.
</p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<hr>
<div class="refsect2">
<a name="GST-VERSION-MICRO:CAPS"></a><h3>GST_VERSION_MICRO</h3>
-<pre class="programlisting">#define GST_VERSION_MICRO (0)
+<pre class="programlisting">#define GST_VERSION_MICRO (2)
</pre>
<p>
The micro version of GStreamer at compile time:
<sub name="Annotation Glossary" link="annotation-glossary.html"/>
</chapters>
<functions>
- <keyword type="" name="Environment variables" link="gst-running.html#idp9674784"/>
+ <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"/>
<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#idp9938176"/>
+ <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"/>
<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#idp27685152"/>
+ <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"/>
<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.0)
+ 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>
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 = \
$(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 \
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@
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@
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 = \
if echo $(FORMATS) | grep ps > /dev/null; then export SRC="$$SRC $(DOC).ps"; fi; \
if echo $(FORMATS) | grep pdf > /dev/null; then export SRC="$$SRC $(DOC).pdf"; fi; \
\
- # upload releases to both 0.10.X/ and head/ subdirectories \
- if test "x$(PACKAGE_VERSION_NANO)" = x0; then \
- export DIR=$(DOC_BASE)/gstreamer/$(VERSION)/$(DOC); \
- echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
- ssh $(DOC_SERVER) mkdir -p $$DIR; \
- rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \
- ssh $(DOC_SERVER) chmod -R g+w $$DIR; \
- fi; \
+ # upload releases to both X.Y/ and head/ subdirectories \
+ export DIR=$(DOC_BASE)/gstreamer/$(PACKAGE_VERSION_MAJOR).$(PACKAGE_VERSION_MINOR)/$(DOC); \
+ echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
+ ssh $(DOC_SERVER) mkdir -p $$DIR; \
+ rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \
+ ssh $(DOC_SERVER) chmod -R g+w $$DIR; \
\
export DIR=$(DOC_BASE)/gstreamer/head/$(DOC); \
echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
gst_base_transform_is_passthrough
gst_base_transform_set_passthrough
+gst_base_transform_set_prefer_passthrough
gst_base_transform_is_in_place
gst_base_transform_set_in_place
gst_base_transform_is_qos_enabled
<a class="link" href="GstAdapter.html" title="GstAdapter"><span class="returnvalue">GstAdapter</span></a> * <a class="link" href="GstAdapter.html#gst-adapter-new" title="gst_adapter_new ()">gst_adapter_new</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
<span class="returnvalue">void</span> <a class="link" href="GstAdapter.html#gst-adapter-clear" title="gst_adapter_clear ()">gst_adapter_clear</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>);
<span class="returnvalue">void</span> <a class="link" href="GstAdapter.html#gst-adapter-push" title="gst_adapter_push ()">gst_adapter_push</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>);
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="returnvalue">gconstpointer</span></a> <a class="link" href="GstAdapter.html#gst-adapter-map" title="gst_adapter_map ()">gst_adapter_map</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>,
<em class="parameter"><code><span class="type">gsize</span> size</code></em>);
<span class="returnvalue">void</span> <a class="link" href="GstAdapter.html#gst-adapter-unmap" title="gst_adapter_unmap ()">gst_adapter_unmap</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>);
<span class="returnvalue">gsize</span> <a class="link" href="GstAdapter.html#gst-adapter-available-fast" title="gst_adapter_available_fast ()">gst_adapter_available_fast</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="returnvalue">gpointer</span></a> <a class="link" href="GstAdapter.html#gst-adapter-take" title="gst_adapter_take ()">gst_adapter_take</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>,
<em class="parameter"><code><span class="type">gsize</span> nbytes</code></em>);
-<a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="GstAdapter.html#gst-adapter-take-buffer" title="gst_adapter_take_buffer ()">gst_adapter_take_buffer</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>,
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="GstAdapter.html#gst-adapter-take-buffer" title="gst_adapter_take_buffer ()">gst_adapter_take_buffer</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>,
<em class="parameter"><code><span class="type">gsize</span> nbytes</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="GstAdapter.html#gst-adapter-take-list" title="gst_adapter_take_list ()">gst_adapter_take_list</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>,
<em class="parameter"><code><span class="type">gsize</span> nbytes</code></em>);
-<a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstAdapter.html#gst-adapter-prev-pts" title="gst_adapter_prev_pts ()">gst_adapter_prev_pts</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>,
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstAdapter.html#gst-adapter-prev-pts" title="gst_adapter_prev_pts ()">gst_adapter_prev_pts</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>,
<em class="parameter"><code><span class="type">guint64</span> *distance</code></em>);
-<a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstAdapter.html#gst-adapter-prev-dts" title="gst_adapter_prev_dts ()">gst_adapter_prev_dts</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>,
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstAdapter.html#gst-adapter-prev-dts" title="gst_adapter_prev_dts ()">gst_adapter_prev_dts</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>,
<em class="parameter"><code><span class="type">guint64</span> *distance</code></em>);
<span class="returnvalue">gsize</span> <a class="link" href="GstAdapter.html#gst-adapter-masked-scan-uint32" title="gst_adapter_masked_scan_uint32 ()">gst_adapter_masked_scan_uint32</a> (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>,
<em class="parameter"><code><span class="type">guint32</span> mask</code></em>,
GstFlowReturn ret <span class="gtkdoc opt">=</span> GST_FLOW_OK<span class="gtkdoc opt">;</span>
<span class="gtkdoc slc">// will give the element an extra ref; remember to drop it</span>
- <span class="keyword">this</span> <span class="gtkdoc opt">=</span> <span class="function">MY_ELEMENT</span> <span class="gtkdoc opt">(</span><span class="function"><a href="../gstreamer-1.0/GstPad.html#gst-pad-get-parent">gst_pad_get_parent</a></span> <span class="gtkdoc opt">(</span>pad<span class="gtkdoc opt">));</span>
+ <span class="keyword">this</span> <span class="gtkdoc opt">=</span> <span class="function">MY_ELEMENT</span> <span class="gtkdoc opt">(</span><span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#gst-pad-get-parent">gst_pad_get_parent</a></span> <span class="gtkdoc opt">(</span>pad<span class="gtkdoc opt">));</span>
adapter <span class="gtkdoc opt">=</span> <span class="keyword">this</span><span class="gtkdoc opt">-></span>adapter<span class="gtkdoc opt">;</span>
<span class="gtkdoc slc">// put buffer into adapter</span>
- <span class="function"><a href="../gstreamer-libs-1.0/GstAdapter.html#gst-adapter-push">gst_adapter_push</a></span> <span class="gtkdoc opt">(</span>adapter<span class="gtkdoc opt">,</span> buffer<span class="gtkdoc opt">);</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstAdapter.html#gst-adapter-push">gst_adapter_push</a></span> <span class="gtkdoc opt">(</span>adapter<span class="gtkdoc opt">,</span> buffer<span class="gtkdoc opt">);</span>
<span class="gtkdoc slc">// while we can read out 512 bytes, process them</span>
- <span class="keyword">while</span> <span class="gtkdoc opt">(</span><span class="function"><a href="../gstreamer-libs-1.0/GstAdapter.html#gst-adapter-available">gst_adapter_available</a></span> <span class="gtkdoc opt">(</span>adapter<span class="gtkdoc opt">) >=</span> <span class="number">512</span> <span class="gtkdoc opt">&&</span> ret <span class="gtkdoc opt">==</span> GST_FLOW_OK<span class="gtkdoc opt">) {</span>
- <span class="gtkdoc kwb">const</span> guint8 <span class="gtkdoc opt">*</span>data <span class="gtkdoc opt">=</span> <span class="function"><a href="../gstreamer-libs-1.0/GstAdapter.html#gst-adapter-map">gst_adapter_map</a></span> <span class="gtkdoc opt">(</span>adapter<span class="gtkdoc opt">,</span> <span class="number">512</span><span class="gtkdoc opt">);</span>
+ <span class="keyword">while</span> <span class="gtkdoc opt">(</span><span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstAdapter.html#gst-adapter-available">gst_adapter_available</a></span> <span class="gtkdoc opt">(</span>adapter<span class="gtkdoc opt">) >=</span> <span class="number">512</span> <span class="gtkdoc opt">&&</span> ret <span class="gtkdoc opt">==</span> GST_FLOW_OK<span class="gtkdoc opt">) {</span>
+ <span class="gtkdoc kwb">const</span> guint8 <span class="gtkdoc opt">*</span>data <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstAdapter.html#gst-adapter-map">gst_adapter_map</a></span> <span class="gtkdoc opt">(</span>adapter<span class="gtkdoc opt">,</span> <span class="number">512</span><span class="gtkdoc opt">);</span>
<span class="gtkdoc slc">// use flowreturn as an error value</span>
ret <span class="gtkdoc opt">=</span> <span class="function">my_library_foo</span> <span class="gtkdoc opt">(</span>data<span class="gtkdoc opt">);</span>
- <span class="function"><a href="../gstreamer-libs-1.0/GstAdapter.html#gst-adapter-unmap">gst_adapter_unmap</a></span> <span class="gtkdoc opt">(</span>adapter<span class="gtkdoc opt">);</span>
- <span class="function"><a href="../gstreamer-libs-1.0/GstAdapter.html#gst-adapter-flush">gst_adapter_flush</a></span> <span class="gtkdoc opt">(</span>adapter<span class="gtkdoc opt">,</span> <span class="number">512</span><span class="gtkdoc opt">);</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstAdapter.html#gst-adapter-unmap">gst_adapter_unmap</a></span> <span class="gtkdoc opt">(</span>adapter<span class="gtkdoc opt">);</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstAdapter.html#gst-adapter-flush">gst_adapter_flush</a></span> <span class="gtkdoc opt">(</span>adapter<span class="gtkdoc opt">,</span> <span class="number">512</span><span class="gtkdoc opt">);</span>
<span class="gtkdoc opt">}</span>
- <span class="function"><a href="../gstreamer-1.0/GstObject.html#gst-object-unref">gst_object_unref</a></span> <span class="gtkdoc opt">(</span><span class="keyword">this</span><span class="gtkdoc opt">);</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html#gst-object-unref">gst_object_unref</a></span> <span class="gtkdoc opt">(</span><span class="keyword">this</span><span class="gtkdoc opt">);</span>
<span class="keyword">return</span> ret<span class="gtkdoc opt">;</span>
<span class="gtkdoc opt">}</span></pre></td>
</tr>
An element using GstAdapter in its sink pad chain function should ensure that
when the FLUSH_STOP event is received, that any queued data is cleared using
<a class="link" href="GstAdapter.html#gst-adapter-clear" title="gst_adapter_clear ()"><code class="function">gst_adapter_clear()</code></a>. Data should also be cleared or processed on EOS and
-when changing state from <a href="../gstreamer-1.0/GstElement.html#GST-STATE-PAUSED:CAPS"><span class="type">GST_STATE_PAUSED</span></a> to <a href="../gstreamer-1.0/GstElement.html#GST-STATE-READY:CAPS"><span class="type">GST_STATE_READY</span></a>.
+when changing state from <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GST-STATE-PAUSED:CAPS"><span class="type">GST_STATE_PAUSED</span></a> to <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GST-STATE-READY:CAPS"><span class="type">GST_STATE_READY</span></a>.
</p>
<p>
Also check the GST_BUFFER_FLAG_DISCONT flag on the buffer. Some elements might
<p>
The adapter will keep track of the timestamps of the buffers
that were pushed. The last seen timestamp before the current position
-can be queried with <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstAdapter.html#gst-adapter-prev-timestamp"><code class="function">gst_adapter_prev_timestamp()</code></a>. This function can
+can be queried with <code class="function">gst_adapter_prev_timestamp()</code>. This function can
optionally return the amount of bytes between the start of the buffer that
carried the timestamp and the current adapter position. The distance is
useful when dealing with, for example, raw audio samples because it allows
</p>
<p>
Note that <a class="link" href="GstAdapter.html#gst-adapter-push" title="gst_adapter_push ()"><code class="function">gst_adapter_push()</code></a> takes ownership of the buffer passed. Use
-<a href="../gstreamer-1.0/gstreamer-GstBuffer.html#gst-buffer-ref"><code class="function">gst_buffer_ref()</code></a> before pushing it into the adapter if you still want to
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#gst-buffer-ref"><code class="function">gst_buffer_ref()</code></a> before pushing it into the adapter if you still want to
access the buffer later. The adapter will never modify the data in the
buffer pushed in it.
</p>
<div class="refsect2">
<a name="gst-adapter-push"></a><h3>gst_adapter_push ()</h3>
<pre class="programlisting"><span class="returnvalue">void</span> gst_adapter_push (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>);</pre>
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>);</pre>
<p>
Adds the data from <em class="parameter"><code>buf</code></em> to the data stored inside <em class="parameter"><code>adapter</code></em> and takes
ownership of the buffer.
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
-<td>a <a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> to add to queue in the adapter. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> to add to queue in the adapter. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
</td>
</tr>
</tbody>
valid until the next function is called on the adapter.
</p>
<p>
-Note that setting the returned pointer as the data of a <a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> is
+Note that setting the returned pointer as the data of a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> is
incorrect for general-purpose plugins. The reason is that if a downstream
element stores the buffer so that it has access to it outside of the bounds
of its chain function, the buffer will have an invalid data pointer after
your element flushes the bytes. In that case you should use
<a class="link" href="GstAdapter.html#gst-adapter-take" title="gst_adapter_take ()"><code class="function">gst_adapter_take()</code></a>, which returns a freshly-allocated buffer that you can set
-as <a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> malloc_data or the potentially more performant
+as <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> malloc_data or the potentially more performant
<a class="link" href="GstAdapter.html#gst-adapter-take-buffer" title="gst_adapter_take_buffer ()"><code class="function">gst_adapter_take_buffer()</code></a>.
</p>
<p>
<hr>
<div class="refsect2">
<a name="gst-adapter-take-buffer"></a><h3>gst_adapter_take_buffer ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_adapter_take_buffer (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>,
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_adapter_take_buffer (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>,
<em class="parameter"><code><span class="type">gsize</span> nbytes</code></em>);</pre>
<p>
-Returns a <a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> containing the first <em class="parameter"><code>nbytes</code></em> bytes of the
+Returns a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> containing the first <em class="parameter"><code>nbytes</code></em> bytes of the
<em class="parameter"><code>adapter</code></em>. The returned bytes will be flushed from the adapter.
This function is potentially more performant than <a class="link" href="GstAdapter.html#gst-adapter-take" title="gst_adapter_take ()"><code class="function">gst_adapter_take()</code></a>
since it can reuse the memory in pushed buffers by subbuffering
or merging.
</p>
<p>
-Caller owns returned value. <a href="../gstreamer-1.0/gstreamer-GstBuffer.html#gst-buffer-unref"><code class="function">gst_buffer_unref()</code></a> after usage.
+Caller owns returned value. <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#gst-buffer-unref"><code class="function">gst_buffer_unref()</code></a> after usage.
</p>
<p>
Free-function: gst_buffer_unref
</tr>
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>a <a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> containing the first <em class="parameter"><code>nbytes</code></em> of
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> containing the first <em class="parameter"><code>nbytes</code></em> of
the adapter, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if <em class="parameter"><code>nbytes</code></em> bytes are not available. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
</td>
</tr>
performant because no memory should be copied.
</p>
<p>
-Caller owns returned list and contained buffers. <a href="../gstreamer-1.0/gstreamer-GstBuffer.html#gst-buffer-unref"><code class="function">gst_buffer_unref()</code></a> each
+Caller owns returned list and contained buffers. <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#gst-buffer-unref"><code class="function">gst_buffer_unref()</code></a> each
buffer in the list before freeing the list after usage.
</p>
<div class="variablelist"><table border="0">
<hr>
<div class="refsect2">
<a name="gst-adapter-prev-pts"></a><h3>gst_adapter_prev_pts ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_adapter_prev_pts (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>,
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_adapter_prev_pts (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>,
<em class="parameter"><code><span class="type">guint64</span> *distance</code></em>);</pre>
<p>
Get the pts that was before the current byte in the adapter. When
<hr>
<div class="refsect2">
<a name="gst-adapter-prev-dts"></a><h3>gst_adapter_prev_dts ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_adapter_prev_dts (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>,
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_adapter_prev_dts (<em class="parameter"><code><a class="link" href="GstAdapter.html" title="GstAdapter"><span class="type">GstAdapter</span></a> *adapter</code></em>,
<em class="parameter"><code><span class="type">guint64</span> *distance</code></em>);</pre>
<p>
Get the dts that was before the current byte in the adapter. When
<div class="refnamediv"><table width="100%"><tr>
<td valign="top">
<h2><span class="refentrytitle"><a name="GstBaseSink.top_of_page"></a>GstBaseSink</span></h2>
-<p>GstBaseSink</p>
+<p>GstBaseSink — Base class for sink elements</p>
</td>
<td valign="top" align="right"></td>
</tr></table></div>
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-query-latency" title="gst_base_sink_query_latency ()">gst_base_sink_query_latency</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *live</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *upstream_live</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *min_latency</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *max_latency</code></em>);
-<a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-get-latency" title="gst_base_sink_get_latency ()">gst_base_sink_get_latency</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
-<a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-do-preroll" title="gst_base_sink_do_preroll ()">gst_base_sink_do_preroll</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstMiniObject.html#GstMiniObject"><span class="type">GstMiniObject</span></a> *obj</code></em>);
-<a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-wait-preroll" title="gst_base_sink_wait_preroll ()">gst_base_sink_wait_preroll</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
-<a href="../gstreamer-1.0/GstClock.html#GstClockReturn"><span class="returnvalue">GstClockReturn</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-wait-clock" title="gst_base_sink_wait_clock ()">gst_base_sink_wait_clock</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> *jitter</code></em>);
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *min_latency</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *max_latency</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-get-latency" title="gst_base_sink_get_latency ()">gst_base_sink_get_latency</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-do-preroll" title="gst_base_sink_do_preroll ()">gst_base_sink_do_preroll</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMiniObject.html#GstMiniObject"><span class="type">GstMiniObject</span></a> *obj</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-wait-preroll" title="gst_base_sink_wait_preroll ()">gst_base_sink_wait_preroll</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockReturn"><span class="returnvalue">GstClockReturn</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-wait-clock" title="gst_base_sink_wait_clock ()">gst_base_sink_wait_clock</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> *jitter</code></em>);
<span class="returnvalue">void</span> <a class="link" href="GstBaseSink.html#gst-base-sink-set-sync" title="gst_base_sink_set_sync ()">gst_base_sink_set_sync</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> sync</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-get-sync" title="gst_base_sink_get_sync ()">gst_base_sink_get_sync</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> enabled</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-is-async-enabled" title="gst_base_sink_is_async_enabled ()">gst_base_sink_is_async_enabled</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
<span class="returnvalue">void</span> <a class="link" href="GstBaseSink.html#gst-base-sink-set-ts-offset" title="gst_base_sink_set_ts_offset ()">gst_base_sink_set_ts_offset</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> offset</code></em>);
-<a href="../gstreamer-1.0/GstClock.html#GstClockTimeDiff"><span class="returnvalue">GstClockTimeDiff</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-get-ts-offset" title="gst_base_sink_get_ts_offset ()">gst_base_sink_get_ts_offset</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> offset</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTimeDiff"><span class="returnvalue">GstClockTimeDiff</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-get-ts-offset" title="gst_base_sink_get_ts_offset ()">gst_base_sink_get_ts_offset</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
<span class="returnvalue">void</span> <a class="link" href="GstBaseSink.html#gst-base-sink-set-render-delay" title="gst_base_sink_set_render_delay ()">gst_base_sink_set_render_delay</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> delay</code></em>);
-<a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-get-render-delay" title="gst_base_sink_get_render_delay ()">gst_base_sink_get_render_delay</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
-<a href="../gstreamer-1.0/gstreamer-GstSample.html#GstSample"><span class="returnvalue">GstSample</span></a> * <a class="link" href="GstBaseSink.html#gst-base-sink-get-last-sample" title="gst_base_sink_get_last_sample ()">gst_base_sink_get_last_sample</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> delay</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-get-render-delay" title="gst_base_sink_get_render_delay ()">gst_base_sink_get_render_delay</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstSample.html#GstSample"><span class="returnvalue">GstSample</span></a> * <a class="link" href="GstBaseSink.html#gst-base-sink-get-last-sample" title="gst_base_sink_get_last_sample ()">gst_base_sink_get_last_sample</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
<span class="returnvalue">void</span> <a class="link" href="GstBaseSink.html#gst-base-sink-set-blocksize" title="gst_base_sink_set_blocksize ()">gst_base_sink_set_blocksize</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> blocksize</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="GstBaseSink.html#gst-base-sink-get-blocksize" title="gst_base_sink_get_blocksize ()">gst_base_sink_get_blocksize</a> (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+----GstBaseSink
</pre>
</div>
"<a class="link" href="GstBaseSink.html#GstBaseSink--async" title='The "async" property'>async</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
"<a class="link" href="GstBaseSink.html#GstBaseSink--blocksize" title='The "blocksize" property'>blocksize</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write
"<a class="link" href="GstBaseSink.html#GstBaseSink--enable-last-sample" title='The "enable-last-sample" property'>enable-last-sample</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
- "<a class="link" href="GstBaseSink.html#GstBaseSink--last-sample" title='The "last-sample" property'>last-sample</a>" <a href="../gstreamer-1.0/gstreamer-GstSample.html#GstSample"><span class="type">GstSample</span></a>* : Read
+ "<a class="link" href="GstBaseSink.html#GstBaseSink--last-sample" title='The "last-sample" property'>last-sample</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstSample.html#GstSample"><span class="type">GstSample</span></a>* : Read
"<a class="link" href="GstBaseSink.html#GstBaseSink--max-lateness" title='The "max-lateness" property'>max-lateness</a>" <span class="type">gint64</span> : Read / Write
"<a class="link" href="GstBaseSink.html#GstBaseSink--qos" title='The "qos" property'>qos</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
"<a class="link" href="GstBaseSink.html#GstBaseSink--render-delay" title='The "render-delay" property'>render-delay</a>" <span class="type">guint64</span> : Read / Write
</div>
<div class="refsect1">
<a name="GstBaseSink.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> is the base class for sink elements in GStreamer, such as
+xvimagesink or filesink. It is a layer on top of <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> that provides a
+simplified interface to plugin writers. <a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> handles many details
+for you, for example: preroll, clock synchronization, state changes,
+activation in push or pull mode, and queries.
+</p>
+<p>
+In most cases, when writing sink elements, there is no need to implement
+class methods from <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> or to set functions on pads, because the
+<a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> infrastructure should be sufficient.
+</p>
+<p>
+<a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> provides support for exactly one sink pad, which should be
+named "sink". A sink implementation (subclass of <a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a>) should
+install a pad template in its class_init function, like so:
+</p>
+<div class="informalexample">
+ <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+ <tbody>
+ <tr>
+ <td class="listing_lines" align="right"><pre>1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16</pre></td>
+ <td class="listing_code"><pre class="programlisting"><span class="gtkdoc kwb">static void</span>
+<span class="function">my_element_class_init</span> <span class="gtkdoc opt">(</span>GstMyElementClass <span class="gtkdoc opt">*</span>klass<span class="gtkdoc opt">)</span>
+<span class="gtkdoc opt">{</span>
+ GstElementClass <span class="gtkdoc opt">*</span>gstelement_class <span class="gtkdoc opt">=</span> <span class="function">GST_ELEMENT_CLASS</span> <span class="gtkdoc opt">(</span>klass<span class="gtkdoc opt">);</span>
+
+ <span class="gtkdoc slc">// sinktemplate should be a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPadTemplate.html#GstStaticPadTemplate">GstStaticPadTemplate</a> with direction</span>
+ <span class="gtkdoc slc">// <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GST-PAD-SINK:CAPS">GST_PAD_SINK</a> and name "sink"</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-class-add-pad-template">gst_element_class_add_pad_template</a></span> <span class="gtkdoc opt">(</span>gstelement_class<span class="gtkdoc opt">,</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPadTemplate.html#gst-static-pad-template-get">gst_static_pad_template_get</a></span> <span class="gtkdoc opt">(&</span>sinktemplate<span class="gtkdoc opt">));</span>
+
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-class-set-static-metadata">gst_element_class_set_static_metadata</a></span> <span class="gtkdoc opt">(</span>gstelement_class<span class="gtkdoc opt">,</span>
+ <span class="string">"Sink name"</span><span class="gtkdoc opt">,</span>
+ <span class="string">"Sink"</span><span class="gtkdoc opt">,</span>
+ <span class="string">"My Sink element"</span><span class="gtkdoc opt">,</span>
+ <span class="string">"The author <my.sink@my.email>"</span><span class="gtkdoc opt">);</span>
+<span class="gtkdoc opt">}</span></pre></td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+
+<p>
+</p>
+<p>
+<a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> will handle the prerolling correctly. This means that it will
+return <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GST-STATE-CHANGE-ASYNC:CAPS"><span class="type">GST_STATE_CHANGE_ASYNC</span></a> from a state change to PAUSED until the first
+buffer arrives in this element. The base class will call the
+<a class="link" href="GstBaseSink.html#GstBaseSinkClass.preroll"><code class="function">GstBaseSinkClass.preroll()</code></a> vmethod with this preroll buffer and will then
+commit the state change to the next asynchronously pending state.
+</p>
+<p>
+When the element is set to PLAYING, <a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> will synchronise on the
+clock using the times returned from <a class="link" href="GstBaseSink.html#GstBaseSinkClass.get-times"><code class="function">GstBaseSinkClass.get_times()</code></a>. If this
+function returns <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GST-CLOCK-TIME-NONE:CAPS"><span class="type">GST_CLOCK_TIME_NONE</span></a> for the start time, no synchronisation
+will be done. Synchronisation can be disabled entirely by setting the object
+<a class="link" href="GstBaseSink.html#GstBaseSink--sync" title='The "sync" property'><span class="type">"sync"</span></a> property to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>.
+</p>
+<p>
+After synchronisation the virtual method <a class="link" href="GstBaseSink.html#GstBaseSinkClass.render"><code class="function">GstBaseSinkClass.render()</code></a> will be
+called. Subclasses should minimally implement this method.
+</p>
+<p>
+Subclasses that synchronise on the clock in the <a class="link" href="GstBaseSink.html#GstBaseSinkClass.render"><code class="function">GstBaseSinkClass.render()</code></a>
+method are supported as well. These classes typically receive a buffer in
+the render method and can then potentially block on the clock while
+rendering. A typical example is an audiosink.
+These subclasses can use <a class="link" href="GstBaseSink.html#gst-base-sink-wait-preroll" title="gst_base_sink_wait_preroll ()"><code class="function">gst_base_sink_wait_preroll()</code></a> to perform the
+blocking wait.
+</p>
+<p>
+Upon receiving the EOS event in the PLAYING state, <a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> will wait
+for the clock to reach the time indicated by the stop time of the last
+<a class="link" href="GstBaseSink.html#GstBaseSinkClass.get-times"><code class="function">GstBaseSinkClass.get_times()</code></a> call before posting an EOS message. When the
+element receives EOS in PAUSED, preroll completes, the event is queued and an
+EOS message is posted when going to PLAYING.
+</p>
+<p>
+<a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> will internally use the <span class="type">GST_EVENT_NEWSEGMENT</span> events to schedule
+synchronisation and clipping of buffers. Buffers that fall completely outside
+of the current segment are dropped. Buffers that fall partially in the
+segment are rendered (and prerolled). Subclasses should do any subbuffer
+clipping themselves when needed.
+</p>
+<p>
+<a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> will by default report the current playback position in
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GST-FORMAT-TIME:CAPS"><span class="type">GST_FORMAT_TIME</span></a> based on the current clock time and segment information.
+If no clock has been set on the element, the query will be forwarded
+upstream.
+</p>
+<p>
+The <a class="link" href="GstBaseSink.html#GstBaseSinkClass.set-caps"><code class="function">GstBaseSinkClass.set_caps()</code></a> function will be called when the subclass
+should configure itself to process a specific media type.
+</p>
+<p>
+The <a class="link" href="GstBaseSink.html#GstBaseSinkClass.start"><code class="function">GstBaseSinkClass.start()</code></a> and <a class="link" href="GstBaseSink.html#GstBaseSinkClass.stop"><code class="function">GstBaseSinkClass.stop()</code></a> virtual methods
+will be called when resources should be allocated. Any
+<a class="link" href="GstBaseSink.html#GstBaseSinkClass.preroll"><code class="function">GstBaseSinkClass.preroll()</code></a>, <a class="link" href="GstBaseSink.html#GstBaseSinkClass.render"><code class="function">GstBaseSinkClass.render()</code></a> and
+<a class="link" href="GstBaseSink.html#GstBaseSinkClass.set-caps"><code class="function">GstBaseSinkClass.set_caps()</code></a> function will be called between the
+<a class="link" href="GstBaseSink.html#GstBaseSinkClass.start"><code class="function">GstBaseSinkClass.start()</code></a> and <a class="link" href="GstBaseSink.html#GstBaseSinkClass.stop"><code class="function">GstBaseSinkClass.stop()</code></a> calls.
+</p>
+<p>
+The <a class="link" href="GstBaseSink.html#GstBaseSinkClass.event"><code class="function">GstBaseSinkClass.event()</code></a> virtual method will be called when an event is
+received by <a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a>. Normally this method should only be overriden by
+very specific elements (such as file sinks) which need to handle the
+newsegment event specially.
+</p>
+<p>
+The <a class="link" href="GstBaseSink.html#GstBaseSinkClass.unlock"><code class="function">GstBaseSinkClass.unlock()</code></a> method is called when the elements should
+unblock any blocking operations they perform in the
+<a class="link" href="GstBaseSink.html#GstBaseSinkClass.render"><code class="function">GstBaseSinkClass.render()</code></a> method. This is mostly useful when the
+<a class="link" href="GstBaseSink.html#GstBaseSinkClass.render"><code class="function">GstBaseSinkClass.render()</code></a> method performs a blocking write on a file
+descriptor, for example.
+</p>
+<p>
+The <a class="link" href="GstBaseSink.html#GstBaseSink--max-lateness" title='The "max-lateness" property'><span class="type">"max-lateness"</span></a> property affects how the sink deals with
+buffers that arrive too late in the sink. A buffer arrives too late in the
+sink when the presentation time (as a combination of the last segment, buffer
+timestamp and element base_time) plus the duration is before the current
+time of the clock.
+If the frame is later than max-lateness, the sink will drop the buffer
+without calling the render method.
+This feature is disabled if sync is disabled, the
+<a class="link" href="GstBaseSink.html#GstBaseSinkClass.get-times"><code class="function">GstBaseSinkClass.get_times()</code></a> method does not return a valid start time or
+max-lateness is set to -1 (the default).
+Subclasses can use <a class="link" href="GstBaseSink.html#gst-base-sink-set-max-lateness" title="gst_base_sink_set_max_lateness ()"><code class="function">gst_base_sink_set_max_lateness()</code></a> to configure the
+max-lateness value.
+</p>
+<p>
+The <a class="link" href="GstBaseSink.html#GstBaseSink--qos" title='The "qos" property'><span class="type">"qos"</span></a> property will enable the quality-of-service features of
+the basesink which gather statistics about the real-time performance of the
+clock synchronisation. For each buffer received in the sink, statistics are
+gathered and a QOS event is sent upstream with these numbers. This
+information can then be used by upstream elements to reduce their processing
+rate, for example.
+</p>
+<p>
+The <a class="link" href="GstBaseSink.html#GstBaseSink--async" title='The "async" property'><span class="type">"async"</span></a> property can be used to instruct the sink to never
+perform an ASYNC state change. This feature is mostly usable when dealing
+with non-synchronized streams or sparse streams.
+</p>
+<p>
+Last reviewed on 2007-08-29 (0.10.15)
+</p>
</div>
<div class="refsect1">
<a name="GstBaseSink.details"></a><h2>Details</h2>
<col align="left" valign="top">
<tbody>
<tr>
-<td><p><span class="term"><a href="../gstreamer-1.0/GstElement.html#GstElementClass"><span class="type">GstElementClass</span></a> <em class="structfield"><code><a name="GstBaseSinkClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GstElementClass"><span class="type">GstElementClass</span></a> <em class="structfield"><code><a name="GstBaseSinkClass.parent-class"></a>parent_class</code></em>;</span></p></td>
<td>Element parent class</td>
</tr>
<tr>
</tr>
<tr>
<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSinkClass.query"></a>query</code></em> ()</span></p></td>
-<td>perform a <a href="../gstreamer-1.0/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a> on the element.</td>
+<td>perform a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstQuery.html#GstQuery"><span class="type">GstQuery</span></a> on the element.</td>
</tr>
<tr>
<td><p><span class="term"><em class="structfield"><code><a name="GstBaseSinkClass.event"></a>event</code></em> ()</span></p></td>
<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_base_sink_query_latency (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *live</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *upstream_live</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *min_latency</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *max_latency</code></em>);</pre>
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *min_latency</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *max_latency</code></em>);</pre>
<p>
Query the sink for the latency parameters. The latency will be queried from
the upstream elements. <em class="parameter"><code>live</code></em> will be TRUE if <em class="parameter"><code>sink</code></em> is configured to
<hr>
<div class="refsect2">
<a name="gst-base-sink-get-latency"></a><h3>gst_base_sink_get_latency ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_base_sink_get_latency (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_base_sink_get_latency (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
<p>
Get the currently configured latency.
</p>
<hr>
<div class="refsect2">
<a name="gst-base-sink-do-preroll"></a><h3>gst_base_sink_do_preroll ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_base_sink_do_preroll (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstMiniObject.html#GstMiniObject"><span class="type">GstMiniObject</span></a> *obj</code></em>);</pre>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_base_sink_do_preroll (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMiniObject.html#GstMiniObject"><span class="type">GstMiniObject</span></a> *obj</code></em>);</pre>
<p>
If the <em class="parameter"><code>sink</code></em> spawns its own thread for pulling buffers from upstream it
should call this method after it has pulled a buffer. If the element needed
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
<td>
-<a href="../gstreamer-1.0/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> if the preroll completed and processing can
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> if the preroll completed and processing can
continue. Any other return value should be returned from the render vmethod.</td>
</tr>
</tbody>
<hr>
<div class="refsect2">
<a name="gst-base-sink-wait-preroll"></a><h3>gst_base_sink_wait_preroll ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_base_sink_wait_preroll (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_base_sink_wait_preroll (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
<p>
If the <a class="link" href="GstBaseSink.html#GstBaseSinkClass.render"><code class="function">GstBaseSinkClass.render()</code></a> method performs its own synchronisation
against the clock it must unblock when going from PLAYING to the PAUSED state
</p>
<p>
This function will block until a state change to PLAYING happens (in which
-case this function returns <a href="../gstreamer-1.0/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a>) or the processing must be stopped due
+case this function returns <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a>) or the processing must be stopped due
to a state change to READY or a FLUSH event (in which case this function
-returns <a href="../gstreamer-1.0/GstPad.html#GST-FLOW-FLUSHING:CAPS"><span class="type">GST_FLOW_FLUSHING</span></a>).
+returns <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GST-FLOW-FLUSHING:CAPS"><span class="type">GST_FLOW_FLUSHING</span></a>).
</p>
<p>
This function should only be called with the PREROLL_LOCK held, like in the
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
<td>
-<a href="../gstreamer-1.0/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> if the preroll completed and processing can
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> if the preroll completed and processing can
continue. Any other return value should be returned from the render vmethod.</td>
</tr>
</tbody>
<hr>
<div class="refsect2">
<a name="gst-base-sink-wait-clock"></a><h3>gst_base_sink_wait_clock ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstClock.html#GstClockReturn"><span class="returnvalue">GstClockReturn</span></a> gst_base_sink_wait_clock (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> *jitter</code></em>);</pre>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockReturn"><span class="returnvalue">GstClockReturn</span></a> gst_base_sink_wait_clock (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> time</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> *jitter</code></em>);</pre>
<p>
This function will block until <em class="parameter"><code>time</code></em> is reached. It is usually called by
subclasses that use their own internal synchronisation.
</p>
<p>
-If <em class="parameter"><code>time</code></em> is not valid, no sycnhronisation is done and <a href="../gstreamer-1.0/GstClock.html#GST-CLOCK-BADTIME:CAPS"><span class="type">GST_CLOCK_BADTIME</span></a> is
+If <em class="parameter"><code>time</code></em> is not valid, no sycnhronisation is done and <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GST-CLOCK-BADTIME:CAPS"><span class="type">GST_CLOCK_BADTIME</span></a> is
returned. Likewise, if synchronisation is disabled in the element or there
-is no clock, no synchronisation is done and <a href="../gstreamer-1.0/GstClock.html#GST-CLOCK-BADTIME:CAPS"><span class="type">GST_CLOCK_BADTIME</span></a> is returned.
+is no clock, no synchronisation is done and <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GST-CLOCK-BADTIME:CAPS"><span class="type">GST_CLOCK_BADTIME</span></a> is returned.
</p>
<p>
This function should only be called with the PREROLL_LOCK held, like when
</tr>
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td><a href="../gstreamer-1.0/GstClock.html#GstClockReturn"><span class="type">GstClockReturn</span></a></td>
+<td><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockReturn"><span class="type">GstClockReturn</span></a></td>
</tr>
</tbody>
</table></div>
<div class="refsect2">
<a name="gst-base-sink-set-ts-offset"></a><h3>gst_base_sink_set_ts_offset ()</h3>
<pre class="programlisting"><span class="returnvalue">void</span> gst_base_sink_set_ts_offset (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> offset</code></em>);</pre>
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> offset</code></em>);</pre>
<p>
Adjust the synchronisation of <em class="parameter"><code>sink</code></em> with <em class="parameter"><code>offset</code></em>. A negative value will
render buffers earlier than their timestamp. A positive value will delay
<hr>
<div class="refsect2">
<a name="gst-base-sink-get-ts-offset"></a><h3>gst_base_sink_get_ts_offset ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstClock.html#GstClockTimeDiff"><span class="returnvalue">GstClockTimeDiff</span></a> gst_base_sink_get_ts_offset (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTimeDiff"><span class="returnvalue">GstClockTimeDiff</span></a> gst_base_sink_get_ts_offset (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
<p>
Get the synchronisation offset of <em class="parameter"><code>sink</code></em>.
</p>
<div class="refsect2">
<a name="gst-base-sink-set-render-delay"></a><h3>gst_base_sink_set_render_delay ()</h3>
<pre class="programlisting"><span class="returnvalue">void</span> gst_base_sink_set_render_delay (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> delay</code></em>);</pre>
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> delay</code></em>);</pre>
<p>
Set the render delay in <em class="parameter"><code>sink</code></em> to <em class="parameter"><code>delay</code></em>. The render delay is the time
between actual rendering of a buffer and its synchronisation time. Some
<hr>
<div class="refsect2">
<a name="gst-base-sink-get-render-delay"></a><h3>gst_base_sink_get_render_delay ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_base_sink_get_render_delay (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a> gst_base_sink_get_render_delay (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
<p>
Get the render delay of <em class="parameter"><code>sink</code></em>. see <a class="link" href="GstBaseSink.html#gst-base-sink-set-render-delay" title="gst_base_sink_set_render_delay ()"><code class="function">gst_base_sink_set_render_delay()</code></a> for more
information about the render delay.
<hr>
<div class="refsect2">
<a name="gst-base-sink-get-last-sample"></a><h3>gst_base_sink_get_last_sample ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/gstreamer-GstSample.html#GstSample"><span class="returnvalue">GstSample</span></a> * gst_base_sink_get_last_sample (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstSample.html#GstSample"><span class="returnvalue">GstSample</span></a> * gst_base_sink_get_last_sample (<em class="parameter"><code><a class="link" href="GstBaseSink.html" title="GstBaseSink"><span class="type">GstBaseSink</span></a> *sink</code></em>);</pre>
<p>
Get the last sample that arrived in the sink and was used for preroll or for
rendering. This property can be used to generate thumbnails.
</p>
<p>
-The <a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> on the sample can be used to determine the type of the buffer.
+The <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> on the sample can be used to determine the type of the buffer.
</p>
<p>
Free-function: gst_sample_unref
</tr>
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>a <a href="../gstreamer-1.0/gstreamer-GstSample.html#GstSample"><span class="type">GstSample</span></a>. <a href="../gstreamer-1.0/gstreamer-GstSample.html#gst-sample-unref"><code class="function">gst_sample_unref()</code></a> after usage.
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstSample.html#GstSample"><span class="type">GstSample</span></a>. <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstSample.html#gst-sample-unref"><code class="function">gst_sample_unref()</code></a> after usage.
This function returns NULL when no buffer has arrived in the sink yet
or when the sink is not in PAUSED or PLAYING. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
</td>
<pre class="programlisting">#define GST_BASE_SINK_PAD(obj) (GST_BASE_SINK_CAST (obj)->sinkpad)
</pre>
<p>
-Gives the pointer to the <a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> object of the element.
+Gives the pointer to the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> object of the element.
</p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<hr>
<div class="refsect2">
<a name="GstBaseSink--last-sample"></a><h3>The <code class="literal">"last-sample"</code> property</h3>
-<pre class="programlisting"> "last-sample" <a href="../gstreamer-1.0/gstreamer-GstSample.html#GstSample"><span class="type">GstSample</span></a>* : Read</pre>
+<pre class="programlisting"> "last-sample" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstSample.html#GstSample"><span class="type">GstSample</span></a>* : Read</pre>
<p>
The last buffer that arrived in the sink and was used for preroll or for
rendering. This property can be used to generate thumbnails. This property
<p>Default value: 0</p>
</div>
</div>
+<div class="refsect1">
+<a name="GstBaseSink.see-also"></a><h2>See Also</h2>
+<a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a>, <a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a>
+</div>
</div>
<div class="footer">
<hr>
struct <a class="link" href="GstBaseSrc.html#GstBaseSrc-struct" title="struct GstBaseSrc">GstBaseSrc</a>;
struct <a class="link" href="GstBaseSrc.html#GstBaseSrcClass" title="struct GstBaseSrcClass">GstBaseSrcClass</a>;
enum <a class="link" href="GstBaseSrc.html#GstBaseSrcFlags" title="enum GstBaseSrcFlags">GstBaseSrcFlags</a>;
-<a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstBaseSrc.html#gst-base-src-wait-playing" title="gst_base_src_wait_playing ()">gst_base_src_wait_playing</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="GstBaseSrc.html#gst-base-src-wait-playing" title="gst_base_src_wait_playing ()">gst_base_src_wait_playing</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GstBaseSrc.html#gst-base-src-is-live" title="gst_base_src_is_live ()">gst_base_src_is_live</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>);
<span class="returnvalue">void</span> <a class="link" href="GstBaseSrc.html#gst-base-src-set-live" title="gst_base_src_set_live ()">gst_base_src_set_live</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> live</code></em>);
<span class="returnvalue">void</span> <a class="link" href="GstBaseSrc.html#gst-base-src-set-format" title="gst_base_src_set_format ()">gst_base_src_set_format</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> format</code></em>);
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> format</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GstBaseSrc.html#gst-base-src-query-latency" title="gst_base_src_query_latency ()">gst_base_src_query_latency</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *live</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *min_latency</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *max_latency</code></em>);
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *min_latency</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *max_latency</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="GstBaseSrc.html#gst-base-src-get-blocksize" title="gst_base_src_get_blocksize ()">gst_base_src_get_blocksize</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>);
<span class="returnvalue">void</span> <a class="link" href="GstBaseSrc.html#gst-base-src-set-blocksize" title="gst_base_src_set_blocksize ()">gst_base_src_set_blocksize</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> blocksize</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GstBaseSrc.html#gst-base-src-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="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</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>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstAllocator.html"><span class="type">GstAllocator</span></a> **allocator</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstAllocator.html#GstAllocationParams"><span class="type">GstAllocationParams</span></a> *params</code></em>);
-<a href="../gstreamer-1.0/gstreamer-GstBufferPool.html#GstBufferPool"><span class="returnvalue">GstBufferPool</span></a> * <a class="link" href="GstBaseSrc.html#gst-base-src-get-buffer-pool" title="gst_base_src_get_buffer_pool ()">gst_base_src_get_buffer_pool</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/GstAllocator.html"><span class="type">GstAllocator</span></a> **allocator</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html#GstAllocationParams"><span class="type">GstAllocationParams</span></a> *params</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferPool.html#GstBufferPool"><span class="returnvalue">GstBufferPool</span></a> * <a class="link" href="GstBaseSrc.html#gst-base-src-get-buffer-pool" title="gst_base_src_get_buffer_pool ()">gst_base_src_get_buffer_pool</a> (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>);
#define <a class="link" href="GstBaseSrc.html#GST-BASE-SRC-PAD:CAPS" title="GST_BASE_SRC_PAD()">GST_BASE_SRC_PAD</a> (obj)
</pre>
</div>
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+----GstBaseSrc
+----<a class="link" href="GstPushSrc.html" title="GstPushSrc">GstPushSrc</a>
</pre>
<p>
</p>
<p>
-The source can be configured to operate in any <a href="../gstreamer-1.0/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> with the
+The source can be configured to operate in any <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> with the
<a class="link" href="GstBaseSrc.html#gst-base-src-set-format" title="gst_base_src_set_format ()"><code class="function">gst_base_src_set_format()</code></a> method. The currently set format determines
-the format of the internal <a href="../gstreamer-1.0/gstreamer-GstSegment.html#GstSegment"><span class="type">GstSegment</span></a> and any <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GST-EVENT-NEWSEGMENT:CAPS"><span class="type">GST_EVENT_NEWSEGMENT</span></a>
-events. The default format for <a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> is <a href="../gstreamer-1.0/gstreamer-GstFormat.html#GST-FORMAT-BYTES:CAPS"><span class="type">GST_FORMAT_BYTES</span></a>.
+the format of the internal <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstSegment.html#GstSegment"><span class="type">GstSegment</span></a> and any <span class="type">GST_EVENT_NEWSEGMENT</span>
+events. The default format for <a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> is <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GST-FORMAT-BYTES:CAPS"><span class="type">GST_FORMAT_BYTES</span></a>.
</p>
<p>
<a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> always supports push mode scheduling. If the following
conditions are met, it also supports pull mode scheduling:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
-<li class="listitem"><p>The format is set to <a href="../gstreamer-1.0/gstreamer-GstFormat.html#GST-FORMAT-BYTES:CAPS"><span class="type">GST_FORMAT_BYTES</span></a> (default).</p></li>
+<li class="listitem"><p>The format is set to <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GST-FORMAT-BYTES:CAPS"><span class="type">GST_FORMAT_BYTES</span></a> (default).</p></li>
<li class="listitem"><p><a class="link" href="GstBaseSrc.html#GstBaseSrcClass.is-seekable"><code class="function">GstBaseSrcClass.is_seekable()</code></a> returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>.</p></li>
</ul></div>
<p>
If all the conditions are met for operating in pull mode, <a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> is
automatically seekable in push mode as well. The following conditions must
be met to make the element seekable in push mode when the format is not
-<a href="../gstreamer-1.0/gstreamer-GstFormat.html#GST-FORMAT-BYTES:CAPS"><span class="type">GST_FORMAT_BYTES</span></a>:
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GST-FORMAT-BYTES:CAPS"><span class="type">GST_FORMAT_BYTES</span></a>:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p>
<a class="link" href="GstBaseSrc.html#GstBaseSrcClass.create"><code class="function">GstBaseSrcClass.create()</code></a> method will not be called in PAUSED but only in
PLAYING. To signal the pipeline that the element will not produce data, the
return value from the READY to PAUSED state will be
-<a href="../gstreamer-1.0/GstElement.html#GST-STATE-CHANGE-NO-PREROLL:CAPS"><span class="type">GST_STATE_CHANGE_NO_PREROLL</span></a>.
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GST-STATE-CHANGE-NO-PREROLL:CAPS"><span class="type">GST_STATE_CHANGE_NO_PREROLL</span></a>.
</p>
<p>
A typical live source will timestamp the buffers it creates with the
8
9
10
-11</pre></td>
+11
+12
+13
+14
+15</pre></td>
<td class="listing_code"><pre class="programlisting"><span class="gtkdoc kwb">static void</span>
<span class="function">my_element_class_init</span> <span class="gtkdoc opt">(</span>GstMyElementClass <span class="gtkdoc opt">*</span>klass<span class="gtkdoc opt">)</span>
<span class="gtkdoc opt">{</span>
GstElementClass <span class="gtkdoc opt">*</span>gstelement_class <span class="gtkdoc opt">=</span> <span class="function">GST_ELEMENT_CLASS</span> <span class="gtkdoc opt">(</span>klass<span class="gtkdoc opt">);</span>
- <span class="gtkdoc slc">// srctemplate should be a <a href="../gstreamer-1.0/GstPadTemplate.html#GstStaticPadTemplate">GstStaticPadTemplate</a> with direction</span>
- <span class="gtkdoc slc">// <a href="../gstreamer-1.0/GstPad.html#GST-PAD-SRC:CAPS">GST_PAD_SRC</a> and name "src"</span>
- <span class="function"><a href="../gstreamer-1.0/GstElement.html#gst-element-class-add-pad-template">gst_element_class_add_pad_template</a></span> <span class="gtkdoc opt">(</span>gstelement_class<span class="gtkdoc opt">,</span>
- <span class="function"><a href="../gstreamer-1.0/GstPadTemplate.html#gst-static-pad-template-get">gst_static_pad_template_get</a></span> <span class="gtkdoc opt">(&</span>srctemplate<span class="gtkdoc opt">));</span>
- <span class="gtkdoc slc">// see <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElementFactory.html#GstElementDetails">GstElementDetails</a></span>
- <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-class-set-details">gst_element_class_set_details</a></span> <span class="gtkdoc opt">(</span>gstelement_class<span class="gtkdoc opt">, &</span>details<span class="gtkdoc opt">);</span>
+ <span class="gtkdoc slc">// srctemplate should be a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPadTemplate.html#GstStaticPadTemplate">GstStaticPadTemplate</a> with direction</span>
+ <span class="gtkdoc slc">// <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GST-PAD-SRC:CAPS">GST_PAD_SRC</a> and name "src"</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-class-add-pad-template">gst_element_class_add_pad_template</a></span> <span class="gtkdoc opt">(</span>gstelement_class<span class="gtkdoc opt">,</span>
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPadTemplate.html#gst-static-pad-template-get">gst_static_pad_template_get</a></span> <span class="gtkdoc opt">(&</span>srctemplate<span class="gtkdoc opt">));</span>
+
+ <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-class-set-static-metadata">gst_element_class_set_static_metadata</a></span> <span class="gtkdoc opt">(</span>gstelement_class<span class="gtkdoc opt">,</span>
+ <span class="string">"Source name"</span><span class="gtkdoc opt">,</span>
+ <span class="string">"Source"</span><span class="gtkdoc opt">,</span>
+ <span class="string">"My Source element"</span><span class="gtkdoc opt">,</span>
+ <span class="string">"The author <my.sink@my.email>"</span><span class="gtkdoc opt">);</span>
<span class="gtkdoc opt">}</span></pre></td>
</tr>
</tbody>
<p>
</p>
<div class="refsect2">
-<a name="idp5184896"></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
<p>
An application may send an EOS event to a source element to make it
perform the EOS logic (send EOS event downstream or post a
-<a href="../gstreamer-1.0/gstreamer-GstMessage.html#GST-MESSAGE-SEGMENT-DONE:CAPS"><span class="type">GST_MESSAGE_SEGMENT_DONE</span></a> on the bus). This can typically be done
-with the <a href="../gstreamer-1.0/GstElement.html#gst-element-send-event"><code class="function">gst_element_send_event()</code></a> function on the element or its parent bin.
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GST-MESSAGE-SEGMENT-DONE:CAPS"><span class="type">GST_MESSAGE_SEGMENT_DONE</span></a> on the bus). This can typically be done
+with the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-send-event"><code class="function">gst_element_send_event()</code></a> function on the element or its parent bin.
</p>
<p>
After the EOS has been sent to the element, the application should wait for
<col align="left" valign="top">
<tbody>
<tr>
-<td><p><span class="term"><a href="../gstreamer-1.0/GstElement.html#GstElementClass"><span class="type">GstElementClass</span></a> <em class="structfield"><code><a name="GstBaseSrcClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GstElementClass"><span class="type">GstElementClass</span></a> <em class="structfield"><code><a name="GstBaseSrcClass.parent-class"></a>parent_class</code></em>;</span></p></td>
<td>Element parent class</td>
</tr>
<tr>
} GstBaseSrcFlags;
</pre>
<p>
-The <a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> flags that a basesrc element may have.
+The <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> flags that a basesrc element may have.
</p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<hr>
<div class="refsect2">
<a name="gst-base-src-wait-playing"></a><h3>gst_base_src_wait_playing ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_base_src_wait_playing (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>);</pre>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_base_src_wait_playing (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>);</pre>
<p>
If the <a class="link" href="GstBaseSrc.html#GstBaseSrcClass.create"><code class="function">GstBaseSrcClass.create()</code></a> method performs its own synchronisation
against the clock it must unblock when going from PLAYING to the PAUSED state
</p>
<p>
This function will block until a state change to PLAYING happens (in which
-case this function returns <a href="../gstreamer-1.0/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a>) or the processing must be stopped due
+case this function returns <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a>) or the processing must be stopped due
to a state change to READY or a FLUSH event (in which case this function
-returns <a href="../gstreamer-1.0/GstPad.html#GST-FLOW-FLUSHING:CAPS"><span class="type">GST_FLOW_FLUSHING</span></a>).
+returns <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GST-FLOW-FLUSHING:CAPS"><span class="type">GST_FLOW_FLUSHING</span></a>).
</p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
<td>
-<a href="../gstreamer-1.0/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> if <em class="parameter"><code>src</code></em> is PLAYING and processing can
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> if <em class="parameter"><code>src</code></em> is PLAYING and processing can
continue. Any other return value should be returned from the create vmethod.</td>
</tr>
</tbody>
<div class="refsect2">
<a name="gst-base-src-set-format"></a><h3>gst_base_src_set_format ()</h3>
<pre class="programlisting"><span class="returnvalue">void</span> gst_base_src_set_format (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> format</code></em>);</pre>
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> format</code></em>);</pre>
<p>
Sets the default format of the source. This will be the format used
for sending NEW_SEGMENT events and for performing seeks.
operate in pull mode if the <a class="link" href="GstBaseSrc.html#GstBaseSrcClass.is-seekable"><code class="function">GstBaseSrcClass.is_seekable()</code></a> returns TRUE.
</p>
<p>
-This function must only be called in states < <a href="../gstreamer-1.0/GstElement.html#GST-STATE-PAUSED:CAPS"><code class="literal">GST_STATE_PAUSED</code></a>.
+This function must only be called in states < <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GST-STATE-PAUSED:CAPS"><code class="literal">GST_STATE_PAUSED</code></a>.
</p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<a name="gst-base-src-query-latency"></a><h3>gst_base_src_query_latency ()</h3>
<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_base_src_query_latency (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> *live</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *min_latency</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *max_latency</code></em>);</pre>
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *min_latency</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> *max_latency</code></em>);</pre>
<p>
Query the source for the latency parameters. <em class="parameter"><code>live</code></em> will be TRUE when <em class="parameter"><code>src</code></em> is
configured as a live source. <em class="parameter"><code>min_latency</code></em> will be set to the difference
<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,
<td>Stop value for the new segment</td>
</tr>
<tr>
-<td><p><span class="term"><em class="parameter"><code>position</code></em> :</span></p></td>
-<td>The position value for the new segent</td>
+<td><p><span class="term"><em class="parameter"><code>time</code></em> :</span></p></td>
+<td>The new time value for the start of the new segent</td>
</tr>
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
<div class="refsect2">
<a name="gst-base-src-set-caps"></a><h3>gst_base_src_set_caps ()</h3>
<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_base_src_set_caps (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps</code></em>);</pre>
<p>
Set new caps on the basesrc source pad.
</p>
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>caps</code></em> :</span></p></td>
-<td>a <a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>
</td>
</tr>
<tr>
<div class="refsect2">
<a name="gst-base-src-get-allocator"></a><h3>gst_base_src_get_allocator ()</h3>
<pre class="programlisting"><span class="returnvalue">void</span> gst_base_src_get_allocator (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstAllocator.html"><span class="type">GstAllocator</span></a> **allocator</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstAllocator.html#GstAllocationParams"><span class="type">GstAllocationParams</span></a> *params</code></em>);</pre>
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html"><span class="type">GstAllocator</span></a> **allocator</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html#GstAllocationParams"><span class="type">GstAllocationParams</span></a> *params</code></em>);</pre>
<p>
Lets <a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> sub-classes to know the memory <em class="parameter"><code>allocator</code></em>
used by the base class and its <em class="parameter"><code>params</code></em>.
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>allocator</code></em> :</span></p></td>
-<td>the <a href="../gstreamer-1.0/GstAllocator.html"><span class="type">GstAllocator</span></a>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html"><span class="type">GstAllocator</span></a>
used. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
</td>
</tr>
<hr>
<div class="refsect2">
<a name="gst-base-src-get-buffer-pool"></a><h3>gst_base_src_get_buffer_pool ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/gstreamer-GstBufferPool.html#GstBufferPool"><span class="returnvalue">GstBufferPool</span></a> * gst_base_src_get_buffer_pool (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>);</pre>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferPool.html#GstBufferPool"><span class="returnvalue">GstBufferPool</span></a> * gst_base_src_get_buffer_pool (<em class="parameter"><code><a class="link" href="GstBaseSrc.html" title="GstBaseSrc"><span class="type">GstBaseSrc</span></a> *src</code></em>);</pre>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
</tr>
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>the instance of the <a href="../gstreamer-1.0/gstreamer-GstBufferPool.html#GstBufferPool"><span class="type">GstBufferPool</span></a> used
+<td>the instance of the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferPool.html#GstBufferPool"><span class="type">GstBufferPool</span></a> used
by the src; free it after use it. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
</td>
</tr>
<pre class="programlisting">#define GST_BASE_SRC_PAD(obj) (GST_BASE_SRC_CAST (obj)->srcpad)
</pre>
<p>
-Gives the pointer to the <a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> object of the element.
+Gives the pointer to the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> object of the element.
</p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GstBaseTransform.html#gst-base-transform-is-passthrough" title="gst_base_transform_is_passthrough ()">gst_base_transform_is_passthrough</a> (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>);
<span class="returnvalue">void</span> <a class="link" href="GstBaseTransform.html#gst-base-transform-set-passthrough" title="gst_base_transform_set_passthrough ()">gst_base_transform_set_passthrough</a> (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> passthrough</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GstBaseTransform.html#gst-base-transform-set-prefer-passthrough" title="gst_base_transform_set_prefer_passthrough ()">gst_base_transform_set_prefer_passthrough</a>
+ (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> prefer_passthrough</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GstBaseTransform.html#gst-base-transform-is-in-place" title="gst_base_transform_is_in_place ()">gst_base_transform_is_in_place</a> (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>);
<span class="returnvalue">void</span> <a class="link" href="GstBaseTransform.html#gst-base-transform-set-in-place" title="gst_base_transform_set_in_place ()">gst_base_transform_set_in_place</a> (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> in_place</code></em>);
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> enabled</code></em>);
<span class="returnvalue">void</span> <a class="link" href="GstBaseTransform.html#gst-base-transform-update-qos" title="gst_base_transform_update_qos ()">gst_base_transform_update_qos</a> (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> proportion</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> diff</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> diff</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);
<span class="returnvalue">void</span> <a class="link" href="GstBaseTransform.html#gst-base-transform-set-gap-aware" title="gst_base_transform_set_gap_aware ()">gst_base_transform_set_gap_aware</a> (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> gap_aware</code></em>);
<span class="returnvalue">void</span> <a class="link" href="GstBaseTransform.html#gst-base-transform-get-allocator" title="gst_base_transform_get_allocator ()">gst_base_transform_get_allocator</a> (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstAllocator.html"><span class="type">GstAllocator</span></a> **allocator</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstAllocator.html#GstAllocationParams"><span class="type">GstAllocationParams</span></a> *params</code></em>);
-<a href="../gstreamer-1.0/gstreamer-GstBufferPool.html#GstBufferPool"><span class="returnvalue">GstBufferPool</span></a> * <a class="link" href="GstBaseTransform.html#gst-base-transform-get-buffer-pool" title="gst_base_transform_get_buffer_pool ()">gst_base_transform_get_buffer_pool</a> (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>);
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html"><span class="type">GstAllocator</span></a> **allocator</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html#GstAllocationParams"><span class="type">GstAllocationParams</span></a> *params</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferPool.html#GstBufferPool"><span class="returnvalue">GstBufferPool</span></a> * <a class="link" href="GstBaseTransform.html#gst-base-transform-get-buffer-pool" title="gst_base_transform_get_buffer_pool ()">gst_base_transform_get_buffer_pool</a> (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>);
#define <a class="link" href="GstBaseTransform.html#GST-BASE-TRANSFORM-SINK-NAME:CAPS" title="GST_BASE_TRANSFORM_SINK_NAME">GST_BASE_TRANSFORM_SINK_NAME</a>
#define <a class="link" href="GstBaseTransform.html#GST-BASE-TRANSFORM-SRC-NAME:CAPS" title="GST_BASE_TRANSFORM_SRC_NAME">GST_BASE_TRANSFORM_SRC_NAME</a>
#define <a class="link" href="GstBaseTransform.html#GST-BASE-TRANSFORM-SINK-PAD:CAPS" title="GST_BASE_TRANSFORM_SINK_PAD()">GST_BASE_TRANSFORM_SINK_PAD</a> (obj)
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+----GstBaseTransform
</pre>
</div>
<p>
</p>
<div class="refsect2">
-<a name="idp5388448"></a><h3>Use Cases</h3>
+<a name="idp6797872"></a><h3>Use Cases</h3>
<p>
</p>
<div class="orderedlist"><ol class="orderedlist" type="1">
</p>
<hr>
<div class="refsect2">
-<a name="idp6912544"></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">
<col align="left" valign="top">
<tbody>
<tr>
-<td><p><span class="term"><a href="../gstreamer-1.0/GstElement.html#GstElementClass"><span class="type">GstElementClass</span></a> <em class="structfield"><code><a name="GstBaseTransformClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GstElementClass"><span class="type">GstElementClass</span></a> <em class="structfield"><code><a name="GstBaseTransformClass.parent-class"></a>parent_class</code></em>;</span></p></td>
<td>Element parent class</td>
</tr>
<tr>
</div>
<hr>
<div class="refsect2">
+<a name="gst-base-transform-set-prefer-passthrough"></a><h3>gst_base_transform_set_prefer_passthrough ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_base_transform_set_prefer_passthrough
+ (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> prefer_passthrough</code></em>);</pre>
+<p>
+If <em class="parameter"><code>prefer_passthrough</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> (the default), <em class="parameter"><code>trans</code></em> will check and
+prefer passthrough caps from the list of caps returned by the
+transform_caps vmethod.
+</p>
+<p>
+If set to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>, the element must order the caps returned from the
+transform_caps function in such a way that the prefered format is
+first in the list. This can be interesting for transforms that can do
+passthrough transforms but prefer to do something else, like a
+capsfilter.
+</p>
+<p>
+MT safe.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>trans</code></em> :</span></p></td>
+<td>a <a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>prefer_passthrough</code></em> :</span></p></td>
+<td>New state</td>
+</tr>
+</tbody>
+</table></div>
+<p class="since">Since 1.0.1</p>
+</div>
+<hr>
+<div class="refsect2">
<a name="gst-base-transform-is-in-place"></a><h3>gst_base_transform_is_in_place ()</h3>
<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_base_transform_is_in_place (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>);</pre>
<p>
<a name="gst-base-transform-update-qos"></a><h3>gst_base_transform_update_qos ()</h3>
<pre class="programlisting"><span class="returnvalue">void</span> gst_base_transform_update_qos (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> proportion</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> diff</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);</pre>
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTimeDiff"><span class="type">GstClockTimeDiff</span></a> diff</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);</pre>
<p>
Set the QoS parameters in the transform. This function is called internally
when a QOS event is received but subclasses can provide custom information
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> gap_aware</code></em>);</pre>
<p>
If <em class="parameter"><code>gap_aware</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> (the default), output buffers will have the
-<a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GST-BUFFER-FLAG-GAP:CAPS"><code class="literal">GST_BUFFER_FLAG_GAP</code></a> flag unset.
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GST-BUFFER-FLAG-GAP:CAPS"><code class="literal">GST_BUFFER_FLAG_GAP</code></a> flag unset.
</p>
<p>
If set to <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, the element must handle output buffers with this flag set
<div class="refsect2">
<a name="gst-base-transform-get-allocator"></a><h3>gst_base_transform_get_allocator ()</h3>
<pre class="programlisting"><span class="returnvalue">void</span> gst_base_transform_get_allocator (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstAllocator.html"><span class="type">GstAllocator</span></a> **allocator</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstAllocator.html#GstAllocationParams"><span class="type">GstAllocationParams</span></a> *params</code></em>);</pre>
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html"><span class="type">GstAllocator</span></a> **allocator</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html#GstAllocationParams"><span class="type">GstAllocationParams</span></a> *params</code></em>);</pre>
<p>
Lets <a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> sub-classes to know the memory <em class="parameter"><code>allocator</code></em>
used by the base class and its <em class="parameter"><code>params</code></em>.
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>allocator</code></em> :</span></p></td>
-<td>the <a href="../gstreamer-1.0/GstAllocator.html"><span class="type">GstAllocator</span></a>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html"><span class="type">GstAllocator</span></a>
used. <span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
</td>
</tr>
<hr>
<div class="refsect2">
<a name="gst-base-transform-get-buffer-pool"></a><h3>gst_base_transform_get_buffer_pool ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/gstreamer-GstBufferPool.html#GstBufferPool"><span class="returnvalue">GstBufferPool</span></a> * gst_base_transform_get_buffer_pool (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>);</pre>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferPool.html#GstBufferPool"><span class="returnvalue">GstBufferPool</span></a> * gst_base_transform_get_buffer_pool (<em class="parameter"><code><a class="link" href="GstBaseTransform.html" title="GstBaseTransform"><span class="type">GstBaseTransform</span></a> *trans</code></em>);</pre>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
</tr>
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>the instance of the <a href="../gstreamer-1.0/gstreamer-GstBufferPool.html#GstBufferPool"><span class="type">GstBufferPool</span></a> used
+<td>the instance of the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBufferPool.html#GstBufferPool"><span class="type">GstBufferPool</span></a> used
by <em class="parameter"><code>trans</code></em>; free it after use it. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
</td>
</tr>
<pre class="programlisting">#define GST_BASE_TRANSFORM_SINK_PAD(obj) (GST_BASE_TRANSFORM_CAST (obj)->sinkpad)
</pre>
<p>
-Gives the pointer to the sink <a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> object of the element.
+Gives the pointer to the sink <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> object of the element.
</p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<pre class="programlisting">#define GST_BASE_TRANSFORM_SRC_PAD(obj) (GST_BASE_TRANSFORM_CAST (obj)->srcpad)
</pre>
<p>
-Gives the pointer to the source <a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> object of the element.
+Gives the pointer to the source <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> object of the element.
</p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<pre class="programlisting">#define GST_BASE_TRANSFORM_FLOW_DROPPED GST_FLOW_CUSTOM_SUCCESS
</pre>
<p>
-A <a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a> that can be returned from transform and transform_ip to
+A <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a> that can be returned from transform and transform_ip to
indicate that no output buffer was generated.
</p>
</div>
struct <a class="link" href="GstCollectPads.html#GstCollectPads-struct" title="struct GstCollectPads">GstCollectPads</a>;
struct <a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData">GstCollectData</a>;
<span class="returnvalue">void</span> (<a class="link" href="GstCollectPads.html#GstCollectDataDestroyNotify" title="GstCollectDataDestroyNotify ()">*GstCollectDataDestroyNotify</a>) (<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>);
-<a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (<a class="link" href="GstCollectPads.html#GstCollectPadsBufferFunction" title="GstCollectPadsBufferFunction ()">*GstCollectPadsBufferFunction</a>) (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (<a class="link" href="GstCollectPads.html#GstCollectPadsBufferFunction" title="GstCollectPadsBufferFunction ()">*GstCollectPadsBufferFunction</a>) (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> (<a class="link" href="GstCollectPads.html#GstCollectPadsCompareFunction" title="GstCollectPadsCompareFunction ()">*GstCollectPadsCompareFunction</a>) (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data1</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp1</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp1</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data2</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp2</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp2</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (<a class="link" href="GstCollectPads.html#GstCollectPadsEventFunction" title="GstCollectPadsEventFunction ()">*GstCollectPadsEventFunction</a>) (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *pad</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);
-<a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (<a class="link" href="GstCollectPads.html#GstCollectPadsClipFunction" title="GstCollectPadsClipFunction ()">*GstCollectPadsClipFunction</a>) (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (<a class="link" href="GstCollectPads.html#GstCollectPadsClipFunction" title="GstCollectPadsClipFunction ()">*GstCollectPadsClipFunction</a>) (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *inbuffer</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> **outbuffer</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *inbuffer</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> **outbuffer</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);
-<a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (<a class="link" href="GstCollectPads.html#GstCollectPadsFunction" title="GstCollectPadsFunction ()">*GstCollectPadsFunction</a>) (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (<a class="link" href="GstCollectPads.html#GstCollectPadsFunction" title="GstCollectPadsFunction ()">*GstCollectPadsFunction</a>) (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);
enum <a class="link" href="GstCollectPads.html#GstCollectPadsStateFlags" title="enum GstCollectPadsStateFlags">GstCollectPadsStateFlags</a>;
#define <a class="link" href="GstCollectPads.html#GST-COLLECT-PADS-STATE:CAPS" title="GST_COLLECT_PADS_STATE()">GST_COLLECT_PADS_STATE</a> (data)
#define <a class="link" href="GstCollectPads.html#GST-COLLECT-PADS-STREAM-UNLOCK:CAPS" title="GST_COLLECT_PADS_STREAM_UNLOCK()">GST_COLLECT_PADS_STREAM_UNLOCK</a> (pads)
<a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="returnvalue">GstCollectPads</span></a> * <a class="link" href="GstCollectPads.html#gst-collect-pads-new" title="gst_collect_pads_new ()">gst_collect_pads_new</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
<a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="returnvalue">GstCollectData</span></a> * <a class="link" href="GstCollectPads.html#gst-collect-pads-add-pad" title="gst_collect_pads_add_pad ()">gst_collect_pads_add_pad</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectDataDestroyNotify" title="GstCollectDataDestroyNotify ()"><span class="type">GstCollectDataDestroyNotify</span></a> destroy_notify</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> lock</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GstCollectPads.html#gst-collect-pads-remove-pad" title="gst_collect_pads_remove_pad ()">gst_collect_pads_remove_pad</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);
<span class="returnvalue">void</span> <a class="link" href="GstCollectPads.html#gst-collect-pads-start" title="gst_collect_pads_start ()">gst_collect_pads_start</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>);
<span class="returnvalue">void</span> <a class="link" href="GstCollectPads.html#gst-collect-pads-stop" title="gst_collect_pads_stop ()">gst_collect_pads_stop</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="GstCollectPads.html#gst-collect-pads-available" title="gst_collect_pads_available ()">gst_collect_pads_available</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="GstCollectPads.html#gst-collect-pads-flush" title="gst_collect_pads_flush ()">gst_collect_pads_flush</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>);
-<a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="GstCollectPads.html#gst-collect-pads-peek" title="gst_collect_pads_peek ()">gst_collect_pads_peek</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="GstCollectPads.html#gst-collect-pads-peek" title="gst_collect_pads_peek ()">gst_collect_pads_peek</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>);
-<a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="GstCollectPads.html#gst-collect-pads-pop" title="gst_collect_pads_pop ()">gst_collect_pads_pop</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="GstCollectPads.html#gst-collect-pads-pop" title="gst_collect_pads_pop ()">gst_collect_pads_pop</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>);
-<a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="GstCollectPads.html#gst-collect-pads-read-buffer" title="gst_collect_pads_read_buffer ()">gst_collect_pads_read_buffer</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="GstCollectPads.html#gst-collect-pads-read-buffer" title="gst_collect_pads_read_buffer ()">gst_collect_pads_read_buffer</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>);
-<a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="GstCollectPads.html#gst-collect-pads-take-buffer" title="gst_collect_pads_take_buffer ()">gst_collect_pads_take_buffer</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="GstCollectPads.html#gst-collect-pads-take-buffer" title="gst_collect_pads_take_buffer ()">gst_collect_pads_take_buffer</a> (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>);
<span class="returnvalue">void</span> <a class="link" href="GstCollectPads.html#gst-collect-pads-set-buffer-function" title="gst_collect_pads_set_buffer_function ()">gst_collect_pads_set_buffer_function</a>
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+----GstCollectPads
</pre>
</div>
</p></li>
<li class="listitem"><p>
Data can also be dequeued in byte units using the <a class="link" href="GstCollectPads.html#gst-collect-pads-available" title="gst_collect_pads_available ()"><code class="function">gst_collect_pads_available()</code></a>,
- <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstCollectPads.html#gst-collect-pads-read"><code class="function">gst_collect_pads_read()</code></a> and <a class="link" href="GstCollectPads.html#gst-collect-pads-flush" title="gst_collect_pads_flush ()"><code class="function">gst_collect_pads_flush()</code></a> calls.
+ <code class="function">gst_collect_pads_read()</code> and <a class="link" href="GstCollectPads.html#gst-collect-pads-flush" title="gst_collect_pads_flush ()"><code class="function">gst_collect_pads_flush()</code></a> calls.
</p></li>
<li class="listitem"><p>
Elements should call <a class="link" href="GstCollectPads.html#gst-collect-pads-start" title="gst_collect_pads_start ()"><code class="function">gst_collect_pads_start()</code></a> and <a class="link" href="GstCollectPads.html#gst-collect-pads-stop" title="gst_collect_pads_stop ()"><code class="function">gst_collect_pads_stop()</code></a> in
no pad is blocked and the element can finish streaming.
</p></li>
<li class="listitem"><p>
- <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstCollectPads.html#gst-collect-pads-collect"><code class="function">gst_collect_pads_collect()</code></a> and <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstCollectPads.html#gst-collect-pads-collect-range"><code class="function">gst_collect_pads_collect_range()</code></a> can be used by
- elements that start a <a href="../gstreamer-1.0/GstTask.html"><span class="type">GstTask</span></a> to drive the collect_pads. This feature is however
+ <code class="function">gst_collect_pads_collect()</code> and <code class="function">gst_collect_pads_collect_range()</code> can be used by
+ elements that start a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstTask.html"><span class="type">GstTask</span></a> to drive the collect_pads. This feature is however
not yet implemented.
</p></li>
<li class="listitem"><p>
</td>
</tr>
<tr>
-<td><p><span class="term"><a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> *<em class="structfield"><code><a name="GstCollectData.pad"></a>pad</code></em>;</span></p></td>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *<em class="structfield"><code><a name="GstCollectData.pad"></a>pad</code></em>;</span></p></td>
<td>
-<a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> managed by this data</td>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> managed by this data</td>
</tr>
<tr>
-<td><p><span class="term"><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *<em class="structfield"><code><a name="GstCollectData.buffer"></a>buffer</code></em>;</span></p></td>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *<em class="structfield"><code><a name="GstCollectData.buffer"></a>buffer</code></em>;</span></p></td>
<td>currently queued buffer.</td>
</tr>
<tr>
<td>position in the buffer</td>
</tr>
<tr>
-<td><p><span class="term"><a href="../gstreamer-1.0/gstreamer-GstSegment.html#GstSegment"><span class="type">GstSegment</span></a> <em class="structfield"><code><a name="GstCollectData.segment"></a>segment</code></em>;</span></p></td>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstSegment.html#GstSegment"><span class="type">GstSegment</span></a> <em class="structfield"><code><a name="GstCollectData.segment"></a>segment</code></em>;</span></p></td>
<td>last segment received.</td>
</tr>
</tbody>
<hr>
<div class="refsect2">
<a name="GstCollectPadsBufferFunction"></a><h3>GstCollectPadsBufferFunction ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (*GstCollectPadsBufferFunction) (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (*GstCollectPadsBufferFunction) (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);</pre>
<p>
A function that will be called when a (considered oldest) buffer can be muxed.
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
-<td>the <a href="../gstreamer-1.0/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>
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
<td>
-<a href="../gstreamer-1.0/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> for success</td>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> for success</td>
</tr>
</tbody>
</table></div>
<a name="GstCollectPadsCompareFunction"></a><h3>GstCollectPadsCompareFunction ()</h3>
<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> (*GstCollectPadsCompareFunction) (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data1</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp1</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp1</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data2</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp2</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp2</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);</pre>
<p>
A function for comparing two timestamps of buffers or newsegments collected on one pad.
<a name="GstCollectPadsEventFunction"></a><h3>GstCollectPadsEventFunction ()</h3>
<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> (*GstCollectPadsEventFunction) (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *pad</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> *event</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);</pre>
<p>
A function that will be called while processing an event. It takes
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
-<td>the <a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> that received an event</td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> that received an event</td>
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>event</code></em> :</span></p></td>
-<td>the <a href="../gstreamer-1.0/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> received</td>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstEvent.html#GstEvent"><span class="type">GstEvent</span></a> received</td>
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
<hr>
<div class="refsect2">
<a name="GstCollectPadsClipFunction"></a><h3>GstCollectPadsClipFunction ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (*GstCollectPadsClipFunction) (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (*GstCollectPadsClipFunction) (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *inbuffer</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> **outbuffer</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *inbuffer</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> **outbuffer</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);</pre>
<p>
A function that will be called when <em class="parameter"><code>inbuffer</code></em> is received on the pad managed
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>inbuffer</code></em> :</span></p></td>
-<td>the input <a href="../gstreamer-1.0/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>
<td><p><span class="term"><em class="parameter"><code>outbuffer</code></em> :</span></p></td>
-<td>the output <a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>
+<td>the output <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>
</td>
</tr>
<tr>
</tr>
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>a <a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a> that corresponds to the result of clipping.</td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a> that corresponds to the result of clipping.</td>
</tr>
</tbody>
</table></div>
<hr>
<div class="refsect2">
<a name="GstCollectPadsFunction"></a><h3>GstCollectPadsFunction ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (*GstCollectPadsFunction) (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (*GstCollectPadsFunction) (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>);</pre>
<p>
A function that will be called when all pads have received data.
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
<td>
-<a href="../gstreamer-1.0/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> for success</td>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> for success</td>
</tr>
</tbody>
</table></div>
<div class="refsect2">
<a name="gst-collect-pads-add-pad"></a><h3>gst_collect_pads_add_pad ()</h3>
<pre class="programlisting"><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="returnvalue">GstCollectData</span></a> * gst_collect_pads_add_pad (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectDataDestroyNotify" title="GstCollectDataDestroyNotify ()"><span class="type">GstCollectDataDestroyNotify</span></a> destroy_notify</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> lock</code></em>);</pre>
<div class="refsect2">
<a name="gst-collect-pads-remove-pad"></a><h3>gst_collect_pads_remove_pad ()</h3>
<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_collect_pads_remove_pad (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
<p>
Remove a pad from the collection of collect pads. This function will also
free the <a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> and all the resources that were allocated with
<hr>
<div class="refsect2">
<a name="gst-collect-pads-peek"></a><h3>gst_collect_pads_peek ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_collect_pads_peek (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_collect_pads_peek (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>);</pre>
<p>
Peek at the buffer currently queued in <em class="parameter"><code>data</code></em>. This function
<hr>
<div class="refsect2">
<a name="gst-collect-pads-pop"></a><h3>gst_collect_pads_pop ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_collect_pads_pop (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_collect_pads_pop (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>);</pre>
<p>
Pop the buffer currently queued in <em class="parameter"><code>data</code></em>. This function
<hr>
<div class="refsect2">
<a name="gst-collect-pads-read-buffer"></a><h3>gst_collect_pads_read_buffer ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_collect_pads_read_buffer (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_collect_pads_read_buffer (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>);</pre>
<p>
<hr>
<div class="refsect2">
<a name="gst-collect-pads-take-buffer"></a><h3>gst_collect_pads_take_buffer ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_collect_pads_take_buffer (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_collect_pads_take_buffer (<em class="parameter"><code><a class="link" href="GstCollectPads.html" title="GstCollectPads"><span class="type">GstCollectPads</span></a> *pads</code></em>,
<em class="parameter"><code><a class="link" href="GstCollectPads.html#GstCollectData" title="struct GstCollectData"><span class="type">GstCollectData</span></a> *data</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>);</pre>
<p>
<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">
struct <a class="link" href="GstInterpolationControlSource.html#GstInterpolationControlSource-struct" title="struct GstInterpolationControlSource">GstInterpolationControlSource</a>;
enum <a class="link" href="GstInterpolationControlSource.html#GstInterpolationMode" title="enum GstInterpolationMode">GstInterpolationMode</a>;
-<a href="../gstreamer-1.0/GstControlSource.html"><span class="returnvalue">GstControlSource</span></a> * <a class="link" href="GstInterpolationControlSource.html#gst-interpolation-control-source-new" title="gst_interpolation_control_source_new ()">gst_interpolation_control_source_new</a>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html"><span class="returnvalue">GstControlSource</span></a> * <a class="link" href="GstInterpolationControlSource.html#gst-interpolation-control-source-new" title="gst_interpolation_control_source_new ()">gst_interpolation_control_source_new</a>
(<em class="parameter"><code><span class="type">void</span></code></em>);
</pre>
</div>
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstControlSource.html">GstControlSource</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html">GstControlSource</a>
+----<a class="link" href="GstTimedValueControlSource.html" title="GstTimedValueControlSource">GstTimedValueControlSource</a>
+----GstInterpolationControlSource
</pre>
<div class="refsect1">
<a name="GstInterpolationControlSource.description"></a><h2>Description</h2>
<p>
-<a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> is a <a href="../gstreamer-1.0/GstControlSource.html"><span class="type">GstControlSource</span></a>, that interpolates values between user-given
+<a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a> is a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html"><span class="type">GstControlSource</span></a>, that interpolates values between user-given
control points. It supports several interpolation modes and property types.
</p>
<p>
<a name="GstInterpolationControlSource-struct"></a><h3>struct GstInterpolationControlSource</h3>
<pre class="programlisting">struct GstInterpolationControlSource;</pre>
<p>
-The instance structure of <a href="../gstreamer-1.0/GstControlSource.html"><span class="type">GstControlSource</span></a>.
+The instance structure of <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html"><span class="type">GstControlSource</span></a>.
</p>
</div>
<hr>
<hr>
<div class="refsect2">
<a name="gst-interpolation-control-source-new"></a><h3>gst_interpolation_control_source_new ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstControlSource.html"><span class="returnvalue">GstControlSource</span></a> * gst_interpolation_control_source_new
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html"><span class="returnvalue">GstControlSource</span></a> * gst_interpolation_control_source_new
(<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
<p>
This returns a new, unbound <a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource"><span class="type">GstInterpolationControlSource</span></a>.
struct <a class="link" href="GstLFOControlSource.html#GstLFOControlSource-struct" title="struct GstLFOControlSource">GstLFOControlSource</a>;
enum <a class="link" href="GstLFOControlSource.html#GstLFOWaveform" title="enum GstLFOWaveform">GstLFOWaveform</a>;
-<a href="../gstreamer-1.0/GstControlSource.html"><span class="returnvalue">GstControlSource</span></a> * <a class="link" href="GstLFOControlSource.html#gst-lfo-control-source-new" title="gst_lfo_control_source_new ()">gst_lfo_control_source_new</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html"><span class="returnvalue">GstControlSource</span></a> * <a class="link" href="GstLFOControlSource.html#gst-lfo-control-source-new" title="gst_lfo_control_source_new ()">gst_lfo_control_source_new</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
</pre>
</div>
<div class="refsect1">
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstControlSource.html">GstControlSource</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html">GstControlSource</a>
+----GstLFOControlSource
</pre>
</div>
<div class="refsect1">
<a name="GstLFOControlSource.description"></a><h2>Description</h2>
<p>
-<a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource"><span class="type">GstLFOControlSource</span></a> is a <a href="../gstreamer-1.0/GstControlSource.html"><span class="type">GstControlSource</span></a>, that provides several periodic waveforms
+<a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource"><span class="type">GstLFOControlSource</span></a> is a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html"><span class="type">GstControlSource</span></a>, that provides several periodic waveforms
as control values. It supports all fundamental, numeric GValue types as property.
</p>
<p>
<a name="GstLFOControlSource-struct"></a><h3>struct GstLFOControlSource</h3>
<pre class="programlisting">struct GstLFOControlSource;</pre>
<p>
-The instance structure of <a href="../gstreamer-1.0/GstControlSource.html"><span class="type">GstControlSource</span></a>.
+The instance structure of <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html"><span class="type">GstControlSource</span></a>.
</p>
</div>
<hr>
<hr>
<div class="refsect2">
<a name="gst-lfo-control-source-new"></a><h3>gst_lfo_control_source_new ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstControlSource.html"><span class="returnvalue">GstControlSource</span></a> * gst_lfo_control_source_new (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html"><span class="returnvalue">GstControlSource</span></a> * gst_lfo_control_source_new (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
<p>
This returns a new, unbound <a class="link" href="GstLFOControlSource.html" title="GstLFOControlSource"><span class="type">GstLFOControlSource</span></a>.
</p>
#include <gst/net/gstnet.h>
struct <a class="link" href="GstNetClientClock.html#GstNetClientClock-struct" title="struct GstNetClientClock">GstNetClientClock</a>;
-<a href="../gstreamer-1.0/GstClock.html"><span class="returnvalue">GstClock</span></a> * <a class="link" href="GstNetClientClock.html#gst-net-client-clock-new" title="gst_net_client_clock_new ()">gst_net_client_clock_new</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>,
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="returnvalue">GstClock</span></a> * <a class="link" href="GstNetClientClock.html#gst-net-client-clock-new" title="gst_net_client_clock_new ()">gst_net_client_clock_new</a> (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>,
<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *remote_address</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> remote_port</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> base_time</code></em>);
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> base_time</code></em>);
</pre>
</div>
<div class="refsect1">
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstClock.html">GstClock</a>
- +----<a href="../gstreamer-1.0/GstSystemClock.html">GstSystemClock</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html">GstClock</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstSystemClock.html">GstSystemClock</a>
+----GstNetClientClock
</pre>
</div>
<div class="refsect1">
<a name="GstNetClientClock.description"></a><h2>Description</h2>
<p>
-This object implements a custom <a href="../gstreamer-1.0/GstClock.html"><span class="type">GstClock</span></a> that synchronizes its time
+This object implements a custom <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a> that synchronizes its time
to a remote time provider such as <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="type">GstNetTimeProvider</span></a>.
</p>
<p>
parameters based on the local and remote observations.
</p>
<p>
-Various parameters of the clock can be configured with the parent <a href="../gstreamer-1.0/GstClock.html"><span class="type">GstClock</span></a>
+Various parameters of the clock can be configured with the parent <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a>
"timeout", "window-size" and "window-threshold" object properties.
</p>
<p>
-A <a class="link" href="GstNetClientClock.html" title="GstNetClientClock"><span class="type">GstNetClientClock</span></a> is typically set on a <a href="../gstreamer-1.0/GstPipeline.html"><span class="type">GstPipeline</span></a> with
-<a href="../gstreamer-1.0/GstPipeline.html#gst-pipeline-use-clock"><code class="function">gst_pipeline_use_clock()</code></a>.
+A <a class="link" href="GstNetClientClock.html" title="GstNetClientClock"><span class="type">GstNetClientClock</span></a> is typically set on a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPipeline.html"><span class="type">GstPipeline</span></a> with
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPipeline.html#gst-pipeline-use-clock"><code class="function">gst_pipeline_use_clock()</code></a>.
</p>
<p>
Last reviewed on 2005-11-23 (0.9.5)
<hr>
<div class="refsect2">
<a name="gst-net-client-clock-new"></a><h3>gst_net_client_clock_new ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstClock.html"><span class="returnvalue">GstClock</span></a> * gst_net_client_clock_new (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>,
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="returnvalue">GstClock</span></a> * gst_net_client_clock_new (<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>,
<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *remote_address</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> remote_port</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> base_time</code></em>);</pre>
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> base_time</code></em>);</pre>
<p>
Create a new <a class="link" href="GstNetClientClock.html" title="GstNetClientClock"><span class="type">GstNetClientClock</span></a> that will report the time
provided by the <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="type">GstNetTimeProvider</span></a> on <em class="parameter"><code>remote_address</code></em> and
</tr>
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>a new <a href="../gstreamer-1.0/GstClock.html"><span class="type">GstClock</span></a> that receives a time from the remote
+<td>a new <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a> that receives a time from the remote
clock.</td>
</tr>
</tbody>
</div>
<div class="refsect1">
<a name="GstNetClientClock.see-also"></a><h2>See Also</h2>
-<a href="../gstreamer-1.0/GstClock.html"><span class="type">GstClock</span></a>, <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="type">GstNetTimeProvider</span></a>, <a href="../gstreamer-1.0/GstPipeline.html"><span class="type">GstPipeline</span></a>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a>, <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="type">GstNetTimeProvider</span></a>, <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPipeline.html"><span class="type">GstPipeline</span></a>
</div>
</div>
<div class="footer">
#include <gst/net/gstnet.h>
struct <a class="link" href="GstNetTimeProvider.html#GstNetTimeProvider-struct" title="struct GstNetTimeProvider">GstNetTimeProvider</a>;
-<a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="returnvalue">GstNetTimeProvider</span></a> * <a class="link" href="GstNetTimeProvider.html#gst-net-time-provider-new" title="gst_net_time_provider_new ()">gst_net_time_provider_new</a> (<em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html"><span class="type">GstClock</span></a> *clock</code></em>,
+<a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="returnvalue">GstNetTimeProvider</span></a> * <a class="link" href="GstNetTimeProvider.html#gst-net-time-provider-new" title="gst_net_time_provider_new ()">gst_net_time_provider_new</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a> *clock</code></em>,
<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *address</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> port</code></em>);
</pre>
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+----GstNetTimeProvider
</pre>
</div>
<pre class="synopsis">
"<a class="link" href="GstNetTimeProvider.html#GstNetTimeProvider--active" title='The "active" property'>active</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
"<a class="link" href="GstNetTimeProvider.html#GstNetTimeProvider--address" title='The "address" property'>address</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>* : Read / Write
- "<a class="link" href="GstNetTimeProvider.html#GstNetTimeProvider--clock" title='The "clock" property'>clock</a>" <a href="../gstreamer-1.0/GstClock.html"><span class="type">GstClock</span></a>* : Read / Write
+ "<a class="link" href="GstNetTimeProvider.html#GstNetTimeProvider--clock" title='The "clock" property'>clock</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a>* : Read / Write
"<a class="link" href="GstNetTimeProvider.html#GstNetTimeProvider--port" title='The "port" property'>port</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
</pre>
</div>
<div class="refsect1">
<a name="GstNetTimeProvider.description"></a><h2>Description</h2>
<p>
-This object exposes the time of a <a href="../gstreamer-1.0/GstClock.html"><span class="type">GstClock</span></a> on the network.
+This object exposes the time of a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a> on the network.
</p>
<p>
A <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="type">GstNetTimeProvider</span></a> is created with <a class="link" href="GstNetTimeProvider.html#gst-net-time-provider-new" title="gst_net_time_provider_new ()"><code class="function">gst_net_time_provider_new()</code></a> which
-takes a <a href="../gstreamer-1.0/GstClock.html"><span class="type">GstClock</span></a>, an address and a port number as arguments.
+takes a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a>, an address and a port number as arguments.
</p>
<p>
After creating the object, a client clock such as <a class="link" href="GstNetClientClock.html" title="GstNetClientClock"><span class="type">GstNetClientClock</span></a> can
query the exposed clock over the network for its values.
</p>
<p>
-The <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="type">GstNetTimeProvider</span></a> typically wraps the clock used by a <a href="../gstreamer-1.0/GstPipeline.html"><span class="type">GstPipeline</span></a>.
+The <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="type">GstNetTimeProvider</span></a> typically wraps the clock used by a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPipeline.html"><span class="type">GstPipeline</span></a>.
</p>
<p>
Last reviewed on 2005-11-23 (0.9.5)
<hr>
<div class="refsect2">
<a name="gst-net-time-provider-new"></a><h3>gst_net_time_provider_new ()</h3>
-<pre class="programlisting"><a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="returnvalue">GstNetTimeProvider</span></a> * gst_net_time_provider_new (<em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html"><span class="type">GstClock</span></a> *clock</code></em>,
+<pre class="programlisting"><a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="returnvalue">GstNetTimeProvider</span></a> * gst_net_time_provider_new (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a> *clock</code></em>,
<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *address</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> port</code></em>);</pre>
<p>
<tbody>
<tr>
<td><p><span class="term"><em class="parameter"><code>clock</code></em> :</span></p></td>
-<td>a <a href="../gstreamer-1.0/GstClock.html"><span class="type">GstClock</span></a> to export over the network</td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a> to export over the network</td>
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>address</code></em> :</span></p></td>
<hr>
<div class="refsect2">
<a name="GstNetTimeProvider--clock"></a><h3>The <code class="literal">"clock"</code> property</h3>
-<pre class="programlisting"> "clock" <a href="../gstreamer-1.0/GstClock.html"><span class="type">GstClock</span></a>* : Read / Write</pre>
+<pre class="programlisting"> "clock" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a>* : Read / Write</pre>
<p>The clock to export over the network.</p>
</div>
<hr>
</div>
<div class="refsect1">
<a name="GstNetTimeProvider.see-also"></a><h2>See Also</h2>
-<a href="../gstreamer-1.0/GstClock.html"><span class="type">GstClock</span></a>, <a class="link" href="GstNetClientClock.html" title="GstNetClientClock"><span class="type">GstNetClientClock</span></a>, <a href="../gstreamer-1.0/GstPipeline.html"><span class="type">GstPipeline</span></a>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a>, <a class="link" href="GstNetClientClock.html" title="GstNetClientClock"><span class="type">GstNetClientClock</span></a>, <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPipeline.html"><span class="type">GstPipeline</span></a>
</div>
</div>
<div class="footer">
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+----<a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
+----GstPushSrc
</pre>
struct <a class="link" href="GstTimedValueControlSource.html#GstTimedValueControlSource-struct" title="struct GstTimedValueControlSource">GstTimedValueControlSource</a>;
<a href="http://library.gnome.org/devel/glib/unstable/glib-Sequences.html#GSequenceIter"><span class="returnvalue">GSequenceIter</span></a> * <a class="link" href="GstTimedValueControlSource.html#gst-timed-value-control-source-find-control-point-iter" title="gst_timed_value_control_source_find_control_point_iter ()">gst_timed_value_control_source_find_control_point_iter</a>
(<em class="parameter"><code><a class="link" href="GstTimedValueControlSource.html" title="GstTimedValueControlSource"><span class="type">GstTimedValueControlSource</span></a> *self</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GstTimedValueControlSource.html#gst-timed-value-control-source-set" title="gst_timed_value_control_source_set ()">gst_timed_value_control_source_set</a> (<em class="parameter"><code><a class="link" href="GstTimedValueControlSource.html" title="GstTimedValueControlSource"><span class="type">GstTimedValueControlSource</span></a> *self</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> value</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GstTimedValueControlSource.html#gst-timed-value-control-source-set-from-list" title="gst_timed_value_control_source_set_from_list ()">gst_timed_value_control_source_set_from_list</a>
(<em class="parameter"><code><a class="link" href="GstTimedValueControlSource.html" title="GstTimedValueControlSource"><span class="type">GstTimedValueControlSource</span></a> *self</code></em>,
(<em class="parameter"><code><a class="link" href="GstTimedValueControlSource.html" title="GstTimedValueControlSource"><span class="type">GstTimedValueControlSource</span></a> *self</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GstTimedValueControlSource.html#gst-timed-value-control-source-unset" title="gst_timed_value_control_source_unset ()">gst_timed_value_control_source_unset</a>
(<em class="parameter"><code><a class="link" href="GstTimedValueControlSource.html" title="GstTimedValueControlSource"><span class="type">GstTimedValueControlSource</span></a> *self</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);
<span class="returnvalue">void</span> <a class="link" href="GstTimedValueControlSource.html#gst-timed-value-control-source-unset-all" title="gst_timed_value_control_source_unset_all ()">gst_timed_value_control_source_unset_all</a>
(<em class="parameter"><code><a class="link" href="GstTimedValueControlSource.html" title="GstTimedValueControlSource"><span class="type">GstTimedValueControlSource</span></a> *self</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="GstTimedValueControlSource.html#gst-timed-value-control-source-get-count" title="gst_timed_value_control_source_get_count ()">gst_timed_value_control_source_get_count</a>
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstControlSource.html">GstControlSource</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html">GstControlSource</a>
+----GstTimedValueControlSource
+----<a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource">GstInterpolationControlSource</a>
+----<a class="link" href="GstTriggerControlSource.html" title="GstTriggerControlSource">GstTriggerControlSource</a>
<a name="GstTimedValueControlSource-struct"></a><h3>struct GstTimedValueControlSource</h3>
<pre class="programlisting">struct GstTimedValueControlSource;</pre>
<p>
-The instance structure of <a href="../gstreamer-1.0/GstControlSource.html"><span class="type">GstControlSource</span></a>.
+The instance structure of <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html"><span class="type">GstControlSource</span></a>.
</p>
</div>
<hr>
<a name="gst-timed-value-control-source-find-control-point-iter"></a><h3>gst_timed_value_control_source_find_control_point_iter ()</h3>
<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Sequences.html#GSequenceIter"><span class="returnvalue">GSequenceIter</span></a> * gst_timed_value_control_source_find_control_point_iter
(<em class="parameter"><code><a class="link" href="GstTimedValueControlSource.html" title="GstTimedValueControlSource"><span class="type">GstTimedValueControlSource</span></a> *self</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);</pre>
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);</pre>
<p>
Find last value before given timestamp in control point list.
If all values in the control point list come after the given
<div class="refsect2">
<a name="gst-timed-value-control-source-set"></a><h3>gst_timed_value_control_source_set ()</h3>
<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_timed_value_control_source_set (<em class="parameter"><code><a class="link" href="GstTimedValueControlSource.html" title="GstTimedValueControlSource"><span class="type">GstTimedValueControlSource</span></a> *self</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>,
<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> value</code></em>);</pre>
<p>
Set the value of given controller-handled property at a certain time.
<tr>
<td><p><span class="term"><em class="parameter"><code>timedvalues</code></em> :</span></p></td>
<td>a list
-with <a href="../gstreamer-1.0/GstControlSource.html#GstTimedValue"><span class="type">GstTimedValue</span></a> items. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GstController.TimedValue]</span>
+with <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html#GstTimedValue"><span class="type">GstTimedValue</span></a> items. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GstController.TimedValue]</span>
</td>
</tr>
<tr>
<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gst_timed_value_control_source_get_all
(<em class="parameter"><code><a class="link" href="GstTimedValueControlSource.html" title="GstTimedValueControlSource"><span class="type">GstTimedValueControlSource</span></a> *self</code></em>);</pre>
<p>
-Returns a read-only copy of the list of <a href="../gstreamer-1.0/GstControlSource.html#GstTimedValue"><span class="type">GstTimedValue</span></a> for the given property.
+Returns a read-only copy of the list of <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html#GstTimedValue"><span class="type">GstTimedValue</span></a> for the given property.
Free the list after done with it.
</p>
<div class="variablelist"><table border="0">
<a name="gst-timed-value-control-source-unset"></a><h3>gst_timed_value_control_source_unset ()</h3>
<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_timed_value_control_source_unset
(<em class="parameter"><code><a class="link" href="GstTimedValueControlSource.html" title="GstTimedValueControlSource"><span class="type">GstTimedValueControlSource</span></a> *self</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);</pre>
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> timestamp</code></em>);</pre>
<p>
Used to remove the value of given controller-handled property at a certain
time.
#include <libs/controller/gsttriggercontrolsource.h>
struct <a class="link" href="GstTriggerControlSource.html#GstTriggerControlSource-struct" title="struct GstTriggerControlSource">GstTriggerControlSource</a>;
-<a href="../gstreamer-1.0/GstControlSource.html"><span class="returnvalue">GstControlSource</span></a> * <a class="link" href="GstTriggerControlSource.html#gst-trigger-control-source-new" title="gst_trigger_control_source_new ()">gst_trigger_control_source_new</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html"><span class="returnvalue">GstControlSource</span></a> * <a class="link" href="GstTriggerControlSource.html#gst-trigger-control-source-new" title="gst_trigger_control_source_new ()">gst_trigger_control_source_new</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
</pre>
</div>
<div class="refsect1">
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstControlSource.html">GstControlSource</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html">GstControlSource</a>
+----<a class="link" href="GstTimedValueControlSource.html" title="GstTimedValueControlSource">GstTimedValueControlSource</a>
+----GstTriggerControlSource
</pre>
<div class="refsect1">
<a name="GstTriggerControlSource.description"></a><h2>Description</h2>
<p>
-<a class="link" href="GstTriggerControlSource.html" title="GstTriggerControlSource"><span class="type">GstTriggerControlSource</span></a> is a <a href="../gstreamer-1.0/GstControlSource.html"><span class="type">GstControlSource</span></a>, that returns values from user-given
+<a class="link" href="GstTriggerControlSource.html" title="GstTriggerControlSource"><span class="type">GstTriggerControlSource</span></a> is a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html"><span class="type">GstControlSource</span></a>, that returns values from user-given
control points. It allows for a tolerance on the time-stamps.
</p>
<p>
<a name="GstTriggerControlSource-struct"></a><h3>struct GstTriggerControlSource</h3>
<pre class="programlisting">struct GstTriggerControlSource;</pre>
<p>
-The instance structure of <a href="../gstreamer-1.0/GstControlSource.html"><span class="type">GstControlSource</span></a>.
+The instance structure of <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html"><span class="type">GstControlSource</span></a>.
</p>
</div>
<hr>
<div class="refsect2">
<a name="gst-trigger-control-source-new"></a><h3>gst_trigger_control_source_new ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstControlSource.html"><span class="returnvalue">GstControlSource</span></a> * gst_trigger_control_source_new (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html"><span class="returnvalue">GstControlSource</span></a> * gst_trigger_control_source_new (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
<p>
This returns a new, unbound <a class="link" href="GstTriggerControlSource.html" title="GstTriggerControlSource"><span class="type">GstTriggerControlSource</span></a>.
</p>
</dt>
<dd></dd>
<dt>
+<a class="link" href="GstBaseTransform.html#gst-base-transform-set-prefer-passthrough" title="gst_base_transform_set_prefer_passthrough ()">gst_base_transform_set_prefer_passthrough</a>, function in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
+</dt>
+<dd></dd>
+<dt>
<a class="link" href="GstBaseTransform.html#gst-base-transform-set-qos-enabled" title="gst_base_transform_set_qos_enabled ()">gst_base_transform_set_qos_enabled</a>, function in <a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
</dt>
<dd></dd>
<span class="refentrytitle"><a href="GstBaseSrc.html">GstBaseSrc</a></span><span class="refpurpose"> — Base class for getrange based source elements</span>
</dt>
<dt>
-<span class="refentrytitle"><a href="GstBaseSink.html">GstBaseSink</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="GstBaseSink.html">GstBaseSink</a></span><span class="refpurpose"> — Base class for sink elements</span>
</dt>
<dt>
<span class="refentrytitle"><a href="GstBaseTransform.html">GstBaseTransform</a></span><span class="refpurpose"> — Base class for simple transform filters</span>
<pre class="screen">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- <a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- <a href="../gstreamer-1.0/GstElement.html">GstElement</a>
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
<a class="link" href="GstBaseSrc.html" title="GstBaseSrc">GstBaseSrc</a>
<a class="link" href="GstPushSrc.html" title="GstPushSrc">GstPushSrc</a>
<a class="link" href="GstBaseSink.html" title="GstBaseSink">GstBaseSink</a>
<a class="link" href="GstBaseTransform.html" title="GstBaseTransform">GstBaseTransform</a>
- <a href="../gstreamer-1.0/GstClock.html">GstClock</a>
- <a href="../gstreamer-1.0/GstSystemClock.html">GstSystemClock</a>
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html">GstClock</a>
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstSystemClock.html">GstSystemClock</a>
<a class="link" href="GstNetClientClock.html" title="GstNetClientClock">GstNetClientClock</a>
- <a href="../gstreamer-1.0/GstControlSource.html">GstControlSource</a>
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstControlSource.html">GstControlSource</a>
<a class="link" href="GstTimedValueControlSource.html" title="GstTimedValueControlSource">GstTimedValueControlSource</a>
<a class="link" href="GstInterpolationControlSource.html" title="GstInterpolationControlSource">GstInterpolationControlSource</a>
<a class="link" href="GstTriggerControlSource.html" title="GstTriggerControlSource">GstTriggerControlSource</a>
struct <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse">GstBaseParse</a>;
struct <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseClass" title="struct GstBaseParseClass">GstBaseParseClass</a>;
<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-duration" title="gst_base_parse_set_duration ()">gst_base_parse_set_duration</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> fmt</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> fmt</code></em>,
<em class="parameter"><code><span class="type">gint64</span> duration</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> interval</code></em>);
<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-average-bitrate" title="gst_base_parse_set_average_bitrate ()">gst_base_parse_set_average_bitrate</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> lead_in</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> lead_out</code></em>);
<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-set-latency" title="gst_base_parse_set_latency ()">gst_base_parse_set_latency</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> min_latency</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> max_latency</code></em>);
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> min_latency</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> max_latency</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-convert-default" title="gst_base_parse_convert_default ()">gst_base_parse_convert_default</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> src_format</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> src_format</code></em>,
<em class="parameter"><code><span class="type">gint64</span> src_value</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> dest_format</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> dest_format</code></em>,
<em class="parameter"><code><span class="type">gint64</span> *dest_value</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-add-index-entry" title="gst_base_parse_add_index_entry ()">gst_base_parse_add_index_entry</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
<em class="parameter"><code><span class="type">guint64</span> offset</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> ts</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> ts</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> key</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> force</code></em>);
<a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame">GstBaseParseFrame</a>;
enum <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrameFlags" title="enum GstBaseParseFrameFlags">GstBaseParseFrameFlags</a>;
-<a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="returnvalue">GstBaseParseFrame</span></a> * <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-frame-new" title="gst_base_parse_frame_new ()">gst_base_parse_frame_new</a> (<em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+<a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="returnvalue">GstBaseParseFrame</span></a> * <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-frame-new" title="gst_base_parse_frame_new ()">gst_base_parse_frame_new</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrameFlags" title="enum GstBaseParseFrameFlags"><span class="type">GstBaseParseFrameFlags</span></a> flags</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> overhead</code></em>);
<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-frame-init" title="gst_base_parse_frame_init ()">gst_base_parse_frame_init</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="type">GstBaseParseFrame</span></a> *frame</code></em>);
<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-frame-free" title="gst_base_parse_frame_free ()">gst_base_parse_frame_free</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="type">GstBaseParseFrame</span></a> *frame</code></em>);
-<a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-push-frame" title="gst_base_parse_push_frame ()">gst_base_parse_push_frame</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> <a class="link" href="gstreamer-libs-GstBaseParse.html#gst-base-parse-push-frame" title="gst_base_parse_push_frame ()">gst_base_parse_push_frame</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="type">GstBaseParseFrame</span></a> *frame</code></em>);
#define <a class="link" href="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-DRAINING:CAPS" title="GST_BASE_PARSE_DRAINING()">GST_BASE_PARSE_DRAINING</a> (parse)
#define <a class="link" href="gstreamer-libs-GstBaseParse.html#GST-BASE-PARSE-FLAG-DRAINING:CAPS" title="GST_BASE_PARSE_FLAG_DRAINING">GST_BASE_PARSE_FLAG_DRAINING</a>
when base class calls subclass' <em class="parameter"><code>set_sink_caps</code></em> function).
</p>
<p>
-This base class uses <a href="../gstreamer-1.0/gstreamer-GstFormat.html#GST-FORMAT-DEFAULT:CAPS"><span class="type">GST_FORMAT_DEFAULT</span></a> as a meaning of frames. So,
+This base class uses <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GST-FORMAT-DEFAULT:CAPS"><span class="type">GST_FORMAT_DEFAULT</span></a> as a meaning of frames. So,
subclass conversion routine needs to know that conversion from
-<a href="../gstreamer-1.0/gstreamer-GstFormat.html#GST-FORMAT-TIME:CAPS"><span class="type">GST_FORMAT_TIME</span></a> to <a href="../gstreamer-1.0/gstreamer-GstFormat.html#GST-FORMAT-DEFAULT:CAPS"><span class="type">GST_FORMAT_DEFAULT</span></a> must return the
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GST-FORMAT-TIME:CAPS"><span class="type">GST_FORMAT_TIME</span></a> to <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GST-FORMAT-DEFAULT:CAPS"><span class="type">GST_FORMAT_DEFAULT</span></a> must return the
frame number that can be found from the given byte position.
</p>
<p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody><tr>
-<td><p><span class="term"><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> <em class="structfield"><code><a name="GstBaseParse.element"></a>element</code></em>;</span></p></td>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> <em class="structfield"><code><a name="GstBaseParse.element"></a>element</code></em>;</span></p></td>
<td>the parent element.</td>
</tr></tbody>
</table></div>
<col align="left" valign="top">
<tbody>
<tr>
-<td><p><span class="term"><a href="../gstreamer-1.0/GstElement.html#GstElementClass"><span class="type">GstElementClass</span></a> <em class="structfield"><code><a name="GstBaseParseClass.parent-class"></a>parent_class</code></em>;</span></p></td>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GstElementClass"><span class="type">GstElementClass</span></a> <em class="structfield"><code><a name="GstBaseParseClass.parent-class"></a>parent_class</code></em>;</span></p></td>
<td>the parent class</td>
</tr>
<tr>
<div class="refsect2">
<a name="gst-base-parse-set-duration"></a><h3>gst_base_parse_set_duration ()</h3>
<pre class="programlisting"><span class="returnvalue">void</span> gst_base_parse_set_duration (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> fmt</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> fmt</code></em>,
<em class="parameter"><code><span class="type">gint64</span> duration</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> interval</code></em>);</pre>
<p>
<tr>
<td><p><span class="term"><em class="parameter"><code>fmt</code></em> :</span></p></td>
<td>
-<a href="../gstreamer-1.0/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a>.</td>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a>.</td>
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>duration</code></em> :</span></p></td>
<div class="refsect2">
<a name="gst-base-parse-set-latency"></a><h3>gst_base_parse_set_latency ()</h3>
<pre class="programlisting"><span class="returnvalue">void</span> gst_base_parse_set_latency (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> min_latency</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> max_latency</code></em>);</pre>
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> min_latency</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> max_latency</code></em>);</pre>
<p>
Sets the minimum and maximum (which may likely be equal) latency introduced
by the parsing process. If there is such a latency, which depends on the
<div class="refsect2">
<a name="gst-base-parse-convert-default"></a><h3>gst_base_parse_convert_default ()</h3>
<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_base_parse_convert_default (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> src_format</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> src_format</code></em>,
<em class="parameter"><code><span class="type">gint64</span> src_value</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> dest_format</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> dest_format</code></em>,
<em class="parameter"><code><span class="type">gint64</span> *dest_value</code></em>);</pre>
<p>
Default implementation of "convert" vmethod in <a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> class.
<tr>
<td><p><span class="term"><em class="parameter"><code>src_format</code></em> :</span></p></td>
<td>
-<a href="../gstreamer-1.0/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> describing the source format.</td>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> describing the source format.</td>
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>src_value</code></em> :</span></p></td>
<tr>
<td><p><span class="term"><em class="parameter"><code>dest_format</code></em> :</span></p></td>
<td>
-<a href="../gstreamer-1.0/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> defining the converted format.</td>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> defining the converted format.</td>
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>dest_value</code></em> :</span></p></td>
<a name="gst-base-parse-add-index-entry"></a><h3>gst_base_parse_add_index_entry ()</h3>
<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gst_base_parse_add_index_entry (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
<em class="parameter"><code><span class="type">guint64</span> offset</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> ts</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> ts</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> key</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> force</code></em>);</pre>
<p>
<col align="left" valign="top">
<tbody>
<tr>
-<td><p><span class="term"><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *<em class="structfield"><code><a name="GstBaseParseFrame.buffer"></a>buffer</code></em>;</span></p></td>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *<em class="structfield"><code><a name="GstBaseParseFrame.buffer"></a>buffer</code></em>;</span></p></td>
<td>input data to be parsed for frames.</td>
</tr>
<tr>
-<td><p><span class="term"><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *<em class="structfield"><code><a name="GstBaseParseFrame.out-buffer"></a>out_buffer</code></em>;</span></p></td>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *<em class="structfield"><code><a name="GstBaseParseFrame.out-buffer"></a>out_buffer</code></em>;</span></p></td>
<td>(optional) (replacement) output data.</td>
</tr>
<tr>
<hr>
<div class="refsect2">
<a name="gst-base-parse-frame-new"></a><h3>gst_base_parse_frame_new ()</h3>
-<pre class="programlisting"><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="returnvalue">GstBaseParseFrame</span></a> * gst_base_parse_frame_new (<em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+<pre class="programlisting"><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="returnvalue">GstBaseParseFrame</span></a> * gst_base_parse_frame_new (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrameFlags" title="enum GstBaseParseFrameFlags"><span class="type">GstBaseParseFrameFlags</span></a> flags</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> overhead</code></em>);</pre>
<p>
<tbody>
<tr>
<td><p><span class="term"><em class="parameter"><code>buffer</code></em> :</span></p></td>
-<td>a <a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+<td>a <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="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
</td>
</tr>
<tr>
<hr>
<div class="refsect2">
<a name="gst-base-parse-push-frame"></a><h3>gst_base_parse_push_frame ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_base_parse_push_frame (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> gst_base_parse_push_frame (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParse" title="struct GstBaseParse"><span class="type">GstBaseParse</span></a> *parse</code></em>,
<em class="parameter"><code><a class="link" href="gstreamer-libs-GstBaseParse.html#GstBaseParseFrame" title="GstBaseParseFrame"><span class="type">GstBaseParseFrame</span></a> *frame</code></em>);</pre>
<p>
Pushes the frame's buffer downstream, sends any pending events and
</tr>
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td><a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a></td>
+<td><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a></td>
</tr>
</tbody>
</table></div>
<pre class="programlisting">#define GST_BASE_PARSE_FLOW_DROPPED GST_FLOW_CUSTOM_SUCCESS
</pre>
<p>
-A <a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a> that can be returned from parse_frame to
+A <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a> that can be returned from parse_frame to
indicate that no output buffer was generated, or from pre_push_frame to
to forego pushing buffer.
</p>
<pre class="programlisting">#define GST_BASE_PARSE_SINK_PAD(obj) (GST_BASE_PARSE_CAST (obj)->sinkpad)
</pre>
<p>
-Gives the pointer to the sink <a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> object of the element.
+Gives the pointer to the sink <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> object of the element.
</p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<pre class="programlisting">#define GST_BASE_PARSE_SRC_PAD(obj) (GST_BASE_PARSE_CAST (obj)->srcpad)
</pre>
<p>
-Gives the pointer to the source <a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> object of the element.
+Gives the pointer to the source <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> object of the element.
</p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<pre class="synopsis">
#include <gst/check/gstbufferstraw.h>
-<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-start-pipeline" title="gst_buffer_straw_start_pipeline ()">gst_buffer_straw_start_pipeline</a> (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *bin</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);
-<a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-get-buffer" title="gst_buffer_straw_get_buffer ()">gst_buffer_straw_get_buffer</a> (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *bin</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);
-<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-stop-pipeline" title="gst_buffer_straw_stop_pipeline ()">gst_buffer_straw_stop_pipeline</a> (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *bin</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-start-pipeline" title="gst_buffer_straw_start_pipeline ()">gst_buffer_straw_start_pipeline</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *bin</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-get-buffer" title="gst_buffer_straw_get_buffer ()">gst_buffer_straw_get_buffer</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *bin</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-stop-pipeline" title="gst_buffer_straw_stop_pipeline ()">gst_buffer_straw_stop_pipeline</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *bin</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);
</pre>
</div>
<div class="refsect1">
<a name="gstreamer-libs-GstBufferStraw.details"></a><h2>Details</h2>
<div class="refsect2">
<a name="gst-buffer-straw-start-pipeline"></a><h3>gst_buffer_straw_start_pipeline ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span> gst_buffer_straw_start_pipeline (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *bin</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_buffer_straw_start_pipeline (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *bin</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
<p>
Sets up a pipeline for buffer sucking. This will allow you to call
<a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-get-buffer" title="gst_buffer_straw_get_buffer ()"><code class="function">gst_buffer_straw_get_buffer()</code></a> to access buffers as they pass over <em class="parameter"><code>pad</code></em>.
<p>
This function is normally used in unit tests that want to verify that a
particular element is outputting correct buffers. For example, you would make
-a pipeline via <a href="../gstreamer-1.0/gstreamer-GstParse.html#gst-parse-launch"><code class="function">gst_parse_launch()</code></a>, pull out the pad you want to monitor, then
+a pipeline via <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstParse.html#gst-parse-launch"><code class="function">gst_parse_launch()</code></a>, pull out the pad you want to monitor, then
call <a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-get-buffer" title="gst_buffer_straw_get_buffer ()"><code class="function">gst_buffer_straw_get_buffer()</code></a> to get the buffers that pass through <em class="parameter"><code>pad</code></em>.
The pipeline will block until you have sucked off the buffers.
</p>
<hr>
<div class="refsect2">
<a name="gst-buffer-straw-get-buffer"></a><h3>gst_buffer_straw_get_buffer ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_buffer_straw_get_buffer (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *bin</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_buffer_straw_get_buffer (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *bin</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
<p>
Get one buffer from <em class="parameter"><code>pad</code></em>. Implemented via buffer probes. This function will
block until the pipeline passes a buffer over <em class="parameter"><code>pad</code></em>, so for robust behavior
</tr>
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>the captured <a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>.</td>
+<td>the captured <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>.</td>
</tr>
</tbody>
</table></div>
<hr>
<div class="refsect2">
<a name="gst-buffer-straw-stop-pipeline"></a><h3>gst_buffer_straw_stop_pipeline ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span> gst_buffer_straw_stop_pipeline (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *bin</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_buffer_straw_stop_pipeline (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *bin</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
<p>
-Set <em class="parameter"><code>bin</code></em> to <a href="../gstreamer-1.0/GstElement.html#GST-STATE-NULL:CAPS"><span class="type">GST_STATE_NULL</span></a> and release resource allocated in
+Set <em class="parameter"><code>bin</code></em> to <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GST-STATE-NULL:CAPS"><span class="type">GST_STATE_NULL</span></a> and release resource allocated in
<a class="link" href="gstreamer-libs-GstBufferStraw.html#gst-buffer-straw-start-pipeline" title="gst_buffer_straw_start_pipeline ()"><code class="function">gst_buffer_straw_start_pipeline()</code></a>.
</p>
<p>
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> size</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> fixed</code></em>);
<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-free" title="gst_byte_writer_free ()">gst_byte_writer_free</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);
-<a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-free-and-get-buffer" title="gst_byte_writer_free_and_get_buffer ()">gst_byte_writer_free_and_get_buffer</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-free-and-get-buffer" title="gst_byte_writer_free_and_get_buffer ()">gst_byte_writer_free_and_get_buffer</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);
<span class="returnvalue">guint8</span> * <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-free-and-get-data" title="gst_byte_writer_free_and_get_data ()">gst_byte_writer_free_and_get_data</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);
<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-reset" title="gst_byte_writer_reset ()">gst_byte_writer_reset</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);
<span class="returnvalue">guint8</span> * <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-reset-and-get-data" title="gst_byte_writer_reset_and_get_data ()">gst_byte_writer_reset_and_get_data</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);
-<a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-reset-and-get-buffer" title="gst_byte_writer_reset_and_get_buffer ()">gst_byte_writer_reset_and_get_buffer</a>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-reset-and-get-buffer" title="gst_byte_writer_reset_and_get_buffer ()">gst_byte_writer_reset_and_get_buffer</a>
(<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-get-pos" title="gst_byte_writer_get_pos ()">gst_byte_writer_get_pos</a> (<em class="parameter"><code>const <a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="gstreamer-libs-GstByteWriter.html#gst-byte-writer-set-pos" title="gst_byte_writer_set_pos ()">gst_byte_writer_set_pos</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>,
<hr>
<div class="refsect2">
<a name="gst-byte-writer-free-and-get-buffer"></a><h3>gst_byte_writer_free_and_get_buffer ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_byte_writer_free_and_get_buffer (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);</pre>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_byte_writer_free_and_get_buffer (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);</pre>
<p>
Frees <em class="parameter"><code>writer</code></em> and all memory allocated by it except
-the current data, which is returned as <a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>.
+the current data, which is returned as <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>.
</p>
<p>
Free-function: gst_buffer_unref
</tr>
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>the current data as buffer. <a href="../gstreamer-1.0/gstreamer-GstBuffer.html#gst-buffer-unref"><code class="function">gst_buffer_unref()</code></a>
+<td>the current data as buffer. <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#gst-buffer-unref"><code class="function">gst_buffer_unref()</code></a>
after usage. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
</td>
</tr>
<hr>
<div class="refsect2">
<a name="gst-byte-writer-reset-and-get-buffer"></a><h3>gst_byte_writer_reset_and_get_buffer ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_byte_writer_reset_and_get_buffer
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="returnvalue">GstBuffer</span></a> * gst_byte_writer_reset_and_get_buffer
(<em class="parameter"><code><a class="link" href="gstreamer-libs-GstByteWriter.html#GstByteWriter" title="GstByteWriter"><span class="type">GstByteWriter</span></a> *writer</code></em>);</pre>
<p>
Resets <em class="parameter"><code>writer</code></em> and returns the current data as buffer.
</tr>
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>the current data as buffer. <a href="../gstreamer-1.0/gstreamer-GstBuffer.html#gst-buffer-unref"><code class="function">gst_buffer_unref()</code></a>
+<td>the current data as buffer. <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#gst-buffer-unref"><code class="function">gst_buffer_unref()</code></a>
after usage. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
</td>
</tr>
c)
<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-init" title="gst_check_init ()">gst_check_init</a> (<em class="parameter"><code><span class="type">int</span> *argc</code></em>,
<em class="parameter"><code><span class="type">char</span> **argv[]</code></em>);
-<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-message-error" title="gst_check_message_error ()">gst_check_message_error</a> (<em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstMessage.html#GstMessageType"><span class="type">GstMessageType</span></a> type</code></em>,
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-message-error" title="gst_check_message_error ()">gst_check_message_error</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessageType"><span class="type">GstMessageType</span></a> type</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> domain</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> code</code></em>);
-<a href="../gstreamer-1.0/GstElement.html"><span class="returnvalue">GstElement</span></a> * <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-setup-element" title="gst_check_setup_element ()">gst_check_setup_element</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *factory</code></em>);
-<a href="../gstreamer-1.0/GstPad.html"><span class="returnvalue">GstPad</span></a> * <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-setup-sink-pad" title="gst_check_setup_sink_pad ()">gst_check_setup_sink_pad</a> (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</code></em>);
-<a href="../gstreamer-1.0/GstPad.html"><span class="returnvalue">GstPad</span></a> * <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-setup-src-pad" title="gst_check_setup_src_pad ()">gst_check_setup_src_pad</a> (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</code></em>);
-<a href="../gstreamer-1.0/GstPad.html"><span class="returnvalue">GstPad</span></a> * <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-setup-sink-pad-by-name" title="gst_check_setup_sink_pad_by_name ()">gst_check_setup_sink_pad_by_name</a> (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</code></em>,
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="returnvalue">GstElement</span></a> * <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-setup-element" title="gst_check_setup_element ()">gst_check_setup_element</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *factory</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="returnvalue">GstPad</span></a> * <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-setup-sink-pad" title="gst_check_setup_sink_pad ()">gst_check_setup_sink_pad</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="returnvalue">GstPad</span></a> * <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-setup-src-pad" title="gst_check_setup_src_pad ()">gst_check_setup_src_pad</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="returnvalue">GstPad</span></a> * <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-setup-sink-pad-by-name" title="gst_check_setup_sink_pad_by_name ()">gst_check_setup_sink_pad_by_name</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</code></em>,
<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);
-<a href="../gstreamer-1.0/GstPad.html"><span class="returnvalue">GstPad</span></a> * <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-setup-src-pad-by-name" title="gst_check_setup_src_pad_by_name ()">gst_check_setup_src_pad_by_name</a> (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</code></em>,
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="returnvalue">GstPad</span></a> * <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-setup-src-pad-by-name" title="gst_check_setup_src_pad_by_name ()">gst_check_setup_src_pad_by_name</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</code></em>,
<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);
-<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-teardown-pad-by-name" title="gst_check_teardown_pad_by_name ()">gst_check_teardown_pad_by_name</a> (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-teardown-pad-by-name" title="gst_check_teardown_pad_by_name ()">gst_check_teardown_pad_by_name</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);
-<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-teardown-element" title="gst_check_teardown_element ()">gst_check_teardown_element</a> (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>);
-<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-teardown-sink-pad" title="gst_check_teardown_sink_pad ()">gst_check_teardown_sink_pad</a> (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>);
-<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-teardown-src-pad" title="gst_check_teardown_src_pad ()">gst_check_teardown_src_pad</a> (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-teardown-element" title="gst_check_teardown_element ()">gst_check_teardown_element</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-teardown-sink-pad" title="gst_check_teardown_sink_pad ()">gst_check_teardown_sink_pad</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-teardown-src-pad" title="gst_check_teardown_src_pad ()">gst_check_teardown_src_pad</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>);
<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-drop-buffers" title="gst_check_drop_buffers ()">gst_check_drop_buffers</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
-<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-buffer-data" title="gst_check_buffer_data ()">gst_check_buffer_data</a> (<em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-buffer-data" title="gst_check_buffer_data ()">gst_check_buffer_data</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="type">gconstpointer</span></a> data</code></em>,
<em class="parameter"><code><span class="type">gsize</span> size</code></em>);
-<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-caps-equal" title="gst_check_caps_equal ()">gst_check_caps_equal</a> (<em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps2</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-caps-equal" title="gst_check_caps_equal ()">gst_check_caps_equal</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps1</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> *caps2</code></em>);
<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-element-push-buffer-list" title="gst_check_element_push_buffer_list ()">gst_check_element_push_buffer_list</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *element_name</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *buffer_in</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps_in</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_in</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *buffer_out</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps_out</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a> last_flow_return</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_out</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a> last_flow_return</code></em>);
<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-element-push-buffer" title="gst_check_element_push_buffer ()">gst_check_element_push_buffer</a> (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *element_name</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer_in</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps_in</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer_out</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps_out</code></em>);
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer_in</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_in</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer_out</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_out</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a> <a class="link" href="gstreamer-libs-GstCheck.html#gst-check-run-suite" title="gst_check_run_suite ()">gst_check_run_suite</a> (<em class="parameter"><code><span class="type">Suite</span> *suite</code></em>,
<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>,
<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *fname</code></em>);
<hr>
<div class="refsect2">
<a name="gst-check-message-error"></a><h3>gst_check_message_error ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span> gst_check_message_error (<em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstMessage.html#GstMessageType"><span class="type">GstMessageType</span></a> type</code></em>,
+<pre class="programlisting"><span class="returnvalue">void</span> gst_check_message_error (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessage"><span class="type">GstMessage</span></a> *message</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GstMessageType"><span class="type">GstMessageType</span></a> type</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> domain</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> code</code></em>);</pre>
</div>
<hr>
<div class="refsect2">
<a name="gst-check-setup-element"></a><h3>gst_check_setup_element ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstElement.html"><span class="returnvalue">GstElement</span></a> * gst_check_setup_element (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *factory</code></em>);</pre>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="returnvalue">GstElement</span></a> * gst_check_setup_element (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *factory</code></em>);</pre>
<p>
setup an element for a filter test with mysrcpad and mysinkpad
</p>
<hr>
<div class="refsect2">
<a name="gst-check-setup-sink-pad"></a><h3>gst_check_setup_sink_pad ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstPad.html"><span class="returnvalue">GstPad</span></a> * gst_check_setup_sink_pad (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</code></em>);</pre>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="returnvalue">GstPad</span></a> * gst_check_setup_sink_pad (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</code></em>);</pre>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
<hr>
<div class="refsect2">
<a name="gst-check-setup-src-pad"></a><h3>gst_check_setup_src_pad ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstPad.html"><span class="returnvalue">GstPad</span></a> * gst_check_setup_src_pad (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</code></em>);</pre>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="returnvalue">GstPad</span></a> * gst_check_setup_src_pad (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</code></em>);</pre>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
<hr>
<div class="refsect2">
<a name="gst-check-setup-sink-pad-by-name"></a><h3>gst_check_setup_sink_pad_by_name ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstPad.html"><span class="returnvalue">GstPad</span></a> * gst_check_setup_sink_pad_by_name (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</code></em>,
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="returnvalue">GstPad</span></a> * gst_check_setup_sink_pad_by_name (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</code></em>,
<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<hr>
<div class="refsect2">
<a name="gst-check-setup-src-pad-by-name"></a><h3>gst_check_setup_src_pad_by_name ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstPad.html"><span class="returnvalue">GstPad</span></a> * gst_check_setup_src_pad_by_name (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</code></em>,
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="returnvalue">GstPad</span></a> * gst_check_setup_src_pad_by_name (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPadTemplate.html#GstStaticPadTemplate"><span class="type">GstStaticPadTemplate</span></a> *tmpl</code></em>,
<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<hr>
<div class="refsect2">
<a name="gst-check-teardown-pad-by-name"></a><h3>gst_check_teardown_pad_by_name ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span> gst_check_teardown_pad_by_name (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
+<pre class="programlisting"><span class="returnvalue">void</span> gst_check_teardown_pad_by_name (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>,
<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
</div>
<hr>
<div class="refsect2">
<a name="gst-check-teardown-element"></a><h3>gst_check_teardown_element ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span> gst_check_teardown_element (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_check_teardown_element (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>);</pre>
</div>
<hr>
<div class="refsect2">
<a name="gst-check-teardown-sink-pad"></a><h3>gst_check_teardown_sink_pad ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span> gst_check_teardown_sink_pad (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_check_teardown_sink_pad (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>);</pre>
</div>
<hr>
<div class="refsect2">
<a name="gst-check-teardown-src-pad"></a><h3>gst_check_teardown_src_pad ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span> gst_check_teardown_src_pad (<em class="parameter"><code><a href="../gstreamer-1.0/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_check_teardown_src_pad (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *element</code></em>);</pre>
</div>
<hr>
<div class="refsect2">
<hr>
<div class="refsect2">
<a name="gst-check-buffer-data"></a><h3>gst_check_buffer_data ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span> gst_check_buffer_data (<em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+<pre class="programlisting"><span class="returnvalue">void</span> gst_check_buffer_data (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gconstpointer"><span class="type">gconstpointer</span></a> data</code></em>,
<em class="parameter"><code><span class="type">gsize</span> size</code></em>);</pre>
<p>
<hr>
<div class="refsect2">
<a name="gst-check-caps-equal"></a><h3>gst_check_caps_equal ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span> gst_check_caps_equal (<em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps1</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps2</code></em>);</pre>
+<pre class="programlisting"><span class="returnvalue">void</span> gst_check_caps_equal (<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> *caps1</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> *caps2</code></em>);</pre>
<p>
Compare two caps with gst_caps_is_equal and fail unless they are
equal.
<a name="gst-check-element-push-buffer-list"></a><h3>gst_check_element_push_buffer_list ()</h3>
<pre class="programlisting"><span class="returnvalue">void</span> gst_check_element_push_buffer_list (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *element_name</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *buffer_in</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps_in</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_in</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *buffer_out</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps_out</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a> last_flow_return</code></em>);</pre>
+ <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_out</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="type">GstFlowReturn</span></a> last_flow_return</code></em>);</pre>
<p>
Create an <em class="parameter"><code>element</code></em> with the factory with the name and push the buffers in
<em class="parameter"><code>buffer_in</code></em> to this element. The element should create the buffers equal to
<div class="refsect2">
<a name="gst-check-element-push-buffer"></a><h3>gst_check_element_push_buffer ()</h3>
<pre class="programlisting"><span class="returnvalue">void</span> gst_check_element_push_buffer (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *element_name</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer_in</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps_in</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer_out</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps_out</code></em>);</pre>
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer_in</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_in</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer_out</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_out</code></em>);</pre>
<p>
Create an <em class="parameter"><code>element</code></em> with the factory with the name and push the
<em class="parameter"><code>buffer_in</code></em> to this element. The element should create one buffer
<col align="left" valign="top">
<tbody>
<tr>
-<td><p><span class="term"><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> <em class="structfield"><code><a name="GstNetTimePacket.local-time"></a>local_time</code></em>;</span></p></td>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> <em class="structfield"><code><a name="GstNetTimePacket.local-time"></a>local_time</code></em>;</span></p></td>
<td>the local time when this packet was sent</td>
</tr>
<tr>
-<td><p><span class="term"><a href="../gstreamer-1.0/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> <em class="structfield"><code><a name="GstNetTimePacket.remote-time"></a>remote_time</code></em>;</span></p></td>
+<td><p><span class="term"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> <em class="structfield"><code><a name="GstNetTimePacket.remote-time"></a>remote_time</code></em>;</span></p></td>
<td>the remote time observation</td>
</tr>
</tbody>
</p>
<p>
If <em class="parameter"><code>buffer</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>, the local and remote times will be set to
-<a href="../gstreamer-1.0/GstClock.html#GST-CLOCK-TIME-NONE:CAPS"><span class="type">GST_CLOCK_TIME_NONE</span></a>.
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GST-CLOCK-TIME-NONE:CAPS"><span class="type">GST_CLOCK_TIME_NONE</span></a>.
</p>
<p>
MT safe. Caller owns return value (gst_net_time_packet_free to free).
</div>
<div class="refsect1">
<a name="gstreamer-libs-GstNetTimePacket.see-also"></a><h2>See Also</h2>
-<a href="../gstreamer-1.0/GstClock.html"><span class="type">GstClock</span></a>, <a class="link" href="GstNetClientClock.html" title="GstNetClientClock"><span class="type">GstNetClientClock</span></a>, <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="type">GstNetTimeProvider</span></a>
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html"><span class="type">GstClock</span></a>, <a class="link" href="GstNetClientClock.html" title="GstNetClientClock"><span class="type">GstNetClientClock</span></a>, <a class="link" href="GstNetTimeProvider.html" title="GstNetTimeProvider"><span class="type">GstNetTimeProvider</span></a>
</div>
</div>
<div class="footer">
#include <gst/check/gstconsistencychecker.h>
<a class="link" href="gstreamer-libs-GstStreamConsistency.html#GstStreamConsistency" title="GstStreamConsistency">GstStreamConsistency</a>;
-<a class="link" href="gstreamer-libs-GstStreamConsistency.html#GstStreamConsistency" title="GstStreamConsistency"><span class="returnvalue">GstStreamConsistency</span></a> * <a class="link" href="gstreamer-libs-GstStreamConsistency.html#gst-consistency-checker-new" title="gst_consistency_checker_new ()">gst_consistency_checker_new</a> (<em class="parameter"><code><a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);
+<a class="link" href="gstreamer-libs-GstStreamConsistency.html#GstStreamConsistency" title="GstStreamConsistency"><span class="returnvalue">GstStreamConsistency</span></a> * <a class="link" href="gstreamer-libs-GstStreamConsistency.html#gst-consistency-checker-new" title="gst_consistency_checker_new ()">gst_consistency_checker_new</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);
<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstStreamConsistency.html#gst-consistency-checker-reset" title="gst_consistency_checker_reset ()">gst_consistency_checker_reset</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstStreamConsistency.html#GstStreamConsistency" title="GstStreamConsistency"><span class="type">GstStreamConsistency</span></a> *consist</code></em>);
<span class="returnvalue">void</span> <a class="link" href="gstreamer-libs-GstStreamConsistency.html#gst-consistency-checker-free" title="gst_consistency_checker_free ()">gst_consistency_checker_free</a> (<em class="parameter"><code><a class="link" href="gstreamer-libs-GstStreamConsistency.html#GstStreamConsistency" title="GstStreamConsistency"><span class="type">GstStreamConsistency</span></a> *consist</code></em>);
</pre>
<hr>
<div class="refsect2">
<a name="gst-consistency-checker-new"></a><h3>gst_consistency_checker_new ()</h3>
-<pre class="programlisting"><a class="link" href="gstreamer-libs-GstStreamConsistency.html#GstStreamConsistency" title="GstStreamConsistency"><span class="returnvalue">GstStreamConsistency</span></a> * gst_consistency_checker_new (<em class="parameter"><code><a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
+<pre class="programlisting"><a class="link" href="gstreamer-libs-GstStreamConsistency.html#GstStreamConsistency" title="GstStreamConsistency"><span class="returnvalue">GstStreamConsistency</span></a> * gst_consistency_checker_new (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad</code></em>);</pre>
<p>
Sets up a data probe on the given pad which will raise assertions if the
data flow is inconsistent.
<tbody>
<tr>
<td><p><span class="term"><em class="parameter"><code>pad</code></em> :</span></p></td>
-<td>The <a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> on which the dataflow will be checked.</td>
+<td>The <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> on which the dataflow will be checked.</td>
</tr>
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
<pre class="synopsis">
#include <gst/base/gsttypefindhelper.h>
-<a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper" title="gst_type_find_helper ()">gst_type_find_helper</a> (<em class="parameter"><code><a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> *src</code></em>,
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper" title="gst_type_find_helper ()">gst_type_find_helper</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *src</code></em>,
<em class="parameter"><code><span class="type">guint64</span> size</code></em>);
-<a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-for-buffer" title="gst_type_find_helper_for_buffer ()">gst_type_find_helper_for_buffer</a> (<em class="parameter"><code><a href="../gstreamer-1.0/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstTypeFind.html#GstTypeFindProbability"><span class="type">GstTypeFindProbability</span></a> *prob</code></em>);
-<a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-for-extension" title="gst_type_find_helper_for_extension ()">gst_type_find_helper_for_extension</a> (<em class="parameter"><code><a href="../gstreamer-1.0/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-for-buffer" title="gst_type_find_helper_for_buffer ()">gst_type_find_helper_for_buffer</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTypeFind.html#GstTypeFindProbability"><span class="type">GstTypeFindProbability</span></a> *prob</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-for-extension" title="gst_type_find_helper_for_extension ()">gst_type_find_helper_for_extension</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *extension</code></em>);
-<a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-for-data" title="gst_type_find_helper_for_data ()">gst_type_find_helper_for_data</a> (<em class="parameter"><code><a href="../gstreamer-1.0/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-for-data" title="gst_type_find_helper_for_data ()">gst_type_find_helper_for_data</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
<em class="parameter"><code>const <span class="type">guint8</span> *data</code></em>,
<em class="parameter"><code><span class="type">gsize</span> size</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstTypeFind.html#GstTypeFindProbability"><span class="type">GstTypeFindProbability</span></a> *prob</code></em>);
-<a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (<a class="link" href="gstreamer-libs-GstTypeFindHelper.html#GstTypeFindHelperGetRangeFunction" title="GstTypeFindHelperGetRangeFunction ()">*GstTypeFindHelperGetRangeFunction</a>)
- (<em class="parameter"><code><a href="../gstreamer-1.0/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstObject.html"><span class="type">GstObject</span></a> *parent</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTypeFind.html#GstTypeFindProbability"><span class="type">GstTypeFindProbability</span></a> *prob</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (<a class="link" href="gstreamer-libs-GstTypeFindHelper.html#GstTypeFindHelperGetRangeFunction" title="GstTypeFindHelperGetRangeFunction ()">*GstTypeFindHelperGetRangeFunction</a>)
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> *parent</code></em>,
<em class="parameter"><code><span class="type">guint64</span> offset</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> length</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> **buffer</code></em>);
-<a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-get-range" title="gst_type_find_helper_get_range ()">gst_type_find_helper_get_range</a> (<em class="parameter"><code><a href="../gstreamer-1.0/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstObject.html"><span class="type">GstObject</span></a> *parent</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> **buffer</code></em>);
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-get-range" title="gst_type_find_helper_get_range ()">gst_type_find_helper_get_range</a> (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> *parent</code></em>,
<em class="parameter"><code><a class="link" href="gstreamer-libs-GstTypeFindHelper.html#GstTypeFindHelperGetRangeFunction" title="GstTypeFindHelperGetRangeFunction ()"><span class="type">GstTypeFindHelperGetRangeFunction</span></a> func</code></em>,
<em class="parameter"><code><span class="type">guint64</span> size</code></em>,
<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *extension</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstTypeFind.html#GstTypeFindProbability"><span class="type">GstTypeFindProbability</span></a> *prob</code></em>);
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTypeFind.html#GstTypeFindProbability"><span class="type">GstTypeFindProbability</span></a> *prob</code></em>);
</pre>
</div>
<div class="refsect1">
<a name="gstreamer-libs-GstTypeFindHelper.details"></a><h2>Details</h2>
<div class="refsect2">
<a name="gst-type-find-helper"></a><h3>gst_type_find_helper ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_type_find_helper (<em class="parameter"><code><a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> *src</code></em>,
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_type_find_helper (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *src</code></em>,
<em class="parameter"><code><span class="type">guint64</span> size</code></em>);</pre>
<p>
-Tries to find what type of data is flowing from the given source <a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a>.
+Tries to find what type of data is flowing from the given source <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a>.
</p>
<p>
Free-function: gst_caps_unref
<tbody>
<tr>
<td><p><span class="term"><em class="parameter"><code>src</code></em> :</span></p></td>
-<td>A source <a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a>
+<td>A source <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a>
</td>
</tr>
<tr>
</tr>
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>the <a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> corresponding to the data stream.
-Returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if no <a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> matches the data stream. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> corresponding to the data stream.
+Returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if no <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> matches the data stream. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
</td>
</tr>
</tbody>
<hr>
<div class="refsect2">
<a name="gst-type-find-helper-for-buffer"></a><h3>gst_type_find_helper_for_buffer ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_type_find_helper_for_buffer (<em class="parameter"><code><a href="../gstreamer-1.0/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstTypeFind.html#GstTypeFindProbability"><span class="type">GstTypeFindProbability</span></a> *prob</code></em>);</pre>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_type_find_helper_for_buffer (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buf</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTypeFind.html#GstTypeFindProbability"><span class="type">GstTypeFindProbability</span></a> *prob</code></em>);</pre>
<p>
-Tries to find what type of data is contained in the given <a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>, the
+Tries to find what type of data is contained in the given <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a>, the
assumption being that the buffer represents the beginning of the stream or
file.
</p>
<p>
All available typefinders will be called on the data in order of rank. If
-a typefinding function returns a probability of <a href="../gstreamer-1.0/gstreamer-GstTypeFind.html#GST-TYPE-FIND-MAXIMUM:CAPS"><span class="type">GST_TYPE_FIND_MAXIMUM</span></a>,
+a typefinding function returns a probability of <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTypeFind.html#GST-TYPE-FIND-MAXIMUM:CAPS"><span class="type">GST_TYPE_FIND_MAXIMUM</span></a>,
typefinding is stopped immediately and the found caps will be returned
right away. Otherwise, all available typefind functions will the tried,
and the caps with the highest probability will be returned, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>buf</code></em> :</span></p></td>
-<td>a <a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> with data to typefind. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> with data to typefind. <span class="annotation">[<acronym title="Parameter for input. Default is transfer none."><span class="acronym">in</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
</td>
</tr>
<tr>
</tr>
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>the <a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> corresponding to the data, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> corresponding to the data, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>
if no type could be found. The caller should free the caps returned
-with <a href="../gstreamer-1.0/gstreamer-GstCaps.html#gst-caps-unref"><code class="function">gst_caps_unref()</code></a>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+with <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#gst-caps-unref"><code class="function">gst_caps_unref()</code></a>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
</td>
</tr>
</tbody>
<hr>
<div class="refsect2">
<a name="gst-type-find-helper-for-extension"></a><h3>gst_type_find_helper_for_extension ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_type_find_helper_for_extension (<em class="parameter"><code><a href="../gstreamer-1.0/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_type_find_helper_for_extension (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *extension</code></em>);</pre>
<p>
-Tries to find the best <a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> associated with <em class="parameter"><code>extension</code></em>.
+Tries to find the best <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> associated with <em class="parameter"><code>extension</code></em>.
</p>
<p>
All available typefinders will be checked against the extension in order
</tr>
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>the <a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> corresponding to <em class="parameter"><code>extension</code></em>, or
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> corresponding to <em class="parameter"><code>extension</code></em>, or
<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if no type could be found. The caller should free the caps
-returned with <a href="../gstreamer-1.0/gstreamer-GstCaps.html#gst-caps-unref"><code class="function">gst_caps_unref()</code></a>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+returned with <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#gst-caps-unref"><code class="function">gst_caps_unref()</code></a>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
</td>
</tr>
</tbody>
<hr>
<div class="refsect2">
<a name="gst-type-find-helper-for-data"></a><h3>gst_type_find_helper_for_data ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_type_find_helper_for_data (<em class="parameter"><code><a href="../gstreamer-1.0/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_type_find_helper_for_data (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
<em class="parameter"><code>const <span class="type">guint8</span> *data</code></em>,
<em class="parameter"><code><span class="type">gsize</span> size</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstTypeFind.html#GstTypeFindProbability"><span class="type">GstTypeFindProbability</span></a> *prob</code></em>);</pre>
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTypeFind.html#GstTypeFindProbability"><span class="type">GstTypeFindProbability</span></a> *prob</code></em>);</pre>
<p>
Tries to find what type of data is contained in the given <em class="parameter"><code>data</code></em>, the
assumption being that the data represents the beginning of the stream or
</p>
<p>
All available typefinders will be called on the data in order of rank. If
-a typefinding function returns a probability of <a href="../gstreamer-1.0/gstreamer-GstTypeFind.html#GST-TYPE-FIND-MAXIMUM:CAPS"><span class="type">GST_TYPE_FIND_MAXIMUM</span></a>,
+a typefinding function returns a probability of <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTypeFind.html#GST-TYPE-FIND-MAXIMUM:CAPS"><span class="type">GST_TYPE_FIND_MAXIMUM</span></a>,
typefinding is stopped immediately and the found caps will be returned
right away. Otherwise, all available typefind functions will the tried,
and the caps with the highest probability will be returned, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if
</tr>
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>the <a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> corresponding to the data, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> corresponding to the data, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a>
if no type could be found. The caller should free the caps returned
-with <a href="../gstreamer-1.0/gstreamer-GstCaps.html#gst-caps-unref"><code class="function">gst_caps_unref()</code></a>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+with <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#gst-caps-unref"><code class="function">gst_caps_unref()</code></a>. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
</td>
</tr>
</tbody>
<hr>
<div class="refsect2">
<a name="GstTypeFindHelperGetRangeFunction"></a><h3>GstTypeFindHelperGetRangeFunction ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (*GstTypeFindHelperGetRangeFunction)
- (<em class="parameter"><code><a href="../gstreamer-1.0/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstObject.html"><span class="type">GstObject</span></a> *parent</code></em>,
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstFlowReturn"><span class="returnvalue">GstFlowReturn</span></a> (*GstTypeFindHelperGetRangeFunction)
+ (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> *parent</code></em>,
<em class="parameter"><code><span class="type">guint64</span> offset</code></em>,
<em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> length</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> **buffer</code></em>);</pre>
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> **buffer</code></em>);</pre>
<p>
This function will be called by <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper-get-range" title="gst_type_find_helper_get_range ()"><code class="function">gst_type_find_helper_get_range()</code></a> when
typefinding functions request to peek at the data of a stream at certain
return value.
</p>
<p>
-This function is supposed to behave exactly like a <a href="../gstreamer-1.0/GstPad.html#GstPadGetRangeFunction"><span class="type">GstPadGetRangeFunction</span></a>.
+This function is supposed to behave exactly like a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstPadGetRangeFunction"><span class="type">GstPadGetRangeFunction</span></a>.
</p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
<tr>
<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
-<td>a <a href="../gstreamer-1.0/GstObject.html"><span class="type">GstObject</span></a> that will handle the getrange request</td>
+<td>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> that will handle the getrange request</td>
</tr>
<tr>
<td><p><span class="term"><em class="parameter"><code>parent</code></em> :</span></p></td>
<hr>
<div class="refsect2">
<a name="gst-type-find-helper-get-range"></a><h3>gst_type_find_helper_get_range ()</h3>
-<pre class="programlisting"><a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_type_find_helper_get_range (<em class="parameter"><code><a href="../gstreamer-1.0/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/GstObject.html"><span class="type">GstObject</span></a> *parent</code></em>,
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="returnvalue">GstCaps</span></a> * gst_type_find_helper_get_range (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> *obj</code></em>,
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> *parent</code></em>,
<em class="parameter"><code><a class="link" href="gstreamer-libs-GstTypeFindHelper.html#GstTypeFindHelperGetRangeFunction" title="GstTypeFindHelperGetRangeFunction ()"><span class="type">GstTypeFindHelperGetRangeFunction</span></a> func</code></em>,
<em class="parameter"><code><span class="type">guint64</span> size</code></em>,
<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *extension</code></em>,
- <em class="parameter"><code><a href="../gstreamer-1.0/gstreamer-GstTypeFind.html#GstTypeFindProbability"><span class="type">GstTypeFindProbability</span></a> *prob</code></em>);</pre>
+ <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTypeFind.html#GstTypeFindProbability"><span class="type">GstTypeFindProbability</span></a> *prob</code></em>);</pre>
<p>
Utility function to do pull-based typefinding. Unlike <a class="link" href="gstreamer-libs-GstTypeFindHelper.html#gst-type-find-helper" title="gst_type_find_helper ()"><code class="function">gst_type_find_helper()</code></a>
however, this function will use the specified function <em class="parameter"><code>func</code></em> to obtain the
<tbody>
<tr>
<td><p><span class="term"><em class="parameter"><code>obj</code></em> :</span></p></td>
-<td>A <a href="../gstreamer-1.0/GstObject.html"><span class="type">GstObject</span></a> that will be passed as first argument to <em class="parameter"><code>func</code></em>
+<td>A <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html"><span class="type">GstObject</span></a> that will be passed as first argument to <em class="parameter"><code>func</code></em>
</td>
</tr>
<tr>
</tr>
<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>the <a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> corresponding to the data stream.
-Returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if no <a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> matches the data stream. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+<td>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> corresponding to the data stream.
+Returns <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><span class="type">NULL</span></a> if no <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> matches the data stream. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
</td>
</tr>
</tbody>
<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#idp5184896"/>
+ <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"/>
<keyword type="property" name="The "sync" property" link="GstBaseSink.html#GstBaseSink--sync"/>
<keyword type="property" name="The "throttle-time" property" link="GstBaseSink.html#GstBaseSink--throttle-time"/>
<keyword type="property" name="The "ts-offset" property" link="GstBaseSink.html#GstBaseSink--ts-offset"/>
- <keyword type="" name="Use Cases" link="GstBaseTransform.html#idp5388448"/>
- <keyword type="" name="Sub-class settable flags on GstBaseTransform" link="GstBaseTransform.html#idp6912544"/>
+ <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"/>
<keyword type="function" name="gst_base_transform_set_passthrough ()" link="GstBaseTransform.html#gst-base-transform-set-passthrough"/>
+ <keyword type="function" name="gst_base_transform_set_prefer_passthrough ()" link="GstBaseTransform.html#gst-base-transform-set-prefer-passthrough" since="1.0.1"/>
<keyword type="function" name="gst_base_transform_is_in_place ()" link="GstBaseTransform.html#gst-base-transform-is-in-place"/>
<keyword type="function" name="gst_base_transform_set_in_place ()" link="GstBaseTransform.html#gst-base-transform-set-in-place"/>
<keyword type="function" name="gst_base_transform_is_qos_enabled ()" link="GstBaseTransform.html#gst-base-transform-is-qos-enabled"/>
<span class="refentrytitle"><a href="GstBaseSrc.html">GstBaseSrc</a></span><span class="refpurpose"> — Base class for getrange based source elements</span>
</dt>
<dt>
-<span class="refentrytitle"><a href="GstBaseSink.html">GstBaseSink</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="GstBaseSink.html">GstBaseSink</a></span><span class="refpurpose"> — Base class for sink elements</span>
</dt>
<dt>
<span class="refentrytitle"><a href="GstBaseTransform.html">GstBaseTransform</a></span><span class="refpurpose"> — Base class for simple transform filters</span>
<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.0)
+ 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>
<span class="refentrytitle"><a href="GstBaseSrc.html">GstBaseSrc</a></span><span class="refpurpose"> — Base class for getrange based source elements</span>
</dt>
<dt>
-<span class="refentrytitle"><a href="GstBaseSink.html">GstBaseSink</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="GstBaseSink.html">GstBaseSink</a></span><span class="refpurpose"> — Base class for sink elements</span>
</dt>
<dt>
<span class="refentrytitle"><a href="GstBaseTransform.html">GstBaseTransform</a></span><span class="refpurpose"> — Base class for simple transform filters</span>
<ANCHOR id="GstBaseSink--sync" href="gstreamer-libs-1.0/GstBaseSink.html#GstBaseSink--sync">
<ANCHOR id="GstBaseSink--throttle-time" href="gstreamer-libs-1.0/GstBaseSink.html#GstBaseSink--throttle-time">
<ANCHOR id="GstBaseSink--ts-offset" href="gstreamer-libs-1.0/GstBaseSink.html#GstBaseSink--ts-offset">
+<ANCHOR id="GstBaseSink.see-also" href="gstreamer-libs-1.0/GstBaseSink.html#GstBaseSink.see-also">
<ANCHOR id="GstBaseTransform" href="gstreamer-libs-1.0/GstBaseTransform.html">
<ANCHOR id="GstBaseTransform.synopsis" href="gstreamer-libs-1.0/GstBaseTransform.html#GstBaseTransform.synopsis">
<ANCHOR id="GstBaseTransform.object-hierarchy" href="gstreamer-libs-1.0/GstBaseTransform.html#GstBaseTransform.object-hierarchy">
<ANCHOR id="GstBaseTransformClass" href="gstreamer-libs-1.0/GstBaseTransform.html#GstBaseTransformClass">
<ANCHOR id="gst-base-transform-is-passthrough" href="gstreamer-libs-1.0/GstBaseTransform.html#gst-base-transform-is-passthrough">
<ANCHOR id="gst-base-transform-set-passthrough" href="gstreamer-libs-1.0/GstBaseTransform.html#gst-base-transform-set-passthrough">
+<ANCHOR id="gst-base-transform-set-prefer-passthrough" href="gstreamer-libs-1.0/GstBaseTransform.html#gst-base-transform-set-prefer-passthrough">
<ANCHOR id="gst-base-transform-is-in-place" href="gstreamer-libs-1.0/GstBaseTransform.html#gst-base-transform-is-in-place">
<ANCHOR id="gst-base-transform-set-in-place" href="gstreamer-libs-1.0/GstBaseTransform.html#gst-base-transform-set-in-place">
<ANCHOR id="gst-base-transform-is-qos-enabled" href="gstreamer-libs-1.0/GstBaseTransform.html#gst-base-transform-is-qos-enabled">
$(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 \
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@
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@
if echo $(FORMATS) | grep ps > /dev/null; then export SRC="$$SRC $(DOC).ps"; fi; \
if echo $(FORMATS) | grep pdf > /dev/null; then export SRC="$$SRC $(DOC).pdf"; fi; \
\
- # upload releases to both 0.10.X/ and head/ subdirectories \
- if test "x$(PACKAGE_VERSION_NANO)" = x0; then \
- export DIR=$(DOC_BASE)/gstreamer/$(VERSION)/$(DOC); \
- echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
- ssh $(DOC_SERVER) mkdir -p $$DIR; \
- rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \
- ssh $(DOC_SERVER) chmod -R g+w $$DIR; \
- fi; \
+ # upload releases to both X.Y/ and head/ subdirectories \
+ export DIR=$(DOC_BASE)/gstreamer/$(PACKAGE_VERSION_MAJOR).$(PACKAGE_VERSION_MINOR)/$(DOC); \
+ echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
+ ssh $(DOC_SERVER) mkdir -p $$DIR; \
+ rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \
+ ssh $(DOC_SERVER) chmod -R g+w $$DIR; \
\
export DIR=$(DOC_BASE)/gstreamer/head/$(DOC); \
echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
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
without needing any adaptations to its autopluggers.
</para>
<para>
- We will first introduce the concept of MIME types as a dynamic and
+ We will first introduce the concept of Media types as a dynamic and
extendible way of identifying media streams. After that, we will introduce
the concept of typefinding to find the type of a media stream. Lastly,
we will explain how autoplugging and the &GStreamer; registry can be
- used to setup a pipeline that will convert media from one mimetype to
+ used to setup a pipeline that will convert media from one mediatype to
another, for example for media decoding.
</para>
- <sect1 id="section-mime">
- <title>MIME-types as a way to identify streams</title>
+ <sect1 id="section-media">
+ <title>Media types as a way to identify streams</title>
<para>
We have previously introduced the concept of capabilities as a way
for elements (or, rather, pads) to agree on a media type when
streaming data from one element to the next (see <xref
linkend="section-caps"/>). We have explained that a capability is
- a combination of a mimetype and a set of properties. For most
+ a combination of a media type and a set of properties. For most
container formats (those are the files that you will find on your
hard disk; Ogg, for example, is a container format), no properties
- are needed to describe the stream. Only a MIME-type is needed. A
- full list of MIME-types and accompanying properties can be found
+ are needed to describe the stream. Only a media type is needed. A
+ full list of media types and accompanying properties can be found
in <ulink type="http"
url="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/section-types-definitions.html">the
Plugin Writer's Guide</ulink>.
</para>
<para>
- An element must associate a MIME-type to its source and sink pads
+ An element must associate a media type to its source and sink pads
when it is loaded into the system. &GStreamer; knows about the
different elements and what type of data they expect and emit through
the &GStreamer; registry. This allows for very dynamic and extensible
<para>
In <xref linkend="chapter-helloworld"/>, we've learned to build a
- music player for Ogg/Vorbis files. Let's look at the MIME-types
+ music player for Ogg/Vorbis files. Let's look at the media types
associated with each pad in this pipeline. <xref
- linkend="section-mime-img"/> shows what MIME-type belongs to each
+ linkend="section-mime-img"/> shows what media type belongs to each
pad in this pipeline.
</para>
<figure float="1" id="section-mime-img">
- <title>The Hello world pipeline with MIME types</title>
+ <title>The Hello world pipeline with media types</title>
<mediaobject>
<imageobject>
<imagedata scale="75" fileref="images/mime-world.ℑ" format="&IMAGE;"/>
<para>
Plugins in &GStreamer; can, as mentioned before, implement typefinder
functionality. A plugin implementing this functionality will submit
- a mimetype, optionally a set of file extensions commonly used for this
+ a media type, optionally a set of file extensions commonly used for this
media type, and a typefind function. Once this typefind function inside
the plugin is called, the plugin will see if the data in this media
stream matches a specific pattern that marks the media type identified
- by that mimetype. If it does, it will notify the typefind element of
+ by that media type. If it does, it will notify the typefind element of
this fact, telling which mediatype was recognized and how certain we
are that this stream is indeed that mediatype. Once this run has been
completed for all plugins implementing a typefind functionality, the
</sect1>
<sect1 id="section-dynamic">
- <title>Plugging together dynamic pipelines</title>
- <warning><para>
- The code in this section is broken, outdated and overly complicated.
- Also, you should use decodebin, playbin or uridecodebin to get
- decoders plugged automatically.
- </para></warning>
- <para>
- In this chapter we will see how you can create a dynamic pipeline. A
- dynamic pipeline is a pipeline that is updated or created while data
- is flowing through it. We will create a partial pipeline first and add
- more elements while the pipeline is playing. The basis of this player
- will be the application that we wrote in the previous section (<xref
- linkend="section-typefinding"/>) to identify unknown media streams.
- </para>
- <!-- example-begin dynamic.c a --><!--
-#include <gst/gst.h>
-
-GstElement *pipeline;
- --><!-- example-end dynamic.c a -->
- <para>
- Once the type of the media has been found, we will find elements in
- the registry that can decode this streamtype. For this, we will get
- all element factories (which we've seen before in <xref
- linkend="section-elements-create"/>) and find the ones with the
- given MIME-type and capabilities on their sinkpad. Note that we will
- only use parsers, demuxers and decoders. We will not use factories for
- any other element types, or we might get into a loop of encoders and
- decoders. For this, we will want to build a list of <quote>allowed</quote>
- factories right after initializing &GStreamer;.
- </para>
- <programlisting><!-- example-begin dynamic.c b -->
-static GList *factories;
-
-/*
- * This function is called by the registry loader. Its return value
- * (TRUE or FALSE) decides whether the given feature will be included
- * in the list that we're generating further down.
- */
-
-static gboolean
-cb_feature_filter (GstPluginFeature *feature,
- gpointer data)
-{
- const gchar *klass;
- guint rank;
-
- /* we only care about element factories */
- if (!GST_IS_ELEMENT_FACTORY (feature))
- return FALSE;
-
- /* only parsers, demuxers and decoders */
- klass = gst_element_factory_get_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);
-}
- <!-- 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 *mime;
- const GList *item;
- GstCaps *res, *audiocaps;
-
- /* don't plug if we're already plugged - FIXME: memleak for pad */
- if (GST_PAD_IS_LINKED (gst_element_get_static_pad (audiosink, "sink"))) {
- g_print ("Omitting link for pad %s:%s because we're already linked\n",
- GST_OBJECT_NAME (parent), GST_OBJECT_NAME (pad));
- return;
- }
-
- /* as said above, we only try to plug audio... Omit video */
- mime = gst_structure_get_name (gst_caps_get_structure (caps, 0));
- if (g_strrstr (mime, "video")) {
- g_print ("Omitting link for pad %s:%s because mimetype %s is non-audio\n",
- GST_OBJECT_NAME (parent), GST_OBJECT_NAME (pad), mime);
- return;
- }
-
- /* can it link to the audiopad? */
- audiocaps = gst_pad_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",
- mime, GST_OBJECT_NAME (parent), GST_OBJECT_NAME (pad));
-}
-
-static void
-cb_typefound (GstElement *typefind,
- guint probability,
- GstCaps *caps,
- gpointer data)
-{
- gchar *s;
- GstPad *pad;
-
- s = gst_caps_to_string (caps);
- g_print ("Detected media type %s\n", s);
- g_free (s);
-
- /* actually plug now */
- pad = gst_element_get_static_pad (typefind, "src");
- try_to_plug (pad, caps);
- gst_object_unref (GST_OBJECT (pad));
-}
- <!-- example-end dynamic.c c --></programlisting>
- <para>
- By doing all this, we will be able to make a simple autoplugger that
- can automatically setup a pipeline for any media type. In the example
- above, we did this for audio only. However, we can also do this
- for video to create a player that plays both audio and video.
- </para>
- <!-- example-begin dynamic.c d --><!--
-static gboolean
-my_bus_callback (GstBus *bus,
- GstMessage *message,
- gpointer data)
-{
- GMainLoop *loop = data;
-
- switch (GST_MESSAGE_TYPE (message)) {
- case GST_MESSAGE_ERROR: {
- GError *err;
- gchar *debug;
-
- gst_message_parse_error (message, &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;
-}
- --><!-- example-end dynamic.c d -->
+ <title>Dynamically autoplugging a pipeline</title>
<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>
--- /dev/null
+<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 (&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;
+}
+]]>
+<!-- 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>
<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.ℑ" 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.ℑ" 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>
<title>Pipeline manipulation</title>
<para>
This chapter will discuss how you can manipulate your pipeline in several
- ways from your application on. Parts of this chapter are downright
- hackish, so be assured that you'll need some programming knowledge
- before you start reading this.
+ ways from your application on. Parts of this chapter are very
+ lowlevel, so be assured that you'll need some programming knowledge
+ and a good understanding of &GStreamer; before you start reading this.
</para>
<para>
Topics that will be discussed here include how you can insert data into
to listen to a pipeline's data processing.
</para>
- <sect1 id="section-data-probe">
- <title>Data probing</title>
+ <sect1 id="section-using-probes">
+ <title>Using probes</title>
<para>
Probing is best envisioned as a pad listener. Technically, a probe is
- nothing more than a signal callback that can be attached to a pad.
- Those signals are by default not fired at all (since that may have a
- negative impact on performance), but can be enabled by attaching a
- probe using <function>gst_pad_add_buffer_probe ()</function>,
- <function>gst_pad_add_event_probe ()</function>, or
- <function>gst_pad_add_data_probe ()</function>.
- Those functions attach the signal handler and
- enable the actual signal emission. Similarly, one can use the
- <function>gst_pad_remove_buffer_probe ()</function>,
- <function>gst_pad_remove_event_probe ()</function>, or
- <function>gst_pad_remove_data_probe ()</function>
- to remove the signal handlers again.
+ nothing more than a callback that can be attached to a pad.
+ You can attach a probe using <function>gst_pad_add_probe ()</function>.
+ Similarly, one can use the
+ <function>gst_pad_remove_probe ()</function>
+ to remove the callback again. The probe notifies you of any activity
+ that happens on the pad, like buffers, events and queries. You can
+ define what kind of notifications you are interested in when you
+ add the probe.
</para>
<para>
- Probes run in pipeline threading context, so callbacks should try to
- not block and generally not do any weird stuff, since this could
- have a negative impact on pipeline performance or, in case of bugs,
- cause deadlocks or crashes. More precisely, one should usually not
- call any GUI-related functions from within a probe callback, nor try
- to change the state of the pipeline. An application may post custom
- messages on the pipeline's bus though to communicate with the main
- application thread and have it do things like stop the pipeline.
+ The probe can notify you of the following activity on pads:
</para>
- <para>
- In any case, most common buffer operations
- that elements can do in <function>_chain ()</function> functions, can
- be done in probe callbacks as well. The example below gives a short
- impression on how to use them (even if this usage is not entirely
- correct, but more on that below):
- </para>
- <programlisting><!-- example-begin probe.c -->
-#include <gst/gst.h>
+ <itemizedlist>
+ <listitem>
+ <para>
+ A buffer is pushed or pulled. You want to specify the
+ GST_PAD_PROBE_TYPE_BUFFER when registering the probe. Because the
+ pad can be scheduled in different ways, it is possible to also
+ specify in what scheduling mode you are interested with the
+ optional GST_PAD_PROBE_TYPE_PUSH and GST_PAD_PROBE_TYPE_PULL
+ flags.
+ </para>
+ <para>
+ You can use this probe to inspect, modify or drop the buffer.
+ See <xref linkend="section-data-probes"/>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A bufferlist is pushed. Use the GST_PAD_PROBE_TYPE_BUFFER_LIST
+ when registering the probe.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ An event travels over a pad. Use the GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM
+ and GST_PAD_PROBE_TYPE_EVENT_UPSTREAM flags to select downstream
+ and upstream events. There is also a convenience
+ GST_PAD_PROBE_TYPE_EVENT_BOTH to be notified of events going both
+ upstream and downstream. By default, flush events do not cause
+ a notification. You need to explicitly enable GST_PAD_PROBE_TYPE_EVENT_FLUSH
+ to receive callbacks from flushing events. Events are always
+ only notified in push mode.
+ </para>
+ <para>
+ You can use this probe to inspect, modify or drop the event.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A query travels over a pad. Use the GST_PAD_PROBE_TYPE_QUERY_DOWNSTREAM
+ and GST_PAD_PROBE_TYPE_QUERY_UPSTREAM flags to select downstream
+ and upstream queries. The convenience GST_PAD_PROBE_TYPE_QUERY_BOTH
+ can also be used to select both directions. Query probes will be
+ notified twice, once when the query travels upstream/downstream and
+ once when the query result is returned. You can select in what stage
+ the callback will be called with the GST_PAD_PROBE_TYPE_PUSH and
+ GST_PAD_PROBE_TYPE_PULL, respectively when the query is performed
+ and when the query result is returned.
+ </para>
+ <para>
+ You can use this probe to inspect or modify the query. You can also
+ answer the query in the probe callback by placing the result value
+ in the query and by returning GST_PAD_PROBE_DROP from the
+ callback.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ In addition to notifying you of dataflow, you can also ask the
+ probe to block the dataflow when the callback returns. This is
+ called a blocking probe and is activated by specifying the
+ GST_PAD_PROBE_TYPE_BLOCK flag. You can use this flag with the
+ other flags to only block dataflow on selected activity. A pad
+ becomes unblocked again if you remove the probe or when you return
+ GST_PAD_PROBE_REMOVE from the callback. You can let only the
+ currently blocked item pass by returning GST_PAD_PROBE_PASS
+ from the callback, it will block again on the next item.
+ </para>
+ <para>
+ Blocking probes are used to temporarily block pads because they
+ are unlinked or because you are going to unlink them. If the
+ dataflow is not blocked, the pipeline would go into an error
+ state if data is pushed on an unlinked pad. We will se how
+ to use blocking probes to partially preroll a pipeline.
+ See also <xref linkend="section-preroll-probes"/>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Be notified when no activity is happening on a pad. You install
+ this probe with the GST_PAD_PROBE_TYPE_IDLE flag. You can specify
+ GST_PAD_PROBE_TYPE_PUSH and/or GST_PAD_PROBE_TYPE_PULL to
+ only be notified depending on the pad scheduling mode.
+ The IDLE probe is also a blocking probe in that it will not let
+ any data pass on the pad for as long as the IDLE probe is
+ installed.
+ </para>
+ <para>
+ You can use idle probes to dynamically relink a pad. We will see
+ how to use idle probes to replace an element in the pipeline.
+ See also <xref linkend="section-dynamic-pipelines"/>.
+ </para>
+ </listitem>
+ </itemizedlist>
-static gboolean
-cb_have_data (GstPad *pad,
- GstBuffer *buffer,
- gpointer u_data)
+ <sect2 id="section-data-probes">
+ <title>Data probes</title>
+ <para>
+ Data probes allow you to be notified when there is data passing
+ on a pad. When adding the probe, specify the GST_PAD_PROBE_TYPE_BUFFER
+ and/or GST_PAD_PROBE_TYPE_BUFFER_LIST.
+ </para>
+ <para>
+ Data probes run in pipeline streaming thread context, so callbacks
+ should try to not block and generally not do any weird stuff, since
+ this could have a negative impact on pipeline performance or, in case
+ of bugs, cause deadlocks or crashes. More precisely, one should usually
+ not call any GUI-related functions from within a probe callback, nor try
+ to change the state of the pipeline. An application may post custom
+ messages on the pipeline's bus though to communicate with the main
+ application thread and have it do things like stop the pipeline.
+ </para>
+ <para>
+ In any case, most common buffer operations
+ that elements can do in <function>_chain ()</function> functions, can
+ be done in probe callbacks as well. The example below gives a short
+ impression on how to use them.
+ </para>
+ <programlisting>
+<!-- example-begin probe.c -->
+<![CDATA[
+#include <gst/gst.h>
+
+static GstPadProbeReturn
+cb_have_data (GstPad *pad,
+ GstPadProbeInfo *info,
+ gpointer user_data)
{
gint x, y;
- GstMapInfo info;
+ GstMapInfo map;
guint16 *ptr, t;
+ GstBuffer *buffer;
+
+ buffer = GST_PAD_PROBE_INFO_BUFFER (info);
+
+ buffer = gst_buffer_make_writable (buffer);
- gst_buffer_map (buffer, &info, GST_MAP_WRITE);
+ gst_buffer_map (buffer, &map, GST_MAP_WRITE);
- ptr = info.data;
+ ptr = (guint16 *) map.data;
/* invert data */
- for (y = 0; y < 288; y++) {
- for (x = 0; x < 384 / 2; x++) {
+ for (y = 0; y < 288; y++) {
+ for (x = 0; x < 384 / 2; x++) {
t = ptr[384 - 1 - x];
ptr[384 - 1 - x] = ptr[x];
ptr[x] = t;
}
ptr += 384;
}
- gst_buffer_unmap (buffer, &info);
+ gst_buffer_unmap (buffer, &map);
- return TRUE;
+ GST_PAD_PROBE_INFO_DATA (info) = buffer;
+
+ return GST_PAD_PROBE_OK;
}
gint
GstPad *pad;
/* init GStreamer */
- gst_init (&argc, &argv);
+ gst_init (&argc, &argv);
loop = g_main_loop_new (NULL, FALSE);
/* build */
g_object_set (G_OBJECT (filter), "caps", filtercaps, NULL);
gst_caps_unref (filtercaps);
- pad = gst_element_get_pad (src, "src");
- gst_pad_add_buffer_probe (pad, G_CALLBACK (cb_have_data), NULL);
+ pad = gst_element_get_static_pad (src, "src");
+ gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER,
+ (GstPadProbeCallback) cb_have_data, NULL, NULL);
gst_object_unref (pad);
/* run */
return 0;
}
- <!-- example-end probe.c --></programlisting>
- <para>
- Compare that output with the output of <quote>gst-launch-0.10
- videotestsrc ! xvimagesink</quote>, just so you know what you're
- looking for.
- </para>
- <para>
- The above example is not really correct though. Strictly speaking, a
- pad probe callback is only allowed to modify the buffer content if the
- buffer is writable, and it is only allowed to modify buffer metadata like
- timestamps, caps, etc. if the buffer metadata is writable. Whether this
- is the case or not depends a lot on the pipeline and the elements
- involved. Often enough, this is the case, but sometimes it is not,
- and if it is not then unexpected modification of the data or metadata
- can introduce bugs that are very hard to debug and track down. You can
- check if a buffer and its metadata are writable with
- <function>gst_buffer_is_writable ()</function> and
- <function>gst_buffer_is_metadata_writable ()</function>. Since you
- can't pass back a different buffer than the one passed in, there is no
- point of making a buffer writable in the callback function.
- </para>
- <para>
- Pad probes are suited best for looking at data as it passes through
- the pipeline. If you need to modify data, you should write your own
- GStreamer element. Base classes like GstAudioFilter, GstVideoFilter or
- GstBaseTransform make this fairly easy.
- </para>
- <para>
- If you just want to inspect buffers as they pass through the pipeline,
- you don't even need to set up pad probes. You could also just insert
- an identity element into the pipeline and connect to its "handoff"
- signal. The identity element also provides a few useful debugging tools
- like the "dump" property or the "last-message" property (the latter is
- enabled by passing the '-v' switch to gst-launch).
- </para>
+]]>
+<!-- example-end probe.c -->
+ </programlisting>
+ <para>
+ Compare that output with the output of <quote>gst-launch-1.0
+ videotestsrc ! xvimagesink</quote>, just so you know what you're
+ looking for.
+ </para>
+ <para>
+ Strictly speaking, a pad probe callback is only allowed to modify the
+ buffer content if the buffer is writable. Whether this is the case or
+ not depends a lot on the pipeline and the elements involved. Often
+ enough, this is the case, but sometimes it is not, and if it is not
+ then unexpected modification of the data or metadata can introduce
+ bugs that are very hard to debug and track down. You can check if a
+ buffer is writable with <function>gst_buffer_is_writable ()</function>.
+ Since you can pass back a different buffer than the one passed in,
+ it is a good idea to make the buffer writable in the callback function
+ with <function>gst_buffer_make_writable ()</function>.
+ </para>
+ <para>
+ Pad probes are suited best for looking at data as it passes through
+ the pipeline. If you need to modify data, you should better write your
+ own GStreamer element. Base classes like GstAudioFilter, GstVideoFilter or
+ GstBaseTransform make this fairly easy.
+ </para>
+ <para>
+ If you just want to inspect buffers as they pass through the pipeline,
+ you don't even need to set up pad probes. You could also just insert
+ an identity element into the pipeline and connect to its "handoff"
+ signal. The identity element also provides a few useful debugging tools
+ like the "dump" property or the "last-message" property (the latter is
+ enabled by passing the '-v' switch to gst-launch and by setting the
+ silent property on the identity to FALSE).
+ </para>
+ </sect2>
+
+ <sect2 id="section-preroll-probes">
+ <title>Play a region of a media file</title>
+ <para>
+ In this example we will show you how to play back a region of
+ a media file. The goal is to only play the part of a file
+ from 2 seconds to 5 seconds and then EOS.
+ </para>
+ <para>
+ In a first step we will set a uridecodebin element to the PAUSED
+ state and make sure that we block all the source pads that are
+ created. When all the source pads are blocked, we have data on
+ all source pads and we say that the uridecodebin is prerolled.
+ </para>
+ <para>
+ In a prerolled pipeline we can ask for the duration of the media
+ and we can also perform seeks. We are interested in performing a
+ seek operation on the pipeline to select the range of media
+ that we are interested in.
+ </para>
+ <para>
+ After we configure the region we are interested in, we can link
+ the sink element, unblock the source pads and set the pipeline to
+ the playing state. You will see that exactly the requested
+ region is played by the sink before it goes to EOS.
+ What follows
+ </para>
+ <para>
+ What follows is an example application that loosly follows this
+ algorithm.
+ </para>
+ <programlisting>
+<!-- example-begin blockprobe.c -->
+<![CDATA[
+#include <gst/gst.h>
+
+static GMainLoop *loop;
+static volatile gint counter;
+static GstBus *bus;
+static gboolean prerolled = FALSE;
+static GstPad *sinkpad;
+
+static void
+dec_counter (GstElement * pipeline)
+{
+ if (prerolled)
+ return;
+
+ if (g_atomic_int_dec_and_test (&counter)) {
+ /* all probes blocked and no-more-pads signaled, post
+ * message on the bus. */
+ prerolled = TRUE;
+
+ gst_bus_post (bus, gst_message_new_application (
+ GST_OBJECT_CAST (pipeline),
+ gst_structure_new_empty ("ExPrerolled")));
+ }
+}
+
+/* called when a source pad of uridecodebin is blocked */
+static GstPadProbeReturn
+cb_blocked (GstPad *pad,
+ GstPadProbeInfo *info,
+ gpointer user_data)
+{
+ GstElement *pipeline = GST_ELEMENT (user_data);
+
+ if (prerolled)
+ return GST_PAD_PROBE_REMOVE;
+
+ dec_counter (pipeline);
+
+ return GST_PAD_PROBE_OK;
+}
+
+/* called when uridecodebin has a new pad */
+static void
+cb_pad_added (GstElement *element,
+ GstPad *pad,
+ gpointer user_data)
+{
+ GstElement *pipeline = GST_ELEMENT (user_data);
+
+ if (prerolled)
+ return;
+
+ g_atomic_int_inc (&counter);
+
+ gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
+ (GstPadProbeCallback) cb_blocked, pipeline, NULL);
+
+ /* try to link to the video pad */
+ gst_pad_link (pad, sinkpad);
+}
+
+/* called when uridecodebin has created all pads */
+static void
+cb_no_more_pads (GstElement *element,
+ gpointer user_data)
+{
+ GstElement *pipeline = GST_ELEMENT (user_data);
+
+ if (prerolled)
+ return;
+
+ dec_counter (pipeline);
+}
+
+/* called when a new message is posted on the bus */
+static void
+cb_message (GstBus *bus,
+ GstMessage *message,
+ gpointer user_data)
+{
+ GstElement *pipeline = GST_ELEMENT (user_data);
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR:
+ g_print ("we received an error!\n");
+ g_main_loop_quit (loop);
+ break;
+ case GST_MESSAGE_EOS:
+ g_print ("we reached EOS\n");
+ g_main_loop_quit (loop);
+ break;
+ case GST_MESSAGE_APPLICATION:
+ {
+ if (gst_message_has_name (message, "ExPrerolled")) {
+ /* it's our message */
+ g_print ("we are all prerolled, do seek\n");
+ gst_element_seek (pipeline,
+ 1.0, GST_FORMAT_TIME,
+ GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
+ GST_SEEK_TYPE_SET, 2 * GST_SECOND,
+ GST_SEEK_TYPE_SET, 5 * GST_SECOND);
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GstElement *pipeline, *src, *csp, *vs, *sink;
+
+ /* init GStreamer */
+ gst_init (&argc, &argv);
+ loop = g_main_loop_new (NULL, FALSE);
+
+ if (argc < 2) {
+ g_print ("usage: %s <uri>", argv[0]);
+ return -1;
+ }
+
+ /* build */
+ pipeline = gst_pipeline_new ("my-pipeline");
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_signal_watch (bus);
+ g_signal_connect (bus, "message", (GCallback) cb_message,
+ pipeline);
+
+ src = gst_element_factory_make ("uridecodebin", "src");
+ if (src == NULL)
+ g_error ("Could not create 'uridecodebin' element");
+
+ g_object_set (src, "uri", argv[1], NULL);
+
+ csp = gst_element_factory_make ("videoconvert", "csp");
+ if (csp == NULL)
+ g_error ("Could not create 'videoconvert' element");
+
+ vs = gst_element_factory_make ("videoscale", "vs");
+ if (csp == NULL)
+ g_error ("Could not create 'videoscale' element");
+
+ sink = gst_element_factory_make ("autovideosink", "sink");
+ if (sink == NULL)
+ g_error ("Could not create 'autovideosink' element");
+
+ gst_bin_add_many (GST_BIN (pipeline), src, csp, vs, sink, NULL);
+
+ /* can't link src yet, it has no pads */
+ gst_element_link_many (csp, vs, sink, NULL);
+
+ sinkpad = gst_element_get_static_pad (csp, "sink");
+
+ /* for each pad block that is installed, we will increment
+ * the counter. for each pad block that is signaled, we
+ * decrement the counter. When the counter is 0 we post
+ * an app message to tell the app that all pads are
+ * blocked. Start with 1 that is decremented when no-more-pads
+ * is signaled to make sure that we only post the message
+ * after no-more-pads */
+ g_atomic_int_set (&counter, 1);
+
+ g_signal_connect (src, "pad-added",
+ (GCallback) cb_pad_added, pipeline);
+ g_signal_connect (src, "no-more-pads",
+ (GCallback) cb_no_more_pads, pipeline);
+
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+
+ g_main_loop_run (loop);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ gst_object_unref (sinkpad);
+ gst_object_unref (bus);
+ gst_object_unref (pipeline);
+ g_main_loop_unref (loop);
+
+ return 0;
+}
+]]>
+<!-- example-end blockprobe.c -->
+</programlisting>
+ <para>
+ Note that we use a custom application message to signal the
+ main thread that the uridecidebin is prerolled. The main thread
+ will then issue a flushing seek to the requested region. The
+ flush will temporarily unblock the pad and reblock them when
+ new data arrives again. We detect this second block to remove
+ the probes. Then we set the pipeline to PLAYING and it should
+ play from 2 to 5 seconds, then EOS and exit the application.
+ </para>
+ </sect2>
</sect1>
<sect1 id="section-data-spoof">
Many people have expressed the wish to use their own sources to inject
data into a pipeline. Some people have also expressed the wish to grab
the output in a pipeline and take care of the actual output inside
- their application. While either of these methods are stongly
- discouraged, &GStreamer; offers hacks to do this. <emphasis>However,
- there is no support for those methods.</emphasis> If it doesn't work,
- you're on your own. Also, synchronization, thread-safety and other
- things that you've been able to take for granted so far are no longer
- guaranteed if you use any of those methods. It's always better to
- simply write a plugin and have the pipeline schedule and manage it.
+ their application. While either of these methods are strongly
+ discouraged, &GStreamer; offers support for this.
+ <emphasis>Beware! You need to know what you are doing.</emphasis> Since
+ you don't have any support from a base class you need to thoroughly
+ understand state changes and synchronization. If it doesn't work,
+ there are a million ways to shoot yourself in the foot. It's always
+ better to simply write a plugin and have the base class manage it.
See the Plugin Writer's Guide for more information on this topic. Also
see the next section, which will explain how to embed plugins statically
in your application.
</para>
- <note><para>
- <ulink type="http"
- url="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gstreamer-app.html">New
- API</ulink> was developed to make data insertion and extraction easy
- for applications. It can be found as GstAppSrc and GstAppSink in the
- <ulink type="http"
- url="http://gstreamer.freedesktop.org/modules/gst-plugins-base.html">
- gst-plugins-base</ulink> module.
- </para></note>
<para>
- After all those disclaimers, let's start. There's three possible
- elements that you can use for the above-mentioned purposes. Those are
- called <quote>fakesrc</quote> (an imaginary source),
- <quote>fakesink</quote> (an imaginary sink) and <quote>identity</quote>
- (an imaginary filter). The same method applies to each of those
- elements. Here, we will discuss how to use those elements to insert
- (using fakesrc) or grab (using fakesink or identity) data from a
+ There's two possible elements that you can use for the above-mentioned
+ purposes. Those are called <quote>appsrc</quote> (an imaginary source)
+ and <quote>appsink</quote> (an imaginary sink). The same method applies
+ to each of those elements. Here, we will discuss how to use those
+ elements to insert (using appsrc) or grab (using appsink) data from a
pipeline, and how to set negotiation.
</para>
<para>
- Those who're paying close attention will notice that the purpose
- of identity is almost identical to that of probes. Indeed, this is
- true. Probes allow for the same purpose, and a bunch more, and
- with less overhead plus dynamic removing/adding of handlers, but
- apart from those, probes and identity have the same purpose, just
- in a completely different implementation type.
+ Both appsrc and appsink provide 2 sets of API. One API uses standard
+ GObject (action) signals and properties. The same API is also
+ available as a regular C api. The C api is more performant but
+ requires you to link to the app library in order to use the elements.
</para>
- <sect2 id="section-spoof-handoff">
- <title>Inserting or grabbing data</title>
+ <sect2 id="section-spoof-appsrc">
+ <title>Inserting data with appsrc</title>
<para>
- The three before-mentioned elements (fakesrc, fakesink and identity)
- each have a <quote>handoff</quote> signal that will be called in
- the <function>_get ()</function>- (fakesrc) or <function>_chain
- ()</function>-function (identity, fakesink). In the signal handler,
- you can set (fakesrc) or get (identity, fakesink) data to/from the
- provided buffer. Note that in the case of fakesrc, you have to set
- the size of the provided buffer using the <quote>sizemax</quote>
- property. For both fakesrc and fakesink, you also have to set the
- <quote>signal-handoffs</quote> property for this method to work.
+ First we look at some examples for appsrc, which lets you insert data
+ into the pipeline from the application. Appsrc has some configuration
+ options that define how it will operate. You should decide about the
+ following configurations:
</para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Will the appsrc operate in push or pull mode. The stream-type
+ property can be used to control this. stream-type of
+ <quote>random-access</quote> will activate pull mode scheduling
+ while the other stream-types activate push mode.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The caps of the buffers that appsrc will push out. This needs to
+ be configured with the caps property. The caps must be set to a
+ fixed caps and will be used to negotiate a format downstream.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ It the appsrc operates in live mode or not. This can be configured
+ with the is-live property. When operating in live-mode it is
+ important to configure the min-latency and max-latency in appsrc.
+ The min-latency should be set to the amount of time it takes between
+ capturing a buffer and when it is pushed inside appsrc.
+ In live mode, you should timestamp the buffers with the pipeline
+ running-time when the first byte of the buffer was captured before
+ feeding them to appsrc. You can let appsrc do the timestaping with
+ the do-timestamp property (but then the min-latency must be set
+ to 0 because it timestamps based on the running-time when the buffer
+ entered appsrc).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The format of the SEGMENT event that appsrc will push. The format
+ has implications for how the running-time of the buffers will
+ be calculated so you must be sure you understand this. For
+ live sources you probably want to set the format property to
+ GST_FORMAT_TIME. For non-live source it depends on the media type
+ that you are handling. If you plan to timestamp the buffers, you
+ should probably put a GST_FORMAT_TIME format, otherwise
+ GST_FORMAT_BYTES might be appropriate.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ If appsrc operates in random-access mode, it is important to configure
+ the size property of appsrc with the number of bytes in the stream.
+ This will allow downstream elements to know the size of the media and
+ alows them to seek to the end of the stream when needed.
+ </para>
+ </listitem>
+ </itemizedlist>
<para>
- Note that your handoff function should <emphasis>not</emphasis>
- block, since this will block pipeline iteration. Also, do not try
- to use all sort of weird hacks in such functions to accomplish
- something that looks like synchronization or so; it's not the right
- way and will lead to issues elsewhere. If you're doing any of this,
- you're basically misunderstanding the &GStreamer; design.
+ The main way of handling data to appsrc is by using the function
+ <function>gst_app_src_push_buffer ()</function> or by emiting the
+ push-buffer action signal. This will put the buffer onto a queue from
+ which appsrc will read from in its streaming thread. It is important
+ to note that data transport will not happen from the thread that
+ performed the push-buffer call.
</para>
- </sect2>
-
- <sect2 id="section-spoof-format">
- <title>Forcing a format</title>
- <para>
- Sometimes, when using fakesrc as a source in your pipeline, you'll
- want to set a specific format, for example a video size and format
- or an audio bitsize and number of channels. You can do this by
- forcing a specific <classname>GstCaps</classname> on the pipeline,
- which is possible by using <emphasis>filtered caps</emphasis>. You
- can set a filtered caps on a link by using the
- <quote>capsfilter</quote> element in between the two elements, and
- specifying a <classname>GstCaps</classname> as
- <quote>caps</quote> property on this element. It will then
- only allow types matching that specified capability set for
- negotiation. See also <xref linkend="section-caps-filter"/>.
+ <para>
+ The <quote>max-bytes</quote> property controls how much data can be
+ queued in appsrc before appsrc considers the queue full. A filled
+ internal queue will always signal the <quote>enough-data</quote>
+ signal, which signals the application that it should stop pushing
+ data into appsrc. The <quote>block</quote> property will cause appsrc to
+ block the push-buffer method until free data becomes available again.
+ </para>
+ <para>
+ When the internal queue is running out of data, the
+ <quote>need-data</quote> signal is emitted, which signals the application
+ that it should start pushing more data into appsrc.
+ </para>
+ <para>
+ In addition to the <quote>need-data</quote> and <quote>enough-data</quote>
+ signals, appsrc can emit the <quote>seek-data</quote> signal when the
+ <quote>stream-mode</quote> property is set to <quote>seekable</quote>
+ or <quote>random-access</quote>. The signal argument will contain the
+ new desired position in the stream expressed in the unit set with the
+ <quote>format</quote> property. After receiving the seek-data signal,
+ the application should push-buffers from the new position.
+ </para>
+ <para>
+ When the last byte is pushed into appsrc, you must call
+ <function>gst_app_src_end_of_stream ()</function> to make it send
+ an EOS downstream.
</para>
- </sect2>
-
- <sect2 id="section-spoof-example">
- <title>Example application</title>
<para>
- This example application will generate black/white (it switches
- every second) video to an X-window output by using fakesrc as a
- source and using filtered caps to force a format. Since the depth
- of the image depends on your X-server settings, we use a colorspace
- conversion element to make sure that the output to your X server
- will have the correct bitdepth. You can also set timestamps on the
- provided buffers to override the fixed framerate.
+ These signals allow the application to operate appsrc in push and
+ pull mode as will be explained next.
</para>
- <programlisting><!-- example-begin fakesrc.c -->
-#include <string.h> /* for memset () */
-#include <gst/gst.h>
+
+ <sect3 id="section-spoof-appsrc-push">
+ <title>Using appsrc in push mode</title>
+ <para>
+ When appsrc is configured in push mode (stream-type is stream or
+ seekable), the application repeatedly calls the push-buffer method
+ with a new buffer. Optionally, the queue size in the appsrc can be
+ controlled with the enough-data and need-data signals by respectively
+ stopping/starting the push-buffer calls. The value of the
+ min-percent property defines how empty the internal appsrc queue
+ needs to be before the need-data signal will be fired. You can set
+ this to some value >0 to avoid completely draining the queue.
+ </para>
+ <para>
+ When the stream-type is set to seekable, don't forget to implement
+ a seek-data callback.
+ </para>
+ <para>
+ Use this model when implementing various network protocols or
+ hardware devices.
+ </para>
+ </sect3>
+
+ <sect3 id="section-spoof-appsrc-pull">
+ <title>Using appsrc in pull mode</title>
+ <para>
+ In the pull model, data is fed to appsrc from the need-data signal
+ handler. You should push exactly the amount of bytes requested in the
+ need-data signal. You are only allowed to push less bytes when you are
+ at the end of the stream.
+ </para>
+ <para>
+ Use this model for file access or other randomly accessable sources.
+ </para>
+ </sect3>
+
+ <sect3 id="section-spoof-appsrc-ex">
+ <title>Appsrc example</title>
+ <para>
+ This example application will generate black/white (it switches
+ every second) video to an Xv-window output by using appsrc as a
+ source with caps to force a format. We use a colorspace
+ conversion element to make sure that we feed the right format to
+ your X server. We configure a video stream with a variable framerate
+ (0/1) and we set the timestamps on the outgoing buffers in such
+ a way that we play 2 frames per second.
+ </para>
+ <para>
+ Note how we use the pull mode method of pushing new buffers into
+ appsrc although appsrc is running in push mode.
+ </para>
+ <programlisting>
+<!-- example-begin appsrc.c -->
+<![CDATA[
+#include <gst/gst.h>
+
+static GMainLoop *loop;
static void
-cb_handoff (GstElement *fakesrc,
- GstBuffer *buffer,
- GstPad *pad,
- gpointer user_data)
+cb_need_data (GstElement *appsrc,
+ guint unused_size,
+ gpointer user_data)
{
static gboolean white = FALSE;
- GstMapInfo info;
-
- gst_buffer_map (buffer, &info, GST_MAP_WRITE);
+ static GstClockTime timestamp = 0;
+ GstBuffer *buffer;
+ guint size;
+ GstFlowReturn ret;
+
+ size = 385 * 288 * 2;
+
+ buffer = gst_buffer_new_allocate (NULL, size, NULL);
/* this makes the image black/white */
- memset (info.data, white ? 0xff : 0x0, info.size);
+ gst_buffer_memset (buffer, 0, white ? 0xff : 0x0, size);
+
white = !white;
- gst_buffer_unmap (buffer, &info);
+ GST_BUFFER_PTS (buffer) = timestamp;
+ GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale_int (1, GST_SECOND, 2);
+
+ timestamp += GST_BUFFER_DURATION (buffer);
+
+ g_signal_emit_by_name (appsrc, "push-buffer", buffer, &ret);
+
+ if (ret != GST_FLOW_OK) {
+ /* something wrong, stop pushing */
+ g_main_loop_quit (loop);
+ }
}
gint
main (gint argc,
gchar *argv[])
{
- GstElement *pipeline, *fakesrc, *flt, *conv, *videosink;
- GMainLoop *loop;
+ GstElement *pipeline, *appsrc, *conv, *videosink;
/* init GStreamer */
- gst_init (&argc, &argv);
+ gst_init (&argc, &argv);
loop = g_main_loop_new (NULL, FALSE);
/* setup pipeline */
pipeline = gst_pipeline_new ("pipeline");
- fakesrc = gst_element_factory_make ("fakesrc", "source");
- flt = gst_element_factory_make ("capsfilter", "flt");
+ appsrc = gst_element_factory_make ("appsrc", "source");
conv = gst_element_factory_make ("videoconvert", "conv");
videosink = gst_element_factory_make ("xvimagesink", "videosink");
/* setup */
- g_object_set (G_OBJECT (flt), "caps",
+ g_object_set (G_OBJECT (appsrc), "caps",
gst_caps_new_simple ("video/x-raw",
"format", G_TYPE_STRING, "RGB16",
"width", G_TYPE_INT, 384,
"height", G_TYPE_INT, 288,
- "framerate", GST_TYPE_FRACTION, 1, 1,
+ "framerate", GST_TYPE_FRACTION, 0, 1,
NULL), NULL);
- gst_bin_add_many (GST_BIN (pipeline), fakesrc, flt, conv, videosink, NULL);
- gst_element_link_many (fakesrc, flt, conv, videosink, NULL);
+ gst_bin_add_many (GST_BIN (pipeline), appsrc, conv, videosink, NULL);
+ gst_element_link_many (appsrc, conv, videosink, NULL);
- /* setup fake source */
- g_object_set (G_OBJECT (fakesrc),
- "signal-handoffs", TRUE,
- "sizemax", 384 * 288 * 2,
- "sizetype", 2, NULL);
- g_signal_connect (fakesrc, "handoff", G_CALLBACK (cb_handoff), NULL);
+ /* setup appsrc */
+ g_object_set (G_OBJECT (appsrc),
+ "stream-type", 0,
+ "format", GST_FORMAT_TIME, NULL);
+ g_signal_connect (appsrc, "need-data", G_CALLBACK (cb_need_data), NULL);
/* play */
gst_element_set_state (pipeline, GST_STATE_PLAYING);
/* 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 appsrc.c -->
+ </programlisting>
+ </sect3>
+ </sect2>
+
+ <sect2 id="section-spoof-appsink">
+ <title>Grabbing data with appsink</title>
+ <para>
+ Unlike appsrc, appsink is a little easier to use. It also supports
+ a pull and push based model of getting data from the pipeline.
+ </para>
+ <para>
+ The normal way of retrieving samples from appsink is by using the
+ <function>gst_app_sink_pull_sample()</function> and
+ <function>gst_app_sink_pull_preroll()</function> methods or by using
+ the <quote>pull-sample</quote> and <quote>pull-preroll</quote>
+ signals. These methods block until a sample becomes available in the
+ sink or when the sink is shut down or reaches EOS.
+ </para>
+ <para>
+ Appsink will internally use a queue to collect buffers from the
+ streaming thread. If the application is not pulling samples fast
+ enough, this queue will consume a lot of memory over time. The
+ <quote>max-buffers</quote> property can be used to limit the queue
+ size. The <quote>drop</quote> property controls whether the
+ streaming thread blocks or if older buffers are dropped when the
+ maximum queue size is reached. Note that blocking the streaming thread
+ can negatively affect real-time performance and should be avoided.
+ </para>
+ <para>
+ If a blocking behaviour is not desirable, setting the
+ <quote>emit-signals</quote> property to TRUE will make appsink emit
+ the <quote>new-sample</quote> and <quote>new-preroll</quote> signals
+ when a sample can be pulled without blocking.
+ </para>
+ <para>
+ The <quote>caps</quote> property on appsink can be used to control
+ the formats that appsink can receive. This property can contain
+ non-fixed caps, the format of the pulled samples can be obtained by
+ getting the sample caps.
+ </para>
+ <para>
+ If one of the pull-preroll or pull-sample methods return NULL, the
+ appsink is stopped or in the EOS state. You can check for the EOS state
+ with the <quote>eos</quote> property or with the
+ <function>gst_app_sink_is_eos()</function> method.
+ </para>
+ <para>
+ The eos signal can also be used to be informed when the EOS state is
+ reached to avoid polling.
+ </para>
+ <para>
+ Consider configuring the following properties in the appsink:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ The <quote>sync</quote> property if you want to have the sink
+ base class synchronize the buffer against the pipeline clock
+ before handing you the sample.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Enable Quality-of-Service with the <quote>qos</quote> property.
+ If you are dealing with raw video frames and let the base class
+ sycnhronize on the clock, it might be a good idea to also let
+ the base class send QOS events upstream.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The caps property that contains the accepted caps. Upstream elements
+ will try to convert the format so that it matches the configured
+ caps on appsink. You must still check the
+ <classname>GstSample</classname> to get the actual caps of the
+ buffer.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <sect3 id="section-spoof-appsink-ex">
+ <title>Appsink example</title>
+ <para>
+ What follows is an example on how to capture a snapshot of a video
+ stream using appsink.
+ </para>
+ <programlisting>
+<!-- example-begin appsink.c -->
+<![CDATA[
+#include <gst/gst.h>
+#ifdef HAVE_GTK
+#include <gtk/gtk.h>
+#endif
+
+#include <stdlib.h>
+
+#define CAPS "video/x-raw,format=RGB,width=160,pixel-aspect-ratio=1/1"
+
+int
+main (int argc, char *argv[])
+{
+ GstElement *pipeline, *sink;
+ gint width, height;
+ GstSample *sample;
+ gchar *descr;
+ GError *error = NULL;
+ gint64 duration, position;
+ GstStateChangeReturn ret;
+ gboolean res;
+ GstMapInfo map;
+
+ gst_init (&argc, &argv);
+
+ if (argc != 2) {
+ g_print ("usage: %s <uri>\n Writes snapshot.png in the current directory\n",
+ argv[0]);
+ exit (-1);
+ }
+
+ /* create a new pipeline */
+ descr =
+ g_strdup_printf ("uridecodebin uri=%s ! videoconvert ! videoscale ! "
+ " appsink name=sink caps=\"" CAPS "\"", argv[1]);
+ pipeline = gst_parse_launch (descr, &error);
+
+ if (error != NULL) {
+ g_print ("could not construct pipeline: %s\n", error->message);
+ g_error_free (error);
+ exit (-1);
+ }
+
+ /* get sink */
+ sink = gst_bin_get_by_name (GST_BIN (pipeline), "sink");
+
+ /* set to PAUSED to make the first frame arrive in the sink */
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ switch (ret) {
+ case GST_STATE_CHANGE_FAILURE:
+ g_print ("failed to play the file\n");
+ exit (-1);
+ case GST_STATE_CHANGE_NO_PREROLL:
+ /* for live sources, we need to set the pipeline to PLAYING before we can
+ * receive a buffer. We don't do that yet */
+ g_print ("live sources not supported yet\n");
+ exit (-1);
+ default:
+ break;
+ }
+ /* This can block for up to 5 seconds. If your machine is really overloaded,
+ * it might time out before the pipeline prerolled and we generate an error. A
+ * better way is to run a mainloop and catch errors there. */
+ ret = gst_element_get_state (pipeline, NULL, NULL, 5 * GST_SECOND);
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ g_print ("failed to play the file\n");
+ exit (-1);
+ }
+
+ /* get the duration */
+ gst_element_query_duration (pipeline, GST_FORMAT_TIME, &duration);
+
+ if (duration != -1)
+ /* we have a duration, seek to 5% */
+ position = duration * 5 / 100;
+ else
+ /* no duration, seek to 1 second, this could EOS */
+ position = 1 * GST_SECOND;
+
+ /* seek to the a position in the file. Most files have a black first frame so
+ * by seeking to somewhere else we have a bigger chance of getting something
+ * more interesting. An optimisation would be to detect black images and then
+ * seek a little more */
+ gst_element_seek_simple (pipeline, GST_FORMAT_TIME,
+ GST_SEEK_FLAG_KEY_UNIT | GST_SEEK_FLAG_FLUSH, position);
+
+ /* get the preroll buffer from appsink, this block untils appsink really
+ * prerolls */
+ g_signal_emit_by_name (sink, "pull-preroll", &sample, NULL);
+
+ /* if we have a buffer now, convert it to a pixbuf. It's possible that we
+ * don't have a buffer because we went EOS right away or had an error. */
+ if (sample) {
+ GstBuffer *buffer;
+ GstCaps *caps;
+ GstStructure *s;
+
+ /* get the snapshot buffer format now. We set the caps on the appsink so
+ * that it can only be an rgb buffer. The only thing we have not specified
+ * on the caps is the height, which is dependant on the pixel-aspect-ratio
+ * of the source material */
+ caps = gst_sample_get_caps (sample);
+ if (!caps) {
+ g_print ("could not get snapshot format\n");
+ exit (-1);
+ }
+ s = gst_caps_get_structure (caps, 0);
+
+ /* we need to get the final caps on the buffer to get the size */
+ res = gst_structure_get_int (s, "width", &width);
+ res |= gst_structure_get_int (s, "height", &height);
+ if (!res) {
+ g_print ("could not get snapshot dimension\n");
+ exit (-1);
+ }
+
+ /* create pixmap from buffer and save, gstreamer video buffers have a stride
+ * that is rounded up to the nearest multiple of 4 */
+ buffer = gst_sample_get_buffer (sample);
+ gst_buffer_map (buffer, &map, GST_MAP_READ);
+#ifdef HAVE_GTK
+ pixbuf = gdk_pixbuf_new_from_data (map.data,
+ GDK_COLORSPACE_RGB, FALSE, 8, width, height,
+ GST_ROUND_UP_4 (width * 3), NULL, NULL);
+
+ /* save the pixbuf */
+ gdk_pixbuf_save (pixbuf, "snapshot.png", "png", &error, NULL);
+#endif
+ gst_buffer_unmap (buffer, &map);
+ } else {
+ g_print ("could not make snapshot\n");
+ }
+
+ /* cleanup and exit */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ exit (0);
}
- <!-- example-end fakesrc.c --></programlisting>
+]]>
+<!-- example-end appsink.c -->
+</programlisting>
+ </sect3>
</sect2>
</sect1>
- <sect1 id="section-data-manager">
- <title>Embedding static elements in your application</title>
+ <sect1 id="section-spoof-format">
+ <title>Forcing a format</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;.
+ Sometimes you'll want to set a specific format, for example a video
+ size and format or an audio bitsize and number of channels. You can
+ do this by forcing a specific <classname>GstCaps</classname> on
+ the pipeline, which is possible by using
+ <emphasis>filtered caps</emphasis>. You can set a filtered caps on
+ a link by using the <quote>capsfilter</quote> element in between the
+ two elements, and specifying a <classname>GstCaps</classname> as
+ <quote>caps</quote> property on this element. It will then
+ only allow types matching that specified capability set for
+ negotiation. See also <xref linkend="section-caps-filter"/>.
</para>
+
+ <sect2 id="section-dynamic-format">
+ <title>Changing format in a PLAYING pipeline</title>
+ <para>
+ It is also possible to dynamically change the format in a pipeline
+ while PLAYING. This can simply be done by changing the caps
+ property on a capsfilter. The capsfilter will send a RECONFIGURE
+ event upstream that will make the upstream element attempt to
+ renegotiate a new format and allocator. This only works if
+ the upstream element is not using fixed caps on the source pad.
+ </para>
+ <para>
+ Below is an example of how you can change the caps of a pipeline
+ while in the PLAYING state:
+ </para>
+ <programlisting>
+<!-- example-begin dynformat.c -->
+<![CDATA[
+#include <stdlib.h>
+
+#include <gst/gst.h>
+
+#define MAX_ROUND 100
+
+int
+main (int argc, char **argv)
+{
+ GstElement *pipe, *filter;
+ GstCaps *caps;
+ gint width, height;
+ gint xdir, ydir;
+ gint round;
+ GstMessage *message;
+
+ gst_init (&argc, &argv);
+
+ pipe = gst_parse_launch_full ("videotestsrc ! capsfilter name=filter ! "
+ "ximagesink", NULL, GST_PARSE_FLAG_NONE, NULL);
+ g_assert (pipe != NULL);
+
+ filter = gst_bin_get_by_name (GST_BIN (pipe), "filter");
+ g_assert (filter);
+
+ width = 320;
+ height = 240;
+ xdir = ydir = -10;
+
+ for (round = 0; round < MAX_ROUND; round++) {
+ gchar *capsstr;
+ g_print ("resize to %dx%d (%d/%d) \r", width, height, round, MAX_ROUND);
+
+ /* we prefer our fixed width and height but allow other dimensions to pass
+ * as well */
+ capsstr = g_strdup_printf ("video/x-raw, width=(int)%d, height=(int)%d",
+ width, height);
+
+ caps = gst_caps_from_string (capsstr);
+ g_free (capsstr);
+ g_object_set (filter, "caps", caps, NULL);
+ gst_caps_unref (caps);
+
+ if (round == 0)
+ gst_element_set_state (pipe, GST_STATE_PLAYING);
+
+ width += xdir;
+ if (width >= 320)
+ xdir = -10;
+ else if (width < 200)
+ xdir = 10;
+
+ height += ydir;
+ if (height >= 240)
+ ydir = -10;
+ else if (height < 150)
+ ydir = 10;
+
+ message =
+ gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_ERROR,
+ 50 * GST_MSECOND);
+ if (message) {
+ g_print ("got error \n");
+
+ gst_message_unref (message);
+ }
+ }
+ g_print ("done \n");
+
+ gst_object_unref (filter);
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_object_unref (pipe);
+
+ return 0;
+}
+]]>
+<!-- example-end dynformat.c -->
+ </programlisting>
+ <para>
+ Note how we use <function>gst_bus_poll()</function> with a
+ small timeout to get messages and also introduce a short
+ sleep.
+ </para>
+ <para>
+ It is possible to set multiple caps for the capsfilter separated
+ with a ;. The capsfilter will try to renegotiate to the first
+ possible format from the list.
+ </para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="section-dynamic-pipelines">
+ <title>Dynamically changing the pipeline</title>
<para>
- Dynamically loaded plugins contain a structure that's defined using
- <function>GST_PLUGIN_DEFINE ()</function>. This structure is loaded
- when the plugin is loaded by the &GStreamer; core. The structure
- contains an initialization function (usually called
- <function>plugin_init</function>) that will be called right after that.
- It's purpose is to register the elements provided by the plugin with
- the &GStreamer; framework. If you want to embed elements directly in
- your application, the only thing you need to do is to replace
- <function>GST_PLUGIN_DEFINE ()</function> with
- <function>GST_PLUGIN_DEFINE_STATIC ()</function>. This will cause the
- elements to be registered when your application loads, and the elements
- will from then on be available like any other element, without them
- having to be dynamically loadable libraries. In the example below, you
- would be able to call <function>gst_element_factory_make
- ("my-element-name", "some-name")</function> to create an instance of the
- element.
+ In this section we talk about some techniques for dynamically
+ modifying the pipeline. We are talking specifically about changing
+ the pipeline while it is in the PLAYING state without interrupting
+ the flow.
</para>
+ <para>
+ There are some important things to consider when building dynamic
+ pipelines:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ When removing elements from the pipeline, make sure that there
+ is no dataflow on unlinked pads because that will cause a fatal
+ pipeline error. Always block source pads (in push mode) or
+ sink pads (in pull mode) before unlinking pads.
+ See also <xref linkend="section-dynamic-changing"/>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ When adding elements to a pipeline, make sure to put the element
+ into the right state, usually the same state as the parent, before
+ allowing dataflow the element. When an element is newly created,
+ it is in the NULL state and will return an error when it
+ receives data.
+ See also <xref linkend="section-dynamic-changing"/>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ When adding elements to a pipeline, &GStreamer; will by default
+ set the clock and base-time on the element to the current values
+ of the pipeline. This means that the element will be able to
+ construct the same pipeline running-time as the other elements
+ in the pipeline. This means that sinks will synchronize buffers
+ like the other sinks in the pipeline and that sources produce
+ buffers with a running-time that matches the other sources.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ When unlinking elements from an upstream chain, always make sure
+ to flush any queued data in the element by sending an EOS event
+ down the element sink pad(s) and by waiting that the EOS leaves
+ the elements (with an event probe).
+ See also <xref linkend="section-dynamic-changing"/>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A live source will produce buffers with a running-time of the
+ current running-time in the pipeline.
+ </para>
+ <para>
+ A pipeline without a live source produces buffers with a
+ running-time starting from 0. Likewise, after a flushing seek,
+ those pipelines reset the running-time back to 0.
+ </para>
+ <para>
+ The running-time can be changed with
+ <function>gst_pad_set_offset ()</function>. It is important to
+ know the running-time of the elements in the pipeline in order
+ to maintain synchronization.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Adding elements might change the state of the pipeline. Adding a
+ non-prerolled sink, for example, brings the pipeline back to the
+ prerolling state. Removing a non-prerolled sink, for example, might
+ change the pipeline to PAUSED and PLAYING state.
+ </para>
+ <para>
+ Adding a live source cancels the preroll stage and put the pipeline
+ to the playing state. Adding a live source or other live elements
+ might also change the latency of a pipeline.
+ </para>
+ <para>
+ Adding or removing elements to the pipeline might change the clock
+ selection of the pipeline. If the newly added element provides a clock,
+ it might be worth changing the clock in the pipeline to the new
+ clock. If, on the other hand, the element that provides the clock
+ for the pipeline is removed, a new clock has to be selected.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Adding and removing elements might cause upstream or downstream
+ elements to renegotiate caps and or allocators. You don't really
+ need to do anything from the application, plugins largely
+ adapt themself to the new pipeline topology in order to optimize
+ their formats and allocation strategy.
+ </para>
+ <para>
+ What is important is that when you add, remove or change elements
+ 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>
+
+ <para>
+ &GStreamer; offers support for doing about any dynamic pipeline
+ modification but it requires you to know a bit of details before
+ you can do this without causing pipeline errors. In the following
+ sections we will demonstrate a couple of typical use-cases.
+ </para>
+
+ <sect2 id="section-dynamic-changing">
+ <title>Changing elements in a pipeline</title>
+ <para>
+ In the next example we look at the following chain of elements:
+ </para>
+ <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>
+
+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);
- <programlisting>
-/*
- * Here, you would write the actual plugin code.
- */
+ 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;
}
-GST_PLUGIN_DEFINE_STATIC (
- GST_VERSION_MAJOR,
- GST_VERSION_MINOR,
- "my-private-plugins",
- "Private elements of my application",
- register_elements,
- VERSION,
- "LGPL",
- "my-application",
- "http://www.my-application.net/"
-)
- </programlisting>
+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;
+}
+]]>
+<!-- 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>
</para>
</sect1>
- <sect1 id="section-interfaces-mixer">
- <title>The Mixer interface</title>
-
- <para>
- The mixer interface provides a uniform way to control the volume on a
- hardware (or software) mixer. The interface is primarily intended to
- be implemented by elements for audio inputs and outputs that talk
- directly to the hardware (e.g. OSS or ALSA plugins).
- </para>
- <para>
- Using this interface, it is possible to control a list of tracks
- (such as Line-in, Microphone, etc.) from a mixer element. They can
- be muted, their volume can be changed and, for input tracks, their
- record flag can be set as well.
- </para>
- <para>
- Example plugins implementing this interface include the OSS elements
- (osssrc, osssink, ossmixer) and the ALSA plugins (alsasrc, alsasink
- and alsamixer).
- </para>
- <para>
- You should not use this interface for volume control in a playback
- application. Either use a <classname>volume</classname> element or use
- <classname>playbin</classname>'s <quote>volume</quote> property, or use
- the <classname>audiosink</classname>'s <quote>volume</quote> property (if it has one).
- </para>
- <note>
- <para>
- In order for the <ulink type="http"
- url="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstmixer.html"><classname>GstMixer</classname></ulink>
- interface to be
- usable, the element implementing it needs to be in the right state,
- so that the underlying mixer device is open. This usually means the
- element needs to be at least in <classname>GST_STATE_READY</classname>
- before you can use this interface. You will get confusing warnings
- if the element is not in the right state when the interface is used.
- </para>
- </note>
- </sect1>
-
- <sect1 id="section-interfaces-tuner">
- <title>The Tuner interface</title>
-
- <para>
- The tuner interface is a uniform way to control inputs and outputs
- on a multi-input selection device. This is primarily used for input
- selection on elements for TV- and capture-cards.
- </para>
- <para>
- Using this interface, it is possible to select one track from a list
- of tracks supported by that tuner-element. The tuner will then select
- that track for media-processing internally. This can, for example, be
- used to switch inputs on a TV-card (e.g. from Composite to S-video).
- </para>
- <para>
- This interface is currently only implemented by the Video4linux and
- Video4linux2 elements.
- </para>
- <note>
- <para>
- In order for the <ulink type="http"
- url="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gsttuner.html"><classname>GstTuner</classname></ulink>
- interface to be
- usable, the element implementing it needs to be in the right state,
- so that the underlying device is open. This usually means the
- element needs to be at least in <classname>GST_STATE_READY</classname>
- before you can use this interface. You will get confusing warnings
- if the element is not in the right state when the interface is used.
- </para>
- </note>
- </sect1>
-
<sect1 id="section-interfaces-colorbalance">
<title>The Color Balance interface</title>
</para>
<para>
The colorbalance interface is implemented by several plugins, including
- xvimagesink and the Video4linux and Video4linux2 elements.
- </para>
- </sect1>
-
- <sect1 id="section-interfaces-proprobe">
- <title>The Property Probe interface</title>
-
- <para>
- The property probe is a way to autodetect allowed values for a
- <classname>GObject</classname> property. It's primary use is to autodetect
- devices in several elements. For example, the OSS elements use this
- interface to detect all OSS devices on a system. Applications can then
- <quote>probe</quote> this property and get a list of detected devices.
- </para>
- <note>
- <para>
- Given the overlap between HAL and the practical implementations of this
- interface, this might in time be deprecated in favour of HAL.
- </para>
- </note>
- <para>
- This interface is currently implemented by many elements, including
- the ALSA, OSS, XVideo, Video4linux and Video4linux2 elements.
+ xvimagesink and the Video4linux2 elements.
</para>
</sect1>
- <sect1 id="section-interfaces-xoverlay">
- <title>The X Overlay interface</title>
+ <sect1 id="section-interfaces-videooverlay">
+ <title>The Video Overlay interface</title>
<para>
- The X Overlay interface was created to solve the problem of embedding
+ The Video Overlay interface was created to solve the problem of embedding
video streams in an application window. The application provides an
- X-window to the element implementing this interface to draw on, and
- the element will then use this X-window to draw on rather than creating
+ window handle to the element implementing this interface to draw on, and
+ the element will then use this window handle to draw on rather than creating
a new toplevel window. This is useful to embed video in video players.
</para>
<para>
- This interface is implemented by, amongst others, the Video4linux and
- Video4linux2 elements and by ximagesink, xvimagesink and sdlvideosink.
+ This interface is implemented by, amongst others, the Video4linux2
+ elements and by ximagesink, xvimagesink and sdlvideosink.
</para>
</sect1>
</chapter>
</para>
<programlisting>
/* compile with:
- * gcc -o tags tags.c `pkg-config --cflags --libs gstreamer-0.10` */
+ * gcc -o tags tags.c `pkg-config --cflags --libs gstreamer-1.0` */
#include <gst/gst.h>
static void
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, ¶m)) != 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
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>
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>
</para>
</sect1>
- <sect1 id="section-threads-scheduling">
- <title>Scheduling in &GStreamer;</title>
-
- <para>
- Scheduling of pipelines in &GStreamer; is done by using a thread for
- each <quote>group</quote>, where a group is a set of elements separated
- by <quote>queue</quote> elements. Within such a group, scheduling is
- either push-based or pull-based, depending on which mode is supported
- by the particular element. If elements support random access to data,
- such as file sources, then elements downstream in the pipeline become
- the entry point of this group (i.e. the element controlling the
- scheduling of other elements). The entry point pulls data from upstream
- and pushes data downstream, thereby calling data handling functions on
- either type of element.
- </para>
- <para>
- In practice, most elements in &GStreamer;, such as decoders, encoders,
- etc. only support push-based scheduling, which means that in practice,
- &GStreamer; uses a push-based scheduling model.
- </para>
- </sect1>
</chapter>
For example, <option>--gst-debug=oggdemux:5</option> would turn
on debugging for the Ogg demuxer element. You can use wildcards as
well. A debugging level of 0 will turn off all debugging, and a level
- of 5 will turn on all debugging. Intermediate values only turn on
+ of 9 will turn on all debugging. Intermediate values only turn on
some debugging (based on message severity; 2, for example, will only
display errors and warnings). Here's a list of all available options:
</para>
</para>
</sect2>
- <sect2 id="section-applications-gst-editor">
- <title>GstEditor</title>
- <para>
- GstEditor is a set of widgets to display a graphical representation of a
- pipeline.
- </para>
- </sect2>
-
</sect1>
</chapter>
--- /dev/null
+<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>
<para>
For audio input and output, &GStreamer; provides input and
output elements for several audio subsystems. Amongst others,
- &GStreamer; includes elements for ALSA (alsasrc, alsamixer,
- alsasink), OSS (osssrc, ossmixer, osssink) and Sun audio
- (sunaudiosrc, sunaudiomixer, sunaudiosink).
+ &GStreamer; includes elements for ALSA (alsasrc,
+ alsasink), OSS (osssrc, osssink) Pulesaudio (pulsesrc, pulsesink)
+ and Sun audio (sunaudiosrc, sunaudiomixer, sunaudiosink).
</para>
</listitem>
<listitem>
<para>
For video input, &GStreamer; contains source elements for
- Video4linux (v4lsrc, v4lmjpegsrc, v4lelement and v4lmjpegisnk)
- and Video4linux2 (v4l2src, v4l2element).
+ Video4linux2 (v4l2src, v4l2element, v4l2sink).
</para>
</listitem>
<listitem>
<warning>
<para>
-Note: this section is out of date. GStreamer-0.10 has much better
+Note: this section is out of date. GStreamer-1.0 has much better
support for win32 than previous versions though and should usually compile
and work out-of-the-box both using MSYS/MinGW or Microsoft compilers. The
<ulink url="http://gstreamer.freedesktop.org">GStreamer web site</ulink> and the
<listitem><para>libiconv</para></listitem>
</itemizedlist>
-<para>Work is being done to provide pre-compiled GStreamer-0.10 libraries as
+<para>Work is being done to provide pre-compiled GStreamer-1.0 libraries as
a packages for win32. Check the <ulink url="http://gstreamer.freedesktop.org">
GStreamer web site</ulink> and check our
<ulink url="http://news.gmane.org/gmane.comp.video.gstreamer.devel">mailing list
<sect2 id="section-win32-install">
<title>Installation on the system</title>
-<para>FIXME: This section needs be updated for GStreamer-0.10.</para>
+<para>FIXME: This section needs be updated for GStreamer-1.0.</para>
<!--
<para>By default, GStreamer needs a registry. You have to generate it using "gst-register.exe". It will create
</itemizedlist>
</sect1>
</chapter>
+<chapter id="chapter-porting-1.0">
+ <title>Porting 0.10 applications to 1.0</title>
+ <para>
+ This section of the appendix will discuss shortly what changes to
+ applications will be needed to quickly and conveniently port most
+ applications from &GStreamer;-0.10 to &GStreamer;-1.0, with references
+ to the relevant sections in this Application Development Manual
+ where needed. With this list, it should be possible to port simple
+ applications to &GStreamer;-1.0 in less than a day.
+ </para>
+
+ <sect1 id="section-porting-objects-1.0">
+ <title>List of changes</title>
+ <itemizedlist>
+ <listitem>
+ <para>
+ All deprecated methods were removed. Recompile against 0.10 with
+ DISABLE_DEPRECATED and fix issues before attempting to port to 1.0.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ "playbin2" has been renamed to "playbin", with similar API
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ "decodebin2" has been renamed to "decodebin", with similar API. Note
+ that there is no longer a "new-decoded-pad" signal, just use GstElement's
+ "pad-added" signal instead (but don't forget to remove the 'gboolean last'
+ argument from your old signal callback functino signature).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ the names of some "formatted" pad templates has been changed from e.g.
+ "src%d" to "src%u" or "src_%u" or similar, since we don't want to see
+ negative numbers in pad names. This mostly affects applications that
+ create request pads from elements.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ some elements that used to have a single dynamic source pad have a
+ source pad now. Example: wavparse, id3demux, iceydemux, apedemux.
+ (This does not affect applications using decodebin or playbin).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ playbin now proxies the GstVideoOverlay (former GstXOverlay) interface,
+ so most applications can just remove the sync bus handler where they
+ would set the window ID, and instead just set the window ID on playbin
+ from the application thread before starting playback.
+ </para>
+ <para>
+ playbin also proxies the GstColorBalance and GstNavigation interfaces,
+ so applications that use this don't need to go fishing for elements
+ that may implement those any more, but can just use them unconditionally.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ multifdsink, tcpclientsink, tcpclientsrc, tcpserversrc the protocol property
+ is removed, use gdppay and gdpdepay.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ XML serialization was removed.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Probes and pad blocking was merged into new pad probes.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Position, duration and convert functions no longer use an inout parameter
+ for the destination format.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Video and audio caps were simplified. audio/x-raw-int and audio/x-raw-float
+ are now all under the audio/x-raw media type. Similarly, video/x-raw-rgb
+ and video/x-raw-yuv are now video/x-raw.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ ffmpegcolorspace was removed and replaced with videoconvert.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ GstMixerInterface / GstTunerInterface were removed without replacement.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The GstXOverlay interface was renamed to GstVideoOverlay, and now part
+ of the video library in gst-plugins-base, as the interfaces library
+ no longer exists.
+ </para>
+ <para>
+ The name of the GstXOverlay "prepare-xwindow-id" message has changed
+ to "prepare-window-handle" (and GstXOverlay has been renamed to
+ GstVideoOverlay). Code that checks for the string directly should be
+ changed to use gst_is_video_overlay_prepare_window_handle_message(message)
+ instead.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The GstPropertyProbe interface was removed. the is no replacement yet,
+ but a more featureful replacement for device discovery and feature
+ querying is planned, see https://bugzilla.gnome.org/show_bug.cgi?id=678402
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ gst_uri_handler_get_uri() and the get_uri vfunc now return a copy of
+ the URI string
+ </para>
+ <para>
+ gst_uri_handler_set_uri() and the set_uri vfunc now take an additional
+ GError argument so the handler can notify the caller why it didn't
+ accept a particular URI.
+ </para>
+ <para>
+ gst_uri_handler_set_uri() now checks if the protocol of the URI passed
+ is one of the protocols advertised by the uri handler, so set_uri vfunc
+ implementations no longer need to check that as well.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ GstTagList is now an opaque mini object instead of being typedefed to a
+ GstStructure. While it was previously okay (and in some cases required because of
+ missing taglist API) to cast a GstTagList to a GstStructure or use
+ gst_structure_* API on taglists, you can no longer do that. Doing so will
+ cause crashes.
+ </para>
+ <para>
+ Also, tag lists are refcounted now, and can therefore not be freely
+ modified any longer. Make sure to call gst_tag_list_make_writable (taglist)
+ before adding, removing or changing tags in the taglist.
+ </para>
+ <para>
+ GST_TAG_IMAGE, GST_TAG_PREVIEW_IMAGE, GST_TAG_ATTACHMENT: many tags that
+ used to be of type GstBuffer are now of type GstSample (which is basically
+ a struct containing a buffer alongside caps and some other info).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ GstController has now been merged into GstObject. It does not exists as an
+ individual object anymore. In addition core contains a GstControlSource base
+ class and the GstControlBinding. The actual control sources are in the controller
+ library as before. The 2nd big change is that control sources generate
+ a sequence of gdouble values and those are mapped to the property type and
+ value range by GstControlBindings.
+ </para>
+ <para>
+ The whole gst_controller_* API is gone and now available in simplified form
+ under gst_object_*. ControlSources are now attached via GstControlBinding
+ to properties. There are no GValue arguments used anymore when programming
+ control sources.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+</chapter>
GError *err = NULL; /* error to show to users */
gchar *dbg = NULL; /* additional debug string for developers */
- gst_message_parse_error (msg, &err, &dbg);
+ gst_message_parse_error (msg, &err, &dbg);
if (err) {
g_printerr ("ERROR: %s\n", err->message);
g_error_free (err);
</para>
<screen>
+<![CDATA[
Factory Details:
- Long name: Audio Sink (OSS)
- Class: Sink/Audio
- Description: Output to a sound card via OSS
- Version: 0.3.3.1
- Author(s): Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim.taymans@chello.be>
- Copyright: (C) 1999
+ Rank: secondary (128)
+ Long-name: Audio Sink (OSS)
+ Klass: Sink/Audio
+ Description: Output to a sound card via OSS
+ Author: Erik Walthinsen <omega@cse.ogi.edu>, Wim Taymans <wim.taymans@chello.be>
+
+Plugin Details:
+ Name: ossaudio
+ Description: OSS (Open Sound System) support for GStreamer
+ Filename: /home/wim/gst/head/gst-plugins-good/sys/oss/.libs/libgstossaudio.so
+ Version: 1.0.0.1
+ License: LGPL
+ Source module: gst-plugins-good
+ Source release date: 2012-09-25 12:52 (UTC)
+ Binary package: GStreamer Good Plug-ins git
+ Origin URL: Unknown package origin
GObject
- +----GstObject
- +----GstElement
- +----GstOssSink
+ +----GInitiallyUnowned
+ +----GstObject
+ +----GstElement
+ +----GstBaseSink
+ +----GstAudioBaseSink
+ +----GstAudioSink
+ +----GstOssSink
Pad Templates:
SINK template: 'sink'
Availability: Always
Capabilities:
- 'osssink_sink':
- MIME type: 'audio/raw':
- format: String: int
- endianness: Integer: 1234
- width: List:
- Integer: 8
- Integer: 16
- depth: List:
- Integer: 8
- Integer: 16
- channels: Integer range: 1 - 2
- law: Integer: 0
- signed: List:
- Boolean: FALSE
- Boolean: TRUE
- rate: Integer range: 1000 - 48000
+ audio/x-raw
+ format: { S16LE, U16LE, S8, U8 }
+ layout: interleaved
+ rate: [ 1, 2147483647 ]
+ channels: 1
+ audio/x-raw
+ format: { S16LE, U16LE, S8, U8 }
+ layout: interleaved
+ rate: [ 1, 2147483647 ]
+ channels: 2
+ channel-mask: 0x0000000000000003
Element Flags:
- GST_ELEMENT_THREADSUGGESTED
+ no flags set
Element Implementation:
- No loopfunc(), must be chain-based or not configured yet
- Has change_state() function: gst_osssink_change_state
- Has custom save_thyself() function: gst_element_save_thyself
- Has custom restore_thyself() function: gst_element_restore_thyself
+ Has change_state() function: gst_audio_base_sink_change_state
Clocking Interaction:
- element requires a clock
- element provides a clock: GstOssClock
+ element is supposed to provide a clock but returned NULL
+
+Element has no indexing capabilities.
+Element has no URI handling capabilities.
Pads:
SINK: 'sink'
Implementation:
- Has chainfunc(): 0x40056fc0
+ Has chainfunc(): gst_base_sink_chain
+ Has custom eventfunc(): gst_base_sink_event
+ Has custom queryfunc(): gst_base_sink_sink_query
+ Has custom iterintlinkfunc(): gst_pad_iterate_internal_links_default
Pad Template: 'sink'
-Element Arguments:
- name : String (Default "element")
- device : String (Default "/dev/dsp")
- mute : Boolean (Default false)
- format : Integer (Default 16)
- channels : Enum "GstAudiosinkChannels" (default 1)
- (0): Silence
- (1): Mono
- (2): Stereo
- frequency : Integer (Default 11025)
- fragment : Integer (Default 6)
- buffer-size : Integer (Default 4096)
-
-Element Signals:
- "handoff" : void user_function (GstOssSink* object,
- gpointer user_data);
+Element Properties:
+ name : The name of the object
+ flags: readable, writable
+ String. Default: "osssink0"
+ parent : The parent of the object
+ flags: readable, writable
+ Object of type "GstObject"
+ sync : Sync on the clock
+ flags: readable, writable
+ Boolean. Default: true
+ max-lateness : Maximum number of nanoseconds that a buffer can be late before it is dropped (-1 unlimited)
+ flags: readable, writable
+ Integer64. Range: -1 - 9223372036854775807 Default: -1
+ qos : Generate Quality-of-Service events upstream
+ flags: readable, writable
+ Boolean. Default: false
+ async : Go asynchronously to PAUSED
+ flags: readable, writable
+ Boolean. Default: true
+ ts-offset : Timestamp offset in nanoseconds
+ flags: readable, writable
+ Integer64. Range: -9223372036854775808 - 9223372036854775807 Default: 0
+ enable-last-sample : Enable the last-sample property
+ flags: readable, writable
+ Boolean. Default: false
+ last-sample : The last sample received in the sink
+ flags: readable
+ Boxed pointer of type "GstSample"
+ blocksize : Size in bytes to pull per buffer (0 = default)
+ flags: readable, writable
+ Unsigned Integer. Range: 0 - 4294967295 Default: 4096
+ render-delay : Additional render delay of the sink in nanoseconds
+ flags: readable, writable
+ Unsigned Integer64. Range: 0 - 18446744073709551615 Default: 0
+ throttle-time : The time to keep between rendered buffers
+ flags: readable, writable
+ Unsigned Integer64. Range: 0 - 18446744073709551615 Default: 0
+ buffer-time : Size of audio buffer in microseconds, this is the minimum latency that the sink reports
+ flags: readable, writable
+ Integer64. Range: 1 - 9223372036854775807 Default: 200000
+ latency-time : The minimum amount of data to write in each iteration in microseconds
+ flags: readable, writable
+ Integer64. Range: 1 - 9223372036854775807 Default: 10000
+ provide-clock : Provide a clock to be used as the global pipeline clock
+ flags: readable, writable
+ Boolean. Default: true
+ slave-method : Algorithm to use to match the rate of the masterclock
+ flags: readable, writable
+ Enum "GstAudioBaseSinkSlaveMethod" Default: 1, "skew"
+ (0): resample - GST_AUDIO_BASE_SINK_SLAVE_RESAMPLE
+ (1): skew - GST_AUDIO_BASE_SINK_SLAVE_SKEW
+ (2): none - GST_AUDIO_BASE_SINK_SLAVE_NONE
+ can-activate-pull : Allow pull-based scheduling
+ flags: readable, writable
+ Boolean. Default: false
+ alignment-threshold : Timestamp alignment threshold in nanoseconds
+ flags: readable, writable
+ Unsigned Integer64. Range: 1 - 18446744073709551614 Default: 40000000
+ drift-tolerance : Tolerance for clock drift in microseconds
+ flags: readable, writable
+ Integer64. Range: 1 - 9223372036854775807 Default: 40000
+ discont-wait : Window of time in nanoseconds to wait before creating a discontinuity
+ flags: readable, writable
+ Unsigned Integer64. Range: 0 - 18446744073709551614 Default: 1000000000
+ device : OSS device (usually /dev/dspN)
+ flags: readable, writable
+ String. Default: "/dev/dsp"
+]]>
</screen>
<para>
</para>
<para>
The bin will also manage the elements contained in it. It will
- figure out how the data will flow in the bin and generate an
- optimal plan for that data flow. Plan generation is one of the
- most complicated procedures in &GStreamer;. You will learn more
- about this process, called scheduling, in <xref
- linkend="section-threads-scheduling"/>.
+ perform state changes on the elements as well as collect and
+ forward bus messages.
</para>
<figure float="1" id="section-bin-img">
<itemizedlist>
<listitem>
<para>
- A pipeline: a generic container that allows scheduling of the
- containing elements. The toplevel bin has to be a pipeline,
- every application thus needs at least one of these. Pipelines will
- automatically run themselves in a background thread when started.
+ A pipeline: a generic container that manages the synchronization
+ and bus messages of the contained elements. The toplevel bin has
+ to be a pipeline, every application thus needs at least one of
+ these.
</para>
</listitem>
</itemizedlist>
</programlisting>
<para>
(This is a silly example of course, there already exists a much more
- powerful and versatile custom bin like this: the playbin2 element.)
+ powerful and versatile custom bin like this: the playbin element.)
</para>
<para>
- Custom bins can be created with a plugin or an XML description. You
+ Custom bins can be created with a plugin or from the application. You
will find more information about creating custom bin in the <ulink
type="http"
url="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/index.html">Plugin
Writers Guide</ulink>.
</para>
<para>
- Examples of such custom bins are the playbin2 and uridecodebin elements from<ulink
+ Examples of such custom bins are the playbin and uridecodebin elements from<ulink
type="http"
url="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-plugins/html/index.html">
gst-plugins-base</ulink>.
to this state. This means it's usually only necessary to set the state
of the top-level pipeline to start up the pipeline or shut it down.
</para>
+ <para>
+ 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
<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.
{
GstElement *pipeline;
GstBus *bus;
+ guint bus_watch_id;
/* init */
gst_init (&argc, &argv);
* GLib main loop is attached to below
*/
bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
- gst_bus_add_watch (bus, my_bus_callback, NULL);
+ bus_watch_id = gst_bus_add_watch (bus, my_bus_callback, NULL);
gst_object_unref (bus);
<!-- example-end bus.c a -->
[..]<!-- example-begin bus.c b -->
/* clean up */
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
+ g_source_remove (bus_watch_id);
g_main_loop_unref (loop);
return 0;
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>
<itemizedlist>
<listitem>
<para>
- A pointer to a piece of memory.
- </para>
- </listitem>
- <listitem>
- <para>
- The size of the memory.
+ Pointers to memory objects. Memory objects encapsulate a region
+ in the memory.
</para>
</listitem>
<listitem>
The Glib Object system</ulink>.
</para>
<para>
- A <ulink type="http" url="&URLAPI;GstElementFactory.html">
+ A <ulink type="http" url="&URLAPI;GstElement.html">
<classname>GstElement</classname></ulink> also provides various
<classname>GObject</classname> signals that can be used as a flexible
callback mechanism. Here, too, you can use <command>gst-inspect</command>
<title>More about element factories</title>
<para>
In the previous section, we briefly introduced the <ulink type="http"
- url="&URLAPI;GstElement.html"><classname>GstElementFactory</classname></ulink>
+ url="&URLAPI;GstElementFactory.html"><classname>GstElementFactory</classname></ulink>
object already as a way to create instances of an element. Element
factories, however, are much more than just that. Element factories
are the basic types retrieved from the &GStreamer; registry, they
describe all plugins and elements that &GStreamer; can create. This
means that element factories are useful for automated element
instancing, such as what autopluggers do, and for creating lists
- of available elements, such as what pipeline editing applications
- (e.g. <ulink type="http"
- url="http://gstreamer.freedesktop.org/modules/gst-editor.html">&GStreamer;
- Editor</ulink>) do.
+ of available elements.
</para>
<sect2 id="section-elements-factories-details">
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>.
</para>
<para>
The last thing left to do is to add all elements into a container
- element, a <classname>GstPipeline</classname>, and iterate this
- pipeline until we've played the whole song. We've previously
+ element, a <classname>GstPipeline</classname>, and wait until
+ we've played the whole song. We've previously
learned how to add elements to a container bin in <xref
linkend="chapter-bins"/>, and we've learned about element states
in <xref linkend="section-elements-states"/>. We will also attach
GstElement *pipeline, *source, *demuxer, *decoder, *conv, *sink;
GstBus *bus;
+ guint bus_watch_id;
/* Initialisation */
gst_init (&argc, &argv);
/* we add a message handler */
bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
- gst_bus_add_watch (bus, bus_call, loop);
+ bus_watch_id = gst_bus_add_watch (bus, bus_call, loop);
gst_object_unref (bus);
/* we add all elements into the pipeline */
g_print ("Deleting pipeline\n");
gst_object_unref (GST_OBJECT (pipeline));
+ g_source_remove (bus_watch_id);
+ g_main_loop_unref (loop);
return 0;
}
<!-- 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
<command>gst-inspect vorbisdec</command>. You will see two pads:
a source and a sink pad. Both of these pads are always available,
and both have capabilities attached to them. The sink pad will
- accept vorbis-encoded audio data, with the mime-type
+ accept vorbis-encoded audio data, with the media type
<quote>audio/x-vorbis</quote>. The source pad will be used
to send raw (decoded) audio samples to the next element, with
- a raw audio mime-type (in this case,
+ a raw audio media type (in this case,
<quote>audio/x-raw</quote>). The source pad will also
contain properties for the audio samplerate and the amount of
channels, plus some more that you don't need to worry about
+++ /dev/null
-<chapter id="chapter-components">
- <title>Components</title>
-
- <para>
- &GStreamer; includes several higher-level components to simplify an
- application developer's life. All of the components discussed here (for now) are
- targetted at media playback. The idea of each of these components is
- to integrate as closely as possible with a &GStreamer; pipeline, but
- to hide the complexity of media type detection and several other
- rather complex topics that have been discussed in <xref
- linkend="part-advanced"/>.
- </para>
-
- <para>
- We currently recommend people to use either playbin (see <xref
- linkend="section-components-playbin"/>) or decodebin (see <xref
- linkend="section-components-decodebin"/>), depending on their needs.
- Playbin is the recommended solution for everything related to simple
- playback of media that should just work. Decodebin is a more flexible
- autoplugger that could be used to add more advanced features, such
- as playlist support, crossfading of audio tracks and so on. Its
- programming interface is more low-level than that of playbin, though.
- </para>
-
- <sect1 id="section-components-playbin">
- <title>Playbin</title>
-
- <para>
- Playbin is an element that can be created using the standard &GStreamer;
- API (e.g. <function>gst_element_factory_make ()</function>). The factory
- is conveniently called <quote>playbin</quote>. By being a
- <classname>GstPipeline</classname> (and thus a
- <classname>GstElement</classname>), playbin automatically supports all
- of the features of this class, including error handling, tag support,
- state handling, getting stream positions, seeking, and so on.
- </para>
-
- <para>
- Setting up a playbin pipeline is as simple as creating an instance of
- the playbin element, setting a file location using the
- <quote>uri</quote> property on playbin, and then setting the element
- to the <classname>GST_STATE_PLAYING</classname> state (the location has to be a valid
- URI, so <quote><protocol>://<location></quote>, e.g.
- file:///tmp/my.ogg or http://www.example.org/stream.ogg). Internally,
- playbin will set up a pipeline to playback the media location.
- </para>
-
- <programlisting><!-- example-begin playbin.c a -->
-#include <gst/gst.h>
-<!-- example-end playbin.c a -->
-[.. my_bus_callback goes here ..]<!-- example-begin playbin.c b --><!--
-static gboolean
-my_bus_callback (GstBus *bus,
- GstMessage *message,
- gpointer data)
-{
- GMainLoop *loop = data;
-
- switch (GST_MESSAGE_TYPE (message)) {
- case GST_MESSAGE_ERROR: {
- GError *err;
- gchar *debug;
-
- gst_message_parse_error (message, &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;
-}
---><!-- example-end playbin.c b -->
-<!-- example-begin playbin.c c -->
-gint
-main (gint argc,
- gchar *argv[])
-{
- GMainLoop *loop;
- GstElement *play;
- GstBus *bus;
-
- /* init GStreamer */
- gst_init (&argc, &argv);
- loop = g_main_loop_new (NULL, FALSE);
-
- /* make sure we have a URI */
- if (argc != 2) {
- g_print ("Usage: %s <URI>\n", argv[0]);
- return -1;
- }
-
- /* set up */
- play = gst_element_factory_make ("playbin", "play");
- g_object_set (G_OBJECT (play), "uri", argv[1], NULL);
-
- bus = gst_pipeline_get_bus (GST_PIPELINE (play));
- gst_bus_add_watch (bus, my_bus_callback, loop);
- gst_object_unref (bus);
-
- gst_element_set_state (play, GST_STATE_PLAYING);
-
- /* now run */
- g_main_loop_run (loop);
-
- /* also clean up */
- gst_element_set_state (play, GST_STATE_NULL);
- gst_object_unref (GST_OBJECT (play));
-
- return 0;
-}
- <!-- example-end playbin.c c --></programlisting>
-
- <para>
- Playbin has several features that have been discussed previously:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- Settable video and audio output (using the <quote>video-sink</quote>
- and <quote>audio-sink</quote> properties).
- </para>
- </listitem>
- <listitem>
- <para>
- Mostly controllable and trackable as a
- <classname>GstElement</classname>, including error handling, eos
- handling, tag handling, state handling (through the
- <classname>GstBus</classname>), media position handling and
- seeking.
- </para>
- </listitem>
- <listitem>
- <para>
- Buffers network-sources, with buffer fullness notifications being
- passed through the <classname>GstBus</classname>.
- </para>
- </listitem>
- <listitem>
- <para>
- Supports visualizations for audio-only media.
- </para>
- </listitem>
- <listitem>
- <para>
- Supports subtitles, both in the media as well as from separate
- files. For separate subtitle files, use the <quote>suburi</quote>
- property.
- </para>
- </listitem>
- <listitem>
- <para>
- Supports stream selection and disabling. If your media has
- multiple audio or subtitle tracks, you can dynamically choose
- which one to play back, or decide to turn it off altogether
- (which is especially useful to turn off subtitles). For each
- of those, use the <quote>current-text</quote> and other related
- properties.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- For convenience, it is possible to test <quote>playbin</quote> on
- the commandline, using the command <quote>gst-launch-0.10 playbin
- uri=file:///path/to/file</quote>.
- </para>
- <para>
- New applications should use playbin2 instead of the old playbin.
- </para>
- </sect1>
-
- <sect1 id="section-components-decodebin">
- <title>Decodebin</title>
-
- <para>
- Decodebin is the actual autoplugger backend of playbin, which was
- discussed in the previous section. Decodebin will, in short, accept
- input from a source that is linked to its sinkpad and will try to
- detect the media type contained in the stream, and set up decoder
- routines for each of those. It will automatically select decoders.
- For each decoded stream, it will emit the <quote>new-decoded-pad</quote>
- signal, to let the client know about the newly found decoded stream.
- For unknown streams (which might be the whole stream), it will emit
- the <quote>unknown-type</quote> signal. The application is then
- responsible for reporting the error to the user.
- </para>
- <programlisting><!-- example-begin decodebin.c a -->
-#include <gst/gst.h>
-<!-- example-end decodebin.c a -->
-[.. my_bus_callback goes here ..]<!-- example-begin decodebin.c b --><!--
-static gboolean
-my_bus_callback (GstBus *bus,
- GstMessage *message,
- gpointer data)
-{
- GMainLoop *loop = data;
-
- switch (GST_MESSAGE_TYPE (message)) {
- case GST_MESSAGE_ERROR: {
- GError *err;
- gchar *debug;
-
- gst_message_parse_error (message, &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;
-}
---><!-- example-end decodebin.c b -->
-<!-- example-begin decodebin.c c -->
-GstElement *pipeline, *audio;
-
-static void
-cb_newpad (GstElement *decodebin,
- GstPad *pad,
- gboolean last,
- gpointer data)
-{
- GstCaps *caps;
- GstStructure *str;
- GstPad *audiopad;
-
- /* only link once */
- audiopad = gst_element_get_static_pad (audio, "sink");
- if (GST_PAD_IS_LINKED (audiopad)) {
- g_object_unref (audiopad);
- return;
- }
-
- /* check media type */
- caps = gst_pad_query_caps (pad, NULL);
- str = gst_caps_get_structure (caps, 0);
- if (!g_strrstr (gst_structure_get_name (str), "audio")) {
- gst_caps_unref (caps);
- gst_object_unref (audiopad);
- return;
- }
- gst_caps_unref (caps);
-
- /* link'n'play */
- gst_pad_link (pad, audiopad);
-
- g_object_unref (audiopad);
-}
-
-gint
-main (gint argc,
- gchar *argv[])
-{
- GMainLoop *loop;
- GstElement *src, *dec, *conv, *sink;
- GstPad *audiopad;
- GstBus *bus;
-
- /* init GStreamer */
- gst_init (&argc, &argv);
- loop = g_main_loop_new (NULL, FALSE);
-
- /* make sure we have input */
- if (argc != 2) {
- g_print ("Usage: %s <filename>\n", argv[0]);
- return -1;
- }
-
- /* setup */
- pipeline = gst_pipeline_new ("pipeline");
-
- bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
- gst_bus_add_watch (bus, my_bus_callback, loop);
- gst_object_unref (bus);
-
- src = gst_element_factory_make ("filesrc", "source");
- g_object_set (G_OBJECT (src), "location", argv[1], NULL);
- dec = gst_element_factory_make ("decodebin", "decoder");
- g_signal_connect (dec, "new-decoded-pad", G_CALLBACK (cb_newpad), NULL);
- gst_bin_add_many (GST_BIN (pipeline), src, dec, NULL);
- gst_element_link (src, dec);
-
- /* create audio output */
- audio = gst_bin_new ("audiobin");
- conv = gst_element_factory_make ("audioconvert", "aconv");
- audiopad = gst_element_get_static_pad (conv, "sink");
- sink = gst_element_factory_make ("alsasink", "sink");
- gst_bin_add_many (GST_BIN (audio), conv, sink, NULL);
- gst_element_link (conv, sink);
- gst_element_add_pad (audio,
- gst_ghost_pad_new ("sink", audiopad));
- gst_object_unref (audiopad);
- gst_bin_add (GST_BIN (pipeline), audio);
-
- /* run */
- gst_element_set_state (pipeline, GST_STATE_PLAYING);
- g_main_loop_run (loop);
-
- /* cleanup */
- gst_element_set_state (pipeline, GST_STATE_NULL);
- gst_object_unref (GST_OBJECT (pipeline));
-
- return 0;
-}
- <!-- example-end decodebin.c c --></programlisting>
-
- <para>
- Decodebin, similar to playbin, supports the following features:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- Can decode an unlimited number of contained streams to decoded
- output pads.
- </para>
- </listitem>
- <listitem>
- <para>
- Is handled as a <classname>GstElement</classname> in all ways,
- including tag or error forwarding and state handling.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Although decodebin is a good autoplugger, there's a whole lot of
- things that it does not do and is not intended to do:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- Taking care of input streams with a known media type (e.g. a DVD,
- an audio-CD or such).
- </para>
- </listitem>
- <listitem>
- <para>
- Selection of streams (e.g. which audio track to play in case of
- multi-language media streams).
- </para>
- </listitem>
- <listitem>
- <para>
- Overlaying subtitles over a decoded video stream.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Decodebin can be easily tested on the commandline, e.g. by using the
- command <command>gst-launch-0.10 filesrc location=file.ogg ! decodebin
- ! audioconvert ! audioresample ! autoaudiosink</command>.
- </para>
- <para>
- New applications should use decodebin2 instead of the old decodebin.
- </para>
- <para>
- The uridecodebin element is very similar to decodebin2, only that it
- automatically plugs a source plugin based on the protocol of the URI
- given.
- </para>
- </sect1>
-
-</chapter>
--- /dev/null
+<chapter id="chapter-playback-components">
+ <title>Playback Components</title>
+
+ <para>
+ &GStreamer; includes several higher-level components to simplify an
+ application developer's life. All of the components discussed here (for now) are
+ targetted at media playback. The idea of each of these components is
+ to integrate as closely as possible with a &GStreamer; pipeline, but
+ to hide the complexity of media type detection and several other
+ rather complex topics that have been discussed in <xref
+ linkend="part-advanced"/>.
+ </para>
+
+ <para>
+ We currently recommend people to use either playbin (see <xref
+ linkend="section-components-playbin"/>) or decodebin (see <xref
+ linkend="section-components-decodebin"/>), depending on their needs.
+ Playbin is the recommended solution for everything related to simple
+ playback of media that should just work. Decodebin is a more flexible
+ autoplugger that could be used to add more advanced features, such
+ as playlist support, crossfading of audio tracks and so on. Its
+ programming interface is more low-level than that of playbin, though.
+ </para>
+
+ <sect1 id="section-components-playbin">
+ <title>Playbin</title>
+
+ <para>
+ Playbin is an element that can be created using the standard &GStreamer;
+ API (e.g. <function>gst_element_factory_make ()</function>). The factory
+ is conveniently called <quote>playbin</quote>. By being a
+ <classname>GstPipeline</classname> (and thus a
+ <classname>GstElement</classname>), playbin automatically supports all
+ of the features of this class, including error handling, tag support,
+ state handling, getting stream positions, seeking, and so on.
+ </para>
+
+ <para>
+ Setting up a playbin pipeline is as simple as creating an instance of
+ the playbin element, setting a file location using the
+ <quote>uri</quote> property on playbin, and then setting the element
+ to the <classname>GST_STATE_PLAYING</classname> state (the location has to be a valid
+ URI, so <quote><protocol>://<location></quote>, e.g.
+ file:///tmp/my.ogg or http://www.example.org/stream.ogg). Internally,
+ playbin will set up a pipeline to playback the media location.
+ </para>
+
+ <programlisting><!-- example-begin playbin.c a -->
+#include <gst/gst.h>
+<!-- example-end playbin.c a -->
+[.. my_bus_callback goes here ..]<!-- example-begin playbin.c b --><!--
+static gboolean
+my_bus_callback (GstBus *bus,
+ GstMessage *message,
+ gpointer data)
+{
+ GMainLoop *loop = data;
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR: {
+ GError *err;
+ gchar *debug;
+
+ gst_message_parse_error (message, &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;
+}
+--><!-- example-end playbin.c b -->
+<!-- example-begin playbin.c c -->
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GMainLoop *loop;
+ GstElement *play;
+ GstBus *bus;
+
+ /* init GStreamer */
+ gst_init (&argc, &argv);
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* make sure we have a URI */
+ if (argc != 2) {
+ g_print ("Usage: %s <URI>\n", argv[0]);
+ return -1;
+ }
+
+ /* set up */
+ play = gst_element_factory_make ("playbin", "play");
+ g_object_set (G_OBJECT (play), "uri", argv[1], NULL);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (play));
+ gst_bus_add_watch (bus, my_bus_callback, loop);
+ gst_object_unref (bus);
+
+ gst_element_set_state (play, GST_STATE_PLAYING);
+
+ /* now run */
+ g_main_loop_run (loop);
+
+ /* also clean up */
+ gst_element_set_state (play, GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (play));
+
+ return 0;
+}
+ <!-- example-end playbin.c c --></programlisting>
+
+ <para>
+ Playbin has several features that have been discussed previously:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Settable video and audio output (using the <quote>video-sink</quote>
+ and <quote>audio-sink</quote> properties).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Mostly controllable and trackable as a
+ <classname>GstElement</classname>, including error handling, eos
+ handling, tag handling, state handling (through the
+ <classname>GstBus</classname>), media position handling and
+ seeking.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Buffers network-sources, with buffer fullness notifications being
+ passed through the <classname>GstBus</classname>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Supports visualizations for audio-only media.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Supports subtitles, both in the media as well as from separate
+ files. For separate subtitle files, use the <quote>suburi</quote>
+ property.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Supports stream selection and disabling. If your media has
+ multiple audio or subtitle tracks, you can dynamically choose
+ which one to play back, or decide to turn it off altogether
+ (which is especially useful to turn off subtitles). For each
+ of those, use the <quote>current-text</quote> and other related
+ properties.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ For convenience, it is possible to test <quote>playbin</quote> on
+ the commandline, using the command <quote>gst-launch-1.0 playbin
+ uri=file:///path/to/file</quote>.
+ </para>
+ </sect1>
+
+ <sect1 id="section-components-decodebin">
+ <title>Decodebin</title>
+
+ <para>
+ Decodebin is the actual autoplugger backend of playbin, which was
+ discussed in the previous section. Decodebin will, in short, accept
+ input from a source that is linked to its sinkpad and will try to
+ detect the media type contained in the stream, and set up decoder
+ routines for each of those. It will automatically select decoders.
+ For each decoded stream, it will emit the <quote>pad-added</quote>
+ signal, to let the client know about the newly found decoded stream.
+ For unknown streams (which might be the whole stream), it will emit
+ the <quote>unknown-type</quote> signal. The application is then
+ responsible for reporting the error to the user.
+ </para>
+ <programlisting><!-- example-begin decodebin.c a -->
+<![CDATA[
+#include <gst/gst.h>
+]]>
+<!-- example-end decodebin.c a -->
+[.. my_bus_callback goes here ..]<!-- example-begin decodebin.c b -->
+<!--
+static gboolean
+my_bus_callback (GstBus *bus,
+ GstMessage *message,
+ gpointer data)
+{
+ GMainLoop *loop = data;
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR: {
+ GError *err;
+ gchar *debug;
+
+ gst_message_parse_error (message, &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;
+}
+--><!-- example-end decodebin.c b -->
+<!-- example-begin decodebin.c c -->
+<![CDATA[
+GstElement *pipeline, *audio;
+
+static void
+cb_newpad (GstElement *decodebin,
+ GstPad *pad,
+ gpointer data)
+{
+ GstCaps *caps;
+ GstStructure *str;
+ GstPad *audiopad;
+
+ /* only link once */
+ audiopad = gst_element_get_static_pad (audio, "sink");
+ if (GST_PAD_IS_LINKED (audiopad)) {
+ g_object_unref (audiopad);
+ return;
+ }
+
+ /* check media type */
+ caps = gst_pad_query_caps (pad, NULL);
+ str = gst_caps_get_structure (caps, 0);
+ if (!g_strrstr (gst_structure_get_name (str), "audio")) {
+ gst_caps_unref (caps);
+ gst_object_unref (audiopad);
+ return;
+ }
+ gst_caps_unref (caps);
+
+ /* link'n'play */
+ gst_pad_link (pad, audiopad);
+
+ g_object_unref (audiopad);
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GMainLoop *loop;
+ GstElement *src, *dec, *conv, *sink;
+ GstPad *audiopad;
+ GstBus *bus;
+
+ /* init GStreamer */
+ gst_init (&argc, &argv);
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* make sure we have input */
+ if (argc != 2) {
+ g_print ("Usage: %s <filename>\n", argv[0]);
+ return -1;
+ }
+
+ /* setup */
+ pipeline = gst_pipeline_new ("pipeline");
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_watch (bus, my_bus_callback, loop);
+ gst_object_unref (bus);
+
+ src = gst_element_factory_make ("filesrc", "source");
+ g_object_set (G_OBJECT (src), "location", argv[1], NULL);
+ dec = gst_element_factory_make ("decodebin", "decoder");
+ g_signal_connect (dec, "pad-added", G_CALLBACK (cb_newpad), NULL);
+ gst_bin_add_many (GST_BIN (pipeline), src, dec, NULL);
+ gst_element_link (src, dec);
+
+ /* create audio output */
+ audio = gst_bin_new ("audiobin");
+ conv = gst_element_factory_make ("audioconvert", "aconv");
+ audiopad = gst_element_get_static_pad (conv, "sink");
+ sink = gst_element_factory_make ("alsasink", "sink");
+ gst_bin_add_many (GST_BIN (audio), conv, sink, NULL);
+ gst_element_link (conv, sink);
+ gst_element_add_pad (audio,
+ gst_ghost_pad_new ("sink", audiopad));
+ gst_object_unref (audiopad);
+ gst_bin_add (GST_BIN (pipeline), audio);
+
+ /* run */
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ g_main_loop_run (loop);
+
+ /* cleanup */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (pipeline));
+
+ return 0;
+}
+]]>
+ <!-- example-end decodebin.c c --></programlisting>
+ <para>
+ Decodebin, similar to playbin, supports the following features:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Can decode an unlimited number of contained streams to decoded
+ output pads.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Is handled as a <classname>GstElement</classname> in all ways,
+ including tag or error forwarding and state handling.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Although decodebin is a good autoplugger, there's a whole lot of
+ things that it does not do and is not intended to do:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Taking care of input streams with a known media type (e.g. a DVD,
+ an audio-CD or such).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Selection of streams (e.g. which audio track to play in case of
+ multi-language media streams).
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Overlaying subtitles over a decoded video stream.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Decodebin can be easily tested on the commandline, e.g. by using the
+ command <command>gst-launch-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, &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;
+}
+-->
+<!-- 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>
through one or more <emphasis>sink pads</emphasis>. Source and sink
elements have only source and sink pads, respectively. Data usually
means buffers (described by the <ulink type="http"
- url="&URLAPI;gstreamer-GstBuffer.html"><classname>GstBuffer
- </classname></ulink> object) and events (described by the <ulink
- type="http" url="&URLAPI;gstreamer-GstEvent.html"><classname>
- GstEvent</classname></ulink> object).
+ url="&URLAPI;gstreamer-GstBuffer.html">
+ <classname>GstBuffer</classname></ulink> object) and events (described
+ by the <ulink type="http" url="&URLAPI;gstreamer-GstEvent.html">
+ <classname>GstEvent</classname></ulink> object).
</para>
</sect1>
<para>
A <emphasis>bin</emphasis> is a container for a collection of elements.
- A <emphasis>pipeline</emphasis> is a special subtype of a bin that allows execution of all
- of its contained child elements. Since bins are subclasses of elements
+ Since bins are subclasses of elements
themselves, you can mostly control a bin as if it were an element,
thereby abstracting away a lot of complexity for your application. You
can, for example change state on all elements in a bin by changing the
contained children (such as error messages, tag messages or EOS messages).
</para>
<para>
- A <emphasis>pipeline</emphasis> is a top-level bin. As you set it to PAUSED or PLAYING state,
- data flow will start and media processing will take place. Once started,
- pipelines will run in a separate thread until you stop them or the end
+ A <emphasis>pipeline</emphasis> is a top-level bin. It provides a bus for
+ the application and manages the synchronization for its children.
+ As you set it to PAUSED or PLAYING state, data flow will start and media
+ processing will take place. Once started, pipelines will run in a
+ separate thread until you stop them or the end
of the data stream is reached.
</para>
<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>
<listitem><para>gst-plugins-good: a set of good-quality plug-ins under LGPL</para></listitem>
<listitem><para>gst-plugins-ugly: a set of good-quality plug-ins that might pose distribution problems</para></listitem>
<listitem><para>gst-plugins-bad: a set of plug-ins that need more quality</para></listitem>
- <listitem><para>gst-python: the python bindings</para></listitem>
+ <listitem><para>gst-libav: a set of plug-ins that wrap libav for decoding and encoding</para></listitem>
<listitem><para>a few others packages</para></listitem>
</itemizedlist>
</para>
<!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 XML SYSTEM "highlevel-xml.xml">
-<!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">
&METADATA;
&INTERFACES;
&CLOCKS;
+ &BUFFERING;
&DPARAMS;
&THREADS;
&AUTOPLUGGING;
much control (and as much code), but will prefer to use a standard
playback interface that does most of the difficult internals for
them. In this chapter, we will introduce you into the concept of
- autopluggers, playback managing elements, XML-based pipelines and
- other such things. Those higher-level interfaces are intended to
+ autopluggers, playback managing elements and other such things.
+ Those higher-level interfaces are intended to
simplify &GStreamer;-based application programming. They do, however,
also reduce the flexibility. It is up to the application developer
to choose which interface he will want to use.
</para>
</partintro>
- &COMPONENTS;
- &XML;
+ &PLAYBACK;
</part>
</para>
<para>
In addition, we also provide a porting guide which will explain
- easily how to port &GStreamer;-0.8 applications to &GStreamer;-0.10.
+ easily how to port &GStreamer;-0.10 applications to &GStreamer;-1.0.
</para>
</partintro>
- table please...
-->
+ &PROGRAMS;
+ &COMPILING;
&CHECKLIST;
&PORTING;
&INTEGRATION;
$(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 \
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@
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@
if echo $(FORMATS) | grep ps > /dev/null; then export SRC="$$SRC $(DOC).ps"; fi; \
if echo $(FORMATS) | grep pdf > /dev/null; then export SRC="$$SRC $(DOC).pdf"; fi; \
\
- # upload releases to both 0.10.X/ and head/ subdirectories \
- if test "x$(PACKAGE_VERSION_NANO)" = x0; then \
- export DIR=$(DOC_BASE)/gstreamer/$(VERSION)/$(DOC); \
- echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
- ssh $(DOC_SERVER) mkdir -p $$DIR; \
- rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \
- ssh $(DOC_SERVER) chmod -R g+w $$DIR; \
- fi; \
+ # upload releases to both X.Y/ and head/ subdirectories \
+ export DIR=$(DOC_BASE)/gstreamer/$(PACKAGE_VERSION_MAJOR).$(PACKAGE_VERSION_MINOR)/$(DOC); \
+ echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
+ ssh $(DOC_SERVER) mkdir -p $$DIR; \
+ rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \
+ ssh $(DOC_SERVER) chmod -R g+w $$DIR; \
\
export DIR=$(DOC_BASE)/gstreamer/head/$(DOC); \
echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
</tr></table>
<div class="chapter">
<div class="titlepage"><div><div><h2 class="title">
-<a name="idp4395232"></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>
</tr></table>
<div class="chapter">
<div class="titlepage"><div><div><h2 class="title">
-<a name="idp179376"></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>
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
- +----<a href="../gstreamer-libs-1.0/GstBaseTransform.html">GstBaseTransform</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseTransform.html">GstBaseTransform</a>
+----GstCapsFilter
</pre>
</div>
<div class="refsect1">
<a name="gstreamer-plugins-capsfilter.properties"></a><h2>Properties</h2>
<pre class="synopsis">
- "<a class="link" href="gstreamer-plugins-capsfilter.html#GstCapsFilter--caps" title='The "caps" property'>caps</a>" <a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write
+ "<a class="link" href="gstreamer-plugins-capsfilter.html#GstCapsFilter--caps" title='The "caps" property'>caps</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write
</pre>
</div>
<div class="refsect1">
<p>
</p>
<div class="refsect2">
-<a name="idp9006336"></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>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp9217088"></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>
</div>
<hr>
<div class="refsect2">
-<a name="idp32112"></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>
<a name="gstreamer-plugins-capsfilter.property-details"></a><h2>Property Details</h2>
<div class="refsect2">
<a name="GstCapsFilter--caps"></a><h3>The <code class="literal">"caps"</code> property</h3>
-<pre class="programlisting"> "caps" <a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write</pre>
+<pre class="programlisting"> "caps" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write</pre>
<p>Restrict the possible allowed capabilities (NULL means ANY). Setting this property takes a reference to the supplied GstCaps object.</p>
</div>
</div>
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
- +----<a href="../gstreamer-libs-1.0/GstBaseSink.html">GstBaseSink</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSink.html">GstBaseSink</a>
+----GstFakeSink
</pre>
</div>
<p>
</p>
<div class="refsect2">
-<a name="idp9474080"></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>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp6125200"></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>
</div>
<hr>
<div class="refsect2">
-<a name="idp6132624"></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>
<div class="refsect2">
<a name="GstFakeSink-handoff"></a><h3>The <code class="literal">"handoff"</code> signal</h3>
<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gstreamer-plugins-fakesink.html#GstFakeSink"><span class="type">GstFakeSink</span></a> *fakesink,
- <a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer,
- <a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> *pad,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad,
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
<p>
This signal gets emitted before unreffing the buffer.
<div class="refsect2">
<a name="GstFakeSink-preroll-handoff"></a><h3>The <code class="literal">"preroll-handoff"</code> signal</h3>
<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gstreamer-plugins-fakesink.html#GstFakeSink"><span class="type">GstFakeSink</span></a> *fakesink,
- <a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer,
- <a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> *pad,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad,
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
<p>
This signal gets emitted before unreffing the buffer.
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
- +----<a href="../gstreamer-libs-1.0/GstBaseSrc.html">GstBaseSrc</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSrc.html">GstBaseSrc</a>
+----GstFakeSrc
</pre>
</div>
"<a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrc--sizemin" title='The "sizemin" property'>sizemin</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read / Write
"<a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrc--sizetype" title='The "sizetype" property'>sizetype</a>" <a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrcSizeType" title="enum GstFakeSrcSizeType"><span class="type">GstFakeSrcSizeType</span></a> : Read / Write
"<a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrc--sync" title='The "sync" property'>sync</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
- "<a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrc--format" title='The "format" property'>format</a>" <a href="../gstreamer-1.0/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> : Read / Write
+ "<a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrc--format" title='The "format" property'>format</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> : Read / Write
</pre>
</div>
<div class="refsect1">
<p>
</p>
<div class="refsect2">
-<a name="idp9730432"></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>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp9733616"></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>
</div>
<hr>
<div class="refsect2">
-<a name="idp9741024"></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>
<hr>
<div class="refsect2">
<a name="GstFakeSrc--format"></a><h3>The <code class="literal">"format"</code> property</h3>
-<pre class="programlisting"> "format" <a href="../gstreamer-1.0/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> : Read / Write</pre>
+<pre class="programlisting"> "format" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GstFormat"><span class="type">GstFormat</span></a> : Read / Write</pre>
<p>
Set the format of the newsegment events to produce.
</p>
<div class="refsect2">
<a name="GstFakeSrc-handoff"></a><h3>The <code class="literal">"handoff"</code> signal</h3>
<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gstreamer-plugins-fakesrc.html#GstFakeSrc"><span class="type">GstFakeSrc</span></a> *fakesrc,
- <a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer,
- <a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> *pad,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *pad,
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
<p>
This signal gets emitted before sending the buffer.
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
- +----<a href="../gstreamer-libs-1.0/GstBaseSink.html">GstBaseSink</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSink.html">GstBaseSink</a>
+----GstFdSink
</pre>
</div>
<a name="gstreamer-plugins-fdsink.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
<p>
GstFdSink implements
- <a href="../gstreamer-1.0/gstreamer-GstUriHandler.html#GstURIHandler">GstURIHandler</a>.</p>
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstUriHandler.html#GstURIHandler">GstURIHandler</a>.</p>
</div>
<div class="refsect1">
<a name="gstreamer-plugins-fdsink.properties"></a><h2>Properties</h2>
<p>
This element will synchronize on the clock before writing the data on the
socket. For file descriptors where this does not make sense (files, ...) the
-<a href="../gstreamer-libs-1.0/GstBaseSink.html#GstBaseSink--sync"><span class="type">"sync"</span></a> property can be used to disable synchronisation.
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSink.html#GstBaseSink--sync"><span class="type">"sync"</span></a> property can be used to disable synchronisation.
</p>
<p>
Last reviewed on 2006-04-28 (0.10.6)
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp9024688"></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>
</div>
<hr>
<div class="refsect2">
-<a name="idp7652304"></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>
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
- +----<a href="../gstreamer-libs-1.0/GstBaseSrc.html">GstBaseSrc</a>
- +----<a href="../gstreamer-libs-1.0/GstPushSrc.html">GstPushSrc</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSrc.html">GstBaseSrc</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstPushSrc.html">GstPushSrc</a>
+----GstFdSrc
</pre>
</div>
<a name="gstreamer-plugins-fdsrc.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
<p>
GstFdSrc implements
- <a href="../gstreamer-1.0/gstreamer-GstUriHandler.html#GstURIHandler">GstURIHandler</a>.</p>
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstUriHandler.html#GstURIHandler">GstURIHandler</a>.</p>
</div>
<div class="refsect1">
<a name="gstreamer-plugins-fdsrc.properties"></a><h2>Properties</h2>
<p>
</p>
<div class="refsect2">
-<a name="idp6773120"></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>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp6776272"></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>
</div>
<hr>
<div class="refsect2">
-<a name="idp6783728"></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>
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
- +----<a href="../gstreamer-libs-1.0/GstBaseSink.html">GstBaseSink</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSink.html">GstBaseSink</a>
+----GstFileSink
</pre>
</div>
<a name="gstreamer-plugins-filesink.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
<p>
GstFileSink implements
- <a href="../gstreamer-1.0/gstreamer-GstUriHandler.html#GstURIHandler">GstURIHandler</a>.</p>
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstUriHandler.html#GstURIHandler">GstURIHandler</a>.</p>
</div>
<div class="refsect1">
<a name="gstreamer-plugins-filesink.properties"></a><h2>Properties</h2>
<p>
</p>
<div class="refsect2">
-<a name="idp5037280"></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>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp10876976"></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>
</div>
<hr>
<div class="refsect2">
-<a name="idp10924704"></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>
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
- +----<a href="../gstreamer-libs-1.0/GstBaseSrc.html">GstBaseSrc</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseSrc.html">GstBaseSrc</a>
+----GstFileSrc
</pre>
</div>
<a name="gstreamer-plugins-filesrc.implemented-interfaces"></a><h2>Implemented Interfaces</h2>
<p>
GstFileSrc implements
- <a href="../gstreamer-1.0/gstreamer-GstUriHandler.html#GstURIHandler">GstURIHandler</a>.</p>
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstUriHandler.html#GstURIHandler">GstURIHandler</a>.</p>
</div>
<div class="refsect1">
<a name="gstreamer-plugins-filesrc.properties"></a><h2>Properties</h2>
<p>
</p>
<div class="refsect2">
-<a name="idp6869664"></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>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp6872272"></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>
</div>
<hr>
<div class="refsect2">
-<a name="idp10528784"></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>
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+----GstFunnel
</pre>
</div>
</p>
<p>
funnel always outputs a single, open ended segment from
-0 with in <a href="../gstreamer-1.0/gstreamer-GstFormat.html#GST-FORMAT-TIME:CAPS"><code class="literal">GST_FORMAT_TIME</code></a> and outputs the buffers of the
+0 with in <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstFormat.html#GST-FORMAT-TIME:CAPS"><code class="literal">GST_FORMAT_TIME</code></a> and outputs the buffers of the
different sinkpads with timestamps that are set to the
running time for that stream. funnel does not synchronize
the different input streams but simply forwards all buffers
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp7728896"></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>
</div>
<hr>
<div class="refsect2">
-<a name="idp9964400"></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>
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
- +----<a href="../gstreamer-libs-1.0/GstBaseTransform.html">GstBaseTransform</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseTransform.html">GstBaseTransform</a>
+----GstIdentity
</pre>
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp10744592"></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>
</div>
<hr>
<div class="refsect2">
-<a name="idp10752048"></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>
<div class="refsect2">
<a name="GstIdentity-handoff"></a><h3>The <code class="literal">"handoff"</code> signal</h3>
<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gstreamer-plugins-identity.html#GstIdentity"><span class="type">GstIdentity</span></a> *identity,
- <a href="../gstreamer-1.0/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstBuffer.html#GstBuffer"><span class="type">GstBuffer</span></a> *buffer,
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
<p>
This signal gets emitted before passing the buffer downstream.
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+----GstInputSelector
</pre>
</div>
<div class="refsect1">
<a name="gstreamer-plugins-input-selector.properties"></a><h2>Properties</h2>
<pre class="synopsis">
- "<a class="link" href="gstreamer-plugins-input-selector.html#GstInputSelector--active-pad" title='The "active-pad" property'>active-pad</a>" <a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a>* : Read / Write
+ "<a class="link" href="gstreamer-plugins-input-selector.html#GstInputSelector--active-pad" title='The "active-pad" property'>active-pad</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a>* : Read / Write
"<a class="link" href="gstreamer-plugins-input-selector.html#GstInputSelector--n-pads" title='The "n-pads" property'>n-pads</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read
"<a class="link" href="gstreamer-plugins-input-selector.html#GstInputSelector--select-all" title='The "select-all" property'>select-all</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
"<a class="link" href="gstreamer-plugins-input-selector.html#GstInputSelector--sync-streams" title='The "sync-streams" property'>sync-streams</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
"running-time": Running time of stream on pad (<span class="type">gint64</span>)
</li>
<li class="listitem">
-"tags": The currently active tags on the pad (<a href="../gstreamer-1.0/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a>, boxed type)
+"tags": The currently active tags on the pad (<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstTagList.html#GstTagList"><span class="type">GstTagList</span></a>, boxed type)
</li>
<li class="listitem">
"active": If the pad is currently active (<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a>)
</li>
<li class="listitem">
-"always-ok" : Make an inactive pads return <a href="../gstreamer-1.0/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> instead of
-<a href="../gstreamer-1.0/GstPad.html#GST-FLOW-NOT-LINKED:CAPS"><span class="type">GST_FLOW_NOT_LINKED</span></a>
+"always-ok" : Make an inactive pads return <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GST-FLOW-OK:CAPS"><span class="type">GST_FLOW_OK</span></a> instead of
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GST-FLOW-NOT-LINKED:CAPS"><span class="type">GST_FLOW_NOT_LINKED</span></a>
</li>
</ul></div>
<p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp11251280"></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>
</div>
<hr>
<div class="refsect2">
-<a name="idp11258816"></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>
<a name="gstreamer-plugins-input-selector.property-details"></a><h2>Property Details</h2>
<div class="refsect2">
<a name="GstInputSelector--active-pad"></a><h3>The <code class="literal">"active-pad"</code> property</h3>
-<pre class="programlisting"> "active-pad" <a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a>* : Read / Write</pre>
+<pre class="programlisting"> "active-pad" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a>* : Read / Write</pre>
<p>The currently active sink pad.</p>
</div>
<hr>
<div class="refsect2">
<a name="GstInputSelector-switch"></a><h3>The <code class="literal">"switch"</code> signal</h3>
<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gstreamer-plugins-input-selector.html#GstInputSelector"><span class="type">GstInputSelector</span></a> *gstinputselector,
- <a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a> *arg1,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a> *arg1,
<span class="type">gint64</span> arg2,
<span class="type">gint64</span> arg3,
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+----GstMultiQueue
</pre>
</div>
<p>
</p>
<div class="refsect2">
-<a name="idp9289440"></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>
'sometimes' src pads (src%d).
</p>
<p>
- When requesting a given sinkpad with <a href="../gstreamer-1.0/GstElement.html#gst-element-get-request-pad"><code class="function">gst_element_get_request_pad()</code></a>,
+ When requesting a given sinkpad with <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-get-request-pad"><code class="function">gst_element_get_request_pad()</code></a>,
the associated srcpad for that stream will be created.
Example: requesting sink1 will generate src1.
</p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp11520688"></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>
</div>
<hr>
<div class="refsect2">
-<a name="idp11528144"></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>
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+----GstOutputSelector
</pre>
</div>
<div class="refsect1">
<a name="gstreamer-plugins-output-selector.properties"></a><h2>Properties</h2>
<pre class="synopsis">
- "<a class="link" href="gstreamer-plugins-output-selector.html#GstOutputSelector--active-pad" title='The "active-pad" property'>active-pad</a>" <a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a>* : Read / Write
+ "<a class="link" href="gstreamer-plugins-output-selector.html#GstOutputSelector--active-pad" title='The "active-pad" property'>active-pad</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a>* : Read / Write
"<a class="link" href="gstreamer-plugins-output-selector.html#GstOutputSelector--resend-latest" title='The "resend-latest" property'>resend-latest</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write
"<a class="link" href="gstreamer-plugins-output-selector.html#GstOutputSelector--pad-negotiation-mode" title='The "pad-negotiation-mode" property'>pad-negotiation-mode</a>" <span class="type">GstOutputSelectorPadNegotiationMode</span> : Read / Write
</pre>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp4955616"></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>
</div>
<hr>
<div class="refsect2">
-<a name="idp11458256"></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>
<a name="gstreamer-plugins-output-selector.property-details"></a><h2>Property Details</h2>
<div class="refsect2">
<a name="GstOutputSelector--active-pad"></a><h3>The <code class="literal">"active-pad"</code> property</h3>
-<pre class="programlisting"> "active-pad" <a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a>* : Read / Write</pre>
+<pre class="programlisting"> "active-pad" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a>* : Read / Write</pre>
<p>Currently active src pad.</p>
</div>
<hr>
<td valign="top" align="right"></td>
</tr></table></div>
<div class="refsect1">
-<a name="idp8723328"></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>
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>0.11.99</td>
+<td>1.0.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
</table></div>
</div>
<div class="refsect1">
-<a name="idp8851280"></a><h2>Elements</h2>
+<a name="idp8002864"></a><h2>Elements</h2>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+----GstQueue
</pre>
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp11359504"></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>
</div>
<hr>
<div class="refsect2">
-<a name="idp11366960"></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>
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+----GstQueue2
</pre>
</div>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp12163568"></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>
</div>
<hr>
<div class="refsect2">
-<a name="idp12170976"></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>
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+----GstTee
</pre>
</div>
"<a class="link" href="gstreamer-plugins-tee.html#GstTee--num-src-pads" title='The "num-src-pads" property'>num-src-pads</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> : Read
"<a class="link" href="gstreamer-plugins-tee.html#GstTee--silent" title='The "silent" property'>silent</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> : Read / Write / Construct
"<a class="link" href="gstreamer-plugins-tee.html#GstTee--pull-mode" title='The "pull-mode" property'>pull-mode</a>" <a class="link" href="gstreamer-plugins-tee.html#GstTeePullMode" title="enum GstTeePullMode"><span class="type">GstTeePullMode</span></a> : Read / Write / Construct
- "<a class="link" href="gstreamer-plugins-tee.html#GstTee--alloc-pad" title='The "alloc-pad" property'>alloc-pad</a>" <a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a>* : Read / Write
+ "<a class="link" href="gstreamer-plugins-tee.html#GstTee--alloc-pad" title='The "alloc-pad" property'>alloc-pad</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a>* : Read / Write
</pre>
</div>
<div class="refsect1">
<p>
</p>
<div class="refsect2">
-<a name="idp6592416"></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>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp6595136"></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>
</div>
<hr>
<div class="refsect2">
-<a name="idp12121312"></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>
<hr>
<div class="refsect2">
<a name="GstTee--alloc-pad"></a><h3>The <code class="literal">"alloc-pad"</code> property</h3>
-<pre class="programlisting"> "alloc-pad" <a href="../gstreamer-1.0/GstPad.html"><span class="type">GstPad</span></a>* : Read / Write</pre>
+<pre class="programlisting"> "alloc-pad" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPad</span></a>* : Read / Write</pre>
<p>The pad used for gst_pad_alloc_buffer.</p>
</div>
</div>
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+----GstTypeFindElement
</pre>
</div>
<div class="refsect1">
<a name="gstreamer-plugins-typefind.properties"></a><h2>Properties</h2>
<pre class="synopsis">
- "<a class="link" href="gstreamer-plugins-typefind.html#GstTypeFindElement--caps" title='The "caps" property'>caps</a>" <a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read
+ "<a class="link" href="gstreamer-plugins-typefind.html#GstTypeFindElement--caps" title='The "caps" property'>caps</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read
"<a class="link" href="gstreamer-plugins-typefind.html#GstTypeFindElement--maximum" title='The "maximum" property'>maximum</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write
"<a class="link" href="gstreamer-plugins-typefind.html#GstTypeFindElement--minimum" title='The "minimum" property'>minimum</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write
- "<a class="link" href="gstreamer-plugins-typefind.html#GstTypeFindElement--force-caps" title='The "force-caps" property'>force-caps</a>" <a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write
+ "<a class="link" href="gstreamer-plugins-typefind.html#GstTypeFindElement--force-caps" title='The "force-caps" property'>force-caps</a>" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write
</pre>
</div>
<div class="refsect1">
state change function).
</p>
<p>
-Plugins can register custom typefinders by using <a href="../gstreamer-1.0/GstTypeFindFactory.html"><span class="type">GstTypeFindFactory</span></a>.
+Plugins can register custom typefinders by using <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstTypeFindFactory.html"><span class="type">GstTypeFindFactory</span></a>.
</p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp12038496"></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>
</div>
<hr>
<div class="refsect2">
-<a name="idp12045904"></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>
<a name="gstreamer-plugins-typefind.property-details"></a><h2>Property Details</h2>
<div class="refsect2">
<a name="GstTypeFindElement--caps"></a><h3>The <code class="literal">"caps"</code> property</h3>
-<pre class="programlisting"> "caps" <a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read</pre>
+<pre class="programlisting"> "caps" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read</pre>
<p>detected capabilities in stream.</p>
</div>
<hr>
<hr>
<div class="refsect2">
<a name="GstTypeFindElement--force-caps"></a><h3>The <code class="literal">"force-caps"</code> property</h3>
-<pre class="programlisting"> "force-caps" <a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write</pre>
+<pre class="programlisting"> "force-caps" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a>* : Read / Write</pre>
<p>force caps without doing a typefind.</p>
</div>
</div>
<a name="GstTypeFindElement-have-type"></a><h3>The <code class="literal">"have-type"</code> signal</h3>
<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="gstreamer-plugins-typefind.html#GstTypeFindElement"><span class="type">GstTypeFindElement</span></a> *typefind,
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> probability,
- <a href="../gstreamer-1.0/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps,
+ <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstCaps.html#GstCaps"><span class="type">GstCaps</span></a> *caps,
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-FIRST:CAPS"><code class="literal">Run First</code></a></pre>
<p>
This signal gets emitted when the type and its probability has
<pre class="synopsis">
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+----<a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
- +----<a href="../gstreamer-1.0/GstObject.html">GstObject</a>
- +----<a href="../gstreamer-1.0/GstElement.html">GstElement</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+ +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
+----GstValve
</pre>
</div>
</p>
<p>
Any downstream error received while the <a class="link" href="gstreamer-plugins-valve.html#GstValve--drop" title='The "drop" property'><span class="type">"drop"</span></a> property is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>
-is ignored. So downstream element can be set to <a href="../gstreamer-1.0/GstElement.html#GST-STATE-NULL:CAPS"><code class="literal">GST_STATE_NULL</code></a> and removed,
+is ignored. So downstream element can be set to <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#GST-STATE-NULL:CAPS"><code class="literal">GST_STATE_NULL</code></a> and removed,
without using pad blocking.
</p>
<p>
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="idp10150096"></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>
</div>
<hr>
<div class="refsect2">
-<a name="idp10589120"></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>
</sub>
</chapters>
<functions>
- <keyword type="" name="Example launch line" link="gstreamer-plugins-capsfilter.html#idp9006336"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-capsfilter.html#idp9217088"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-capsfilter.html#idp32112"/>
+ <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 "caps" property" link="gstreamer-plugins-capsfilter.html#GstCapsFilter--caps"/>
- <keyword type="" name="Example launch line" link="gstreamer-plugins-fakesrc.html#idp9730432"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-fakesrc.html#idp9733616"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-fakesrc.html#idp9741024"/>
+ <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"/>
<keyword type="property" name="The "sync" property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--sync"/>
<keyword type="property" name="The "format" property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--format"/>
<keyword type="signal" name="The "handoff" signal" link="gstreamer-plugins-fakesrc.html#GstFakeSrc-handoff"/>
- <keyword type="" name="Example launch line" link="gstreamer-plugins-fakesink.html#idp9474080"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-fakesink.html#idp6125200"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-fakesink.html#idp6132624"/>
+ <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 "can-activate-pull" property" link="gstreamer-plugins-fakesink.html#GstFakeSink--can-activate-pull"/>
<keyword type="property" name="The "num-buffers" property" link="gstreamer-plugins-fakesink.html#GstFakeSink--num-buffers"/>
<keyword type="signal" name="The "handoff" signal" link="gstreamer-plugins-fakesink.html#GstFakeSink-handoff"/>
<keyword type="signal" name="The "preroll-handoff" signal" link="gstreamer-plugins-fakesink.html#GstFakeSink-preroll-handoff"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-fdsink.html#idp9024688"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-fdsink.html#idp7652304"/>
+ <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 "fd" property" link="gstreamer-plugins-fdsink.html#GstFdSink--fd"/>
- <keyword type="" name="Example launch line" link="gstreamer-plugins-fdsrc.html#idp6773120"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-fdsrc.html#idp6776272"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-fdsrc.html#idp6783728"/>
+ <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 "fd" property" link="gstreamer-plugins-fdsrc.html#GstFdSrc--fd"/>
<keyword type="property" name="The "timeout" property" link="gstreamer-plugins-fdsrc.html#GstFdSrc--timeout"/>
- <keyword type="" name="Example launch line" link="gstreamer-plugins-filesrc.html#idp6869664"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-filesrc.html#idp6872272"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-filesrc.html#idp10528784"/>
+ <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 "fd" property" link="gstreamer-plugins-filesrc.html#GstFileSrc--fd"/>
<keyword type="property" name="The "location" property" link="gstreamer-plugins-filesrc.html#GstFileSrc--location"/>
<keyword type="property" name="The "touch" property" link="gstreamer-plugins-filesrc.html#GstFileSrc--touch"/>
<keyword type="property" name="The "use-mmap" property" link="gstreamer-plugins-filesrc.html#GstFileSrc--use-mmap"/>
<keyword type="property" name="The "sequential" property" link="gstreamer-plugins-filesrc.html#GstFileSrc--sequential"/>
- <keyword type="" name="Example launch line" link="gstreamer-plugins-filesink.html#idp5037280"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-filesink.html#idp10876976"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-filesink.html#idp10924704"/>
+ <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 "location" property" link="gstreamer-plugins-filesink.html#GstFileSink--location"/>
<keyword type="property" name="The "buffer-mode" property" link="gstreamer-plugins-filesink.html#GstFileSink--buffer-mode"/>
<keyword type="property" name="The "buffer-size" property" link="gstreamer-plugins-filesink.html#GstFileSink--buffer-size"/>
<keyword type="property" name="The "append" property" link="gstreamer-plugins-filesink.html#GstFileSink--append"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-funnel.html#idp7728896"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-funnel.html#idp9964400"/>
+ <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#idp10744592"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-identity.html#idp10752048"/>
+ <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 "check-perfect" property" link="gstreamer-plugins-identity.html#GstIdentity--check-perfect"/>
<keyword type="property" name="The "datarate" property" link="gstreamer-plugins-identity.html#GstIdentity--datarate"/>
<keyword type="property" name="The "check-imperfect-timestamp" property" link="gstreamer-plugins-identity.html#GstIdentity--check-imperfect-timestamp"/>
<keyword type="property" name="The "signal-handoffs" property" link="gstreamer-plugins-identity.html#GstIdentity--signal-handoffs"/>
<keyword type="signal" name="The "handoff" signal" link="gstreamer-plugins-identity.html#GstIdentity-handoff"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-input-selector.html#idp11251280"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-input-selector.html#idp11258816"/>
+ <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 "active-pad" property" link="gstreamer-plugins-input-selector.html#GstInputSelector--active-pad"/>
<keyword type="property" name="The "n-pads" property" link="gstreamer-plugins-input-selector.html#GstInputSelector--n-pads"/>
<keyword type="property" name="The "sync-mode" property" link="gstreamer-plugins-input-selector.html#GstInputSelector--sync-mode"/>
<keyword type="signal" name="The "block" signal" link="gstreamer-plugins-input-selector.html#GstInputSelector-block"/>
<keyword type="signal" name="The "switch" signal" link="gstreamer-plugins-input-selector.html#GstInputSelector-switch"/>
- <keyword type="" name="" link="gstreamer-plugins-multiqueue.html#idp9289440"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-multiqueue.html#idp11520688"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-multiqueue.html#idp11528144"/>
+ <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 "extra-size-buffers" property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--extra-size-buffers"/>
<keyword type="property" name="The "extra-size-bytes" property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--extra-size-bytes"/>
<keyword type="property" name="The "sync-by-running-time" property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--sync-by-running-time"/>
<keyword type="signal" name="The "overrun" signal" link="gstreamer-plugins-multiqueue.html#GstMultiQueue-overrun"/>
<keyword type="signal" name="The "underrun" signal" link="gstreamer-plugins-multiqueue.html#GstMultiQueue-underrun"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-output-selector.html#idp4955616"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-output-selector.html#idp11458256"/>
+ <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 "active-pad" property" link="gstreamer-plugins-output-selector.html#GstOutputSelector--active-pad"/>
<keyword type="property" name="The "resend-latest" property" link="gstreamer-plugins-output-selector.html#GstOutputSelector--resend-latest"/>
<keyword type="property" name="The "pad-negotiation-mode" property" link="gstreamer-plugins-output-selector.html#GstOutputSelector--pad-negotiation-mode"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-queue.html#idp11359504"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-queue.html#idp11366960"/>
+ <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 "current-level-buffers" property" link="gstreamer-plugins-queue.html#GstQueue--current-level-buffers"/>
<keyword type="signal" name="The "running" signal" link="gstreamer-plugins-queue.html#GstQueue-running"/>
<keyword type="signal" name="The "underrun" signal" link="gstreamer-plugins-queue.html#GstQueue-underrun"/>
<keyword type="signal" name="The "pushing" signal" link="gstreamer-plugins-queue.html#GstQueue-pushing"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-queue2.html#idp12163568"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-queue2.html#idp12170976"/>
+ <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 "current-level-buffers" property" link="gstreamer-plugins-queue2.html#GstQueue2--current-level-buffers"/>
<keyword type="property" name="The "current-level-bytes" property" link="gstreamer-plugins-queue2.html#GstQueue2--current-level-bytes"/>
<keyword type="property" name="The "use-rate-estimate" property" link="gstreamer-plugins-queue2.html#GstQueue2--use-rate-estimate"/>
<keyword type="property" name="The "temp-remove" property" link="gstreamer-plugins-queue2.html#GstQueue2--temp-remove"/>
<keyword type="property" name="The "ring-buffer-max-size" property" link="gstreamer-plugins-queue2.html#GstQueue2--ring-buffer-max-size"/>
- <keyword type="" name="Example launch line" link="gstreamer-plugins-tee.html#idp6592416"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-tee.html#idp6595136"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-tee.html#idp12121312"/>
+ <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 "has-chain" property" link="gstreamer-plugins-tee.html#GstTee--has-chain"/>
<keyword type="property" name="The "silent" property" link="gstreamer-plugins-tee.html#GstTee--silent"/>
<keyword type="property" name="The "pull-mode" property" link="gstreamer-plugins-tee.html#GstTee--pull-mode"/>
<keyword type="property" name="The "alloc-pad" property" link="gstreamer-plugins-tee.html#GstTee--alloc-pad"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-typefind.html#idp12038496"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-typefind.html#idp12045904"/>
+ <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 "caps" property" link="gstreamer-plugins-typefind.html#GstTypeFindElement--caps"/>
<keyword type="property" name="The "maximum" property" link="gstreamer-plugins-typefind.html#GstTypeFindElement--maximum"/>
<keyword type="property" name="The "minimum" property" link="gstreamer-plugins-typefind.html#GstTypeFindElement--minimum"/>
<keyword type="property" name="The "force-caps" property" link="gstreamer-plugins-typefind.html#GstTypeFindElement--force-caps"/>
<keyword type="signal" name="The "have-type" signal" link="gstreamer-plugins-typefind.html#GstTypeFindElement-have-type"/>
- <keyword type="" name="Element Information" link="gstreamer-plugins-valve.html#idp10150096"/>
- <keyword type="" name="Element Pads" link="gstreamer-plugins-valve.html#idp10589120"/>
+ <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 "drop" 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"/>
<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.0)
+ 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>
<description> GStreamer core elements</description>
<filename>../../plugins/elements/.libs/libgstcoreelements.so</filename>
<basename>libgstcoreelements.so</basename>
- <version>1.0.0</version>
+ <version>1.0.2</version>
<license>LGPL</license>
<source>gstreamer</source>
<package>GStreamer source release</package>
$(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 \
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@
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@
if echo $(FORMATS) | grep ps > /dev/null; then export SRC="$$SRC $(DOC).ps"; fi; \
if echo $(FORMATS) | grep pdf > /dev/null; then export SRC="$$SRC $(DOC).pdf"; fi; \
\
- # upload releases to both 0.10.X/ and head/ subdirectories \
- if test "x$(PACKAGE_VERSION_NANO)" = x0; then \
- export DIR=$(DOC_BASE)/gstreamer/$(VERSION)/$(DOC); \
- echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
- ssh $(DOC_SERVER) mkdir -p $$DIR; \
- rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \
- ssh $(DOC_SERVER) chmod -R g+w $$DIR; \
- fi; \
+ # upload releases to both X.Y/ and head/ subdirectories \
+ export DIR=$(DOC_BASE)/gstreamer/$(PACKAGE_VERSION_MAJOR).$(PACKAGE_VERSION_MINOR)/$(DOC); \
+ echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
+ ssh $(DOC_SERVER) mkdir -p $$DIR; \
+ rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \
+ ssh $(DOC_SERVER) chmod -R g+w $$DIR; \
\
export DIR=$(DOC_BASE)/gstreamer/head/$(DOC); \
echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
--- /dev/null
+<chapter id="chapter-allocation" xreflabel="Memory allocation">
+ <title>Memory allocation</title>
+ <para>
+ Memory allocation and management is a very important topic in
+ multimedia. High definition video uses many magabytes to store
+ one single frame of video. It is important to reuse the memory
+ when possible instead of constantly allocating and freeing
+ the memory.
+ </para>
+ <para>
+ Multimedia systems usually use special purpose chips, such as
+ DSPs or GPUs to perform the heavy lifting (especially for video).
+ These special purpose chips have usually strict requirements
+ for the memory that they can operate on and how the memory
+ is accessed.
+ </para>
+ <para>
+ This chapter talks about the memory management features that
+ &GStreamer; plugins can use. We will first talk about the
+ lowlevel <classname>GstMemory</classname> object that manages
+ access to a piece of memory. We then continue with
+ <classname>GstBuffer</classname> that is used to exchange data
+ between plugins (and the application) and that uses
+ <classname>GstMemory</classname>. We talk about
+ <classname>GstMeta</classname> that can be placed on buffers to
+ give extra info about the buffer and its memory.
+ For efficiently managing buffers of the same size, we take a
+ look at <classname>GstBufferPool</classname>. To conclude this
+ chapter we take a look at the GST_QUERY_ALLOCATION query that
+ is used to negotiate memory management options between elements.
+ </para>
+
+ <sect1 id="section-allocation-memory" xreflabel="GstMemory">
+ <title>GstMemory</title>
+ <para>
+ <classname>GstMemory</classname> is an object that manages a region
+ of memory. The memory object points to a region of memory of
+ <quote>maxsize</quote>. The area in this memory starting at
+ <quote>offset</quote> and for <quote>size</quote> bytes is the
+ accessible region in the memory. the maxsize of the memory can
+ never be changed after the object is created, however, the offset
+ and size can be changed.
+ </para>
+ <para>
+ <classname>GstMemory</classname> objects are created by a
+ <classname>GstAllocator</classname> object. To implement support
+ for a new kind of memory type, you must implement a new allocator
+ object.
+ </para>
+ <sect2 id="section-allocation-memory-ex" xreflabel="GstMemory-ex">
+ <title>GstMemory API example</title>
+ <para>
+ Data access to the memory wrapped by the <classname>GstMemory</classname>
+ object is always protected with a <function>gst_memory_map()</function>
+ and <function>gst_memory_unmap()</function> pair. An access mode
+ (read/write) must be given when mapping memory. The map
+ function returns a pointer to the valid memory region that can
+ then be accessed according to the requested access mode.
+ </para>
+ <para>
+ Below is an example of making a <classname>GstMemory</classname>
+ object and using the <function>gst_memory_map()</function> to
+ access the memory region.
+ </para>
+ <programlisting>
+<![CDATA[
+[...]
+
+ GstMemory *mem;
+ GstMapInfo info;
+ gint i;
+
+ /* allocate 100 bytes */
+ mem = gst_allocator_alloc (NULL, 100, NULL);
+
+ /* get access to the memory in write mode */
+ gst_memory_map (mem, &info, GST_MAP_WRITE);
+
+ /* fill with pattern */
+ for (i = 0; i < info.size; i++)
+ info.data[i] = i;
+
+ /* release memory */
+ gst_memory_unmap (mem, &info);
+
+[...]
+]]>
+ </programlisting>
+ </sect2>
+
+ <sect2 id="section-allocation-allocator" xreflabel="GstAllocator">
+ <title>Implementing a GstAllocator</title>
+ <para>
+ WRITEME
+ </para>
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="section-allocation-buffer" xreflabel="GstBuffer">
+ <title>GstBuffer</title>
+ <para>
+ A <classname>GstBuffer</classname> is an lightweight object that
+ is passed from an upstream to a downstream element and contains
+ memory and metadata. It represents the multimedia content that
+ is pushed or pull downstream by elements.
+ </para>
+ <para>
+ The buffer contains one or more <classname>GstMemory</classname>
+ objects thet represent the data in the buffer.
+ </para>
+ <para>
+ Metadata in the buffer consists of:
+ </para>
+ <itemizedlist mark="opencircle">
+ <listitem>
+ <para>
+ DTS and PTS timestamps. These represent the decoding and
+ presentation timestamps of the buffer content and is used by
+ synchronizing elements to schedule buffers. Both these timestamps
+ can be GST_CLOCK_TIME_NONE when unknown/undefined.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The duration of the buffer contents. This duration can be
+ GST_CLOCK_TIME_NONE when unknown/undefined.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Media specific offsets and offset_end. For video this is the
+ frame number in the stream and for audio the sample number. Other
+ definitions for other media exist.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Arbitrary structures via <classname>GstMeta</classname>, see below.
+ </para>
+ </listitem>
+ </itemizedlist>
+
+ <sect2 id="section-allocation-writability" xreflabel="GstBuffer-write">
+ <title>GstBuffer writability</title>
+ <para>
+ A buffer is writable when the refcount of the object is exactly 1, meaning
+ that only one object is holding a ref to the buffer. You can only
+ modify anything in the buffer when the buffer is writable. This means
+ that you need to call <function>gst_buffer_make_writable()</function>
+ before changing the timestamps, offsets, metadata or adding and
+ removing memory blocks.
+ </para>
+ </sect2>
+ <sect2 id="section-allocation-buffer-ex" xreflabel="GstBuffer-ex">
+ <title>GstBuffer API examples</title>
+ <para>
+ You can create a buffer with <function>gst_buffer_new ()</function>
+ and then add memory objects to it or you can use a convenience function
+ <function>gst_buffer_new_allocate ()</function> which combines the
+ two. It's also possible to wrap existing memory with
+ <function>gst_buffer_new_wrapped_full () </function> where you can
+ give the function to call when the memory should be freed.
+ </para>
+ <para>
+ You can access the memory of the buffer by getting and mapping the
+ <classname>GstMemory</classname> objects individually or by using
+ <function>gst_buffer_map ()</function>. The latter merges all the
+ memory into one big block and then gives you a pointer to this block.
+ </para>
+ <para>
+ Below is an example of how to create a buffer and access its memory.
+ </para>
+ <programlisting>
+<![CDATA[
+[...]
+ GstBuffer *buffer;
+ GstMemory *mem;
+ GstMapInfo info;
+
+ /* make empty buffer */
+ buffer = gst_buffer_new ();
+
+ /* make memory holding 100 bytes */
+ mem = gst_allocator_alloc (NULL, 100, NULL);
+
+ /* add the the buffer */
+ gst_buffer_append_memory (buffer, mem);
+
+[...]
+
+ /* get WRITE access to the memory and fill with 0xff */
+ gst_buffer_map (buffer, &info, GST_MAP_WRITE);
+ memset (info.data, 0xff, info.size);
+ gst_buffer_unmap (buffer, &info);
+
+[...]
+
+ /* free the buffer */
+ gst_buffer_unref (buffer);
+
+[...]
+]]>
+ </programlisting>
+ </sect2>
+ </sect1>
+
+ <sect1 id="section-allocation-meta" xreflabel="GstMeta">
+ <title>GstMeta</title>
+ <para>
+ With the <classname>GstMeta</classname> system you can add arbitrary
+ structures of on buffers. These structures describe extra properties
+ of the buffer such as cropping, stride, region of interest etc.
+ </para>
+ <para>
+ Metadata is also used to store, for example, the X image that is
+ backing up the memory of the buffer. This makes it easier for elements
+ to locate the X image from the buffer.
+ </para>
+ <para>
+ The metadata system separates API specification (what the metadata
+ and its API look like) and the implementation (how it works). This makes
+ it possible to make different implementations of the same API,
+ for example, depending on the hardware you are running on.
+ </para>
+
+ <sect2 id="section-allocation-meta-ex" xreflabel="GstMeta-ex">
+ <title>GstMeta API example</title>
+ <para>
+ After allocating a new buffer, you can add metadata to the buffer
+ with the metadata specific API. This means that you will need to
+ link to the header file where the metadata is defined to use
+ its API.
+ </para>
+ <para>
+ By convention, a metadata API with name <classname>FooBar</classname>
+ should provide two methods, a
+ <function>gst_buffer_add_foo_bar_meta ()</function> and a
+ <function>gst_buffer_get_foo_bar_meta ()</function>. Both functions
+ should return a pointer to a <classname>FooBarMeta</classname>
+ structure that contains the metadata fields. Some of the
+ <function>_add_*_meta ()</function> can have extra parameters that
+ will usually be used to configure the metadata structure for you.
+ </para>
+ <para>
+ Let's have a look at the metadata that is used to specify a cropping
+ region for video frames.
+ </para>
+ <programlisting>
+<![CDATA[
+#include <gst/video/gstvideometa.h>
+
+[...]
+ GstVideoCropMeta *meta;
+
+ /* buffer points to a video frame, add some cropping metadata */
+ meta = gst_buffer_add_video_crop_meta (buffer);
+
+ /* configure the cropping metadata */
+ meta->x = 8;
+ meta->y = 8;
+ meta->width = 120;
+ meta->height = 80;
+[...]
+]]>
+ </programlisting>
+ <para>
+ An element can then use the metadata on the buffer when rendering
+ the frame like this:
+ </para>
+ <programlisting>
+<![CDATA[
+#include <gst/video/gstvideometa.h>
+
+[...]
+ GstVideoCropMeta *meta;
+
+ /* buffer points to a video frame, get the cropping metadata */
+ meta = gst_buffer_get_video_crop_meta (buffer);
+
+ if (meta) {
+ /* render frame with cropping */
+ _render_frame_cropped (buffer, meta->x, meta->y, meta->width, meta->height);
+ } else {
+ /* render frame */
+ _render_frame (buffer);
+ }
+[...]
+
+]]>
+ </programlisting>
+ </sect2>
+
+ <sect2 id="section-allocation-meta-new" xreflabel="GstMeta-new">
+ <title>Implementing new GstMeta</title>
+ <para>
+ In the next sections we show how you can add new metadata to the
+ system and use it on buffers.
+ </para>
+
+ <sect3 id="section-allocation-meta-api" xreflabel="GstMeta-api">
+ <title>Define the metadata API</title>
+ <para>
+ First we need to define what our API will look like and we
+ will have to register this API to the system. This is important
+ because this API definition will be used when elements negotiate
+ what kind of metadata they will exchange. The API definition
+ also contains arbitrary tags that give hints about what the
+ metadata contains. This is important when we see how metadata
+ is preserved when buffers pass through the pipeline.
+ </para>
+ <para>
+ If you are making a new implementation of an existing API,
+ you can skip this step and move on to the implementation step.
+ </para>
+ <para>
+ First we start with making the
+ <filename>my-example-meta.h</filename> header file that will contain
+ the definition of the API and structure for our metadata.
+ </para>
+ <programlisting>
+<![CDATA[
+#include <gst/gst.h>
+
+typedef struct _MyExampleMeta MyExampleMeta;
+
+struct _MyExampleMeta {
+ GstMeta meta;
+
+ gint age;
+ gchar *name;
+};
+
+GType my_example_meta_api_get_type (void);
+#define MY_EXAMPLE_META_API_TYPE (my_example_meta_api_get_type())
+
+#define gst_buffer_get_my_example_meta(b) \
+ ((MyExampleMeta*)gst_buffer_get_meta((b),MY_EXAMPLE_META_API_TYPE))
+]]>
+ </programlisting>
+ <para>
+ The metadata API definition consists of the definition of the
+ structure that holds a gint and a string. The first field in
+ the structure must be <classname>GstMeta</classname>.
+ </para>
+ <para>
+ We also define a <function>my_example_meta_api_get_type ()</function>
+ function that will register out metadata API definition. We
+ also define a convenience macro
+ <function>gst_buffer_get_my_example_meta ()</function> that simply
+ finds and returns the metadata with our new API.
+ </para>
+ <para>
+ Next let's have a look at how the
+ <function>my_example_meta_api_get_type ()</function> function is
+ implemented in the <filename>my-example-meta.c</filename> file.
+ </para>
+ <programlisting>
+<![CDATA[
+#include "my-example-meta.h"
+
+GType
+my_example_meta_api_get_type (void)
+{
+ static volatile GType type;
+ static const gchar *tags[] = { "foo", "bar", NULL };
+
+ if (g_once_init_enter (&type)) {
+ GType _type = gst_meta_api_type_register ("MyExampleMetaAPI", tags);
+ g_once_init_leave (&type, _type);
+ }
+ return type;
+}
+]]>
+ </programlisting>
+ <para>
+ As you can see, it simply uses the
+ <function>gst_meta_api_type_register ()</function> function to
+ register a name for the api and some tags. The result is a
+ new pointer GType that defines the newly registered API.
+ </para>
+ </sect3>
+
+ <sect3 id="section-allocation-meta-impl" xreflabel="GstMeta-impl">
+ <title>Implementing a metadata API</title>
+ <para>
+ Next we can make an implementation for a registered metadata
+ API GType. The implementation detail of a metadata API
+ are kept in a <classname>GstMetaInfo</classname> structure
+ that you will make available to the users of your metadata
+ API implementation with a <function>my_example_meta_get_info ()</function>
+ function and a convenience <function>MY_EXAMPLE_META_INFO</function>
+ macro. You will also make a method to add your metadata
+ implementation to a <classname>GstBuffer</classname>.
+ Your <filename>my-example-meta.h</filename> header file will
+ need thse additions:
+ </para>
+ <programlisting>
+<![CDATA[
+[...]
+
+/* implementation */
+const GstMetaInfo *my_example_meta_get_info (void);
+#define MY_EXAMPLE_META_INFO (my_example_meta_get_info())
+
+MyExampleMeta * gst_buffer_add_my_example_meta (GstBuffer *buffer,
+ gint age,
+ const gchar *name);
+]]>
+ </programlisting>
+ <para>
+ Let's have a look at how these functions are
+ implemented in the <filename>my-example-meta.c</filename> file.
+ </para>
+ <programlisting>
+<![CDATA[
+[...]
+
+static gboolean
+my_example_meta_init (GstMeta * meta, gpointer params, GstBuffer * buffer)
+{
+ MyExampleMeta *emeta = (MyExampleMeta *) meta;
+
+ emeta->age = 0;
+ emeta->name = NULL;
+
+ return TRUE;
+}
+
+static gboolean
+my_example_meta_transform (GstBuffer * transbuf, GstMeta * meta,
+ GstBuffer * buffer, GQuark type, gpointer data)
+{
+ MyExampleMeta *emeta = (MyExampleMeta *) meta;
+
+ /* we always copy no matter what transform */
+ gst_buffer_add_my_example_meta (transbuf, emeta->age, emeta->name);
+
+ return TRUE;
+}
+
+static void
+my_example_meta_free (GstMeta * meta, GstBuffer * buffer)
+{
+ MyExampleMeta *emeta = (MyExampleMeta *) meta;
+
+ g_free (emeta->name)
+ emeta->name = NULL;
+}
+
+const GstMetaInfo *
+my_example_meta_get_info (void)
+{
+ static const GstMetaInfo *meta_info = NULL;
+
+ if (g_once_init_enter (&meta_info)) {
+ const GstMetaInfo *mi = gst_meta_register (MY_EXAMPLE_META_API_TYPE,
+ "MyExampleMeta",
+ sizeof (MyExampleMeta),
+ my_example_meta_init,
+ my_example_meta_free,
+ my_example_meta_transform);
+ g_once_init_leave (&meta_info, mi);
+ }
+ return meta_info;
+}
+
+MyExampleMeta *
+gst_buffer_add_my_example_meta (GstBuffer *buffer,
+ gint age,
+ const gchar *name)
+{
+ MyExampleMeta *meta;
+
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), NULL);
+
+ meta = (MyExampleMeta *) gst_buffer_add_meta (buffer,
+ MY_EXAMPLE_META_INFO, NULL);
+
+ meta->age = age;
+ meta->name = g_strdup (name);
+
+ return meta;
+}
+]]>
+ </programlisting>
+ <para>
+ <function>gst_meta_register ()</function> registers the implementation
+ details, like the API that you implement and the size of the
+ metadata structure along with methods to initialize and free the
+ memory area. You can also implement a transform function that will
+ be called when a certain transformation (identified by the quark and
+ quark specific data) is performed on a buffer.
+ </para>
+ <para>
+ Lastly, you implement a <function>gst_buffer_add_*_meta()</function>
+ that adds the metadata implementation to a buffer and sets the
+ values of the metadata.
+ </para>
+ </sect3>
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="section-allocation-bufferpool" xreflabel="GstBufferPool">
+ <title>GstBufferPool</title>
+ <para>
+ The <classname>GstBufferPool</classname> object provides a convenient
+ base class for managing lists of reusable buffers. Essential for this
+ object is that all the buffers have the same properties such as size,
+ padding, metadata and alignment.
+ </para>
+ <para>
+ A bufferpool object can be configured to manage a minimum and maximum
+ amount of buffers of a specific size. A bufferpool can also be
+ configured to use a specific <classname>GstAllocator</classname> for
+ the memory of the buffers. There is support in the bufferpool to enable
+ bufferpool specific options, such as adding <classname>GstMeta</classname>
+ to the buffers in the pool or such as enabling specific padding on
+ the memory in the buffers.
+ </para>
+ <para>
+ A Bufferpool can be inactivate and active. In the inactive state,
+ you can configure the pool. In the active state, you can't change
+ the configuration anymore but you can acquire and release buffers
+ from/to the pool.
+ </para>
+ <para>
+ In the following sections we take a look at how you can use
+ a bufferpool.
+ </para>
+
+ <sect2 id="section-allocation-pool-ex" xreflabel="GstBufferPool-ex">
+ <title>GstBufferPool API example</title>
+ <para>
+ Many different bufferpool implementations can exist; they are all
+ subclasses of the base class <classname>GstBufferPool</classname>.
+ For this example, we will assume we somehow have access to a
+ bufferpool, either because we created it ourselves or because
+ we were given one as a result of the ALLOCATION query as we will
+ see below.
+ </para>
+ <para>
+ The bufferpool is initially in the inactive state so that we can
+ configure it. Trying to configure a bufferpool that is not in the
+ inactive state will fail. Likewise, trying to activate a bufferpool
+ that is not configured will fail.
+ </para>
+ <programlisting>
+<![CDATA[
+ GstStructure *config;
+
+[...]
+
+ /* get config structure */
+ config = gst_buffer_pool_get_config (pool);
+
+ /* set caps, size, minimum and maximum buffers in the pool */
+ gst_buffer_pool_config_set_params (config, caps, size, min, max);
+
+ /* configure allocator and parameters */
+ gst_buffer_pool_config_set_allocator (config, allocator, ¶ms);
+
+ /* store the updated configuration again */
+ gst_buffer_pool_set_config (pool, config);
+
+[...]
+]]>
+ </programlisting>
+ <para>
+ The configuration of the bufferpool is maintained in a generic
+ <classname>GstStructure</classname> that can be obtained with
+ <function>gst_buffer_pool_get_config()</function>. Convenience
+ methods exist to get and set the configuration options in this
+ structure. After updating the structure, it is set as the current
+ configuration in the bufferpool again with
+ <function>gst_buffer_pool_set_config()</function>.
+ </para>
+ <para>
+ The following options can be configured on a bufferpool:
+ </para>
+ <itemizedlist mark="opencircle">
+ <listitem>
+ <para>
+ The caps of the buffers to allocate.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The size of the buffers. This is the suggested size of the
+ buffers in the pool. The pool might decide to allocate larger
+ buffers to add padding.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The minimum and maximum amount of buffers in the pool. When
+ minimum is set to > 0, the bufferpool will pre-allocate this
+ amount of buffers. When maximum is not 0, the bufferpool
+ will allocate up to maximum amount of buffers.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The allocator and parameters to use. Some bufferpools might
+ ignore the allocator and use its internal one.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Other arbitrary bufferpool options identified with a string.
+ a bufferpool lists the supported options with
+ <function>gst_buffer_pool_get_options()</function> and you
+ can ask if an option is supported with
+ <function>gst_buffer_pool_has_option()</function>. The option
+ can be enabled by adding it to the configuration structure
+ with <function>gst_buffer_pool_config_add_option ()</function>.
+ These options are used to enable things like letting the
+ pool set metadata on the buffers or to add extra configuration
+ options for padding, for example.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ After the configuration is set on the bufferpool, the pool can
+ be activated with
+ <function>gst_buffer_pool_set_active (pool, TRUE)</function>. From
+ that point on you can use
+ <function>gst_buffer_pool_acquire_buffer ()</function> to retrieve
+ a buffer from the pool, like this:
+ </para>
+ <programlisting>
+<![CDATA[
+ [...]
+
+ GstFlowReturn ret;
+ GstBuffer *buffer;
+
+ ret = gst_buffer_pool_acquire_buffer (pool, &buffer, NULL);
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ goto pool_failed;
+
+ [...]
+]]>
+ </programlisting>
+ <para>
+ It is important to check the return value of the acquire function
+ because it is possible that it fails: When your
+ element shuts down, it will deactivate the bufferpool and then
+ all calls to acquire will return GST_FLOW_FLUSHNG.
+ </para>
+ <para>
+ All buffers that are acquired from the pool will have their pool
+ member set to the original pool. When the last ref is decremented
+ on the buffer, &GStreamer; will automatically call
+ <function>gst_buffer_pool_release_buffer()</function> to release
+ the buffer back to the pool. You (or any other downstream element)
+ don't need to know if a buffer came from a pool, you can just
+ unref it.
+ </para>
+ </sect2>
+
+ <sect2 id="section-allocation-pool-impl" xreflabel="GstBufferPool-impl">
+ <title>Implementing a new GstBufferPool</title>
+ <para>
+ WRITEME
+ </para>
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="section-allocation-query" xreflabel="GST_QUERY_ALLOCATION">
+ <title>GST_QUERY_ALLOCATION</title>
+ <para>
+ The ALLOCATION query is used to negotiate
+ <classname>GstMeta</classname>, <classname>GstBufferPool</classname>
+ and <classname>GstAllocator</classname> between elements. Negotiation
+ of the allocation strategy is always initiated and decided by a srcpad
+ after it has negotiated a format and before it decides to push buffers.
+ A sinkpad can suggest an allocation strategy but it is ultimately the
+ source pad that will decide based on the suggestions of the downstream
+ sink pad.
+ </para>
+ <para>
+ The source pad will do a GST_QUERY_ALLOCATION with the negotiated caps
+ as a parameter. This is needed so that the downstream element knows
+ what media type is being handled. A downstream sink pad can answer the
+ allocation query with the following results:
+ </para>
+ <itemizedlist mark="opencircle">
+ <listitem>
+ <para>
+ An array of possible <classname>GstBufferPool</classname> suggestions
+ with suggested size, minimum and maximum amount of buffers.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ An array of GstAllocator objects along with suggested allocation
+ parameters such as flags, prefix, alignment and padding. These
+ allocators can also be configured in a bufferpool when this is
+ supported by the bufferpool.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ An array of supported <classname>GstMeta</classname> implementations
+ along with metadata specific parameters.
+ It is important that the upstream element knows what kind of
+ metadata is supported downstream before it places that metadata
+ on buffers.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ When the GST_QUERY_ALLOCATION returns, the source pad will select
+ from the available bufferpools, allocators and metadata how it will
+ allocate buffers.
+ </para>
+
+ <sect2 id="section-allocation-query-ex" xreflabel="Allocation-ex">
+ <title>ALLOCATION query example</title>
+ <para>
+ Below is an example of the ALLOCATION query.
+ </para>
+ <programlisting>
+<![CDATA[
+#include <gst/video/video.h>
+#include <gst/video/gstvideometa.h>
+#include <gst/video/gstvideopool.h>
+
+ GstCaps *caps;
+ GstQuery *query;
+ GstStructure *structure;
+ GstBufferPool *pool;
+ GstStructure *config;
+ guint size, min, max;
+
+[...]
+
+ /* find a pool for the negotiated caps now */
+ query = gst_query_new_allocation (caps, TRUE);
+
+ if (!gst_pad_peer_query (scope->srcpad, query)) {
+ /* query failed, not a problem, we use the query defaults */
+ }
+
+ if (gst_query_get_n_allocation_pools (query) > 0) {
+ /* we got configuration from our peer, parse them */
+ gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max);
+ } else {
+ pool = NULL;
+ size = 0;
+ min = max = 0;
+ }
+
+ if (pool == NULL) {
+ /* we did not get a pool, make one ourselves then */
+ pool = gst_video_buffer_pool_new ();
+ }
+
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META);
+ gst_buffer_pool_config_set_params (config, caps, size, min, max);
+ gst_buffer_pool_set_config (pool, config);
+
+ /* and activate */
+ gst_buffer_pool_set_active (pool, TRUE);
+
+[...]
+]]>
+ </programlisting>
+ <para>
+ This particular implementation will make a custom
+ <classname>GstVideoBufferPool</classname> object that is specialized
+ in allocating video buffers. You can also enable the pool to
+ put <classname>GstVideoMeta</classname> metadata on the buffers from
+ the pool doing
+ <function>gst_buffer_pool_config_add_option (config,
+ GST_BUFFER_POOL_OPTION_VIDEO_META)</function>.
+ </para>
+ </sect2>
+
+ <sect2 id="section-allocation-query-base" xreflabel="Allocation-base">
+ <title>The ALLOCATION query in base classes</title>
+ <para>
+ In many baseclasses you will see the following virtual methods for
+ influencing the allocation strategy:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <function>propose_allocation ()</function> should suggest
+ allocation parameters for the upstream element.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ <function>decide_allocation ()</function> should decide the
+ allocation parameters from the suggestions received from
+ downstream.
+ </para>
+ </listitem>
+ </itemizedlist>
+ <para>
+ Implementors of these methods should modify the given
+ <classname>GstQuery</classname> object by updating the pool options
+ and allocation options.
+ </para>
+ </sect2>
+ </sect1>
+</chapter>
synchronization mechanism.
</para>
- <sect1 id="section-clock-time-types" xreflabel="Types of time">
- <title> Types of time </title>
-
- <para>
- There are two kinds of time in GStreamer. <emphasis
- role="strong">Clock time</emphasis> is an absolute time. By contrast,
- <emphasis role="strong">element time</emphasis> is the relative time,
- usually to the start of the current media stream. The element time
- represents the time that should have a media sample that is being
- processed by the element at this time. The element time is calculated by
- adding an offset to the clock time.
- </para>
- </sect1>
<sect1 id="section-clocks" xreflabel="Clocks">
<title>Clocks</title>
<para>
- GStreamer can use different clocks. Though the system time can be used
- as a clock, soundcards and other devices provides a better time source. For
- this reason some elements provide a clock. The method
- <function>get_clock</function> is implemented in elements that provide
- one.
+ Time in &GStreamer; is defined as the value returned from a particular
+ <classname>GstClock</classname> object from the method
+ <function>gst_clock_get_time ()</function>.
+ </para>
+ <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>
As clocks return an absolute measure of time, they are not usually used
- directly. Instead, a reference to a clock is stored in any element that needs
- it, and it is used internally by GStreamer to calculate the element time.
+ directly. Instead, differences between two clock times are used to
+ measure elapsed time according to a clock.
</para>
</sect1>
-
- <sect1 id="section-time-data-flow" xreflabel="Flow of data between elements
- and time">
- <title>
- Flow of data between elements and time
- </title>
+
+ <sect1 id="section-clock-time-types" xreflabel="Clock running-time">
+ <title> Clock running-time </title>
<para>
- Now we will see how time information travels the pipeline in different states.
+ A clock returns the <emphasis role="strong">absolute-time</emphasis>
+ according to that clock with <function>gst_clock_get_time ()</function>.
+ 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>
- The pipeline starts playing.
- The source element typically knows the time of each sample.
- <footnote>
- <para>
- Sometimes it
- is a parser element the one that knows the time, for instance if a pipeline
- contains a filesrc element connected to a MPEG decoder element, the former
- is the one that knows the time of each sample, because the knowledge of
- when to play each sample is embedded in the MPEG format. In this case this
- element will be regarded as the source element for this discussion.
- </para>
- </footnote>
- First, the source element sends a newsegment event. This event carries information
- about the current relative time of the next sample. This relative time is
- arbitrary, but it must be consistent with the timestamp that will be
- placed in buffers. It is expected to be the relative time to the start
- of the media stream, or whatever makes sense in the case of each media.
- When receiving it, the other elements adjust their offset of the element time so that this
- time matches the time written in the event.
+ 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-time-types" xreflabel="Buffer running-time">
+ <title> Buffer running-time </title>
<para>
- Then the source element sends media samples in buffers. This element places a
- timestamp in each buffer saying when the sample should be played. When the
- buffer reaches the sink pad of the last element, this element compares the
- current element time with the timestamp of the buffer. If the timestamp is
- higher or equal it plays the buffer, otherwise it waits until the time to
- place the buffer arrives with <function>gst_element_wait()</function>.
+ 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>
- If the stream is seeked, the next samples sent will have a timestamp that
- is not adjusted with the element time. Therefore, the source element must
- send a newsegment event.
+ 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>
</sect1>
+
+
<sect1 id="section-clock-obligations-of-each-element" xreflabel="Obligations
of each element">
<title>
</para>
<sect2>
- <title>Source elements </title>
+ <title>Non-live source elements </title>
+ <para>
+ Non-live source elements must place a timestamp in each buffer that
+ they deliver when this is possible. They must choose the timestamps
+ and the values of the SEGMENT event in such a way that the
+ running-time of the buffer starts from 0.
+ </para>
+ <para>
+ Some sources, such as filesrc, is not able to generate timestamps
+ on all buffers. It can and must however create a timestamp on the
+ first buffer (with a running-time of 0).
+ </para>
+ <para>
+ The source then pushes out the SEGMENT event followed by the
+ timestamped buffers.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>Live source elements </title>
+ <para>
+ Live source elements must place a timestamp in each buffer that
+ they deliver. They must choose the timestamps and the values of the
+ SEGMENT event in such a way that the running-time of the buffer
+ matches exactly the running-time of the pipeline clock when the first
+ byte in the buffer was captured.
+ </para>
+ </sect2>
+
+ <sect2>
+ <title>Parser/Decoder/Encoder elements </title>
<para>
- Source elements (or parsers of formats that provide notion of time, such
- as MPEG, as explained above) must place a timestamp in each buffer that
- they deliver. The origin of the time used is arbitrary, but it must
- match the time delivered in the newsegment event (see below).
- However, it is expected that the origin is the origin of the media
- stream.
+ 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>
+
+ <sect2>
+ <title>Demuxer elements </title>
<para>
- In order to initialize the element time of the rest of the pipeline, a
- source element must send a newsegment event before starting to play.
- In addition, after seeking, a newsegment event must be sent, because
- the timestamp of the next element does not match the element time of the
- rest of the pipeline.
+ Demuxer elements can usually set the timestamps stored inside the media
+ file onto the outgoing buffers. They need to make sure that outgoing
+ buffers that are to be played at the same time have the same
+ running-time. Demuxers also need to take into account the incomming
+ timestamps on buffers and use that to calculate an offset on the outgoing
+ 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
method <function>set_clock</function>.
</para>
-
<para>
- In addition, before playing each sample, if the current element time is
- less than the timestamp in the sample, it wait until the current time
- arrives should call <function>gst_element_wait()</function>
- <footnote>
- <para>
- With some schedulers, <function>gst_element_wait()</function>
- blocks the pipeline. For instance, if there is one audio sink element
- and one video sink element, while the audio element is waiting for a
- sample the video element cannot play other sample. This behaviour is
- under discussion, and might change in a future release.
- </para>
- </footnote>
+ The sink should then make sure that the sample with running-time is played
+ 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>
</sect2>
</sect1>
<chapter id="chapter-dparams">
<title>Supporting Dynamic Parameters</title>
+ <para>
+ Warning, this part describes 0.10 and is outdated.
+ </para>
<para>
Sometimes object properties are not powerful enough to control the
parameters that affect the behaviour of your element.
instantly, possibly not in the same thread as the streaming thread that
is processing the buffers, skipping ahead of buffers being processed
or queued in the pipeline). The most common downstream events
- (NEWSEGMENT, EOS, TAG) are all serialised with the buffer flow.
+ (SEGMENT, CAPS, TAG, EOS) are all serialised with the buffer flow.
</para>
<para>
Here is a typical event function:
</para>
<programlisting>
static gboolean
-gst_my_filter_sink_event (GstPad *pad, GstEvent * event)
+gst_my_filter_sink_event (GstPad *pad, GstObject * parent, GstEvent * event)
{
GstMyFilter *filter;
gboolean ret;
- filter = GST_MY_FILTER (gst_pad_get_parent (pad));
+ filter = GST_MY_FILTER (parent);
...
switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_NEWSEGMENT:
+ case GST_EVENT_SEGMENT:
/* maybe save and/or update the current segment (e.g. for output
* clipping) or convert the event into one in a different format
- * (e.g. BYTES to TIME) or drop it and set a flag to send a newsegment
+ * (e.g. BYTES to TIME) or drop it and set a flag to send a segment
* event in a different format later */
ret = gst_pad_push_event (filter->src_pad, event);
break;
ret = gst_pad_push_event (filter->src_pad, event);
break;
default:
- ret = gst_pad_event_default (pad, event);
+ ret = gst_pad_event_default (pad, parent, event);
break;
}
...
- gst_object_unref (filter);
return ret;
}
</programlisting>
<para>
If your element is chain-based, you will almost always have to implement
a sink event function, since that is how you are notified about
- new segments and the end of the stream.
+ segments, caps and the end of the stream.
</para>
<para>
If your element is exclusively loop-based, you may or may not want a
will then in turn generate an upstream seek event.
</para>
<para>
- The most common upstream events are seek events and Quality-of-Service
- (QoS) events.
+ The most common upstream events are seek events, Quality-of-Service
+ (QoS) and reconfigure events.
</para>
<para>
An upstream event can be sent using the
<function>gst_pad_send_event</function> function. This
function simply call the default event handler of that pad. The default
event handler of pads is <function>gst_pad_event_default</function>, and
- it basically sends the event to the peer pad. So upstream events always
- arrive on the src pad of your element and are handled by the default event
- handler except if you override that handler to handle it yourself. There
- are some specific cases where you have to do that :
+ it basically sends the event to the peer of the internally linked pad.
+ So upstream events always arrive on the src pad of your element and are
+ handled by the default event handler except if you override that handler
+ to handle it yourself. There are some specific cases where you have to
+ do that :
</para>
<itemizedlist mark="opencircle">
<listitem>
<itemizedlist mark="opencircle">
<listitem>
<para>
- Always forward events you won't handle upstream using the default
- <function>gst_pad_event_default</function> method.
+ Always handle events you won't handle using the default
+ <function>gst_pad_event_default</function> method. This method will
+ depending on the event, forward the event or drop it.
</para>
</listitem>
<listitem>
<para>
Remember that the event handler might be called from a different
thread than the streaming thread, so make sure you use
- appropriate locking everywhere and at the beginning of the function
- obtain a reference to your element via the
- <function>gst_pad_get_parent()</function> (and release it again at
- the end of the function with <function>gst_object_unref ()</function>.
+ appropriate locking everywhere.
</para>
</listitem>
</itemizedlist>
In this chapter, we will discuss the following events:
</para>
<itemizedlist>
+ <listitem><para><xref linkend="section-events-stream-start"/></para></listitem>
+ <listitem><para><xref linkend="section-events-caps"/></para></listitem>
+ <listitem><para><xref linkend="section-events-segment"/></para></listitem>
+ <listitem><para><xref linkend="section-events-tag"/></para></listitem>
<listitem><para><xref linkend="section-events-eos"/></para></listitem>
+ <listitem><para><xref linkend="section-events-toc"/></para></listitem>
+ <listitem><para><xref linkend="section-events-gap"/></para></listitem>
<listitem><para><xref linkend="section-events-flush-start"/></para></listitem>
<listitem><para><xref linkend="section-events-flush-stop"/></para></listitem>
- <listitem><para><xref linkend="section-events-newsegment"/></para></listitem>
+ <listitem><para><xref linkend="section-events-qos"/></para></listitem>
<listitem><para><xref linkend="section-events-seek"/></para></listitem>
<listitem><para><xref linkend="section-events-nav"/></para></listitem>
- <listitem><para><xref linkend="section-events-tag"/></para></listitem>
</itemizedlist>
<para>
For more comprehensive information about events and how they should be
design documentation. This section only gives a general overview.
</para>
+ <sect2 id="section-events-stream-start" xreflabel="Stream Start">
+ <title>Stream Start</title>
+ <para>
+ WRITEME
+ </para>
+ </sect2>
+
+ <sect2 id="section-events-caps" xreflabel="Caps">
+ <title>Caps</title>
+ <para>
+ The CAPS event contains the format description of the following
+ buffers. See <xref linkend="chapter-negotiation"/> for more
+ information about negotiation.
+ </para>
+ </sect2>
+
+ <sect2 id="section-events-segment" xreflabel="Segment">
+ <title>Segment</title>
+ <para>
+ A segment event is sent downstream to announce the range of valid
+ timestamps in the stream and how they should be transformed into
+ running-time and stream-time. A segment event must always be sent
+ before the first buffer of data and after a flush (see above).
+ </para>
+ <para>
+ The first segment event is created by the element driving the
+ pipeline, like a source operating in push-mode or a demuxer/decoder
+ operating pull-based. This segment event then travels down the
+ pipeline and may be transformed on the way (a decoder, for example,
+ might receive a segment event in BYTES format and might transform
+ this into a segment event in TIMES format based on the average
+ bitrate).
+ </para>
+ <para>
+ Depending on the element type, the event can simply be forwarded using
+ <function>gst_pad_event_default ()</function>, or it should be parsed
+ and a modified event should be sent on. The last is true for demuxers,
+ which generally have a byte-to-time conversion concept. Their input
+ is usually byte-based, so the incoming event will have an offset in
+ byte units (<symbol>GST_FORMAT_BYTES</symbol>), too. Elements
+ downstream, however, expect segment events in time units, so that
+ it can be used to synchronize against the pipeline clock. Therefore,
+ demuxers and similar elements should not forward the event, but parse
+ it, free it and send a segment event (in time units,
+ <symbol>GST_FORMAT_TIME</symbol>) further downstream.
+ </para>
+ <para>
+ The segment event is created using the function
+ <function>gst_event_new_segment ()</function>. See the API
+ reference and design document for details about its parameters.
+ </para>
+ <para>
+ Elements parsing this event can use gst_event_parse_segment()
+ to extract the event details. Elements may find the GstSegment
+ API useful to keep track of the current segment (if they want to use
+ it for output clipping, for example).
+ </para>
+ </sect2>
+
+ <sect2 id="section-events-tag" xreflabel="Tag (metadata)">
+ <title>Tag (metadata)</title>
+ <para>
+ Tagging events are being sent downstream to indicate the tags as parsed
+ from the stream data. This is currently used to preserve tags during
+ stream transcoding from one format to the other. Tags are discussed
+ extensively in <xref linkend="chapter-advanced-tagging"/>. Most
+ elements will simply forward the event by calling
+ <function>gst_pad_event_default ()</function>.
+ </para>
+ <para>
+ The tag event is created using the function
+ <function>gst_event_new_tag ()</function>, but more often elements will
+ send a tag event downstream that will be converted into a message
+ on the bus by sink elements.
+ All of these functions require a filled-in taglist as
+ argument, which they will take ownership of.
+ </para>
+ <para>
+ Elements parsing this event can use the function
+ <function>gst_event_parse_tag ()</function> to acquire the
+ taglist that the event contains.
+ </para>
+ </sect2>
+
<sect2 id="section-events-eos" xreflabel="End of Stream (EOS)">
<title>End of Stream (EOS)</title>
<para>
on the bus depending on the mode of operation). If you are implementing
your own source element, you also do not need to ever manually send
an EOS event, you should also just return GST_FLOW_EOS in
- your create function (assuming your element derives from GstBaseSrc
- or GstPushSrc).
+ your create or fill function (assuming your element derives from
+ GstBaseSrc or GstPushSrc).
+ </para>
+ </sect2>
+
+ <sect2 id="section-events-toc" xreflabel="Table Of Contents">
+ <title>Table Of Contents</title>
+ <para>
+ WRITEME
+ </para>
+ </sect2>
+
+ <sect2 id="section-events-gap" xreflabel="Gap">
+ <title>Gap</title>
+ <para>
+ WRITEME
</para>
</sect2>
<sect2 id="section-events-flush-start" xreflabel="Flush Start">
<title>Flush Start</title>
<para>
- The flush start event is sent downstream if all buffers and caches
- in the pipeline should be emptied. <quote>Queue</quote> elements will
+ The flush start event is sent downstream (in push mode) or upstream
+ (in pull mode) if all buffers and caches in the pipeline should be
+ emptied. <quote>Queue</quote> elements will
empty their internal list of buffers when they receive this event, for
example. File sink elements (e.g. <quote>filesink</quote>) will flush
the kernel-to-disk cache (<function>fdatasync ()</function> or
The flush-stop event is sent by an element driving the pipeline
after a flush-start and tells pads and elements downstream that
they should accept events and buffers again (there will be at
- least a NEWSEGMENT event before any buffers first though).
+ least a SEGMENT event before any buffers first though).
</para>
<para>
If your element keeps temporary caches of stream data, it should
</para>
<para>
The flush-stop event is created with
- <function>gst_event_new_flush_stop ()</function>. Like the EOS event,
- it has no properties.
+ <function>gst_event_new_flush_stop ()</function>. It has one
+ parameter that controls if the running-time of the pipeline should
+ be reset to 0 or not. Normally aftera flushing seek, the
+ running_time is set back to 0.
</para>
</sect2>
- <sect2 id="section-events-newsegment" xreflabel="New Segment">
- <title>New Segment</title>
- <para>
- A new segment event is sent downstream to either announce a new
- segment of data in the data stream or to update the current segment
- with new values. A new segment event must always be sent before the
- first buffer of data and after a flush (see above).
- </para>
- <para>
- The first new segment event is created by the element driving the
- pipeline, like a source operating in push-mode or a demuxer/decoder
- operating pull-based. This new segment event then travels down the
- pipeline and may be transformed on the way (a decoder, for example,
- might receive a new-segment event in BYTES format and might transform
- this into a new-segment event in TIMES format based on the average
- bitrate).
- </para>
+ <sect2 id="section-events-qos" xreflabel="Quality Of Service (QOS)">
+ <title>Quality Of Service (QOS)</title>
<para>
- New segment events may also be used to indicate 'gaps' in the stream,
- like in a subtitle stream for example where there may not be any
- data at all for a considerable amount of (stream) time. This is done
- by updating the segment start of the current segment (see the design
- documentation for more details).
- </para>
- <para>
- Depending on the element type, the event can simply be forwarded using
- <function>gst_pad_event_default ()</function>, or it should be parsed
- and a modified event should be sent on. The last is true for demuxers,
- which generally have a byte-to-time conversion concept. Their input
- is usually byte-based, so the incoming event will have an offset in
- byte units (<symbol>GST_FORMAT_BYTES</symbol>), too. Elements
- downstream, however, expect new segment events in time units, so that
- it can be used to update the pipeline clock. Therefore, demuxers and
- similar elements should not forward the event, but parse it, free it
- and send a new newsegment event (in time units,
- <symbol>GST_FORMAT_TIME</symbol>) further downstream.
- </para>
- <para>
- The newsegment event is created using the function
- <function>gst_event_new_new_segment ()</function>. See the API
- reference and design document for details about its parameters.
- </para>
- <para>
- Elements parsing this event can use gst_event_parse_new_segment_full()
- to extract the event details. Elements may find the GstSegment
- API useful to keep track of the current segment (if they want to use
- it for output clipping, for example).
+ 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>
This new position can be set in several formats (time, bytes or
<quote>default units</quote> [a term indicating frames for video,
channel-independent samples for audio, etc.]). Seeking can be done with
- respect to the end-of-file, start-of-file or current position, and
+ respect to the end-of-file or start-of-file, and
usually happens in upstream direction (downstream seeking is done by
- sending a NEWSEGMENT event with the appropriate offsets for elements
+ sending a SEGMENT event with the appropriate offsets for elements
that support that, like filesink).
</para>
<para>
Seek events are built up using positions in specified formats (time,
bytes, units). They are created using the function
<function>gst_event_new_seek ()</function>. Note that many plugins do
- not support seeking from the end of the stream or from the current
- position. An element not driving the pipeline and forwarding a seek
+ not support seeking from the end of the stream.
+ An element not driving the pipeline and forwarding a seek
request should not assume that the seek succeeded or actually happened,
- it should operate based on the NEWSEGMENT events it receives.
+ it should operate based on the SEGMENT events it receives.
</para>
<para>
Elements parsing this event can do this using
</para>
</sect2>
- <sect2 id="section-events-tag" xreflabel="Tag (metadata)">
- <title>Tag (metadata)</title>
- <para>
- Tagging events are being sent downstream to indicate the tags as parsed
- from the stream data. This is currently used to preserve tags during
- stream transcoding from one format to the other. Tags are discussed
- extensively in <xref linkend="chapter-advanced-tagging"/>. Most
- elements will simply forward the event by calling
- <function>gst_pad_event_default ()</function>.
- </para>
- <para>
- The tag event is created using the function
- <function>gst_event_new_tag ()</function>, but more often elements will
- use either the <function>gst_element_found_tags ()</function> function
- or the <function>gst_element_found_tags_for_pad ()</function>, which
- will do both: post a tag message on the bus and send a tag event
- downstream. All of these functions require a filled-in taglist as
- argument, which they will take ownership of.
- </para>
- <para>
- Elements parsing this event can use the function
- <function>gst_event_parse_tag ()</function> to acquire the
- taglist that the event contains.
- </para>
- </sect2>
</sect1>
</chapter>
to achieve this. The basis of this all is the glib
<classname>GTypeInterface</classname> type. For each case where we think
it's useful, we've created interfaces which can be implemented by elements
- at their own will. We've also created a small extension to
- <classname>GTypeInterface</classname> (which is static itself, too) which
- allows us to query for interface availability based on runtime properties.
- This extension is called <ulink type="http"
- url="../../gstreamer/html/GstImplementsInterface.html"><classname>
- GstImplementsInterface</classname></ulink>.
+ at their own will.
</para>
<para>
One important note: interfaces do <emphasis>not</emphasis> replace
properties. Rather, interfaces should be built <emphasis>next to</emphasis>
properties. There are two important reasons for this. First of all,
- properties
- can be saved in XML files. Second, properties can be specified on the
- commandline (<filename>gst-launch</filename>).
+ properties can be more easily introspected. Second, properties can be
+ specified on the commandline (<filename>gst-launch</filename>).
</para>
<sect1 id="section-iface-general" xreflabel="How to Implement Interfaces">
registered the type itself. Some interfaces have dependencies on other
interfaces or can only be registered by certain types of elements. You
will be notified of doing that wrongly when using the element: it will
- quit with failed assertions, which will explain what went wrong. In the
- case of GStreamer, the only dependency that <emphasis>some</emphasis>
- interfaces have is <ulink type="http"
- url="../../gstreamer/html/GstImplementsInterface.html"><classname>
- GstImplementsInterface</classname></ulink>. Per
- interface, we will indicate clearly when it depends on this extension.
+ quit with failed assertions, which will explain what went wrong.
If it does, you need to register support for <emphasis>that</emphasis>
interface before registering support for the interface that you're
wanting to support. The example below explains how to add support for a
- simple interface with no further dependencies. For a small explanation
- on <ulink type="http" url="../../gstreamer/html/GstImplementsInterface.html">
- <classname>GstImplementsInterface</classname></ulink>, see the next section
- about the mixer interface: <xref linkend="section-iface-mixer"/>.
+ simple interface with no further dependencies.
</para>
<programlisting>
static void gst_my_filter_some_interface_init (GstSomeInterface *iface);
if (!my_filter_type) {
static const GTypeInfo my_filter_info = {
sizeof (GstMyFilterClass),
- (GBaseInitFunc) gst_my_filter_base_init,
+ NULL,
NULL,
(GClassInitFunc) gst_my_filter_class_init,
NULL,
};
my_filter_type =
- g_type_register_static (GST_TYPE_MY_FILTER,
+ g_type_register_static (GST_TYPE_ELEMENT,
"GstMyFilter",
&my_filter_info, 0);
g_type_add_interface_static (my_filter_type,
/* here, you would set virtual function pointers in the interface */
}
</programlisting>
- </sect1>
-
- <sect1 id="section-iface-uri" xreflabel="URI interface">
- <title>URI interface</title>
- <para>
- WRITEME
- </para>
- </sect1>
-
- <sect1 id="section-iface-mixer" xreflabel="Mixer Interface">
- <title>Mixer Interface</title>
- <para>
- The goal of the mixer interface is to provide a simple yet powerful API
- to applications for audio hardware mixer/volume control. Most soundcards
- have hardware mixers, where volume can be changed, they can be muted,
- inputs can be modified to mix their content into what will be read from
- the device by applications (in our case: audio source plugins). The
- mixer interface is the way to control those. The mixer interface can
- also be used for volume control in software (e.g. the <quote>volume</quote>
- element). The end goal of this interface is to allow development of
- hardware volume control applications and for the control of audio volume
- and input/output settings.
- </para>
<para>
- The mixer interface requires the <ulink type="http"
- url="../../gstreamer/html/GstImplementsInterface.html"><classname>
- GstImplementsInterface</classname></ulink>
- interface to be implemented by the element. The example below will
- feature both, so it serves as an example for the <ulink type="http"
- url="../../gstreamer/html/GstImplementsInterface.html"><classname>
- GstImplementsInterface</classname></ulink>, too. In this
- interface, it is required to set a function pointer for the <function>
- supported ()</function> function.
- If you don't, this function will always return FALSE (default
- implementation) and the mixer interface implementation will not work. For
- the mixer interface, the only required function is
- <function>list_tracks ()</function>. All other function pointers in the
- mixer interface are optional, although it is strongly recommended to set
- function pointers for at least the <function>get_volume ()</function> and
- <function>set_volume ()</function> functions. The API reference for this
- interface documents the goal of each function, so we will limit ourselves
- to the implementation here.
- </para>
- <para>
- The following example shows a mixer implementation for a software N-to-1
- element. It does not show the actual process of stream mixing, that is
- far too complicated for this guide.
+ Or more conveniently:
</para>
<programlisting>
-#include <gst/mixer/mixer.h>
-
-typedef struct _GstMyFilter {
-[..]
- gint volume;
- GList *tracks;
-} GstMyFilter;
-
-static void gst_my_filter_implements_interface_init (GstImplementsInterfaceClass *iface);
-static void gst_my_filter_mixer_interface_init (GstMixerClass *iface);
-
-GType
-gst_my_filter_get_type (void)
-{
-[..]
- static const GInterfaceInfo implements_interface_info = {
- (GInterfaceInitFunc) gst_my_filter_implements_interface_init,
- NULL,
- NULL
- };
- static const GInterfaceInfo mixer_interface_info = {
- (GInterfaceInitFunc) gst_my_filter_mixer_interface_init,
- NULL,
- NULL
- };
-[..]
- g_type_add_interface_static (my_filter_type,
- GST_TYPE_IMPLEMENTS_INTERFACE,
- &implements_interface_info);
- g_type_add_interface_static (my_filter_type,
- GST_TYPE_MIXER,
- &mixer_interface_info);
-[..]
-}
-
-static void
-gst_my_filter_init (GstMyFilter *filter)
-{
- GstMixerTrack *track = NULL;
-[..]
- filter->volume = 100;
- filter->tracks = NULL;
- track = g_object_new (GST_TYPE_MIXER_TRACK, NULL);
- track->label = g_strdup ("MyTrack");
- track->num_channels = 1;
- track->min_volume = 0;
- track->max_volume = 100;
- track->flags = GST_MIXER_TRACK_SOFTWARE;
- filter->tracks = g_list_append (filter->tracks, track);
-}
-
-static gboolean
-gst_my_filter_interface_supported (GstImplementsInterface *iface,
- GType iface_type)
-{
- g_return_val_if_fail (iface_type == GST_TYPE_MIXER, FALSE);
-
- /* for the sake of this example, we'll always support it. However, normally,
- * you would check whether the device you've opened supports mixers. */
- return TRUE;
-}
-
-static void
-gst_my_filter_implements_interface_init (GstImplementsInterfaceClass *iface)
-{
- iface->supported = gst_my_filter_interface_supported;
-}
-
-/*
- * This function returns the list of support tracks (inputs, outputs)
- * on this element instance. Elements usually build this list during
- * _init () or when going from NULL to READY.
- */
-
-static const GList *
-gst_my_filter_mixer_list_tracks (GstMixer *mixer)
-{
- GstMyFilter *filter = GST_MY_FILTER (mixer);
-
- return filter->tracks;
-}
-
-/*
- * Set volume. volumes is an array of size track->num_channels, and
- * each value in the array gives the wanted volume for one channel
- * on the track.
- */
-
-static void
-gst_my_filter_mixer_set_volume (GstMixer *mixer,
- GstMixerTrack *track,
- gint *volumes)
-{
- GstMyFilter *filter = GST_MY_FILTER (mixer);
-
- filter->volume = volumes[0];
-
- g_print ("Volume set to %d\n", filter->volume);
-}
-
-static void
-gst_my_filter_mixer_get_volume (GstMixer *mixer,
- GstMixerTrack *track,
- gint *volumes)
-{
- GstMyFilter *filter = GST_MY_FILTER (mixer);
-
- volumes[0] = filter->volume;
-}
+static void gst_my_filter_some_interface_init (GstSomeInterface *iface);
-static void
-gst_my_filter_mixer_interface_init (GstMixerClass *iface)
-{
- /* the mixer interface requires a definition of the mixer type:
- * hardware or software? */
- GST_MIXER_TYPE (iface) = GST_MIXER_SOFTWARE;
+G_DEFINE_TYPE_WITH_CODE (GstMyFilter, gst_my_filter,GST_TYPE_ELEMENT,
+ G_IMPLEMENT_INTERFACE (GST_TYPE_SOME_INTERFACE,
+ gst_my_filter_some_interface_init));
- /* virtual function pointers */
- iface->list_tracks = gst_my_filter_mixer_list_tracks;
- iface->set_volume = gst_my_filter_mixer_set_volume;
- iface->get_volume = gst_my_filter_mixer_get_volume;
-}
</programlisting>
- <para>
- The mixer interface is very audio-centric. However, with the software
- flag set, the mixer can be used to mix any kind of stream in a N-to-1
- element to join (not aggregate!) streams together into one output stream.
- Conceptually, that's called mixing too. You can always use the element
- factory's <quote>category</quote> to indicate type of your element. In
- a software element that mixes random streams, you would not be required
- to implement the <function>_get_volume ()</function> or
- <function>_set_volume ()</function> functions. Rather, you would only
- implement the <function>_set_record ()</function> to enable or disable
- tracks in the output stream. to make sure that a mixer-implementing
- element is of a certain type, check the element factory's category.
- </para>
</sect1>
- <sect1 id="section-iface-tuner" xreflabel="Tuner Interface">
- <title>Tuner Interface</title>
- <para>
- As opposed to the mixer interface, that's used to join together N streams
- into one output stream by mixing all streams together, the tuner
- interface is used in N-to-1 elements too, but instead of mixing the input
- streams, it will select one stream and push the data of that stream to
- the output stream. It will discard the data of all other streams. There
- is a flag that indicates whether this is a software-tuner (in which case
- it is a pure software implementation, with N sink pads and 1 source pad)
- or a hardware-tuner, in which case it only has one source pad, and the
- whole stream selection process is done in hardware. The software case can
- be used in elements such as <emphasis>switch</emphasis>. The hardware
- case can be used in elements with channel selection, such as video source
- elements (v4lsrc, v4l2src, etc.). If you need a specific element type,
- use the element factory's <quote>category</quote> to make sure that the
- element is of the type that you need. Note that the interface itself is
- highly analog-video-centric.
- </para>
- <para>
- This interface requires the <ulink type="http"
- url="../../gstreamer/html/GstImplementsInterface.html"><classname>
- GstImplementsInterface</classname></ulink>
- interface to work correctly.
- </para>
- <para>
- The following example shows how to implement the tuner interface in an
- element. It does not show the actual process of stream selection, that
- is irrelevant for this section.
- </para>
- <programlisting>
-#include <gst/tuner/tuner.h>
-
-typedef struct _GstMyFilter {
-[..]
- gint active_input;
- GList *channels;
-} GstMyFilter;
-
-static void gst_my_filter_implements_interface_init (GstImplementsInterfaceClass *iface);
-static void gst_my_filter_tuner_interface_init (GstTunerClass *iface);
-
-GType
-gst_my_filter_get_type (void)
-{
-[..]
- static const GInterfaceInfo implements_interface_info = {
- (GInterfaceInitFunc) gst_my_filter_implements_interface_init,
- NULL,
- NULL
- };
- static const GInterfaceInfo tuner_interface_info = {
- (GInterfaceInitFunc) gst_my_filter_tuner_interface_init,
- NULL,
- NULL
- };
-[..]
- g_type_add_interface_static (my_filter_type,
- GST_TYPE_IMPLEMENTS_INTERFACE,
- &implements_interface_info);
- g_type_add_interface_static (my_filter_type,
- GST_TYPE_TUNER,
- &tuner_interface_info);
-[..]
-}
-
-static void
-gst_my_filter_init (GstMyFilter *filter)
-{
- GstTunerChannel *channel = NULL;
-[..]
- filter->active_input = 0;
- filter->channels = NULL;
- channel = g_object_new (GST_TYPE_TUNER_CHANNEL, NULL);
- channel->label = g_strdup ("MyChannel");
- channel->flags = GST_TUNER_CHANNEL_INPUT;
- filter->channels = g_list_append (filter->channels, channel);
-}
-
-static gboolean
-gst_my_filter_interface_supported (GstImplementsInterface *iface,
- GType iface_type)
-{
- g_return_val_if_fail (iface_type == GST_TYPE_TUNER, FALSE);
-
- /* for the sake of this example, we'll always support it. However, normally,
- * you would check whether the device you've opened supports tuning. */
- return TRUE;
-}
-
-static void
-gst_my_filter_implements_interface_init (GstImplementsInterfaceClass *iface)
-{
- iface->supported = gst_my_filter_interface_supported;
-}
-
-static const GList *
-gst_my_filter_tuner_list_channels (GstTuner *tuner)
-{
- GstMyFilter *filter = GST_MY_FILTER (tuner);
-
- return filter->channels;
-}
-
-static GstTunerChannel *
-gst_my_filter_tuner_get_channel (GstTuner *tuner)
-{
- GstMyFilter *filter = GST_MY_FILTER (tuner);
-
- return g_list_nth_data (filter->channels,
- filter->active_input);
-}
-
-static void
-gst_my_filter_tuner_set_channel (GstTuner *tuner,
- GstTunerChannel *channel)
-{
- GstMyFilter *filter = GST_MY_FILTER (tuner);
-
- filter->active_input = g_list_index (filter->channels, channel);
- g_assert (filter->active_input >= 0);
-}
-
-static void
-gst_my_filter_tuner_interface_init (GstTunerClass *iface)
-{
- iface->list_channels = gst_my_filter_tuner_list_channels;
- iface->get_channel = gst_my_filter_tuner_get_channel;
- iface->set_channel = gst_my_filter_tuner_set_channel;
-}
- </programlisting>
+ <sect1 id="section-iface-uri" xreflabel="URI interface">
+ <title>URI interface</title>
<para>
- As said, the tuner interface is very analog video-centric. It features
- functions for selecting an input or output, and on inputs, it features
- selection of a tuning frequency if the channel supports frequency-tuning
- on that input. Likewise, it allows signal-strength-acquiring if the input
- supports that. Frequency tuning can be used for radio or cable-TV tuning.
- Signal-strength is an indication of the signal and can be used for
- visual feedback to the user or for autodetection. Next to that, it also
- features norm selection, which is only useful for analog video elements.
+ WRITEME
</para>
</sect1>
</para>
</sect1>
- <sect1 id="section-iface-propprobe" xreflabel="Property Probe Interface">
- <title>Property Probe Interface</title>
- <para>
- Property probing is a generic solution to the problem that properties'
- value lists in an enumeration are static. We've shown enumerations in
- <xref linkend="chapter-building-args"/>. Property probing tries to accomplish
- a goal similar to enumeration lists: to have a limited, explicit list of
- allowed values for a property. There are two differences between
- enumeration lists and probing. Firstly, enumerations only allow strings
- as values; property probing works for any value type. Secondly, the
- contents of a probed list of allowed values may change during the life
- of an element. The contents of an enumeration list are static. Currently,
- property probing is being used for detection of devices (e.g. for OSS
- elements, Video4linux elements, etc.). It could - in theory - be used
- for any property, though.
- </para>
- <para>
- Property probing stores the list of allowed (or recommended) values in a
- <classname>GValueArray</classname> and returns that to the user.
- <symbol>NULL</symbol> is a valid return value, too. The process of
- property probing is separated over two virtual functions: one for probing
- the property to create a <classname>GValueArray</classname>, and one to
- retrieve the current <classname>GValueArray</classname>. Those two are
- separated because probing might take a long time (several seconds). Also,
- this simplifies interface implementation in elements. For the application,
- there are functions that wrap those two. For more information on this,
- have a look at the API reference for the
- <!-- FIXME: add link, but this is in ./gst-plugins/gst-libs/gst/propertyprobe/propertyprobe.c-->
- <classname>GstPropertyProbe</classname> interface.
- </para>
- <para>
- Below is a example of property probing for the audio filter element; it
- will probe for allowed values for the <quote>silent</quote> property.
- Indeed, this value is a <type>gboolean</type> so it doesn't
- make much sense. Then again, it's only an example.
- </para>
- <programlisting>
-#include <gst/propertyprobe/propertyprobe.h>
-
-static void gst_my_filter_probe_interface_init (GstPropertyProbeInterface *iface);
-
-GType
-gst_my_filter_get_type (void)
-{
-[..]
- static const GInterfaceInfo probe_interface_info = {
- (GInterfaceInitFunc) gst_my_filter_probe_interface_init,
- NULL,
- NULL
- };
-[..]
- g_type_add_interface_static (my_filter_type,
- GST_TYPE_PROPERTY_PROBE,
- &probe_interface_info);
-[..]
-}
-
-static const GList *
-gst_my_filter_probe_get_properties (GstPropertyProbe *probe)
-{
- GObjectClass *klass = G_OBJECT_GET_CLASS (probe);
- static GList *props = NULL;
-
- if (!props) {
- GParamSpec *pspec;
-
- pspec = g_object_class_find_property (klass, "silent");
- props = g_list_append (props, pspec);
- }
-
- return props;
-}
-
-static gboolean
-gst_my_filter_probe_needs_probe (GstPropertyProbe *probe,
- guint prop_id,
- const GParamSpec *pspec)
-{
- gboolean res = FALSE;
-
- switch (prop_id) {
- case ARG_SILENT:
- res = FALSE;
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec);
- break;
- }
-
- return res;
-}
-
-static void
-gst_my_filter_probe_probe_property (GstPropertyProbe *probe,
- guint prop_id,
- const GParamSpec *pspec)
-{
- switch (prop_id) {
- case ARG_SILENT:
- /* don't need to do much here... */
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec);
- break;
- }
-}
-
-static GValueArray *
-gst_my_filter_get_silent_values (GstMyFilter *filter)
-{
- GValueArray *array = g_value_array_new (2);
- GValue value = { 0 };
-
- g_value_init (&value, G_TYPE_BOOLEAN);
-
- /* add TRUE */
- g_value_set_boolean (&value, TRUE);
- g_value_array_append (array, &value);
-
- /* add FALSE */
- g_value_set_boolean (&value, FALSE);
- g_value_array_append (array, &value);
-
- g_value_unset (&value);
-
- return array;
-}
-
-static GValueArray *
-gst_my_filter_probe_get_values (GstPropertyProbe *probe,
- guint prop_id,
- const GParamSpec *pspec)
-{
- GstMyFilter *filter = GST_MY_FILTER (probe);
- GValueArray *array = NULL;
-
- switch (prop_id) {
- case ARG_SILENT:
- array = gst_my_filter_get_silent_values (filter);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec);
- break;
- }
-
- return array;
-}
-
-static void
-gst_my_filter_probe_interface_init (GstPropertyProbeInterface *iface)
-{
- iface->get_properties = gst_my_filter_probe_get_properties;
- iface->needs_probe = gst_my_filter_probe_needs_probe;
- iface->probe_property = gst_my_filter_probe_probe_property;
- iface->get_values = gst_my_filter_probe_get_values;
-}
- </programlisting>
- <para>
- You don't need to support any functions for getting or setting values.
- All that is handled via the standard <classname>GObject</classname>
- <function>_set_property ()</function> and <function>_get_property ()</function>
- functions.
- </para>
- </sect1>
-
- <sect1 id="section-iface-xoverlay" xreflabel="X Overlay Interface">
- <title>X Overlay Interface</title>
- <para>
- An X Overlay is basically a video output in a XFree86 drawable. Elements
- implementing this interface will draw video in a X11 window. Through this
- interface, applications will be proposed 2 different modes to work with
- a plugin implementing it. The first mode is a passive mode where the plugin
- owns, creates and destroys the X11 window. The second mode is an active
- mode where the application handles the X11 window creation and then tell
- the plugin where it should output video. Let's get a bit deeper in those
- modes...
- </para>
- <para>
- A plugin drawing video output in a X11 window will need to have that
+ <sect1 id="section-iface-xoverlay" xreflabel="Video Overlay Interface">
+ <title>Video Overlay Interface</title>
+ <para>
+ The #GstVideoOverlay interface is used for 2 main purposes :
+ <itemizedlist>
+ <listitem>
+ <para>
+ To get a grab on the Window where the video sink element is going to render.
+ This is achieved by either being informed about the Window identifier that
+ the video sink element generated, or by forcing the video sink element to use
+ a specific Window identifier for rendering.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ To force a redrawing of the latest video frame the video sink element
+ displayed on the Window. Indeed if the #GstPipeline is in #GST_STATE_PAUSED
+ state, moving the Window around will damage its content. Application
+ developers will want to handle the Expose events themselves and force the
+ video sink element to refresh the Window's content.
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ A plugin drawing video output in a video window will need to have that
window at one stage or another. Passive mode simply means that no window
has been given to the plugin before that stage, so the plugin created the
window by itself. In that case the plugin is responsible of destroying
that window when it's not needed any more and it has to tell the
applications that a window has been created so that the application can
- use it. This is done using the <classname>have_xwindow_id</classname>
- signal that can be emitted from the plugin with the
- <function>gst_x_overlay_got_xwindow_id</function> method.
+ use it. This is done using the <classname>have-window-handle</classname>
+ message that can be posted from the plugin with the
+ <function>gst_video_overlay_got_window_handle</function> method.
</para>
<para>
- As you probably guessed already active mode just means sending a X11
+ As you probably guessed already active mode just means sending a video
window to the plugin so that video output goes there. This is done using
- the <function>gst_x_overlay_set_xwindow_id</function> method.
+ the <function>gst_video_overlay_set_window_handle</function> method.
</para>
<para>
It is possible to switch from one mode to another at any moment, so the
</para>
<programlisting><![CDATA[
static void
-gst_my_filter_set_xwindow_id (GstXOverlay *overlay, XID xwindow_id)
+gst_my_filter_set_window_handle (GstVideoOverlay *overlay, guintptr handle)
{
GstMyFilter *my_filter = GST_MY_FILTER (overlay);
if (my_filter->window)
gst_my_filter_destroy_window (my_filter->window);
- my_filter->window = xwindow_id;
-}
-
-static void
-gst_my_filter_get_desired_size (GstXOverlay *overlay,
- guint *width, guint *height)
-{
- GstMyFilter *my_filter = GST_MY_FILTER (overlay);
-
- *width = my_filter->width;
- *height = my_filter->height;
+ my_filter->window = handle;
}
static void
-gst_my_filter_xoverlay_init (GstXOverlayClass *iface)
+gst_my_filter_xoverlay_init (GstVideoOverlayClass *iface)
{
- iface->set_xwindow_id = gst_my_filter_set_xwindow_id;
- iface->get_desired_size = gst_my_filter_get_desired_size;
+ iface->set_window_handle = gst_my_filter_set_window_handle;
}
]]></programlisting>
<para>
- You will also need to use the interface methods to fire signals when
- needed such as in the pad link function where you will know the video
+ You will also need to use the interface methods to post messages when
+ needed such as when receiving a CAPS event where you will know the video
geometry and maybe create the window.
</para>
<programlisting><![CDATA[
{
MyFilterWindow *window = g_new (MyFilterWindow, 1);
...
- gst_x_overlay_got_xwindow_id (GST_X_OVERLAY (my_filter), window->win);
+ gst_video_overlay_got_window_handle (GST_VIDEO_OVERLAY (my_filter), window->win);
}
-static GstPadLinkReturn
-gst_my_filter_sink_link (GstPad *pad, const GstCaps *caps)
+/* called from the event handler for CAPS events */
+static gboolean
+gst_my_filter_sink_set_caps (GstMyFilter *my_filter, GstCaps *caps)
{
- GstMyFilter *my_filter = GST_MY_FILTER (overlay);
gint width, height;
gboolean ret;
...
ret = gst_structure_get_int (structure, "width", &width);
ret &= gst_structure_get_int (structure, "height", &height);
- if (!ret) return GST_PAD_LINK_REFUSED;
+ if (!ret) return FALSE;
+
+ gst_video_overlay_prepare_window_handle (GST_VIDEO_OVERLAY (my_filter));
if (!my_filter->window)
my_filter->window = gst_my_filter_create_window (my_filter, width, height);
- gst_x_overlay_got_desired_size (GST_X_OVERLAY (my_filter),
- width, height);
...
}
]]></programlisting>
<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 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 only when data
- is actually passing their pad. This is because caps is attached to
- buffers during data flow. So when the vorbis decoder sets a caps on
- its source pad (to configure the output format), the converter will
- not yet be notified. Instead, the converter will only be notified
- when the decoder pushes a buffer over its source pad to the converter.
- Right before calling the chain-function in the converter, &GStreamer;
- will check whether the format that was previously negotiated still
- applies to this buffer. If not, it first calls the setcaps-function
- of the converter to configure it for the new format. Only after that
- will it call the chain function of the converter.
+ 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>
+ <sect1 id="section-nego-usecases">
+ <title>Caps negotiation use cases</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:
+ 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>
-[..]
- pad = gst_pad_new_from_template (..);
- gst_pad_use_fixed_caps (pad);
-[..]
- </programlisting>
<para>
- The fixed caps can then be set on the pad by calling
- <function>gst_pad_set_caps ()</function>.
- </para>
- <programlisting>
-[..]
- caps = gst_caps_new_simple ("audio/x-raw",
- "format", G_TYPE_STRING, GST_AUDIO_NE(F32),
- "buffer-frames", G_TYPE_INT, <bytes-per-frame>,
- "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>
- 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>
- Many elements, particularly effects and converters, will be able
- to parse the format of the stream from their input caps, and decide
- the output format right at that time already. When renegotiation
- takes place, some may merely need to "forward" the renegotiation
- backwards upstream (more on that later). For those elements, all
- (downstream) caps negotiation can be done in something that we
- call the <function>_setcaps ()</function> function. This function is
- called when a buffer is pushed over a pad, but the format on this
- buffer is not the same as the format that was previously negotiated
- (or, similarly, no format was negotiated yet so far).
+ 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>
- In the <function>_setcaps ()</function>-function, the element can
- forward the caps to the next element and, if that pad accepts the
- format too, the element can parse the relevant parameters from the
- caps and configure itself internally. The caps passed to this function
- is <emphasis>always</emphasis> a subset of the template caps, so
- there's no need for extensive safety checking. The following example
- should give a clear indication of how such a function can be
- implemented:
+ 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>
- <programlisting><!-- example-begin forwardcaps.c a --><!--
-#include "init.func"
-static GstCaps *
-gst_my_filter_getcaps (GstPad * pad)
-{
- return NULL;
-}
---><!-- example-end forwardcaps.c a -->
-<!-- example-begin forwardcaps.c b -->
+ <para>
+ 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>
+ <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 (GstPad *pad,
+gst_my_filter_setcaps (GstMyFilter *filter,
GstCaps *caps)
{
- GstMyFilter *filter = GST_MY_FILTER (GST_OBJECT_PARENT (pad));
- GstStructure *s;
+ GstStructure *structure;
+ int rate, channels;
+ gboolean ret;
+ GstCaps *outcaps;
- /* forward-negotiate */
- if (!gst_pad_set_caps (filter->srcpad, caps))
+ 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;
- /* negotiation succeeded, so now configure ourselves */
- s = gst_caps_get_structure (caps, 0);
- gst_structure_get_int (s, "rate", &filter->samplerate);
- gst_structure_get_int (s, "channels", &filter->channels);
+ 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 TRUE;
+ return ret;
+}
+
+static gboolean
+gst_my_filter_sink_event (GstPad *pad,
+ GstObject *parent,
+ GstEvent *event)
+{
+ gboolean ret;
+ GstMyFilter *filter = GST_MY_FILTER (parent);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ ret = gst_my_filter_setcaps (filter, caps);
+ break;
+ }
+ default:
+ ret = gst_pad_event_default (pad, parent, event);
+ break;
+ }
+ 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>
- 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.
+ 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>
+ 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 (GstPad *pad,
+gst_my_filter_setcaps (GstMyFilter *filter,
GstCaps *caps)
{
- GstMyFilter *filter = GST_MY_FILTER (GST_OBJECT_PARENT (pad));
-
- if (gst_pad_set_caps (filter->sinkpad, caps)) {
- filter->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", &filter->channels);
- othercaps = gst_pad_get_allowed_caps (filter->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->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->srcpad, newcaps);
- if (!gst_pad_set_caps (filter->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->passthrough = FALSE;
- gst_structure_get_int (s, "rate", &filter->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", &filter->to_samplerate);
+ gst_structure_get_int (others, "rate", &filter->to_samplerate);
}
return TRUE;
}
+static gboolean
+gst_my_filter_sink_event (GstPad *pad,
+ GstObject *parent,
+ GstEvent *event)
+{
+ gboolean ret;
+ GstMyFilter *filter = GST_MY_FILTER (parent);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ {
+ GstCaps *caps;
+
+ gst_event_parse_caps (event, &caps);
+ ret = gst_my_filter_setcaps (filter, caps);
+ break;
+ }
+ default:
+ ret = gst_pad_event_default (pad, parent, event);
+ break;
+ }
+ return ret;
+}
+
static GstFlowReturn
gst_my_filter_chain (GstPad *pad,
+ GstObject *parent,
GstBuffer *buf)
{
- GstMyFilter *filter = GST_MY_FILTER (GST_OBJECT_PARENT (pad));
+ GstMyFilter *filter = GST_MY_FILTER (parent);
GstBuffer *out;
/* push on if in passthrough mode */
- if (filter->passthrough)
- return gst_pad_push (filter->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->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>_setcaps
- ()</function>-function. The rest, as for getting all allowed caps from
- the source pad, fixating and such, is all the same. Re-negotiation,
- which will be handled in the next section, is very different for such
- elements, though.
- </para>
+]]>
+ </programlisting>
</sect2>
</sect1>
or because the audio channel configuration changed.
</para>
<para>
- Upstream caps renegotiation is done in the <function>gst_pad_alloc_buffer
- ()</function>-function. The idea here is that an element requesting a
- buffer from downstream, has to specify the type of that buffer. If
- renegotiation is to take place, this type will no longer apply, and the
- downstream element will set a new caps on the provided buffer. The element
- should then reconfigure itself to push buffers with the returned caps. The
- source pad's setcaps will be called once the buffer is pushed.
+ Upstream caps renegotiation is requested by sending a GST_EVENT_RECONFIGURE
+ event upstream. The idea is that it will instruct the upstream element
+ to reconfigure its caps by doing a new query for the allowed caps and then
+ choosing a new caps. The element that sends out the RECONFIGURE event
+ would influence the selection of the new caps by returning the new
+ prefered caps from its GST_QUERY_CAPS query function. The RECONFIGURE
+ event will set the GST_PAD_FLAG_NEED_RECONFIGURE on all pads that it
+ travels over.
</para>
<para>
It is important to note here that different elements actually have
<itemizedlist>
<listitem>
<para>
- Elements should implement a <quote>padalloc</quote>-function in
- order to be able to change format on renegotiation. This is also
- true for filters and converters.
+ 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 should allocate new buffers using
- <function>gst_pad_alloc_buffer ()</function>.
+ 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 are renegotiable should implement a
- <quote>setcaps</quote>-function on their sourcepad as well.
+ 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>
- <para>
- Unfortunately, not all details here have been worked out yet, so this
- documentation is incomplete. FIXME.
- </para>
</sect1>
- <sect1 id="section-nego-getcaps" xreflabel="Implementing a getcaps function">
- <title>Implementing a getcaps function</title>
+ <sect1 id="section-nego-getcaps" xreflabel="Implementing a CAPS query function">
+ <title>Implementing a CAPS query function</title>
<para>
- A <function>_getcaps ()</function>-function is called when a peer
- element would like to know which formats this element supports, and
- in what order of preference. The return value should be all formats
- that this elements supports, taking into account limitations of peer
- elements further downstream or upstream, sorted by order of preference,
- highest preference first.
+ A <function>_query ()</function>-function with the GST_QUERY_CAPS query
+ type is called when a peer element would like to know which formats
+ this pad supports, and in what order of preference. The return value
+ should be all formats that this elements supports, taking into account
+ limitations of peer elements further downstream or upstream, sorted by
+ order of preference, highest preference first.
</para>
<para>
</para>
- <programlisting><!-- example-begin getcaps.c a --><!--
-#include "init.func"
---><!-- example-end getcaps.c a -->
-<!-- example-begin getcaps.c b -->
-static GstCaps *
-gst_my_filter_getcaps (GstPad *pad)
-{
- GstMyFilter *filter = GST_MY_FILTER (GST_OBJECT_PARENT (pad));
- GstPad *otherpad = (pad == filter->srcpad) ? filter->sinkpad :
- filter->srcpad;
- GstCaps *othercaps = gst_pad_get_allowed_caps (otherpad), *caps;
- gint i;
-
- /* We support *any* samplerate, indifferent from the samplerate
- * supported by the linked elements on both sides. */
- for (i = 0; i < gst_caps_get_size (othercaps); i++) {
- GstStructure *structure = gst_caps_get_structure (othercaps, i);
-
- gst_structure_remove_field (structure, "rate");
- }
- caps = gst_caps_intersect (othercaps, gst_pad_get_pad_template_caps (pad));
- gst_caps_unref (othercaps);
-
- return caps;
-}
-<!-- example-end getcaps.c b -->
-<!-- example-begin getcaps.c c --><!--
+ <programlisting>
+<![CDATA[
static gboolean
-gst_my_filter_setcaps (GstPad * pad, GstCaps * caps)
+gst_my_filter_query (GstPad *pad, GstObject * parent, GstQuery * query)
{
- return FALSE;
+ gboolean ret;
+ GstMyFilter *filter = GST_MY_FILTER (parent);
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_CAPS
+ {
+ GstPad *otherpad;
+ GstCaps *temp, *caps, *filter, *tcaps;
+ gint i;
+
+ otherpad = (pad == filter->srcpad) ? filter->sinkpad :
+ filter->srcpad;
+ caps = gst_pad_get_allowed_caps (otherpad);
+
+ 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 < gst_caps_get_size (caps); i++) {
+ GstStructure *structure = gst_caps_get_structure (caps, i);
+
+ gst_structure_remove_field (structure, "rate");
+ }
+
+ /* make sure we only return results that intersect our
+ * padtemplate */
+ tcaps = gst_pad_get_pad_template_caps (pad);
+ if (tcaps) {
+ temp = gst_caps_intersect (caps, tcaps);
+ gst_caps_unref (caps);
+ gst_caps_unref (tcaps);
+ caps = temp;
+ }
+ /* filter against the query filter when needed */
+ if (filter) {
+ temp = gst_caps_intersect (caps, filter);
+ gst_caps_unref (caps);
+ caps = temp;
+ }
+ gst_query_set_caps_result (query, caps);
+ gst_caps_unref (caps);
+ ret = TRUE;
+ break;
+ }
+ default:
+ ret = gst_pad_query_default (pad, parent, query);
+ break;
+ }
+ return ret;
}
-#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.
--- /dev/null
+<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, ×tamp);
+
+ 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 < 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>
GList *srcpadlist;
} GstMyFilter;
+static GstStaticPadTemplate src_factory =
+GST_STATIC_PAD_TEMPLATE (
+ "src_%u",
+ GST_PAD_SRC,
+ GST_PAD_SOMETIMES,
+ GST_STATIC_CAPS ("ANY")
+);
+
static void
-gst_my_filter_base_init (GstMyFilterClass *klass)
+gst_my_filter_class_init (GstMyFilterClass *klass)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
- static GstStaticPadTemplate src_factory =
- GST_STATIC_PAD_TEMPLATE (
- "src_%02d",
- GST_PAD_SRC,
- GST_PAD_SOMETIMES,
- GST_STATIC_CAPS ("ANY")
- );
[..]
gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&src_factory));
/* newline? */
if (data[n] == '\n') {
- GstBuffer *buf = gst_buffer_new_and_alloc (n + 1);
+ GstBuffer *buf = gst_buffer_new_allocate (NULL, n + 1, NULL);
gst_bytestream_peek_bytes (filter->bs, &data, n);
- memcpy (GST_BUFFER_DATA (buf), data, n);
- GST_BUFFER_DATA (buf)[n] = '\0';
+ gst_buffer_fill (buf, 0, data, n);
+ gst_buffer_memset (buf, n, '\0', 1);
gst_bytestream_flush_fast (filter->bs, n + 1);
return buf;
GstMyFilter *filter = GST_MY_FILTER (element);
GstBuffer *buf;
GstPad *pad;
+ GstMapInfo map;
gint num, n;
/* parse header */
if (filter->firstrun) {
- GstElementClass *klass;
- GstPadTemplate *templ;
gchar *padname;
+ guint8 id;
if (!(buf = gst_my_filter_getline (filter))) {
gst_element_error (element, STREAM, READ, (NULL),
("Stream contains no header"));
return;
}
- num = atoi (GST_BUFFER_DATA (buf));
+ gst_buffer_extract (buf, 0, &id, 1);
+ num = atoi (id);
gst_buffer_unref (buf);
/* for each of the streams, create a pad */
- klass = GST_ELEMENT_GET_CLASS (filter);
- templ = gst_element_class_get_pad_template (klass, "src_%02d");
for (n = 0; n < num; n++) {
- padname = g_strdup_printf ("src_%02d", n);
- pad = gst_pad_new_from_template (templ, padname);
+ padname = g_strdup_printf ("src_%u", n);
+ pad = gst_pad_new_from_static_template (src_factory, padname);
g_free (padname);
- /* here, you would set _getcaps () and _link () functions */
+ /* here, you would set _event () and _query () functions */
+
+ /* need to activate the pad before adding */
+ gst_pad_set_active (pad, TRUE);
gst_element_add_pad (element, pad);
filter->srcpadlist = g_list_append (filter->srcpadlist, pad);
for (padlist = srcpadlist;
padlist != NULL; padlist = g_list_next (padlist)) {
pad = GST_PAD (padlist->data);
- gst_event_ref (event);
- gst_pad_push (pad, GST_DATA (event));
+ gst_pad_push_event (pad, gst_event_ref (event));
}
gst_event_unref (event);
- gst_element_set_eos (element);
-
+ /* pause the task here */
return;
}
/* parse stream number and go beyond the ':' in the data */
- num = atoi (GST_BUFFER_DATA (buf));
+ gst_buffer_map (buf, &map, GST_MAP_READ);
+ num = atoi (map.data[0]);
if (num >= 0 && num < g_list_length (filter->srcpadlist)) {
pad = GST_PAD (g_list_nth_data (filter->srcpadlist, num);
/* magic buffer parsing foo */
- for (n = 0; GST_BUFFER_DATA (buf)[n] != ':' &&
- GST_BUFFER_DATA (buf)[n] != '\0'; n++) ;
- if (GST_BUFFER_DATA (buf)[n] != '\0') {
+ for (n = 0; map.data[n] != ':' &&
+ map.data[n] != '\0'; n++) ;
+ if (map.data[n] != '\0') {
GstBuffer *sub;
- /* create subbuffer that starts right past the space. The reason
+ /* create region copy that starts right past the space. The reason
* that we don't just forward the data pointer is because the
* pointer is no longer the start of an allocated block of memory,
* but just a pointer to a position somewhere in the middle of it.
* That cannot be freed upon disposal, so we'd either crash or have
- * a memleak. Creating a subbuffer is a simple way to solve that. */
- sub = gst_buffer_create_sub (buf, n + 1, GST_BUFFER_SIZE (buf) - n - 1);
- gst_pad_push (pad, GST_DATA (sub));
+ * a memleak. Creating a region copy is a simple way to solve that. */
+ sub = gst_buffer_copy_region (buf, GST_BUFFER_COPY_ALL,
+ n + 1, map.size - n - 1);
+ gst_pad_push (pad, sub);
}
}
+ gst_buffer_unmap (buf, &map);
gst_buffer_unref (buf);
}
]]>
where - for each elementary stream that is to be placed in the output
system stream - one sink pad will be requested. It can also be used in
elements with a variable number of input or outputs pads, such as the
- <classname>tee</classname> (multi-output), <classname>switch</classname>
- or <classname>aggregator</classname> (both multi-input) elements. At the
- time of writing this, it is unclear to me who is responsible for cleaning
- up the created pad and how or when that should be done. Below is a simple
- example of an aggregator based on request pads.
+ <classname>tee</classname> (multi-output) or
+ <classname>input-selector</classname> (multi-input) elements.
+ </para>
+ <para>
+ To implement request pads, you need to provide a padtemplate with a
+ GST_PAD_REQUEST presence and implement the
+ <function>request_new_pad</function> virtual method in
+ <classname>GstElement</classname>.
+ To clean up, you will need to implement the
+ <function>release_pad</function> virtual method.
</para>
<programlisting>
<![CDATA[
static GstPad * gst_my_filter_request_new_pad (GstElement *element,
GstPadTemplate *templ,
- const gchar *name);
+ const gchar *name,
+ const GstCaps *caps);
+
+static void gst_my_filter_release_pad (GstElement *element,
+ GstPad *pad);
+
+static GstStaticPadTemplate sink_factory =
+GST_STATIC_PAD_TEMPLATE (
+ "sink_%u",
+ GST_PAD_SINK,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS ("ANY")
+);
static void
-gst_my_filter_base_init (GstMyFilterClass *klass)
+gst_my_filter_class_init (GstMyFilterClass *klass)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
- static GstStaticPadTemplate sink_factory =
- GST_STATIC_PAD_TEMPLATE (
- "sink_%d",
- GST_PAD_SINK,
- GST_PAD_REQUEST,
- GST_STATIC_CAPS ("ANY")
- );
[..]
gst_element_class_add_pad_template (klass,
gst_static_pad_template_get (&sink_factory));
-}
-
-static void
-gst_my_filter_class_init (GstMyFilterClass *klass)
-{
- GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
[..]
element_class->request_new_pad = gst_my_filter_request_new_pad;
+ element_class->release_pad = gst_my_filter_release_pad;
}
static GstPad *
gst_my_filter_request_new_pad (GstElement *element,
GstPadTemplate *templ,
- const gchar *name)
+ const gchar *name,
+ const GstCaps *caps)
{
GstPad *pad;
GstMyFilterInputContext *context;
pad = gst_pad_new_from_template (templ, name);
gst_pad_set_element_private (pad, context);
- /* normally, you would set _link () and _getcaps () functions here */
+ /* normally, you would set _chain () and _event () functions here */
gst_element_add_pad (element, pad);
return pad;
}
+
+static void
+gst_my_filter_release_pad (GstElement *element,
+ GstPad *pad)
+{
+ GstMyFilterInputContext *context;
+
+ context = gst_pad_get_element_private (pad);
+ g_free (context);
+
+ gst_element_remove_pad (element, pad);
+}
+
]]>
</programlisting>
</sect1>
<chapter id="chapter-scheduling" xreflabel="Different scheduling modes">
<title>Different scheduling modes</title>
<para>
- Scheduling is, in short, a method for making sure that every element gets
- called once in a while to process data and prepare data for the next
- element. Likewise, a kernel has a scheduler for processes, and your
- brain is a very complex scheduler too in a way.
- Randomly calling elements' chain functions won't bring us far, however, so
- you'll understand that the schedulers in &GStreamer; are a bit more complex
- than this. However, as a start, it's a nice picture.
+ The scheduling mode of a pad defines how data is retrieved from (source)
+ or given to (sink) pads. &GStreamer; can operate in two scheduling
+ mode, called push- and pull-mode. &GStreamer; supports elements with pads
+ in any of the scheduling modes where not all pads need to be operating
+ in the same mode.
</para>
<para>
So far, we have only discussed <function>_chain ()</function>-operating
elements, i.e. elements that have a chain-function set on their sink pad
- and push buffers on their source pad(s). Pads (or elements) can also operate
- in two other scheduling modes, however. In this chapter, we will discuss
- what those scheduling modes are, how they can be enabled and in what
- cases they are useful. The other two scheduling modes are random access
- (<function>_getrange ()</function>-based) or task-runner (which means
- that this element is the driving force in the pipeline) mode.
+ and push buffers on their source pad(s). We call this the push-mode
+ because a peer element will use <function>gst_pad_push ()</function> on
+ a srcpad, which will cause our <function>_chain ()</function>-function
+ to be called, which in turn causes our element to push out a buffer on
+ the source pad. The initiative to start the dataflow happens somewhere
+ upstream when it pushes out a buffer and all downstream elements get
+ scheduled when their <function>_chain ()</function>-functions are
+ called in turn.
+ </para>
+ <para>
+ Before we explain pull-mode scheduling, let's first understand how the
+ different scheduling modes are selected and activated on a pad.
</para>
<sect1 id="section-scheduling-activation"
- xreflabel="The pad actication stage">
+ xreflabel="The pad activation stage">
<title>The pad activation stage</title>
<para>
- The stage in which &GStreamer; decides in what scheduling mode the
- various elements will operate, is called the pad-activation stage. In
- this stage, &GStreamer; will query the scheduling capabilities (i.e.
- it will see in what modes each particular element/pad can operate) and
- decide on the optimal scheduling composition for the pipeline. Next,
- each pad will be notified of the scheduling mode that was assigned to
- it, and after that the pipeline will start running.
+ During the element state change of READY->PAUSED, the pads of an
+ element will be activated. This happens first on the source pads and
+ then on the sink pads of the element. &GStreamer; calls the
+ <function>_activate ()</function> of a pad. By default this function
+ will activate the pad in push-mode by calling
+ <function>gst_pad_activate_mode ()</function> with the GST_PAD_MODE_PUSH
+ scheduling mode.
+ It is possible to override the <function>_activate ()</function> of a pad
+ and decide on a different scheduling mode. You can know in what
+ scheduling mode a pad is activated by overriding the
+ <function>_activate_mode ()</function>-function.
</para>
<para>
- Pads can be assigned one of three modes, each mode putting several
- prerequisites on the pads. Pads should implement a notification
- function (<function>gst_pad_set_activatepull_function ()</function> and
- <function>gst_pad_set_activatepush_function ()</function>) to be
- notified of the scheduling mode assignment. Also, sinkpads assigned
- to do pull-based scheduling mode should start and stop their task
- in this function.
+ &GStreamer; allows the different pads of an element to operate in
+ different scheduling modes. This allows for many different possible
+ use-cases. What follows is an overview of some typical use-cases.
</para>
<itemizedlist>
<listitem>
<para>
- If all pads of an element are assigned to do
- <quote>push</quote>-based scheduling, then this means that data
- will be pushed by upstream elements to this element using the
- sinkpads <function>_chain ()</function>-function. Prerequisites
- for this scheduling mode are that a chain-function was set for
- each sinkpad using<function>gst_pad_set_chain_function ()</function>
- and that all downstream elements operate in the same mode. Pads are
- assigned to do push-based scheduling in sink-to-source element
- order, and within an element first sourcepads and then sinkpads.
- Sink elements can operate in this mode if their sinkpad is activated
- for push-based scheduling. Source elements cannot be chain-based.
+ If all pads of an element are activated in push-mode scheduling,
+ the element as a whole is operating in push-mode.
+ For source elements this means that they will have to start a
+ task that pushes out buffers on the source pad to the downstream
+ elements.
+ Downstream elements will have data pushed to them by upstream elements
+ using the sinkpads <function>_chain ()</function>-function which will
+ push out buffers on the source pads.
+ Prerequisites for this scheduling mode are that a chain-function was
+ set for each sinkpad using <function>gst_pad_set_chain_function ()</function>
+ and that all downstream elements operate in the same mode.
</para>
</listitem>
<listitem>
<para>
Alternatively, sinkpads can be the driving force behind a pipeline
- by operating in <quote>pull</quote>-based mode, while the sourcepads
- of the element still operate in push-based mode. In order to be the
+ by operating in pull-mode, while the sourcepads
+ of the element still operate in push-mode. In order to be the
driving force, those pads start a <classname>GstTask</classname>
when they are activated. This task is a thread, which
will call a function specified by the element. When called, this
function will have random data access (through
- <function>gst_pad_get_range ()</function>) over all sinkpads, and
+ <function>gst_pad_pull_range ()</function>) over all sinkpads, and
can push data over the sourcepads, which effectively means that
this element controls data flow in the pipeline. Prerequisites for
- this mode are that all downstream elements can act in chain-based
- mode, and that all upstream elements allow random access (see below).
- Source elements can be told to act in this mode if their sourcepads
- are activated in push-based fashion. Sink elements can be told to
- act in this mode when their sinkpads are activated in pull-mode.
+ this mode are that all downstream elements can act in push
+ mode, and that all upstream elements operate in pull-mode (see below).
+ </para>
+ <para>
+ Source pads can be activated in PULL mode by a downstream element
+ when they return GST_PAD_MODE_PULL from the GST_QUERY_SCHEDULING
+ query. Prerequisites for this scheduling mode are that a
+ getrange-function was set for the source pad using
+ <function>gst_pad_set_getrange_function ()</function>.
</para>
</listitem>
<listitem>
<para>
- lastly, all pads in an element can be assigned to act in pull-mode.
- too. However, contrary to the above, this does not mean that they
+ Lastly, all pads in an element can be activated in PULL-mode.
+ However, contrary to the above, this does not mean that they
start a task on their own. Rather, it means that they are pull
slave for the downstream element, and have to provide random data
access to it from their <function>_get_range ()</function>-function.
()</function>-function was set on this pad using the function
<function>gst_pad_set_getrange_function ()</function>. Also, if
the element has any sinkpads, all those pads (and thereby their
- peers) need to operate in random access mode, too. Note that the
- element is supposed to activate those elements itself! &GStreamer;
- will not do that for you.
+ peers) need to operate in PULL access mode, too.
+ </para>
+ <para>
+ When a sink element is activated in PULL mode, it should start a
+ task that calls <function>gst_pad_pull_range ()</function> on its
+ sinkpad. It can only do this when the upstream SCHEDULING query
+ returns support for the GST_PAD_MODE_PULL scheduling mode.
</para>
</listitem>
</itemizedlist>
<para>
- In the next two sections, we will go closer into pull-based scheduling
+ In the next two sections, we will go closer into pull-mode scheduling
(elements/pads driving the pipeline, and elements/pads providing random
access), and some specific use cases will be given.
</para>
<sect1 id="section-scheduling-loop" xreflabel="Pads driving the pipeline">
<title>Pads driving the pipeline</title>
<para>
- Sinkpads assigned to operate in pull-based mode, while none of its
- sourcepads operate in pull-based mode (or it has no sourcepads), can
- start a task that will drive the pipeline data flow. Within this
- function, those elements have random access over all of their sinkpads,
- and push data over their sourcepads. This can come in useful for
- several different kinds of elements:
+ Sinkpads operating in pull-mode, with the sourcepads operating in
+ push-mode (or it has no sourcepads when it is a sink), can start a task
+ that will drive the pipeline data flow.
+ Within this task function, you have random access over all of the sinkpads,
+ and push data over the sourcepads.
+ This can come in useful for several different kinds of elements:
</para>
<itemizedlist>
<listitem>
Demuxers, parsers and certain kinds of decoders where data comes
in unparsed (such as MPEG-audio or video streams), since those will
prefer byte-exact (random) access from their input. If possible,
- however, such elements should be prepared to operate in chain-based
+ however, such elements should be prepared to operate in push-mode
mode, too.
</para>
</listitem>
</listitem>
</itemizedlist>
<para>
- In order to start this task, you will need to create it in the
- activation function.
+ First you need to perform a SCHEDULING query to check if the upstream
+ element(s) support pull-mode scheduling. If that is possible, you
+ can activate the sinkpad in pull-mode. Inside the activate_mode
+ function you can then start the task.
</para>
<programlisting><!-- example-begin task.c a -->
#include "filter.h"
#include <string.h>
-static gboolean gst_my_filter_activate (GstPad * pad);
-static gboolean gst_my_filter_activate_pull (GstPad * pad,
- gboolean active);
-static void gst_my_filter_loop (GstMyFilter * filter);
+static gboolean gst_my_filter_activate (GstPad * pad,
+ GstObject * parent);
+static gboolean gst_my_filter_activate_mode (GstPad * pad,
+ GstObject * parent,
+ GstPadMode mode
+ gboolean active);
+static void gst_my_filter_loop (GstMyFilter * filter);
-GST_BOILERPLATE (GstMyFilter, gst_my_filter, GstElement, GST_TYPE_ELEMENT);
+G_DEFINE_TYPE (GstMyFilter, gst_my_filter, GST_TYPE_ELEMENT);
<!-- example-end task.c a -->
-<!-- example-begin task.c b --><!--
-static gboolean gst_my_filter_setcaps (GstPad *pad,
- GstCaps *caps);
-static GstCaps *gst_my_filter_getcaps (GstPad *pad);
-
-static void
-gst_my_filter_base_init (gpointer klass)
-{
- GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
- static GstElementDetails my_filter_details = {
- "An example plugin",
- "Example/FirstExample",
- "Shows the basic structure of a plugin",
- "your name <your.name@your.isp>"
- };
- static GstStaticPadTemplate sink_factory =
- GST_STATIC_PAD_TEMPLATE (
- "sink",
- GST_PAD_SINK,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS ("ANY")
- );
- static GstStaticPadTemplate src_factory =
- GST_STATIC_PAD_TEMPLATE (
- "src",
- GST_PAD_SRC,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS ("ANY")
- );
-
- gst_element_class_set_details (element_class, &my_filter_details);
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
-}
-
-static void
-gst_my_filter_class_init (GstMyFilterClass * klass)
-{
-}
---><!-- example-begin task.c b -->
<!-- example-begin task.c c -->
static void
gst_my_filter_init (GstMyFilter * filter)
{
<!-- example-end task.c c -->
[..]<!-- example-begin task.c d --><!--
- GstElementClass *klass = GST_ELEMENT_GET_CLASS (filter);
-
- filter->sinkpad = gst_pad_new_from_template (
- gst_element_class_get_pad_template (klass, "sink"), "sink");
- gst_pad_set_setcaps_function (filter->sinkpad, gst_my_filter_setcaps);
- gst_pad_set_getcaps_function (filter->sinkpad, gst_my_filter_getcaps);
--><!-- example-end task.c d -->
<!-- example-begin task.c e -->
gst_pad_set_activate_function (filter->sinkpad, gst_my_filter_activate);
- gst_pad_set_activatepull_function (filter->sinkpad,
- gst_my_filter_activate_pull);
+ gst_pad_set_activatemode_function (filter->sinkpad,
+ gst_my_filter_activate_mode);
<!-- example-end task.c e -->
<!-- example-begin task.c f --><!--
gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad);
- filter->srcpad = gst_pad_new_from_template (
- gst_element_class_get_pad_template (klass, "src"), "src");
gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad);
--><!-- example-end task.c f -->
[..]<!-- example-begin task.c g -->
--><!-- example-end task.c h -->
<!-- example-begin task.c i -->
static gboolean
-gst_my_filter_activate (GstPad * pad)
+gst_my_filter_activate (GstPad * pad, GstObject * parent)
{
- if (gst_pad_check_pull_range (pad)) {
- return gst_pad_activate_pull (pad, TRUE);
- } else {
- return FALSE;
+ GstQuery *query;
+ gboolean pull_mode;
+
+ /* first check what upstream scheduling is supported */
+ query = gst_query_new_scheduling ();
+
+ if (!gst_pad_peer_query (pad, query)) {
+ gst_query_unref (query);
+ goto activate_push;
+ }
+
+ /* see if pull-mode is supported */
+ pull_mode = gst_query_has_scheduling_mode_with_flags (query,
+ GST_PAD_MODE_PULL, GST_SCHEDULING_FLAG_SEEKABLE);
+ gst_query_unref (query);
+
+ if (!pull_mode)
+ goto activate_push;
+
+ /* now we can activate in pull-mode. GStreamer will also
+ * activate the upstream peer in pull-mode */
+ return gst_pad_activate_mode (pad, GST_PAD_MODE_PULL, TRUE);
+
+activate_push:
+ {
+ /* something not right, we fallback to push-mode */
+ return gst_pad_activate_mode (pad, GST_PAD_MODE_PUSH, TRUE);
}
}
static gboolean
-gst_my_filter_activate_pull (GstPad *pad,
- gboolean active)
+gst_my_filter_activate_pull (GstPad * pad,
+ GstObject * parent,
+ GstPadMode mode,
+ gboolean active)
{
- GstMyFilter *filter = GST_MY_FILTER (GST_OBJECT_PARENT (pad));
+ gboolean res;
+ GstMyFilter *filter = GST_MY_FILTER (parent);
- if (active) {
- filter->offset = 0;
- return gst_pad_start_task (pad,
- (GstTaskFunction) gst_my_filter_loop, filter);
- } else {
- return gst_pad_stop_task (pad);
+ switch (mode) {
+ case GST_PAD_MODE_PUSH:
+ res = TRUE;
+ break;
+ case GST_PAD_MODE_PULL:
+ if (active) {
+ filter->offset = 0;
+ res = gst_pad_start_task (pad,
+ (GstTaskFunction) gst_my_filter_loop, filter, NULL);
+ } else {
+ res = gst_pad_stop_task (pad);
+ }
+ break;
+ default:
+ /* unknown scheduling mode */
+ res = FALSE;
+ break;
}
+ return res;
}
<!-- example-end task.c i --></programlisting>
<para>
Once started, your task has full control over input and output. The
most simple case of a task function is one that reads input and pushes
that over its source pad. It's not all that useful, but provides some
- more flexibility than the old chain-based case that we've been looking
+ more flexibility than the old push-mode case that we've been looking
at so far.
</para>
<programlisting><!-- example-begin task.c j -->
GstFormat fmt = GST_FORMAT_BYTES;
GstBuffer *buf = NULL;
- if (!gst_pad_query_duration (filter->sinkpad, &fmt, &len)) {
+ if (!gst_pad_query_duration (filter->sinkpad, fmt, &len)) {
GST_DEBUG_OBJECT (filter, "failed to query duration, pausing");
goto stop;
}
<title>Providing random access</title>
<para>
In the previous section, we have talked about how elements (or pads)
- that are assigned to drive the pipeline using their own task, have
- random access over their sinkpads. This means that all elements linked
- to those pads (recursively) need to provide random access functions.
- Requesting random access is done using the function
- <function>gst_pad_pull_range ()</function>, which requests a buffer of
- a specified size and offset. Source pads implementing and assigned to
- do random access will have a <function>_get_range ()</function>-function
- set using <function>gst_pad_set_getrange_function ()</function>, and
- that function will be called when the peer pad requests some data. The
- element is then responsible for seeking to the right offset and
+ that are activated to drive the pipeline using their own task, must use
+ pull-mode scheduling on their sinkpads. This means that all pads linked
+ to those pads need to be activated in pull-mode.
+ Source pads activated in pull-mode must implement a
+ <function>_get_range ()</function>-function set using
+ <function>gst_pad_set_getrange_function ()</function>, and
+ that function will be called when the peer pad requests some data with
+ <function>gst_pad_pull_range ()</function>.
+ The element is then responsible for seeking to the right offset and
providing the requested data. Several elements can implement random
access:
</para>
</listitem>
<listitem>
<para>
- Filters that would like to provide a pull-based-like scheduling
- mode over the whole pipeline. Note that elements assigned to do
- random access-based scheduling are themselves responsible for
- assigning this scheduling mode to their upstream peers! &GStreamer;
- will not do that for you.
+ Filters that would like to provide a pull-mode scheduling
+ over the whole pipeline.
</para>
</listitem>
<listitem>
<para>
Parsers who can easily provide this by skipping a small part of
- their input and are thus essentially "forwarding" random access
+ their input and are thus essentially "forwarding" getrange
requests literally without any own processing involved. Examples
include tag readers (e.g. ID3) or single output parsers, such as
a WAVE parser.
#include "filter.h"
static GstFlowReturn
gst_my_filter_get_range (GstPad * pad,
+ GstObject * parent,
guint64 offset,
guint length,
GstBuffer ** buf);
-GST_BOILERPLATE (GstMyFilter, gst_my_filter, GstElement, GST_TYPE_ELEMENT);
+G_DEFINE_TYPE (GstMyFilter, gst_my_filter, GST_TYPE_ELEMENT);
<!-- example-end range.c a -->
<!-- example-begin range.c b --><!--
static void
-gst_my_filter_base_init (gpointer klass)
+gst_my_filter_class_init (gpointer klass)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
static GstElementDetails my_filter_details = {
static void
gst_my_filter_init (GstMyFilter * filter)
{
+<!-- example-end task.c c --><!--
GstElementClass *klass = GST_ELEMENT_GET_CLASS (filter);
filter->srcpad = gst_pad_new_from_template (
gst_element_class_get_pad_template (klass, "src"), "src");
+-->
+[..]<!-- example-begin task.c d --><!--
+--><!-- example-end task.c d -->
+<!-- example-begin task.c e -->
gst_pad_set_getrange_function (filter->srcpad,
gst_my_filter_get_range);
+<!-- example-end range.c c --><!--
gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad);
-<!-- example-end range.c c -->
+-->
[..]<!-- example-begin range.c d -->
}
-static gboolean
+static GstFlowReturn
gst_my_filter_get_range (GstPad * pad,
+ GstObject * parent,
guint64 offset,
guint length,
GstBuffer ** buf)
{
<!-- example-end range.c d -->
- GstMyFilter *filter = GST_MY_FILTER (GST_OBJECT_PARENT (pad));
+ GstMyFilter *filter = GST_MY_FILTER (parent);
[.. here, you would fill *buf ..]
<!-- example-begin range.c e -->
--><!-- example-end range.c f --></programlisting>
<para>
In practice, many elements that could theoretically do random access,
- may in practice often be assigned to do push-based scheduling anyway,
+ may in practice often be activated in push-mode scheduling anyway,
since there is no downstream element able to start its own task.
Therefore, in practice, those elements should implement both a
<function>_get_range ()</function>-function and a <function>_chain
()</function>-function (for filters and parsers) or a <function>_get_range
()</function>-function and be prepared to start their own task by
providing <function>_activate_* ()</function>-functions (for
- source elements), so that &GStreamer; can decide for the optimal
- scheduling mode and have it just work fine in practice.
+ source elements).
</para>
</sect1>
</chapter>
of the type the tag was registered as (the API documentation for each
predefined tag should contain the type). Be sure to use functions like
<function>gst_value_transform ()</function>
- to make sure that your data is of the right type. After data reading, the
- application can be notified of the new taglist by calling
- <function>gst_element_found_tags ()</function> or
- <function>gst_element_found_tags_for_pad ()</function> (if they only
- refer to a specific sub-stream). These functions will post a tag message
- on the pipeline's GstBus for the application to pick up, but also send
- tag events downstream, either over all source pad or the pad specified.
+ to make sure that your data is of the right type.
+ After data reading, you can send the tags downstream with the TAG event.
+ When the TAG event reaches the sink, it will post the TAG message on
+ the pipeline's GstBus for the application to pick up.
</para>
<para>
We currently require the core to know the GType of tags before they are
TagSetter interface (which is just a layer). Pipeline tags are tags
provided to the element from within the pipeline. The element receives
such tags via the <symbol>GST_EVENT_TAG</symbol> event, which means
- that tags writers should automatically be event aware. The tag writer is
+ that tags writers should implment an event handler. The tag writer is
responsible for combining all these three into one list and writing them
to the output stream.
</para>
setter so applications can set tags, and retrieves pipeline tags from
incoming events.
</para>
+ <para>
+ Warning, this example is outdated and doesn't work with the 1.0 version
+ of &GStreamer; anymore.
+ </para>
<programlisting>
<![CDATA[
GType
static void
gst_my_filter_init (GstMyFilter *filter)
{
- GST_FLAG_SET (filter, GST_ELEMENT_EVENT_AWARE);
[..]
}
g_value_init (&to, G_TYPE_STRING);
for (n = 0; n < num_values; n++) {
+ guint8 * data;
+ gsize size;
+
from = gst_tag_list_get_value_index (taglist, tagname, n);
g_value_transform (from, &to);
- buf = gst_buffer_new ();
- GST_BUFFER_DATA (buf) = g_strdup_printf ("%s:%s", tagname,
- g_value_get_string (&to));
- GST_BUFFER_SIZE (buf) = strlen (GST_BUFFER_DATA (buf));
- gst_pad_push (filter->srcpad, GST_DATA (buf));
+ data = g_strdup_printf ("%s:%s", tagname,
+ g_value_get_string (&to));
+ size = strlen (data);
+
+ buf = gst_buffer_new_wrapped (data, size);
+ gst_pad_push (filter->srcpad, buf);
}
g_value_unset (&to);
gst_tag_list_foreach (taglist, gst_my_filter_write_tag, filter);
/* signal EOS */
- gst_pad_push (filter->srcpad, GST_DATA (gst_event_new (GST_EVENT_EOS)));
- gst_element_set_eos (element);
+ gst_pad_push (filter->srcpad, gst_event_new (GST_EVENT_EOS));
}
]]>
</programlisting>
<para>
If you need a new format that has not yet been defined in our <xref
linkend="section-types-definitions"/>, you will want to have some general
- guidelines on mimetype naming, properties and such. A mimetype would
- ideally be one defined by IANA; else, it should be in the form
- type/x-name, where type is the sort of data this mimetype handles (audio,
- video, ...) and name should be something specific for this specific type.
- Audio and video mimetypes should try to support the general audio/video
- properties (see the list), and can use their own properties, too. To get
- an idea of what properties we think are useful, see (again) the list.
+ guidelines on media type naming, properties and such. A media type would
+ ideally be equivalent to the Mime-type defined by IANA; else, it should
+ be in the form type/x-name, where type is the sort of data this media type
+ handles (audio, video, ...) and name should be something specific for
+ this specific type. Audio and video media types should try to support the
+ general audio/video properties (see the list), and can use their own
+ properties, too. To get an idea of what properties we think are useful,
+ see (again) the list.
</para>
<para>
Take your time to find the right set of properties for your type. There
<thead>
<row>
- <entry>Mime Type</entry>
+ <entry>Media Type</entry>
<entry>Description</entry>
<entry>Property</entry>
<entry>Property Type</entry>
<thead>
<row>
- <entry>Mime Type</entry>
+ <entry>Media Type</entry>
<entry>Description</entry>
<entry>Property</entry>
<entry>Property Type</entry>
<entry>1, 2 or 4</entry>
<entry>
Version of the MPEG codec that this stream was encoded with.
- Note that we have different mimetypes for 3ivx, XviD, DivX and
+ Note that we have different media types for 3ivx, XviD, DivX and
"standard" ISO MPEG-4. This is <emphasis>not</emphasis> a good
thing and we're fully aware of this. However, we do not have a
solution yet.
<entry></entry>
<entry>
There are currently no specific properties defined or needed for
- this type. Note that we have different mimetypes for VP-3 and
+ this type. Note that we have different media types for VP-3 and
Theora, which is not necessarily a good idea. This could probably
be improved.
</entry>
<thead>
<row>
- <entry>Mime Type</entry>
+ <entry>Media Type</entry>
<entry>Description</entry>
<entry>Property</entry>
<entry>Property Type</entry>
<thead>
<row>
- <entry>Mime Type</entry>
+ <entry>Media Type</entry>
<entry>Description</entry>
<entry>Property</entry>
<entry>Property Type</entry>
<thead>
<row>
- <entry>Mime Type</entry>
+ <entry>Media Type</entry>
<entry>Description</entry>
<entry>Property</entry>
<entry>Property Type</entry>
<listitem>
<para>
Elements should make sure they forward events they do not
- handle with gst_pad_event_default (pad, event) instead of
+ handle with gst_pad_event_default (pad, parent, event) instead of
just dropping them. Events should never be dropped unless
specifically intended.
</para>
<listitem>
<para>
Elements should make sure they forward queries they do not
- handle with gst_pad_query_default (pad, query) instead of
+ handle with gst_pad_query_default (pad, parent, query) instead of
just dropping them.
</para>
</listitem>
- <listitem>
- <para>
- Elements should use gst_pad_get_parent() in event and query
- functions, so that they hold a reference to the element while they
- are operating. Note that gst_pad_get_parent() increases the
- reference count of the element, so you must be very careful to call
- gst_object_unref (element) before returning from your query or
- event function, otherwise you will leak memory.
- </para>
- </listitem>
</itemizedlist>
</sect1>
tool to show that your element is finished. Applications such as
Rhythmbox and Totem (for GNOME) or AmaroK (for KDE)
<emphasis>are</emphasis>. <command>gst-launch</command> will not
- test various things such as proper clean-up on reset, interrupt
- event handling, querying and so on.
+ test various things such as proper clean-up on reset, event
+ handling, querying and so on.
</para>
</listitem>
<listitem>
</itemizedlist>
</sect1>
</chapter>
+
+<chapter id="chapter-porting-1_0">
+ <title>Porting 0.10 plug-ins to 1.0</title>
+ <para>
+ You can find the list of changes in the
+ <ulink url="http://cgit.freedesktop.org/gstreamer/gstreamer/tree/docs/random/porting-to-1.0.txt">Porting to 1.0</ulink> document.
+ </para>
+</chapter>
</note>
<para>
The last command creates two files:
- <filename>gstexamplefilter.c</filename> and
- <filename>gstexamplefilter.h</filename>.
+ <filename>gstmyfilter.c</filename> and
+ <filename>gstmyfilter.h</filename>.
</para>
<note>
<para>
Be aware that by default <filename>autogen.sh</filename> and
<filename>configure</filename> would choose <filename class="directory">/usr/local</filename>
as a default location. One would need to add
- <filename class="directory">/usr/local/lib/gstreamer-0.10</filename>
+ <filename class="directory">/usr/local/lib/gstreamer-1.0</filename>
to <symbol>GST_PLUGIN_PATH</symbol> in order to make the new plugin
- show up in gstreamer.
+ show up in a gstreamer that's been installed from packages.
+ </para>
+ </note>
+ <note>
+ <para>
+ FIXME: this section is slightly outdated. gst-template is still useful
+ as an example for a minimal plugin build system skeleton. However, for
+ creating elements the tool gst-element-maker from gst-plugins-bad is
+ recommended these days.
</para>
</note>
</sect1>
<programlisting><!-- example-begin boilerplate.c a -->
#include "filter.h"
-GST_BOILERPLATE (GstMyFilter, gst_my_filter, GstElement, GST_TYPE_ELEMENT);
+G_DEFINE_TYPE (GstMyFilter, gst_my_filter, GST_TYPE_ELEMENT);
<!-- example-end boilerplate.c a --></programlisting>
</sect1>
<!-- ############ sect1 ############# -->
<sect1 id="section-boiler-details">
- <title>GstElementDetails</title>
+ <title>Element metadata</title>
<para>
- The GstElementDetails structure provides a hierarchical type for element
- information. The entries are:
+ The Element metadata provides extra element information. It is configured
+ with <function>gst_element_class_set_metadata</function> or
+ <function>gst_element_class_set_static_metadata</function> which takes the
+ following parameters:
</para>
<itemizedlist>
<listitem><para>
<para>
For example:
</para>
- <programlisting><!-- example-begin boilerplate.c b -->
-static const GstElementDetails my_filter_details = {
+ <programlisting>
+gst_element_class_set_static_metadata (klass,
"An example plugin",
"Example/FirstExample",
"Shows the basic structure of a plugin",
- "your name <your.name@your.isp>"
-};
- <!-- example-end boilerplate.c b --></programlisting>
+ "your name <your.name@your.isp>");
+ </programlisting>
<para>
The element details are registered with the plugin during
- the <function>_base_init ()</function> function, which is part of
- the GObject system. The <function>_base_init ()</function> function
+ the <function>_class_init ()</function> function, which is part of
+ the GObject system. The <function>_class_init ()</function> function
should be set for this GObject in the function where you register
the type with GLib.
</para>
<programlisting><!-- example-begin boilerplate.c c -->
static void
-gst_my_filter_base_init (gpointer klass)
+gst_my_filter_class_init (GstMyFilterClass * klass)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
<!-- example-end boilerplate.c c -->
- static const GstElementDetails my_filter_details = {
-[..]
- };
-
[..]<!-- example-begin boilerplate.c d -->
- gst_element_class_set_details (element_class, &my_filter_details);
+ gst_element_class_set_static_metadata (element_klass,
+ "An example plugin",
+ "Example/FirstExample",
+ "Shows the basic structure of a plugin",
+ "your name <your.name@your.isp>");
<!-- example-end boilerplate.c d -->
}
</programlisting>
</programlisting>
<para>
Those pad templates are registered during the
- <function>_base_init ()</function> function. Pads are created from these
- templates in the element's <function>_init ()</function> function using
- <function>gst_pad_new_from_template ()</function>. The template can be
- retrieved from the element class using
- <function>gst_element_class_get_pad_template ()</function>. See below
- for more details on this. In order to create a new pad from this
- template using <function>gst_pad_new_from_template ()</function>, you
+ <function>_class_init ()</function> function with the
+ <function>gst_element_class_add_pad_template ()</function>. For this
+ function you need a handle the the <classname>GstPadTemplate</classname>
+ which you can create from the static pad template with
+ <function>gst_static_pad_template_get ()</function>. See below for more
+ details on this.
+ </para>
+ <para>
+ Pads are created from these static templates in the element's
+ <function>_init ()</function> function using
+ <function>gst_pad_new_from_static_template ()</function>.
+ In order to create a new pad from this
+ template using <function>gst_pad_new_from_static_template ()</function>, you
will need to declare the pad template as a global variable. More on
this subject in <xref linkend="chapter-building-pads"/>.
</para>
src_factory = [..];
static void
-gst_my_filter_base_init (gpointer klass)
+gst_my_filter_class_init (GstMyFilterClass * klass)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
[..]
}
<!-- example-end boilerplate.c g -->
<!-- example-begin boilerplate.c h --><!--
-static void
-gst_my_filter_class_init (GstMyFilterClass * klass)
-{
-}
-
static void
gst_my_filter_init (GstMyFilter * filter)
{
The last argument in a template is its type
or list of supported types. In this example, we use 'ANY', which means
that this element will accept all input. In real-life situations, you
- would set a mimetype and optionally a set of properties to make sure
+ would set a media type and optionally a set of properties to make sure
that only supported input will come in. This representation should be
- a string that starts with a mimetype, then a set of comma-separates
+ a string that starts with a media type, then a set of comma-separates
properties with their supported values. In case of an audio filter that
supports raw integer 16-bit audio, mono or stereo at any samplerate, the
correct template would look like this:
</para>
<programlisting>
+<![CDATA[
static GstStaticPadTemplate sink_factory =
GST_STATIC_PAD_TEMPLATE (
"sink",
"rate = (int) [ 8000, 96000 ]"
)
);
+]]>
</programlisting>
<para>
Values surrounded by curly brackets (<quote>{</quote> and
<sect1 id="section-boiler-constructors">
<title>Constructor Functions</title>
<para>
- Each element has three functions which are used for construction of an
- element. These are the <function>_base_init()</function> function which
- is meant to initialize class and child class properties during each new
- child class creation; the <function>_class_init()</function> function,
+ Each element has two functions which are used for construction of an
+ element. The <function>_class_init()</function> function,
which is used to initialise the class only once (specifying what signals,
arguments and virtual functions the class has and setting up global
state); and the <function>_init()</function> function, which is used to
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)
{
"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
#include "init.func"
#include "caps.func"
static gboolean
-gst_my_filter_event (GstPad * pad, GstEvent * event)
+gst_my_filter_event (GstPad * pad, GstObject * parent, GstEvent * event)
{
- return gst_pad_event_default (pad, event);
+ return gst_pad_event_default (pad, parent, event);
}
--><!-- example-end chain.c a -->
<!-- example-begin chain.c b -->
+static GstFlowReturn gst_my_filter_chain (GstPad *pad,
+ GstObject *parent,
+ GstBuffer *buf);
+
+[..]
+
+static void
+gst_my_filter_init (GstMyFilter * filter)
+{
+[..]
+ /* configure chain function on the pad before adding
+ * the pad to the element */
+ gst_pad_set_chain_function (filter->sinkpad,
+ gst_my_filter_chain);
+[..]
+}
+
static GstFlowReturn
gst_my_filter_chain (GstPad *pad,
+ GstObject *parent,
GstBuffer *buf)
{
- GstMyFilter *filter = GST_MY_FILTER (GST_OBJECT_PARENT (pad));
+ GstMyFilter *filter = GST_MY_FILTER (parent);
if (!filter->silent)
- g_print ("Have data of size %u bytes!\n", GST_BUFFER_SIZE (buf));
+ g_print ("Have data of size %" G_GSIZE_FORMAT" bytes!\n",
+ gst_buffer_get_size (buf));
return gst_pad_push (filter->srcpad, buf);
}
<para>
Obviously, the above doesn't do much useful. Instead of printing that the
data is in, you would normally process the data there. Remember, however,
- that buffers are not always writeable. In more advanced elements (the ones
- that do event processing), you may want to additionally specify an event
- handling function, which will be called when stream-events are sent (such
- as end-of-stream, newsegment, tags, etc.).
+ that buffers are not always writeable.
+ </para>
+ <para>
+ In more advanced elements (the ones that do event processing), you may want
+ to additionally specify an event handling function, which will be called
+ when stream-events are sent (such as caps, end-of-stream, newsegment, tags, etc.).
</para>
<programlisting>
static void
{
[..]
gst_pad_set_event_function (filter->sinkpad,
- gst_my_filter_event);
+ gst_my_filter_sink_event);
[..]
}
<!-- example-begin chain2.c a --><!--
--><!-- example-end chain.func a -->
<!-- example-begin chain.func b -->
static gboolean
-gst_my_filter_event (GstPad *pad,
- GstEvent *event)
+gst_my_filter_sink_event (GstPad *pad,
+ GstObject *parent,
+ GstEvent *event)
{
- GstMyFilter *filter = GST_MY_FILTER (GST_OBJECT_PARENT (pad));
+ GstMyFilter *filter = GST_MY_FILTER (parent);
switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ /* we should handle the format here */
+ break;
case GST_EVENT_EOS:
/* end-of-stream, we should close down all stream leftovers here */
gst_my_filter_stop_processing (filter);
break;
}
- return gst_pad_event_default (pad, event);
+ return gst_pad_event_default (pad, parent, event);
}
static GstFlowReturn
gst_my_filter_chain (GstPad *pad,
+ GstObject *parent,
GstBuffer *buf)
{
- GstMyFilter *filter = GST_MY_FILTER (gst_pad_get_parent (pad));
+ GstMyFilter *filter = GST_MY_FILTER (parent);
GstBuffer *outbuf;
outbuf = gst_my_filter_process_data (filter, buf);
--- /dev/null
+
+<!-- ############ chapter ############# -->
+
+<chapter id="chapter-building-eventfn">
+ <title>The event function</title>
+ <para>
+ The event function notifies you of special events that happen in
+ the datastream (such as caps, end-of-stream, newsegment, tags, etc.).
+ Events 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 event function that we install on the sink
+ pad of our element.
+ </para>
+ <programlisting>
+<![CDATA[
+static gboolean gst_my_filter_sink_event (GstPad *pad,
+ GstObject *parent,
+ GstEvent *event);
+
+[..]
+
+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->sinkpad,
+ gst_my_filter_sink_event);
+[..]
+}
+
+static gboolean
+gst_my_filter_sink_event (GstPad *pad,
+ GstObject *parent,
+ GstEvent *event)
+{
+ gboolean ret;
+ GstMyFilter *filter = GST_MY_FILTER (parent);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_CAPS:
+ /* we should handle the format here */
+
+ /* push the event downstream */
+ ret = gst_pad_push_event (filter->srcpad, event);
+ break;
+ case GST_EVENT_EOS:
+ /* end-of-stream, we should close down all stream leftovers here */
+ gst_my_filter_stop_processing (filter);
+
+ ret = gst_pad_event_default (pad, parent, event);
+ break;
+ default:
+ /* just call the default handler */
+ ret = gst_pad_event_default (pad, parent, event);
+ break;
+ }
+ return ret;
+}
+]]>
+ </programlisting>
+ <para>
+ It is a good idea to call the default event handler
+ <function>gst_pad_event_default ()</function> for unknown events.
+ Depending on the event type, the default handler will forward
+ the event or simply unref it. The CAPS event is by default not
+ forwarded so we need to do this in the event handler ourselves.
+ </para>
+</chapter>
of your element, and that makes them a very important item in the process
of element creation. In the boilerplate code, we have seen how static pad
templates take care of registering pad templates with the element class.
- Here, we will see how to create actual elements, use a <function>_setcaps
- ()</function>-functions to configure for a particular format and how to
+ Here, we will see how to create actual elements, use an <function>_event
+ ()</function>-function to configure for a particular format and how to
register functions to let data flow through the element.
</para>
<para>
In the element <function>_init ()</function> function, you create the pad
from the pad template that has been registered with the element class in
- the <function>_base_init ()</function> function. After creating the pad,
- you have to set a <function>_setcaps ()</function> function pointer and
- optionally a <function>_getcaps ()</function> function pointer. Also, you
- have to set a <function>_chain ()</function> function pointer.
+ the <function>_class_init ()</function> function. After creating the pad,
+ you have to set a <function>_chain ()</function> function pointer that will
+ receive and process the input data on the sinkpad.
+ You can optionally also set an <function>_event ()</function> function
+ pointer and a <function>_query ()</function> function pointer.
Alternatively, pads can also operate in looping mode, which means that they
can pull data themselves. More on this topic later. After that, you have
to register the pad with the element. This happens like this:
static GstStateChangeReturn
gst_my_filter_change_state (GstElement * element, GstStateChange transition);
-GST_BOILERPLATE (GstMyFilter, gst_my_filter, GstElement, GST_TYPE_ELEMENT);
+G_DEFINE_TYPE (GstMyFilter, gst_my_filter, GST_TYPE_ELEMENT);
static void
-gst_my_filter_base_init (gpointer klass)
+gst_my_filter_class_init (gpointer klass)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
- static GstElementDetails my_filter_details = {
- "An example plugin",
- "Example/FirstExample",
- "Shows the basic structure of a plugin",
- "your name <your.name@your.isp>"
- };
- static GstStaticPadTemplate sink_factory =
+ static GstStaticPadTemplate sink_template =
GST_STATIC_PAD_TEMPLATE (
"sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
GST_STATIC_CAPS ("ANY")
);
- static GstStaticPadTemplate src_factory =
+ static GstStaticPadTemplate src_template =
GST_STATIC_PAD_TEMPLATE (
"src",
GST_PAD_SRC,
GST_STATIC_CAPS ("ANY")
);
- gst_element_class_set_details (element_class, &my_filter_details);
+ gst_element_class_set_static_metadata (element_class,
+ "An example plugin",
+ "Example/FirstExample",
+ "Shows the basic structure of a plugin",
+ "your name <your.name@your.isp>");
+
gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
+ gst_static_pad_template_get (&src_template));
gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
+ gst_static_pad_template_get (&sink_template));
}
static void
GST_ELEMENT_CLASS (klass)->change_state = gst_my_filter_change_state;
}
--><!-- example-end init.func a -->
-<!-- example-begin init.func b -->
-static gboolean gst_my_filter_setcaps (GstPad *pad,
- GstCaps *caps);
-static GstFlowReturn gst_my_filter_chain (GstPad *pad,
- GstBuffer *buf);
-<!-- example-end init.func b -->
<!-- example-begin init.func c --><!--
-static GstCaps * gst_my_filter_getcaps (GstPad *pad);
-static gboolean gst_my_filter_event (GstPad *pad,
- GstEvent *event);
+static GstFlowReturn gst_my_filter_chain (GstPad *pad,
+ GstObject *parent,
+ GstBuffer *buf);
+static gboolean gst_my_filter_sink_event (GstPad *pad,
+ GstObject *parent,
+ GstEvent *event);
+static gboolean gst_my_filter_src_query (GstPad *pad,
+ GstObject *parent,
+ GstQuery *query);
+static gboolean gst_my_filter_sink_query (GstPad *pad,
+ GstObject *parent,
+ GstQuery *query);
--><!-- example-end init.func c -->
<!-- example-begin init.func d -->
static void
-gst_my_filter_init (GstMyFilter *filter, GstMyFilterClass *filter_klass)
+gst_my_filter_init (GstMyFilter *filter)
{
- GstElementClass *klass = GST_ELEMENT_CLASS (filter_klass);
-
/* pad through which data comes in to the element */
- filter->sinkpad = gst_pad_new_from_template (
- gst_element_class_get_pad_template (klass, "sink"), "sink");
- gst_pad_set_setcaps_function (filter->sinkpad, gst_my_filter_setcaps);
- gst_pad_set_chain_function (filter->sinkpad, gst_my_filter_chain);
+ filter->sinkpad = gst_pad_new_from_static_template (
+ &sink_template, "sink");
+ /* pads are configured here with gst_pad_set_*_function () */
<!-- example-end init.func d -->
<!-- example-begin init.func e --><!--
- gst_pad_set_getcaps_function (filter->sinkpad, gst_my_filter_getcaps);
- gst_pad_set_event_function (filter->sinkpad, gst_my_filter_event);
+ gst_pad_set_chain_function (filter->sinkpad, gst_my_filter_chain);
+ gst_pad_set_event_function (filter->sinkpad, gst_my_filter_sink_event);
+ gst_pad_set_query_function (filter->sinkpad, gst_my_filter_sink_query);
--><!-- example-end init.func e -->
<!-- example-begin init.func f -->
gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad);
/* pad through which data goes out of the element */
- filter->srcpad = gst_pad_new_from_template (
- gst_element_class_get_pad_template (klass, "src"), "src");
+ filter->srcpad = gst_pad_new_from_static_template (
+ &src_template, "src");
+ /* pads are configured here with gst_pad_set_*_function () */
<!-- example-end init.func f -->
<!-- example-begin init.func g --><!--
- gst_pad_set_getcaps_function (filter->srcpad, gst_my_filter_getcaps);
+ gst_pad_set_query_function (filter->srcpad, gst_my_filter_src_query);
--><!-- example-end init.func g -->
<!-- example-begin init.func h -->
gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad);
}
<!-- example-end init.func h --></programlisting>
- <sect1 id="section-pads-linkfn" xreflabel="The link function">
- <title>The setcaps-function</title>
- <para>
- The <function>_setcaps ()</function>-function is called during caps
- negotiation, which is discussed in great detail in <xref
- linkend="chapter-negotiation"/>. This is the process where the linked
- pads decide on the streamtype that will transfer between them. A full
- list of type-definitions can be found in <xref
- linkend="chapter-building-types"/>. A <function>_link ()</function>
- receives a pointer to a <ulink type="http"
- url="../../gstreamer/html/gstreamer-GstCaps.html"><classname>GstCaps</classname></ulink>
- struct that defines the proposed streamtype, and can respond with
- either <quote>yes</quote> (<symbol>TRUE</symbol>) or <quote>no</quote>
- (<symbol>FALSE</symbol>). If the element responds positively towards
- the streamtype, that type will be used on the pad. An example:
- </para>
- <programlisting><!-- example-begin caps.func a -->
-static gboolean
-gst_my_filter_setcaps (GstPad *pad,
- GstCaps *caps)
-{
- GstStructure *structure = gst_caps_get_structure (caps, 0);
- GstMyFilter *filter = GST_MY_FILTER (GST_OBJECT_PARENT (pad));
- const gchar *mime;
-
- /* Since we're an audio filter, we want to handle raw audio
- * and from that audio type, we need to get the samplerate and
- * number of channels. */
- mime = gst_structure_get_name (structure);
- if (strcmp (mime, "audio/x-raw") != 0) {
- GST_WARNING ("Wrong mimetype %s provided, we only support %s",
- mime, "audio/x-raw");
- return FALSE;
- }
-
- /* we're a filter and don't touch the properties of the data.
- * That means we can set the given caps unmodified on the next
- * element, and use that negotiation return value as ours. */
- if (!gst_pad_set_caps (filter->srcpad, caps))
- return FALSE;
-
- /* Capsnego succeeded, get the stream properties for internal
- * usage and return success. */
- gst_structure_get_int (structure, "rate", &filter->samplerate);
- gst_structure_get_int (structure, "channels", &filter->channels);
-
- g_print ("Caps negotiation succeeded with %d Hz @ %d channels\n",
- filter->samplerate, filter->channels);
-
- return TRUE;
-}
-<!-- example-end caps.func a -->
-<!-- example-begin caps.func b --><!--
-static GstCaps *
-gst_my_filter_getcaps (GstPad * pad)
-{
- GstMyFilter *filter = GST_MY_FILTER (GST_OBJECT_PARENT (pad));
- GstPad *otherpad = (pad == filter->srcpad) ? filter->sinkpad :
- filter->srcpad;
- GstCaps *othercaps = gst_pad_get_allowed_caps (otherpad);
-
- return othercaps;
-}
- --><!-- example-end caps.func b --></programlisting>
- <para>
- In here, we check the mimetype of the provided caps. Normally, you don't
- need to do that in your own plugin/element, because the core does that
- for you. We simply use it to show how to retrieve the mimetype from a
- provided set of caps. Types are stored in <ulink type="http"
- url="../../gstreamer/html/gstreamer-GstStructure.html"><classname>GstStructure
- </classname></ulink> internally. A <ulink
- type="http" url="../../gstreamer/html/gstreamer-GstCaps.html"><classname>GstCaps
- </classname></ulink> is nothing more than a small
- wrapper for 0 or more structures/types. From the structure, you can also
- retrieve properties, as is shown above with the function
- <function>gst_structure_get_int ()</function>.
- </para>
- <para>
- If your <function>_link ()</function> function does not need to perform
- any specific operation (i.e. it will only forward caps), you can set it
- to <function>gst_pad_proxy_link ()</function>. This is a link forwarding
- function implementation provided by the core. It is useful for elements
- such as <classname>identity</classname>.
- </para>
- </sect1>
<!-- example-begin pads.c --><!--
#include "init.func"
-#include "caps.func"
static gboolean
-gst_my_filter_event (GstPad * pad, GstEvent * event)
+gst_my_filter_event (GstPad * pad, GstObject * parent, GstEvent * event)
{
- return gst_pad_event_default (pad, event);
+ return gst_pad_event_default (pad, parent, event);
}
static GstFlowReturn
-gst_my_filter_chain (GstPad * pad, GstBuffer * buf)
+gst_my_filter_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
{
- return gst_pad_push (GST_MY_FILTER (GST_OBJECT_PARENT (pad))->srcpad, buf);
+ return gst_pad_push (GST_MY_FILTER (parent)->srcpad, buf);
}
static GstStateChangeReturn
<!-- ############ chapter ############# -->
-<chapter id="chapter-building-args" xreflabel="Adding Arguments">
- <title>Adding Arguments</title>
+<chapter id="chapter-building-args" xreflabel="Adding Properties">
+ <title>Adding Properties</title>
<para>
The primary and most important way of controlling how an element behaves,
is through GObject properties. GObject properties are defined in the
and can then fill in the value or take action required for that property
to change value internally.
</para>
+ <para>
+ You probably also want to keep an instance variable around
+ with the currently configured value of the property that you use in the
+ get and set functions.
+ Note that <classname>GObject</classname> will not automatically set your
+ instance variable to the default value, you will have to do that in the
+ <function>_init ()</function> function of your element.
+ </para>
<programlisting><!-- example-begin properties.c a --><!--
#include "filter.h"
-GST_BOILERPLATE (GstMyFilter, gst_my_filter, GstElement, GST_TYPE_ELEMENT);
+G_DEFINE_TYPE (GstMyFilter, gst_my_filter, GST_TYPE_ELEMENT);
static void
-gst_my_filter_base_init (gpointer klass)
+gst_my_filter_class_init (gpointer klass)
{
}
static void
<!-- example-begin properties.c b -->
/* properties */
enum {
- ARG_0,
- ARG_SILENT
+ PROP_0,
+ PROP_SILENT
/* FILL ME */
};
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ /* define virtual function pointers */
+ object_class->set_property = gst_my_filter_set_property;
+ object_class->get_property = gst_my_filter_get_property;
+
/* define properties */
- g_object_class_install_property (object_class, ARG_SILENT,
+ g_object_class_install_property (object_class, PROP_SILENT,
g_param_spec_boolean ("silent", "Silent",
"Whether to be very verbose or not",
FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- /* define virtual function pointers */
- object_class->set_property = gst_my_filter_set_property;
- object_class->get_property = gst_my_filter_get_property;
}
static void
GstMyFilter *filter = GST_MY_FILTER (object);
switch (prop_id) {
- case ARG_SILENT:
+ case PROP_SILENT:
filter->silent = g_value_get_boolean (value);
g_print ("Silent argument was changed to %s\n",
filter->silent ? "true" : "false");
GstMyFilter *filter = GST_MY_FILTER (object);
switch (prop_id) {
- case ARG_SILENT:
+ case PROP_SILENT:
g_value_set_boolean (value, filter->silent);
break;
default:
#include "register.func"
--><!-- example-end properties.c c --></programlisting>
<para>
- The above is a very simple example of how arguments are used. Graphical
- applications - for example GStreamer Editor - will use these properties
- and will display a user-controllable widget with which these properties
- can be changed. This means that - for the property to be as user-friendly
+ The above is a very simple example of how properties are used. Graphical
+ applications will use these properties and will display a
+ user-controllable widget with which these properties can be changed.
+ This means that - for the property to be as user-friendly
as possible - you should be as exact as possible in the definition of the
property. Not only in defining ranges in between which valid properties
can be located (for integers, floats, etc.), but also in using very
gst_videotestsrc_class_init (GstvideotestsrcClass *klass)
{
[..]
- g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TYPE,
+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PATTERN,
g_param_spec_enum ("pattern", "Pattern",
"Type of test pattern to generate",
- GST_TYPE_VIDEOTESTSRC_PATTERN, 1, G_PARAM_READWRITE |
- G_PARAM_STATIC_STRINGS));
+ GST_TYPE_VIDEOTESTSRC_PATTERN, GST_VIDEOTESTSRC_SMPTE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
[..]
}
</programlisting>
--- /dev/null
+
+<!-- ############ 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>
GstElement or some other class not built on top of a base class, you
will most likely have to implement your own state change function to
be notified of state changes. This is definitively necessary if your
- plugin is a decoder or an encoder, as there are no base classes for
- decoders or encoders yet.
+ plugin is a demuxer or a muxer, as there are no base classes for
+ muxers or demuxers yet.
</para>
<para>
An element can be notified of state changes through a virtual function
<title>Building a Test Application</title>
<para>
Often, you will want to test your newly written plugin in an as small
- setting as possible. Usually, <filename>gst-launch</filename> is a
+ setting as possible. Usually, <filename>gst-launch-1.0</filename> is a
good first step at testing a plugin. If you have not installed your
plugin in a directory that GStreamer searches, then you will need to
set the plugin path. Either set GST_PLUGIN_PATH to the directory
If you based your plugin off of the gst-plugin template, then this
will look something like
<command>
- gst-launch --gst-plugin-path=$HOME/gst-template/gst-plugin/src/.libs TESTPIPELINE
+ gst-launch-1.0 --gst-plugin-path=$HOME/gst-template/gst-plugin/src/.libs TESTPIPELINE
</command>
However, you will often need more
- testing features than gst-launch can provide, such as seeking, events,
+ testing features than gst-launch-1.0 can provide, such as seeking, events,
interactivity and more. Writing your own small testing program is the
easiest way to accomplish this. This section explains - in a few words
- how to do that. For a complete application development guide, see the
<para>
At the start, you need to initialize the &GStreamer; core library by
calling <function>gst_init ()</function>. You can alternatively call
- <function>gst_init_with_popt_tables ()</function>, which will return
- a pointer to popt tables. You can then use libpopt to handle the
- given argument table, and this will finish the &GStreamer; initialization.
+ <function>gst_init_get_option_group ()</function>, which will return
+ a pointer to GOptionGroup. You can then use GOption to handle the
+ initialization, and this will finish the &GStreamer; initialization.
</para>
<para>
application. Also, you can use a <classname>fakesink</classname>
element at the end of the pipeline to dump your data to the stdout
(in order to do this, set the <function>dump</function> property to
- TRUE). Lastly, you can use the <classname>efence</classname> element
- (indeed, an eletric fence memory debugger wrapper element) to check
- for memory errors.
+ TRUE). Lastly, you can use valgrind to check for memory errors.
</para>
<para>
- During linking, your test application can use fixation or filtered caps
+ During linking, your test application can use filtered caps
as a way to drive a specific type of data to or from your element. This
is a very simple and effective way of checking multiple types of input
and output in your element.
</para>
<para>
- Running the pipeline happens through the <function>gst_bin_iterate ()</function>
- function. Note that during running, you should connect to at least the
- <quote>error</quote> and <quote>eos</quote> signals on the pipeline
+ Note that during running, you should listen for at least the
+ <quote>error</quote> and <quote>eos</quote> messages on the bus
and/or your plugin/element to check for correct handling of this. Also,
you should add events into the pipeline and make sure your plugin handles
these correctly (with respect to clocking, internal caching, etc.).
GstElement *convert1, *convert2, *resample;
GMainLoop *loop;
GstBus *bus;
+ guint watch_id;
/* initialization */
gst_init (&argc, &argv);
/* watch for messages on the pipeline's bus (note that this will only
* work like this when a GLib main loop is running) */
bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
- gst_bus_add_watch (bus, bus_call, loop);
+ watch_id = gst_bus_add_watch (bus, bus_call, loop);
gst_object_unref (bus);
filesrc = gst_element_factory_make ("filesrc", "my_filesource");
* depending on the environment (output used, sound card, driver etc.) */
convert2 = gst_element_factory_make ("audioconvert", "audioconvert2");
resample = gst_element_factory_make ("audioresample", "audioresample");
- sink = gst_element_factory_make ("osssink", "audiosink");
+ sink = gst_element_factory_make ("pulsesink", "audiosink");
if (!sink || !decoder) {
g_print ("Decoder or output could not be found - check your install\n");
return -1;
} else if (!filter) {
g_print ("Your self-written filter could not be found. Make sure it "
- "is installed correctly in $(libdir)/gstreamer-0.10/ or "
- "~/.gstreamer-0.10/plugins/ and that gst-inspect-0.10 lists it. "
- "If it doesn't, check with 'GST_DEBUG=*:2 gst-inspect-0.10' for "
+ "is installed correctly in $(libdir)/gstreamer-1.0/ or "
+ "~/.gstreamer-1.0/plugins/ and that gst-inspect-1.0 lists it. "
+ "If it doesn't, check with 'GST_DEBUG=*:2 gst-inspect-1.0' for "
"the reason why it is not being loaded.");
return -1;
}
/* clean up */
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
+ g_source_remove (watch_id);
+ g_main_loop_unref (loop);
return 0;
}
processes a stream of data. Producers and consumers of data are called
<emphasis>source</emphasis> and <emphasis>sink</emphasis> elements,
respectively. <emphasis>Bin</emphasis> elements contain other elements.
- One type of bin is responsible for scheduling the elements that they
+ One type of bin is responsible for synchronization of the elements that they
contain so that data flows smoothly. Another type of bin, called
<emphasis>autoplugger</emphasis> elements, automatically add other
elements to the bin and links them together so that they act as a
The plugin mechanism is used everywhere in &GStreamer;, even if only the
standard packages are being used. A few very basic functions reside in the
core library, and all others are implemented in plugins. A plugin registry
- is used to store the details of the plugins in an XML file. This way, a
- program using &GStreamer; does not have to load all plugins to determine
- which are needed. Plugins are only loaded when their provided elements are
- requested.
+ is used to store the details of the plugins in an binary registry file.
+ This way, a program using &GStreamer; does not have to load all plugins to
+ determine which are needed. Plugins are only loaded when their provided
+ elements are requested.
</para>
<para>
See the &GstLibRef; for the current implementation details of <ulink
<!-- ############ sect1 ############# -->
<sect1 id="section-basics-data" xreflabel="Data, Buffers and Events">
- <title>Data, Buffers and Events</title>
+ <title>GstMiniObject, Buffers and Events</title>
<para>
All streams of data in &GStreamer; are chopped up into chunks that are
passed from a source pad on one element to a sink pad on another element.
- <emphasis>Data</emphasis> are structures used to hold these chunks of
- data.
+ <emphasis>GstMiniObject</emphasis> is the structure used to hold these
+ chunks of data.
</para>
<para>
- Data contains the following important types:
+ GstMiniObject contains the following important types:
<itemizedlist>
<listitem>
<para>
- An exact type indicating what type of data (control, content, ...)
- this Data is.
+ An exact type indicating what type of data (event, buffer, ...)
+ this GstMiniObject is.
</para>
</listitem>
<listitem>
<para>
A reference count indicating the number of elements currently
- holding a reference to the buffer. When the buffer reference count
- falls to zero, the buffer will be unlinked, and its memory will be
+ holding a reference to the miniobject. When the reference count
+ falls to zero, the miniobject will be disposed, and its memory will be
freed in some sense (see below for more details).
</para>
</listitem>
</itemizedlist>
</para>
<para>
- There are two types of data defined: events (control) and buffers
- (content).
+ For data transport, there are two types of GstMiniObject defined:
+ events (control) and buffers (content).
</para>
<para>
Buffers may contain any sort of data that the two linked pads
<itemizedlist>
<listitem>
<para>
- A pointer to the buffer's data.
- </para>
- </listitem>
- <listitem>
- <para>
- An integer indicating the size of the buffer's data.
+ Pointers to one or more GstMemory objects. GstMemory objects are
+ refcounted objects that encapsulate a region of memory.
</para>
</listitem>
<listitem>
contain information on the state of the stream flowing between the two
linked pads. Events will only be sent if the element explicitly supports
them, else the core will (try to) handle the events automatically. Events
- are used to indicate, for example, a clock discontinuity, the end of a
+ are used to indicate, for example, a media type, the end of a
media stream or that the cache should be flushed.
</para>
<para>
</para>
<para>
Another way an element might get specialized buffers is to
- request them from a downstream peer. These are called
- downstream-allocated buffers. Elements can ask a
- peer connected to a source pad to create an empty buffer of
- a given size. If a downstream element is able to create a
- special buffer of the correct size, it will do so. Otherwise
- &GStreamer; will automatically create a generic buffer instead.
- The element that requested the buffer can then copy data into
- the buffer, and push the buffer to the source pad it was
- allocated from.
+ request them from a downstream peer through a GstBufferPool or
+ 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
to hardware, or have direct access to hardware. It is common
- for these elements to be able to create downstream-allocated
- buffers for their upstream peers. One such example is
+ for these elements to be able to create a GstBufferPool or
+ GstAllocator for their upstream peers. One such example is
ximagesink. It creates buffers that contain XImages. Thus,
when an upstream peer copies data into the buffer, it is copying
directly into the XImage, enabling ximagesink to draw the
<!-- ############ sect1 ############# -->
<sect1 id="section-basics-types" xreflabel="Types and Properties">
- <title>Mimetypes and Properties</title>
+ <title>Media types and Properties</title>
<para>
&GStreamer; uses a type system to ensure that the data passed between
elements is in a recognized format. The type system is also important
for ensuring that the parameters required to fully specify a format match
up correctly when linking pads between elements. Each link that is
made between elements has a specified type and optionally a set of
- properties.
+ properties. See more about caps negotiation in
+ <xref linkend="chapter-negotiation"/>.
</para>
<!-- ############ sect2 ############# -->
<para>
&GStreamer; already supports many basic media types. Following is a
table of a few of the basic types used for buffers in
- &GStreamer;. The table contains the name ("mime type") and a
+ &GStreamer;. The table contains the name ("media type") and a
description of the type, the properties associated with the type, and
the meaning of each property. A full list of supported types is
included in <xref linkend="section-types-definitions"/>.
<thead>
<row>
- <entry>Mime Type</entry>
+ <entry>Media Type</entry>
<entry>Description</entry>
<entry>Property</entry>
<entry>Property Type</entry>
The pipeline design is made to have little overhead above what the
applied filters induce. This makes &GStreamer; a good framework for
designing even high-end audio applications which put high demands on
- latency.
+ latency or performance.
</para>
<para>
<para>
The framework is based on plugins that will provide the various codec
and other functionality. The plugins can be linked and arranged in
- a pipeline. This pipeline defines the flow of the data. Pipelines can
- also be edited with a GUI editor and saved as XML so that pipeline
- libraries can be made with a minimum of effort.
+ a pipeline. This pipeline defines the flow of the data.
</para>
<para>
The &GStreamer; core function is to provide a framework for plugins,
- data flow and media type handling/negotiation. It also provides an
- API to write applications using the various plugins.
+ data flow, synchronization and media type handling/negotiation. It
+ also provides an API to write applications using the various plugins.
</para>
</sect1>
</listitem>
<listitem>
<para>
- Adding new mime-types to the registry along with typedetect functions.
+ Adding new media types to the registry along with typedetect functions.
This will allow your plugin to operate on a completely new media type.
</para>
</listitem>
needs to implement a bunch of virtual functions and will work
automatically.
</para>
+ <para>
+ The base class implement much of the synchronization logic that a
+ sink has to perform.
+ </para>
<para>
The <classname>GstBaseSink</classname> base-class specifies some
limitations on elements, though:
<listitem>
<para>
It requires that the sink only has one sinkpad. Sink elements that
- need more than one sinkpad, cannot use this base-class.
- </para>
- </listitem>
- <listitem>
- <para>
- The base-class owns the pad, and specifies caps negotiation, data
- handling, pad allocation and such functions. If you need more than
- the ones provided as virtual functions, then you cannot use this
- base-class.
- </para>
- </listitem>
- <listitem>
- <para>
- By implementing the <function>pad_allocate ()</function> function,
- it is possible for upstream elements to use special memory, such
- as memory on the X server side that only the sink can allocate, or
- even hardware memory <function>mmap ()</function>'ed from the kernel.
- Note that in almost all cases, you will want to subclass the
- <classname>GstBuffer</classname> object, so that your own set of
- functions will be called when the buffer loses its last reference.
+ need more than one sinkpad, must make a manager element with
+ multiple GstBaseSink elements inside.
</para>
</listitem>
</itemizedlist>
<para>
Sink elements can derive from <classname>GstBaseSink</classname> using
- the usual <classname>GObject</classname> type creation voodoo, or by
- using the convenience macro <function>GST_BOILERPLATE ()</function>:
+ the usual <classname>GObject</classname> convenience macro
+ <function>G_DEFINE_TYPE ()</function>:
</para>
<programlisting>
-GST_BOILERPLATE_FULL (GstMySink, gst_my_sink, GstBaseSink, GST_TYPE_BASE_SINK);
+G_DEFINE_TYPE (GstMySink, gst_my_sink, GST_TYPE_BASE_SINK);
[..]
<title>Writing an audio sink</title>
<para>
Essentially, audio sink implementations are just a special case of a
- general sink. There are two audio base classes that you can choose to
+ general sink. An audio sink has the added complexity that it needs to
+ schedule playback of samples. It must match the clock selected in the
+ pipeline against the clock of the audio device and calculate and
+ compensate for drift and jitter.
+ </para>
+ <para>
+ There are two audio base classes that you can choose to
derive from, depending on your needs:
- <classname>GstBaseAudiosink</classname> and
- <classname>GstAudioSink</classname>. The baseaudiosink provides full
+ <classname>GstAudioBasesink</classname> and
+ <classname>GstAudioSink</classname>. The audiobasesink provides full
control over how synchronization and scheduling is handled, by using
a ringbuffer that the derived class controls and provides. The
- audiosink base-class is a derived class of the baseaudiosink,
+ audiosink base-class is a derived class of the audiobasesink,
implementing a standard ringbuffer implementing default
synchronization and providing a standard audio-sample clock. Derived
classes of this base class merely need to provide a <function>_open
()</function> function implementation, and some optional functions.
This should suffice for many sound-server output elements and even
most interfaces. More demanding audio systems, such as Jack, would
- want to implement the <classname>GstBaseAudioSink</classname>
+ want to implement the <classname>GstAudioBaseSink</classname>
base-class.
</para>
<para>
<listitem>
<para>
There is one and only one sourcepad. Source elements requiring
- multiple sourcepads cannot use this base-class.
- </para>
- </listitem>
- <listitem>
- <para>
- Since the base-class owns the pad and derived classes can only
- control it as far as the virtual functions allow, you are limited
- to the functionality provided by the virtual functions. If you need
- more, you cannot use this base-class.
+ multiple sourcepads must implement a manager bin and use multiple
+ source elements internally or make a manager element that uses
+ a source element and a demuxer inside.
</para>
</listitem>
</itemizedlist>
It is possible to use special memory, such as X server memory pointers
or <function>mmap ()</function>'ed memory areas, as data pointers in
buffers returned from the <function>create()</function> virtual function.
- In almost all cases, you will want to subclass
- <classname>GstBuffer</classname> so that your own set of functions can
- be called when the buffer is destroyed.
</para>
<sect2 id="section-base-audiosrc" xreflabel="Writing an audio source">
linkend="section-base-audiosink"/>; one is ringbuffer-based, and
requires the derived class to take care of its own scheduling,
synchronization and such. The other is based on this
- <classname>GstBaseAudioSrc</classname> and is called
+ <classname>GstAudioBaseSrc</classname> and is called
<classname>GstAudioSrc</classname>, and provides a simple
<function>open ()</function>, <function>close ()</function> and
<function>read ()</function> interface, which is rather simple to
<listitem>
<para>
To embed an element, or a series of elements, into something that
- looks and works like a simple element to the outside world.
+ looks and works like a simple element to the outside world. This
+ is particular handy for implementing sources and sink elements with
+ multiple pads.
</para>
</listitem>
</itemizedlist>
and the N-to-1 element synchronizes those streams by
expected-timestamp-based logic. This means it lets all streams wait
except for the one that provides the earliest next-expected timestamp.
- When that stream has passwed one buffer, the next
+ When that stream has passed one buffer, the next
earliest-expected-timestamp is calculated, and we start back where we
were, until all streams have reached EOS. There is a helper base class,
called <classname>GstCollectPads</classname>, that will help you to do
{
GstAviMux *mux = GST_AVI_MUX (gst_pad_get_parent (pad));
GstStructure *str = gst_caps_get_structure (caps, 0);
- const gchar *mime = gst_structure_get_name (str);
+ const gchar *media = gst_structure_get_name (str);
if (!strcmp (str, "audio/mpeg")) {
/* get version, make sure it's 1, get layer, make sure it's 1-3,
<!ENTITY BUILDING_DEBUG SYSTEM "building-debug.xml">
<!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_NEGOTIATION SYSTEM "advanced-negotiation.xml">
+<!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_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">
&BUILDING_BOILER;
&BUILDING_PADS;
&BUILDING_CHAINFN;
+ &BUILDING_EVENTFN;
+ &BUILDING_QUERYFN;
&BUILDING_STATE;
&BUILDING_PROPS;
&BUILDING_SIGNALS;
</para>
</partintro>
- &ADVANCED_NEGOTIATION;
+ &ADVANCED_REQUEST;
&ADVANCED_SCHEDULING;
+ &ADVANCED_NEGOTIATION;
+ &ADVANCED_ALLOCATION;
&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 -->
</para>
</authorblurb>
</author>
+ <author>
+ <firstname>Wim</firstname>
+ <surname>Taymans</surname>
+ <authorblurb>
+ <para>
+ <email>wim.taymans@gmail.com</email>
+ </para>
+ </authorblurb>
+ </author>
</authorgroup>
<legalnotice id="misc-legalnotice">
$(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 \
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@
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@
$(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 \
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@
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@
$(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 \
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@
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@
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 ();
copy = gst_allocator_alloc (mem->allocator, size, ¶ms);
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;
}
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>,"
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);
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;
}
const gchar * description, const gchar * author)
{
g_return_if_fail (GST_IS_ELEMENT_CLASS (klass));
+ g_return_if_fail (longname != NULL && *longname != '\0');
+ g_return_if_fail (classification != NULL && *classification != '\0');
+ g_return_if_fail (description != NULL && *description != '\0');
+ g_return_if_fail (author != NULL && *author != '\0');
gst_structure_id_set ((GstStructure *) klass->metadata,
GST_QUARK (ELEMENT_METADATA_LONGNAME), G_TYPE_STRING, longname,
GValue val = G_VALUE_INIT;
g_return_if_fail (GST_IS_ELEMENT_CLASS (klass));
+ g_return_if_fail (longname != NULL && *longname != '\0');
+ g_return_if_fail (classification != NULL && *classification != '\0');
+ g_return_if_fail (description != NULL && *description != '\0');
+ g_return_if_fail (author != NULL && *author != '\0');
g_value_init (&val, G_TYPE_STRING);
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;
}
}
+/**
+ * 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
* @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.
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 */
factory->interfaces = NULL;
}
+#define CHECK_METADATA_FIELD(klass, name, key) \
+ G_STMT_START { \
+ const gchar *metafield = gst_element_class_get_metadata (klass, key); \
+ if (G_UNLIKELY (metafield == NULL || *metafield == '\0')) { \
+ g_warning ("Element factory metadata for '%s' has no valid %s field", name, key); \
+ goto detailserror; \
+ } \
+ } G_STMT_END;
+
/**
* gst_element_register:
* @plugin: (allow-none): #GstPlugin to register the element with, or NULL for
/* provide info needed during class structure setup */
g_type_set_qdata (type, __gst_elementclass_factory, factory);
klass = GST_ELEMENT_CLASS (g_type_class_ref (type));
-#if 0
- /* FIXME */
- if ((klass->details.longname == NULL) ||
- (klass->details.klass == NULL) || (klass->details.author == NULL))
- goto detailserror;
-#endif
+
+ CHECK_METADATA_FIELD (klass, name, GST_ELEMENT_METADATA_LONGNAME);
+ CHECK_METADATA_FIELD (klass, name, GST_ELEMENT_METADATA_KLASS);
+ CHECK_METADATA_FIELD (klass, name, GST_ELEMENT_METADATA_DESCRIPTION);
+ CHECK_METADATA_FIELD (klass, name, GST_ELEMENT_METADATA_AUTHOR);
factory->type = type;
factory->metadata = gst_structure_copy ((GstStructure *) klass->metadata);
return FALSE;
}
-#if 0
detailserror:
{
- GST_WARNING_OBJECT (factory,
- "The GstElementDetails don't seem to have been set properly");
gst_element_factory_cleanup (factory);
return FALSE;
}
-#endif
}
/**
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 ")",
#define GST_PROXY_PAD_TARGET(pad) (GST_PAD_PEER (GST_PROXY_PAD_INTERNAL (pad)))
#define GST_PROXY_PAD_INTERNAL(pad) (GST_PROXY_PAD_PRIVATE (pad)->internal)
+#define GST_PROXY_PAD_ACQUIRE_INTERNAL(pad, internal, retval) \
+ internal = \
+ GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD_CAST (pad))); \
+ if (internal == NULL) \
+ return retval;
+
+#define GST_PROXY_PAD_RELEASE_INTERNAL(internal) gst_object_unref (internal);
+
struct _GstProxyPadPrivate
{
GstPad *internal;
g_return_val_if_fail (GST_IS_PROXY_PAD (pad), NULL);
- internal = GST_PROXY_PAD_INTERNAL (pad);
+ GST_PROXY_PAD_ACQUIRE_INTERNAL (pad, internal, NULL);
+
g_value_init (&v, GST_TYPE_PAD);
- g_value_set_object (&v, internal);
+ g_value_take_object (&v, internal);
res = gst_iterator_new_single (GST_TYPE_PAD, &v);
g_value_unset (&v);
g_return_val_if_fail (GST_IS_PROXY_PAD (pad), GST_FLOW_ERROR);
g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR);
- internal = GST_PROXY_PAD_INTERNAL (pad);
+ GST_PROXY_PAD_ACQUIRE_INTERNAL (pad, internal, GST_FLOW_NOT_LINKED);
res = gst_pad_push (internal, buffer);
+ GST_PROXY_PAD_RELEASE_INTERNAL (internal);
return res;
}
g_return_val_if_fail (GST_IS_PROXY_PAD (pad), GST_FLOW_ERROR);
g_return_val_if_fail (GST_IS_BUFFER_LIST (list), GST_FLOW_ERROR);
- internal = GST_PROXY_PAD_INTERNAL (pad);
+ GST_PROXY_PAD_ACQUIRE_INTERNAL (pad, internal, GST_FLOW_NOT_LINKED);
res = gst_pad_push_list (internal, list);
+ GST_PROXY_PAD_RELEASE_INTERNAL (internal);
return res;
}
g_return_val_if_fail (GST_IS_PROXY_PAD (pad), GST_FLOW_ERROR);
g_return_val_if_fail (buffer != NULL, GST_FLOW_ERROR);
- internal = GST_PROXY_PAD_INTERNAL (pad);
+ GST_PROXY_PAD_ACQUIRE_INTERNAL (pad, internal, GST_FLOW_NOT_LINKED);
res = gst_pad_pull_range (internal, offset, size, buffer);
+ GST_PROXY_PAD_RELEASE_INTERNAL (internal);
return res;
}
/* in both cases (SRC and SINK) we activate just the internal pad. The targets
* will be activated later (or already in case of a ghost sinkpad). */
- other = GST_PROXY_PAD_INTERNAL (pad);
+ GST_PROXY_PAD_ACQUIRE_INTERNAL (pad, other, FALSE);
ret = gst_pad_activate_mode (other, GST_PAD_MODE_PUSH, active);
+ GST_PROXY_PAD_RELEASE_INTERNAL (other);
return ret;
}
* which will trigger gst_ghost_pad_activate_pull_default, which propagates even
* further upstream */
GST_LOG_OBJECT (pad, "pad is src, activate internal");
- other = GST_PROXY_PAD_INTERNAL (pad);
+ GST_PROXY_PAD_ACQUIRE_INTERNAL (pad, other, FALSE);
ret = gst_pad_activate_mode (other, GST_PAD_MODE_PULL, active);
+ GST_PROXY_PAD_RELEASE_INTERNAL (other);
} else if (G_LIKELY ((other = gst_pad_get_peer (pad)))) {
/* We are SINK, the ghostpad is SRC, we propagate the activation upstream
* since we hold a pointer to the upstream peer. */
(active ? "" : "de"), GST_DEBUG_PAD_NAME (pad));
/* just activate the internal pad */
- other = GST_PROXY_PAD_INTERNAL (pad);
+ GST_PROXY_PAD_ACQUIRE_INTERNAL (pad, other, FALSE);
ret = gst_pad_activate_mode (other, GST_PAD_MODE_PUSH, active);
+ GST_PROXY_PAD_RELEASE_INTERNAL (other);
return ret;
}
* activation function of the internal pad to propagate the activation
* upstream */
GST_LOG_OBJECT (pad, "pad is src, activate internal");
- other = GST_PROXY_PAD_INTERNAL (pad);
+ GST_PROXY_PAD_ACQUIRE_INTERNAL (pad, other, FALSE);
ret = gst_pad_activate_mode (other, GST_PAD_MODE_PULL, active);
+ GST_PROXY_PAD_RELEASE_INTERNAL (other);
} else if (G_LIKELY ((other = gst_pad_get_peer (pad)))) {
/* We are SINK and activated by the internal pad, propagate activation
* upstream because we hold a ref to the upstream peer */
g_return_val_if_fail (GST_PAD_CAST (gpad) != newtarget, FALSE);
g_return_val_if_fail (newtarget != GST_PROXY_PAD_INTERNAL (gpad), FALSE);
- /* no need for locking, the internal pad's lifecycle is directly linked to the
- * ghostpad's */
+ GST_OBJECT_LOCK (gpad);
internal = GST_PROXY_PAD_INTERNAL (gpad);
if (newtarget)
GST_DEBUG_OBJECT (gpad, "clearing target");
/* clear old target */
- GST_OBJECT_LOCK (gpad);
if ((oldtarget = GST_PROXY_PAD_TARGET (gpad))) {
GST_OBJECT_UNLOCK (gpad);
#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)
static void gst_debug_reset_threshold (gpointer category, gpointer unused);
static void gst_debug_reset_all_thresholds (void);
-#ifdef HAVE_PRINTF_EXTENSION
+#ifdef GST_USING_PRINTF_EXTENSION
static int _gst_info_printf_extension_ptr (FILE * stream,
const struct printf_info *info, const void *const *args);
static int _gst_info_printf_extension_segment (FILE * stream,
/* get time we started for debugging messages */
_priv_gst_info_start_time = gst_util_get_timestamp ();
-#ifdef HAVE_PRINTF_EXTENSION
+#ifdef GST_USING_PRINTF_EXTENSION
#ifdef HAVE_REGISTER_PRINTF_SPECIFIER
register_printf_specifier (GST_PTR_FORMAT[0], _gst_info_printf_extension_ptr,
_gst_info_printf_extension_arginfo);
return g_strdup_printf ("%p", ptr);
}
-#ifdef HAVE_PRINTF_EXTENSION
+#ifdef GST_USING_PRINTF_EXTENSION
static gchar *
gst_debug_print_segment (gpointer ptr)
}
}
-#endif /* HAVE_PRINTF_EXTENSION */
+#endif /* GST_USING_PRINTF_EXTENSION */
/**
* gst_debug_construct_term_color:
__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
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;
}
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;
}
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;
}
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);
}
}
/*** PRINTF EXTENSIONS ********************************************************/
-#ifdef HAVE_PRINTF_EXTENSION
+#ifdef GST_USING_PRINTF_EXTENSION
static int
_gst_info_printf_extension_ptr (FILE * stream, const struct printf_info *info,
const void *const *args)
}
return 1;
}
-#endif /* HAVE_PRINTF_EXTENSION */
+#endif /* GST_USING_PRINTF_EXTENSION */
static void
gst_info_dump_mem_line (gchar * linebuf, gsize linebuf_size,
GstMetaTransformFunction transform_func)
{
GstMetaInfo *info;
+ GType type;
g_return_val_if_fail (api != 0, NULL);
g_return_val_if_fail (impl != NULL, NULL);
g_return_val_if_fail (size != 0, NULL);
+ /* first try to register the implementation name. It's possible
+ * that this fails because it was already registered. Don't warn,
+ * glib did this for us already. */
+ type = g_pointer_type_register_static (impl);
+ if (type == 0)
+ return NULL;
+
info = g_slice_new (GstMetaInfo);
info->api = api;
- info->type = g_pointer_type_register_static (impl);
+ info->type = type;
info->size = size;
info->init_func = init_func;
info->free_func = free_func;
{
mini_object->type = type;
mini_object->refcount = 1;
- mini_object->lockstate =
- (flags & GST_MINI_OBJECT_FLAG_LOCK_READONLY ? GST_LOCK_FLAG_READ : 0);
+ mini_object->lockstate = 0;
mini_object->flags = flags;
mini_object->copy = copy_func;
g_return_val_if_fail (object != NULL, FALSE);
g_return_val_if_fail (GST_MINI_OBJECT_IS_LOCKABLE (object), FALSE);
+ if (G_UNLIKELY (object->flags & GST_MINI_OBJECT_FLAG_LOCK_READONLY &&
+ flags & GST_LOCK_FLAG_WRITE))
+ return FALSE;
+
do {
access_mode = flags & FLAG_MASK;
newstate = state = g_atomic_int_get (&object->lockstate);
* push or pull mode, just return. Otherwise dispatches to the pad's activate
* function to perform the actual activation.
*
- * If not @active, checks the pad's current mode and calls
- * gst_pad_activate_push() or gst_pad_activate_pull(), as appropriate, with a
- * FALSE argument.
+ * If not @active, calls gst_pad_activate_mode() with the pad's current mode
+ * and a FALSE argument.
*
* Returns: #TRUE if the operation was successful.
*
* @notify: notify called when @activate will not be used anymore.
*
* Sets the given activate function for @pad. The activate function will
- * dispatch to gst_pad_activate_push() or gst_pad_activate_pull() to perform
- * the actual activation. Only makes sense to set on sink pads.
+ * dispatch to gst_pad_activate_mode() to perform the actual activation.
+ * Only makes sense to set on sink pads.
*
* Call this function if your sink pad can start a pull-based task.
*/
GST_DEBUG_OBJECT (pad, "event %s marked received",
GST_EVENT_TYPE_NAME (event));
break;
+ case GST_FLOW_CUSTOM_SUCCESS:
+ /* we can't assume the event is received when it was dropped */
+ GST_DEBUG_OBJECT (pad, "event %s was dropped, mark pending",
+ GST_EVENT_TYPE_NAME (event));
+ GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_PENDING_EVENTS);
+ data->ret = GST_FLOW_OK;
+ break;
case GST_FLOW_NOT_LINKED:
/* not linked is not a problem, we are sticky so the event will be
* sent later but only for non-EOS events */
- GST_DEBUG_OBJECT (pad, "pad was not linked");
+ GST_DEBUG_OBJECT (pad, "pad was not linked, mark pending");
if (GST_EVENT_TYPE (event) != GST_EVENT_EOS)
data->ret = GST_FLOW_OK;
- /* fallthrough */
+ GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_PENDING_EVENTS);
+ break;
default:
- GST_DEBUG_OBJECT (pad, "mark pending events");
+ GST_DEBUG_OBJECT (pad, "result %s, mark pending events",
+ gst_flow_get_name (data->ret));
GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_PENDING_EVENTS);
break;
}
if (ev && !ev->received) {
data.ret = gst_pad_push_event_unchecked (pad, gst_event_ref (ev->event),
GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM);
+ /* the event could have been dropped. Because this can only
+ * happen if the user asked for it, it's not an error */
+ if (data.ret == GST_FLOW_CUSTOM_SUCCESS)
+ data.ret = GST_FLOW_OK;
}
}
}
}
no_peer:
{
- GST_WARNING_OBJECT (pad, "pad has no peer");
+ GST_INFO_OBJECT (pad, "pad has no peer");
GST_OBJECT_UNLOCK (pad);
return FALSE;
}
}
}
+/* must be called with pad object lock */
static gboolean
-gst_pad_store_sticky_event (GstPad * pad, GstEvent * event, gboolean locked)
+gst_pad_store_sticky_event (GstPad * pad, GstEvent * event)
{
guint i, len;
GstEventType type;
switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_CAPS:
- if (locked)
- GST_OBJECT_UNLOCK (pad);
+ GST_OBJECT_UNLOCK (pad);
GST_DEBUG_OBJECT (pad, "notify caps");
g_object_notify_by_pspec ((GObject *) pad, pspec_caps);
- if (locked)
- GST_OBJECT_LOCK (pad);
+ GST_OBJECT_LOCK (pad);
break;
default:
break;
switch (ret) {
case GST_FLOW_CUSTOM_SUCCESS:
GST_DEBUG_OBJECT (pad, "dropped event");
- ret = GST_FLOW_OK;
break;
default:
GST_DEBUG_OBJECT (pad, "an error occured %s", gst_flow_get_name (ret));
if (G_UNLIKELY (GST_PAD_IS_EOS (pad)))
goto eos;
- /* srcpad sticky events are store immediately, the received flag is set
+ /* srcpad sticky events are stored immediately, the received flag is set
* to FALSE and will be set to TRUE when we can successfully push the
* event to the peer pad */
- if (gst_pad_store_sticky_event (pad, event, TRUE)) {
+ if (gst_pad_store_sticky_event (pad, event)) {
GST_DEBUG_OBJECT (pad, "event %s updated", GST_EVENT_TYPE_NAME (event));
}
if (GST_EVENT_TYPE (event) == GST_EVENT_EOS)
res = (check_sticky (pad) == GST_FLOW_OK);
}
if (!sticky) {
+ GstFlowReturn ret;
+
/* other events are pushed right away */
- res = (gst_pad_push_event_unchecked (pad, event, type) == GST_FLOW_OK);
+ ret = gst_pad_push_event_unchecked (pad, event, type);
+ /* dropped events by a probe are not an error */
+ res = (ret == GST_FLOW_OK || ret == GST_FLOW_CUSTOM_SUCCESS);
} else {
/* Errors in sticky event pushing are no problem and ignored here
* as they will cause more meaningful errors during data flow.
if (sticky) {
if (ret == GST_FLOW_OK) {
+ GST_OBJECT_LOCK (pad);
+ /* can't store on flushing pads */
+ if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
+ goto flushing;
+
+ if (G_UNLIKELY (GST_PAD_IS_EOS (pad)))
+ goto eos;
+
/* after the event function accepted the event, we can store the sticky
* event on the pad */
- gst_pad_store_sticky_event (pad, event, FALSE);
+ if (gst_pad_store_sticky_event (pad, event)) {
+ GST_DEBUG_OBJECT (pad, "event %s updated", GST_EVENT_TYPE_NAME (event));
+ }
if (event_type == GST_EVENT_EOS)
GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_EOS);
+
+ GST_OBJECT_UNLOCK (pad);
}
gst_event_unref (event);
}
* 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,
*
* This function is installed on a source pad with
* gst_pad_set_getrange_function() and can only be called on source pads after
- * they are successfully activated with gst_pad_activate_pull().
+ * they are successfully activated with gst_pad_activate_mode() with the
+ * #GST_PAD_MODE_PULL.
*
* @offset and @length are always given in byte units. @offset must normally be a value
* between 0 and the length in bytes of the data available on @pad. The
* 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);
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>");
static GMutex gst_plugin_loading_mutex;
#define CHECK_PLUGIN_DESC_FIELD(desc,field,fn) \
- if (G_UNLIKELY ((desc)->field == NULL)) { \
- GST_ERROR ("GstPluginDesc for '%s' has no %s", fn, G_STRINGIFY (field)); \
+ if (G_UNLIKELY ((desc)->field == NULL || *(desc)->field == '\0')) { \
+ g_warning ("Plugin description for '%s' has no valid %s field", fn, G_STRINGIFY (field)); \
+ goto return_error; \
}
/**
plugin->orig_desc = desc;
if (new_plugin) {
- /* check plugin description: complain about bad values but accept them, to
- * maintain backwards compatibility (FIXME: 0.11) */
+ /* check plugin description: complain about bad values and fail */
CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, name, filename);
CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, description, filename);
CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, version, filename);
GST_DEBUG ("version string '%s' parsed to %d values", ver_str, nscan);
if (nscan >= 3) {
- if (!g_str_has_prefix (PACKAGE_VERSION, "1.")) {
- /* FIXME 1.0: Remove this before doing the actual 1.0.0 release */
- if ((major == 0 && minor == 11 && micro >= 90)) {
- major = 1;
- minor = 0;
- micro = 0;
- nano = 0;
- }
- } else {
- GST_FIXME ("Remove pre-1.0 versions mangling");
- }
-
if (major > min_major)
ret = TRUE;
else if (major < min_major)
#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;
#endif
static GstPollMode
-choose_mode (const GstPoll * set, GstClockTime timeout)
+choose_mode (GstPoll * set, GstClockTime timeout)
{
GstPollMode mode;
if (!(preset_path = g_type_get_qdata (type, preset_system_path_quark))) {
gchar *preset_dir;
- /* system presets in '$GST_DATADIR/gstreamer-0.10/presets/GstAudioPanorama.prs' */
+ /* system presets in '$GST_DATADIR/gstreamer-1.0/presets/GstAudioPanorama.prs' */
preset_dir = g_build_filename (GST_DATADIR, "gstreamer-" GST_API_VERSION,
"presets", NULL);
GST_INFO_OBJECT (preset, "system_preset_dir: '%s'", preset_dir);
if (presets)
g_key_file_free (presets);
presets = in_user;
- version = version_user;
}
}
* @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.
*/
* @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.
*/
* 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.
* values of the seek flags.
*/
/* Note: update gst_segment_do_seek() when adding new flags here */
-typedef enum {
+typedef enum { /*< flags >*/
GST_SEGMENT_FLAG_NONE = GST_SEEK_FLAG_NONE,
GST_SEGMENT_FLAG_RESET = GST_SEEK_FLAG_FLUSH,
GST_SEGMENT_FLAG_SKIP = GST_SEEK_FLAG_SKIP,
"or produced"), NULL);
gst_tag_register_static (GST_TAG_GEO_LOCATION_SUBLOCATION, GST_TAG_FLAG_META,
G_TYPE_STRING, _("geo location sublocation"),
- _("a location whithin a city where the media has been produced "
+ _("a location within a city where the media has been produced "
"or created (e.g. the neighborhood)"), NULL);
gst_tag_register_static (GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR,
GST_TAG_FLAG_META, G_TYPE_DOUBLE, _("geo location horizontal error"),
*
* Creates an element for handling the given URI.
*
- * Returns: (transfer full): a new element or NULL if none could be created
+ * Returns: (transfer floating): a new element or NULL if none could be created
*/
GstElement *
gst_element_make_from_uri (const GstURIType type, const gchar * uri,
gst_value_init_and_copy (&temp, dest);
g_value_unset (dest);
- gst_value_list_concat (dest, &temp, &intersection);
+ gst_value_list_merge (dest, &temp, &intersection);
g_value_unset (&temp);
}
g_value_unset (&intersection);
$(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 \
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@
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@
-/* 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
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
#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;
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 */
#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 */
</GitRepository>
</repository>
+ <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>
+ <created>2012-10-07</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.0.1.tar.xz" />
+ </Version>
+ </release>
+
<release>
<Version>
<revision>1.0.0</revision>
%define _glib2 2.32.0
Name: %{gstreamer}
-Version: 1.0.0
+Version: 1.0.2
Release: 1
Summary: GStreamer streaming media framework runtime
$(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 \
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@
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@
$(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 \
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@
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@
$(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 \
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@
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@
{
const GstSegment *in_segment;
GstSegment out_segment;
- gint64 offset = 0, next_pts;
+ gint64 offset = 0, next_dts;
gst_event_parse_segment (event, &in_segment);
gst_segment_init (&out_segment, GST_FORMAT_TIME);
out_segment.stop = seek->segment.stop;
out_segment.time = seek->segment.start;
- next_pts = seek->start_ts;
+ next_dts = seek->start_ts;
parse->priv->exact_position = seek->accurate;
g_free (seek);
} else {
/* as these are only estimates, stop is kept open-ended to avoid
* premature cutting */
gst_base_parse_convert (parse, GST_FORMAT_BYTES, in_segment->start,
- GST_FORMAT_TIME, (gint64 *) & next_pts);
+ GST_FORMAT_TIME, (gint64 *) & next_dts);
- out_segment.start = next_pts;
+ out_segment.start = next_dts;
out_segment.stop = GST_CLOCK_TIME_NONE;
- out_segment.time = next_pts;
+ out_segment.time = next_dts;
parse->priv->exact_position = (in_segment->start == 0);
}
event = gst_event_new_segment (&out_segment);
- next_pts = 0;
+ next_dts = 0;
} else {
/* not considered BYTE seekable if it is talking to us in TIME,
* whatever else it might claim */
parse->priv->upstream_seekable = FALSE;
- next_pts = in_segment->start;
+ next_dts = in_segment->start;
}
memcpy (&parse->segment, &out_segment, sizeof (GstSegment));
parse->priv->offset = offset;
parse->priv->sync_offset = offset;
- parse->priv->next_pts = next_pts;
+ parse->priv->next_dts = next_dts;
+ if (parse->priv->pts_interpolate)
+ parse->priv->next_pts = next_dts;
parse->priv->last_pts = GST_CLOCK_TIME_NONE;
parse->priv->last_dts = GST_CLOCK_TIME_NONE;
parse->priv->discont = TRUE;
if (GST_CLOCK_TIME_IS_VALID (parse->priv->index_last_ts) &&
GST_CLOCK_DIFF (parse->priv->index_last_ts, ts) <
parse->priv->idx_interval) {
- GST_DEBUG_OBJECT (parse, "entry too close to last time %" GST_TIME_FORMAT,
+ GST_LOG_OBJECT (parse, "entry too close to last time %" GST_TIME_FORMAT,
GST_TIME_ARGS (parse->priv->index_last_ts));
goto exit;
}
gst_base_parse_find_offset (parse, ts, TRUE, &prev_ts);
if (GST_CLOCK_DIFF (prev_ts, ts) < parse->priv->idx_interval) {
- GST_DEBUG_OBJECT (parse,
+ GST_LOG_OBJECT (parse,
"entry too close to existing entry %" GST_TIME_FORMAT,
GST_TIME_ARGS (prev_ts));
parse->priv->index_last_offset = offset;
parse = GST_BASE_PARSE (gst_pad_get_parent (pad));
klass = GST_BASE_PARSE_GET_CLASS (parse);
- GST_DEBUG_OBJECT (parse, "hello");
+ GST_LOG_OBJECT (parse, "Entering parse loop");
if (G_UNLIKELY (parse->priv->push_stream_start)) {
gchar *stream_id;
/**
* 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
parse->priv->last_offset = seekpos;
parse->priv->seen_keyframe = FALSE;
parse->priv->discont = TRUE;
- parse->priv->next_pts = start_ts;
- parse->priv->next_dts = GST_CLOCK_TIME_NONE;
+ parse->priv->next_dts = start_ts;
+ if (parse->priv->pts_interpolate)
+ parse->priv->next_pts = start_ts;
parse->priv->last_dts = GST_CLOCK_TIME_NONE;
parse->priv->last_pts = GST_CLOCK_TIME_NONE;
parse->priv->sync_offset = seekpos;
*/
/**
- * SECTION:gstbasesink:
+ * SECTION:gstbasesink
* @short_description: Base class for sink elements
* @see_also: #GstBaseTransform, #GstBaseSrc
*
* // #GST_PAD_SINK and name "sink"
* gst_element_class_add_pad_template (gstelement_class,
* gst_static_pad_template_get (&sinktemplate));
- * // see #GstElementDetails
- * gst_element_class_set_details (gstelement_class, &details);
+ *
+ * gst_element_class_set_static_metadata (gstelement_class,
+ * "Sink name",
+ * "Sink",
+ * "My Sink element",
+ * "The author <my.sink@my.email>");
* }
* ]|
*
* // #GST_PAD_SRC and name "src"
* gst_element_class_add_pad_template (gstelement_class,
* gst_static_pad_template_get (&srctemplate));
- * // see #GstElementDetails
- * gst_element_class_set_details (gstelement_class, &details);
+ *
+ * gst_element_class_set_static_metadata (gstelement_class,
+ * "Source name",
+ * "Source",
+ * "My Source element",
+ * "The author <my.sink@my.email>");
* }
* ]|
*
#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
{
GstBufferPool *pool;
GstAllocator *allocator;
GstAllocationParams params;
+
+ GCond async_cond;
};
static GstElementClass *parent_class = NULL;
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);
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);
* @src: The source
* @start: The new start value for the segment
* @stop: Stop value for the new segment
- * @position: The position value for the new segent
+ * @time: The new time value for the start of the new segent
*
* Prepare a new seamless segment for emission downstream. This function must
* only be called by derived sub-classes, and only from the create() function,
*/
gboolean
gst_base_src_new_seamless_segment (GstBaseSrc * src, gint64 start, gint64 stop,
- gint64 position)
+ gint64 time)
{
gboolean res = TRUE;
- GST_DEBUG_OBJECT (src,
- "Starting new seamless segment. Start %" GST_TIME_FORMAT " stop %"
- GST_TIME_FORMAT " position %" GST_TIME_FORMAT, GST_TIME_ARGS (start),
- GST_TIME_ARGS (stop), GST_TIME_ARGS (position));
-
GST_OBJECT_LOCK (src);
src->segment.base = gst_segment_to_running_time (&src->segment,
src->segment.format, src->segment.position);
- src->segment.start = start;
+ src->segment.position = src->segment.start = start;
src->segment.stop = stop;
- src->segment.position = position;
+ src->segment.time = time;
- /* forward, we send data from position to stop */
+ /* Mark pending segment. Will be sent before next data */
src->priv->segment_pending = TRUE;
+
+ GST_DEBUG_OBJECT (src,
+ "Starting new seamless segment. Start %" GST_TIME_FORMAT " stop %"
+ GST_TIME_FORMAT " time %" GST_TIME_FORMAT " base %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (start), GST_TIME_ARGS (stop), GST_TIME_ARGS (time),
+ GST_TIME_ARGS (src->segment.base));
+
GST_OBJECT_UNLOCK (src);
src->priv->discont = TRUE;
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))
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);
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;
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;
}
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);
}
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;
}
}
{
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
/* 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)
was_stopped:
{
GST_DEBUG_OBJECT (basesrc, "was started");
- GST_LIVE_UNLOCK (basesrc);
+ GST_OBJECT_UNLOCK (basesrc);
return TRUE;
}
}
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);
GstPadMode pad_mode;
gboolean gap_aware;
+ gboolean prefer_passthrough;
/* QoS stats */
guint64 processed;
priv->cache_caps2 = NULL;
priv->pad_mode = GST_PAD_MODE_NONE;
priv->gap_aware = FALSE;
+ priv->prefer_passthrough = TRUE;
priv->passthrough = FALSE;
if (bclass->transform == NULL) {
templ = gst_pad_get_pad_template_caps (pad);
otempl = gst_pad_get_pad_template_caps (otherpad);
- /* we can do what the peer can */
+ /* first prepare the filter to be send onwards. We need to filter and
+ * transform it to valid caps for the otherpad. */
if (filter) {
GST_DEBUG_OBJECT (pad, "filter caps %" GST_PTR_FORMAT, filter);
- /* filtered against our padtemplate on the other side */
+ /* filtered against our padtemplate of this pad */
GST_DEBUG_OBJECT (pad, "our template %" GST_PTR_FORMAT, templ);
temp = gst_caps_intersect_full (filter, templ, GST_CAPS_INTERSECT_FIRST);
GST_DEBUG_OBJECT (pad, "intersected %" GST_PTR_FORMAT, temp);
GST_DEBUG_OBJECT (pad, "transformed %" GST_PTR_FORMAT, peerfilter);
gst_caps_unref (temp);
- /* and filter against the template of this pad */
+ /* and filter against the template of the other pad */
GST_DEBUG_OBJECT (pad, "our template %" GST_PTR_FORMAT, otempl);
/* We keep the caps sorted like the returned caps */
temp =
peerfilter = temp;
}
+ /* query the peer with the transformed filter */
peercaps = gst_pad_peer_query_caps (otherpad, peerfilter);
if (peerfilter)
gst_caps_unref (caps);
caps = temp;
- /* Now try if we can put the untransformed downstream caps first */
- temp = gst_caps_intersect_full (peercaps, caps, GST_CAPS_INTERSECT_FIRST);
- if (!gst_caps_is_empty (temp)) {
- caps = gst_caps_merge (temp, caps);
- } else {
- gst_caps_unref (temp);
+ if (trans->priv->prefer_passthrough) {
+ /* Now try if we can put the untransformed downstream caps first */
+ temp = gst_caps_intersect_full (peercaps, caps, GST_CAPS_INTERSECT_FIRST);
+ if (!gst_caps_is_empty (temp)) {
+ caps = gst_caps_merge (temp, caps);
+ } else {
+ gst_caps_unref (temp);
+ }
}
} else {
gst_caps_unref (caps);
GST_OBJECT_UNLOCK (trans);
}
+/**
+ * gst_base_transform_set_prefer_passthrough:
+ * @trans: a #GstBaseTransform
+ * @prefer_passthrough: New state
+ *
+ * If @prefer_passthrough is %TRUE (the default), @trans will check and
+ * prefer passthrough caps from the list of caps returned by the
+ * transform_caps vmethod.
+ *
+ * If set to %FALSE, the element must order the caps returned from the
+ * transform_caps function in such a way that the prefered format is
+ * first in the list. This can be interesting for transforms that can do
+ * passthrough transforms but prefer to do something else, like a
+ * capsfilter.
+ *
+ * MT safe.
+ *
+ * Since: 1.0.1
+ */
+void
+gst_base_transform_set_prefer_passthrough (GstBaseTransform * trans,
+ gboolean prefer_passthrough)
+{
+ g_return_if_fail (GST_IS_BASE_TRANSFORM (trans));
+
+ GST_OBJECT_LOCK (trans);
+ trans->priv->prefer_passthrough = prefer_passthrough;
+ GST_DEBUG_OBJECT (trans, "prefer passthrough %d", prefer_passthrough);
+ GST_OBJECT_UNLOCK (trans);
+}
+
/**
* gst_base_transform_reconfigure_sink:
* @trans: a #GstBaseTransform
void gst_base_transform_set_gap_aware (GstBaseTransform *trans,
gboolean gap_aware);
+void gst_base_transform_set_prefer_passthrough (GstBaseTransform *trans,
+ gboolean prefer_passthrough);
+
GstBufferPool * gst_base_transform_get_buffer_pool (GstBaseTransform *trans);
void gst_base_transform_get_allocator (GstBaseTransform *trans,
GstAllocator **allocator,
* @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,
}
/* 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);
}
+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
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 "
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);
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;
* 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.
* 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
*
for (walk = helper->buffers; walk; walk = walk->next) {
GstMappedBuffer *bmp = (GstMappedBuffer *) walk->data;
GstBuffer *buf = GST_BUFFER_CAST (bmp->buffer);
- guint64 buf_offset = GST_BUFFER_OFFSET (buf);
- guint buf_size = gst_buffer_get_size (buf);
+
+ buf_offset = GST_BUFFER_OFFSET (buf);
+ buf_size = gst_buffer_get_size (buf);
/* buffers are kept sorted by end offset (highest first) in the list, so
* at this point we save the current position and stop searching if
$(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 \
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@
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@
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 =
$(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 \
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 \
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@
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@
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:
$(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 \
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@
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@
$(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 \
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@
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@
$(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 \
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@
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@
{
static const GstMetaInfo *meta_info = NULL;
- if (meta_info == NULL) {
- meta_info = gst_meta_register (GST_NET_ADDRESS_META_API_TYPE,
+ if (g_once_init_enter (&meta_info)) {
+ const GstMetaInfo *mi = gst_meta_register (GST_NET_ADDRESS_META_API_TYPE,
"GstNetAddressMeta",
sizeof (GstNetAddressMeta),
net_address_meta_init,
net_address_meta_free, net_address_meta_transform);
+ g_once_init_leave (&meta_info, mi);
}
return meta_info;
}
$(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 \
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@
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@
--- /dev/null
+# ===========================================================================
+# 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
$(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 \
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@
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@
$(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 \
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@
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@
$(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 \
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@
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@
{
GstBaseTransform *trans = GST_BASE_TRANSFORM (filter);
gst_base_transform_set_gap_aware (trans, TRUE);
+ gst_base_transform_set_prefer_passthrough (trans, FALSE);
filter->filter_caps = gst_caps_new_any ();
}
switch (prop_id) {
case PROP_STATE_ERROR:
- sink->state_error = g_value_get_enum (value);
+ sink->state_error = (GstFakeSinkStateError) g_value_get_enum (value);
break;
case PROP_SILENT:
sink->silent = g_value_get_boolean (value);
g_warning ("not yet implemented");
break;
case PROP_DATA:
- src->data = g_value_get_enum (value);
+ src->data = (GstFakeSrcDataType) g_value_get_enum (value);
if (src->data == FAKE_SRC_DATA_SUBBUFFER) {
if (!src->parent)
}
break;
case PROP_SIZETYPE:
- src->sizetype = g_value_get_enum (value);
+ src->sizetype = (GstFakeSrcSizeType) g_value_get_enum (value);
break;
case PROP_SIZEMIN:
src->sizemin = g_value_get_int (value);
src->parentsize = g_value_get_int (value);
break;
case PROP_FILLTYPE:
- src->filltype = g_value_get_enum (value);
+ src->filltype = (GstFakeSrcFillType) g_value_get_enum (value);
break;
case PROP_DATARATE:
src->datarate = g_value_get_int (value);
gst_base_src_set_live (basesrc, g_value_get_boolean (value));
break;
case PROP_FORMAT:
- src->format = g_value_get_enum (value);
+ src->format = (GstFormat) g_value_get_enum (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
news = gst_event_new_segment (&segment);
gst_pad_event_default (trans->sinkpad, GST_OBJECT_CAST (trans), news);
+ } else {
+ /* need to track segment for proper running time */
+ gst_event_copy_segment (event, &trans->segment);
}
}
GstClockTime time = gst_util_uint64_scale_int (identity->offset,
GST_SECOND, identity->datarate);
- GST_BUFFER_TIMESTAMP (buf) = time;
+ GST_BUFFER_PTS (buf) = GST_BUFFER_DTS (buf) = time;
GST_BUFFER_DURATION (buf) = size * GST_SECOND / identity->datarate;
}
if (identity->single_segment && (trans->segment.format == GST_FORMAT_TIME)
&& (ret == GST_FLOW_OK)) {
- GST_BUFFER_TIMESTAMP (buf) = runtimestamp;
+ GST_BUFFER_PTS (buf) = GST_BUFFER_DTS (buf) = runtimestamp;
GST_BUFFER_OFFSET (buf) = GST_CLOCK_TIME_NONE;
GST_BUFFER_OFFSET_END (buf) = GST_CLOCK_TIME_NONE;
}
g_cond_signal (&sq->query_handled);
GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
} else {
- g_warning ("Unexpected object in singlequeue %d (refcounting problem?)",
+ g_warning ("Unexpected object in singlequeue %u (refcounting problem?)",
sq->id);
}
return result;
tee->silent = g_value_get_boolean (value);
break;
case PROP_PULL_MODE:
- tee->pull_mode = g_value_get_enum (value);
+ tee->pull_mode = (GstTeePullMode) g_value_get_enum (value);
break;
case PROP_ALLOC_PAD:
{
} else if (typefind->mode == MODE_NORMAL) {
GstBuffer *outbuf = NULL;
+ if (typefind->need_stream_start) {
+ gchar *stream_id;
+
+ stream_id =
+ gst_pad_create_stream_id (typefind->src, GST_ELEMENT_CAST (typefind),
+ NULL);
+
+ GST_DEBUG_OBJECT (typefind, "Pushing STREAM_START");
+ gst_pad_push_event (typefind->src,
+ gst_event_new_stream_start (stream_id));
+
+ typefind->need_stream_start = FALSE;
+ g_free (stream_id);
+ }
+
if (typefind->need_segment) {
typefind->need_segment = FALSE;
gst_pad_push_event (typefind->src,
if (active) {
gst_segment_init (&typefind->segment, GST_FORMAT_BYTES);
typefind->need_segment = TRUE;
+ typefind->need_stream_start = TRUE;
typefind->offset = 0;
res = TRUE;
} else {
/* Only used when driving the pipeline */
gboolean need_segment;
+ gboolean need_stream_start;
GstSegment segment;
guint64 offset;
};
msgstr ""
"Project-Id-Version: gstreamer 0.9.7\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgstr "ligging"
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
msgstr ""
"Project-Id-Version: gstreamer-0.8.0\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgstr ""
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
msgstr ""
"Project-Id-Version: gstreamer 0.9.7\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgstr ""
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "квартал по координати"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr "квартал в града на запис или създаване на медията"
msgstr ""
"Project-Id-Version: gstreamer 0.10.30.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "sububicació de la geolocalització"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"una ubicació dins de la ciutat on s'ha enregistrat o produït el medi (p. ex. "
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "upřesnění místa"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr "Místo v rámci města, kde bylo médium nahráno nebo vytvořeno"
msgstr ""
"Project-Id-Version: gstreamer 0.10.30.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "geografisk underinddeling"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"en stedangivelse inden for en by hvor mediet er blevet optaget eller "
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "geografischer Ortsteil"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"ein Ort innerhalb einer Stadt, in dem das Medium aufgezeichnet oder "
msgstr ""
"Project-Id-Version: gstreamer-0.10.30.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "γεωγραφικός εντοπισμός υποτοποθεσίας"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"τοποθεσία μέσα σε μια πόλη όπου το μέσο παρήχθη ή δημιουργήθηκε (π.χ. η "
msgstr ""
"Project-Id-Version: gstreamer 0.8.1\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgstr "location"
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgstr ""
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "sububicación de la geolocalización"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"una ubicación en una ciudad donde se ha producido o creado el medio (ej. el "
msgstr ""
"Project-Id-Version: gstreamer-0.10.26.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "geolokalizazioaren azpikokalekua"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr "muldimedia grabatu edo ekoiztu den herriko kokaleku bat (adib, auzoa)"
msgstr ""
"Project-Id-Version: gstreamer 0.10.30.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "maantieteellisen sijainnin alisijainti"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr "sijainti kaupungin sisällä, jossa media on nauhoitettu tai tuotettu"
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "zone locale de l'emplacement"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"un endroit de la localité où le média a été enregistré ou produit (par ex. "
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "sublocalización da xeolocalización"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"unha localización nunha cidade onde foi gravado ou producido o medio (p.ex. "
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: gstreamer 1.0.0\n"
+"Project-Id-Version: gstreamer 1.0.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "Show GStreamer Options"
msgstr ""
-#: gst/gst.c:931
+#: gst/gst.c:932
msgid "Unknown option"
msgstr ""
#: gst/gsttaglist.c:319
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
msgid "empty pipeline not allowed"
msgstr ""
-#: libs/gst/base/gstbasesrc.c:2422
+#: libs/gst/base/gstbasesrc.c:2438
msgid "Internal clock error."
msgstr ""
-#: libs/gst/base/gstbasesrc.c:2774 libs/gst/base/gstbasesrc.c:2783
-#: libs/gst/base/gstbasesink.c:3763 plugins/elements/gstqueue.c:1188
+#: 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."
msgstr ""
-#: libs/gst/base/gstbasesink.c:2670
+#: libs/gst/base/gstbasesink.c:2674
msgid "A lot of buffers are being dropped."
msgstr ""
-#: libs/gst/base/gstbasesink.c:3127
+#: libs/gst/base/gstbasesink.c:3131
msgid "Internal data flow problem."
msgstr ""
-#: libs/gst/base/gstbasesink.c:3753
+#: libs/gst/base/gstbasesink.c:3757
msgid "Internal data stream error."
msgstr ""
msgid "File \"%s\" is a socket."
msgstr ""
-#: plugins/elements/gstidentity.c:610
+#: plugins/elements/gstidentity.c:613
msgid "Failed after iterations as requested."
msgstr ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.30.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "földrajzi hely részhelye"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"a városon belüli hely, ahol a média előállításra vagy létrehozásra került "
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "sublokasi lokasi geografis"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"lokasi di dalam kota tempat media dihasilkan atau dibuat (misalnya "
msgstr ""
"Project-Id-Version: gstreamer 0.10.30.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "sub-località località geog."
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"una località all'interno di una città in cui il contenuto multimediale è "
msgstr ""
"Project-Id-Version: gstreamer 0.10.20.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgstr ""
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.29.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "geografinės vietos sublokacija"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"vietove mieste, kuriame medija buvo pagaminta arba sukurta, (pvz., "
msgstr ""
"Project-Id-Version: gstreamer 0.10.30.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgstr "plassering"
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "geografische locatie van de sublocatie"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"een sublocatie in een stad waar het medium is opgenomen of geproduceerd "
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "część miejscowości lokalizacji"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"miejsce wewnątrz miejscowości, w którym utwór został nagrany lub "
msgstr ""
"Project-Id-Version: gstreamer-0.10.31.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "sublocalização geográfica"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"localização numa cidade onde a mídia foi produzida ou criada (ex: bairro)"
msgstr ""
"Project-Id-Version: gstreamer 0.10.29.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "sublocație geo-locație"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"locație în orașul unde a fost înregistrat sau produs acest fișier media (de "
msgstr ""
"Project-Id-Version: gstreamer-0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "доп. к местоположению"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"место в городе, в котором производилась запись или производство данных "
msgstr ""
"Project-Id-Version: gstreamer 0.8.8\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgstr "Inturo"
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.30.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "zemepisná poloha upresnenie"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"umiestnenie v rámci mesta, kde bolo toto médium vyprodukované alebo "
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "področje zemljepisne lege"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"okraj znotraj mesta, kjer je bil posnetek posnet ali izdelan (na primer: "
msgstr ""
"Project-Id-Version: gstreamer 0.8.4\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgstr "pozicioni"
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
msgstr ""
"Project-Id-Version: gstreamer-0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "потположај гео положаја"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"место унутар града у коме је медиј произведен или створен (нпр. суседство)"
msgstr ""
"Project-Id-Version: gstreamer 0.10.31.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "specifik plats för geografisk plats"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"en plats inom en stad där mediet har producerats eller skapats (t.ex. "
msgstr ""
"Project-Id-Version: gstreamer 0.8.0\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgstr "konum"
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "додаткові дані розташування"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"місце у місті, де виконувалася зйомка або було створено дані (наприклад, "
msgstr ""
"Project-Id-Version: gstreamer 0.10.29.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgid "geo location sublocation"
msgstr "vị trí phụ địa lý"
+#, fuzzy
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
"một vùng bên trong thành phố ở đó phương tiện đã được tạo hay sản xuất (v.d. "
msgstr ""
"Project-Id-Version: gstreamer 0.10.25.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgstr "地理海拔"
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
msgstr ""
"Project-Id-Version: gstreamer 0.8.8\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2012-09-23 16:19+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"
msgstr "位置"
msgid ""
-"a location whithin a city where the media has been produced or created (e.g. "
+"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
$(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 \
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@
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@
$(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 \
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@
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@
g_slist_free (new_src_list);
end = gst_util_get_timestamp ();
- g_print ("%" GST_TIME_FORMAT " - creating and linking %d elements\n",
+ g_print ("%" GST_TIME_FORMAT " - creating and linking %u elements\n",
GST_TIME_ARGS (end - start), i);
start = gst_util_get_timestamp ();
GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
end = gst_util_get_timestamp ();
gst_message_unref (msg);
- g_print ("%" GST_TIME_FORMAT " - putting %u buffers through\n",
+ g_print ("%" GST_TIME_FORMAT " - putting %d buffers through\n",
GST_TIME_ARGS (end - start), BUFFER_COUNT);
start = gst_util_get_timestamp ();
mess_some_more ();
if (g_timer_elapsed (timer, NULL) > 0.5) {
g_mutex_lock (&fdlock);
- g_print ("active fds :%d\n", g_list_length (fds));
+ g_print ("active fds :%u\n", g_list_length (fds));
g_timer_start (timer);
g_mutex_unlock (&fdlock);
}
# Do not run the abi test in case any option which causes the API to change has
# been used
-if FALSE
if !GST_DISABLE_REGISTRY
if !GST_DISABLE_TRACE
ABI_CHECKS = gst/gstabi
endif
endif
-endif
-if FALSE
LIBSABI_CHECKS = libs/libsabi
-endif
if HAVE_CXX
CXX_CHECKS = gst/gstcpp libs/gstlibscpp
target_triplet = @target@
DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in $(top_srcdir)/common/check.mak
-check_PROGRAMS = gst/gstatomicqueue$(EXEEXT) gst/gstbuffer$(EXEEXT) \
- gst/gstbufferlist$(EXEEXT) gst/gstmeta$(EXEEXT) \
- gst/gstmemory$(EXEEXT) gst/gstbus$(EXEEXT) \
- gst/gstcaps$(EXEEXT) $(am__EXEEXT_1) gst/gstdatetime$(EXEEXT) \
- gst/gstinfo$(EXEEXT) gst/gstiterator$(EXEEXT) \
- gst/gstmessage$(EXEEXT) gst/gstminiobject$(EXEEXT) \
- gst/gstobject$(EXEEXT) gst/gstpad$(EXEEXT) \
- gst/gstparamspecs$(EXEEXT) gst/gstpipeline$(EXEEXT) \
- gst/gstpoll$(EXEEXT) gst/gstsegment$(EXEEXT) \
- gst/gstsystemclock$(EXEEXT) gst/gstclock$(EXEEXT) \
- gst/gststructure$(EXEEXT) gst/gsttag$(EXEEXT) \
- gst/gsttagsetter$(EXEEXT) gst/gsttask$(EXEEXT) \
- gst/gsttoc$(EXEEXT) gst/gsttocsetter$(EXEEXT) \
- gst/gstvalue$(EXEEXT) generic/states$(EXEEXT) $(am__EXEEXT_2) \
- $(am__EXEEXT_3) libs/adapter$(EXEEXT) libs/bitreader$(EXEEXT) \
+check_PROGRAMS = $(am__EXEEXT_1) gst/gstatomicqueue$(EXEEXT) \
+ gst/gstbuffer$(EXEEXT) gst/gstbufferlist$(EXEEXT) \
+ gst/gstmeta$(EXEEXT) gst/gstmemory$(EXEEXT) \
+ gst/gstbus$(EXEEXT) gst/gstcaps$(EXEEXT) $(am__EXEEXT_2) \
+ gst/gstdatetime$(EXEEXT) gst/gstinfo$(EXEEXT) \
+ gst/gstiterator$(EXEEXT) gst/gstmessage$(EXEEXT) \
+ gst/gstminiobject$(EXEEXT) gst/gstobject$(EXEEXT) \
+ gst/gstpad$(EXEEXT) gst/gstparamspecs$(EXEEXT) \
+ gst/gstpipeline$(EXEEXT) gst/gstpoll$(EXEEXT) \
+ gst/gstsegment$(EXEEXT) gst/gstsystemclock$(EXEEXT) \
+ gst/gstclock$(EXEEXT) gst/gststructure$(EXEEXT) \
+ gst/gsttag$(EXEEXT) gst/gsttagsetter$(EXEEXT) \
+ gst/gsttask$(EXEEXT) gst/gsttoc$(EXEEXT) \
+ gst/gsttocsetter$(EXEEXT) gst/gstvalue$(EXEEXT) \
+ generic/states$(EXEEXT) $(am__EXEEXT_3) $(am__EXEEXT_4) \
+ $(am__EXEEXT_5) libs/adapter$(EXEEXT) libs/bitreader$(EXEEXT) \
libs/bytereader$(EXEEXT) libs/bytewriter$(EXEEXT) \
libs/collectpads$(EXEEXT) libs/gstnetclientclock$(EXEEXT) \
libs/gstnettimeprovider$(EXEEXT) libs/transform1$(EXEEXT) \
$(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 \
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
-@HAVE_CXX_TRUE@am__EXEEXT_1 = gst/gstcpp$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@@GST_DISABLE_TRACE_FALSE@am__EXEEXT_1 = gst/gstabi$(EXEEXT)
+@HAVE_CXX_TRUE@am__EXEEXT_2 = gst/gstcpp$(EXEEXT) \
@HAVE_CXX_TRUE@ libs/gstlibscpp$(EXEEXT)
-@GST_DISABLE_PARSE_FALSE@am__EXEEXT_2 = pipelines/simple-launch-lines$(EXEEXT) \
+@GST_DISABLE_PARSE_FALSE@am__EXEEXT_3 = pipelines/simple-launch-lines$(EXEEXT) \
@GST_DISABLE_PARSE_FALSE@ pipelines/cleanup$(EXEEXT) \
@GST_DISABLE_PARSE_FALSE@ pipelines/parse-launch$(EXEEXT)
-@GST_DISABLE_PARSE_TRUE@am__EXEEXT_2 = \
+@GST_DISABLE_PARSE_TRUE@am__EXEEXT_3 = \
@GST_DISABLE_PARSE_TRUE@ pipelines/parse-disabled$(EXEEXT)
-@GST_DISABLE_REGISTRY_FALSE@am__EXEEXT_3 = gst/gst$(EXEEXT) \
+@GST_DISABLE_REGISTRY_FALSE@am__EXEEXT_4 = gst/gst$(EXEEXT) \
@GST_DISABLE_REGISTRY_FALSE@ gst/gstbin$(EXEEXT) \
@GST_DISABLE_REGISTRY_FALSE@ gst/gstchildproxy$(EXEEXT) \
@GST_DISABLE_REGISTRY_FALSE@ gst/gstcontroller$(EXEEXT) \
@GST_DISABLE_REGISTRY_FALSE@ pipelines/seek$(EXEEXT) \
@GST_DISABLE_REGISTRY_FALSE@ pipelines/stress$(EXEEXT) \
@GST_DISABLE_REGISTRY_FALSE@ pipelines/queue-error$(EXEEXT)
+am__EXEEXT_5 = libs/libsabi$(EXEEXT)
PROGRAMS = $(noinst_PROGRAMS)
elements_capsfilter_SOURCES = elements/capsfilter.c
elements_capsfilter_OBJECTS = capsfilter.$(OBJEXT)
gst_gst_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_API_VERSION@.la \
$(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
$(am__DEPENDENCIES_1)
+gst_gstabi_SOURCES = gst/gstabi.c
+gst_gstabi_OBJECTS = gstabi.$(OBJEXT)
+gst_gstabi_LDADD = $(LDADD)
+gst_gstabi_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_API_VERSION@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
+ $(am__DEPENDENCIES_1)
gst_gstatomicqueue_SOURCES = gst/gstatomicqueue.c
gst_gstatomicqueue_OBJECTS = gstatomicqueue.$(OBJEXT)
gst_gstatomicqueue_LDADD = $(LDADD)
libs_gstnettimeprovider_DEPENDENCIES = \
$(top_builddir)/libs/gst/net/libgstnet-@GST_API_VERSION@.la \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+libs_libsabi_SOURCES = libs/libsabi.c
+libs_libsabi_OBJECTS = libsabi.$(OBJEXT)
+libs_libsabi_LDADD = $(LDADD)
+libs_libsabi_DEPENDENCIES = $(top_builddir)/libs/gst/check/libgstcheck-@GST_API_VERSION@.la \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
+ $(am__DEPENDENCIES_1)
libs_queuearray_SOURCES = libs/queuearray.c
libs_queuearray_OBJECTS = queuearray.$(OBJEXT)
libs_queuearray_LDADD = $(LDADD)
elements/funnel.c elements/identity.c elements/multiqueue.c \
elements/queue.c elements/queue2.c elements/selector.c \
elements/tee.c elements/valve.c generic/sinks.c \
- generic/states.c gst/gst.c gst/gstatomicqueue.c gst/gstbin.c \
- gst/gstbuffer.c gst/gstbufferlist.c gst/gstbus.c gst/gstcaps.c \
- gst/gstchildproxy.c gst/gstclock.c gst/gstcontroller.c \
- $(gst_gstcpp_SOURCES) gst/gstdatetime.c gst/gstelement.c \
- gst/gstelementfactory.c gst/gstevent.c gst/gstghostpad.c \
- gst/gstinfo.c gst/gstiterator.c gst/gstmemory.c \
- gst/gstmessage.c gst/gstmeta.c gst/gstminiobject.c \
- gst/gstobject.c gst/gstpad.c gst/gstparamspecs.c \
- gst/gstpipeline.c gst/gstplugin.c gst/gstpoll.c \
- gst/gstpreset.c gst/gstquery.c gst/gstregistry.c \
+ generic/states.c gst/gst.c gst/gstabi.c gst/gstatomicqueue.c \
+ gst/gstbin.c gst/gstbuffer.c gst/gstbufferlist.c gst/gstbus.c \
+ gst/gstcaps.c gst/gstchildproxy.c gst/gstclock.c \
+ gst/gstcontroller.c $(gst_gstcpp_SOURCES) gst/gstdatetime.c \
+ gst/gstelement.c gst/gstelementfactory.c gst/gstevent.c \
+ gst/gstghostpad.c gst/gstinfo.c gst/gstiterator.c \
+ gst/gstmemory.c gst/gstmessage.c gst/gstmeta.c \
+ gst/gstminiobject.c gst/gstobject.c gst/gstpad.c \
+ gst/gstparamspecs.c gst/gstpipeline.c gst/gstplugin.c \
+ gst/gstpoll.c gst/gstpreset.c gst/gstquery.c gst/gstregistry.c \
gst/gstsegment.c gst/gststructure.c gst/gstsystemclock.c \
gst/gsttag.c gst/gsttagsetter.c gst/gsttask.c gst/gsttoc.c \
gst/gsttocsetter.c gst/gsturi.c gst/gstutils.c gst/gstvalue.c \
libs/bytereader.c libs/bytewriter.c libs/collectpads.c \
libs/controller.c $(libs_gstlibscpp_SOURCES) \
libs/gstnetclientclock.c libs/gstnettimeprovider.c \
- libs/queuearray.c libs/transform1.c libs/typefindhelper.c \
- pipelines/cleanup.c pipelines/parse-disabled.c \
- pipelines/parse-launch.c pipelines/queue-error.c \
- pipelines/seek.c pipelines/simple-launch-lines.c \
- pipelines/stress.c tools/gstinspect.c
+ libs/libsabi.c libs/queuearray.c libs/transform1.c \
+ libs/typefindhelper.c pipelines/cleanup.c \
+ pipelines/parse-disabled.c pipelines/parse-launch.c \
+ pipelines/queue-error.c pipelines/seek.c \
+ pipelines/simple-launch-lines.c pipelines/stress.c \
+ tools/gstinspect.c
DIST_SOURCES = elements/capsfilter.c elements/fakesink.c \
elements/fakesrc.c elements/fdsrc.c elements/filesink.c \
elements/filesrc.c elements/funnel.c elements/identity.c \
elements/multiqueue.c elements/queue.c elements/queue2.c \
elements/selector.c elements/tee.c elements/valve.c \
- generic/sinks.c generic/states.c gst/gst.c \
+ generic/sinks.c generic/states.c gst/gst.c gst/gstabi.c \
gst/gstatomicqueue.c gst/gstbin.c gst/gstbuffer.c \
gst/gstbufferlist.c gst/gstbus.c gst/gstcaps.c \
gst/gstchildproxy.c gst/gstclock.c gst/gstcontroller.c \
libs/bytereader.c libs/bytewriter.c libs/collectpads.c \
libs/controller.c $(libs_gstlibscpp_SOURCES) \
libs/gstnetclientclock.c libs/gstnettimeprovider.c \
- libs/queuearray.c libs/transform1.c libs/typefindhelper.c \
- pipelines/cleanup.c pipelines/parse-disabled.c \
- pipelines/parse-launch.c pipelines/queue-error.c \
- pipelines/seek.c pipelines/simple-launch-lines.c \
- pipelines/stress.c tools/gstinspect.c
+ libs/libsabi.c libs/queuearray.c libs/transform1.c \
+ libs/typefindhelper.c pipelines/cleanup.c \
+ pipelines/parse-disabled.c pipelines/parse-launch.c \
+ pipelines/queue-error.c pipelines/seek.c \
+ pipelines/simple-launch-lines.c pipelines/stress.c \
+ tools/gstinspect.c
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
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@
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@
# These tests don't even build any longer:
# gst/gstindex.c
@GST_DISABLE_PARSE_TRUE@PARSE_CHECKS = pipelines/parse-disabled
+
+# Do not run the abi test in case any option which causes the API to change has
+# been used
+@GST_DISABLE_REGISTRY_FALSE@@GST_DISABLE_TRACE_FALSE@ABI_CHECKS = gst/gstabi
+LIBSABI_CHECKS = libs/libsabi
@HAVE_CXX_FALSE@CXX_CHECKS =
@HAVE_CXX_TRUE@CXX_CHECKS = gst/gstcpp libs/gstlibscpp
@GST_DISABLE_REGISTRY_FALSE@REGISTRY_CHECKS = \
gst/gst$(EXEEXT): $(gst_gst_OBJECTS) $(gst_gst_DEPENDENCIES) $(EXTRA_gst_gst_DEPENDENCIES) gst/$(am__dirstamp)
@rm -f gst/gst$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(gst_gst_OBJECTS) $(gst_gst_LDADD) $(LIBS)
+gst/gstabi$(EXEEXT): $(gst_gstabi_OBJECTS) $(gst_gstabi_DEPENDENCIES) $(EXTRA_gst_gstabi_DEPENDENCIES) gst/$(am__dirstamp)
+ @rm -f gst/gstabi$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(gst_gstabi_OBJECTS) $(gst_gstabi_LDADD) $(LIBS)
gst/gstatomicqueue$(EXEEXT): $(gst_gstatomicqueue_OBJECTS) $(gst_gstatomicqueue_DEPENDENCIES) $(EXTRA_gst_gstatomicqueue_DEPENDENCIES) gst/$(am__dirstamp)
@rm -f gst/gstatomicqueue$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(gst_gstatomicqueue_OBJECTS) $(gst_gstatomicqueue_LDADD) $(LIBS)
libs/gstnettimeprovider$(EXEEXT): $(libs_gstnettimeprovider_OBJECTS) $(libs_gstnettimeprovider_DEPENDENCIES) $(EXTRA_libs_gstnettimeprovider_DEPENDENCIES) libs/$(am__dirstamp)
@rm -f libs/gstnettimeprovider$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(libs_gstnettimeprovider_OBJECTS) $(libs_gstnettimeprovider_LDADD) $(LIBS)
+libs/libsabi$(EXEEXT): $(libs_libsabi_OBJECTS) $(libs_libsabi_DEPENDENCIES) $(EXTRA_libs_libsabi_DEPENDENCIES) libs/$(am__dirstamp)
+ @rm -f libs/libsabi$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(libs_libsabi_OBJECTS) $(libs_libsabi_LDADD) $(LIBS)
libs/queuearray$(EXEEXT): $(libs_queuearray_OBJECTS) $(libs_queuearray_DEPENDENCIES) $(EXTRA_libs_queuearray_DEPENDENCIES) libs/$(am__dirstamp)
@rm -f libs/queuearray$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(libs_queuearray_OBJECTS) $(libs_queuearray_LDADD) $(LIBS)
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filesink.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/funnel.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gst.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstabi.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstatomicqueue.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstbin.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstbuffer.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstutils.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gstvalue.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/identity.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsabi.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiqueue.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-disabled.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-launch.Po@am__quote@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gst.obj `if test -f 'gst/gst.c'; then $(CYGPATH_W) 'gst/gst.c'; else $(CYGPATH_W) '$(srcdir)/gst/gst.c'; fi`
+gstabi.o: gst/gstabi.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstabi.o -MD -MP -MF $(DEPDIR)/gstabi.Tpo -c -o gstabi.o `test -f 'gst/gstabi.c' || echo '$(srcdir)/'`gst/gstabi.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstabi.Tpo $(DEPDIR)/gstabi.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gst/gstabi.c' object='gstabi.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gstabi.o `test -f 'gst/gstabi.c' || echo '$(srcdir)/'`gst/gstabi.c
+
+gstabi.obj: gst/gstabi.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstabi.obj -MD -MP -MF $(DEPDIR)/gstabi.Tpo -c -o gstabi.obj `if test -f 'gst/gstabi.c'; then $(CYGPATH_W) 'gst/gstabi.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstabi.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstabi.Tpo $(DEPDIR)/gstabi.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gst/gstabi.c' object='gstabi.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gstabi.obj `if test -f 'gst/gstabi.c'; then $(CYGPATH_W) 'gst/gstabi.c'; else $(CYGPATH_W) '$(srcdir)/gst/gstabi.c'; fi`
+
gstatomicqueue.o: gst/gstatomicqueue.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gstatomicqueue.o -MD -MP -MF $(DEPDIR)/gstatomicqueue.Tpo -c -o gstatomicqueue.o `test -f 'gst/gstatomicqueue.c' || echo '$(srcdir)/'`gst/gstatomicqueue.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gstatomicqueue.Tpo $(DEPDIR)/gstatomicqueue.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gstnettimeprovider.obj `if test -f 'libs/gstnettimeprovider.c'; then $(CYGPATH_W) 'libs/gstnettimeprovider.c'; else $(CYGPATH_W) '$(srcdir)/libs/gstnettimeprovider.c'; fi`
+libsabi.o: libs/libsabi.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libsabi.o -MD -MP -MF $(DEPDIR)/libsabi.Tpo -c -o libsabi.o `test -f 'libs/libsabi.c' || echo '$(srcdir)/'`libs/libsabi.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsabi.Tpo $(DEPDIR)/libsabi.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libs/libsabi.c' object='libsabi.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libsabi.o `test -f 'libs/libsabi.c' || echo '$(srcdir)/'`libs/libsabi.c
+
+libsabi.obj: libs/libsabi.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libsabi.obj -MD -MP -MF $(DEPDIR)/libsabi.Tpo -c -o libsabi.obj `if test -f 'libs/libsabi.c'; then $(CYGPATH_W) 'libs/libsabi.c'; else $(CYGPATH_W) '$(srcdir)/libs/libsabi.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsabi.Tpo $(DEPDIR)/libsabi.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libs/libsabi.c' object='libsabi.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libsabi.obj `if test -f 'libs/libsabi.c'; then $(CYGPATH_W) 'libs/libsabi.c'; else $(CYGPATH_W) '$(srcdir)/libs/libsabi.c'; fi`
+
queuearray.o: libs/queuearray.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT queuearray.o -MD -MP -MF $(DEPDIR)/queuearray.Tpo -c -o queuearray.o `test -f 'libs/queuearray.c' || echo '$(srcdir)/'`libs/queuearray.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/queuearray.Tpo $(DEPDIR)/queuearray.Po
--- /dev/null
+/* GStreamer
+ * Copyright (C) 2005 Wim Taymans <wim@fluendo.com>
+ *
+ * gstabi.c: Unit test for ABI compatibility
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <gst/check/gstcheck.h>
+
+#ifdef HAVE_CPU_I386
+#include "struct_i386.h"
+#define HAVE_ABI_SIZES TRUE
+#else
+#ifdef __powerpc64__
+#include "struct_ppc64.h"
+#define HAVE_ABI_SIZES TRUE
+#else
+#ifdef __powerpc__
+#include "struct_ppc32.h"
+#define HAVE_ABI_SIZES TRUE
+#else
+#ifdef HAVE_CPU_X86_64
+#include "struct_x86_64.h"
+#define HAVE_ABI_SIZES TRUE
+#else
+#ifdef HAVE_CPU_HPPA
+#include "struct_hppa.h"
+#define HAVE_ABI_SIZES TRUE
+#else
+#ifdef HAVE_CPU_SPARC
+#include "struct_sparc.h"
+#define HAVE_ABI_SIZES TRUE
+#else
+#ifdef HAVE_CPU_ARM
+#include "struct_arm.h"
+#define HAVE_ABI_SIZES TRUE
+#else
+/* in case someone wants to generate a new arch */
+#include "struct_i386.h"
+#define HAVE_ABI_SIZES FALSE
+#endif
+#endif
+#endif
+#endif
+#endif
+#endif
+#endif
+
+GST_START_TEST (test_ABI)
+{
+ gst_check_abi_list (list, HAVE_ABI_SIZES);
+}
+
+GST_END_TEST;
+
+static Suite *
+gstabi_suite (void)
+{
+ Suite *s = suite_create ("GstABI");
+ TCase *tc_chain = tcase_create ("size check");
+
+ tcase_set_timeout (tc_chain, 0);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_ABI);
+ return s;
+}
+
+GST_CHECK_MAIN (gstabi);
GST_END_TEST;
+GST_START_TEST (test_intersect_list_duplicate)
+{
+ GstCaps *caps1, *caps2, *icaps;
+
+ /* make sure we don't take too long to intersect these.. */
+ caps1 = gst_caps_from_string ("video/x-raw, format=(string)YV12; "
+ "video/x-raw, format=(string)I420; video/x-raw, format=(string)YUY2; "
+ "video/x-raw, format=(string)UYVY; "
+ "video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx,"
+ " xRGB, xBGR, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } } } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } } } } } }, BGRA, ARGB, { ABGR, ABGR, "
+ "{ ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } } } } }, "
+ "RGB, BGR, Y41B, Y42B, YVYU, Y444 }; "
+ "video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, "
+ "xRGB, xBGR, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } } } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } } } } } }, BGRA, ARGB, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } } } } }, "
+ "RGB, BGR, Y41B, Y42B, YVYU, Y444, NV12, NV21 }; "
+ "video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, RGBx, "
+ "BGRx, xRGB, xBGR, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } }, { RGBA, RGBA, { RGBA, RGBA }, "
+ "{ RGBA, RGBA, { RGBA, RGBA } } } }, BGRA, ARGB, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } }, "
+ "{ ABGR, ABGR, { ABGR, ABGR }, { ABGR, ABGR, { ABGR, ABGR } } } }, "
+ "RGB, BGR, Y41B, Y42B, YVYU, Y444, NV12, NV21 }");
+
+ caps2 = gst_caps_copy (caps1);
+
+ icaps = gst_caps_intersect (caps1, caps2);
+
+ gst_caps_unref (caps1);
+ gst_caps_unref (caps2);
+ gst_caps_unref (icaps);
+}
+
+GST_END_TEST;
GST_START_TEST (test_intersect_zigzag)
{
tcase_add_test (tc_chain, test_merge_subset);
tcase_add_test (tc_chain, test_intersect);
tcase_add_test (tc_chain, test_intersect2);
+ tcase_add_test (tc_chain, test_intersect_list_duplicate);
tcase_add_test (tc_chain, test_intersect_zigzag);
tcase_add_test (tc_chain, test_intersect_first);
tcase_add_test (tc_chain, test_intersect_first2);
GST_END_TEST;
+/* Test that remove a ghostpad that has something flowing through it does not
+ * crash the program
+ */
+
+GstElement *bin;
+GstPad *ghostsink;
+GstPad *ghostsrc;
+
+static GstPadProbeReturn
+remove_ghostpad_probe_cb (GstPad * pad, GstPadProbeInfo * info, gpointer data)
+{
+ gst_pad_set_active (ghostsrc, FALSE);
+ gst_pad_set_active (ghostsink, FALSE);
+ gst_element_remove_pad (bin, ghostsrc);
+ gst_element_remove_pad (bin, ghostsink);
+
+ return GST_PAD_PROBE_DROP;
+}
+
+GST_START_TEST (test_ghost_pads_remove_while_playing)
+{
+ GstPad *sinkpad;
+ GstPad *srcpad;
+
+ bin = gst_bin_new (NULL);
+ gst_element_set_state (bin, GST_STATE_PLAYING);
+ sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
+
+ ghostsrc = gst_ghost_pad_new_no_target ("ghostsrc", GST_PAD_SRC);
+ sinkpad = GST_PAD (gst_proxy_pad_get_internal (GST_PROXY_PAD (ghostsrc)));
+ ghostsink = gst_ghost_pad_new ("ghostsink", sinkpad);
+ gst_object_unref (sinkpad);
+ gst_pad_set_active (ghostsrc, TRUE);
+ gst_pad_set_active (ghostsink, TRUE);
+ gst_element_add_pad (bin, ghostsrc);
+ gst_element_add_pad (bin, ghostsink);
+
+ srcpad = gst_pad_new ("srcpad", GST_PAD_SRC);
+ gst_pad_set_active (srcpad, TRUE);
+ gst_pad_link (srcpad, ghostsink);
+
+ gst_pad_add_probe (ghostsrc, GST_PAD_PROBE_TYPE_BUFFER,
+ remove_ghostpad_probe_cb, NULL, NULL);
+
+ g_assert (gst_pad_push (srcpad, gst_buffer_new ()) == GST_FLOW_OK);
+
+ gst_pad_set_active (srcpad, FALSE);
+ gst_element_set_state (bin, GST_STATE_NULL);
+ gst_object_unref (bin);
+ gst_object_unref (srcpad);
+}
+
+GST_END_TEST;
+
static Suite *
gst_ghost_pad_suite (void)
{
tcase_add_test (tc_chain, test_ghost_pads_src_link_unlink);
tcase_add_test (tc_chain, test_ghost_pads_change_when_linked);
tcase_add_test (tc_chain, test_ghost_pads_internal_link);
+ tcase_add_test (tc_chain, test_ghost_pads_remove_while_playing);
return s;
}
fail_if (gst_memory_map (mem, &info, GST_MAP_WRITE));
+ /* Make sure mapping anxd unmapping it doesn't change it's locking state */
+ fail_unless (gst_memory_map (mem, &info, GST_MAP_READ));
+ gst_memory_unmap (mem, &info);
+
+ fail_if (gst_memory_map (mem, &info, GST_MAP_WRITE));
+
mem2 = gst_memory_copy (mem, 0, -1);
fail_unless (GST_MEMORY_IS_READONLY (mem));
fail_if (GST_MEMORY_IS_READONLY (mem2));
{
static const GstMetaInfo *meta_test_info = NULL;
- if (meta_test_info == NULL) {
- meta_test_info = gst_meta_register (GST_META_TEST_API_TYPE,
+ if (g_once_init_enter (&meta_test_info)) {
+ const GstMetaInfo *mi = gst_meta_register (GST_META_TEST_API_TYPE,
"GstMetaTest",
sizeof (GstMetaTest),
test_init_func, test_free_func, test_transform_func);
+ g_once_init_leave (&meta_test_info, mi);
}
return meta_test_info;
}
-
-GstCheckABIStruct list[] = {
- {"GstBin", sizeof (GstBin), 192},
- {"GstBinClass", sizeof (GstBinClass), 288},
- {"GstBuffer", sizeof (GstBuffer), 88},
- {"GstBufferClass", sizeof (GstBufferClass), 16},
- {"GstBus", sizeof (GstBus), 80},
- {"GstBusClass", sizeof (GstBusClass), 144},
- {"GstCaps", sizeof (GstCaps), 32},
- {"GstStaticCaps", sizeof (GstStaticCaps), 52},
- {"GstChildProxyInterface", sizeof (GstChildProxyInterface), 40},
- {"GstClock", sizeof (GstClock), 176},
- {"GstClockClass", sizeof (GstClockClass), 160},
- {"GstElement", sizeof (GstElement), 136},
- {"GstElementClass", sizeof (GstElementClass), 248},
- {"GstElementFactory", sizeof (GstElementFactory), 144},
- {"GstElementFactoryClass", sizeof (GstElementFactoryClass), 152},
- {"GstElementDetails", sizeof (GstElementDetails), 32},
- {"GstEvent", sizeof (GstEvent), 48},
- {"GstEventClass", sizeof (GstEventClass), 32},
- {"GstFormatDefinition", sizeof (GstFormatDefinition), 16},
- {"GstIndexEntry", sizeof (GstIndexEntry), 20},
- {"GstIndexGroup", sizeof (GstIndexGroup), 16},
- {"GstIndex", sizeof (GstIndex), 100},
- {"GstIndexClass", sizeof (GstIndexClass), 156},
- {"GstIndexAssociation", sizeof (GstIndexAssociation), 16},
- {"GstIndexFactory", sizeof (GstIndexFactory), 96},
- {"GstIndexFactoryClass", sizeof (GstIndexFactoryClass), 152},
- {"GstDebugCategory", sizeof (GstDebugCategory), 16},
- {"GstIterator", sizeof (GstIterator), 52},
- {"GstMessage", sizeof (GstMessage), 64},
- {"GstMessageClass", sizeof (GstMessageClass), 32},
- {"GstMiniObject", sizeof (GstMiniObject), 16},
- {"GstMiniObjectClass", sizeof (GstMiniObjectClass), 16},
- {"GstObject", sizeof (GstObject), 40},
- {"GstObjectClass", sizeof (GstObjectClass), 120},
- {"GstPad", sizeof (GstPad), 188},
- {"GstPadClass", sizeof (GstPadClass), 152},
- {"GstPadTemplate", sizeof (GstPadTemplate), 72},
- {"GstPadTemplateClass", sizeof (GstPadTemplateClass), 140},
+static GstCheckABIStruct list[] = {
+ {"GstAllocationParams", sizeof (GstAllocationParams), 64},
+ {"GstAllocator", sizeof (GstAllocator), 176},
+ {"GstAllocatorClass", sizeof (GstAllocatorClass), 232},
+ {"GstBinClass", sizeof (GstBinClass), 576},
+ {"GstBin", sizeof (GstBin), 376},
+ {"GstBuffer", sizeof (GstBuffer), 112},
+ {"GstBufferPoolAcquireParams", sizeof (GstBufferPoolAcquireParams), 64},
+ {"GstBufferPool", sizeof (GstBufferPool), 136},
+ {"GstBufferPoolClass", sizeof (GstBufferPoolClass), 288},
+ {"GstBusClass", sizeof (GstBusClass), 232},
+ {"GstBus", sizeof (GstBus), 128},
+ {"GstCaps", sizeof (GstCaps), 64},
+ {"GstChildProxyInterface", sizeof (GstChildProxyInterface), 88},
+ {"GstClockClass", sizeof (GstClockClass), 264},
+ {"GstClockEntry", sizeof (GstClockEntry), 112},
+ {"GstClock", sizeof (GstClock), 128},
+ {"GstControlBinding", sizeof (GstControlBinding), 152},
+ {"GstControlBindingClass", sizeof (GstControlBindingClass), 248},
+ {"GstControlSource", sizeof (GstControlSource), 136},
+ {"GstControlSourceClass", sizeof (GstControlSourceClass), 216},
+ {"GstDebugCategory", sizeof (GstDebugCategory), 24},
+ {"GstElementClass", sizeof (GstElementClass), 488},
+ {"GstElement", sizeof (GstElement), 264},
+ {"GstEvent", sizeof (GstEvent), 88},
+ {"GstFormatDefinition", sizeof (GstFormatDefinition), 32},
+ {"GstGhostPadClass", sizeof (GstGhostPadClass), 272},
+ {"GstGhostPad", sizeof (GstGhostPad), 536},
+ {"GstIterator", sizeof (GstIterator), 120},
+ {"GstMemory", sizeof (GstMemory), 112},
+ {"GstMapInfo", sizeof (GstMapInfo), 104},
+ {"GstMessage", sizeof (GstMessage), 120},
+ {"GstMeta", sizeof (GstMeta), 16},
+ {"GstMetaTransformCopy", sizeof (GstMetaTransformCopy), 24},
+ {"GstMetaInfo", sizeof (GstMetaInfo), 80},
+ {"GstMiniObject", sizeof (GstMiniObject), 64},
+ {"GstObjectClass", sizeof (GstObjectClass), 184},
+ {"GstObject", sizeof (GstObject), 88},
+ {"GstPadClass", sizeof (GstPadClass), 232},
+ {"GstPad", sizeof (GstPad), 520},
+ {"GstPadProbeInfo", sizeof (GstPadProbeInfo), 72},
+ {"GstPadTemplateClass", sizeof (GstPadTemplateClass), 224},
+ {"GstPadTemplate", sizeof (GstPadTemplate), 144},
+ {"GstParamSpecFraction", sizeof (GstParamSpecFraction), 96},
+ {"GstPipelineClass", sizeof (GstPipelineClass), 608},
+ {"GstPipeline", sizeof (GstPipeline), 440},
+ {"GstPluginDesc", sizeof (GstPluginDesc), 112},
+ {"GstPresetInterface", sizeof (GstPresetInterface), 112},
+ {"GstProxyPadClass", sizeof (GstProxyPadClass), 240},
+ {"GstProxyPad", sizeof (GstProxyPad), 528},
+ {"GstQuery", sizeof (GstQuery), 72},
+ {"GstRegistryClass", sizeof (GstRegistryClass), 184},
+ {"GstRegistry", sizeof (GstRegistry), 96},
+ {"GstSegment", sizeof (GstSegment), 120},
+ {"GstStaticCaps", sizeof (GstStaticCaps), 48},
{"GstStaticPadTemplate", sizeof (GstStaticPadTemplate), 64},
- {"GstPipeline", sizeof (GstPipeline), 232},
- {"GstPipelineClass", sizeof (GstPipelineClass), 304},
- {"GstPlugin", sizeof (GstPlugin), 152},
- {"GstPluginClass", sizeof (GstPluginClass), 136},
- {"GstPluginDesc", sizeof (GstPluginDesc), 56},
- {"GstPluginFeature", sizeof (GstPluginFeature), 72},
- {"GstPluginFeatureClass", sizeof (GstPluginFeatureClass), 136},
- {"GstQueryTypeDefinition", sizeof (GstQueryTypeDefinition), 16},
- {"GstQuery", sizeof (GstQuery), 28},
- {"GstQueryClass", sizeof (GstQueryClass), 32},
- {"GstRegistry", sizeof (GstRegistry), 72},
- {"GstRegistryClass", sizeof (GstRegistryClass), 144},
- {"GstSegment", sizeof (GstSegment), 88},
- {"GstStructure", sizeof (GstStructure), 20},
- {"GstSystemClock", sizeof (GstSystemClock), 200},
- {"GstSystemClockClass", sizeof (GstSystemClockClass), 176},
- {"GstTagSetterInterface", sizeof (GstTagSetterInterface), 8},
- {"GstTask", sizeof (GstTask), 80},
- {"GstTaskClass", sizeof (GstTaskClass), 140},
- {"GstTrace", sizeof (GstTrace), 20},
- {"GstTraceEntry", sizeof (GstTraceEntry), 128},
- {"GstAllocTrace", sizeof (GstAllocTrace), 16},
- {"GstTypeFind", sizeof (GstTypeFind), 32},
- {"GstTypeFindFactory", sizeof (GstTypeFindFactory), 108},
- {"GstTypeFindFactoryClass", sizeof (GstTypeFindFactoryClass), 152},
- {"GstURIHandlerInterface", sizeof (GstURIHandlerInterface), 44},
- {"GstValueTable", sizeof (GstValueTable), 32},
+ {"GstStructure", sizeof (GstStructure), 16},
+ {"GstSystemClockClass", sizeof (GstSystemClockClass), 296},
+ {"GstSystemClock", sizeof (GstSystemClock), 168},
+ {"GstTagList", sizeof (GstTagList), 64,},
+ {"GstTagSetterInterface", sizeof (GstTagSetterInterface), 16},
+ {"GstTaskClass", sizeof (GstTaskClass), 224},
+ {"GstTask", sizeof (GstTask), 200},
+ {"GstTaskPoolClass", sizeof (GstTaskPoolClass), 248},
+ {"GstTaskPool", sizeof (GstTaskPool), 128},
+ {"GstTimedValue", sizeof (GstTimedValue), 16},
+ {"GstTocSetterInterface", sizeof (GstTocSetterInterface), 16},
+ {"GstTypeFind", sizeof (GstTypeFind), 64},
+ {"GstURIHandlerInterface", sizeof (GstURIHandlerInterface), 48},
+ {"GstValueTable", sizeof (GstValueTable), 64},
{NULL, 0, 0}
};
static GstCheckABIStruct list[] = {
- {"GstBin", sizeof (GstBin), 192},
- {"GstBinClass", sizeof (GstBinClass), 288},
- {"GstBuffer", sizeof (GstBuffer), 88},
- {"GstBufferClass", sizeof (GstBufferClass), 16},
- {"GstBus", sizeof (GstBus), 80},
- {"GstBusClass", sizeof (GstBusClass), 144},
- {"GstCaps", sizeof (GstCaps), 32},
- {"GstStaticCaps", sizeof (GstStaticCaps), 52},
- {"GstChildProxyInterface", sizeof (GstChildProxyInterface), 40},
- {"GstClock", sizeof (GstClock), 176},
- {"GstClockClass", sizeof (GstClockClass), 160},
- {"GstElement", sizeof (GstElement), 136},
- {"GstElementClass", sizeof (GstElementClass), 248},
- {"GstElementFactory", sizeof (GstElementFactory), 144},
- {"GstElementFactoryClass", sizeof (GstElementFactoryClass), 152},
- {"GstElementDetails", sizeof (GstElementDetails), 32},
- {"GstEvent", sizeof (GstEvent), 48},
- {"GstEventClass", sizeof (GstEventClass), 32},
- {"GstFormatDefinition", sizeof (GstFormatDefinition), 16},
- {"GstIndexEntry", sizeof (GstIndexEntry), 20},
- {"GstIndexGroup", sizeof (GstIndexGroup), 16},
- {"GstIndex", sizeof (GstIndex), 100},
- {"GstIndexClass", sizeof (GstIndexClass), 156},
- {"GstIndexAssociation", sizeof (GstIndexAssociation), 16},
- {"GstIndexFactory", sizeof (GstIndexFactory), 96},
- {"GstIndexFactoryClass", sizeof (GstIndexFactoryClass), 152},
- {"GstDebugCategory", sizeof (GstDebugCategory), 16},
- {"GstIterator", sizeof (GstIterator), 52},
- {"GstMessage", sizeof (GstMessage), 64},
- {"GstMessageClass", sizeof (GstMessageClass), 32},
- {"GstMiniObject", sizeof (GstMiniObject), 16},
- {"GstMiniObjectClass", sizeof (GstMiniObjectClass), 16},
- {"GstObject", sizeof (GstObject), 40},
- {"GstObjectClass", sizeof (GstObjectClass), 120},
- {"GstPad", sizeof (GstPad), 188},
- {"GstPadClass", sizeof (GstPadClass), 152},
- {"GstPadTemplate", sizeof (GstPadTemplate), 72},
- {"GstPadTemplateClass", sizeof (GstPadTemplateClass), 140},
+ {"GstAllocationParams", sizeof (GstAllocationParams), 64},
+ {"GstAllocator", sizeof (GstAllocator), 176},
+ {"GstAllocatorClass", sizeof (GstAllocatorClass), 232},
+ {"GstBinClass", sizeof (GstBinClass), 576},
+ {"GstBin", sizeof (GstBin), 376},
+ {"GstBuffer", sizeof (GstBuffer), 112},
+ {"GstBufferPoolAcquireParams", sizeof (GstBufferPoolAcquireParams), 64},
+ {"GstBufferPool", sizeof (GstBufferPool), 136},
+ {"GstBufferPoolClass", sizeof (GstBufferPoolClass), 288},
+ {"GstBusClass", sizeof (GstBusClass), 232},
+ {"GstBus", sizeof (GstBus), 128},
+ {"GstCaps", sizeof (GstCaps), 64},
+ {"GstChildProxyInterface", sizeof (GstChildProxyInterface), 88},
+ {"GstClockClass", sizeof (GstClockClass), 264},
+ {"GstClockEntry", sizeof (GstClockEntry), 112},
+ {"GstClock", sizeof (GstClock), 128},
+ {"GstControlBinding", sizeof (GstControlBinding), 152},
+ {"GstControlBindingClass", sizeof (GstControlBindingClass), 248},
+ {"GstControlSource", sizeof (GstControlSource), 136},
+ {"GstControlSourceClass", sizeof (GstControlSourceClass), 216},
+ {"GstDebugCategory", sizeof (GstDebugCategory), 24},
+ {"GstElementClass", sizeof (GstElementClass), 488},
+ {"GstElement", sizeof (GstElement), 264},
+ {"GstEvent", sizeof (GstEvent), 88},
+ {"GstFormatDefinition", sizeof (GstFormatDefinition), 32},
+ {"GstGhostPadClass", sizeof (GstGhostPadClass), 272},
+ {"GstGhostPad", sizeof (GstGhostPad), 536},
+ {"GstIterator", sizeof (GstIterator), 120},
+ {"GstMemory", sizeof (GstMemory), 112},
+ {"GstMapInfo", sizeof (GstMapInfo), 104},
+ {"GstMessage", sizeof (GstMessage), 120},
+ {"GstMeta", sizeof (GstMeta), 16},
+ {"GstMetaTransformCopy", sizeof (GstMetaTransformCopy), 24},
+ {"GstMetaInfo", sizeof (GstMetaInfo), 80},
+ {"GstMiniObject", sizeof (GstMiniObject), 64},
+ {"GstObjectClass", sizeof (GstObjectClass), 184},
+ {"GstObject", sizeof (GstObject), 88},
+ {"GstPadClass", sizeof (GstPadClass), 232},
+ {"GstPad", sizeof (GstPad), 520},
+ {"GstPadProbeInfo", sizeof (GstPadProbeInfo), 72},
+ {"GstPadTemplateClass", sizeof (GstPadTemplateClass), 224},
+ {"GstPadTemplate", sizeof (GstPadTemplate), 144},
+ {"GstParamSpecFraction", sizeof (GstParamSpecFraction), 96},
+ {"GstPipelineClass", sizeof (GstPipelineClass), 608},
+ {"GstPipeline", sizeof (GstPipeline), 440},
+ {"GstPluginDesc", sizeof (GstPluginDesc), 112},
+ {"GstPresetInterface", sizeof (GstPresetInterface), 112},
+ {"GstProxyPadClass", sizeof (GstProxyPadClass), 240},
+ {"GstProxyPad", sizeof (GstProxyPad), 528},
+ {"GstQuery", sizeof (GstQuery), 72},
+ {"GstRegistryClass", sizeof (GstRegistryClass), 184},
+ {"GstRegistry", sizeof (GstRegistry), 96},
+ {"GstSegment", sizeof (GstSegment), 120},
+ {"GstStaticCaps", sizeof (GstStaticCaps), 48},
{"GstStaticPadTemplate", sizeof (GstStaticPadTemplate), 64},
- {"GstPipeline", sizeof (GstPipeline), 232},
- {"GstPipelineClass", sizeof (GstPipelineClass), 304},
- {"GstPlugin", sizeof (GstPlugin), 152},
- {"GstPluginClass", sizeof (GstPluginClass), 136},
- {"GstPluginDesc", sizeof (GstPluginDesc), 56},
- {"GstPluginFeature", sizeof (GstPluginFeature), 72},
- {"GstPluginFeatureClass", sizeof (GstPluginFeatureClass), 136},
- {"GstQueryTypeDefinition", sizeof (GstQueryTypeDefinition), 16},
- {"GstQuery", sizeof (GstQuery), 28},
- {"GstQueryClass", sizeof (GstQueryClass), 32},
- {"GstRegistry", sizeof (GstRegistry), 72},
- {"GstRegistryClass", sizeof (GstRegistryClass), 144},
- {"GstSegment", sizeof (GstSegment), 88},
- {"GstStructure", sizeof (GstStructure), 20},
- {"GstSystemClock", sizeof (GstSystemClock), 200},
- {"GstSystemClockClass", sizeof (GstSystemClockClass), 176},
- {"GstTagSetterInterface", sizeof (GstTagSetterInterface), 8},
- {"GstTask", sizeof (GstTask), 80},
- {"GstTaskClass", sizeof (GstTaskClass), 140},
- {"GstTrace", sizeof (GstTrace), 20},
- {"GstTraceEntry", sizeof (GstTraceEntry), 128},
- {"GstAllocTrace", sizeof (GstAllocTrace), 16},
- {"GstTypeFind", sizeof (GstTypeFind), 32},
- {"GstTypeFindFactory", sizeof (GstTypeFindFactory), 108},
- {"GstTypeFindFactoryClass", sizeof (GstTypeFindFactoryClass), 152},
- {"GstURIHandlerInterface", sizeof (GstURIHandlerInterface), 44},
- {"GstValueTable", sizeof (GstValueTable), 32},
+ {"GstStructure", sizeof (GstStructure), 16},
+ {"GstSystemClockClass", sizeof (GstSystemClockClass), 296},
+ {"GstSystemClock", sizeof (GstSystemClock), 168},
+ {"GstTagList", sizeof (GstTagList), 64,},
+ {"GstTagSetterInterface", sizeof (GstTagSetterInterface), 16},
+ {"GstTaskClass", sizeof (GstTaskClass), 224},
+ {"GstTask", sizeof (GstTask), 200},
+ {"GstTaskPoolClass", sizeof (GstTaskPoolClass), 248},
+ {"GstTaskPool", sizeof (GstTaskPool), 128},
+ {"GstTimedValue", sizeof (GstTimedValue), 16},
+ {"GstTocSetterInterface", sizeof (GstTocSetterInterface), 16},
+ {"GstTypeFind", sizeof (GstTypeFind), 64},
+ {"GstURIHandlerInterface", sizeof (GstURIHandlerInterface), 48},
+ {"GstValueTable", sizeof (GstValueTable), 64},
{NULL, 0, 0}
};
static GstCheckABIStruct list[] = {
- {"GstBin", sizeof (GstBin), 184},
- {"GstBinClass", sizeof(GstBinClass), 288},
- {"GstBuffer", sizeof(GstBuffer), 80},
- {"GstBufferClass", sizeof(GstBufferClass), 16},
- {"GstBus", sizeof(GstBus), 80},
- {"GstBusClass", sizeof(GstBusClass), 144},
- {"GstCaps", sizeof(GstCaps), 32},
- {"GstStaticCaps", sizeof(GstStaticCaps), 52},
- {"GstChildProxyInterface", sizeof(GstChildProxyInterface), 40},
- {"GstClock", sizeof(GstClock), 172},
- {"GstClockClass", sizeof(GstClockClass), 160},
- {"GstElement", sizeof(GstElement), 128},
- {"GstElementClass", sizeof(GstElementClass), 248},
- {"GstElementFactory", sizeof(GstElementFactory), 144},
- {"GstElementFactoryClass", sizeof(GstElementFactoryClass), 152},
- {"GstElementDetails", sizeof(GstElementDetails), 32},
- {"GstEvent", sizeof(GstEvent), 40},
- {"GstEventClass", sizeof(GstEventClass), 32},
- {"GstFormatDefinition", sizeof(GstFormatDefinition), 16},
- {"GstIndexEntry", sizeof(GstIndexEntry), 20},
- {"GstIndexGroup", sizeof(GstIndexGroup), 16},
- {"GstIndex", sizeof(GstIndex), 100},
- {"GstIndexClass", sizeof(GstIndexClass), 156},
- {"GstIndexAssociation", sizeof(GstIndexAssociation), 12},
- {"GstIndexFactory", sizeof(GstIndexFactory), 96},
- {"GstIndexFactoryClass", sizeof(GstIndexFactoryClass), 152},
- {"GstDebugCategory", sizeof(GstDebugCategory), 16},
- {"GstIterator", sizeof(GstIterator), 52},
- {"GstMessage", sizeof(GstMessage), 60},
- {"GstMessageClass", sizeof(GstMessageClass), 32},
- {"GstMiniObject", sizeof(GstMiniObject), 16},
- {"GstMiniObjectClass", sizeof(GstMiniObjectClass), 16},
- {"GstObject", sizeof(GstObject), 40},
- {"GstObjectClass", sizeof(GstObjectClass), 120},
- {"GstPad", sizeof(GstPad), 188},
- {"GstPadClass", sizeof(GstPadClass), 152},
- {"GstPadTemplate", sizeof(GstPadTemplate), 72},
- {"GstPadTemplateClass", sizeof(GstPadTemplateClass), 140},
- {"GstStaticPadTemplate", sizeof(GstStaticPadTemplate), 64},
- {"GstPipeline", sizeof(GstPipeline), 220},
- {"GstPipelineClass", sizeof(GstPipelineClass), 304},
- {"GstPlugin", sizeof(GstPlugin), 148},
- {"GstPluginClass", sizeof(GstPluginClass), 136},
- {"GstPluginDesc", sizeof(GstPluginDesc), 56},
- {"GstPluginFeature", sizeof(GstPluginFeature), 72},
- {"GstPluginFeatureClass", sizeof(GstPluginFeatureClass), 136},
- {"GstQueryTypeDefinition", sizeof(GstQueryTypeDefinition), 16},
- {"GstQuery", sizeof(GstQuery), 28},
- {"GstQueryClass", sizeof(GstQueryClass), 32},
- {"GstRegistry", sizeof(GstRegistry), 72},
- {"GstRegistryClass", sizeof(GstRegistryClass), 144},
- {"GstSegment", sizeof(GstSegment), 88},
- {"GstStructure", sizeof(GstStructure), 20},
- {"GstSystemClock", sizeof(GstSystemClock), 196},
- {"GstSystemClockClass", sizeof(GstSystemClockClass), 176},
- {"GstTagSetterInterface", sizeof(GstTagSetterInterface), 8},
- {"GstTask", sizeof(GstTask), 80},
- {"GstTaskClass", sizeof(GstTaskClass), 140},
- {"GstTrace", sizeof(GstTrace), 20},
- {"GstTraceEntry", sizeof(GstTraceEntry), 128},
- {"GstAllocTrace", sizeof(GstAllocTrace), 16},
- {"GstTypeFind", sizeof(GstTypeFind), 32},
- {"GstTypeFindFactory", sizeof(GstTypeFindFactory), 108},
- {"GstTypeFindFactoryClass", sizeof(GstTypeFindFactoryClass), 152},
- {"GstURIHandlerInterface", sizeof(GstURIHandlerInterface), 44},
- {"GstValueTable", sizeof(GstValueTable), 32},
- {NULL, 0, 0}
+ {"GstAllocationParams", sizeof (GstAllocationParams), 32},
+ {"GstAllocator", sizeof (GstAllocator), 100},
+ {"GstAllocatorClass", sizeof (GstAllocatorClass), 116},
+ {"GstBinClass", sizeof (GstBinClass), 292},
+ {"GstBin", sizeof (GstBin), 232},
+ {"GstBuffer", sizeof (GstBuffer), 80},
+ {"GstBufferPoolAcquireParams", sizeof (GstBufferPoolAcquireParams), 40},
+ {"GstBufferPool", sizeof (GstBufferPool), 80},
+ {"GstBufferPoolClass", sizeof (GstBufferPoolClass), 144},
+ {"GstBusClass", sizeof (GstBusClass), 116},
+ {"GstBus", sizeof (GstBus), 76},
+ {"GstCaps", sizeof (GstCaps), 36},
+ {"GstChildProxyInterface", sizeof (GstChildProxyInterface), 44},
+ {"GstClockClass", sizeof (GstClockClass), 132},
+ {"GstClockEntry", sizeof (GstClockEntry), 68},
+ {"GstClock", sizeof (GstClock), 76},
+ {"GstControlBinding", sizeof (GstControlBinding), 88},
+ {"GstControlBindingClass", sizeof (GstControlBindingClass), 124},
+ {"GstControlSource", sizeof (GstControlSource), 80},
+ {"GstControlSourceClass", sizeof (GstControlSourceClass), 108},
+ {"GstDebugCategory", sizeof (GstDebugCategory), 16},
+ {"GstElementClass", sizeof (GstElementClass), 248},
+ {"GstElement", sizeof (GstElement), 172},
+ {"GstEvent", sizeof (GstEvent), 52},
+ {"GstFormatDefinition", sizeof (GstFormatDefinition), 16},
+ {"GstGhostPadClass", sizeof (GstGhostPadClass), 136},
+ {"GstGhostPad", sizeof (GstGhostPad), 296},
+ {"GstIterator", sizeof (GstIterator), 60},
+ {"GstMemory", sizeof (GstMemory), 60},
+ {"GstMapInfo", sizeof (GstMapInfo), 52},
+ {"GstMessage", sizeof (GstMessage), 76},
+ {"GstMeta", sizeof (GstMeta), 8},
+ {"GstMetaTransformCopy", sizeof (GstMetaTransformCopy), 12},
+ {"GstMetaInfo", sizeof (GstMetaInfo), 40},
+ {"GstMiniObject", sizeof (GstMiniObject), 36},
+ {"GstObjectClass", sizeof (GstObjectClass), 92},
+ {"GstObject", sizeof (GstObject), 56},
+ {"GstPadClass", sizeof (GstPadClass), 116},
+ {"GstPad", sizeof (GstPad), 288},
+ {"GstPadProbeInfo", sizeof (GstPadProbeInfo), 40},
+ {"GstPadTemplateClass", sizeof (GstPadTemplateClass), 112},
+ {"GstPadTemplate", sizeof (GstPadTemplate), 88},
+ {"GstParamSpecFraction", sizeof (GstParamSpecFraction), 64},
+ {"GstPipelineClass", sizeof (GstPipelineClass), 308},
+ {"GstPipeline", sizeof (GstPipeline), 272},
+ {"GstPluginDesc", sizeof (GstPluginDesc), 60},
+ {"GstPresetInterface", sizeof (GstPresetInterface), 56},
+ {"GstProxyPadClass", sizeof (GstProxyPadClass), 120},
+ {"GstProxyPad", sizeof (GstProxyPad), 292},
+ {"GstQuery", sizeof (GstQuery), 40},
+ {"GstRegistryClass", sizeof (GstRegistryClass), 92},
+ {"GstRegistry", sizeof (GstRegistry), 60},
+ {"GstSegment", sizeof (GstSegment), 96},
+ {"GstStaticCaps", sizeof (GstStaticCaps), 24},
+ {"GstStaticPadTemplate", sizeof (GstStaticPadTemplate), 36},
+ {"GstStructure", sizeof (GstStructure), 8},
+ {"GstSystemClockClass", sizeof (GstSystemClockClass), 148},
+ {"GstSystemClock", sizeof (GstSystemClock), 96},
+ {"GstTagList", sizeof (GstTagList), 36},
+ {"GstTagSetterInterface", sizeof (GstTagSetterInterface), 8},
+ {"GstTaskClass", sizeof (GstTaskClass), 112},
+ {"GstTask", sizeof (GstTask), 116},
+ {"GstTaskPoolClass", sizeof (GstTaskPoolClass), 124},
+ {"GstTaskPool", sizeof (GstTaskPool), 76},
+ {"GstTimedValue", sizeof (GstTimedValue), 16},
+ {"GstTocSetterInterface", sizeof (GstTocSetterInterface), 8},
+ {"GstTypeFind", sizeof (GstTypeFind), 32},
+ {"GstURIHandlerInterface", sizeof (GstURIHandlerInterface), 24},
+ {"GstValueTable", sizeof (GstValueTable), 32},
+ {NULL, 0, 0}
};
static GstCheckABIStruct list[] = {
- {"GstBin", sizeof (GstBin), 192},
- {"GstBinClass", sizeof (GstBinClass), 288},
- {"GstBuffer", sizeof (GstBuffer), 88},
- {"GstBufferClass", sizeof (GstBufferClass), 16},
- {"GstBus", sizeof (GstBus), 80},
- {"GstBusClass", sizeof (GstBusClass), 144},
- {"GstCaps", sizeof (GstCaps), 32},
- {"GstStaticCaps", sizeof (GstStaticCaps), 52},
- {"GstChildProxyInterface", sizeof (GstChildProxyInterface), 40},
- {"GstClock", sizeof (GstClock), 176},
- {"GstClockClass", sizeof (GstClockClass), 160},
- {"GstElement", sizeof (GstElement), 136},
+ {"GstAllocationParams", sizeof (GstAllocationParams), 32},
+ {"GstAllocator", sizeof (GstAllocator), 112},
+ {"GstAllocatorClass", sizeof (GstAllocatorClass), 116},
+ {"GstBinClass", sizeof (GstBinClass), 292},
+ {"GstBin", sizeof (GstBin), 248},
+ {"GstBuffer", sizeof (GstBuffer), 80},
+ {"GstBufferPoolAcquireParams", sizeof (GstBufferPoolAcquireParams), 48},
+ {"GstBufferPool", sizeof (GstBufferPool), 88},
+ {"GstBufferPoolClass", sizeof (GstBufferPoolClass), 144},
+ {"GstBusClass", sizeof (GstBusClass), 116},
+ {"GstBus", sizeof (GstBus), 88},
+ {"GstCaps", sizeof (GstCaps), 36},
+ {"GstChildProxyInterface", sizeof (GstChildProxyInterface), 44},
+ {"GstClockClass", sizeof (GstClockClass), 132},
+ {"GstClockEntry", sizeof (GstClockEntry), 72},
+ {"GstClock", sizeof (GstClock), 88},
+ {"GstControlBinding", sizeof (GstControlBinding), 96},
+ {"GstControlBindingClass", sizeof (GstControlBindingClass), 124},
+ {"GstControlSource", sizeof (GstControlSource), 88},
+ {"GstControlSourceClass", sizeof (GstControlSourceClass), 108},
+ {"GstDebugCategory", sizeof (GstDebugCategory), 16},
{"GstElementClass", sizeof (GstElementClass), 248},
- {"GstElementFactory", sizeof (GstElementFactory), 144},
- {"GstElementFactoryClass", sizeof (GstElementFactoryClass), 152},
- {"GstElementDetails", sizeof (GstElementDetails), 32},
- {"GstEvent", sizeof (GstEvent), 48},
- {"GstEventClass", sizeof (GstEventClass), 32},
+ {"GstElement", sizeof (GstElement), 184},
+ {"GstEvent", sizeof (GstEvent), 56},
{"GstFormatDefinition", sizeof (GstFormatDefinition), 16},
- {"GstIndexEntry", sizeof (GstIndexEntry), 20},
- {"GstIndexGroup", sizeof (GstIndexGroup), 16},
- {"GstIndex", sizeof (GstIndex), 100},
- {"GstIndexClass", sizeof (GstIndexClass), 156},
- {"GstIndexAssociation", sizeof (GstIndexAssociation), 16},
- {"GstIndexFactory", sizeof (GstIndexFactory), 96},
- {"GstIndexFactoryClass", sizeof (GstIndexFactoryClass), 152},
- {"GstDebugCategory", sizeof (GstDebugCategory), 16},
- {"GstIterator", sizeof (GstIterator), 52},
- {"GstMessage", sizeof (GstMessage), 64},
- {"GstMessageClass", sizeof (GstMessageClass), 32},
- {"GstMiniObject", sizeof (GstMiniObject), 16},
- {"GstMiniObjectClass", sizeof (GstMiniObjectClass), 16},
- {"GstObject", sizeof (GstObject), 40},
- {"GstObjectClass", sizeof (GstObjectClass), 120},
- {"GstPad", sizeof (GstPad), 188},
- {"GstPadClass", sizeof (GstPadClass), 152},
- {"GstPadTemplate", sizeof (GstPadTemplate), 72},
- {"GstPadTemplateClass", sizeof (GstPadTemplateClass), 140},
- {"GstStaticPadTemplate", sizeof (GstStaticPadTemplate), 64},
- {"GstPipeline", sizeof (GstPipeline), 232},
- {"GstPipelineClass", sizeof (GstPipelineClass), 304},
- {"GstPlugin", sizeof (GstPlugin), 152},
- {"GstPluginClass", sizeof (GstPluginClass), 136},
- {"GstPluginDesc", sizeof (GstPluginDesc), 56},
- {"GstPluginFeature", sizeof (GstPluginFeature), 72},
- {"GstPluginFeatureClass", sizeof (GstPluginFeatureClass), 136},
- {"GstQueryTypeDefinition", sizeof (GstQueryTypeDefinition), 16},
- {"GstQuery", sizeof (GstQuery), 28},
- {"GstQueryClass", sizeof (GstQueryClass), 32},
+ {"GstGhostPadClass", sizeof (GstGhostPadClass), 136},
+ {"GstGhostPad", sizeof (GstGhostPad), 320},
+ {"GstIterator", sizeof (GstIterator), 60},
+ {"GstMemory", sizeof (GstMemory), 60},
+ {"GstMapInfo", sizeof (GstMapInfo), 52},
+ {"GstMessage", sizeof (GstMessage), 80},
+ {"GstMeta", sizeof (GstMeta), 8},
+ {"GstMetaTransformCopy", sizeof (GstMetaTransformCopy), 12},
+ {"GstMetaInfo", sizeof (GstMetaInfo), 40},
+ {"GstMiniObject", sizeof (GstMiniObject), 36},
+ {"GstObjectClass", sizeof (GstObjectClass), 92},
+ {"GstObject", sizeof (GstObject), 64},
+ {"GstPadClass", sizeof (GstPadClass), 116},
+ {"GstPad", sizeof (GstPad), 304},
+ {"GstPadProbeInfo", sizeof (GstPadProbeInfo), 48},
+ {"GstPadTemplateClass", sizeof (GstPadTemplateClass), 112},
+ {"GstPadTemplate", sizeof (GstPadTemplate), 96},
+ {"GstParamSpecFraction", sizeof (GstParamSpecFraction), 64},
+ {"GstPipelineClass", sizeof (GstPipelineClass), 308},
+ {"GstPipeline", sizeof (GstPipeline), 296},
+ {"GstPluginDesc", sizeof (GstPluginDesc), 60},
+ {"GstPresetInterface", sizeof (GstPresetInterface), 56},
+ {"GstProxyPadClass", sizeof (GstProxyPadClass), 120},
+ {"GstProxyPad", sizeof (GstProxyPad), 312},
+ {"GstQuery", sizeof (GstQuery), 40},
+ {"GstRegistryClass", sizeof (GstRegistryClass), 92},
{"GstRegistry", sizeof (GstRegistry), 72},
- {"GstRegistryClass", sizeof (GstRegistryClass), 144},
- {"GstSegment", sizeof (GstSegment), 88},
- {"GstStructure", sizeof (GstStructure), 20},
- {"GstSystemClock", sizeof (GstSystemClock), 200},
- {"GstSystemClockClass", sizeof (GstSystemClockClass), 176},
+ {"GstSegment", sizeof (GstSegment), 104},
+ {"GstStaticCaps", sizeof (GstStaticCaps), 24},
+ {"GstStaticPadTemplate", sizeof (GstStaticPadTemplate), 36},
+ {"GstStructure", sizeof (GstStructure), 8},
+ {"GstSystemClockClass", sizeof (GstSystemClockClass), 148},
+ {"GstSystemClock", sizeof (GstSystemClock), 112},
+ {"GstTagList", sizeof (GstTagList), 36},
{"GstTagSetterInterface", sizeof (GstTagSetterInterface), 8},
- {"GstTask", sizeof (GstTask), 80},
- {"GstTaskClass", sizeof (GstTaskClass), 140},
- {"GstTrace", sizeof (GstTrace), 20},
- {"GstTraceEntry", sizeof (GstTraceEntry), 128},
- {"GstAllocTrace", sizeof (GstAllocTrace), 16},
+ {"GstTaskClass", sizeof (GstTaskClass), 112},
+ {"GstTask", sizeof (GstTask), 128},
+ {"GstTaskPoolClass", sizeof (GstTaskPoolClass), 124},
+ {"GstTaskPool", sizeof (GstTaskPool), 88},
+ {"GstTimedValue", sizeof (GstTimedValue), 16},
+ {"GstTocSetterInterface", sizeof (GstTocSetterInterface), 8},
{"GstTypeFind", sizeof (GstTypeFind), 32},
- {"GstTypeFindFactory", sizeof (GstTypeFindFactory), 108},
- {"GstTypeFindFactoryClass", sizeof (GstTypeFindFactoryClass), 152},
- {"GstURIHandlerInterface", sizeof (GstURIHandlerInterface), 44},
+ {"GstURIHandlerInterface", sizeof (GstURIHandlerInterface), 24},
{"GstValueTable", sizeof (GstValueTable), 32},
{NULL, 0, 0}
};
static GstCheckABIStruct list[] = {
- {"GstBin", sizeof (GstBin), 336},
- {"GstBinClass", sizeof (GstBinClass), 568},
- {"GstBuffer", sizeof (GstBuffer), 120} ,
- {"GstBufferClass", sizeof (GstBufferClass), 32} ,
- {"GstBus", sizeof (GstBus), 152} ,
- {"GstBusClass", sizeof (GstBusClass), 288} ,
- {"GstCaps", sizeof (GstCaps), 56} ,
- {"GstStaticCaps", sizeof (GstStaticCaps), 96} ,
- {"GstChildProxyInterface", sizeof (GstChildProxyInterface), 80} ,
- {"GstClock", sizeof (GstClock), 240} ,
- {"GstClockClass", sizeof (GstClockClass), 320} ,
- {"GstElement", sizeof (GstElement), 232} ,
- {"GstElementClass", sizeof (GstElementClass), 488} ,
- {"GstElementFactory", sizeof (GstElementFactory), 280} ,
- {"GstElementFactoryClass", sizeof (GstElementFactoryClass), 304} ,
- {"GstElementDetails", sizeof (GstElementDetails), 64} ,
- {"GstEvent", sizeof (GstEvent), 64} ,
- {"GstEventClass", sizeof (GstEventClass), 64} ,
- {"GstFormatDefinition", sizeof (GstFormatDefinition), 32} ,
- {"GstIndexEntry", sizeof (GstIndexEntry), 32} ,
- {"GstIndexGroup", sizeof (GstIndexGroup), 24} ,
- {"GstIndex", sizeof (GstIndex), 192} ,
- {"GstIndexClass", sizeof (GstIndexClass), 312} ,
- {"GstIndexAssociation", sizeof (GstIndexAssociation), 16} ,
- {"GstIndexFactory", sizeof (GstIndexFactory), 192} ,
- {"GstIndexFactoryClass", sizeof (GstIndexFactoryClass), 304} ,
- {"GstDebugCategory", sizeof (GstDebugCategory), 24} ,
- {"GstIterator", sizeof (GstIterator), 104} ,
- {"GstMessage", sizeof (GstMessage), 104} ,
- {"GstMessageClass", sizeof (GstMessageClass), 64} ,
- {"GstMiniObject", sizeof (GstMiniObject), 24} ,
- {"GstMiniObjectClass", sizeof (GstMiniObjectClass), 32} ,
- {"GstObject", sizeof (GstObject), 80} ,
- {"GstObjectClass", sizeof (GstObjectClass), 240} ,
- {"GstPad", sizeof (GstPad), 368} ,
- {"GstPadClass", sizeof (GstPadClass), 304} ,
- {"GstPadTemplate", sizeof (GstPadTemplate), 136} ,
- {"GstPadTemplateClass", sizeof (GstPadTemplateClass), 280} ,
- {"GstStaticPadTemplate", sizeof (GstStaticPadTemplate), 112} ,
- {"GstPipeline", sizeof (GstPipeline), 392} ,
- {"GstPipelineClass", sizeof (GstPipelineClass), 600} ,
- {"GstPlugin", sizeof (GstPlugin), 280} ,
- {"GstPluginClass", sizeof (GstPluginClass), 272} ,
- {"GstPluginDesc", sizeof (GstPluginDesc), 104} ,
- {"GstPluginFeature", sizeof (GstPluginFeature), 144} ,
- {"GstPluginFeatureClass", sizeof (GstPluginFeatureClass), 272} ,
- {"GstQueryTypeDefinition", sizeof (GstQueryTypeDefinition), 32} ,
- {"GstQuery", sizeof (GstQuery), 48} ,
- {"GstQueryClass", sizeof (GstQueryClass), 64} ,
- {"GstRegistry", sizeof (GstRegistry), 144} ,
- {"GstRegistryClass", sizeof (GstRegistryClass), 288} ,
- {"GstSegment", sizeof (GstSegment), 104} ,
- {"GstStructure", sizeof (GstStructure), 40} ,
- {"GstSystemClock", sizeof (GstSystemClock), 288} ,
- {"GstSystemClockClass", sizeof (GstSystemClockClass), 352} ,
- {"GstTagSetterInterface", sizeof (GstTagSetterInterface), 16} ,
- {"GstTask", sizeof (GstTask), 160} ,
- {"GstTaskClass", sizeof (GstTaskClass), 280} ,
- {"GstTrace", sizeof (GstTrace), 32} ,
- {"GstTraceEntry", sizeof (GstTraceEntry), 128} ,
- {"GstAllocTrace", sizeof (GstAllocTrace), 24} ,
- {"GstTypeFind", sizeof (GstTypeFind), 64} ,
- {"GstTypeFindFactory", sizeof (GstTypeFindFactory), 216} ,
- {"GstTypeFindFactoryClass", sizeof (GstTypeFindFactoryClass), 304} ,
- {"GstURIHandlerInterface", sizeof (GstURIHandlerInterface), 88} ,
- {"GstValueTable", sizeof (GstValueTable), 64} ,
+ {"GstAllocationParams", sizeof (GstAllocationParams), 64},
+ {"GstAllocator", sizeof (GstAllocator), 176},
+ {"GstAllocatorClass", sizeof (GstAllocatorClass), 232},
+ {"GstBinClass", sizeof (GstBinClass), 576},
+ {"GstBin", sizeof (GstBin), 376},
+ {"GstBuffer", sizeof (GstBuffer), 112},
+ {"GstBufferPoolAcquireParams", sizeof (GstBufferPoolAcquireParams), 64},
+ {"GstBufferPool", sizeof (GstBufferPool), 136},
+ {"GstBufferPoolClass", sizeof (GstBufferPoolClass), 288},
+ {"GstBusClass", sizeof (GstBusClass), 232},
+ {"GstBus", sizeof (GstBus), 128},
+ {"GstCaps", sizeof (GstCaps), 64},
+ {"GstChildProxyInterface", sizeof (GstChildProxyInterface), 88},
+ {"GstClockClass", sizeof (GstClockClass), 264},
+ {"GstClockEntry", sizeof (GstClockEntry), 112},
+ {"GstClock", sizeof (GstClock), 128},
+ {"GstControlBinding", sizeof (GstControlBinding), 152},
+ {"GstControlBindingClass", sizeof (GstControlBindingClass), 248},
+ {"GstControlSource", sizeof (GstControlSource), 136},
+ {"GstControlSourceClass", sizeof (GstControlSourceClass), 216},
+ {"GstDebugCategory", sizeof (GstDebugCategory), 24},
+ {"GstElementClass", sizeof (GstElementClass), 488},
+ {"GstElement", sizeof (GstElement), 264},
+ {"GstEvent", sizeof (GstEvent), 88},
+ {"GstFormatDefinition", sizeof (GstFormatDefinition), 32},
+ {"GstGhostPadClass", sizeof (GstGhostPadClass), 272},
+ {"GstGhostPad", sizeof (GstGhostPad), 536},
+ {"GstIterator", sizeof (GstIterator), 120},
+ {"GstMemory", sizeof (GstMemory), 112},
+ {"GstMapInfo", sizeof (GstMapInfo), 104},
+ {"GstMessage", sizeof (GstMessage), 120},
+ {"GstMeta", sizeof (GstMeta), 16},
+ {"GstMetaTransformCopy", sizeof (GstMetaTransformCopy), 24},
+ {"GstMetaInfo", sizeof (GstMetaInfo), 80},
+ {"GstMiniObject", sizeof (GstMiniObject), 64},
+ {"GstObjectClass", sizeof (GstObjectClass), 184},
+ {"GstObject", sizeof (GstObject), 88},
+ {"GstPadClass", sizeof (GstPadClass), 232},
+ {"GstPad", sizeof (GstPad), 520},
+ {"GstPadProbeInfo", sizeof (GstPadProbeInfo), 72},
+ {"GstPadTemplateClass", sizeof (GstPadTemplateClass), 224},
+ {"GstPadTemplate", sizeof (GstPadTemplate), 144},
+ {"GstParamSpecFraction", sizeof (GstParamSpecFraction), 96},
+ {"GstPipelineClass", sizeof (GstPipelineClass), 608},
+ {"GstPipeline", sizeof (GstPipeline), 440},
+ {"GstPluginDesc", sizeof (GstPluginDesc), 112},
+ {"GstPresetInterface", sizeof (GstPresetInterface), 112},
+ {"GstProxyPadClass", sizeof (GstProxyPadClass), 240},
+ {"GstProxyPad", sizeof (GstProxyPad), 528},
+ {"GstQuery", sizeof (GstQuery), 72},
+ {"GstRegistryClass", sizeof (GstRegistryClass), 184},
+ {"GstRegistry", sizeof (GstRegistry), 96},
+ {"GstSegment", sizeof (GstSegment), 120},
+ {"GstStaticCaps", sizeof (GstStaticCaps), 48},
+ {"GstStaticPadTemplate", sizeof (GstStaticPadTemplate), 64},
+ {"GstStructure", sizeof (GstStructure), 16},
+ {"GstSystemClockClass", sizeof (GstSystemClockClass), 296},
+ {"GstSystemClock", sizeof (GstSystemClock), 168},
+ {"GstTagList", sizeof (GstTagList), 64,},
+ {"GstTagSetterInterface", sizeof (GstTagSetterInterface), 16},
+ {"GstTaskClass", sizeof (GstTaskClass), 224},
+ {"GstTask", sizeof (GstTask), 200},
+ {"GstTaskPoolClass", sizeof (GstTaskPoolClass), 248},
+ {"GstTaskPool", sizeof (GstTaskPool), 128},
+ {"GstTimedValue", sizeof (GstTimedValue), 16},
+ {"GstTocSetterInterface", sizeof (GstTocSetterInterface), 16},
+ {"GstTypeFind", sizeof (GstTypeFind), 64},
+ {"GstURIHandlerInterface", sizeof (GstURIHandlerInterface), 48},
+ {"GstValueTable", sizeof (GstValueTable), 64},
{NULL, 0, 0}
};
-
-GstCheckABIStruct list[] = {
- {"GstBin", sizeof (GstBin), 192},
- {"GstBinClass", sizeof (GstBinClass), 288},
- {"GstBuffer", sizeof (GstBuffer), 88},
- {"GstBufferClass", sizeof (GstBufferClass), 16},
- {"GstBus", sizeof (GstBus), 80},
- {"GstBusClass", sizeof (GstBusClass), 144},
- {"GstCaps", sizeof (GstCaps), 32},
- {"GstStaticCaps", sizeof (GstStaticCaps), 52},
- {"GstChildProxyInterface", sizeof (GstChildProxyInterface), 40},
- {"GstClock", sizeof (GstClock), 176},
- {"GstClockClass", sizeof (GstClockClass), 160},
- {"GstElement", sizeof (GstElement), 136},
- {"GstElementClass", sizeof (GstElementClass), 248},
- {"GstElementFactory", sizeof (GstElementFactory), 144},
- {"GstElementFactoryClass", sizeof (GstElementFactoryClass), 152},
- {"GstElementDetails", sizeof (GstElementDetails), 32},
- {"GstEvent", sizeof (GstEvent), 48},
- {"GstEventClass", sizeof (GstEventClass), 32},
- {"GstFormatDefinition", sizeof (GstFormatDefinition), 16},
- {"GstIndexEntry", sizeof (GstIndexEntry), 20},
- {"GstIndexGroup", sizeof (GstIndexGroup), 16},
- {"GstIndex", sizeof (GstIndex), 100},
- {"GstIndexClass", sizeof (GstIndexClass), 156},
- {"GstIndexAssociation", sizeof (GstIndexAssociation), 16},
- {"GstIndexFactory", sizeof (GstIndexFactory), 96},
- {"GstIndexFactoryClass", sizeof (GstIndexFactoryClass), 152},
- {"GstDebugCategory", sizeof (GstDebugCategory), 16},
- {"GstIterator", sizeof (GstIterator), 52},
- {"GstMessage", sizeof (GstMessage), 64},
- {"GstMessageClass", sizeof (GstMessageClass), 32},
- {"GstMiniObject", sizeof (GstMiniObject), 16},
- {"GstMiniObjectClass", sizeof (GstMiniObjectClass), 16},
- {"GstObject", sizeof (GstObject), 40},
- {"GstObjectClass", sizeof (GstObjectClass), 120},
- {"GstPad", sizeof (GstPad), 188},
- {"GstPadClass", sizeof (GstPadClass), 152},
- {"GstPadTemplate", sizeof (GstPadTemplate), 72},
- {"GstPadTemplateClass", sizeof (GstPadTemplateClass), 140},
+static GstCheckABIStruct list[] = {
+ {"GstAllocationParams", sizeof (GstAllocationParams), 64},
+ {"GstAllocator", sizeof (GstAllocator), 176},
+ {"GstAllocatorClass", sizeof (GstAllocatorClass), 232},
+ {"GstBinClass", sizeof (GstBinClass), 576},
+ {"GstBin", sizeof (GstBin), 376},
+ {"GstBuffer", sizeof (GstBuffer), 112},
+ {"GstBufferPoolAcquireParams", sizeof (GstBufferPoolAcquireParams), 64},
+ {"GstBufferPool", sizeof (GstBufferPool), 136},
+ {"GstBufferPoolClass", sizeof (GstBufferPoolClass), 288},
+ {"GstBusClass", sizeof (GstBusClass), 232},
+ {"GstBus", sizeof (GstBus), 128},
+ {"GstCaps", sizeof (GstCaps), 64},
+ {"GstChildProxyInterface", sizeof (GstChildProxyInterface), 88},
+ {"GstClockClass", sizeof (GstClockClass), 264},
+ {"GstClockEntry", sizeof (GstClockEntry), 112},
+ {"GstClock", sizeof (GstClock), 128},
+ {"GstControlBinding", sizeof (GstControlBinding), 152},
+ {"GstControlBindingClass", sizeof (GstControlBindingClass), 248},
+ {"GstControlSource", sizeof (GstControlSource), 136},
+ {"GstControlSourceClass", sizeof (GstControlSourceClass), 216},
+ {"GstDebugCategory", sizeof (GstDebugCategory), 24},
+ {"GstElementClass", sizeof (GstElementClass), 488},
+ {"GstElement", sizeof (GstElement), 264},
+ {"GstEvent", sizeof (GstEvent), 88},
+ {"GstFormatDefinition", sizeof (GstFormatDefinition), 32},
+ {"GstGhostPadClass", sizeof (GstGhostPadClass), 272},
+ {"GstGhostPad", sizeof (GstGhostPad), 536},
+ {"GstIterator", sizeof (GstIterator), 120},
+ {"GstMemory", sizeof (GstMemory), 112},
+ {"GstMapInfo", sizeof (GstMapInfo), 104},
+ {"GstMessage", sizeof (GstMessage), 120},
+ {"GstMeta", sizeof (GstMeta), 16},
+ {"GstMetaTransformCopy", sizeof (GstMetaTransformCopy), 24},
+ {"GstMetaInfo", sizeof (GstMetaInfo), 80},
+ {"GstMiniObject", sizeof (GstMiniObject), 64},
+ {"GstObjectClass", sizeof (GstObjectClass), 184},
+ {"GstObject", sizeof (GstObject), 88},
+ {"GstPadClass", sizeof (GstPadClass), 232},
+ {"GstPad", sizeof (GstPad), 520},
+ {"GstPadProbeInfo", sizeof (GstPadProbeInfo), 72},
+ {"GstPadTemplateClass", sizeof (GstPadTemplateClass), 224},
+ {"GstPadTemplate", sizeof (GstPadTemplate), 144},
+ {"GstParamSpecFraction", sizeof (GstParamSpecFraction), 96},
+ {"GstPipelineClass", sizeof (GstPipelineClass), 608},
+ {"GstPipeline", sizeof (GstPipeline), 440},
+ {"GstPluginDesc", sizeof (GstPluginDesc), 112},
+ {"GstPresetInterface", sizeof (GstPresetInterface), 112},
+ {"GstProxyPadClass", sizeof (GstProxyPadClass), 240},
+ {"GstProxyPad", sizeof (GstProxyPad), 528},
+ {"GstQuery", sizeof (GstQuery), 72},
+ {"GstRegistryClass", sizeof (GstRegistryClass), 184},
+ {"GstRegistry", sizeof (GstRegistry), 96},
+ {"GstSegment", sizeof (GstSegment), 120},
+ {"GstStaticCaps", sizeof (GstStaticCaps), 48},
{"GstStaticPadTemplate", sizeof (GstStaticPadTemplate), 64},
- {"GstPipeline", sizeof (GstPipeline), 232},
- {"GstPipelineClass", sizeof (GstPipelineClass), 304},
- {"GstPlugin", sizeof (GstPlugin), 152},
- {"GstPluginClass", sizeof (GstPluginClass), 136},
- {"GstPluginDesc", sizeof (GstPluginDesc), 56},
- {"GstPluginFeature", sizeof (GstPluginFeature), 72},
- {"GstPluginFeatureClass", sizeof (GstPluginFeatureClass), 136},
- {"GstQueryTypeDefinition", sizeof (GstQueryTypeDefinition), 16},
- {"GstQuery", sizeof (GstQuery), 28},
- {"GstQueryClass", sizeof (GstQueryClass), 32},
- {"GstRegistry", sizeof (GstRegistry), 72},
- {"GstRegistryClass", sizeof (GstRegistryClass), 144},
- {"GstSegment", sizeof (GstSegment), 88},
- {"GstStructure", sizeof (GstStructure), 20},
- {"GstSystemClock", sizeof (GstSystemClock), 200},
- {"GstSystemClockClass", sizeof (GstSystemClockClass), 176},
- {"GstTagSetterInterface", sizeof (GstTagSetterInterface), 8},
- {"GstTask", sizeof (GstTask), 80},
- {"GstTaskClass", sizeof (GstTaskClass), 140},
- {"GstTrace", sizeof (GstTrace), 20},
- {"GstTraceEntry", sizeof (GstTraceEntry), 128},
- {"GstAllocTrace", sizeof (GstAllocTrace), 16},
- {"GstTypeFind", sizeof (GstTypeFind), 32},
- {"GstTypeFindFactory", sizeof (GstTypeFindFactory), 108},
- {"GstTypeFindFactoryClass", sizeof (GstTypeFindFactoryClass), 152},
- {"GstURIHandlerInterface", sizeof (GstURIHandlerInterface), 44},
- {"GstValueTable", sizeof (GstValueTable), 32},
+ {"GstStructure", sizeof (GstStructure), 16},
+ {"GstSystemClockClass", sizeof (GstSystemClockClass), 296},
+ {"GstSystemClock", sizeof (GstSystemClock), 168},
+ {"GstTagList", sizeof (GstTagList), 64,},
+ {"GstTagSetterInterface", sizeof (GstTagSetterInterface), 16},
+ {"GstTaskClass", sizeof (GstTaskClass), 224},
+ {"GstTask", sizeof (GstTask), 200},
+ {"GstTaskPoolClass", sizeof (GstTaskPoolClass), 248},
+ {"GstTaskPool", sizeof (GstTaskPool), 128},
+ {"GstTimedValue", sizeof (GstTimedValue), 16},
+ {"GstTocSetterInterface", sizeof (GstTocSetterInterface), 16},
+ {"GstTypeFind", sizeof (GstTypeFind), 64},
+ {"GstURIHandlerInterface", sizeof (GstURIHandlerInterface), 48},
+ {"GstValueTable", sizeof (GstValueTable), 64},
{NULL, 0, 0}
};
static GstCheckABIStruct list[] = {
- {"GstAllocTrace", sizeof (GstAllocTrace), 24},
- {"GstBinClass", sizeof (GstBinClass), 568},
- {"GstBin", sizeof (GstBin), 336},
- {"GstBufferClass", sizeof (GstBufferClass), 32},
- {"GstBuffer", sizeof (GstBuffer), 120},
- {"GstBusClass", sizeof (GstBusClass), 288},
- {"GstBus", sizeof (GstBus), 152},
- {"GstCaps", sizeof (GstCaps), 56},
- {"GstChildProxyInterface", sizeof (GstChildProxyInterface), 80},
- {"GstClockClass", sizeof (GstClockClass), 320},
- {"GstClockEntry", sizeof (GstClockEntry), 80},
- {"GstClock", sizeof (GstClock), 240},
+ {"GstAllocationParams", sizeof (GstAllocationParams), 64},
+ {"GstAllocator", sizeof (GstAllocator), 176},
+ {"GstAllocatorClass", sizeof (GstAllocatorClass), 232},
+ {"GstBinClass", sizeof (GstBinClass), 576},
+ {"GstBin", sizeof (GstBin), 376},
+ {"GstBuffer", sizeof (GstBuffer), 112},
+ {"GstBufferPoolAcquireParams", sizeof (GstBufferPoolAcquireParams), 64},
+ {"GstBufferPool", sizeof (GstBufferPool), 136},
+ {"GstBufferPoolClass", sizeof (GstBufferPoolClass), 288},
+ {"GstBusClass", sizeof (GstBusClass), 232},
+ {"GstBus", sizeof (GstBus), 128},
+ {"GstCaps", sizeof (GstCaps), 64},
+ {"GstChildProxyInterface", sizeof (GstChildProxyInterface), 88},
+ {"GstClockClass", sizeof (GstClockClass), 264},
+ {"GstClockEntry", sizeof (GstClockEntry), 112},
+ {"GstClock", sizeof (GstClock), 128},
+ {"GstControlBinding", sizeof (GstControlBinding), 152},
+ {"GstControlBindingClass", sizeof (GstControlBindingClass), 248},
+ {"GstControlSource", sizeof (GstControlSource), 136},
+ {"GstControlSourceClass", sizeof (GstControlSourceClass), 216},
{"GstDebugCategory", sizeof (GstDebugCategory), 24},
{"GstElementClass", sizeof (GstElementClass), 488},
- {"GstElementDetails", sizeof (GstElementDetails), 64},
- {"GstElementFactoryClass", sizeof (GstElementFactoryClass), 304},
- {"GstElementFactory", sizeof (GstElementFactory), 280},
- {"GstElement", sizeof (GstElement), 232},
- {"GstEventClass", sizeof (GstEventClass), 64},
- {"GstEvent", sizeof (GstEvent), 64},
+ {"GstElement", sizeof (GstElement), 264},
+ {"GstEvent", sizeof (GstEvent), 88},
{"GstFormatDefinition", sizeof (GstFormatDefinition), 32},
- {"GstGhostPadClass", sizeof (GstGhostPadClass), 344},
- {"GstGhostPad", sizeof (GstGhostPad), 384},
- {"GstIndexAssociation", sizeof (GstIndexAssociation), 16},
- {"GstIndexClass", sizeof (GstIndexClass), 312},
- {"GstIndexEntry", sizeof (GstIndexEntry), 32},
- {"GstIndexFactoryClass", sizeof (GstIndexFactoryClass), 304},
- {"GstIndexFactory", sizeof (GstIndexFactory), 192},
- {"GstIndexGroup", sizeof (GstIndexGroup), 24},
- {"GstIndex", sizeof (GstIndex), 192},
- {"GstIterator", sizeof (GstIterator), 104},
- {"GstMessageClass", sizeof (GstMessageClass), 64},
- {"GstMessage", sizeof (GstMessage), 104},
- {"GstMiniObjectClass", sizeof (GstMiniObjectClass), 32},
- {"GstMiniObject", sizeof (GstMiniObject), 24},
- {"GstObjectClass", sizeof (GstObjectClass), 240},
- {"GstObject", sizeof (GstObject), 80},
- {"GstPadClass", sizeof (GstPadClass), 304},
- {"GstPad", sizeof (GstPad), 368},
- {"GstPadTemplateClass", sizeof (GstPadTemplateClass), 280},
- {"GstPadTemplate", sizeof (GstPadTemplate), 136},
- {"GstPadTemplate", sizeof (GstPadTemplate), 136},
+ {"GstGhostPadClass", sizeof (GstGhostPadClass), 272},
+ {"GstGhostPad", sizeof (GstGhostPad), 536},
+ {"GstIterator", sizeof (GstIterator), 120},
+ {"GstMemory", sizeof (GstMemory), 112},
+ {"GstMapInfo", sizeof (GstMapInfo), 104},
+ {"GstMessage", sizeof (GstMessage), 120},
+ {"GstMeta", sizeof (GstMeta), 16},
+ {"GstMetaTransformCopy", sizeof (GstMetaTransformCopy), 24},
+ {"GstMetaInfo", sizeof (GstMetaInfo), 80},
+ {"GstMiniObject", sizeof (GstMiniObject), 64},
+ {"GstObjectClass", sizeof (GstObjectClass), 184},
+ {"GstObject", sizeof (GstObject), 88},
+ {"GstPadClass", sizeof (GstPadClass), 232},
+ {"GstPad", sizeof (GstPad), 520},
+ {"GstPadProbeInfo", sizeof (GstPadProbeInfo), 72},
+ {"GstPadTemplateClass", sizeof (GstPadTemplateClass), 224},
+ {"GstPadTemplate", sizeof (GstPadTemplate), 144},
{"GstParamSpecFraction", sizeof (GstParamSpecFraction), 96},
- {"GstParamSpecMiniObject", sizeof (GstParamSpecMiniObject), 72},
- {"GstPipelineClass", sizeof (GstPipelineClass), 600},
- {"GstPipeline", sizeof (GstPipeline), 392},
- {"GstPluginClass", sizeof (GstPluginClass), 272},
- {"GstPluginDesc", sizeof (GstPluginDesc), 104},
- {"GstPluginFeatureClass", sizeof (GstPluginFeatureClass), 272},
- {"GstPluginFeature", sizeof (GstPluginFeature), 144},
- {"GstPlugin", sizeof (GstPlugin), 280},
+ {"GstPipelineClass", sizeof (GstPipelineClass), 608},
+ {"GstPipeline", sizeof (GstPipeline), 440},
+ {"GstPluginDesc", sizeof (GstPluginDesc), 112},
{"GstPresetInterface", sizeof (GstPresetInterface), 112},
- {"GstProxyPadClass", sizeof (GstProxyPadClass), 312},
- {"GstProxyPad", sizeof (GstProxyPad), 376},
- {"GstQueryClass", sizeof (GstQueryClass), 64},
- {"GstQuery", sizeof (GstQuery), 48},
- {"GstQueryTypeDefinition", sizeof (GstQueryTypeDefinition), 32},
- {"GstRegistryClass", sizeof (GstRegistryClass), 288},
- {"GstRegistry", sizeof (GstRegistry), 144},
- {"GstSegment", sizeof (GstSegment), 104},
- {"GstStaticCaps", sizeof (GstStaticCaps), 96},
- {"GstStaticPadTemplate", sizeof (GstStaticPadTemplate), 112},
- {"GstStructure", sizeof (GstStructure), 40},
- {"GstSystemClockClass", sizeof (GstSystemClockClass), 352},
- {"GstSystemClock", sizeof (GstSystemClock), 288},
- {"GstTagList", sizeof (GstTagList), 40},
+ {"GstProxyPadClass", sizeof (GstProxyPadClass), 240},
+ {"GstProxyPad", sizeof (GstProxyPad), 528},
+ {"GstQuery", sizeof (GstQuery), 72},
+ {"GstRegistryClass", sizeof (GstRegistryClass), 184},
+ {"GstRegistry", sizeof (GstRegistry), 96},
+ {"GstSegment", sizeof (GstSegment), 120},
+ {"GstStaticCaps", sizeof (GstStaticCaps), 48},
+ {"GstStaticPadTemplate", sizeof (GstStaticPadTemplate), 64},
+ {"GstStructure", sizeof (GstStructure), 16},
+ {"GstSystemClockClass", sizeof (GstSystemClockClass), 296},
+ {"GstSystemClock", sizeof (GstSystemClock), 168},
+ {"GstTagList", sizeof (GstTagList), 64,},
{"GstTagSetterInterface", sizeof (GstTagSetterInterface), 16},
- {"GstTaskClass", sizeof (GstTaskClass), 280},
- {"GstTask", sizeof (GstTask), 160},
- {"GstTaskPoolClass", sizeof (GstTaskPoolClass), 304},
- {"GstTaskPool", sizeof (GstTaskPool), 120},
- {"GstTaskThreadCallbacks", sizeof (GstTaskThreadCallbacks), 48},
- {"GstTraceEntry", sizeof (GstTraceEntry), 128},
- {"GstTrace", sizeof (GstTrace), 32},
- {"GstTypeFindFactoryClass", sizeof (GstTypeFindFactoryClass), 304},
- {"GstTypeFindFactory", sizeof (GstTypeFindFactory), 216},
+ {"GstTaskClass", sizeof (GstTaskClass), 224},
+ {"GstTask", sizeof (GstTask), 200},
+ {"GstTaskPoolClass", sizeof (GstTaskPoolClass), 248},
+ {"GstTaskPool", sizeof (GstTaskPool), 128},
+ {"GstTimedValue", sizeof (GstTimedValue), 16},
+ {"GstTocSetterInterface", sizeof (GstTocSetterInterface), 16},
{"GstTypeFind", sizeof (GstTypeFind), 64},
-#if !defined(GST_DISABLE_DEPRECATED) && !defined(GST_REMOVE_DEPRECATED)
- {"GstTypeNameData", sizeof (GstTypeNameData), 16},
-#endif
- {"GstURIHandlerInterface", sizeof (GstURIHandlerInterface), 88},
+ {"GstURIHandlerInterface", sizeof (GstURIHandlerInterface), 48},
{"GstValueTable", sizeof (GstValueTable), 64},
{NULL, 0, 0}
};
--- /dev/null
+/* GStreamer
+ * Copyright (C) 2012 Wim Taymans <wim.taymans@gmail.com>
+ *
+ * libsabi.c: Unit test for ABI compatibility
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <gst/check/gstcheck.h>
+
+#include <gst/base/gstadapter.h>
+#include <gst/base/gstbaseparse.h>
+#include <gst/base/gstbasesink.h>
+#include <gst/base/gstbasesrc.h>
+#include <gst/base/gstbasetransform.h>
+#include <gst/base/gstbitreader.h>
+#include <gst/base/gstbytereader.h>
+#include <gst/base/gstbytewriter.h>
+#include <gst/base/gstcollectpads.h>
+#include <gst/base/gstpushsrc.h>
+#include <gst/base/gsttypefindhelper.h>
+#include <gst/controller/gstinterpolationcontrolsource.h>
+#include <gst/controller/gstlfocontrolsource.h>
+#include <gst/controller/gsttriggercontrolsource.h>
+#include <gst/controller/gstargbcontrolbinding.h>
+#include <gst/controller/gstdirectcontrolbinding.h>
+#include <gst/controller/gsttimedvaluecontrolsource.h>
+#include <gst/net/gstnet.h>
+#include <gst/net/gstnetclientclock.h>
+#include <gst/net/gstnettimepacket.h>
+#include <gst/net/gstnettimeprovider.h>
+
+#ifdef HAVE_CPU_I386
+#include "struct_i386.h"
+#define HAVE_ABI_SIZES TRUE
+#else
+#ifdef __powerpc64__
+#include "struct_ppc64.h"
+#define HAVE_ABI_SIZES TRUE
+#else
+#ifdef __powerpc__
+#include "struct_ppc32.h"
+#define HAVE_ABI_SIZES TRUE
+#else
+#ifdef HAVE_CPU_X86_64
+#include "struct_x86_64.h"
+#define HAVE_ABI_SIZES TRUE
+#else
+#ifdef HAVE_CPU_HPPA
+#include "struct_hppa.h"
+#define HAVE_ABI_SIZES TRUE
+#else
+#ifdef HAVE_CPU_SPARC
+#include "struct_sparc.h"
+#define HAVE_ABI_SIZES TRUE
+#else
+#ifdef HAVE_CPU_ARM
+#include "struct_arm.h"
+#define HAVE_ABI_SIZES TRUE
+#else
+/* in case someone wants to generate a new arch */
+#include "struct_i386.h"
+#define HAVE_ABI_SIZES FALSE
+#endif
+#endif
+#endif
+#endif
+#endif
+#endif
+#endif
+
+GST_START_TEST (test_ABI)
+{
+ gst_check_abi_list (list, HAVE_ABI_SIZES);
+}
+
+GST_END_TEST;
+
+static Suite *
+libsabi_suite (void)
+{
+ Suite *s = suite_create ("LibsABI");
+ TCase *tc_chain = tcase_create ("size check");
+
+ tcase_set_timeout (tc_chain, 0);
+
+ suite_add_tcase (s, tc_chain);
+ tcase_add_test (tc_chain, test_ABI);
+ return s;
+}
+
+GST_CHECK_MAIN (libsabi);
GstCheckABIStruct list[] = {
- {"GstAdapter", sizeof (GstAdapter), 52},
- {"GstAdapterClass", sizeof (GstAdapterClass), 84},
- {"GstBaseSink", sizeof (GstBaseSink), 408},
- {"GstBaseSinkClass", sizeof (GstBaseSinkClass), 368},
- {"GstBaseSrc", sizeof (GstBaseSrc), 392},
- {"GstBaseSrcClass", sizeof (GstBaseSrcClass), 376},
- {"GstBaseTransform", sizeof (GstBaseTransform), 368},
- {"GstBaseTransformClass", sizeof (GstBaseTransformClass), 376},
- {"GstCollectData", sizeof (GstCollectData), 120},
- {"GstCollectPads", sizeof (GstCollectPads), 92},
- {"GstCollectPadsClass", sizeof (GstCollectPadsClass), 136},
- {"GstPushSrc", sizeof (GstPushSrc), 408},
- {"GstPushSrcClass", sizeof (GstPushSrcClass), 396},
- {"GstTimedValue", sizeof (GstTimedValue), 32},
- {"GstValueArray", sizeof (GstValueArray), 24},
- {"GstController", sizeof (GstController), 40},
- {"GstControllerClass", sizeof (GstControllerClass), 84},
- {"GstNetClientClock", sizeof (GstNetClientClock), 256},
- {"GstNetClientClockClass", sizeof (GstNetClientClockClass), 192},
+ {"GstBaseParseClass", sizeof (GstBaseParseClass), 728},
+ {"GstBaseParse", sizeof (GstBaseParse), 576},
+ {"GstBaseSinkClass", sizeof (GstBaseSinkClass), 792},
+ {"GstBaseSink", sizeof (GstBaseSink), 664},
+ {"GstBaseSrcClass", sizeof (GstBaseSrcClass), 800},
+ {"GstBaseSrc", sizeof (GstBaseSrc), 648},
+ {"GstBaseTransformClass", sizeof (GstBaseTransformClass), 816},
+ {"GstBaseTransform", sizeof (GstBaseTransform), 576},
+ {"GstBitReader", sizeof (GstBitReader), 56},
+ {"GstByteReader", sizeof (GstByteReader), 48},
+ {"GstByteWriter", sizeof (GstByteWriter), 96},
+ {"GstCollectData", sizeof (GstCollectData), 200},
+ {"GstCollectPadsClass", sizeof (GstCollectPadsClass), 216},
+ {"GstCollectPads", sizeof (GstCollectPads), 152},
+ {"GstARGBControlBindingClass", sizeof (GstARGBControlBindingClass), 280},
+ {"GstARGBControlBinding", sizeof (GstARGBControlBinding), 248},
+ {"GstDirectControlBindingClass", sizeof (GstDirectControlBindingClass), 280},
+ {"GstDirectControlBinding", sizeof (GstDirectControlBinding), 248},
+ {"GstInterpolationControlSourceClass", sizeof (GstInterpolationControlSourceClass), 280},
+ {"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 240},
+ {"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 248},
+ {"GstLFOControlSource", sizeof (GstLFOControlSource), 184},
+ {"GstControlPoint", sizeof (GstControlPoint), 32},
+ {"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 248},
+ {"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 200},
+ {"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 280},
+ {"GstTriggerControlSource", sizeof (GstTriggerControlSource), 240},
+ {"GstNetClientClockClass", sizeof (GstNetClientClockClass), 328},
+ {"GstNetClientClock", sizeof (GstNetClientClock), 208},
{"GstNetTimePacket", sizeof (GstNetTimePacket), 16},
- {"GstNetTimeProvider", sizeof (GstNetTimeProvider), 84},
- {"GstNetTimeProviderClass", sizeof (GstNetTimeProviderClass), 120},
+ {"GstNetTimeProviderClass", sizeof (GstNetTimeProviderClass), 216},
+ {"GstNetTimeProvider", sizeof (GstNetTimeProvider), 128},
+ {"GstPushSrcClass", sizeof (GstPushSrcClass), 856},
+ {"GstPushSrc", sizeof (GstPushSrc), 680},
+ {"GstTimedValue", sizeof (GstTimedValue), 16},
{NULL, 0, 0}
};
-static GstCheckABIStruct list[] = {
- {"GstAdapter", sizeof (GstAdapter), 52},
- {"GstAdapterClass", sizeof (GstAdapterClass), 84},
- {"GstBaseSink", sizeof (GstBaseSink), 408},
- {"GstBaseSinkClass", sizeof (GstBaseSinkClass), 368},
- {"GstBaseSrc", sizeof (GstBaseSrc), 392},
- {"GstBaseSrcClass", sizeof (GstBaseSrcClass), 376},
- {"GstBaseTransform", sizeof (GstBaseTransform), 368},
- {"GstBaseTransformClass", sizeof (GstBaseTransformClass), 376},
- {"GstCollectData", sizeof (GstCollectData), 120},
- {"GstCollectPads", sizeof (GstCollectPads), 92},
- {"GstCollectPadsClass", sizeof (GstCollectPadsClass), 136},
- {"GstPushSrc", sizeof (GstPushSrc), 408},
- {"GstPushSrcClass", sizeof (GstPushSrcClass), 396},
- {"GstTimedValue", sizeof (GstTimedValue), 32},
- {"GstValueArray", sizeof (GstValueArray), 24},
- {"GstController", sizeof (GstController), 40},
- {"GstControllerClass", sizeof (GstControllerClass), 84},
-
- {"GstNetClientClock", sizeof (GstNetClientClock), 256},
- {"GstNetClientClockClass", sizeof (GstNetClientClockClass), 192},
+GstCheckABIStruct list[] = {
+ {"GstBaseParseClass", sizeof (GstBaseParseClass), 728},
+ {"GstBaseParse", sizeof (GstBaseParse), 576},
+ {"GstBaseSinkClass", sizeof (GstBaseSinkClass), 792},
+ {"GstBaseSink", sizeof (GstBaseSink), 664},
+ {"GstBaseSrcClass", sizeof (GstBaseSrcClass), 800},
+ {"GstBaseSrc", sizeof (GstBaseSrc), 648},
+ {"GstBaseTransformClass", sizeof (GstBaseTransformClass), 816},
+ {"GstBaseTransform", sizeof (GstBaseTransform), 576},
+ {"GstBitReader", sizeof (GstBitReader), 56},
+ {"GstByteReader", sizeof (GstByteReader), 48},
+ {"GstByteWriter", sizeof (GstByteWriter), 96},
+ {"GstCollectData", sizeof (GstCollectData), 200},
+ {"GstCollectPadsClass", sizeof (GstCollectPadsClass), 216},
+ {"GstCollectPads", sizeof (GstCollectPads), 152},
+ {"GstARGBControlBindingClass", sizeof (GstARGBControlBindingClass), 280},
+ {"GstARGBControlBinding", sizeof (GstARGBControlBinding), 248},
+ {"GstDirectControlBindingClass", sizeof (GstDirectControlBindingClass), 280},
+ {"GstDirectControlBinding", sizeof (GstDirectControlBinding), 248},
+ {"GstInterpolationControlSourceClass", sizeof (GstInterpolationControlSourceClass), 280},
+ {"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 240},
+ {"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 248},
+ {"GstLFOControlSource", sizeof (GstLFOControlSource), 184},
+ {"GstControlPoint", sizeof (GstControlPoint), 32},
+ {"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 248},
+ {"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 200},
+ {"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 280},
+ {"GstTriggerControlSource", sizeof (GstTriggerControlSource), 240},
+ {"GstNetClientClockClass", sizeof (GstNetClientClockClass), 328},
+ {"GstNetClientClock", sizeof (GstNetClientClock), 208},
{"GstNetTimePacket", sizeof (GstNetTimePacket), 16},
- {"GstNetTimeProvider", sizeof (GstNetTimeProvider), 84},
- {"GstNetTimeProviderClass", sizeof (GstNetTimeProviderClass), 120},
+ {"GstNetTimeProviderClass", sizeof (GstNetTimeProviderClass), 216},
+ {"GstNetTimeProvider", sizeof (GstNetTimeProvider), 128},
+ {"GstPushSrcClass", sizeof (GstPushSrcClass), 856},
+ {"GstPushSrc", sizeof (GstPushSrc), 680},
+ {"GstTimedValue", sizeof (GstTimedValue), 16},
{NULL, 0, 0}
};
-static GstCheckABIStruct list[] = {
- {"GstAdapter", sizeof(GstAdapter), 52},
- {"GstAdapterClass", sizeof(GstAdapterClass), 84},
- {"GstBaseSink", sizeof(GstBaseSink), 384},
- {"GstBaseSinkClass", sizeof(GstBaseSinkClass), 368},
- {"GstBaseSrc", sizeof(GstBaseSrc), 376},
- {"GstBaseSrcClass", sizeof(GstBaseSrcClass), 376},
- {"GstBaseTransform", sizeof(GstBaseTransform), 352},
- {"GstBaseTransformClass", sizeof(GstBaseTransformClass), 376},
- {"GstCollectData", sizeof(GstCollectData), 120},
- {"GstCollectPads", sizeof(GstCollectPads), 92},
- {"GstCollectPadsClass", sizeof(GstCollectPadsClass), 136},
- {"GstPushSrc", sizeof(GstPushSrc), 392},
- {"GstPushSrcClass", sizeof(GstPushSrcClass), 396},
- {"GstTimedValue", sizeof(GstTimedValue), 28},
- {"GstValueArray", sizeof(GstValueArray), 20},
- {"GstController", sizeof(GstController), 40},
- {"GstControllerClass", sizeof(GstControllerClass), 84},
-
- {"GstNetClientClock", sizeof(GstNetClientClock), 248},
- {"GstNetClientClockClass", sizeof(GstNetClientClockClass), 192},
- {"GstNetTimePacket", sizeof(GstNetTimePacket), 16},
- {"GstNetTimeProvider", sizeof(GstNetTimeProvider), 84},
- {"GstNetTimeProviderClass", sizeof(GstNetTimeProviderClass), 120},
-
- {NULL, 0, 0}
+GstCheckABIStruct list[] = {
+ {"GstBaseParseClass", sizeof (GstBaseParseClass), 368},
+ {"GstBaseParse", sizeof (GstBaseParse), 364},
+ {"GstBaseSinkClass", sizeof (GstBaseSinkClass), 400},
+ {"GstBaseSink", sizeof (GstBaseSink), 440},
+ {"GstBaseSrcClass", sizeof (GstBaseSrcClass), 404},
+ {"GstBaseSrc", sizeof (GstBaseSrc), 424},
+ {"GstBaseTransformClass", sizeof (GstBaseTransformClass), 416},
+ {"GstBaseTransform", sizeof (GstBaseTransform), 364},
+ {"GstBitReader", sizeof (GstBitReader), 32},
+ {"GstByteReader", sizeof (GstByteReader), 28},
+ {"GstByteWriter", sizeof (GstByteWriter), 56},
+ {"GstCollectData", sizeof (GstCollectData), 136},
+ {"GstCollectPadsClass", sizeof (GstCollectPadsClass), 108},
+ {"GstCollectPads", sizeof (GstCollectPads), 92},
+ {"GstARGBControlBindingClass", sizeof (GstARGBControlBindingClass), 140},
+ {"GstARGBControlBinding", sizeof (GstARGBControlBinding), 144},
+ {"GstDirectControlBindingClass", sizeof (GstDirectControlBindingClass), 140},
+ {"GstDirectControlBinding", sizeof (GstDirectControlBinding), 148},
+ {"GstInterpolationControlSourceClass", sizeof (GstInterpolationControlSourceClass), 140},
+ {"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 140},
+ {"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 124},
+ {"GstLFOControlSource", sizeof (GstLFOControlSource), 108},
+ {"GstControlPoint", sizeof (GstControlPoint), 32},
+ {"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 124},
+ {"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 120},
+ {"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 140},
+ {"GstTriggerControlSource", sizeof (GstTriggerControlSource), 140},
+ {"GstNetClientClockClass", sizeof (GstNetClientClockClass), 164},
+ {"GstNetClientClock", sizeof (GstNetClientClock), 116},
+ {"GstNetTimePacket", sizeof (GstNetTimePacket), 16},
+ {"GstNetTimeProviderClass", sizeof (GstNetTimeProviderClass), 108},
+ {"GstNetTimeProvider", sizeof (GstNetTimeProvider), 76},
+ {"GstPushSrcClass", sizeof (GstPushSrcClass), 432},
+ {"GstPushSrc", sizeof (GstPushSrc), 440},
+ {"GstTimedValue", sizeof (GstTimedValue), 16},
+ {NULL, 0, 0}
};
-static GstCheckABIStruct list[] = {
- {"GstAdapter", sizeof (GstAdapter), 52},
- {"GstAdapterClass", sizeof (GstAdapterClass), 84},
- {"GstBaseSink", sizeof (GstBaseSink), 408},
- {"GstBaseSinkClass", sizeof (GstBaseSinkClass), 368},
- {"GstBaseSrc", sizeof (GstBaseSrc), 392},
- {"GstBaseSrcClass", sizeof (GstBaseSrcClass), 376},
- {"GstBaseTransform", sizeof (GstBaseTransform), 368},
- {"GstBaseTransformClass", sizeof (GstBaseTransformClass), 376},
- {"GstCollectData", sizeof (GstCollectData), 120},
- {"GstCollectPads", sizeof (GstCollectPads), 92},
- {"GstCollectPadsClass", sizeof (GstCollectPadsClass), 136},
- {"GstPushSrc", sizeof (GstPushSrc), 408},
- {"GstPushSrcClass", sizeof (GstPushSrcClass), 396},
- {"GstTimedValue", sizeof (GstTimedValue), 32},
- {"GstValueArray", sizeof (GstValueArray), 24},
- {"GstController", sizeof (GstController), 40},
- {"GstControllerClass", sizeof (GstControllerClass), 84},
- {"GstNetClientClock", sizeof (GstNetClientClock), 256},
- {"GstNetClientClockClass", sizeof (GstNetClientClockClass), 192},
+
+GstCheckABIStruct list[] = {
+ {"GstBaseParseClass", sizeof (GstBaseParseClass), 368},
+ {"GstBaseParse", sizeof (GstBaseParse), 392},
+ {"GstBaseSinkClass", sizeof (GstBaseSinkClass), 400},
+ {"GstBaseSink", sizeof (GstBaseSink), 464},
+ {"GstBaseSrcClass", sizeof (GstBaseSrcClass), 404},
+ {"GstBaseSrc", sizeof (GstBaseSrc), 448},
+ {"GstBaseTransformClass", sizeof (GstBaseTransformClass), 416},
+ {"GstBaseTransform", sizeof (GstBaseTransform), 392},
+ {"GstBitReader", sizeof (GstBitReader), 32},
+ {"GstByteReader", sizeof (GstByteReader), 28},
+ {"GstByteWriter", sizeof (GstByteWriter), 56},
+ {"GstCollectData", sizeof (GstCollectData), 144},
+ {"GstCollectPadsClass", sizeof (GstCollectPadsClass), 108},
+ {"GstCollectPads", sizeof (GstCollectPads), 104},
+ {"GstARGBControlBindingClass", sizeof (GstARGBControlBindingClass), 140},
+ {"GstARGBControlBinding", sizeof (GstARGBControlBinding), 160},
+ {"GstDirectControlBindingClass", sizeof (GstDirectControlBindingClass), 140},
+ {"GstDirectControlBinding", sizeof (GstDirectControlBinding), 168},
+ {"GstInterpolationControlSourceClass", sizeof (GstInterpolationControlSourceClass), 140},
+ {"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 152},
+ {"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 124},
+ {"GstLFOControlSource", sizeof (GstLFOControlSource), 120},
+ {"GstControlPoint", sizeof (GstControlPoint), 32},
+ {"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 124},
+ {"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 128},
+ {"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 140},
+ {"GstTriggerControlSource", sizeof (GstTriggerControlSource), 152},
+ {"GstNetClientClockClass", sizeof (GstNetClientClockClass), 164},
+ {"GstNetClientClock", sizeof (GstNetClientClock), 136},
{"GstNetTimePacket", sizeof (GstNetTimePacket), 16},
- {"GstNetTimeProvider", sizeof (GstNetTimeProvider), 84},
- {"GstNetTimeProviderClass", sizeof (GstNetTimeProviderClass), 120},
+ {"GstNetTimeProviderClass", sizeof (GstNetTimeProviderClass), 108},
+ {"GstNetTimeProvider", sizeof (GstNetTimeProvider), 88},
+ {"GstPushSrcClass", sizeof (GstPushSrcClass), 432},
+ {"GstPushSrc", sizeof (GstPushSrc), 464},
+ {"GstTimedValue", sizeof (GstTimedValue), 16},
{NULL, 0, 0}
};
-static GstCheckABIStruct list[] = {
- {"GstAdapter", sizeof (GstAdapter), 88}
- ,
- {"GstAdapterClass", sizeof (GstAdapterClass), 168}
- ,
- {"GstBaseSink", sizeof (GstBaseSink), 600}
- ,
- {"GstBaseSinkClass", sizeof (GstBaseSinkClass), 728}
- ,
- {"GstBaseSrc", sizeof (GstBaseSrc), 600}
- ,
- {"GstBaseSrcClass", sizeof (GstBaseSrcClass), 744}
- ,
- {"GstBaseTransform", sizeof (GstBaseTransform), 576}
- ,
- {"GstBaseTransformClass", sizeof (GstBaseTransformClass), 744}
- ,
- {"GstCollectData", sizeof (GstCollectData), 168}
- ,
- {"GstCollectPads", sizeof (GstCollectPads), 168}
- ,
- {"GstCollectPadsClass", sizeof (GstCollectPadsClass), 272}
- ,
- {"GstPushSrc", sizeof (GstPushSrc), 632}
- ,
- {"GstPushSrcClass", sizeof (GstPushSrcClass), 784}
- ,
- {"GstTimedValue", sizeof (GstTimedValue), 32}
- ,
- {"GstValueArray", sizeof (GstValueArray), 32}
- ,
- {"GstController", sizeof (GstController), 80}
- ,
- {"GstControllerClass", sizeof (GstControllerClass), 168}
- ,
- {"GstNetClientClock", sizeof (GstNetClientClock), 368}
- ,
- {"GstNetClientClockClass", sizeof (GstNetClientClockClass), 384}
- ,
- {"GstNetTimePacket", sizeof (GstNetTimePacket), 16}
- ,
- {"GstNetTimeProvider", sizeof (GstNetTimeProvider), 152}
- ,
- {"GstNetTimeProviderClass", sizeof (GstNetTimeProviderClass), 240}
- ,
+
+GstCheckABIStruct list[] = {
+ {"GstBaseParseClass", sizeof (GstBaseParseClass), 728},
+ {"GstBaseParse", sizeof (GstBaseParse), 576},
+ {"GstBaseSinkClass", sizeof (GstBaseSinkClass), 792},
+ {"GstBaseSink", sizeof (GstBaseSink), 664},
+ {"GstBaseSrcClass", sizeof (GstBaseSrcClass), 800},
+ {"GstBaseSrc", sizeof (GstBaseSrc), 648},
+ {"GstBaseTransformClass", sizeof (GstBaseTransformClass), 816},
+ {"GstBaseTransform", sizeof (GstBaseTransform), 576},
+ {"GstBitReader", sizeof (GstBitReader), 56},
+ {"GstByteReader", sizeof (GstByteReader), 48},
+ {"GstByteWriter", sizeof (GstByteWriter), 96},
+ {"GstCollectData", sizeof (GstCollectData), 200},
+ {"GstCollectPadsClass", sizeof (GstCollectPadsClass), 216},
+ {"GstCollectPads", sizeof (GstCollectPads), 152},
+ {"GstARGBControlBindingClass", sizeof (GstARGBControlBindingClass), 280},
+ {"GstARGBControlBinding", sizeof (GstARGBControlBinding), 248},
+ {"GstDirectControlBindingClass", sizeof (GstDirectControlBindingClass), 280},
+ {"GstDirectControlBinding", sizeof (GstDirectControlBinding), 248},
+ {"GstInterpolationControlSourceClass", sizeof (GstInterpolationControlSourceClass), 280},
+ {"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 240},
+ {"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 248},
+ {"GstLFOControlSource", sizeof (GstLFOControlSource), 184},
+ {"GstControlPoint", sizeof (GstControlPoint), 32},
+ {"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 248},
+ {"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 200},
+ {"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 280},
+ {"GstTriggerControlSource", sizeof (GstTriggerControlSource), 240},
+ {"GstNetClientClockClass", sizeof (GstNetClientClockClass), 328},
+ {"GstNetClientClock", sizeof (GstNetClientClock), 208},
+ {"GstNetTimePacket", sizeof (GstNetTimePacket), 16},
+ {"GstNetTimeProviderClass", sizeof (GstNetTimeProviderClass), 216},
+ {"GstNetTimeProvider", sizeof (GstNetTimeProvider), 128},
+ {"GstPushSrcClass", sizeof (GstPushSrcClass), 856},
+ {"GstPushSrc", sizeof (GstPushSrc), 680},
+ {"GstTimedValue", sizeof (GstTimedValue), 16},
{NULL, 0, 0}
};
GstCheckABIStruct list[] = {
- {"GstAdapter", sizeof (GstAdapter), 52},
- {"GstAdapterClass", sizeof (GstAdapterClass), 84},
- {"GstBaseSink", sizeof (GstBaseSink), 408},
- {"GstBaseSinkClass", sizeof (GstBaseSinkClass), 368},
- {"GstBaseSrc", sizeof (GstBaseSrc), 392},
- {"GstBaseSrcClass", sizeof (GstBaseSrcClass), 376},
- {"GstBaseTransform", sizeof (GstBaseTransform), 368},
- {"GstBaseTransformClass", sizeof (GstBaseTransformClass), 376},
- {"GstCollectData", sizeof (GstCollectData), 120},
- {"GstCollectPads", sizeof (GstCollectPads), 92},
- {"GstCollectPadsClass", sizeof (GstCollectPadsClass), 136},
- {"GstPushSrc", sizeof (GstPushSrc), 408},
- {"GstPushSrcClass", sizeof (GstPushSrcClass), 396},
- {"GstTimedValue", sizeof (GstTimedValue), 32},
- {"GstValueArray", sizeof (GstValueArray), 24},
- {"GstController", sizeof (GstController), 40},
- {"GstControllerClass", sizeof (GstControllerClass), 84},
- {"GstNetClientClock", sizeof (GstNetClientClock), 256},
- {"GstNetClientClockClass", sizeof (GstNetClientClockClass), 192},
+ {"GstBaseParseClass", sizeof (GstBaseParseClass), 728},
+ {"GstBaseParse", sizeof (GstBaseParse), 576},
+ {"GstBaseSinkClass", sizeof (GstBaseSinkClass), 792},
+ {"GstBaseSink", sizeof (GstBaseSink), 664},
+ {"GstBaseSrcClass", sizeof (GstBaseSrcClass), 800},
+ {"GstBaseSrc", sizeof (GstBaseSrc), 648},
+ {"GstBaseTransformClass", sizeof (GstBaseTransformClass), 816},
+ {"GstBaseTransform", sizeof (GstBaseTransform), 576},
+ {"GstBitReader", sizeof (GstBitReader), 56},
+ {"GstByteReader", sizeof (GstByteReader), 48},
+ {"GstByteWriter", sizeof (GstByteWriter), 96},
+ {"GstCollectData", sizeof (GstCollectData), 200},
+ {"GstCollectPadsClass", sizeof (GstCollectPadsClass), 216},
+ {"GstCollectPads", sizeof (GstCollectPads), 152},
+ {"GstARGBControlBindingClass", sizeof (GstARGBControlBindingClass), 280},
+ {"GstARGBControlBinding", sizeof (GstARGBControlBinding), 248},
+ {"GstDirectControlBindingClass", sizeof (GstDirectControlBindingClass), 280},
+ {"GstDirectControlBinding", sizeof (GstDirectControlBinding), 248},
+ {"GstInterpolationControlSourceClass", sizeof (GstInterpolationControlSourceClass), 280},
+ {"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 240},
+ {"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 248},
+ {"GstLFOControlSource", sizeof (GstLFOControlSource), 184},
+ {"GstControlPoint", sizeof (GstControlPoint), 32},
+ {"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 248},
+ {"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 200},
+ {"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 280},
+ {"GstTriggerControlSource", sizeof (GstTriggerControlSource), 240},
+ {"GstNetClientClockClass", sizeof (GstNetClientClockClass), 328},
+ {"GstNetClientClock", sizeof (GstNetClientClock), 208},
{"GstNetTimePacket", sizeof (GstNetTimePacket), 16},
- {"GstNetTimeProvider", sizeof (GstNetTimeProvider), 84},
- {"GstNetTimeProviderClass", sizeof (GstNetTimeProviderClass), 120},
+ {"GstNetTimeProviderClass", sizeof (GstNetTimeProviderClass), 216},
+ {"GstNetTimeProvider", sizeof (GstNetTimeProvider), 128},
+ {"GstPushSrcClass", sizeof (GstPushSrcClass), 856},
+ {"GstPushSrc", sizeof (GstPushSrc), 680},
+ {"GstTimedValue", sizeof (GstTimedValue), 16},
{NULL, 0, 0}
};
GstCheckABIStruct list[] = {
- {"GstAdapterClass", sizeof (GstAdapterClass), 168},
- {"GstAdapter", sizeof (GstAdapter), 88},
- {"GstBaseSinkClass", sizeof (GstBaseSinkClass), 728},
- {"GstBaseSink", sizeof (GstBaseSink), 600},
- {"GstBaseSrcClass", sizeof (GstBaseSrcClass), 744},
- {"GstBaseSrc", sizeof (GstBaseSrc), 600},
- {"GstBaseTransformClass", sizeof (GstBaseTransformClass), 744},
+ {"GstBaseParseClass", sizeof (GstBaseParseClass), 728},
+ {"GstBaseParse", sizeof (GstBaseParse), 576},
+ {"GstBaseSinkClass", sizeof (GstBaseSinkClass), 792},
+ {"GstBaseSink", sizeof (GstBaseSink), 664},
+ {"GstBaseSrcClass", sizeof (GstBaseSrcClass), 800},
+ {"GstBaseSrc", sizeof (GstBaseSrc), 648},
+ {"GstBaseTransformClass", sizeof (GstBaseTransformClass), 816},
{"GstBaseTransform", sizeof (GstBaseTransform), 576},
- {"GstBitReader", sizeof (GstBitReader), 24},
- {"GstByteReader", sizeof (GstByteReader), 16},
- {"GstByteWriter", sizeof (GstByteWriter), 32},
- {"GstCollectData", sizeof (GstCollectData), 168},
- {"GstCollectPadsClass", sizeof (GstCollectPadsClass), 272},
- {"GstCollectPads", sizeof (GstCollectPads), 168},
- {"GstControllerClass", sizeof (GstControllerClass), 168},
- {"GstController", sizeof (GstController), 80},
- {"GstControlSourceClass", sizeof (GstControlSourceClass), 176},
- {"GstControlSource", sizeof (GstControlSource), 80},
- {"GstDataQueueClass", sizeof (GstDataQueueClass), 184},
- {"GstDataQueueItem", sizeof (GstDataQueueItem), 40},
- {"GstDataQueue", sizeof (GstDataQueue), 128},
- {"GstDataQueueSize", sizeof (GstDataQueueSize), 16},
- {"GstDPPacketizer", sizeof (GstDPPacketizer), 64},
- {"GstInterpolationControlSourceClass", sizeof (GstInterpolationControlSourceClass), 208},
- {"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 128},
- {"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 208},
- {"GstLFOControlSource", sizeof (GstLFOControlSource), 128},
- {"GstNetClientClockClass", sizeof (GstNetClientClockClass), 384},
- {"GstNetClientClock", sizeof (GstNetClientClock), 368},
+ {"GstBitReader", sizeof (GstBitReader), 56},
+ {"GstByteReader", sizeof (GstByteReader), 48},
+ {"GstByteWriter", sizeof (GstByteWriter), 96},
+ {"GstCollectData", sizeof (GstCollectData), 200},
+ {"GstCollectPadsClass", sizeof (GstCollectPadsClass), 216},
+ {"GstCollectPads", sizeof (GstCollectPads), 152},
+ {"GstARGBControlBindingClass", sizeof (GstARGBControlBindingClass), 280},
+ {"GstARGBControlBinding", sizeof (GstARGBControlBinding), 248},
+ {"GstDirectControlBindingClass", sizeof (GstDirectControlBindingClass), 280},
+ {"GstDirectControlBinding", sizeof (GstDirectControlBinding), 248},
+ {"GstInterpolationControlSourceClass", sizeof (GstInterpolationControlSourceClass), 280},
+ {"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 240},
+ {"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 248},
+ {"GstLFOControlSource", sizeof (GstLFOControlSource), 184},
+ {"GstControlPoint", sizeof (GstControlPoint), 32},
+ {"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 248},
+ {"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 200},
+ {"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 280},
+ {"GstTriggerControlSource", sizeof (GstTriggerControlSource), 240},
+ {"GstNetClientClockClass", sizeof (GstNetClientClockClass), 328},
+ {"GstNetClientClock", sizeof (GstNetClientClock), 208},
{"GstNetTimePacket", sizeof (GstNetTimePacket), 16},
- {"GstNetTimeProviderClass", sizeof (GstNetTimeProviderClass), 240},
- {"GstNetTimeProvider", sizeof (GstNetTimeProvider), 152},
- {"GstPushSrcClass", sizeof (GstPushSrcClass), 784},
- {"GstPushSrc", sizeof (GstPushSrc), 632},
- {"GstTimedValue", sizeof (GstTimedValue), 32},
- {"GstValueArray", sizeof (GstValueArray), 32},
+ {"GstNetTimeProviderClass", sizeof (GstNetTimeProviderClass), 216},
+ {"GstNetTimeProvider", sizeof (GstNetTimeProvider), 128},
+ {"GstPushSrcClass", sizeof (GstPushSrcClass), 856},
+ {"GstPushSrc", sizeof (GstPushSrc), 680},
+ {"GstTimedValue", sizeof (GstTimedValue), 16},
{NULL, 0, 0}
};
$(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 \
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@
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@
$(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 \
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@
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@
$(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 \
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@
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@
$(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 \
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@
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@
$(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 \
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@
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@
EXTRA_DIST = extract.pl
EXAMPLES = \
- dynamic \
$(GNOME) \
elementcreate \
elementmake \
init \
query \
typefind \
- fakesrc \
+ blockprobe \
+ probe \
+ appsrc \
+ appsink \
+ dynformat \
+ effectswitch \
+ testrtpool \
+ norebuffer \
playbin \
- decodebin
+ decodebin \
+ playsink
BUILT_SOURCES = \
elementmake.c elementcreate.c elementget.c elementlink.c elementfactory.c \
helloworld.c \
init.c \
query.c \
- typefind.c dynamic.c \
- fakesrc.c \
- playbin.c decodebin.c
+ typefind.c \
+ blockprobe.c \
+ probe.c \
+ appsrc.c \
+ appsink.c \
+ dynformat.c \
+ effectswitch.c \
+ testrtpool.c \
+ norebuffer.c \
+ playbin.c decodebin.c \
+ playsink.c
CLEANFILES = core core.* test-registry.* *.gcno *.gcda $(BUILT_SOURCES)
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 $@ $<
-fakesrc.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
+blockprobe.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
$(PERL_PATH) $(srcdir)/extract.pl $@ $<
-playbin.c decodebin.c: $(top_srcdir)/docs/manual/highlevel-components.xml
+probe.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+appsrc.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+appsink.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+dynformat.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+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 \
ghostpad init
noinst_PROGRAMS = $(EXAMPLES)
+
+testrtpool_LDADD = $(GST_OBJ_LIBS) $(PTHREAD_LIBS)
+testrtpool_CFLAGS = $(GST_OBJ_CFLAGS) $(PTHREAD_CFLAGS)
$(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 \
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) \
- fakesrc$(EXEEXT) playbin$(EXEEXT) decodebin$(EXEEXT)
+ blockprobe$(EXEEXT) probe$(EXEEXT) appsrc$(EXEEXT) \
+ appsink$(EXEEXT) dynformat$(EXEEXT) effectswitch$(EXEEXT) \
+ testrtpool$(EXEEXT) norebuffer$(EXEEXT) playbin$(EXEEXT) \
+ decodebin$(EXEEXT) playsink$(EXEEXT)
PROGRAMS = $(noinst_PROGRAMS)
-bin_SOURCES = bin.c
-bin_OBJECTS = bin.$(OBJEXT)
-bin_LDADD = $(LDADD)
+appsink_SOURCES = appsink.c
+appsink_OBJECTS = appsink.$(OBJEXT)
+appsink_LDADD = $(LDADD)
am__DEPENDENCIES_1 =
-bin_DEPENDENCIES = \
+appsink_DEPENDENCIES = \
$(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
$(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
+appsrc_SOURCES = appsrc.c
+appsrc_OBJECTS = appsrc.$(OBJEXT)
+appsrc_LDADD = $(LDADD)
+appsrc_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
+ $(am__DEPENDENCIES_1)
+bin_SOURCES = bin.c
+bin_OBJECTS = bin.$(OBJEXT)
+bin_LDADD = $(LDADD)
+bin_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
+ $(am__DEPENDENCIES_1)
+blockprobe_SOURCES = blockprobe.c
+blockprobe_OBJECTS = blockprobe.$(OBJEXT)
+blockprobe_LDADD = $(LDADD)
+blockprobe_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
+ $(am__DEPENDENCIES_1)
decodebin_SOURCES = decodebin.c
decodebin_OBJECTS = decodebin.$(OBJEXT)
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 = \
+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
elementmake_DEPENDENCIES = \
$(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
$(am__DEPENDENCIES_1)
-fakesrc_SOURCES = fakesrc.c
-fakesrc_OBJECTS = fakesrc.$(OBJEXT)
-fakesrc_LDADD = $(LDADD)
-fakesrc_DEPENDENCIES = \
- $(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
- $(am__DEPENDENCIES_1)
ghostpad_SOURCES = ghostpad.c
ghostpad_OBJECTS = ghostpad.$(OBJEXT)
ghostpad_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)
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)
+probe_DEPENDENCIES = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_API_VERSION@.la \
+ $(am__DEPENDENCIES_1)
query_SOURCES = query.c
query_OBJECTS = query.$(OBJEXT)
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)
AM_V_GEN = $(am__v_GEN_@AM_V@)
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
am__v_GEN_0 = @echo " GEN " $@;
-SOURCES = bin.c decodebin.c dynamic.c elementcreate.c elementfactory.c \
- elementget.c elementlink.c elementmake.c fakesrc.c ghostpad.c \
- helloworld.c init.c pad.c playbin.c query.c typefind.c
-DIST_SOURCES = bin.c decodebin.c dynamic.c elementcreate.c \
- elementfactory.c elementget.c elementlink.c elementmake.c \
- fakesrc.c ghostpad.c helloworld.c init.c pad.c playbin.c \
- query.c typefind.c
+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 \
+ 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
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
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@
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@
EXTRA_DIST = extract.pl
EXAMPLES = \
- dynamic \
$(GNOME) \
elementcreate \
elementmake \
init \
query \
typefind \
- fakesrc \
+ blockprobe \
+ probe \
+ appsrc \
+ appsink \
+ dynformat \
+ effectswitch \
+ testrtpool \
+ norebuffer \
playbin \
- decodebin
+ decodebin \
+ playsink
BUILT_SOURCES = \
elementmake.c elementcreate.c elementget.c elementlink.c elementfactory.c \
helloworld.c \
init.c \
query.c \
- typefind.c dynamic.c \
- fakesrc.c \
- playbin.c decodebin.c
+ typefind.c \
+ blockprobe.c \
+ probe.c \
+ appsrc.c \
+ appsink.c \
+ dynformat.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
list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
echo " rm -f" $$list; \
rm -f $$list
+appsink$(EXEEXT): $(appsink_OBJECTS) $(appsink_DEPENDENCIES) $(EXTRA_appsink_DEPENDENCIES)
+ @rm -f appsink$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(appsink_OBJECTS) $(appsink_LDADD) $(LIBS)
+appsrc$(EXEEXT): $(appsrc_OBJECTS) $(appsrc_DEPENDENCIES) $(EXTRA_appsrc_DEPENDENCIES)
+ @rm -f appsrc$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(appsrc_OBJECTS) $(appsrc_LDADD) $(LIBS)
bin$(EXEEXT): $(bin_OBJECTS) $(bin_DEPENDENCIES) $(EXTRA_bin_DEPENDENCIES)
@rm -f bin$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(bin_OBJECTS) $(bin_LDADD) $(LIBS)
+blockprobe$(EXEEXT): $(blockprobe_OBJECTS) $(blockprobe_DEPENDENCIES) $(EXTRA_blockprobe_DEPENDENCIES)
+ @rm -f blockprobe$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(blockprobe_OBJECTS) $(blockprobe_LDADD) $(LIBS)
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)
elementmake$(EXEEXT): $(elementmake_OBJECTS) $(elementmake_DEPENDENCIES) $(EXTRA_elementmake_DEPENDENCIES)
@rm -f elementmake$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(elementmake_OBJECTS) $(elementmake_LDADD) $(LIBS)
-fakesrc$(EXEEXT): $(fakesrc_OBJECTS) $(fakesrc_DEPENDENCIES) $(EXTRA_fakesrc_DEPENDENCIES)
- @rm -f fakesrc$(EXEEXT)
- $(AM_V_CCLD)$(LINK) $(fakesrc_OBJECTS) $(fakesrc_LDADD) $(LIBS)
ghostpad$(EXEEXT): $(ghostpad_OBJECTS) $(ghostpad_DEPENDENCIES) $(EXTRA_ghostpad_DEPENDENCIES)
@rm -f ghostpad$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(ghostpad_OBJECTS) $(ghostpad_LDADD) $(LIBS)
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)
distclean-compile:
-rm -f *.tab.c
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/appsink.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/appsrc.Po@am__quote@
@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@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elementlink.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elementmake.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fakesrc.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ghostpad.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helloworld.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/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:
@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
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
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+probe.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+appsrc.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+appsink.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+dynformat.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
+ $(PERL_PATH) $(srcdir)/extract.pl $@ $<
+
+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 $@ $<
-fakesrc.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
+playbin.c decodebin.c playsink.c: $(top_srcdir)/docs/manual/highlevel-playback.xml
$(PERL_PATH) $(srcdir)/extract.pl $@ $<
-playbin.c decodebin.c: $(top_srcdir)/docs/manual/highlevel-components.xml
+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.
--- /dev/null
+
+/*** block from ../../../docs/manual/advanced-dataaccess.xml ***/
+#include <gst/gst.h>
+#ifdef HAVE_GTK
+#include <gtk/gtk.h>
+#endif
+
+#include <stdlib.h>
+
+#define CAPS "video/x-raw,format=RGB,width=160,pixel-aspect-ratio=1/1"
+
+int
+main (int argc, char *argv[])
+{
+ GstElement *pipeline, *sink;
+ gint width, height;
+ GstSample *sample;
+ gchar *descr;
+ GError *error = NULL;
+ gint64 duration, position;
+ GstStateChangeReturn ret;
+ gboolean res;
+ GstMapInfo map;
+
+ gst_init (&argc, &argv);
+
+ if (argc != 2) {
+ g_print ("usage: %s <uri>\n Writes snapshot.png in the current directory\n",
+ argv[0]);
+ exit (-1);
+ }
+
+ /* create a new pipeline */
+ descr =
+ g_strdup_printf ("uridecodebin uri=%s ! videoconvert ! videoscale ! "
+ " appsink name=sink caps=\"" CAPS "\"", argv[1]);
+ pipeline = gst_parse_launch (descr, &error);
+
+ if (error != NULL) {
+ g_print ("could not construct pipeline: %s\n", error->message);
+ g_error_free (error);
+ exit (-1);
+ }
+
+ /* get sink */
+ sink = gst_bin_get_by_name (GST_BIN (pipeline), "sink");
+
+ /* set to PAUSED to make the first frame arrive in the sink */
+ ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ switch (ret) {
+ case GST_STATE_CHANGE_FAILURE:
+ g_print ("failed to play the file\n");
+ exit (-1);
+ case GST_STATE_CHANGE_NO_PREROLL:
+ /* for live sources, we need to set the pipeline to PLAYING before we can
+ * receive a buffer. We don't do that yet */
+ g_print ("live sources not supported yet\n");
+ exit (-1);
+ default:
+ break;
+ }
+ /* This can block for up to 5 seconds. If your machine is really overloaded,
+ * it might time out before the pipeline prerolled and we generate an error. A
+ * better way is to run a mainloop and catch errors there. */
+ ret = gst_element_get_state (pipeline, NULL, NULL, 5 * GST_SECOND);
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ g_print ("failed to play the file\n");
+ exit (-1);
+ }
+
+ /* get the duration */
+ gst_element_query_duration (pipeline, GST_FORMAT_TIME, &duration);
+
+ if (duration != -1)
+ /* we have a duration, seek to 5% */
+ position = duration * 5 / 100;
+ else
+ /* no duration, seek to 1 second, this could EOS */
+ position = 1 * GST_SECOND;
+
+ /* seek to the a position in the file. Most files have a black first frame so
+ * by seeking to somewhere else we have a bigger chance of getting something
+ * more interesting. An optimisation would be to detect black images and then
+ * seek a little more */
+ gst_element_seek_simple (pipeline, GST_FORMAT_TIME,
+ GST_SEEK_FLAG_KEY_UNIT | GST_SEEK_FLAG_FLUSH, position);
+
+ /* get the preroll buffer from appsink, this block untils appsink really
+ * prerolls */
+ g_signal_emit_by_name (sink, "pull-preroll", &sample, NULL);
+
+ /* if we have a buffer now, convert it to a pixbuf. It's possible that we
+ * don't have a buffer because we went EOS right away or had an error. */
+ if (sample) {
+ GstBuffer *buffer;
+ GstCaps *caps;
+ GstStructure *s;
+
+ /* get the snapshot buffer format now. We set the caps on the appsink so
+ * that it can only be an rgb buffer. The only thing we have not specified
+ * on the caps is the height, which is dependant on the pixel-aspect-ratio
+ * of the source material */
+ caps = gst_sample_get_caps (sample);
+ if (!caps) {
+ g_print ("could not get snapshot format\n");
+ exit (-1);
+ }
+ s = gst_caps_get_structure (caps, 0);
+
+ /* we need to get the final caps on the buffer to get the size */
+ res = gst_structure_get_int (s, "width", &width);
+ res |= gst_structure_get_int (s, "height", &height);
+ if (!res) {
+ g_print ("could not get snapshot dimension\n");
+ exit (-1);
+ }
+
+ /* create pixmap from buffer and save, gstreamer video buffers have a stride
+ * that is rounded up to the nearest multiple of 4 */
+ buffer = gst_sample_get_buffer (sample);
+ gst_buffer_map (buffer, &map, GST_MAP_READ);
+#ifdef HAVE_GTK
+ pixbuf = gdk_pixbuf_new_from_data (map.data,
+ GDK_COLORSPACE_RGB, FALSE, 8, width, height,
+ GST_ROUND_UP_4 (width * 3), NULL, NULL);
+
+ /* save the pixbuf */
+ gdk_pixbuf_save (pixbuf, "snapshot.png", "png", &error, NULL);
+#endif
+ gst_buffer_unmap (buffer, &map);
+ } else {
+ g_print ("could not make snapshot\n");
+ }
+
+ /* cleanup and exit */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ exit (0);
+}
--- /dev/null
+
+/*** block from ../../../docs/manual/advanced-dataaccess.xml ***/
+#include <gst/gst.h>
+
+static GMainLoop *loop;
+
+static void
+cb_need_data (GstElement *appsrc,
+ guint unused_size,
+ gpointer user_data)
+{
+ static gboolean white = FALSE;
+ static GstClockTime timestamp = 0;
+ GstBuffer *buffer;
+ guint size;
+ GstFlowReturn ret;
+
+ size = 385 * 288 * 2;
+
+ buffer = gst_buffer_new_allocate (NULL, size, NULL);
+
+ /* this makes the image black/white */
+ gst_buffer_memset (buffer, 0, white ? 0xff : 0x0, size);
+
+ white = !white;
+
+ GST_BUFFER_PTS (buffer) = timestamp;
+ GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale_int (1, GST_SECOND, 2);
+
+ timestamp += GST_BUFFER_DURATION (buffer);
+
+ g_signal_emit_by_name (appsrc, "push-buffer", buffer, &ret);
+
+ if (ret != GST_FLOW_OK) {
+ /* something wrong, stop pushing */
+ g_main_loop_quit (loop);
+ }
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GstElement *pipeline, *appsrc, *conv, *videosink;
+
+ /* init GStreamer */
+ gst_init (&argc, &argv);
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* setup pipeline */
+ pipeline = gst_pipeline_new ("pipeline");
+ appsrc = gst_element_factory_make ("appsrc", "source");
+ conv = gst_element_factory_make ("videoconvert", "conv");
+ videosink = gst_element_factory_make ("xvimagesink", "videosink");
+
+ /* setup */
+ g_object_set (G_OBJECT (appsrc), "caps",
+ gst_caps_new_simple ("video/x-raw",
+ "format", G_TYPE_STRING, "RGB16",
+ "width", G_TYPE_INT, 384,
+ "height", G_TYPE_INT, 288,
+ "framerate", GST_TYPE_FRACTION, 0, 1,
+ NULL), NULL);
+ gst_bin_add_many (GST_BIN (pipeline), appsrc, conv, videosink, NULL);
+ gst_element_link_many (appsrc, conv, videosink, NULL);
+
+ /* setup appsrc */
+ g_object_set (G_OBJECT (appsrc),
+ "stream-type", 0,
+ "format", GST_FORMAT_TIME, NULL);
+ g_signal_connect (appsrc, "need-data", G_CALLBACK (cb_need_data), NULL);
+
+ /* play */
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ g_main_loop_run (loop);
+
+ /* clean up */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (pipeline));
+ g_main_loop_unref (loop);
+
+ return 0;
+ }
--- /dev/null
+
+/*** block from ../../../docs/manual/advanced-dataaccess.xml ***/
+#include <gst/gst.h>
+
+static GMainLoop *loop;
+static volatile gint counter;
+static GstBus *bus;
+static gboolean prerolled = FALSE;
+static GstPad *sinkpad;
+
+static void
+dec_counter (GstElement * pipeline)
+{
+ if (prerolled)
+ return;
+
+ if (g_atomic_int_dec_and_test (&counter)) {
+ /* all probes blocked and no-more-pads signaled, post
+ * message on the bus. */
+ prerolled = TRUE;
+
+ gst_bus_post (bus, gst_message_new_application (
+ GST_OBJECT_CAST (pipeline),
+ gst_structure_new_empty ("ExPrerolled")));
+ }
+}
+
+/* called when a source pad of uridecodebin is blocked */
+static GstPadProbeReturn
+cb_blocked (GstPad *pad,
+ GstPadProbeInfo *info,
+ gpointer user_data)
+{
+ GstElement *pipeline = GST_ELEMENT (user_data);
+
+ if (prerolled)
+ return GST_PAD_PROBE_REMOVE;
+
+ dec_counter (pipeline);
+
+ return GST_PAD_PROBE_OK;
+}
+
+/* called when uridecodebin has a new pad */
+static void
+cb_pad_added (GstElement *element,
+ GstPad *pad,
+ gpointer user_data)
+{
+ GstElement *pipeline = GST_ELEMENT (user_data);
+
+ if (prerolled)
+ return;
+
+ g_atomic_int_inc (&counter);
+
+ gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
+ (GstPadProbeCallback) cb_blocked, pipeline, NULL);
+
+ /* try to link to the video pad */
+ gst_pad_link (pad, sinkpad);
+}
+
+/* called when uridecodebin has created all pads */
+static void
+cb_no_more_pads (GstElement *element,
+ gpointer user_data)
+{
+ GstElement *pipeline = GST_ELEMENT (user_data);
+
+ if (prerolled)
+ return;
+
+ dec_counter (pipeline);
+}
+
+/* called when a new message is posted on the bus */
+static void
+cb_message (GstBus *bus,
+ GstMessage *message,
+ gpointer user_data)
+{
+ GstElement *pipeline = GST_ELEMENT (user_data);
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR:
+ g_print ("we received an error!\n");
+ g_main_loop_quit (loop);
+ break;
+ case GST_MESSAGE_EOS:
+ g_print ("we reached EOS\n");
+ g_main_loop_quit (loop);
+ break;
+ case GST_MESSAGE_APPLICATION:
+ {
+ if (gst_message_has_name (message, "ExPrerolled")) {
+ /* it's our message */
+ g_print ("we are all prerolled, do seek\n");
+ gst_element_seek (pipeline,
+ 1.0, GST_FORMAT_TIME,
+ GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
+ GST_SEEK_TYPE_SET, 2 * GST_SECOND,
+ GST_SEEK_TYPE_SET, 5 * GST_SECOND);
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GstElement *pipeline, *src, *csp, *vs, *sink;
+
+ /* init GStreamer */
+ gst_init (&argc, &argv);
+ loop = g_main_loop_new (NULL, FALSE);
+
+ if (argc < 2) {
+ g_print ("usage: %s <uri>", argv[0]);
+ return -1;
+ }
+
+ /* build */
+ pipeline = gst_pipeline_new ("my-pipeline");
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+ gst_bus_add_signal_watch (bus);
+ g_signal_connect (bus, "message", (GCallback) cb_message,
+ pipeline);
+
+ src = gst_element_factory_make ("uridecodebin", "src");
+ if (src == NULL)
+ g_error ("Could not create 'uridecodebin' element");
+
+ g_object_set (src, "uri", argv[1], NULL);
+
+ csp = gst_element_factory_make ("videoconvert", "csp");
+ if (csp == NULL)
+ g_error ("Could not create 'videoconvert' element");
+
+ vs = gst_element_factory_make ("videoscale", "vs");
+ if (csp == NULL)
+ g_error ("Could not create 'videoscale' element");
+
+ sink = gst_element_factory_make ("autovideosink", "sink");
+ if (sink == NULL)
+ g_error ("Could not create 'autovideosink' element");
+
+ gst_bin_add_many (GST_BIN (pipeline), src, csp, vs, sink, NULL);
+
+ /* can't link src yet, it has no pads */
+ gst_element_link_many (csp, vs, sink, NULL);
+
+ sinkpad = gst_element_get_static_pad (csp, "sink");
+
+ /* for each pad block that is installed, we will increment
+ * the counter. for each pad block that is signaled, we
+ * decrement the counter. When the counter is 0 we post
+ * an app message to tell the app that all pads are
+ * blocked. Start with 1 that is decremented when no-more-pads
+ * is signaled to make sure that we only post the message
+ * after no-more-pads */
+ g_atomic_int_set (&counter, 1);
+
+ g_signal_connect (src, "pad-added",
+ (GCallback) cb_pad_added, pipeline);
+ g_signal_connect (src, "no-more-pads",
+ (GCallback) cb_no_more_pads, pipeline);
+
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+
+ g_main_loop_run (loop);
+
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+
+ gst_object_unref (sinkpad);
+ gst_object_unref (bus);
+ gst_object_unref (pipeline);
+ g_main_loop_unref (loop);
+
+ return 0;
+}
-/*** 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,
return TRUE;
}
-/*** block c from ../../../docs/manual/highlevel-components.xml ***/
+/*** block c from ../../../docs/manual/highlevel-playback.xml ***/
GstElement *pipeline, *audio;
static void
cb_newpad (GstElement *decodebin,
GstPad *pad,
- gboolean last,
gpointer data)
{
GstCaps *caps;
src = gst_element_factory_make ("filesrc", "source");
g_object_set (G_OBJECT (src), "location", argv[1], NULL);
dec = gst_element_factory_make ("decodebin", "decoder");
- g_signal_connect (dec, "new-decoded-pad", G_CALLBACK (cb_newpad), NULL);
+ g_signal_connect (dec, "pad-added", G_CALLBACK (cb_newpad), NULL);
gst_bin_add_many (GST_BIN (pipeline), src, dec, NULL);
gst_element_link (src, dec);
+++ /dev/null
-
-/*** 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 *mime;
- const GList *item;
- GstCaps *res, *audiocaps;
-
- /* don't plug if we're already plugged - FIXME: memleak for pad */
- if (GST_PAD_IS_LINKED (gst_element_get_static_pad (audiosink, "sink"))) {
- g_print ("Omitting link for pad %s:%s because we're already linked\n",
- GST_OBJECT_NAME (parent), GST_OBJECT_NAME (pad));
- return;
- }
-
- /* as said above, we only try to plug audio... Omit video */
- mime = gst_structure_get_name (gst_caps_get_structure (caps, 0));
- if (g_strrstr (mime, "video")) {
- g_print ("Omitting link for pad %s:%s because mimetype %s is non-audio\n",
- GST_OBJECT_NAME (parent), GST_OBJECT_NAME (pad), mime);
- return;
- }
-
- /* can it link to the audiopad? */
- audiocaps = gst_pad_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",
- mime, GST_OBJECT_NAME (parent), GST_OBJECT_NAME (pad));
-}
-
-static void
-cb_typefound (GstElement *typefind,
- guint probability,
- GstCaps *caps,
- gpointer data)
-{
- gchar *s;
- GstPad *pad;
-
- s = gst_caps_to_string (caps);
- g_print ("Detected media type %s\n", s);
- g_free (s);
-
- /* actually plug now */
- pad = gst_element_get_static_pad (typefind, "src");
- try_to_plug (pad, caps);
- gst_object_unref (GST_OBJECT (pad));
-}
-
-/*** block d from ../../../docs/manual/advanced-autoplugging.xml ***/
-static gboolean
-my_bus_callback (GstBus *bus,
- GstMessage *message,
- gpointer data)
-{
- GMainLoop *loop = data;
-
- switch (GST_MESSAGE_TYPE (message)) {
- case GST_MESSAGE_ERROR: {
- GError *err;
- gchar *debug;
-
- gst_message_parse_error (message, &err, &debug);
- g_print ("Error: %s\n", err->message);
- g_error_free (err);
- g_free (debug);
-
- g_main_loop_quit (loop);
- break;
- }
- case GST_MESSAGE_EOS:
- /* end-of-stream */
- g_main_loop_quit (loop);
- break;
- default:
- break;
- }
-
- /* remove from queue */
- return TRUE;
-}
-
-gint
-main (gint argc,
- gchar *argv[])
-{
- GMainLoop *loop;
- GstElement *typefind, *realsink;
- GstBus *bus;
- GError *err = NULL;
- gchar *p;
-
- /* init GStreamer and ourselves */
- gst_init (&argc, &argv);
- loop = g_main_loop_new (NULL, FALSE);
- init_factories ();
-
- /* args */
- if (argc != 2) {
- g_print ("Usage: %s <filename>\n", argv[0]);
- return -1;
- }
-
- /* pipeline */
- p = g_strdup_printf ("filesrc location=\"%s\" ! typefind name=tf", argv[1]);
- pipeline = gst_parse_launch (p, &err);
- g_free (p);
-
- if (err) {
- g_error ("Could not construct pipeline: %s", err->message);
- g_error_free (err);
- return -1;
- }
-
- bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
- gst_bus_add_watch (bus, my_bus_callback, NULL);
- gst_object_unref (bus);
-
- typefind = gst_bin_get_by_name (GST_BIN (pipeline), "tf");
- g_signal_connect (typefind, "have-type", G_CALLBACK (cb_typefound), NULL);
- gst_object_unref (GST_OBJECT (typefind));
- audiosink = gst_element_factory_make ("audioconvert", "aconv");
- realsink = gst_element_factory_make ("alsasink", "audiosink");
- gst_bin_add_many (GST_BIN (pipeline), audiosink, realsink, NULL);
- gst_element_link (audiosink, realsink);
- gst_element_set_state (pipeline, GST_STATE_PLAYING);
-
- /* run */
- g_main_loop_run (loop);
-
- /* exit */
- gst_element_set_state (pipeline, GST_STATE_NULL);
- gst_object_unref (GST_OBJECT (pipeline));
-
- return 0;
-}
--- /dev/null
+
+/*** block from ../../../docs/manual/advanced-dataaccess.xml ***/
+#include <stdlib.h>
+
+#include <gst/gst.h>
+
+#define MAX_ROUND 100
+
+int
+main (int argc, char **argv)
+{
+ GstElement *pipe, *filter;
+ GstCaps *caps;
+ gint width, height;
+ gint xdir, ydir;
+ gint round;
+ GstMessage *message;
+
+ gst_init (&argc, &argv);
+
+ pipe = gst_parse_launch_full ("videotestsrc ! capsfilter name=filter ! "
+ "ximagesink", NULL, GST_PARSE_FLAG_NONE, NULL);
+ g_assert (pipe != NULL);
+
+ filter = gst_bin_get_by_name (GST_BIN (pipe), "filter");
+ g_assert (filter);
+
+ width = 320;
+ height = 240;
+ xdir = ydir = -10;
+
+ for (round = 0; round < MAX_ROUND; round++) {
+ gchar *capsstr;
+ g_print ("resize to %dx%d (%d/%d) \r", width, height, round, MAX_ROUND);
+
+ /* we prefer our fixed width and height but allow other dimensions to pass
+ * as well */
+ capsstr = g_strdup_printf ("video/x-raw, width=(int)%d, height=(int)%d",
+ width, height);
+
+ caps = gst_caps_from_string (capsstr);
+ g_free (capsstr);
+ g_object_set (filter, "caps", caps, NULL);
+ gst_caps_unref (caps);
+
+ if (round == 0)
+ gst_element_set_state (pipe, GST_STATE_PLAYING);
+
+ width += xdir;
+ if (width >= 320)
+ xdir = -10;
+ else if (width < 200)
+ xdir = 10;
+
+ height += ydir;
+ if (height >= 240)
+ ydir = -10;
+ else if (height < 150)
+ ydir = 10;
+
+ message =
+ gst_bus_poll (GST_ELEMENT_BUS (pipe), GST_MESSAGE_ERROR,
+ 50 * GST_MSECOND);
+ if (message) {
+ g_print ("got error \n");
+
+ gst_message_unref (message);
+ }
+ }
+ g_print ("done \n");
+
+ gst_object_unref (filter);
+ gst_element_set_state (pipe, GST_STATE_NULL);
+ gst_object_unref (pipe);
+
+ return 0;
+}
--- /dev/null
+
+/*** 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;
+}
+++ /dev/null
-
-/*** block from ../../../docs/manual/advanced-dataaccess.xml ***/
-#include <string.h> /* for memset () */
-#include <gst/gst.h>
-
-static void
-cb_handoff (GstElement *fakesrc,
- GstBuffer *buffer,
- GstPad *pad,
- gpointer user_data)
-{
- static gboolean white = FALSE;
- GstMapInfo info;
-
- gst_buffer_map (buffer, &info, GST_MAP_WRITE);
-
- /* this makes the image black/white */
- memset (info.data, white ? 0xff : 0x0, info.size);
- white = !white;
-
- gst_buffer_unmap (buffer, &info);
-}
-
-gint
-main (gint argc,
- gchar *argv[])
-{
- GstElement *pipeline, *fakesrc, *flt, *conv, *videosink;
- GMainLoop *loop;
-
- /* init GStreamer */
- gst_init (&argc, &argv);
- loop = g_main_loop_new (NULL, FALSE);
-
- /* setup pipeline */
- pipeline = gst_pipeline_new ("pipeline");
- fakesrc = gst_element_factory_make ("fakesrc", "source");
- flt = gst_element_factory_make ("capsfilter", "flt");
- conv = gst_element_factory_make ("videoconvert", "conv");
- videosink = gst_element_factory_make ("xvimagesink", "videosink");
-
- /* setup */
- g_object_set (G_OBJECT (flt), "caps",
- gst_caps_new_simple ("video/x-raw",
- "format", G_TYPE_STRING, "RGB16",
- "width", G_TYPE_INT, 384,
- "height", G_TYPE_INT, 288,
- "framerate", GST_TYPE_FRACTION, 1, 1,
- NULL), NULL);
- gst_bin_add_many (GST_BIN (pipeline), fakesrc, flt, conv, videosink, NULL);
- gst_element_link_many (fakesrc, flt, conv, videosink, NULL);
-
- /* setup fake source */
- g_object_set (G_OBJECT (fakesrc),
- "signal-handoffs", TRUE,
- "sizemax", 384 * 288 * 2,
- "sizetype", 2, NULL);
- g_signal_connect (fakesrc, "handoff", G_CALLBACK (cb_handoff), NULL);
-
- /* play */
- gst_element_set_state (pipeline, GST_STATE_PLAYING);
- g_main_loop_run (loop);
-
- /* clean up */
- gst_element_set_state (pipeline, GST_STATE_NULL);
- gst_object_unref (GST_OBJECT (pipeline));
-
- return 0;
-}
GstElement *pipeline, *source, *demuxer, *decoder, *conv, *sink;
GstBus *bus;
+ guint bus_watch_id;
/* Initialisation */
gst_init (&argc, &argv);
/* we add a message handler */
bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
- gst_bus_add_watch (bus, bus_call, loop);
+ bus_watch_id = gst_bus_add_watch (bus, bus_call, loop);
gst_object_unref (bus);
/* we add all elements into the pipeline */
g_print ("Deleting pipeline\n");
gst_object_unref (GST_OBJECT (pipeline));
+ g_source_remove (bus_watch_id);
+ g_main_loop_unref (loop);
return 0;
}
--- /dev/null
+
+/*** 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;
+}
-/*** 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,
return TRUE;
}
-/*** block c from ../../../docs/manual/highlevel-components.xml ***/
+/*** block c from ../../../docs/manual/highlevel-playback.xml ***/
gint
main (gint argc,
gchar *argv[])
--- /dev/null
+
+/*** 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;
+}
--- /dev/null
+
+/*** block from ../../../docs/manual/advanced-dataaccess.xml ***/
+#include <gst/gst.h>
+
+static GstPadProbeReturn
+cb_have_data (GstPad *pad,
+ GstPadProbeInfo *info,
+ gpointer user_data)
+{
+ gint x, y;
+ GstMapInfo map;
+ guint16 *ptr, t;
+ GstBuffer *buffer;
+
+ buffer = GST_PAD_PROBE_INFO_BUFFER (info);
+
+ buffer = gst_buffer_make_writable (buffer);
+
+ gst_buffer_map (buffer, &map, GST_MAP_WRITE);
+
+ ptr = (guint16 *) map.data;
+ /* invert data */
+ for (y = 0; y < 288; y++) {
+ for (x = 0; x < 384 / 2; x++) {
+ t = ptr[384 - 1 - x];
+ ptr[384 - 1 - x] = ptr[x];
+ ptr[x] = t;
+ }
+ ptr += 384;
+ }
+ gst_buffer_unmap (buffer, &map);
+
+ GST_PAD_PROBE_INFO_DATA (info) = buffer;
+
+ return GST_PAD_PROBE_OK;
+}
+
+gint
+main (gint argc,
+ gchar *argv[])
+{
+ GMainLoop *loop;
+ GstElement *pipeline, *src, *sink, *filter, *csp;
+ GstCaps *filtercaps;
+ GstPad *pad;
+
+ /* init GStreamer */
+ gst_init (&argc, &argv);
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* build */
+ pipeline = gst_pipeline_new ("my-pipeline");
+ src = gst_element_factory_make ("videotestsrc", "src");
+ if (src == NULL)
+ g_error ("Could not create 'videotestsrc' element");
+
+ filter = gst_element_factory_make ("capsfilter", "filter");
+ g_assert (filter != NULL); /* should always exist */
+
+ csp = gst_element_factory_make ("videoconvert", "csp");
+ if (csp == NULL)
+ g_error ("Could not create 'videoconvert' element");
+
+ sink = gst_element_factory_make ("xvimagesink", "sink");
+ if (sink == NULL) {
+ sink = gst_element_factory_make ("ximagesink", "sink");
+ if (sink == NULL)
+ g_error ("Could not create neither 'xvimagesink' nor 'ximagesink' element");
+ }
+
+ gst_bin_add_many (GST_BIN (pipeline), src, filter, csp, sink, NULL);
+ gst_element_link_many (src, filter, csp, sink, NULL);
+ filtercaps = gst_caps_new_simple ("video/x-raw",
+ "format", G_TYPE_STRING, "RGB16",
+ "width", G_TYPE_INT, 384,
+ "height", G_TYPE_INT, 288,
+ "framerate", GST_TYPE_FRACTION, 25, 1,
+ NULL);
+ g_object_set (G_OBJECT (filter), "caps", filtercaps, NULL);
+ gst_caps_unref (filtercaps);
+
+ pad = gst_element_get_static_pad (src, "src");
+ gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER,
+ (GstPadProbeCallback) cb_have_data, NULL, NULL);
+ gst_object_unref (pad);
+
+ /* run */
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+ /* wait until it's up and running or failed */
+ if (gst_element_get_state (pipeline, NULL, NULL, -1) == GST_STATE_CHANGE_FAILURE) {
+ g_error ("Failed to go into PLAYING state");
+ }
+
+ g_print ("Running ...\n");
+ g_main_loop_run (loop);
+
+ /* exit */
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (pipeline);
+
+ return 0;
+}
--- /dev/null
+
+/*** 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, ¶m)) != 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;
+}
$(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 \
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@
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@
$(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 \
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@
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@
$(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 \
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@
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@
$(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 \
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@
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@
noinst_PROGRAMS = stream-status
-if HAVE_PTHREAD_H
+if HAVE_PTHREAD
noinst_PROGRAMS += rtpool-test
endif
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
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
$(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 \
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
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@
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@
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
$(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 \
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@
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@
$(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 \
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@
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@
$(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 \
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@
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@
.B Caps
-MIMETYPE \fI[, PROPERTY[, PROPERTY ...]]]\fR \fI[; CAPS[; CAPS ...]]\fR
+MEDIATYPE \fI[, PROPERTY[, PROPERTY ...]]]\fR \fI[; CAPS[; CAPS ...]]\fR
-Creates a capability with the given mimetype and optionally with given
-properties. The mimetype can be escaped using " or '.
+Creates a capability with the given media type and optionally with given
+properties. The media type can be escaped using " or '.
If you want to chain caps, you can add more caps in the same format afterwards.
.B Properties
diff = GST_CLOCK_DIFF (tfthen, tfnow);
- PRINT (_("Execution ended after %" G_GUINT64_FORMAT " ns.\n"), diff);
+ PRINT (_("Execution ended after %" G_GINT64_FORMAT " ns.\n"), diff);
}
PRINT (_("Setting pipeline to PAUSED ...\n"));
#
# based on plot-timeline.py by Federico Mena-Quintero <federico at ximian dotcom>
# example:
-# GST_DEBUG_NO_COLOR=1 GST_DEBUG="*:3" gst-launch-0.10 2>debug.log audiotestsrc num-buffers=10 ! audioconvert ! alsasink
+# GST_DEBUG_NO_COLOR=1 GST_DEBUG="*:3" gst-launch-1.0 2>debug.log audiotestsrc num-buffers=10 ! audioconvert ! alsasink
# gst-plot-timeline.py debug.log --output=debug.png
import math
.TH GStreamer 1 "May 2003"
.SH "NAME"
-gst\-typefind - print MIME type of file
+gst\-typefind - print Media type of file
.SH "SYNOPSIS"
.B gst\-typefind <file>
.SH "DESCRIPTION"
.PP
\fIgst\-typefind\fP uses the GStreamer type finding system to
determine the relevant GStreamer plugin to parse or decode \fBfile\fP,
-and the corresponding MIME type.
+and the corresponding media type.
.
.SH "OPTIONS"
.l
gchar *version_str;
version_str = gst_version_string ();
- g_print ("%s version %u.%u.%u\n", g_get_prgname (),
+ g_print ("%s version %d.%d.%d\n", g_get_prgname (),
GST_VERSION_MAJOR, GST_VERSION_MINOR, GST_VERSION_MICRO);
g_print ("%s\n", version_str);
g_print ("%s\n", GST_PACKAGE_ORIGIN);
#define GST_PACKAGE_ORIGIN "Unknown package origin"
/* GStreamer package release date/time for plugins as YYYY-MM-DD */
-#define GST_PACKAGE_RELEASE_DATETIME "2012-09-23"
+#define GST_PACKAGE_RELEASE_DATETIME "2012-10-24"
/* location of the installed gst-plugin-scanner */
#define GST_PLUGIN_SCANNER_INSTALLED LIBDIR "\\gst-plugin-scanner"
/* 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
#define PACKAGE_NAME "GStreamer"
/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "GStreamer 1.0.0"
+#define PACKAGE_STRING "GStreamer 1.0.2"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "gstreamer"
#undef PACKAGE_URL
/* Define to the version of this package. */
-#define PACKAGE_VERSION "1.0.0"
+#define PACKAGE_VERSION "1.0.2"
/* directory where plugins are located */
#ifdef _DEBUG
# 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
#undef USE_POISONING
/* Version number of package */
-#define VERSION "1.0.0"
+#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). */
gst_segment_flags_get_type (void)
{
static gsize id = 0;
- static const GEnumValue values[] = {
- {C_ENUM (GST_SEGMENT_FLAG_NONE), "GST_SEGMENT_FLAG_NONE", "none"},
- {C_ENUM (GST_SEGMENT_FLAG_RESET), "GST_SEGMENT_FLAG_RESET", "reset"},
- {C_ENUM (GST_SEGMENT_FLAG_SKIP), "GST_SEGMENT_FLAG_SKIP", "skip"},
- {C_ENUM (GST_SEGMENT_FLAG_SEGMENT), "GST_SEGMENT_FLAG_SEGMENT", "segment"},
+ static const GFlagsValue values[] = {
+ {C_FLAGS (GST_SEGMENT_FLAG_NONE), "GST_SEGMENT_FLAG_NONE", "none"},
+ {C_FLAGS (GST_SEGMENT_FLAG_RESET), "GST_SEGMENT_FLAG_RESET", "reset"},
+ {C_FLAGS (GST_SEGMENT_FLAG_SKIP), "GST_SEGMENT_FLAG_SKIP", "skip"},
+ {C_FLAGS (GST_SEGMENT_FLAG_SEGMENT), "GST_SEGMENT_FLAG_SEGMENT", "segment"},
{0, NULL, NULL}
};
if (g_once_init_enter (&id)) {
- GType tmp = g_enum_register_static ("GstSegmentFlags", values);
+ GType tmp = g_flags_register_static ("GstSegmentFlags", values);
g_once_init_leave (&id, tmp);
}
*
* The micro version of GStreamer at compile time:
*/
-#define GST_VERSION_MICRO (0)
+#define GST_VERSION_MICRO (2)
/**
* GST_VERSION_NANO:
*
gst_base_transform_set_gap_aware
gst_base_transform_set_in_place
gst_base_transform_set_passthrough
+ gst_base_transform_set_prefer_passthrough
gst_base_transform_set_qos_enabled
gst_base_transform_update_qos
gst_bit_reader_free