Imported Upstream version 1.7.1
diff --git a/ChangeLog b/ChangeLog
index 039f8e4..524e195 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,16 +1,175 @@
-=== release 1.6.2 ===
+=== release 1.7.1 ===
-2015-12-14 Sebastian Dröge <slomo@coaxion.net>
+2015-12-24 Sebastian Dröge <slomo@coaxion.net>
* configure.ac:
- releasing 1.6.2
+ releasing 1.7.1
-2015-12-14 18:59:00 +0100 Sebastian Dröge <sebastian@centricular.com>
+2015-12-24 12:21:21 +0100 Sebastian Dröge <sebastian@centricular.com>
+ * po/cs.po:
+ * po/de.po:
+ * po/fr.po:
* po/hu.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/pl.po:
+ * po/ru.po:
* po/sv.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
po: Update translations
+2015-12-21 00:43:49 +0100 Koop Mast <kwm@rainbow-runner.nl>
+
+ * configure.ac:
+ configure: Make -Bsymbolic check work with clang.
+ Update the -Bsymbolic check with the version glib has. This version
+ works with clang.
+ https://bugzilla.gnome.org/show_bug.cgi?id=759713
+
+2015-12-16 09:35:18 +0100 Sebastian Dröge <sebastian@centricular.com>
+
+ * docs/plugins/gstreamer-plugins.args:
+ * docs/plugins/gstreamer-plugins.hierarchy:
+ * docs/plugins/gstreamer-plugins.signals:
+ * docs/plugins/inspect/plugin-coreelements.xml:
+ docs: update to git
+
+2015-11-10 12:38:59 -0500 Xavier Claessens <xavier.claessens@collabora.com>
+
+ * gst/gstallocator.h:
+ * gst/gstatomicqueue.h:
+ * gst/gstbin.h:
+ * gst/gstbuffer.h:
+ * gst/gstbufferlist.h:
+ * gst/gstbus.h:
+ * gst/gstcaps.h:
+ * gst/gstcapsfeatures.h:
+ * gst/gstclock.h:
+ * gst/gstcontext.h:
+ * gst/gstcontrolbinding.h:
+ * gst/gstcontrolsource.h:
+ * gst/gstdatetime.h:
+ * gst/gstdevice.h:
+ * gst/gstdevicemonitor.h:
+ * gst/gstdeviceprovider.h:
+ * gst/gstdeviceproviderfactory.h:
+ * gst/gstelement.h:
+ * gst/gstelementfactory.h:
+ * gst/gstevent.h:
+ * gst/gstghostpad.h:
+ * gst/gstiterator.h:
+ * gst/gstmemory.h:
+ * gst/gstmessage.h:
+ * gst/gstobject.h:
+ * gst/gstpad.h:
+ * gst/gstpadtemplate.h:
+ * gst/gstparse.h:
+ * gst/gstpipeline.h:
+ * gst/gstplugin.h:
+ * gst/gstpluginfeature.h:
+ * gst/gstquery.h:
+ * gst/gstregistry.h:
+ * gst/gstsample.h:
+ * gst/gstsegment.h:
+ * gst/gststructure.h:
+ * gst/gstsystemclock.h:
+ * gst/gsttaglist.h:
+ * gst/gsttask.h:
+ * gst/gsttaskpool.h:
+ * gst/gsttoc.h:
+ * gst/gsttracer.h:
+ * gst/gsttracerfactory.h:
+ * gst/gsttypefindfactory.h:
+ * gst/gsturi.h:
+ * libs/gst/base/gstadapter.h:
+ * libs/gst/base/gstbaseparse.h:
+ * libs/gst/base/gstbasesink.h:
+ * libs/gst/base/gstbasesrc.h:
+ * libs/gst/base/gstbasetransform.h:
+ * libs/gst/base/gstcollectpads.h:
+ * libs/gst/base/gstdataqueue.h:
+ * libs/gst/base/gstflowcombiner.h:
+ * libs/gst/base/gstpushsrc.h:
+ * libs/gst/check/gsttestclock.h:
+ * libs/gst/controller/gstargbcontrolbinding.h:
+ * libs/gst/controller/gstdirectcontrolbinding.h:
+ * libs/gst/controller/gstinterpolationcontrolsource.h:
+ * libs/gst/controller/gstlfocontrolsource.h:
+ * libs/gst/controller/gsttimedvaluecontrolsource.h:
+ * libs/gst/controller/gsttriggercontrolsource.h:
+ * libs/gst/net/gstnetclientclock.h:
+ * libs/gst/net/gstnettimepacket.h:
+ * libs/gst/net/gstnettimeprovider.h:
+ * libs/gst/net/gstptpclock.h:
+ core: Add g_autoptr() support to all types
+ https://bugzilla.gnome.org/show_bug.cgi?id=754464
+
+2015-12-14 13:06:57 +0100 Sebastian Dröge <sebastian@centricular.com>
+
+ * plugins/elements/gsttee.c:
+ tee: Check if parsing the name template with sscanf() was successful
+ If not, go back to the automatic pad numbering.
+ CID 1195129
+
+2015-12-14 11:20:43 +0100 Sebastian Dröge <sebastian@centricular.com>
+
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstqueue.c:
+ queue/multiqueue: Don't special-case CAPS events in the event handlers
+ For CAPS events we will never ever have a FALSE return value here, so just
+ remove the dead code instead of causing future confusion.
+
+2015-12-14 11:16:50 +0100 Sebastian Dröge <sebastian@centricular.com>
+
+ * plugins/elements/gstqueue.c:
+ Revert "queue: Illegal memory access of sink event"
+ This reverts commit 78614c505a2a761cb4dcb7f4e5f3e9f97c9a8e88.
+ The code it was fixing does not have any effect anyway and will be removed in
+ the next commit.
+
+2015-12-14 10:32:14 +0900 Vineeth TM <vineeth.tm@samsung.com>
+
+ * plugins/elements/gstqueue.c:
+ queue: Illegal memory access of sink event
+ Once event is pushed to pad, then queue should not access the event.
+ This is leading to invalid read valgrind errors
+ https://bugzilla.gnome.org/show_bug.cgi?id=759430
+
+2015-12-14 10:10:04 +0100 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst/gstelement.c:
+ element: Unref event if GstElement::send_event() is not implemented
+ Otherwise we'll take ownership of the event only if it's implemented, and
+ leak the event in all other situations.
+
+2015-12-14 10:04:19 +0100 Sebastian Dröge <sebastian@centricular.com>
+
+ * docs/manual/advanced-dataaccess.xml:
+ manual: Fix dynamic pipeline example
+ Use GST_PAD_PROBE_PASS to pass through all events other than EOS instead of
+ blocking on the first non-EOS event forever. Also fix a typo in a comment in
+ that function.
+ Thanks to David Jaggard for reporting this on the mailing list.
+
+2015-12-13 00:37:39 +0000 Luis de Bethencourt <luisbg@osg.samsung.com>
+
+ * docs/pwg/building-boiler.xml:
+ docs: typo in the location of make_element tool
+ https://bugzilla.gnome.org/show_bug.cgi?id=759352
+
+2015-12-12 01:13:59 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * plugins/elements/gstdownloadbuffer.c:
+ downloadbuffer: drop unneeded macros for G_OS_WIN32
+
+2015-12-12 01:09:20 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * plugins/elements/gstfdsrc.c:
+ fdsrc: drop unneeded macros for G_OS_WIN32
+
2015-12-12 01:06:43 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
* plugins/elements/gstfdsrc.c:
@@ -23,35 +182,156 @@
fdsink: enable large file support in Android
https://bugzilla.gnome.org/show_bug.cgi?id=758980
+2015-12-11 20:52:57 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: fix some typos
+
2015-12-11 20:42:05 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
* plugins/elements/gstqueue2.c:
queue2: enable large file support on Android
https://bugzilla.gnome.org/show_bug.cgi?id=758980
+2015-12-11 19:11:01 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * plugins/elements/gstdownloadbuffer.c:
+ downloadbuffer: fix some typos
+
2015-12-11 18:59:32 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
* plugins/elements/gstdownloadbuffer.c:
downloadbuffer: enable large file support on Android
https://bugzilla.gnome.org/show_bug.cgi?id=758980
+2015-12-11 14:36:29 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * plugins/elements/gstsparsefile.c:
+ sparsefile: drop bogus reference to file descriptor
+ +fix typo on return value comment
+
2015-12-11 14:07:27 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
* plugins/elements/gstsparsefile.c:
sparsefile: enable large file support on Android
https://bugzilla.gnome.org/show_bug.cgi?id=758980
+2015-12-10 14:32:27 +0100 Aurélien Zanelli <aurelien.zanelli@parrot.com>
+
+ * gst/gstelement.c:
+ element: unref message in _post_message when there is no implementation
+ 'gst_element_post_message' takes the ownership of the message, so it
+ shall unref it when there is no post_message implementation. Otherwise
+ message is leaked.
+ https://bugzilla.gnome.org/show_bug.cgi?id=759300
+
+2015-12-10 11:35:05 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst/gstelement.c:
+ element: Don't hold state lock all the time while sending an event
+ This lock seems to exist only to prevent elements from changing states while
+ events are being processed. However events are going to be processed
+ nonetheless in those elements if sent directly via pads, so protection must
+ already be implemented inside the elements for event handling if it is needed.
+ As such having the lock here is not very useful and is actually causing
+ various deadlocks in different situations as described in
+ https://bugzilla.gnome.org/show_bug.cgi?id=744040
+
+2015-12-07 20:27:45 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * plugins/elements/gstfilesrc.c:
+ filesrc: enable large file support in Android
+ https://bugzilla.gnome.org/show_bug.cgi?id=758980
+
2015-12-03 15:04:32 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
* plugins/elements/gstfilesink.c:
filesink: enable large file support on Android
https://bugzilla.gnome.org/show_bug.cgi?id=758980
-2015-12-07 20:27:45 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+2015-12-03 15:01:27 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
- * plugins/elements/gstfilesrc.c:
- filesrc: enable large file support in Android
- https://bugzilla.gnome.org/show_bug.cgi?id=758980
+ * plugins/elements/gstfilesink.c:
+ * plugins/elements/gstfilesink.h:
+ filesink: indentation fixes
+
+2015-12-09 17:40:02 +0100 Edward Hervey <edward@centricular.com>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Don't use random segment.position from upstream
+ segment.position is meant for internal usage only, but the various
+ GST_EVENT_SEGMENT creationg/parsing functions won't clear that field.
+ Use the appropriate segment boundary as an initial value instead
+
+2015-12-07 17:25:02 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst/gstbin.c:
+ bin: Post a LATENCY message with async-handling=TRUE if the PLAYING state is reached
+ Otherwise each bin might have a different latency in the end, causing
+ synchronization problems.
+ The bin will still first handle latency internally as before, but gives the
+ overall pipeline the opportunity to update the latency of the whole pipeline
+ afterwards.
+ https://bugzilla.gnome.org/show_bug.cgi?id=759125
+
+2015-12-07 18:20:35 +0200 Athanasios Oikonomou <athoik@gmail.com>
+
+ * libs/gst/base/gstbaseparse.c:
+ baseparse: post tag list when avg bitrate changes at least 2%
+ Watching videos with variant bitrate is common to have delta
+ more than 10 kbps, resulting in tag list spam.
+ Instead of relying on fixed 10 kpbs delta, it is better to
+ calculale the difference in percentage and update tag list
+ only when bitrate changes more than 2%.
+ https://bugzilla.gnome.org/show_bug.cgi?id=759055
+
+2015-12-07 09:08:01 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * autogen.sh:
+ * common:
+ Automatic update of common submodule
+ From b319909 to 86e4663
+
+2015-12-07 12:59:39 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst/gstelement.c:
+ element: Check for an activated pad before adding, not a non-flushing one
+ The pad could be activated but flushing because of a FLUSH_START event. That's
+ not what we're looking for here, we want to check for activated pads.
+ https://bugzilla.gnome.org/show_bug.cgi?id=758928
+
+2015-11-19 15:33:06 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * tests/check/elements/funnel.c:
+ tests: funnel: remove state change from stress tests
+ Changing states up and down while buffers are being pushed is not
+ a valid use case. If a pad is deactivated and reactivated during
+ a buffer push it is racy with the check of pushed sticky events
+ and the actual chainfunction call. As it might call the chain
+ without noticing the peer pad lost its previous sticky events.
+ https://bugzilla.gnome.org/show_bug.cgi?id=758340
+
+2015-12-04 10:22:56 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ gst-launch: Fix process return value on error
+ In case of a run-time error message, the process return value was left
+ unset. This would lead to error not being caught at shell level.
+ https://bugzilla.gnome.org/show_bug.cgi?id=759019
+
+2015-12-04 10:45:25 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * tools/gst-launch.c:
+ Revert "tools: gst-launch: return non-0 exit code on async error"
+ This reverts commit 2ee4cba2485d7f1646d48e4559426aed4ba99c85.
+
+2015-12-04 15:09:39 +0000 Tim-Philipp Müller <tim@centricular.com>
+
+ * tools/gst-launch.c:
+ tools: gst-launch: return non-0 exit code on async error
+ When an error happens in playing state, still return a
+ non-0 exit code.
+ https://bugzilla.gnome.org/show_bug.cgi?id=759019
2015-12-04 14:39:29 +0000 Ross Burton <ross.burton@intel.com>
@@ -62,13 +342,135 @@
the hooks need to be split too.
https://bugzilla.gnome.org/show_bug.cgi?id=758029
-2015-12-04 10:22:56 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+2015-12-04 11:56:45 +0100 Wim Taymans <wtaymans@redhat.com>
- * tools/gst-launch.c:
- gst-launch: Fix process return value on error
- In case of a run-time error message, the process return value was left
- unset. This would lead to error not being caught at shell level.
- https://bugzilla.gnome.org/show_bug.cgi?id=759019
+ * gst/gstquery.c:
+ query: fix docs
+ The allocation query has parameters with the meta API, not flags.
+
+2015-12-02 15:02:25 -0800 Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+ * libs/gst/base/Makefile.am:
+ * libs/gst/check/Makefile.am:
+ * libs/gst/controller/Makefile.am:
+ * libs/gst/net/Makefile.am:
+ Drop usage of deprecated g-ir-scanner --strip-prefix flag
+
+2015-12-02 16:28:23 +0100 Edward Hervey <edward@centricular.com>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Fix set/get property
+ Blame it on the rebasing :)
+
+2015-11-12 17:15:37 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/gstpad.c:
+ * gst/gstpad.h:
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstqueue.c:
+ * win32/common/libgstreamer.def:
+ pad: Implement GstPadEventFullFunction
+ API: GstPadEventFullFunction
+ Returns a GstFlowReturn, allows asynchronous elements to properly
+ propagate flow returns
+ https://bugzilla.gnome.org/show_bug.cgi?id=757821
+
+2015-11-30 17:09:43 +0100 Edward Hervey <edward@centricular.com>
+
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstmultiqueue.h:
+ multiqueue: Use signed clock values for running time calculation
+ This improves the accuracy of queue levels and when to push buffers
+ for buffers falling outside of the segment
+ https://bugzilla.gnome.org/show_bug.cgi?id=757193
+
+2015-11-27 09:45:29 +0100 Edward Hervey <edward@centricular.com>
+
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstmultiqueue.h:
+ multiqueue: Add an extra cache time for unlinked streams
+ When synchronizing the output by time, there are some use-cases (like
+ allowing gapless playback downstream) where we want the unlinked streams
+ to stay slightly behind the linked streams.
+ The "unlinked-cache-time" property allows the user to specify by how
+ much time the unlinked streams should wait before pushing again.
+
+2015-10-26 08:06:01 +0100 Edward Hervey <edward@centricular.com>
+
+ * plugins/elements/gstmultiqueue.c:
+ * plugins/elements/gstmultiqueue.h:
+ multiqueue: Optimize multiqueue sizes based on interleave
+ Multiqueue should only be used to cope with:
+ * decoupling upstream and dowstream threading (i.e. having separate threads
+ for elementary streams).
+ * Ensuring individual queues have enough space to cope with upstream interleave
+ (distance in stream time between co-located samples). This is to guarantee
+ that we have enough room in each individual queues to provide new data in
+ each, without being blocked.
+ * Limit the queue sizes to that interleave distance (and an extra minimal
+ buffering size). This is to ensure we don't consume too much memory.
+ Based on that, multiqueue now continuously calculates the input interleave
+ (per incoming streaming thread). Based on that, it calculates a target
+ interleave (currently 1.5 x real_interleave + 250ms padding).
+ If the target interleave is greater than the current max_size.time, it will
+ update it accordingly (to allow enough margin to not block).
+ If the target interleave goes down by more than 50%, we re-adjust it once
+ we know we have gone past a safe distance (2 x current max_size.time).
+ This mode can only be used for incoming streams that are guaranteed to be
+ properly timestamped.
+ Furthermore, we ignore sparse streams when calculating interleave and maximum
+ size of queues.
+ For the simplest of use-cases (single stream), multiqueue acts as a single
+ queue with a time limit of 250ms.
+ If there are multiple inputs, but each come from a different streaming thread,
+ the maximum time limit will also end up being 250ms.
+ On regular files (more than one input stream from the same upstream streaming
+ thread), it can reduce the total memory used as much as 10x, ending up with
+ max_size.time around 500ms.
+ Due to the adaptive nature, it can also cope with changing interleave (which
+ can happen commonly on some files at startup/pre-roll time)
+
+2013-01-08 21:16:42 +0000 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: use new stream-start event sparse flag to avoid overreading subtitles
+ This will mean a much lower delay before a subtitles track changes take
+ effect. Also avoids excessive memory usage in many cases.
+ This will also consider sparse streams as (individually) never full, so
+ as to avoid blocking all playback due to one sparse stream.
+ https://bugzilla.gnome.org/show_bug.cgi?id=600648
+
+2015-10-30 10:22:20 +0100 Edward Hervey <edward@centricular.com>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Fix high_time computation
+ * Avoid the computation completely if we know we don't need it (not in
+ sync time mode)
+ * Make sure we don't override highest time with GST_CLOCK_TIME_NONE on
+ unlinked pads
+ * Ensure the high_time gets properly updated if all pads are not linked
+ * Fix the comparision in the loop whether the target high time is the same
+ as the current time
+ * Split wake_up_next_non_linked method to avoid useless calculation
+ https://bugzilla.gnome.org/show_bug.cgi?id=757353
+
+2015-11-06 03:02:42 +1100 Jan Schmidt <jan@centricular.com>
+
+ * plugins/elements/gstqueue2.c:
+ queue2: Don't report 0% unless empty
+ When preparing a buffering message, don't report 0% if there
+ is any bytes left in the queue at all. We still have something
+ to push, so don't tell the app to start buffering - maybe
+ we'll get more data before actually running dry.
+
+2015-11-30 17:11:33 +0100 Edward Hervey <edward@centricular.com>
+
+ * gst/gstclock.h:
+ gstclock: Fix GST_STIME_ARGS
+ It wasn't properly handling GST_CLOCK_STIME_NONE and always use the
+ sign marker (+/-) to make it easier to identify signed values in
+ logs
+ https://bugzilla.gnome.org/show_bug.cgi?id=758870
2015-11-30 23:08:50 +0100 Thibault Saunier <tsaunier@gnome.org>
@@ -77,6 +479,78 @@
As the names clash with gst_object_get_value[_array]
https://bugzilla.gnome.org/show_bug.cgi?id=756950
+2015-11-13 17:32:57 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst/gstplugin.c:
+ * gst/gstplugin.h:
+ plugin: Add prefix support to dependencies
+ This adds a new flags, GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX,
+ which allow using the names as prefix for plugin depencies.
+ https://bugzilla.gnome.org/show_bug.cgi?id=758083
+
+2015-11-13 16:32:31 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst/gstplugin.c:
+ plugin: Allow device nodes as dependency
+ This is useful for feature that are produced after probing a specific
+ node. You want to reload this plugin if the specific node(s) have been
+ removed, added, or reloaded.
+ https://bugzilla.gnome.org/show_bug.cgi?id=758080
+
+2015-11-13 16:20:42 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * gst/gstplugin.c:
+ plugin: Don't do lossy shift on hash
+ In plugin is responsible for calculating a hash of the dependencies
+ in order to determine if the cache should be invalidated or not.
+ Currently, the hash combining method removes a bit of the original
+ have before combining with an addition. As we use 32bits for our hash
+ and shift 1 bit for each file and directory, that resulting hash only
+ account for the last 32 files. And is more affected by the last file.
+ Rotating technique (shifting, and adding back the ending bit), can be
+ use to make the addition non-commutative. In a way that different order
+ gives different hashes. In this case, I don't preserve this behaviour
+ because the order in which the files are provided by the OS is
+ irrelevant.
+ In most cases, the XOR operation is used to combine hashes. In this
+ code we use the addition. I decided to preserve the addition because
+ we make use of non-random hash ((guint) -1) in the algorithm for
+ matching files that are not really part of the hash (symlinks, special
+ files). Doing successive XOR on this value, will simply switch from
+ full ones, to full zero. The XOR used with whitelist has been preserved
+ as it's based on a fairly randomized hash (g_str_hash).
+ https://bugzilla.gnome.org/show_bug.cgi?id=758078
+
+2015-11-23 21:40:34 +0000 Lukasz Forynski <lukasz.forynski@youview.com>
+
+ * gst/gstinfo.h:
+ info: fix compiler warning with -Wpedantic and gcc 5
+ Gstreamer compiled with gcc 5.2 and -Wpedantic produces the
+ following warning:
+ 'ISO C does not support '__FUNCTION__' predefined identifier [-Wpedantic]
+ const char *s = __FUNCTION__;'
+ Since gcc 5 enables C99 by default, use __func__ if it's available
+ instead of the non-standard __FUNCTION__ (as suggested in [2]).
+ [1]: https://gcc.gnu.org/gcc-5/changes.html
+ [2]: https://gcc.gnu.org/gcc-5/porting_to.html
+ https://bugzilla.gnome.org/show_bug.cgi?id=758541
+
+2015-11-20 19:45:39 +0000 Tim-Philipp Müller <tim@centricular.com>
+
+ controller: fix annotation to make g-ir-scanner happy
+ gstinterpolationcontrolsource.h:59: Warning: GstController: missing ":" at column 51:
+ * @GST_INTERPOLATION_MODE_CUBIC_MONO: (Since 1.8) monotonic cubic interpolation, will not
+ gstinterpolationcontrolsource.h:59: Warning: GstController: unknown annotation: since
+
+2014-09-29 14:03:13 +0530 Ravi Kiran K N <ravi.kiran@samsung.com>
+
+ * gst/gsttaglist.c:
+ * gst/gsttaglist.h:
+ tags: add GST_TAG_PRIVATE_DATA
+ Can be used to represent private data that may be
+ contained in tags, such as ID3v2 PRIV frames.
+ https://bugzilla.gnome.org/show_bug.cgi?id=730926
+
2015-11-19 00:51:44 -0300 Thiago Santos <thiagoss@osg.samsung.com>
* libs/gst/base/gstbaseparse.c:
@@ -88,11 +562,11 @@
are adjusted, creating a discontinuity and leading to sync
issues.
-2015-11-19 00:51:30 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+2015-11-17 18:47:48 -0300 Thiago Santos <thiagoss@osg.samsung.com>
* libs/gst/base/gstbaseparse.c:
Revert "baseparse: simplify code a bit"
- This reverts commit 921816400bf3ad65f8978a50569a7d87ef05c806.
+ This reverts commit 3984f7159a72c2eebe01905ee53716e3b2abcb30.
2015-11-18 11:46:45 +0000 Tim-Philipp Müller <tim@centricular.com>
@@ -107,6 +581,12 @@
ptp-helper: Disable multicast loopback
We're not really interested in our own packets and ignore them anyway.
+2015-11-17 09:17:58 +0900 Vineeth TM <vineeth.tm@samsung.com>
+
+ * gst/gstdebugutils.c:
+ debugutils: Fix string memory leak
+ https://bugzilla.gnome.org/show_bug.cgi?id=758207
+
2015-11-16 08:22:14 -0300 Thiago Santos <thiagoss@osg.samsung.com>
* libs/gst/base/gstbaseparse.c:
@@ -136,6 +616,15 @@
header buffers.
https://bugzilla.gnome.org/show_bug.cgi?id=757961
+2015-06-18 13:56:53 -0700 Aleix Conchillo Flaqué <aleix@oblong.com>
+
+ * plugins/elements/gstidentity.c:
+ * plugins/elements/gstidentity.h:
+ identity: add drop-buffer-flags property
+ New property drop-buffer-flags that will discard buffers that have the
+ given flags set.
+ https://bugzilla.gnome.org/show_bug.cgi?id=751182
+
2015-11-12 19:46:44 +0000 Ross Burton <ross.burton@intel.com>
* libs/gst/helpers/Makefile.am:
@@ -148,6 +637,161 @@
twice in parallel (once via install-all, once via the hook's dependency).
https://bugzilla.gnome.org/show_bug.cgi?id=758029
+2015-11-12 16:14:18 +0100 Heinrich Fink <hfink@toolsonair.com>
+
+ * tests/check/gst/gstsystemclock.c:
+ systemclock: Add test for gst_clock_get_resolution
+ In a series of time measurements, the diff between now and previous
+ timestamps is either 0 or at least as long as get_resolution returned.
+ https://bugzilla.gnome.org/show_bug.cgi?id=758012
+
+2015-11-12 11:26:56 +0100 Heinrich Fink <hfink@toolsonair.com>
+
+ * gst/gstsystemclock.c:
+ systemclock: Use mach_time on Apple platforms
+ On iOS/OSX g_get_current_time was used by default. However, mach_time is
+ the preferred high-resolution monotonic clock to be used on Apple
+ platforms.
+ https://bugzilla.gnome.org/show_bug.cgi?id=758012
+
+2015-11-11 11:11:23 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * plugins/tracers/gstlog.c:
+ tracers: log: add missing hooks
+ Log all possible hooks
+
+2015-10-29 08:40:32 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * gst/gstelement.c:
+ * gst/gsttracerutils.c:
+ * gst/gsttracerutils.h:
+ tracer: add element-change-state-pre/post hook
+ Helps catching when a state change is starting and ending.
+ It is also possible to track the end of state changes by checking the
+ async-done or state-change messages.
+ This is particularly important for elements that do async state changes.
+
+2015-11-11 14:32:44 +0100 Miguel París Díaz <mparisdiaz@gmail.com>
+
+ * tests/check/gst/gstpad.c:
+ pad: test for checking the order of the probe calls
+ https://bugzilla.gnome.org/show_bug.cgi?id=757197
+
+2015-11-10 14:41:35 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * gst/gstcontext.c:
+ context: fix some copy and paste leftover in docs
+
+2015-11-10 14:37:27 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * gst/gstcontext.c:
+ context: add some more documentation
+ Add a short paragraph on what means for a context to be persistent
+
+2015-11-09 18:02:09 +0000 Tim-Philipp Müller <tim@centricular.com>
+
+ * gst/gstutils.h:
+ utils: use 'static inline' instead of 'inline static' for gtk-doc
+ gtk-doc doesn't seem to recognise the former variant.
+
+2015-11-09 17:59:16 +0000 Tim-Philipp Müller <tim@centricular.com>
+
+ * gst/gstbuffer.h:
+ * gst/gstbufferlist.h:
+ * gst/gstcaps.h:
+ * gst/gstcontext.h:
+ * gst/gstevent.h:
+ * gst/gstmemory.h:
+ * gst/gstmessage.h:
+ * gst/gstquery.h:
+ * gst/gstsample.h:
+ * gst/gsttaglist.h:
+ * gst/gsturi.h:
+ * gst/gstutils.h:
+ * libs/gst/base/gstbytewriter.h:
+ docs: remove dummy function declarations with G_INLINE_FUNCTION for gtk-doc
+ gtk-doc can handle static inline functions just fine these days,
+ there's no need for this stuff any more.
+
+2015-02-23 13:16:19 +1000 Duncan Palmer <dpalmer@digisoft.tv>
+
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gstqueue2.h:
+ queue2: Add the avg-in-rate property.
+ https://bugzilla.gnome.org/show_bug.cgi?id=733959
+
+2015-11-04 12:02:51 +0100 Philippe Normand <philn@igalia.com>
+
+ * plugins/elements/gstqueue2.c:
+ * plugins/elements/gstqueue2.h:
+ * tests/check/elements/queue2.c:
+ queue2: add overrun signal
+ Notifies that the queue2 is full, same as queue does
+ https://bugzilla.gnome.org/show_bug.cgi?id=733959
+
+2015-09-29 21:14:19 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * tests/check/gst/gstpad.c:
+ pad: tests for accept-caps handling with proxy pads
+ Adds 3 new tests for testing accept-caps behavior with
+ proxy-caps pads.
+ 1) A scenario where there is no proxy. The caps should be compared to the
+ template caps of the pad
+ 2) A scenario where there is a compatible pad. The caps should be compared
+ to the proxied pad caps (and also with the template)
+ 3) A scenario where there is an incompatible proxy pad. No caps should be
+ possible at all.
+ https://bugzilla.gnome.org/show_bug.cgi?id=754112
+
+2015-11-05 16:15:22 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * gst/gstpad.c:
+ pad: check template caps for proxy pads in accept-caps
+ Validate that the proxy pad indeed accepts the caps by also
+ comparing with the pad template caps, otherwise when the pad
+ had no internally linked pads it would always return true.
+ https://bugzilla.gnome.org/show_bug.cgi?id=754112
+
+2015-11-06 12:58:42 +0100 Thibault Saunier <tsaunier@gnome.org>
+
+ * gst/gstpreset.c:
+ Fix build with -Werror=maybe-uninitialized
+
+2015-11-06 12:05:18 +0100 Thibault Saunier <tsaunier@gnome.org>
+
+ * gst/gstpreset.c:
+ * scripts/gst-uninstalled:
+ preset: Add a GST_PRESET_PATH env variable for presets to be usable uninstalled
+ And start setting the various uninstalled presets paths.
+
+2015-11-05 08:56:43 +0100 Anton Bondarenko <antonbo@axis.com>
+
+ * plugins/elements/gstfilesink.c:
+ filesink: continue element cleanup even if fclose fails
+ Sometimes filesink cleanup during stop may fail due to fclose error.
+ In this case object left partial cleanup with no file opened
+ but still holding old file descriptor.
+ It's not possible to change location property in a such state,
+ so next start will cause old file overwrite if 'append' does not set.
+ According to man page and POSIX standard about fclose behavior(extract):
+ ------------------------------------------------------------------------
+ The fclose() function shall cause the stream pointed to by stream
+ to be flushed and the associated file to be closed.
+ ...
+ Whether or not the call succeeds, the stream shall be disassociated
+ from the file and any buffer set by the setbuf() or setvbuf()
+ function shall be disassociated from the stream.
+ ...
+ The fclose() function shall perform the equivalent of a close()
+ on the file descriptor that is associated with the stream
+ pointed to by stream.
+ After the call to fclose(), any use of stream results
+ in undefined behavior.
+ ------------------------------------------------------------------------
+ So file is in 'closed' state no matter if fclose succeed or not.
+ And cleanup could be continued.
+ https://bugzilla.gnome.org/show_bug.cgi?id=757596
+
2015-11-01 00:04:27 +1100 Jan Schmidt <jan@centricular.com>
* gst/gstpad.c:
@@ -165,66 +809,20 @@
Allow deactivation in pull-mode, since that implies we
had a peer, activated in pull mode, then the peer disa-peer-ed ;)
-=== release 1.6.1 ===
+2015-10-28 17:31:07 -0300 Thiago Santos <thiagoss@osg.samsung.com>
-2015-10-30 16:38:10 +0200 Sebastian Dröge <sebastian@centricular.com>
+ * gst/gstelement.c:
+ * gst/gstelementfactory.c:
+ element: emit tracer's element-new hook from 'constructed'
+ It allows to properly emitting it for all newly created elements
+ https://bugzilla.gnome.org/show_bug.cgi?id=757045
- * ChangeLog:
- * NEWS:
- * RELEASE:
- * configure.ac:
- * docs/plugins/inspect/plugin-coreelements.xml:
- * gstreamer.doap:
- * win32/common/config.h:
- * win32/common/gstversion.h:
- Release 1.6.1
+2015-10-28 06:03:39 -0300 Thiago Santos <thiagoss@osg.samsung.com>
-2015-10-30 16:18:50 +0200 Sebastian Dröge <sebastian@centricular.com>
-
- * po/af.po:
- * po/az.po:
- * po/be.po:
- * po/bg.po:
- * po/ca.po:
- * po/da.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/hr.po:
- * po/hu.po:
- * po/id.po:
- * po/it.po:
- * po/ja.po:
- * po/lt.po:
- * po/nb.po:
- * po/pt_BR.po:
- * po/ro.po:
- * po/rw.po:
- * po/sk.po:
- * po/sl.po:
- * po/sq.po:
- * po/sr.po:
- * po/sv.po:
- * po/tr.po:
- * po/zh_TW.po:
- Update .po files
-
-2015-10-30 14:09:00 +0200 Sebastian Dröge <sebastian@centricular.com>
-
- * po/cs.po:
- * po/de.po:
- * po/nl.po:
- * po/pl.po:
- * po/ru.po:
- * po/uk.po:
- * po/vi.po:
- * po/zh_CN.po:
- po: Update translations
+ * plugins/tracers/gststats.c:
+ stats: log the element-new hook properly
+ To be able to get the time the elements were created instead of
+ just logging them without a time
2015-10-28 18:04:46 +0200 Sebastian Dröge <sebastian@centricular.com>
@@ -233,12 +831,191 @@
Without this, flushing might not unblock the streaming thread and cause deadlocks.
https://bugzilla.gnome.org/show_bug.cgi?id=757257
+2015-10-28 13:04:25 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst/gstpad.c:
+ pad: Document the order in which pad probes are called
+ https://bugzilla.gnome.org/show_bug.cgi?id=757197
+
+2015-10-27 18:05:05 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst/gstpad.c:
+ pad: Append hooks instead of prepending to call them in the order they were added
+ https://bugzilla.gnome.org/show_bug.cgi?id=757197
+
+2015-10-26 12:50:12 +0100 Stian Selnes <stian@pexip.com>
+
+ * libs/gst/net/gstnetaddressmeta.c:
+ * libs/gst/net/gstnetaddressmeta.h:
+ * win32/common/libgstnet.def:
+ netaddressmeta: gst_buffer_get_net_address_meta() as function
+ Implement gst_buffer_get_net_address_meta() as a function instead
+ of a macro in order to get gobject-introspection to work.
+ https://bugzilla.gnome.org/show_bug.cgi?id=702921
+
+2015-10-26 18:07:11 +0530 Nirbheek Chauhan <nirbheek@centricular.com>
+
+ * gst/gstbuffer.h:
+ buffer: flesh out docs for gst_buffer_make_writable() a little
+ There is a similar explanation in gst_caps_make_writable, but the existing
+ documentation can be misleading since it does not define what 'is already
+ writable' means.
+ Also note when this function is meant to be used.
+
+2015-10-26 17:35:34 +0530 Nirbheek Chauhan <nirbheek@centricular.com>
+
+ * gst/gstcaps.c:
+ caps: clarify docs for a few functions that they don't update things in-place
+ It is not necessarily clear from the existing introspection tags and
+ documentation alone.
+
+2015-10-27 08:48:07 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * plugins/elements/gstqueue.c:
+ * plugins/elements/gstqueue2.c:
+ queue/queue2: Use GST_BUFFER_DTS_OR_PTS
+ The input of queue/queue2 might have DTS set, in which cas we want
+ to take that into account (instead of the PTS) to calculate position
+ and queue levels.
+ https://bugzilla.gnome.org/show_bug.cgi?id=756507
+
+2015-10-13 17:20:26 +0200 Edward Hervey <edward@centricular.com>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Use buffer DTS if present, else PTS
+ In order to accurately determine the amount (in time) of data
+ travelling in queues, we should use an increasing value.
+ If buffers are encoded and potentially reordered, we should be
+ using their DTS (increasing) and not PTS (reordered)
+ https://bugzilla.gnome.org/show_bug.cgi?id=756507
+
+2015-10-27 08:33:41 +0100 Edward Hervey <bilboed@bilboed.com>
+
+ * libs/gst/base/gstcollectpads.c:
+ collectpads: Use GST_BUFFER_DTS_OR_PTS
+ Simplifies code a bit
+
+2015-10-26 07:59:54 +0100 Edward Hervey <edward@centricular.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstbuffer.h:
+ buffer: Add a GST_BUFFER_DTS_OR_PTS macro
+ API: GST_BUFFER_DTS_OR_PTS
+ Many scenarios/elements require dealing with streams of buffers that
+ might have DTS set (i.e. encoded data, potentially reordered)
+ To simplify getting the increasing "timestamp" of those buffers, create
+ a macro that will return the DTS if valid, and if not the PTS
+
+2015-10-06 12:21:04 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * docs/gst/gstreamer-sections.txt:
+ doc: add GST_{PTR,SEGMENT}_FORMAT
+ Very useful formats in debug output so best to have them in the
+ generated doc.
+ https://bugzilla.gnome.org/show_bug.cgi?id=756115
+
+2015-10-26 10:53:35 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst/gstsegment.c:
+ segment: Return -1 if gst_segment_to_stream_time_full() considers the position not inside the segment
+ Fixes GstPipeline unit test.
+ https://bugzilla.gnome.org/show_bug.cgi?id=756564
+
+2015-10-24 16:52:44 +0100 Florin Apostol <florin.apostol@oregan.net>
+
+ * gst/gsturi.c:
+ uri: fix behaviour for merging uris ending in .. without following /
+ https://bugzilla.gnome.org/show_bug.cgi?id=757065
+
2015-10-24 16:43:59 +0100 Florin Apostol <florin.apostol@oregan.net>
* tests/check/gst/gsturi.c:
uri: tests: added unit test for streams ending in .. without following /
https://bugzilla.gnome.org/show_bug.cgi?id=757065
+2015-08-27 12:43:28 +0200 Thibault Saunier <tsaunier@gnome.org>
+
+ * gst/gstdebugutils.c:
+ debug: Dump pad properties values
+ Currently we only show element properties values, we should also show
+ pad properties values
+ https://bugzilla.gnome.org/show_bug.cgi?id=754166
+
+2015-10-23 20:04:42 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst/gstsegment.c:
+ segment: Remove leftover debug g_print()
+
+2015-10-15 14:49:37 +0300 Vivia Nikolaidou <vivia@ahiru.eu>
+
+ * docs/design/part-synchronisation.txt:
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstsegment.c:
+ * gst/gstsegment.h:
+ * tests/check/gst/gstsegment.c:
+ * win32/common/libgstreamer.def:
+ segment: Add _full variants of all stream/running_time from/to segment position functions
+ See formula clarifications in design docs for calculation details.
+ https://bugzilla.gnome.org/show_bug.cgi?id=756564
+
+2015-09-26 01:29:07 +0300 Vivia Nikolaidou <vivia@toolsonair.com>
+
+ * scripts/gst-uninstalled:
+ gst-uninstalled: Added env var for uninstalled PTP helper
+ https://bugzilla.gnome.org/show_bug.cgi?id=755651
+
+2015-10-22 12:00:42 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * libs/gst/base/gstbasesink.h:
+ basesink: rename argument of PREROLL_{COND,LOCK} macros
+ They take a GstBaseSink instance as argument at not a GstPad. Rename the
+ argument to 'obj' which is not miss leading and in line with
+ GST_BASE_SINK_PAD(obj).
+ https://bugzilla.gnome.org/show_bug.cgi?id=756954
+
+2015-10-22 10:05:14 +0200 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com>
+
+ * gst/gstcontrolsource.c:
+ gstcontrolsource: Add missing (out) annotation
+
+2015-10-21 14:34:47 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * common:
+ Automatic update of common submodule
+ From b99800a to b319909
+
+2015-10-21 14:49:49 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst/gstpad.c:
+ pad: Fix docs/annotation of gst_pad_probe_info_get_buffer_list()
+ It's not get_bufferlist(). Because of that it was ignored by the docs and
+ G-I, leading to crashes because of broken ownership transfer.
+ https://bugzilla.gnome.org/show_bug.cgi?id=756898
+
+2015-10-20 17:29:42 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * configure.ac:
+ * gst/gstpad.c:
+ * libs/gst/base/gstbasetransform.c:
+ Use new GST_ENABLE_EXTRA_CHECKS #define
+ https://bugzilla.gnome.org/show_bug.cgi?id=756870
+
+2015-10-21 14:25:40 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * README:
+ * common:
+ Automatic update of common submodule
+ From 9aed1d7 to b99800a
+
+2015-10-20 13:46:24 +0100 Luis de Bethencourt <luisbg@osg.samsung.com>
+
+ * tools/gst-stats.c:
+ stats: always free log
+ We always want to free the open file log if fopen() succeeded. Independently
+ of if fgets() succeeds or fails.
+ CID 1326055
+ https://bugzilla.gnome.org/show_bug.cgi?id=756864
+
2015-10-19 16:50:51 +0300 Vivia Nikolaidou <vivia@ahiru.eu>
* gst/gstsegment.c:
@@ -259,34 +1036,14 @@
B.timestamp = S.stop - (stream_time - S.time) / ABS (S.applied_rate)
https://bugzilla.gnome.org/show_bug.cgi?id=756810
-2015-09-25 15:57:16 +0300 Vivia Nikolaidou <vivia@toolsonair.com>
+2015-10-19 21:39:19 +0200 Stefan Sauer <ensonic@users.sf.net>
- * gst/gstsegment.c:
- segment: gst_segment_to_stream_time: Renamed 'result' to 'stream_time'
- Renamed the "result" variable to "stream_time" for better readability.
-
-2015-10-24 16:52:44 +0100 Florin Apostol <florin.apostol@oregan.net>
-
- * gst/gsturi.c:
- uri: fix behaviour for merging uris ending in .. without following /
- https://bugzilla.gnome.org/show_bug.cgi?id=757065
-
-2015-10-21 14:49:49 +0300 Sebastian Dröge <sebastian@centricular.com>
-
- * gst/gstpad.c:
- pad: Fix docs/annotation of gst_pad_probe_info_get_buffer_list()
- It's not get_bufferlist(). Because of that it was ignored by the docs and
- G-I, leading to crashes because of broken ownership transfer.
- https://bugzilla.gnome.org/show_bug.cgi?id=756898
-
-2015-10-17 22:13:08 +0300 Sebastian Dröge <sebastian@centricular.com>
-
- * gst/gstbin.c:
- bin: Make sure to free all cached messages when going to NULL
- An ASYNC READY->PAUSED might have failed without the bin code noticing during
- the state change, in which case we will never get PAUSED->READY and would leak
- messages.
- https://bugzilla.gnome.org/show_bug.cgi?id=756611
+ * docs/design/draft-tracing.txt:
+ * docs/plugins/gstreamer-plugins-docs.sgml:
+ * gst/gsttracerutils.c:
+ tracer: rename the envvar to GST_TRACER_PLUGINS
+ The subsystem reused the GST_TRACE var that is allready in use by the alloc tracer.
+ Fixes #756760
2015-10-15 16:32:42 +0200 Edward Hervey <edward@centricular.com>
@@ -305,6 +1062,61 @@
This would result in that thread never being woken up
https://bugzilla.gnome.org/show_bug.cgi?id=756645
+2015-09-26 18:16:07 +0800 Ting-Wei Lan <lantw@src.gnome.org>
+
+ * gst/gstutils.h:
+ gstutils: Fix build with clang -Werror=cast-align
+ https://bugzilla.gnome.org/show_bug.cgi?id=755657
+
+2015-10-17 22:13:08 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst/gstbin.c:
+ bin: Make sure to free all cached messages when going to NULL
+ An ASYNC READY->PAUSED might have failed without the bin code noticing during
+ the state change, in which case we will never get PAUSED->READY and would leak
+ messages.
+ https://bugzilla.gnome.org/show_bug.cgi?id=756611
+
+2015-10-16 15:59:49 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * docs/gst/running.xml:
+ * gst/gstdebugutils.h:
+ * tools/gst-launch.1.in:
+ docs: mention xdot utility to view .dot files directly
+
+2015-10-16 12:00:50 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * gst/gsttrace.c:
+ alloctrace: show details of events and messages leaked
+ So it's clearer what leaked.
+
+2015-10-16 11:54:18 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * docs/manual/advanced-metadata.xml:
+ docs: manual: improve advanced metadata example a bit
+ Accept both filename and a URI as argument, and print
+ the error from the error message if there's an error.
+ https://bugzilla.gnome.org/show_bug.cgi?id=756630
+
+2015-10-15 19:05:21 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * gst/gstmemory.h:
+ memory: fix typo in documentation
+ It should be 1.2 unless this is a flag from the future
+
+2015-09-15 18:08:18 +0200 Edward Hervey <edward@centricular.com>
+
+ * plugins/elements/gstmultiqueue.c:
+ multiqueue: Accept STREAM_START after EOS
+ In the same way core now allows STREAM_START to remove the flushing
+ state from pads, we need to do the same thing in multiqueue
+
+2015-10-14 11:03:22 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * tests/check/gst/gstsegment.c:
+ segment: Convert function to macro in unit test to get proper line numbers on failures
+ https://bugzilla.gnome.org/show_bug.cgi?id=748316
+
2015-10-12 17:29:26 +0200 Edward Hervey <edward@centricular.com>
* libs/gst/base/gstbaseparse.c:
@@ -312,22 +1124,17 @@
Our current position has nothing to do with being linked or not.
Avoids having stray segment updates fired every 2s
-2015-10-05 21:29:49 +0200 Stefan Sauer <ensonic@users.sf.net>
+2015-10-07 22:55:44 +0100 Florin Apostol <florin.apostol@oregan.net>
- * tests/check/gst/gsttag.c:
- tests: fix the tag test
- The previous change (see bgo #756069) was causing us to free the same pointer
- multiple times. If we actually get a sample back, the test fails, no need to
- free anything in that case.
+ * gst/gstpad.c:
+ pad: fix memory leak when sending events to an EOS pad
+ https://bugzilla.gnome.org/show_bug.cgi?id=756208
-2015-10-05 11:12:47 +0900 Vineeth TM <vineeth.tm@samsung.com>
+2015-10-07 12:01:16 +0100 Sebastian Dröge <sebastian@centricular.com>
- * tests/check/gst/gsttag.c:
- * tools/gst-launch.c:
- tests/gst-launch: Fix sample memory leak
- When sample is got using gst_tag_list_get_sample_index, it should
- be free'd.
- https://bugzilla.gnome.org/show_bug.cgi?id=756069
+ * plugins/tracers/Makefile.am:
+ tracers: Only link against libgstprintf.la if the debugging system is enabled
+ It does not exist otherwise and linking will fail.
2015-10-07 11:25:52 +0100 Sebastian Dröge <sebastian@centricular.com>
@@ -338,6 +1145,660 @@
struct sockaddr ifru_addr;
https://bugzilla.gnome.org/show_bug.cgi?id=756136
+2015-10-07 12:22:34 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * configure.ac:
+ * plugins/tracers/Makefile.am:
+ * plugins/tracers/gstrusage.c:
+ * plugins/tracers/gsttracers.c:
+ Revert "tracers: Only build getrusage() tracer if RUSAGE_THREAD is available"
+ This reverts commit 8ddbf76626a48420306869db1d171f854cc25310.
+
+2015-10-07 12:21:56 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * plugins/tracers/gstrusage.c:
+ tracers/rusage: ifdef the RUSAGE_THREAD usage
+ Some versions of andoid don't seem to have it.
+
+2015-10-07 11:11:30 +0100 Sebastian Dröge <sebastian@centricular.com>
+
+ * configure.ac:
+ * plugins/tracers/Makefile.am:
+ * plugins/tracers/gstrusage.c:
+ * plugins/tracers/gsttracers.c:
+ tracers: Only build getrusage() tracer if RUSAGE_THREAD is available
+
+2015-10-06 21:46:55 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * win32/common/libgstreamer.def:
+ win32: remove gst_tracer_quark_id_get_type
+ Revert addition from 777bbeea605051ae3d2fa7e02ad8589001e78ce0.
+
+2015-10-06 18:52:38 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gsttracer.h:
+ * gst/gsttracerutils.h:
+ tracer: move prototype to the right header
+ Fixes the build when the tracing subsystem is disabled.
+
+2015-10-06 18:49:46 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gst.c:
+ * gst/gsttracerutils.h:
+ tracer: mark GstTracerQuarkId as non GEnum
+ This reverts 72ca02b1de4066eeae35c891e275386770117778 and marks the enum
+ accordingly.
+
+2015-10-06 18:46:24 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * plugins/tracers/Makefile.am:
+ * plugins/tracers/gsttracers.c:
+ tracers: disable the log tracer if debug logging is disabled
+
+2015-10-06 18:45:41 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * plugins/tracers/Makefile.am:
+ makefile.am: Remove obsolete Android build cruft
+ This is not needed any longer.
+
+2015-10-06 14:01:03 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gsttracerutils.h:
+ tracer: fix the build with debug (tracer) disabled
+ Sync the macro definitions. The dummy defines has argument mismatches.
+
+2015-10-06 11:39:33 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gsttracerutils.h:
+ tracer: fix the build with debug (tracer) disabled
+ Remove commas at the end of the macros.
+
+2015-09-01 16:39:30 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * plugins/tracers/gststats.c:
+ tracers: stats: add message structure to output
+ The name of the message is not enough. For example, state-change
+ is not enough to know the transition.
+ https://bugzilla.gnome.org/show_bug.cgi?id=754496
+
+2015-10-05 19:05:58 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * gst/gst.c:
+ gst: adding tracer quark id to gst init and deinit
+ Fixes issues at make check
+
+2015-10-05 18:50:48 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * win32/common/libgstreamer.def:
+ win32: libgstreamer: add tracer functions
+
+2015-10-05 21:29:49 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * tests/check/gst/gsttag.c:
+ tests: fix the tag test
+ The previous change (see bgo #756069) was causing us to free the same pointer
+ multiple times. If we actually get a sample back, the test fails, no need to
+ free anything in that case.
+
+2015-06-04 01:50:34 +0200 Marcin Kolny <marcin.kolny@flytronic.pl>
+
+ * docs/design/draft-tracing.txt:
+ * gst/gstbin.c:
+ * gst/gstelement.c:
+ * gst/gstelementfactory.c:
+ * gst/gstpad.c:
+ * gst/gsttracerutils.c:
+ * gst/gsttracerutils.h:
+ tracer: add missing hooks
+ Add following hooks: element-new, element-add-pad, element-remove-pad,
+ bin-add-pre, bin-add-post, bin-remove-pre, bin-remove-post, pad-link-pre,
+ pad-link-post, pad-unlink-pre, pad-unlink-post.
+ https://bugzilla.gnome.org/show_bug.cgi?id=733187
+
+2015-03-13 18:31:40 +0000 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * plugins/tracers/gststats.c:
+ tracer: gststats: add thread-id to log line
+
+2015-03-13 13:10:42 +0000 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * gst/gstpad.c:
+ * gst/gsttracerutils.c:
+ * gst/gsttracerutils.h:
+ * plugins/tracers/gststats.c:
+ tracer: add pad query hooks
+
+2015-01-15 06:32:48 +0100 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com>
+
+ * gst/gsttracer.c:
+ tracer: strdup the passed parameters.
+
+2015-01-13 22:11:34 +0100 Mathieu Duponchelle <mathieu.duponchelle@opencreed.com>
+
+ * plugins/tracers/gstlog.c:
+ tracer: Use GST_TIME_ARGS when printing with GST_TIME_FORMAT.
+
+2014-10-16 10:42:05 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * docs/design/draft-tracing.txt:
+ tracing: update docs
+
+2014-10-02 19:52:03 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * plugins/tracers/gststats.c:
+ * tools/gst-stats.c:
+ stats: TIMESTAMP -> PTS
+
+2014-09-22 09:55:56 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gst.c:
+ * gst/gsttracer.h:
+ * gst/gsttracerutils.c:
+ * gst/gsttracerutils.h:
+ * plugins/tracers/gstlatency.c:
+ * plugins/tracers/gstlog.c:
+ * plugins/tracers/gstrusage.c:
+ * plugins/tracers/gststats.c:
+ tracing: rename the global api to gst_tracing
+ This makes it more obvious what is the api for tracer elements and what is api
+ for the global state.
+
+2014-09-18 08:28:48 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * tools/gst-stats.c:
+ stats: fix cpu stats printing
+ Only print them if we have them. Also scale them by 10.0 as the are in
+ per-mille now.
+
+2014-09-18 08:26:19 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gsttracer.h:
+ * gst/gsttracerutils.c:
+ * gst/gsttracerutils.h:
+ * plugins/tracers/gstlatency.c:
+ * plugins/tracers/gstlog.c:
+ * plugins/tracers/gstrusage.c:
+ * plugins/tracers/gststats.c:
+ tracers: eliminate var_args
+ Register tracer hooks as GCallback. Use macros for hook dispatch and cast the
+ hook functions back to the appropriate type.
+
+2014-09-17 09:41:46 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * tools/gst-stats.c:
+ stats: don't warn on ".class" log lines
+
+2014-09-17 08:38:02 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * plugins/tracers/gstlatency.c:
+ * plugins/tracers/gstrusage.c:
+ * plugins/tracers/gstrusage.h:
+ * plugins/tracers/gststats.c:
+ * plugins/tracers/gststats.h:
+ tracers: code cleanups
+ Move static variables to instance variables. Add finalize methods. Remove code
+ that is commented out. Cleanup locking code.
+
+2014-09-15 22:27:11 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gsttracer.h:
+ * gst/gsttracerutils.c:
+ * gst/gsttracerutils.h:
+ * plugins/tracers/gstlatency.c:
+ * plugins/tracers/gstlog.c:
+ * plugins/tracers/gstrusage.c:
+ * plugins/tracers/gststats.c:
+ tracer: use GQuark or strings for the hook id
+ This way one can define new tracing probes without changing the core. We are
+ using our own quark table, as 1) we only want to initialize them if we're
+ tracing, 2) we want to share them with the tracers.
+
+2014-09-15 13:15:17 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gsttracer.c:
+ * gst/gsttracer.h:
+ * gst/gsttracerutils.c:
+ * gst/gsttracerutils.h:
+ * plugins/tracers/gstlatency.c:
+ * plugins/tracers/gstlog.c:
+ * plugins/tracers/gstrusage.c:
+ * plugins/tracers/gststats.c:
+ tracer: simplify hook api
+ Instead of a single invoke() function and a 'mask', register to individual
+ hooks. This avoids one level of indirection and allows us to remove the
+ hook enums. The message enms are now renamed to hook enums.
+
+2014-09-12 18:43:52 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gsttracer.c:
+ * gst/gsttracer.h:
+ * gst/gsttracerutils.c:
+ * plugins/tracers/gstlatency.c:
+ * plugins/tracers/gstlog.c:
+ * plugins/tracers/gstrusage.c:
+ * plugins/tracers/gststats.c:
+ tracer: drop the HookId hid from the invoke method
+ The MessageId is more detailed and anyway needed to interpret the varargs.
+
+2014-09-12 11:17:41 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * plugins/tracers/gststats.c:
+ stats: fixup doc name and remove commented code
+
+2014-09-12 08:40:01 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * plugins/tracers/gstlatency.c:
+ * plugins/tracers/gstrusage.c:
+ * plugins/tracers/gststats.c:
+ tracers: add metadata for the logged values
+
+2014-09-11 13:02:51 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * plugins/tracers/gstrusage.c:
+ rusage: improve cpu load meassurements
+ Get the number of cpus and scale process cpu-load accordingly. Switch the
+ cpuload to be per-mille to get smoother graphs. Add a bit more logging and use
+ the _OBJECT variant.
+
+2014-09-11 13:00:59 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gsttracer.c:
+ tracer: remove commented code
+
+2014-09-10 08:33:38 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * docs/design/draft-tracing.txt:
+ design: update tracer design
+ Update the tracer event classes section. Add a performance section.
+
+2014-09-10 08:32:18 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gsttracer.c:
+ tracer: use GST_PTR_FORMAT to log the structure
+ This way we only expand the structure when we're logging. This allows us to
+ meassure the pure tracing seperately from the logging.
+ Also add some comments on further improvements.
+
+2014-09-10 07:55:33 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * plugins/tracers/gstrusage.c:
+ * tools/gst-stats.c:
+ rusage: implement windowing of cpuload
+ Add a local help to the rusage plugin that supports windowing of values. We want
+ to generalize this for use in other plugins.
+
+2014-09-04 10:11:52 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * plugins/tracers/gstrusage.c:
+ * tools/gst-stats.c:
+ rusage: announce the data format
+ Rusage will now announce what is meassures and how it is logged. Use the new format in stats.
+ Cleanup the the code and naming.
+
+2014-07-28 22:08:49 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * plugins/tracers/gstrusage.c:
+ * tools/gst-stats.c:
+ stats: improve cpu load meassurements
+ Rename variables for clarity. Handle the initial disparity between debug time
+ and the time already spent in the proc and main thread.
+
+2014-07-18 08:09:32 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * docs/design/draft-tracing.txt:
+ design: update tracer design
+
+2014-07-28 08:49:38 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ quarks: revert the quark changes, we not using them anymore
+
+2014-07-18 07:49:38 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/Makefile.am:
+ * gst/gst.h:
+ * gst/gst_private.h:
+ * gst/gstelement.c:
+ * gst/gstpad.c:
+ * gst/gstregistrychunks.c:
+ * gst/gsttracer.c:
+ * gst/gsttracer.h:
+ * gst/gsttracerfactory.c:
+ * gst/gsttracerfactory.h:
+ * gst/gsttracerutils.c:
+ * gst/gsttracerutils.h:
+ * plugins/tracers/Makefile.am:
+ * plugins/tracers/gstlatency.h:
+ * plugins/tracers/gstlog.h:
+ * plugins/tracers/gstrusage.h:
+ * plugins/tracers/gststats.h:
+ tracer: split into tracer and tracerutils
+ Keep tracer base class in tracer and move core support into the utils module.
+ Add a unstable-api guard to the tracer.h so that external modules would need to
+ acknowledge the status by setting GST_USE_UNSTABLE_API.
+
+2014-07-16 18:48:52 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gsttracer.c:
+ * gst/gsttracerfactory.c:
+ * plugins/tracers/gstlatency.c:
+ * plugins/tracers/gstlog.c:
+ * plugins/tracers/gstrusage.c:
+ * plugins/tracers/gststats.c:
+ docs: add gtk-doc blobs
+
+2014-02-20 11:15:20 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * plugins/tracers/gstlatency.c:
+ latency: take stop time when buffer is handled
+ Now we meassure time from 'before buffer transfer on src' to when the 'buffer is processed on sink'.
+
+2014-07-15 09:49:23 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gsttracer.c:
+ * gst/gsttracer.h:
+ * plugins/tracers/gstlatency.c:
+ * plugins/tracers/gstrusage.c:
+ * plugins/tracers/gststats.c:
+ tracers: add a logging helper to remove identical copies from the tracers
+
+2014-02-18 16:15:44 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * plugins/tracers/gstlatency.c:
+ * plugins/tracers/gststats.c:
+ tracers: tweak the get_real_pad_parent()
+ By using the we ended up on the actual element, not the parent.
+
+2014-02-18 11:06:10 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * plugins/tracers/Makefile.am:
+ * plugins/tracers/gstlatency.c:
+ * plugins/tracers/gstlatency.h:
+ * plugins/tracers/gsttracers.c:
+ tracers: add a new latency tracer
+ Add a new tracer with pushes extra events to meassure src-to-sink processing latency.
+
+2014-02-17 18:30:24 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * docs/design/draft-tracing.txt:
+ design: update design docs
+ Add new tracer idea.
+
+2013-11-22 19:10:04 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * tools/gst-stats.c:
+ gst-stats: use the rusage stats
+ Add cpuload info from rusage traces.
+
+2013-11-20 08:22:58 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * configure.ac:
+ * plugins/tracers/Makefile.am:
+ * plugins/tracers/gstrusage.c:
+ * plugins/tracers/gstrusage.h:
+ * plugins/tracers/gsttracers.c:
+ rusage: add a new rusage tracer
+ The tracer hooks up to all probes and logs resource usage figures.
+
+2014-07-15 10:20:22 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * tools/gst-stats.c:
+ gst-stats: filter complete thread section if we have no pads
+
+2013-11-19 08:04:38 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * plugins/tracers/gststats.c:
+ * tools/gst-stats.c:
+ stats: improve the handling of parentage
+ Log new object after we did the check for parents.
+
+2013-11-17 11:37:14 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * tools/gst-stats.c:
+ stats: print thread key for stats and filter empty pad-sections
+
+2013-11-17 11:15:36 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * tools/gst-stats.c:
+ stats: update buffer flags
+ Remove some buffer flags that were leftovers from 0.10 and handle new 1.0 buffer
+ flags.
+
+2013-11-04 20:11:09 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * plugins/tracers/gststats.c:
+ * plugins/tracers/gststats.h:
+ * tools/.gitignore:
+ * tools/Makefile.am:
+ * tools/gst-stats.c:
+ stats: add a stats frontend
+ Parse the log and collect data from tracer messages.
+
+2013-11-15 09:36:21 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gsttracer.h:
+ tracer: use the same timebase as the logging
+
+2014-07-16 09:22:37 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * docs/design/draft-tracing.txt:
+ design: update design
+
+2014-07-16 09:41:48 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * plugins/tracers/gstlog.c:
+ log: add query log category
+
+2013-11-02 18:24:56 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gsttracer.c:
+ tracer: parse parameters
+
+2014-07-16 09:22:14 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gstelement.c:
+ * gst/gstpad.c:
+ * gst/gsttracer.h:
+ * plugins/tracers/Makefile.am:
+ * plugins/tracers/gstlog.c:
+ * plugins/tracers/gststats.c:
+ tracer: add more hooks and handle it in the plugins
+
+2013-10-30 08:19:41 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * plugins/tracers/gststats.c:
+ stats: handle buffer lists
+
+2013-10-30 08:04:27 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * docs/design/draft-tracing.txt:
+ * plugins/tracers/gstlog.c:
+ log: make the log tracer more verbose again
+ Define log formats per message type and print details.
+
+2013-10-28 21:59:19 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gsttracer.c:
+ * gst/gsttracer.h:
+ * plugins/tracers/gstlog.c:
+ * plugins/tracers/gststats.c:
+ tracer: use a macros for the enabled check
+ Avoid a function call and check the variables from the macro.
+
+2013-10-28 21:39:52 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * docs/design/draft-tracing.txt:
+ * gst/gstpad.c:
+ * gst/gsttracer.c:
+ * gst/gsttracer.h:
+ tracer: use macros for hooks
+ Wrap the hook with a pre and post macro. This looks less intrusive than the
+ previous version, although it is a little less optimized.
+
+2013-10-28 21:28:18 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gstpad.c:
+ * gst/gstquark.c:
+ * gst/gsttracer.c:
+ * gst/gsttracer.h:
+ * plugins/tracers/gstlog.c:
+ * plugins/tracers/gststats.c:
+ tracer: pass the timestamp directly
+ Avoid the structure mashalling (and weird field naming).
+
+2013-10-28 08:08:20 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * plugins/tracers/Makefile.am:
+ * plugins/tracers/gststats.c:
+ * plugins/tracers/gststats.h:
+ * plugins/tracers/gsttracers.c:
+ stats: add a tracer that collects pipeline statistics
+ This is more or less equiv to the the statistics in gst-tracelib.
+
+2013-10-28 08:07:52 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * plugins/tracers/gstlog.h:
+ log: add cast macro
+
+2013-10-27 20:43:25 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gsttracer.c:
+ * gst/gsttracer.h:
+ * plugins/tracers/gstlog.c:
+ tracer: pass the instance to the vmethod
+
+2013-10-27 17:05:52 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * docs/design/draft-tracing.txt:
+ * plugins/tracers/gstlog.c:
+ design: more planning
+
+2013-10-27 17:04:32 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * gst/gstpad.c:
+ * gst/gstquark.c:
+ * gst/gstquark.h:
+ * gst/gsttracer.c:
+ * gst/gsttracer.h:
+ tracer: switch to quarks and add another hook for buffer flow
+ Use pre-defines quarks as this will be called quite often.
+
+2013-10-27 12:45:54 +0100 Stefan Sauer <ensonic@users.sf.net>
+
+ * docs/design/draft-tracing.txt:
+ * gst/gsttracer.c:
+ * gst/gsttracer.h:
+ * plugins/tracers/gstlog.c:
+ tracer: add the hook-id to the invoke signature
+ Tracers that subscribe to multiple hooks can know what hook was used.
+
+2013-10-26 22:05:13 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * tools/gst-inspect.c:
+ inspect: add support for the new factory
+ Handle tracer modules.
+
+2013-10-24 14:47:48 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * configure.ac:
+ * docs/design/draft-tracing.txt:
+ * gst/Makefile.am:
+ * gst/gst.c:
+ * gst/gst.h:
+ * gst/gst_private.h:
+ * gst/gstpad.c:
+ * gst/gstregistrybinary.h:
+ * gst/gstregistrychunks.c:
+ * gst/gsttracer.c:
+ * gst/gsttracer.h:
+ * gst/gsttracerfactory.c:
+ * gst/gsttracerfactory.h:
+ * plugins/Makefile.am:
+ * plugins/tracers/.gitignore:
+ * plugins/tracers/Makefile.am:
+ * plugins/tracers/gstlog.c:
+ * plugins/tracers/gstlog.h:
+ * plugins/tracers/gsttracers.c:
+ tracer: initial prototype for the tracing subsystem
+
+2015-10-05 11:12:47 +0900 Vineeth TM <vineeth.tm@samsung.com>
+
+ * tests/check/gst/gsttag.c:
+ * tools/gst-launch.c:
+ tests/gst-launch: Fix sample memory leak
+ When sample is got using gst_tag_list_get_sample_index, it should
+ be free'd.
+ https://bugzilla.gnome.org/show_bug.cgi?id=756069
+
+2015-10-02 22:17:04 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * configure.ac:
+ * gst/gst.c:
+ * gst/gsturi.c:
+ * gst/gstvalue.c:
+ Update GLib dependency to 2.40.0
+
+2015-08-20 16:21:59 +0900 Vineeth TM <vineeth.tm@samsung.com>
+
+ * docs/manual/advanced-dataaccess.xml:
+ * docs/manual/appendix-integration.xml:
+ * docs/manual/basics-init.xml:
+ * libs/gst/helpers/gst-completion-helper.c:
+ * libs/gst/helpers/gst-ptp-helper.c:
+ * tests/benchmarks/capsnego.c:
+ * tests/examples/ptp/ptp-print-times.c:
+ * tools/gst-inspect.c:
+ * tools/gst-launch.c:
+ * tools/gst-typefind.c:
+ gstreamer: Fix memory leaks when context parse fails
+ When g_option_context_parse fails, context and error variables are not getting free'd
+ which results in memory leaks. Free'ing the same.
+ And replacing g_error_free with g_clear_error, which checks if the error being passed
+ is not NULL and sets the variable to NULL on free'ing.
+ https://bugzilla.gnome.org/show_bug.cgi?id=753851
+
+2015-09-23 23:03:29 +0200 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com>
+
+ * libs/gst/controller/gsttimedvaluecontrolsource.c:
+ timedvaluecontrolsource: Use g_sequence_lookup where possible
+ When looking for exact matches in the sequence, this results
+ in much simpler code than when using g_sequence_search.
+ https://bugzilla.gnome.org/show_bug.cgi?id=755498
+
+2015-10-01 22:09:58 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * libs/gst/controller/gstinterpolationcontrolsource.c:
+ interpolationcontrolsource: fix write over the array size
+ The '++' got incidentially added during the refactoring in
+ 2fe3939ce7ea84c45dd922e7f1097dd07f11fc5d.
+
+2015-09-30 17:29:16 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * libs/gst/controller/gsttimedvaluecontrolsource.h:
+ * 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:
+ controlpoint: change the padding to be of arch-independent size
+ The default padding I introduced in d4f81fb4e62d34a4c1dabc65b23ede7ce7694c63 is
+ actually only 4 pointers and on 32bit platforms already smaller than the union.
+ Replace it with a fixed 64byte padding. Don't add the normal padding for now.
+ Fixes #755822
+
+2015-08-21 17:42:52 +0100 Luis de Bethencourt <luisbg@osg.samsung.com>
+
+ * scripts/gst-uninstalled:
+ gstreamer-uninstalled: add path for OpenCV haar cascade files
+ Some OpenCV plugins use haar cascade files that are included in the
+ GStreamer sources. To be able to use these from uninstalled, they need
+ to be found through an environment variable.
+ Adding this environment variable pointing to haar cascade files to
+ gst-uninstalled.
+
2015-09-28 16:01:55 +0100 Tim-Philipp Müller <tim@centricular.com>
* libs/gst/check/gstcheck.c:
@@ -348,6 +1809,173 @@
format string is passed then. Fix indentation differently.
http://clang.llvm.org/docs/AttributeReference.html#format-gnu-format
+2015-09-28 16:45:47 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * tests/examples/manual/Makefile.am:
+ tests: fix the manual tests by setting the right env-vars
+
+2015-09-28 16:22:36 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * libs/gst/controller/gstdirectcontrolbinding.h:
+ directcontrolbinding: fix formatting
+
+2015-09-28 16:21:55 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * libs/gst/base/gstindex.h:
+ index: mark two structs that don't have abi padding
+
+2015-09-28 16:19:40 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * libs/gst/controller/gsttimedvaluecontrolsource.h:
+ * 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:
+ controller: add the missing abi padding
+ While this technically is an abi break, we decided to do this:
+ 1) the struct is documented to be internal
+ 2) the struct is alloced and freed inside the library
+ 3) there are no public methods that receive or return instances
+ 4) the only code known to use this struct are classes containd here
+
+2015-09-24 00:04:48 +1000 Matthew Waters <matthew@centricular.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstbin.c:
+ * gst/gstelement.c:
+ * gst/gstelement.h:
+ * tests/check/gst/gstcontext.c:
+ * win32/common/libgstreamer.def:
+ bin: implement context propagation when adding elements
+ When adding an element to a bin we need to propagate the GstContext's
+ to/from the element.
+ This moves the GstContext list from GstBin to GstElement and adds
+ convenience functions to get the currently set list of GstContext's.
+ This does not deal with the collection of GstContext's propagated
+ using GST_CONTEXT_QUERY. Element subclasses are advised to call
+ gst_element_set_context if they need to propagate GstContext's
+ received from the context query.
+ https://bugzilla.gnome.org/show_bug.cgi?id=705579
+
+2015-09-07 09:39:32 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * libs/gst/controller/gstinterpolationcontrolsource.c:
+ * libs/gst/controller/gstinterpolationcontrolsource.h:
+ * libs/gst/controller/gsttimedvaluecontrolsource.h:
+ interpolationcontrolsource: add cubic_mono interpolation
+ This new mode won't overshoot the min/max y values set by the control-points.
+ Fixes #754678
+ API: GST_INTERPOLATION_MODE_CUBIC_MONO
+
+2015-09-07 09:37:05 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * libs/gst/controller/gstinterpolationcontrolsource.c:
+ interpolationcontrolsource: refactor code
+ Extract common code that looks up the control-points around the timestamp. Add
+ some comments for future investigation.
+
+2015-09-04 16:38:37 +0200 Stefan Sauer <ensonic@users.sf.net>
+
+ * configure.ac:
+ * tests/examples/controller/.gitignore:
+ * tests/examples/controller/Makefile.am:
+ * tests/examples/controller/controller-graph.c:
+ tests/examples: add a demo for the interpolation control source modes
+ This is in preparation for new modes to be added. In particullar it demonstrates
+ how the cubic splines overshoot the range.
+
+2015-09-09 11:55:28 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * plugins/elements/gstcapsfilter.c:
+ capsfilter: remove proxying of accept-caps downstream
+ The design is to only do a local check
+
+2015-08-25 19:37:30 -0300 Thiago Santos <thiagoss@osg.samsung.com>
+
+ * gst/gstpad.c:
+ pad: don't fallback to caps queries with proxy pads
+ A proxy-pad should always proxy the caps related queries
+ and events to its down or upstream peers on the other side
+ of the element. Falling back to a caps query seems wrong.
+ https://bugzilla.gnome.org/show_bug.cgi?id=754112
+
+2015-09-26 11:03:24 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * libs/gst/check/gstharness.c:
+ harness: minor doc fixes
+
+2015-09-02 17:58:38 +0300 Vivia Nikolaidou <vivia@ahiru.eu>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstsegment.c:
+ * gst/gstsegment.h:
+ * libs/gst/base/gstbasesink.c:
+ * tests/check/gst/gstsegment.c:
+ * win32/common/libgstreamer.def:
+ segment: Replaced gst_segment_to_position with gst_segment_position_from_running_time
+ gst_segment_to_position might cause confusion, especially with the addition of
+ gst_segment_position_from_stream_time . Deprecated gst_segment_to_position
+ now, and replaced it with gst_segment_position_from_running_time.
+ Also added unit tests.
+
+2015-09-02 17:38:25 +0300 Vivia Nikolaidou <vivia@ahiru.eu>
+
+ * tests/check/gst/gstsegment.c:
+ segment: Added unit tests for gst_segment_position_from_stream_time
+
+2015-09-25 15:57:16 +0300 Vivia Nikolaidou <vivia@toolsonair.com>
+
+ * gst/gstsegment.c:
+ segment: gst_segment_to_stream_time: Renamed 'result' to 'stream_time'
+ Renamed the "result" variable to "stream_time" for better readability.
+
+2015-09-25 15:56:45 +0300 Vivia Nikolaidou <vivia@toolsonair.com>
+
+ * docs/gst/gstreamer-sections.txt:
+ * gst/gstsegment.c:
+ * gst/gstsegment.h:
+ * win32/common/libgstreamer.def:
+ segment: Added gst_segment_position_from_stream_time()
+ gst_segment_position_from_stream_time() will convert stream time into a
+ position in the segment so that gst_segment_to_stream_time() with that
+ position returns the same stream time. It will return -1 if the stream time
+ given is not inside the segment.
+
+2015-09-02 16:36:35 +0300 Vivia Nikolaidou <vivia@ahiru.eu>
+
+ * docs/design/part-synchronisation.txt:
+ * gst/gstsegment.h:
+ segment: Rewording of struct field descriptions
+ The new wording makes it easier to understand exactly what each field of the
+ GstSegment struct represents.
+
+2015-08-31 15:35:11 +0300 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst/gstevent.c:
+ event: Make sure that timestamp + diff in QoS events is never smaller than 0
+ When a running-time-offset is stored in the event, it could become smaller
+ than 0 although the event is otherwise correct. This can happen when pad
+ offsets are used.
+ To prevent this, we set the timestamp to -diff, so that in the end the sum of
+ both is exactly 0.
+ https://bugzilla.gnome.org/show_bug.cgi?id=754356
+
+2015-09-16 23:40:44 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * tests/check/gst/gsturi.c:
+ uri: Add test for correct absolute URI handling in gst_uri_from_string_with_base()
+ If the second parameter is an absolute URI, the base should have no effect and
+ the second parameter should be returned again.
+ https://bugzilla.gnome.org/show_bug.cgi?id=755134
+
+2015-09-25 23:51:03 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * configure.ac:
+ Back to development
+
=== release 1.6.0 ===
2015-09-25 23:14:33 +0200 Sebastian Dröge <sebastian@centricular.com>
diff --git a/Makefile.in b/Makefile.in
index 7e49416..d4aa3aa 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -404,6 +404,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
@@ -1262,6 +1264,9 @@
@if [ -d ../www/data/src ]; then \
mv -v $(PACKAGE)-$(VERSION).tar.xz ../www/data/src/$(PACKAGE)/ ; \
mv -v $(PACKAGE)-$(VERSION).tar.xz.sha256sum ../www/data/src/$(PACKAGE)/ ; \
+ elif [ -d ../../www/data/src ]; then \
+ mv -v $(PACKAGE)-$(VERSION).tar.xz ../../www/data/src/$(PACKAGE)/ ; \
+ mv -v $(PACKAGE)-$(VERSION).tar.xz.sha256sum ../../www/data/src/$(PACKAGE)/ ; \
fi
@echo "================================================================================================="
diff --git a/NEWS b/NEWS
index be30e41..a4bffc6 100644
--- a/NEWS
+++ b/NEWS
@@ -1,37 +1,2 @@
-This is GStreamer 1.6.2
-
-The GStreamer team is proud to announce the second bugfix release in the stable
-1.6 release series of your favourite cross-platform multimedia framework!
-
-This release only contains bugfixes and it is safe to update from 1.6.0 and
-1.6.1. For a full list of bugfixes see Bugzilla:
- https://bugzilla.gnome.org/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&limit=0&list_id=83309&order=bug_id&product=GStreamer&resolution=FIXED&target_milestone=1.6.2
-
-See http://gstreamer.freedesktop.org/releases/1.6/ for the latest version of this document.
-
-Major bugfixes
-
-- Crashes in gst-libav with sinks that did not provide a buffer pool
- but supported video metadata were fixed. This affected d3dvideosink
- and some 3rd party sinks. Also related fixes for crashes when a downstream
- buffer pool failed allocation.
-- Big GL performance improvement on iOS by a factor of 2 by using Apple's sync
- extension.
-- Deadlocks in the DirectSound elements on Windows, and the behaviour of its
- mute property were fixed.
-- The Direct3D video sink does not crash anymore when minimizing the window
-- The library soname generation on Android >= 6.0 was fixed, which previously
- caused GStreamer to fail to load there.
-- File related elements have large-file (>2GB) support on Android now.
-- gst-libav was updated to ffmpeg 2.8.3.
-- Deserialization of custom events in the GDP depayloader was fixed.
-- Missing OpenGL context initialization in the Qt/QML video sink was fixed in
- certain situations.
-- Interoperability with some broken RTSP servers using HTTP tunnel was
- improved.
-- Various compilation fixes for Windows.
-- Various smaller memory leak and other fixes in different places.
-- and many, many more:
- https://bugzilla.gnome.org/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&limit=0&list_id=83309&order=bug_id&product=GStreamer&resolution=FIXED&target_milestone=1.6.2
-
+This is GStreamer 1.7.1
diff --git a/README b/README
index f175b1b..fa53f95 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-GStreamer 1.5.x development series
+GStreamer 1.7.x development series
WHAT IT IS
----------
diff --git a/RELEASE b/RELEASE
index b63665b..12fd6db 100644
--- a/RELEASE
+++ b/RELEASE
@@ -1,14 +1,19 @@
-Release notes for GStreamer 1.6.2
+
+Release notes for GStreamer 1.7.1
-The GStreamer team is proud to announce the second bugfix release in the stable
-1.6 release series of your favourite cross-platform multimedia framework!
+The GStreamer team is pleased to announce the first release of the unstable
+1.7 release series. The 1.7 release series is adding new features on top of
+the 1.0, 1.2, 1.4 and 1.6 series and is part of the API and ABI-stable 1.x release
+series of the GStreamer multimedia framework. The unstable 1.7 release series
+will lead to the stable 1.8 release series in the next weeks. Any newly added
+API can still change until that point.
-This release only contains bugfixes and it is safe to update from 1.6.0 and 1.6.1. For a
-full list of bugfixes see Bugzilla.
-See http://gstreamer.freedesktop.org/releases/1.6/
-for the full release notes.
+Binaries for Android, iOS, Mac OS X and Windows will be provided separately
+during the unstable 1.7 release series.
+
+
This module, gstreamer, only contains core functionality.
For actual media playback, you will need other modules.
@@ -28,12 +33,58 @@
contains a set of codecs plugins based on libav (formerly gst-ffmpeg)
+
+
+
Bugs fixed in this release
- * 756950 : Error raised when calling get_value method
- * 758029 : Install race in helpers
- * 758276 : queue2: custom http-headers event sent by souphttpsrc causes g_warning in ring-buffer mode
- * 759019 : gst-launch-1.0 returns 0 exit code on async error during playback
+ * 600648 : multiqueue: queues up too much data, excessive memory use with subtitle streams
+ * 755822 : test_ABI: failed ABI check
+ * 702921 : [pygi] python applications cannot interpret buffer metadata
+ * 733187 : integrating the tracer branch
+ * 744040 : bin: Deadlock when sending event
+ * 753851 : gstreamer: Fix memory leaks when context parse fails.
+ * 754112 : pad: don't fallback to caps queries with proxy pads
+ * 754166 : debug: Dump pad properties values
+ * 754356 : event: Make sure that timestamp + diff in QoS events is never smaller than 0
+ * 754418 : segment: Added gst_segment_position_from_stream_time()
+ * 754457 : segment: Rewording of struct field descriptions
+ * 754464 : Add support for g_autoptr() and friends
+ * 754496 : tracer: stats: log message structures
+ * 754678 : controller: the cubic interpolation we have implemented can overshoot min/max of the control-point values
+ * 755498 : timedvaluecontrolsource: Use g_sequence_lookup where possible
+ * 755651 : gst-uninstalled: Added env var for uninstalled PTP helper
+ * 755657 : Fix -Werror build for clang
+ * 755832 : interpolationcontrolsource: memory corruption due to wrong assignment
+ * 756208 : pad: memory leak when pushing events to an EOS pad
+ * 756507 : multiqueue: Use buffer DTS if present, else PTS
+ * 756564 : segment: Don't return -1 for out-of-segment values in running/stream-time conversion functions
+ * 756760 : Tracer framework reuses existing GST_TRACE environment variable
+ * 756864 : stats: memory leak when fgets() fails
+ * 756870 : Don't disable assertions for releases and provide a new GST_ENABLE_EXTRA_CHECKS #define
+ * 756954 : basesink: rename 'pad' arg in LOCK/COND macros
+ * 757045 : tracer: Emit 'element-new' hook when using parse_launch
+ * 757193 : multiqueue: Handle negative DTS
+ * 757197 : pad: Append hooks instead of prepending to call them in the order they were added
+ * 757353 : multiqueue: Fix high_time computation
+ * 757596 : filesink: left in half cleaned in case of fclose failure
+ * 757821 : New GstPadEventFunction which returns a GstFlowReturn
+ * 758012 : systemclock: Use mach_time on Apple platforms
+ * 758078 : plugin: Dependency hash does not work with 32 or more files
+ * 758080 : plugin: Allow using device nodes as plugin dependency
+ * 758083 : plugin: Add prefix support to dependencies
+ * 758207 : debugutils: Fix string memory leak
+ * 758340 : tests: funnel test is racy
+ * 758541 : gstinfo: Fix ISO non-standard predefined identifier warning for __FUNCTION__ when compiled with gcc 5 -Wpedantic
+ * 758870 : clock: GST_STIME_ARGS does not handle GST_CLOCK_STIME_NONE
+ * 759055 : baseparse: post tag list updates on percentage delta instead of fixed delta
+ * 759089 : Add a fallback that copies the commit hook in autogen.sh
+ * 759125 : GstBin: async-handling latency handling is decoupled from parent pipeline
+ * 759300 : element: unref message in _post_message when there is no implementation
+ * 759430 : queue: Illegal memory access of sink event
+ * 759503 : Stopping a stream very soon after starting asserts
+ * 759713 : -Bsymbolic configure check doesn't work on FreeBSD.
+ * 751182 : identity: allow dropping buffers with specified flags
==== Download ====
@@ -70,12 +121,40 @@
Contributors to this release
+ * Aleix Conchillo Flaqué
+ * Anton Bondarenko
+ * Athanasios Oikonomou
+ * Aurélien Zanelli
+ * Duncan Palmer
+ * Edward Hervey
+ * Florin Apostol
+ * Guillaume Desmottes
+ * Heinrich Fink
+ * Jan Alexander Steffens (heftig)
* Jan Schmidt
+ * Koop Mast
+ * Luis de Bethencourt
+ * Lukasz Forynski
+ * Marcin Kolny
+ * Mathieu Duponchelle
+ * Matthew Waters
+ * Miguel París Díaz
* Nicolas Dufresne
+ * Nirbheek Chauhan
+ * Philippe Normand
+ * Ravi Kiran K N
* Reynaldo H. Verdejo Pinochet
* Ross Burton
* Sebastian Dröge
+ * Stefan Sauer
+ * Stian Selnes
* Thiago Santos
* Thibault Saunier
* Tim-Philipp Müller
-
+ * Ting-Wei Lan
+ * Vincent Penquerc'h
+ * Vineeth TM
+ * Vivia Nikolaidou
+ * Wim Taymans
+ * Xavier Claessens
+
\ No newline at end of file
diff --git a/autogen.sh b/autogen.sh
index ed7101d..8961a1d 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -37,7 +37,11 @@
if test ! \( -x .git/hooks/pre-commit -a -L .git/hooks/pre-commit \);
then
rm -f .git/hooks/pre-commit
- ln -s ../../common/hooks/pre-commit.hook .git/hooks/pre-commit
+ if ! ln -s ../../common/hooks/pre-commit.hook .git/hooks/pre-commit 2> /dev/null
+ then
+ echo "Failed to create commit hook symlink, copying instead ..."
+ cp common/hooks/pre-commit.hook .git/hooks/pre-commit
+ fi
fi
# GNU gettext automake support doesn't get along with git.
diff --git a/common/Makefile.in b/common/Makefile.in
index c37a36c..37b5c55 100644
--- a/common/Makefile.in
+++ b/common/Makefile.in
@@ -333,6 +333,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/common/check.mak b/common/check.mak
index 8a90b5d..25a16e6 100644
--- a/common/check.mak
+++ b/common/check.mak
@@ -57,7 +57,7 @@
--show-possibly-lost=no \
--leak-resolution=high --num-callers=20 \
./$* 2>&1 | tee $$valgrind_log ; \
- if grep "==" $$valgrind_log > /dev/null 2>&1; then \
+ if grep "^==" $$valgrind_log > /dev/null 2>&1; then \
rm $$valgrind_log; \
exit 1; \
fi ; \
diff --git a/common/gst.supp b/common/gst.supp
index 81f98a9..2740e9a 100644
--- a/common/gst.supp
+++ b/common/gst.supp
@@ -3976,7 +3976,6 @@
{
closures aren't valgrind friendly (bgo#739850)
Memcheck:Leak
- match-leak-kinds: possible
fun:calloc
...
fun:g_cclosure_new
@@ -3985,7 +3984,6 @@
{
closures aren't valgrind friendly (bgo#739850)
Memcheck:Leak
- match-leak-kinds: possible
fun:malloc
...
fun:g_closure_add_invalidate_notifier
@@ -3994,7 +3992,6 @@
{
closures aren't valgrind friendly (bgo#739850)
Memcheck:Leak
- match-leak-kinds: possible
fun:calloc
...
fun:g_closure_new_simple
@@ -4020,3 +4017,12 @@
Memcheck:Addr8
fun:do_lookup_x
}
+
+{
+ <quark tables are leaked on purpose when they are expanded, observed with glib 2.46 and gst-rtsp-server tests>
+ Memcheck:Leak
+ fun:malloc
+ ...
+ fun:g_quark_init
+ fun:glib_init_ctor
+}
diff --git a/common/m4/Makefile.in b/common/m4/Makefile.in
index 6861659..5f05efd 100644
--- a/common/m4/Makefile.in
+++ b/common/m4/Makefile.in
@@ -273,6 +273,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/common/m4/gst-args.m4 b/common/m4/gst-args.m4
index b478c82..0628123 100644
--- a/common/m4/gst-args.m4
+++ b/common/m4/gst-args.m4
@@ -358,3 +358,29 @@
fi
])
])
+
+dnl Enable extra checks by default only for development versions
+AC_DEFUN([AG_GST_ARG_ENABLE_EXTRA_CHECKS],
+[
+ AC_ARG_ENABLE(extra-check,
+ AC_HELP_STRING([--enable-extra-checks],
+ [Enable extra runtime checks]),
+ [
+ case "${enableval}" in
+ yes) EXTRA_CHECKS=yes ;;
+ no) EXTRA_CHECKS=no ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --enable-extra-checks) ;;
+ esac
+ ],
+ [
+ if test "x`expr $PACKAGE_VERSION_MINOR % 2`" = "x1" -a "x`expr $PACKAGE_VERSION_MICRO '<' 90`" = "x1"; then
+ EXTRA_CHECKS=yes
+ else
+ EXTRA_CHECKS=no
+ fi
+ ])
+
+ if test "x$EXTRA_CHECKS" = "xyes"; then
+ AC_DEFINE(GST_ENABLE_EXTRA_CHECKS, 1, [Define if extra runtime checks should be enabled])
+ fi
+])
diff --git a/common/m4/gst-error.m4 b/common/m4/gst-error.m4
index d6487cc..0067588 100644
--- a/common/m4/gst-error.m4
+++ b/common/m4/gst-error.m4
@@ -52,31 +52,6 @@
if test "x$1" != "xno"
then
AS_COMPILER_FLAG(-Werror, ERROR_CFLAGS="$ERROR_CFLAGS -Werror")
-
- dnl if -Werror isn't suported, try -errwarn=%all (Sun Forte case)
- if test "x$ERROR_CFLAGS" = "x"
- then
- AS_COMPILER_FLAG([-errwarn=%all], [
- ERROR_CFLAGS="-errwarn=%all"
- dnl try -errwarn=%all,no%E_EMPTY_DECLARATION,
- dnl no%E_STATEMENT_NOT_REACHED,no%E_ARGUEMENT_MISMATCH,
- dnl no%E_MACRO_REDEFINED (Sun Forte case)
- dnl For Forte we need disable "empty declaration" warning produced by un-needed semicolon
- dnl "statement not reached" disabled because there is g_assert_not_reached () in some places
- dnl "macro redefined" because of gst/gettext.h
- dnl FIXME: is it really supposed to be 'ARGUEMENT' and not 'ARGUMENT'?
- for f in 'no%E_EMPTY_DECLARATION' \
- 'no%E_STATEMENT_NOT_REACHED' \
- 'no%E_ARGUEMENT_MISMATCH' \
- 'no%E_MACRO_REDEFINED' \
- 'no%E_LOOP_NOT_ENTERED_AT_TOP'
- do
- AS_COMPILER_FLAG([-errwarn=%all,$f], [
- ERROR_CFLAGS="$ERROR_CFLAGS,$f"
- ])
- done
- ])
- fi
fi
if test "x$2" != "x"
@@ -142,28 +117,6 @@
AS_CXX_COMPILER_FLAG([-fno-strict-aliasing],
ERROR_CXXFLAGS="$ERROR_CXXFLAGS -fno-strict-aliasing")
])
- else
- dnl if -Werror isn't suported, try -errwarn=%all
- AS_CXX_COMPILER_FLAG([-errwarn=%all], ERROR_CXXFLAGS="$ERROR_CXXFLAGS -errwarn=%all")
- if test "x$ERROR_CXXFLAGS" != "x"; then
- dnl try -errwarn=%all,no%E_EMPTY_DECLARATION,
- dnl no%E_STATEMENT_NOT_REACHED,no%E_ARGUEMENT_MISMATCH,
- dnl no%E_MACRO_REDEFINED (Sun Forte case)
- dnl For Forte we need disable "empty declaration" warning produced by un-needed semicolon
- dnl "statement not reached" disabled because there is g_assert_not_reached () in some places
- dnl "macro redefined" because of gst/gettext.h
- dnl FIXME: is it really supposed to be 'ARGUEMENT' and not 'ARGUMENT'?
- dnl FIXME: do any of these work with the c++ compiler? if not, why
- dnl do we check at all?
- for f in 'no%E_EMPTY_DECLARATION' \
- 'no%E_STATEMENT_NOT_REACHED' \
- 'no%E_ARGUEMENT_MISMATCH' \
- 'no%E_MACRO_REDEFINED' \
- 'no%E_LOOP_NOT_ENTERED_AT_TOP'
- do
- AS_CXX_COMPILER_FLAG([-errwarn=%all,$f], [ERROR_CXXFLAGS="$ERROR_CXXFLAGS,$f"])
- done
- fi
fi
fi
@@ -227,28 +180,6 @@
AS_OBJC_COMPILER_FLAG([-fno-strict-aliasing],
ERROR_OBJCFLAGS="$ERROR_OBJCFLAGS -fno-strict-aliasing")
])
- else
- dnl if -Werror isn't suported, try -errwarn=%all
- AS_OBJC_COMPILER_FLAG([-errwarn=%all], ERROR_OBJCFLAGS="$ERROR_OBJCFLAGS -errwarn=%all")
- if test "x$ERROR_OBJCFLAGS" != "x"; then
- dnl try -errwarn=%all,no%E_EMPTY_DECLARATION,
- dnl no%E_STATEMENT_NOT_REACHED,no%E_ARGUEMENT_MISMATCH,
- dnl no%E_MACRO_REDEFINED (Sun Forte case)
- dnl For Forte we need disable "empty declaration" warning produced by un-needed semicolon
- dnl "statement not reached" disabled because there is g_assert_not_reached () in some places
- dnl "macro redefined" because of gst/gettext.h
- dnl FIXME: is it really supposed to be 'ARGUEMENT' and not 'ARGUMENT'?
- dnl FIXME: do any of these work with the c++ compiler? if not, why
- dnl do we check at all?
- for f in 'no%E_EMPTY_DECLARATION' \
- 'no%E_STATEMENT_NOT_REACHED' \
- 'no%E_ARGUEMENT_MISMATCH' \
- 'no%E_MACRO_REDEFINED' \
- 'no%E_LOOP_NOT_ENTERED_AT_TOP'
- do
- AS_OBJC_COMPILER_FLAG([-errwarn=%all,$f], [ERROR_OBJCFLAGS="$ERROR_OBJCFLAGS,$f"])
- done
- fi
fi
fi
diff --git a/common/m4/gst-glib2.m4 b/common/m4/gst-glib2.m4
index 5b9cd8b..5b72507 100644
--- a/common/m4/gst-glib2.m4
+++ b/common/m4/gst-glib2.m4
@@ -51,18 +51,9 @@
fi
AC_ARG_ENABLE(glib-asserts,
- AS_HELP_STRING([--enable-glib-asserts[=@<:@no/auto/yes@:>@]],
+ AS_HELP_STRING([--enable-glib-asserts[=@<:@no/yes@:>@]],
[Enable GLib assertion]),[enable_glib_assertions=$enableval],
- [enable_glib_assertions=auto])
-
- if test "x$enable_glib_assertions" = "xauto"; then
- dnl Enable assertions only for development versions
- if test "x`expr $PACKAGE_VERSION_MINOR % 2`" = "x1" -a "x`expr $PACKAGE_VERSION_MICRO '<' 90`" = "x1"; then
- enable_glib_assertions=yes
- else
- enable_glib_assertions=no
- fi
- fi
+ [enable_glib_assertions=yes])
if test "x$enable_glib_assertions" = "xno"; then
GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_ASSERT"
diff --git a/common/m4/gst-package-release-datetime.m4 b/common/m4/gst-package-release-datetime.m4
index bc885e3..4cf44e6 100644
--- a/common/m4/gst-package-release-datetime.m4
+++ b/common/m4/gst-package-release-datetime.m4
@@ -27,14 +27,16 @@
AC_DEFUN([AG_GST_SET_PACKAGE_RELEASE_DATETIME],
[
dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME()
- dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes]...)
+ dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([no]...)
if test "x$1" = "xno" -o "x$1" = "x"; then
GST_PACKAGE_RELEASE_DATETIME=`date -u "+%Y-%m-%dT%H:%MZ"`
elif test "x$1" = "xyes"; then
- dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([no], ["YYYY-MM-DD"])
- dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([no], [DOAP-FILE], [RELEASE-VERSION])
- if ( echo $1 | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
- GST_PACKAGE_RELEASE_DATETIME=$1
+ dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes], [YYYY-MM-DD])
+ dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes], [DOAP-FILE], [RELEASE-VERSION])
+changequote(<<, >>)dnl
+ if ( echo $2 | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
+changequote([, ])dnl
+ GST_PACKAGE_RELEASE_DATETIME=$2
else
dnl we assume the .doap file contains the date as YYYY-MM-DD
YYYY_MM_DD=`sh "${srcdir}/common/extract-release-date-from-doap-file" $3 $2`;
@@ -47,7 +49,9 @@
fi
fi
dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([YYYY-MM-DD])
+changequote(<<, >>)dnl
elif ( echo $1 | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
+changequote([, ])dnl
GST_PACKAGE_RELEASE_DATETIME=$1
else
AC_MSG_WARN([SET_PACKAGE_RELEASE_DATETIME: invalid first argument])
diff --git a/common/release.mak b/common/release.mak
index 715657b..c84c2f1 100644
--- a/common/release.mak
+++ b/common/release.mak
@@ -14,6 +14,9 @@
@if [ -d ../www/data/src ]; then \
mv -v $(PACKAGE)-$(VERSION).tar.xz ../www/data/src/$(PACKAGE)/ ; \
mv -v $(PACKAGE)-$(VERSION).tar.xz.sha256sum ../www/data/src/$(PACKAGE)/ ; \
+ elif [ -d ../../www/data/src ]; then \
+ mv -v $(PACKAGE)-$(VERSION).tar.xz ../../www/data/src/$(PACKAGE)/ ; \
+ mv -v $(PACKAGE)-$(VERSION).tar.xz.sha256sum ../../www/data/src/$(PACKAGE)/ ; \
fi
@echo "================================================================================================="
diff --git a/config.h.in b/config.h.in
index ebc6782..371b36f 100644
--- a/config.h.in
+++ b/config.h.in
@@ -37,6 +37,9 @@
/* Define if pipeline parsing code is disabled */
#undef GST_DISABLE_PARSE
+/* Define if extra runtime checks should be enabled */
+#undef GST_ENABLE_EXTRA_CHECKS
+
/* Extra platform specific plugin suffix */
#undef GST_EXTRA_MODULE_SUFFIX
@@ -191,6 +194,9 @@
/* Define to 1 if you have the `getpid' function. */
#undef HAVE_GETPID
+/* Define to 1 if you have the `getrusage' function. */
+#undef HAVE_GETRUSAGE
+
/* Define if the GNU gettext() function is already present or preinstalled. */
#undef HAVE_GETTEXT
@@ -352,6 +358,9 @@
/* Define to 1 if you have the <sys/prctl.h> header file. */
#undef HAVE_SYS_PRCTL_H
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#undef HAVE_SYS_RESOURCE_H
+
/* Define to 1 if you have the <sys/socket.h> header file. */
#undef HAVE_SYS_SOCKET_H
diff --git a/configure b/configure
index 293e7bf..60b33eb 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for GStreamer 1.6.2.
+# Generated by GNU Autoconf 2.69 for GStreamer 1.7.1.
#
# Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer>.
#
@@ -591,8 +591,8 @@
# Identity of this package.
PACKAGE_NAME='GStreamer'
PACKAGE_TARNAME='gstreamer'
-PACKAGE_VERSION='1.6.2'
-PACKAGE_STRING='GStreamer 1.6.2'
+PACKAGE_VERSION='1.7.1'
+PACKAGE_STRING='GStreamer 1.7.1'
PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer'
PACKAGE_URL=''
@@ -683,6 +683,10 @@
GST_LICENSE
HAVE_CHECK_FALSE
HAVE_CHECK_TRUE
+HAVE_GTK_FALSE
+HAVE_GTK_TRUE
+GTK_LIBS
+GTK_CFLAGS
GLIB_PREFIX
GIO_LDFLAGS
GIO_LIBS
@@ -702,6 +706,8 @@
HAVE_MMAP_FALSE
HAVE_MMAP_TRUE
SOCKET_LIBS
+HAVE_GETRUSAGE_FALSE
+HAVE_GETRUSAGE_TRUE
HAVE_GSL
GSL_LIBS
HAVE_GMP
@@ -1071,6 +1077,7 @@
with_libiconv_prefix
with_libintl_prefix
enable_fatal_warnings
+enable_extra_check
enable_gst_debug
enable_parse
enable_option_parsing
@@ -1135,7 +1142,9 @@
GLIB_CFLAGS
GLIB_LIBS
GIO_CFLAGS
-GIO_LIBS'
+GIO_LIBS
+GTK_CFLAGS
+GTK_LIBS'
# Initialize some variables set by options.
@@ -1686,7 +1695,7 @@
# 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.6.2 to adapt to many kinds of systems.
+\`configure' configures GStreamer 1.7.1 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1758,7 +1767,7 @@
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of GStreamer 1.6.2:";;
+ short | recursive ) echo "Configuration of GStreamer 1.7.1:";;
esac
cat <<\_ACEOF
@@ -1784,6 +1793,7 @@
--disable-rpath do not hardcode runtime library paths
--disable-fatal-warnings
Don't turn compiler warnings into fatal errors
+ --enable-extra-checks Enable extra runtime checks
--disable-gst-debug disable debugging subsystem
--disable-parse disable command-line parser
--disable-option-parsing
@@ -1813,7 +1823,7 @@
--enable-gtk-doc-pdf build documentation in pdf format [[default=no]]
--enable-gobject-cast-checks=[no/auto/yes]
Enable GObject cast checks
- --enable-glib-asserts=[no/auto/yes]
+ --enable-glib-asserts=[no/yes]
Enable GLib assertion
--disable-check disable building unit test libraries
--disable-Bsymbolic avoid linking with -Bsymbolic
@@ -1889,6 +1899,8 @@
GLIB_LIBS linker flags for GLIB, overriding pkg-config
GIO_CFLAGS C compiler flags for GIO, overriding pkg-config
GIO_LIBS linker flags for GIO, overriding pkg-config
+ GTK_CFLAGS C compiler flags for GTK, overriding pkg-config
+ GTK_LIBS linker flags for GTK, overriding pkg-config
Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.
@@ -1956,7 +1968,7 @@
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-GStreamer configure 1.6.2
+GStreamer configure 1.7.1
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2815,7 +2827,7 @@
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.6.2, which was
+It was created by GStreamer $as_me 1.7.1, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -3796,7 +3808,7 @@
# Define the identity of the package.
PACKAGE='gstreamer'
- VERSION='1.6.2'
+ VERSION='1.7.1'
cat >>confdefs.h <<_ACEOF
@@ -4007,9 +4019,9 @@
- PACKAGE_VERSION_MAJOR=$(echo 1.6.2 | cut -d'.' -f1)
- PACKAGE_VERSION_MINOR=$(echo 1.6.2 | cut -d'.' -f2)
- PACKAGE_VERSION_MICRO=$(echo 1.6.2 | cut -d'.' -f3)
+ PACKAGE_VERSION_MAJOR=$(echo 1.7.1 | cut -d'.' -f1)
+ PACKAGE_VERSION_MINOR=$(echo 1.7.1 | cut -d'.' -f2)
+ PACKAGE_VERSION_MICRO=$(echo 1.7.1 | cut -d'.' -f3)
@@ -4020,7 +4032,7 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking nano version" >&5
$as_echo_n "checking nano version... " >&6; }
- NANO=$(echo 1.6.2 | cut -d'.' -f4)
+ NANO=$(echo 1.7.1 | cut -d'.' -f4)
if test x"$NANO" = x || test "x$NANO" = "x0" ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: 0 (release)" >&5
@@ -8678,10 +8690,10 @@
done
- GST_CURRENT=602
+ GST_CURRENT=701
GST_REVISION=0
- GST_AGE=602
- GST_LIBVERSION=602:0:602
+ GST_AGE=701
+ GST_LIBVERSION=701:0:701
@@ -15056,6 +15068,33 @@
+ # Check whether --enable-extra-check was given.
+if test "${enable_extra_check+set}" = set; then :
+ enableval=$enable_extra_check;
+ case "${enableval}" in
+ yes) EXTRA_CHECKS=yes ;;
+ no) EXTRA_CHECKS=no ;;
+ *) as_fn_error $? "bad value ${enableval} for --enable-extra-checks" "$LINENO" 5 ;;
+ esac
+
+else
+
+ if test "x`expr $PACKAGE_VERSION_MINOR % 2`" = "x1" -a "x`expr $PACKAGE_VERSION_MICRO '<' 90`" = "x1"; then
+ EXTRA_CHECKS=yes
+ else
+ EXTRA_CHECKS=no
+ fi
+
+fi
+
+
+ if test "x$EXTRA_CHECKS" = "xyes"; then
+
+$as_echo "#define GST_ENABLE_EXTRA_CHECKS 1" >>confdefs.h
+
+ fi
+
+
@@ -15793,8 +15832,8 @@
if test "xyes" = "xno" -o "xyes" = "x"; then
GST_PACKAGE_RELEASE_DATETIME=`date -u "+%Y-%m-%dT%H:%MZ"`
elif test "xyes" = "xyes"; then
- if ( echo yes | grep '^201-90-9-0-10-9-0-30-9' >/dev/null ) ; then
- GST_PACKAGE_RELEASE_DATETIME=yes
+ if ( echo "${srcdir}/gstreamer.doap" | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
+ GST_PACKAGE_RELEASE_DATETIME= "${srcdir}/gstreamer.doap"
else
YYYY_MM_DD=`sh "${srcdir}/common/extract-release-date-from-doap-file" $PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR.$PACKAGE_VERSION_MICRO "${srcdir}/gstreamer.doap" `;
if test "x$YYYY_MM_DD" != "x"; then
@@ -15805,7 +15844,7 @@
GST_PACKAGE_RELEASE_DATETIME=""
fi
fi
- elif ( echo yes | grep '^201-90-9-0-10-9-0-30-9' >/dev/null ) ; then
+ elif ( echo yes | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
GST_PACKAGE_RELEASE_DATETIME=yes
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SET_PACKAGE_RELEASE_DATETIME: invalid first argument" >&5
@@ -15832,8 +15871,8 @@
if test "xno" = "xno" -o "xno" = "x"; then
GST_PACKAGE_RELEASE_DATETIME=`date -u "+%Y-%m-%dT%H:%MZ"`
elif test "xno" = "xyes"; then
- if ( echo no | grep '^201-90-9-0-10-9-0-30-9' >/dev/null ) ; then
- GST_PACKAGE_RELEASE_DATETIME=no
+ if ( echo | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
+ GST_PACKAGE_RELEASE_DATETIME=
else
YYYY_MM_DD=`sh "${srcdir}/common/extract-release-date-from-doap-file" `;
if test "x$YYYY_MM_DD" != "x"; then
@@ -15844,7 +15883,7 @@
GST_PACKAGE_RELEASE_DATETIME=""
fi
fi
- elif ( echo no | grep '^201-90-9-0-10-9-0-30-9' >/dev/null ) ; then
+ elif ( echo no | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
GST_PACKAGE_RELEASE_DATETIME=no
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SET_PACKAGE_RELEASE_DATETIME: invalid first argument" >&5
@@ -24809,6 +24848,37 @@
fi
done
+for ac_func in getrusage
+do :
+ ac_fn_c_check_func "$LINENO" "getrusage" "ac_cv_func_getrusage"
+if test "x$ac_cv_func_getrusage" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_GETRUSAGE 1
+_ACEOF
+
+fi
+done
+
+ if test "x$ac_cv_func_getrusage" = "xyes"; then
+ HAVE_GETRUSAGE_TRUE=
+ HAVE_GETRUSAGE_FALSE='#'
+else
+ HAVE_GETRUSAGE_TRUE='#'
+ HAVE_GETRUSAGE_FALSE=
+fi
+
+for ac_header in sys/resource.h
+do :
+ ac_fn_c_check_header_mongrel "$LINENO" "sys/resource.h" "ac_cv_header_sys_resource_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_resource_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_SYS_RESOURCE_H 1
+_ACEOF
+
+fi
+
+done
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5
$as_echo_n "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; }
@@ -25973,7 +26043,7 @@
fi
-GLIB_REQ=2.32.0
+GLIB_REQ=2.40.0
@@ -26114,18 +26184,10 @@
if test "${enable_glib_asserts+set}" = set; then :
enableval=$enable_glib_asserts; enable_glib_assertions=$enableval
else
- enable_glib_assertions=auto
+ enable_glib_assertions=yes
fi
- if test "x$enable_glib_assertions" = "xauto"; then
- if test "x`expr $PACKAGE_VERSION_MINOR % 2`" = "x1" -a "x`expr $PACKAGE_VERSION_MICRO '<' 90`" = "x1"; then
- enable_glib_assertions=yes
- else
- enable_glib_assertions=no
- fi
- fi
-
if test "x$enable_glib_assertions" = "xno"; then
GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_ASSERT"
fi
@@ -26331,6 +26393,92 @@
GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`"
+HAVE_GTK=no
+GTK_REQ=3.10
+if test "x$BUILD_EXAMPLES" = "xyes"; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5
+$as_echo_n "checking for GTK... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+ if test -n "$GTK_CFLAGS"; then
+ pkg_cv_GTK_CFLAGS="$GTK_CFLAGS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= \$GTK_REQ\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= $GTK_REQ") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-3.0 >= $GTK_REQ" 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ fi
+else
+ pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+ if test -n "$GTK_LIBS"; then
+ pkg_cv_GTK_LIBS="$GTK_LIBS"
+ else
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= \$GTK_REQ\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= $GTK_REQ") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-3.0 >= $GTK_REQ" 2>/dev/null`
+else
+ pkg_failed=yes
+fi
+ fi
+else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gtk+-3.0 >= $GTK_REQ"`
+ else
+ GTK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gtk+-3.0 >= $GTK_REQ"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$GTK_PKG_ERRORS" >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ HAVE_GTK=no
+elif test $pkg_failed = untried; then
+ HAVE_GTK=no
+else
+ GTK_CFLAGS=$pkg_cv_GTK_CFLAGS
+ GTK_LIBS=$pkg_cv_GTK_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ HAVE_GTK=yes
+fi
+
+
+fi
+ if test "x$HAVE_GTK" = "xyes"; then
+ HAVE_GTK_TRUE=
+ HAVE_GTK_FALSE='#'
+else
+ HAVE_GTK_TRUE='#'
+ HAVE_GTK_FALSE=
+fi
+
+
# Check whether --enable-check was given.
if test "${enable_check+set}" = set; then :
enableval=$enable_check;
@@ -26397,35 +26545,34 @@
if test "${enable_Bsymbolic+set}" = set; then :
enableval=$enable_Bsymbolic;
else
- SAVED_LDFLAGS="${LDFLAGS}"
+ SAVED_LDFLAGS="${LDFLAGS}" SAVED_LIBS="${LIBS}"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -Bsymbolic-functions linker flag" >&5
$as_echo_n "checking for -Bsymbolic-functions linker flag... " >&6; }
LDFLAGS=-Wl,-Bsymbolic-functions
+ LIBS=
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
-int main (void) { return 0; }
+return 0
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
enable_Bsymbolic=yes
else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
enable_Bsymbolic=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
- LDFLAGS="${SAVED_LDFLAGS}"
+ LDFLAGS="${SAVED_LDFLAGS}" LIBS="${SAVED_LIBS}"
fi
@@ -26745,93 +26892,6 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
$as_echo "$flag_ok" >&6; }
-
- if test "x$ERROR_CFLAGS" = "x"
- then
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -errwarn=%all" >&5
-$as_echo_n "checking to see if compiler understands -errwarn=%all... " >&6; }
-
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -errwarn=%all"
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- flag_ok=yes
-else
- flag_ok=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CFLAGS="$save_CFLAGS"
-
- if test "X$flag_ok" = Xyes ; then
-
- ERROR_CFLAGS="-errwarn=%all"
- for f in 'no%E_EMPTY_DECLARATION' \
- 'no%E_STATEMENT_NOT_REACHED' \
- 'no%E_ARGUEMENT_MISMATCH' \
- 'no%E_MACRO_REDEFINED' \
- 'no%E_LOOP_NOT_ENTERED_AT_TOP'
- do
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -errwarn=%all,$f" >&5
-$as_echo_n "checking to see if compiler understands -errwarn=%all,$f... " >&6; }
-
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -errwarn=%all,$f"
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- flag_ok=yes
-else
- flag_ok=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CFLAGS="$save_CFLAGS"
-
- if test "X$flag_ok" = Xyes ; then
-
- ERROR_CFLAGS="$ERROR_CFLAGS,$f"
-
- true
- else
-
- true
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
-$as_echo "$flag_ok" >&6; }
-
- done
-
- true
- else
-
- true
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
-$as_echo "$flag_ok" >&6; }
-
- fi
fi
if test "x-Wmissing-declarations -Wmissing-prototypes -Wredundant-decls -Wundef -Wwrite-strings -Wformat-nonliteral -Wformat-security -Wold-style-definition -Winit-self -Wmissing-include-dirs -Waddress -Waggregate-return -Wno-multichar -Wnested-externs $NO_WARNINGS" != "x"
@@ -27941,7 +28001,7 @@
-ac_config_files="$ac_config_files Makefile data/Makefile gst/Makefile gst/gstconfig.h gst/gstversion.h gst/parse/Makefile gst/printf/Makefile libs/Makefile libs/gst/Makefile libs/gst/base/Makefile libs/gst/check/Makefile libs/gst/check/libcheck/Makefile libs/gst/check/internal-check.h:libs/gst/check/libcheck/check.h.in libs/gst/controller/Makefile libs/gst/helpers/Makefile libs/gst/net/Makefile plugins/Makefile plugins/elements/Makefile po/Makefile.in tests/Makefile tests/benchmarks/Makefile tests/check/Makefile tests/misc/Makefile tests/examples/Makefile tests/examples/adapter/Makefile tests/examples/controller/Makefile tests/examples/stepping/Makefile tests/examples/helloworld/Makefile tests/examples/manual/Makefile tests/examples/memory/Makefile tests/examples/netclock/Makefile tests/examples/ptp/Makefile tests/examples/streamiddemux/Makefile tests/examples/streams/Makefile tools/Makefile common/Makefile common/m4/Makefile docs/Makefile docs/design/Makefile docs/faq/Makefile docs/gst/Makefile docs/gst/gstreamer.types docs/libs/Makefile docs/plugins/Makefile docs/manual/Makefile docs/pwg/Makefile docs/slides/Makefile docs/xsl/Makefile docs/version.entities m4/Makefile pkgconfig/Makefile stamp.h pkgconfig/gstreamer.pc pkgconfig/gstreamer-uninstalled.pc pkgconfig/gstreamer-base.pc pkgconfig/gstreamer-base-uninstalled.pc pkgconfig/gstreamer-check.pc pkgconfig/gstreamer-check-uninstalled.pc pkgconfig/gstreamer-controller.pc pkgconfig/gstreamer-controller-uninstalled.pc pkgconfig/gstreamer-net.pc pkgconfig/gstreamer-net-uninstalled.pc gstreamer.spec"
+ac_config_files="$ac_config_files Makefile data/Makefile gst/Makefile gst/gstconfig.h gst/gstversion.h gst/parse/Makefile gst/printf/Makefile libs/Makefile libs/gst/Makefile libs/gst/base/Makefile libs/gst/check/Makefile libs/gst/check/libcheck/Makefile libs/gst/check/internal-check.h:libs/gst/check/libcheck/check.h.in libs/gst/controller/Makefile libs/gst/helpers/Makefile libs/gst/net/Makefile plugins/Makefile plugins/elements/Makefile plugins/tracers/Makefile po/Makefile.in tests/Makefile tests/benchmarks/Makefile tests/check/Makefile tests/misc/Makefile tests/examples/Makefile tests/examples/adapter/Makefile tests/examples/controller/Makefile tests/examples/stepping/Makefile tests/examples/helloworld/Makefile tests/examples/manual/Makefile tests/examples/memory/Makefile tests/examples/netclock/Makefile tests/examples/ptp/Makefile tests/examples/streamiddemux/Makefile tests/examples/streams/Makefile tools/Makefile common/Makefile common/m4/Makefile docs/Makefile docs/design/Makefile docs/faq/Makefile docs/gst/Makefile docs/gst/gstreamer.types docs/libs/Makefile docs/plugins/Makefile docs/manual/Makefile docs/pwg/Makefile docs/slides/Makefile docs/xsl/Makefile docs/version.entities m4/Makefile pkgconfig/Makefile stamp.h pkgconfig/gstreamer.pc pkgconfig/gstreamer-uninstalled.pc pkgconfig/gstreamer-base.pc pkgconfig/gstreamer-base-uninstalled.pc pkgconfig/gstreamer-check.pc pkgconfig/gstreamer-check-uninstalled.pc pkgconfig/gstreamer-controller.pc pkgconfig/gstreamer-controller-uninstalled.pc pkgconfig/gstreamer-net.pc pkgconfig/gstreamer-net-uninstalled.pc gstreamer.spec"
sed \
@@ -28325,6 +28385,10 @@
as_fn_error $? "conditional \"HAVE_WINSOCK2_H\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${HAVE_GETRUSAGE_TRUE}" && test -z "${HAVE_GETRUSAGE_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_GETRUSAGE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${HAVE_MMAP_TRUE}" && test -z "${HAVE_MMAP_FALSE}"; then
as_fn_error $? "conditional \"HAVE_MMAP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -28337,6 +28401,10 @@
as_fn_error $? "conditional \"GST_HAVE_MONOTONIC_CLOCK\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${HAVE_GTK_TRUE}" && test -z "${HAVE_GTK_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_GTK\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${HAVE_CHECK_TRUE}" && test -z "${HAVE_CHECK_FALSE}"; then
as_fn_error $? "conditional \"HAVE_CHECK\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -28762,7 +28830,7 @@
# 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.6.2, which was
+This file was extended by GStreamer $as_me 1.7.1, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -28828,7 +28896,7 @@
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.6.2
+GStreamer config.status 1.7.1
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
@@ -29382,6 +29450,7 @@
"libs/gst/net/Makefile") CONFIG_FILES="$CONFIG_FILES libs/gst/net/Makefile" ;;
"plugins/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/Makefile" ;;
"plugins/elements/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/elements/Makefile" ;;
+ "plugins/tracers/Makefile") CONFIG_FILES="$CONFIG_FILES plugins/tracers/Makefile" ;;
"po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
"tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
"tests/benchmarks/Makefile") CONFIG_FILES="$CONFIG_FILES tests/benchmarks/Makefile" ;;
diff --git a/configure.ac b/configure.ac
index 1107cf8..f98bcfd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4,7 +4,7 @@
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.6.2],[http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer],[gstreamer])
+AC_INIT([GStreamer],[1.7.1],[http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer],[gstreamer])
AG_GST_INIT
dnl initialize automake (we require GNU make)
@@ -62,7 +62,7 @@
dnl 1.10.9 (who knows) => 1009
dnl
dnl sets GST_LT_LDFLAGS
-AS_LIBTOOL(GST, 602, 0, 602)
+AS_LIBTOOL(GST, 701, 0, 701)
dnl *** autotools stuff ****
@@ -81,6 +81,7 @@
dnl *** check for arguments to configure ***
AG_GST_ARG_DISABLE_FATAL_WARNINGS
+AG_GST_ARG_ENABLE_EXTRA_CHECKS
dnl subsystems - can influence other decisions so needs to be high up
dnl we need to AM_CONDITIONAL them here for automake 1.6.x compatibility
@@ -604,6 +605,9 @@
AC_CHECK_FUNCS([gmtime_r])
AC_CHECK_FUNCS([localtime_r])
AC_CHECK_FUNCS([sigaction])
+AC_CHECK_FUNCS([getrusage])
+AM_CONDITIONAL(HAVE_GETRUSAGE, test "x$ac_cv_func_getrusage" = "xyes")
+AC_CHECK_HEADERS([sys/resource.h])
dnl check for fseeko()
AC_FUNC_FSEEKO
@@ -768,13 +772,23 @@
dnl *** checks for dependency libraries ***
dnl GLib
-GLIB_REQ=2.32.0
+GLIB_REQ=2.40.0
AG_GST_GLIB_CHECK([$GLIB_REQ])
dnl Check for documentation xrefs
GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`"
AC_SUBST(GLIB_PREFIX)
+dnl GTK is optional and only used in examples
+HAVE_GTK=no
+GTK_REQ=3.10
+if test "x$BUILD_EXAMPLES" = "xyes"; then
+ PKG_CHECK_MODULES(GTK, gtk+-3.0 >= $GTK_REQ, HAVE_GTK=yes, HAVE_GTK=no)
+ AC_SUBST(GTK_LIBS)
+ AC_SUBST(GTK_CFLAGS)
+fi
+AM_CONDITIONAL(HAVE_GTK, test "x$HAVE_GTK" = "xyes")
+
dnl building of unit test libraries
AC_ARG_ENABLE(check,
AS_HELP_STRING([--disable-check],[disable building unit test libraries]),
@@ -818,15 +832,16 @@
dnl intra-library PLT jumps, if available.
AC_ARG_ENABLE(Bsymbolic,
[AS_HELP_STRING([--disable-Bsymbolic],[avoid linking with -Bsymbolic])],,
- [SAVED_LDFLAGS="${LDFLAGS}"
+ [SAVED_LDFLAGS="${LDFLAGS}" SAVED_LIBS="${LIBS}"
AC_MSG_CHECKING([for -Bsymbolic-functions linker flag])
LDFLAGS=-Wl,-Bsymbolic-functions
- AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[int main (void) { return 0; }]])],[
+ LIBS=
+ AC_TRY_LINK([], [return 0],
AC_MSG_RESULT(yes)
- enable_Bsymbolic=yes],[
+ enable_Bsymbolic=yes,
AC_MSG_RESULT(no)
- enable_Bsymbolic=no])
- LDFLAGS="${SAVED_LDFLAGS}"])
+ enable_Bsymbolic=no)
+ LDFLAGS="${SAVED_LDFLAGS}" LIBS="${SAVED_LIBS}"])
dnl *** set variables based on configure arguments
@@ -980,6 +995,7 @@
libs/gst/net/Makefile
plugins/Makefile
plugins/elements/Makefile
+plugins/tracers/Makefile
po/Makefile.in
tests/Makefile
tests/benchmarks/Makefile
diff --git a/data/Makefile.in b/data/Makefile.in
index 1ff938f..00052a7 100644
--- a/data/Makefile.in
+++ b/data/Makefile.in
@@ -306,6 +306,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/docs/Makefile.in b/docs/Makefile.in
index 0051f5c..ae300e5 100644
--- a/docs/Makefile.in
+++ b/docs/Makefile.in
@@ -338,6 +338,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/docs/design/Makefile.in b/docs/design/Makefile.in
index c9d6782..939f0df 100644
--- a/docs/design/Makefile.in
+++ b/docs/design/Makefile.in
@@ -273,6 +273,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/docs/design/draft-tracing.txt b/docs/design/draft-tracing.txt
index 6867d4f..98f75e6 100644
--- a/docs/design/draft-tracing.txt
+++ b/docs/design/draft-tracing.txt
@@ -1,36 +1,75 @@
Tracing
=======
-This subsystem will provide a mechanism to get structured tracing info from GStreamer
-applications. This can be used for post-run analysis as well as for live
-introspection.
+This subsystem will provide a mechanism to get structured tracing info from
+GStreamer applications. This can be used for post-run analysis as well as for
+live introspection.
-We are going to introduce a GstTracer object. There will be only a single instance
-per process or none if tracing is off (not enabled via envvar or compiled out).
+Use cases
+---------
+* I'd like to get statistics from a running application.
-Certain GStreamer core function (such as gst_pad_push or gst_element_add_pad) will
-call into the tracer. The tracer will dispatch into loaded tracing plugins.
+* I'd like to to understand which parts of my pipeline use how many resources.
+
+* I'd like to know which parts of the pipeline use how much memory.
+
+* I'd like to know about ref-counts of parts in the pipeline to find ref-count
+ issues.
+
+Non use-cases
+-------------
+* Some element in the pipeline does not play along the rules, find out which
+ one. This could be done with generic tests.
+
+Design
+------
+
+The system brings the following new items:
+core hooks: probes in the core api, that will expose internal state when tracing
+ is in use
+tracers: plugin features that can process data from the hooks and emit a log
+tracing front-ends: applications that consume logs from tracers
+
+Like the logging, the tracer hooks can be compiled out and if not use a local
+condition to check if active.
+
+Certain GStreamer core function (such as gst_pad_push or gst_element_add_pad)
+will call into the tracer subsystem to dispatch into active tracing modules.
Developers will be able to select a list of plugins by setting an environment
-variable, such as GST_TRACE="meminfo,dbus". When then plugins are loaded, they will
-add them to certain hooks. Another env var GST_TRACE_CHANNEL can be used to send
-the tracing to a file or a socket (Do the same for GST_DEBUG_CHANNEL). The syntax
-could be GST_XXX_CHANNEL=file:///path/to/file or GST_XXX_CHANNEL=tcp://<ip>:<port>.
-If no channel is set, the tracing goes to stderr like the debug logging.
+variable, such as GST_TRACER_PLUGINS="meminfo;dbus". One can also pass parameters to
+plugins: GST_TRACER_PLUGINS="log(events,buffers);stats(all)".
+When then plugins are loaded, we'll add them to certain hooks according to which
+they are interested in.
-TODO(ensonic): we might want to have GST_{DEBUG|TRACE)_FORMAT envars as well. These
-could be raw, ansi-color, binary, ...
+Right now tracing info is logged as GstStructures to the TRACE level.
+Idea: Another env var GST_TRACE_CHANNEL could be used to send the tracing to a
+file or a socket. See https://bugzilla.gnome.org/show_bug.cgi?id=733188 for
+discussion on these environment variables.
-Hooks
------
-e.g. gst_pad_push() will do add this line:
-GST_TRACER_PUSH_BUFFER (pad, buffer)
+Hook api
+--------
+We'll wrap interesting api calls with two macros, e.g. gst_pad_push():
-If tracing is disable at compile time the macro will evaluate to nothing. Otherwise
-it will become something along the lines of:
-if (__tracer && __tracer_hook_is_used) {
- gst_tracer_push_buffer (pad, buffer);
+GstFlowReturn
+gst_pad_push (GstPad * pad, GstBuffer * buffer)
+{
+ GstFlowReturn res;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
+ g_return_val_if_fail (GST_PAD_IS_SRC (pad), GST_FLOW_ERROR);
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR);
+
+ GST_TRACER_PAD_PUSH_PRE (pad, buffer);
+ res = gst_pad_push_data (pad,
+ GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_PUSH, buffer);
+ GST_TRACER_PAD_PUSH_POST (pad, res);
+ return res;
}
+TODO(ensonic): gcc has some magic for wrapping functions
+- http://gcc.gnu.org/onlinedocs/gcc/Constructing-Calls.html
+- http://www.clifford.at/cfun/gccfeat/#gccfeat05.c
+
TODO(ensonic): we should eval if we can use something like jump_label in the kernel
- http://lwn.net/Articles/412072/ + http://lwn.net/Articles/435215/
- http://lxr.free-electrons.com/source/kernel/jump_label.c
@@ -41,20 +80,144 @@
- it is linux specific :/
In addition to api hooks we should also provide timer hooks. Interval timers are
-useful to get e.g. resource usage snapshots. Also absolute timers might make sense.
+useful to get e.g. resource usage snapshots. Also absolute timers might make
+sense. All this could be implemented with a clock thread. We can use another
+env-var GST_TRACE_TIMERS="100ms,75ms" to configure timers and then pass them to
+the tracers like, GST_TRACER_PLUGINS="rusage(timer=100ms);meminfo(timer=75ms)". Maybe
+we can create them ad-hoc and avoid the GST_TRACE_TIMERS var.
-Plugins can attach handlers to one or more hooks. When a hook such as
-gst_tracer_push_buffer () is called it will take a timestamp and call all attached
-handlers. Hooks will be called from misc threads. The trace plugins should only
-consume (=read) the provided data. Most trace plugins will log data to a trace
-channel.
+Hooks (* already implemented)
+-----
+* gst_bin_add
+* gst_bin_remove
+* gst_element_add_pad
+* gst_element_post_message
+* gst_element_query
+* gst_element_remove_pad
+* gst_element_factory_make
+* gst_pad_link
+* gst_pad_pull_range
+* gst_pad_push
+* gst_pad_push_list
+* gst_pad_push_event
+* gst_pad_unlink
-TODO(ensonic): use GSignal for the hooks?
+Tracer api
+----------
+Tracers are plugin features. They have a simple api:
-Plugins
-=======
+class init
+Here the tracers describe the data the will emit.
-meminfo
+instance init
+Tracers attach handlers to one or more hooks using gst_tracer_register_hook().
+In case the are configurable, they can read the options from the 'params'
+property. This is the extra detail from the environment var.
+
+hook functions
+Hooks marshal the parameters given to a trace hook into varargs and also
+add some extra into such as a timestamp. Hooks will be called from misc threads.
+The trace plugins should only consume (=read) the provided data. Expensive
+computation should be avoided to not affect the execution too much.
+Most trace plugins will log data to a trace channel.
+
+instance destruction
+Tracers can output results and release data. This would ideally be done at the
+end of the applications, but gst_deinit() is not mandatory. gst_tracelib was
+using a gcc_destructor. Ideally tracer modules log data as they have them and
+leave aggregation to a tool that processes the log.
+
+tracer event classes
+--------------------
+Most tracers will log some kind of 'events' : a data transfer, an event,
+a message, a query or a measurement. Every tracers should describe the data
+format. This way tools that process tracer logs can show the data in a
+meaningful way without having to know about the tracer plugin.
+
+One way would be to introspect the data from the plugin. This has the
+disadvantage that the postprocessing app needs to load the plugins or talk to
+the gstreamer registry. An alternative is to also log the format description
+into the log. Right now we're logging several nested GstStructure from the
+_tracer_class_init() function (except in the log tracer).
+
+// the name is the value name + ".class"
+// the content describes a single log record
+gst_structure_new ("thread-rusage.class",
+ // value in the log record (order does not matter)
+ // 'thread-id' is a 'key' to related the record to something as indicated
+ // by 'scope' substructure
+ "thread-id", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ // enum { process, thread, element, pad, context?, ... }
+ "related-to", G_TYPE_STRING, "thread",
+ NULL),
+ // next value in the record
+ // 'average-cpuload' is a measurement as indicated by the 'value'
+ // substructure
+ "average-cpuload", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+ // value type
+ "type", G_TYPE_GTYPE, G_TYPE_UINT,
+ // human readable description, that can be used as a graph label
+ "description", G_TYPE_STRING, "average cpu usage per thread",
+ // flags that help to use the right graph type
+ // flags { aggregated, windowed, cumulative, ... }
+ "flags", G_TYPE_STRING, "aggregated",
+ // value range
+ "min", G_TYPE_UINT, 0,
+ "max", G_TYPE_UINT, 100,
+ NULL),
+ ...
+ NULL);
+
+A few ideas that are not yet in the above spec:
+- it would be nice to describe the unit of values
+ - putting it into the description is not flexible though, e.g. time would be
+ a guint64 but a ui would reformat it to e.g. h:m:s.ms
+ - other units are e.g.: percent, per-mille, or kbit/s
+- we'd like to have some metadata on scopes
+ - e.g. we'd like to log the thread-names, so that a UI can show that instead
+ of thread-ids
+ - the stats tracer logs 'new-element' and 'new-pad' messages
+ - they add a unique 'ix' to each instance as the memory ptr can be reused
+ for new instances, the data is attached to the objects as qdata
+ - the latency tracer would like to also reference this metadata
+- enums and flags are logged as comma separated string to not require the front-
+ ends to know the flag values (is that okay?)
+- right now we log the classes as structures
+ - this is important so that the log is self contained
+ - it would be nice to add them to the registry, so that gst-inspect can show
+ them
+
+In addition to the above spec, each log event will contain a "ts" field as a
+G_TYPE_UINT64 to specify the time of the event.
+
+We could also consider to add each value as a READABLE gobject property. The
+property has name/description. We could use qdata for scope and flags (or have
+some new property flags).
+We would also need a new "notify" signal, so that value-change notifications
+would include a time-stamp. This way the tracers would not needs to be aware of
+the logging. The core tracer would register the notify handlers and emit the
+log.
+Or we just add a gst_tracer_class_install_event() and that mimics the
+g_object_class_install_property().
+
+Frontends can:
+- do an events over time histogram
+- plot curves of values over time or deltas
+- show gauges
+- collect statistics (min, max, avg, ...)
+
+Plugins ideas
+=============
+
+We can have some under gstreamer/plugins/tracers/
+
+latency
+-------
+- register to buffer and event flow
+- send custom event on buffer flow at source elements
+- catch events on event transfer at sink elements
+
+meminfo (not yet implemented)
-------
- register to an interval-timer hook.
- call mallinfo() and log memory usage
@@ -64,42 +227,134 @@
- register to an interval-timer hook.
- call getrusage() and log resource usage
-dbus
+dbus (not yet implemented)
----
- provide a dbus iface to announce applications that are traced
-- tracing UIs can use the dbus iface to find the channels where logging and tracing
- is getting logged to, one would start the tracing UI first and when the
- application is started with tracing activated, the dbus plugin will announce the
- new application, upon which the tracing UI can start reading from the log channels
+- tracing UIs can use the dbus iface to find the channels where logging and
+ tracing is getting logged to
+- one would start the tracing UI first and when the application is started with
+ tracing activated, the dbus plugin will announce the new application,
+ upon which the tracing UI can start reading from the log channels, this avoid
+ missing some data
-topology
+topology (not yet implemented)
--------
- register to pipeline topology hooks
- tracing UIs can show a live pipeline graph
-communication
--------------
+stats
+-----
- register to buffer, event, message and query flow
- tracing apps can do e.g. statistics
-UI
-==
+refcounts (not yet implemented)
+---------
+- log ref-counts of objects
+- just logging them outside of glib/gobject would still make it hard to detect
+ issues though
+
+opengl (not yet implemented)
+------
+- upload/download times
+- there is not hardware agnostic way to get e.g. memory usage info
+ (gl extensions)
+
+User interfaces
+===============
gst-debug-viewer
----------------
-gst-debug-viewer could be given the tracelog in addition to the debug log.
-Alternatively it would show a dialog that shows all local apps (if the dbus plugin
-is loaded) and read the log streams from the sockets/files that are configured for
-the app.
+gst-debug-viewer could be given the trace log in addition to the debug log (or a
+combined log). Alternatively it would show a dialog that shows all local apps
+(if the dbus plugin is loaded) and read the log streams from the sockets/files
+that are configured for the app.
-gst-trace-stats
----------------
-Such a tool could read a trace and summarize the content like gst-tracelib did for
-stats in 0.10.
+gst-tracer
+----------
+Counterpart of gst-tracelib-ui.
+
+gst-stats
+---------
+A terminal app that shows summary/running stats like the summary gst-tracelib
+shows at the end of a run. Currently only shows an aggregated status.
+
+live-graphers
+-------------
+Maybe we can even feed the log into existing live graphers, with a little driver
+* https://github.com/dkogan/feedgnuplot
Problems / Open items
=====================
-- when connecting to a running app, we cant easily get the 'current' state if logging
-is using a socket, as past events are not stored
+- should tracers log into the debug.log or into a separate log?
+ - separate log
+ - use a binary format?
+ - worse performance (we're writing two logs at the same time)
+ - need to be careful when people to GST_DEBUG_CHANNEL=stderr and
+ GST_TRACE_CHANNEL=stderr (use a shared channel, but what about the
+ formats?)
+ - debug log
+ - the tracer subsystem would need to log the GST_TRACE at a level that is
+ active
+ - should the tracer call gst_debug_category_set_threshold() to ensure things
+ work, even though the levels don't make a lot of sense here
+ - make logging a tracer (a hook in gst_debug_log_valist, move
+ gst_debug_log_default() to the tracer module)
+ - log all debug log to the tracer log, some of the current logging
+ statements can be replaced by generic logging as shown in the log-tracer
+ - add tools/gst-debug to extract a human readable debug log from the trace
+ log
+ - we could maintain a list of log functions, where gst_tracer_log_trace() is
+ the default one. This way e.g. gst-validate could consume the traces
+ directly.
+
+- when hooking into a timer, should we just have some predefined intervals?
+ - can we add a tracer module that registers the timer hook? then we could do
+ GST_TRACER="timer(10ms);rusage"
+ right now the tracer hooks are defined as an enum though.
+
+- when connecting to a running app, we can't easily get the 'current' state if
+ logging is using a socket, as past events are not explicitly stored, we could
+ determine the current topology and emit events with GST_CLOCK_TIME_NONE as ts
+ to indicate that the events are synthetic.
+
+- we need stable ids for scopes (elements, pads)
+ - the address can be reused
+ - we can use gst_util_seqnum_next()
+ - something like gst_object_get_path_string() won't work as objects are
+ initially without parent
+
+- right now the tracer is enabled/disabled from configure with
+ --{enable,disable}-debug, we should probably add --{enable,disable}-tracer
+ although it is confusing with "--disable-trace disable tracing subsystem"
+ where we could at least change the doc-string to say "disable memory tracing
+ subsystem"
+
+Try it
+======
+GST_DEBUG="GST_TRACER:7,GST_BUFFER*:7,GST_EVENT:7,GST_MESSAGE:7" GST_TRACER_PLUGINS=log gst-launch-1.0 fakesrc num-buffers=10 ! fakesink
+- traces for buffer flow in TRACE level
+
+GST_DEBUG="GST_TRACER:7" GST_TRACER_PLUGINS="stats;rusage" GST_DEBUG_FILE=trace.log gst-launch-1.0 fakesrc num-buffers=10 sizetype=fixed ! queue ! fakesink
+gst-stats-1.0 trace.log
+- print some pipeline stats on exit
+
+GST_DEBUG="GST_TRACER:7" GST_TRACER_PLUGINS="stats;rusage" GST_DEBUG_FILE=trace.log /usr/bin/gst-play-1.0 --interactive $HOME/Videos/movie.mp4
+./scripts/gst-plot-traces.sh --format=png | gnuplot
+eog trace.log.*.png
+- get ts, average-cpuload, current-cpuload, time and plot
+
+GST_DEBUG="GST_TRACER:7" GST_TRACER_PLUGINS=latency gst-launch-1.0 audiotestsrc num-buffers=10 ! audioconvert ! volume volume=0.7 ! autoaudiosink
+- print processing latencies
+
+Performance
+===========
+run ./tests/benchmarks/tracing.sh <tracer(s)> <media>
+
+egrep -c "(proc|thread)-rusage" trace.log
+658618
+grep -c "gst_tracer_log_trace" trace.log
+823351
+
+- we can optimize most of it by using quarks in structures or eventually avoid structures totally
diff --git a/docs/design/part-synchronisation.txt b/docs/design/part-synchronisation.txt
index 7694c1b..cac9f07 100644
--- a/docs/design/part-synchronisation.txt
+++ b/docs/design/part-synchronisation.txt
@@ -87,7 +87,7 @@
timestamp.
- S.stop: stop field in the SEGMENT event. This is the highers allowed
timestamp.
- - S.rate: rate field of SEGMENT event. This is the desired playback rate.
+ - S.rate: rate field of SEGMENT event. This is the playback rate.
- S.base: a base time for the time. This is the total elapsed running_time of any
previous segments.
- S.offset: an offset to apply to S.start or S.stop. This is the amount that
@@ -101,8 +101,13 @@
if (S.rate > 0.0)
B.running_time = (B.timestamp - (S.start + S.offset)) / ABS (S.rate) + S.base
+ =>
+ B.timestamp = (B.running_time - S.base) * ABS (S.rate) + S.start + S.offset
else
B.running_time = ((S.stop - S.offset) - B.timestamp) / ABS (S.rate) + S.base
+ =>
+ B.timestamp = S.stop - S.offset - ((B.running_time - S.base) * ABS (S.rate))
+
We write B.running_time as the running_time obtained from the SEGMENT event
and the buffers of that segment.
@@ -185,15 +190,19 @@
Additional fields in the SEGMENT are used:
- S.time: time field in the SEGMENT event. This the stream-time of S.start
- - S.applied_rate: The rate already applied to the stream.
+ - S.applied_rate: The rate already applied to the segment.
Stream time is calculated using the buffer times and the preceding SEGMENT
event as follows:
stream_time = (B.timestamp - S.start) * ABS (S.applied_rate) + S.time
-
+ => B.timestamp = (stream_time - S.time) / ABS(S.applied_rate) + S.start
+
For negative rates, B.timestamp will go backwards from S.stop to S.start,
-making the stream time go backwards.
+making the stream time go backwards:
+
+ stream_time = (S.stop - B.timestamp) * ABS(S.applied_rate) + S.time
+ => B.timestamp = S.stop - (stream_time - S.time) / ABS(S.applied_rate)
In the PLAYING state, it is also possible to use the pipeline clock to derive
the current stream_time.
diff --git a/docs/faq/Makefile.in b/docs/faq/Makefile.in
index fe8f1be..79dfed5 100644
--- a/docs/faq/Makefile.in
+++ b/docs/faq/Makefile.in
@@ -327,6 +327,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/docs/gst/Makefile.in b/docs/gst/Makefile.in
index 3f0df57..3dd3fc8 100644
--- a/docs/gst/Makefile.in
+++ b/docs/gst/Makefile.in
@@ -296,6 +296,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/docs/gst/gstreamer-sections.txt b/docs/gst/gstreamer-sections.txt
index 94b1356..6ba3254 100644
--- a/docs/gst/gstreamer-sections.txt
+++ b/docs/gst/gstreamer-sections.txt
@@ -175,6 +175,7 @@
GST_BUFFER_PTS
GST_BUFFER_DTS
+GST_BUFFER_DTS_OR_PTS
GST_BUFFER_DURATION
GST_BUFFER_OFFSET
GST_BUFFER_OFFSET_END
@@ -702,8 +703,6 @@
GST_DISABLE_PLUGIN
<SUBSECTION Private>
GST_HAVE_GLIB_2_8
-GST_PTR_FORMAT
-GST_SEGMENT_FORMAT
GST_EXPORT
GST_PLUGIN_EXPORT
GST_PADDING
@@ -869,6 +868,9 @@
gst_element_set_bus
gst_element_get_bus
gst_element_set_context
+gst_element_get_context
+gst_element_get_context_unlocked
+gst_element_get_contexts
gst_element_get_factory
gst_element_set_name
gst_element_get_name
@@ -1351,6 +1353,8 @@
GST_TIME_ARGS
GST_STIME_FORMAT
GST_STIME_ARGS
+GST_PTR_FORMAT
+GST_SEGMENT_FORMAT
gst_debug_bin_to_dot_data
gst_debug_bin_to_dot_file
gst_debug_bin_to_dot_file_with_ts
@@ -2565,9 +2569,14 @@
gst_segment_copy
gst_segment_free
gst_segment_do_seek
+gst_segment_position_from_stream_time
+gst_segment_position_from_stream_time_full
gst_segment_to_running_time
gst_segment_to_running_time_full
gst_segment_to_stream_time
+gst_segment_to_stream_time_full
+gst_segment_position_from_running_time
+gst_segment_position_from_running_time_full
gst_segment_to_position
gst_segment_set_running_time
gst_segment_copy_into
diff --git a/docs/gst/html/GstBuffer.html b/docs/gst/html/GstBuffer.html
index 191c275..749005b 100644
--- a/docs/gst/html/GstBuffer.html
+++ b/docs/gst/html/GstBuffer.html
@@ -79,6 +79,12 @@
<tr>
<td class="define_keyword">#define</td>
<td class="function_name">
+<a class="link" href="GstBuffer.html#GST-BUFFER-DTS-OR-PTS:CAPS" title="GST_BUFFER_DTS_OR_PTS()">GST_BUFFER_DTS_OR_PTS</a><span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name">
<a class="link" href="GstBuffer.html#GST-BUFFER-DURATION:CAPS" title="GST_BUFFER_DURATION()">GST_BUFFER_DURATION</a><span class="c_punctuation">()</span>
</td>
</tr>
@@ -871,13 +877,36 @@
</div>
<hr>
<div class="refsect2">
+<a name="GST-BUFFER-DTS-OR-PTS:CAPS"></a><h3>GST_BUFFER_DTS_OR_PTS()</h3>
+<pre class="programlisting">#define GST_BUFFER_DTS_OR_PTS(buf) (GST_BUFFER_DTS_IS_VALID(buf) ? GST_BUFFER_DTS(buf) : GST_BUFFER_PTS (buf))
+</pre>
+<p>Returns the buffer decoding timestamp (dts) if valid, else the buffer
+presentation time (pts)</p>
+<div class="refsect3">
+<a name="id-1.3.7.8.8.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buf</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstBuffer.html" title="GstBuffer"><span class="type">GstBuffer</span></a>.:</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
<a name="GST-BUFFER-DURATION:CAPS"></a><h3>GST_BUFFER_DURATION()</h3>
<pre class="programlisting">#define GST_BUFFER_DURATION(buf) (GST_BUFFER_CAST(buf)->duration)
</pre>
<p>The duration in nanoseconds (as a <a class="link" href="GstClock.html#GstClockTime" title="GstClockTime"><span class="type">GstClockTime</span></a>) of the data in the buffer.
Value will be <a class="link" href="GstClock.html#GST-CLOCK-TIME-NONE:CAPS" title="GST_CLOCK_TIME_NONE"><code class="literal">GST_CLOCK_TIME_NONE</code></a> if the duration is unknown.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.8.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.9.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -899,7 +928,7 @@
</pre>
<p>The offset in the source file of the beginning of this buffer.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.9.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.10.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -921,7 +950,7 @@
</pre>
<p>The offset in the source file of the end of this buffer.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.10.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.11.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -950,7 +979,7 @@
</pre>
<p>Tests if the duration is known.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.12.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.13.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -972,7 +1001,7 @@
</pre>
<p>Tests if the pts is known.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.13.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.14.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -994,7 +1023,7 @@
</pre>
<p>Tests if the dts is known.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.14.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.15.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1016,7 +1045,7 @@
</pre>
<p>Tests if the start offset is known.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.15.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.16.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1038,7 +1067,7 @@
</pre>
<p>Tests if the end offset is known.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.16.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.17.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1060,7 +1089,7 @@
</pre>
<p>Tests if the buffer marks a discontinuity in the stream.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.17.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.18.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1083,7 +1112,7 @@
<p>Creates a newly allocated buffer without any data.</p>
<p>MT safe.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.18.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.19.6"></a><h4>Returns</h4>
<p> the new <a class="link" href="GstBuffer.html" title="GstBuffer"><span class="type">GstBuffer</span></a>. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
</div>
@@ -1105,7 +1134,7 @@
== 0, the buffer will not have memory associated with it.</p>
<p>MT safe.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.19.8"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.20.8"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1133,7 +1162,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.19.9"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.20.9"></a><h4>Returns</h4>
<p> a new <a class="link" href="GstBuffer.html" title="GstBuffer"><span class="type">GstBuffer</span></a>, or <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if
the memory couldn't be allocated. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></p>
@@ -1150,7 +1179,7 @@
with g_free and will be marked writable.</p>
<p>MT safe.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.20.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.21.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1173,7 +1202,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.20.7"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.21.7"></a><h4>Returns</h4>
<p> a new <a class="link" href="GstBuffer.html" title="GstBuffer"><span class="type">GstBuffer</span></a>. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
</div>
@@ -1203,7 +1232,7 @@
contains
<a class="link" href="GstMemory.html#GST-MEMORY-FLAG-ZERO-PREFIXED:CAPS"><span class="type">GST_MEMORY_FLAG_ZERO_PREFIXED</span></a> and <a class="link" href="GstMemory.html#GST-MEMORY-FLAG-ZERO-PADDED:CAPS"><span class="type">GST_MEMORY_FLAG_ZERO_PADDED</span></a> respectively.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.21.7"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.22.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1253,7 +1282,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.21.8"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.22.8"></a><h4>Returns</h4>
<p> a new <a class="link" href="GstBuffer.html" title="GstBuffer"><span class="type">GstBuffer</span></a>. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
</div>
@@ -1271,7 +1300,7 @@
GstBuffer instances can potentially increase the number
of memcpy operations in a pipeline.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.22.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.23.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1286,7 +1315,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.22.7"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.23.7"></a><h4>Returns</h4>
<p> <em class="parameter"><code>buf</code></em>
. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
@@ -1300,7 +1329,7 @@
<p>Decreases the refcount of the buffer. If the refcount reaches 0, the buffer
with the associated metadata and memory will be freed.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.23.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.24.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1336,7 +1365,7 @@
can be used to resize the
buffer memory blocks with <a class="link" href="GstBuffer.html#gst-buffer-resize" title="gst_buffer_resize ()"><code class="function">gst_buffer_resize()</code></a>.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.24.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.25.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1363,7 +1392,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.24.7"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.25.7"></a><h4>Returns</h4>
<p> total size of the memory blocks in <em class="parameter"><code>buffer</code></em>
.</p>
</div>
@@ -1376,7 +1405,7 @@
<p>Get the total size of the memory blocks in <em class="parameter"><code>buffer</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.25.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.26.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1391,7 +1420,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.25.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.26.6"></a><h4>Returns</h4>
<p> total size of the memory blocks in <em class="parameter"><code>buffer</code></em>
.</p>
</div>
@@ -1425,7 +1454,7 @@
can be used to resize the buffer memory blocks with
<a class="link" href="GstBuffer.html#gst-buffer-resize-range" title="gst_buffer_resize_range ()"><code class="function">gst_buffer_resize_range()</code></a>.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.26.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.27.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1462,7 +1491,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.26.7"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.27.7"></a><h4>Returns</h4>
<p> total size of <em class="parameter"><code>length</code></em>
memory blocks starting at <em class="parameter"><code>idx</code></em>
in <em class="parameter"><code>buffer</code></em>
@@ -1484,7 +1513,7 @@
<em class="parameter"><code>buffer</code></em>
</p>
<div class="refsect3">
-<a name="id-1.3.7.8.27.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.28.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1521,7 +1550,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.27.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.28.6"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if resizing succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</p>
</div>
</div>
@@ -1535,7 +1564,7 @@
<p>Set the offset and total size of the memory blocks in <em class="parameter"><code>buffer</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.28.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.29.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1571,7 +1600,7 @@
<p>Set the total size of the memory blocks in <em class="parameter"><code>buffer</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.29.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.30.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1603,7 +1632,7 @@
<p>When more memory blocks are added, existing memory blocks will be merged
together to make room for the new block.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.30.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.31.6"></a><h4>Returns</h4>
<p> the maximum amount of memory blocks that a buffer can hold.</p>
</div>
<p class="since">Since: <a class="link" href="ix06.html#api-index-1.2">1.2</a></p>
@@ -1622,7 +1651,7 @@
any call that modifies the memory in <em class="parameter"><code>buffer</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.31.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.32.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1644,7 +1673,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.31.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.32.6"></a><h4>Returns</h4>
<p> the <a class="link" href="GstMemory.html" title="GstMemory"><span class="type">GstMemory</span></a> at <em class="parameter"><code>idx</code></em>
. </p>
<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
@@ -1658,7 +1687,7 @@
<p>Get the amount of memory blocks that this buffer has. This amount is never
larger than what <a class="link" href="GstBuffer.html#gst-buffer-get-max-memory" title="gst_buffer_get_max_memory ()"><code class="function">gst_buffer_get_max_memory()</code></a> returns.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.32.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.33.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1673,7 +1702,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.32.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.33.6"></a><h4>Returns</h4>
<p> the amount of memory block in this buffer. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
</div>
@@ -1695,7 +1724,7 @@
added, existing memory blocks will automatically be merged to make room for
the new memory.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.33.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.34.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1743,7 +1772,7 @@
<p><em class="parameter"><code>buffer</code></em>
should be writable.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.34.7"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.35.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1791,7 +1820,7 @@
is -1, all memory starting from <em class="parameter"><code>idx</code></em>
is merged.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.35.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.36.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1818,7 +1847,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.35.7"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.36.7"></a><h4>Returns</h4>
<p> a <a class="link" href="GstMemory.html" title="GstMemory"><span class="type">GstMemory</span></a> that contains the merged data of <em class="parameter"><code>length</code></em>
blocks starting at <em class="parameter"><code>idx</code></em>
. Use <a class="link" href="GstMemory.html#gst-memory-unref" title="gst_memory_unref ()"><code class="function">gst_memory_unref()</code></a> after usage. </p>
@@ -1840,7 +1869,7 @@
can be -1, in which case all memory starting from <em class="parameter"><code>idx</code></em>
is removed.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.36.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.37.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1898,7 +1927,7 @@
can be -1 to get all the memory blocks after <em class="parameter"><code>idx</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.37.7"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.38.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -1940,7 +1969,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.37.8"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.38.8"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> when <em class="parameter"><code>size</code></em>
bytes starting from <em class="parameter"><code>offset</code></em>
could be found in
@@ -1965,7 +1994,7 @@
<p>This function is identical to <a class="link" href="GstBuffer.html#gst-buffer-insert-memory" title="gst_buffer_insert_memory ()"><code class="function">gst_buffer_insert_memory()</code></a> with an index of 0.
See <a class="link" href="GstBuffer.html#gst-buffer-insert-memory" title="gst_buffer_insert_memory ()"><code class="function">gst_buffer_insert_memory()</code></a> for more details.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.38.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.39.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2001,7 +2030,7 @@
<p>This function is identical to <a class="link" href="GstBuffer.html#gst-buffer-insert-memory" title="gst_buffer_insert_memory ()"><code class="function">gst_buffer_insert_memory()</code></a> with an index of -1.
See <a class="link" href="GstBuffer.html#gst-buffer-insert-memory" title="gst_buffer_insert_memory ()"><code class="function">gst_buffer_insert_memory()</code></a> for more details.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.39.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.40.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2035,7 +2064,7 @@
with <em class="parameter"><code>mem</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.40.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.41.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2072,7 +2101,7 @@
with <em class="parameter"><code>mem</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.41.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.42.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2104,7 +2133,7 @@
in <em class="parameter"><code>buffer</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.42.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.43.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2126,7 +2155,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.42.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.43.6"></a><h4>Returns</h4>
<p> a <a class="link" href="GstMemory.html" title="GstMemory"><span class="type">GstMemory</span></a> that contains the data of the
memory block at <em class="parameter"><code>idx</code></em>
. Use <a class="link" href="GstMemory.html#gst-memory-unref" title="gst_memory_unref ()"><code class="function">gst_memory_unref()</code></a> after usage. </p>
@@ -2142,7 +2171,7 @@
. The memory blocks will be merged
into one large <a class="link" href="GstMemory.html" title="GstMemory"><span class="type">GstMemory</span></a>.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.43.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.44.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2157,7 +2186,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.43.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.44.6"></a><h4>Returns</h4>
<p> a <a class="link" href="GstMemory.html" title="GstMemory"><span class="type">GstMemory</span></a> that contains the merged memory.
Use <a class="link" href="GstMemory.html#gst-memory-unref" title="gst_memory_unref ()"><code class="function">gst_memory_unref()</code></a> after usage. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
@@ -2173,7 +2202,7 @@
at index <em class="parameter"><code>i</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.44.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.45.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2203,7 +2232,7 @@
<p>Remove all the memory blocks in <em class="parameter"><code>buffer</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.45.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.46.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2229,7 +2258,7 @@
is writable, use
<a class="link" href="GstBuffer.html#gst-buffer-is-writable" title="gst_buffer_is_writable()"><code class="function">gst_buffer_is_writable()</code></a> to check that if needed.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.46.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.47.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2244,7 +2273,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.46.7"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.47.7"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if all memory blocks in <em class="parameter"><code>buffer</code></em>
are writable</p>
</div>
@@ -2268,7 +2297,7 @@
is writable, use
<a class="link" href="GstBuffer.html#gst-buffer-is-writable" title="gst_buffer_is_writable()"><code class="function">gst_buffer_is_writable()</code></a> to check that if needed.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.47.7"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.48.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2295,7 +2324,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.47.8"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.48.8"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the memory range is writable</p>
</div>
<p class="since">Since: <a class="link" href="ix04.html#api-index-1.4">1.4</a></p>
@@ -2325,7 +2354,7 @@
should be unmapped with <a class="link" href="GstBuffer.html#gst-buffer-unmap" title="gst_buffer_unmap ()"><code class="function">gst_buffer_unmap()</code></a> after
usage.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.48.8"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.49.8"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2352,7 +2381,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.48.9"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.49.9"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the map succeeded and <em class="parameter"><code>info</code></em>
contains valid data.</p>
</div>
@@ -2388,7 +2417,7 @@
<p>The memory in <em class="parameter"><code>info</code></em>
should be unmapped with <a class="link" href="GstBuffer.html#gst-buffer-unmap" title="gst_buffer_unmap ()"><code class="function">gst_buffer_unmap()</code></a> after usage.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.49.8"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.50.8"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2425,7 +2454,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.49.9"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.50.9"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the map succeeded and <em class="parameter"><code>info</code></em>
contains valid
data.</p>
@@ -2439,7 +2468,7 @@
<em class="parameter"><code><a class="link" href="GstMemory.html#GstMapInfo" title="GstMapInfo"><span class="type">GstMapInfo</span></a> *info</code></em>);</pre>
<p>Release the memory previously mapped with <a class="link" href="GstBuffer.html#gst-buffer-map" title="gst_buffer_map ()"><code class="function">gst_buffer_map()</code></a>.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.50.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.51.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2475,7 +2504,7 @@
with the memory in <em class="parameter"><code>mem</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.51.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.52.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2508,7 +2537,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.51.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.52.6"></a><h4>Returns</h4>
<p> 0 if the memory is equal.</p>
</div>
</div>
@@ -2526,7 +2555,7 @@
to <em class="parameter"><code>dest</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.52.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.53.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2558,7 +2587,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.52.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.53.6"></a><h4>Returns</h4>
<p> The amount of bytes extracted. This value can be lower than <em class="parameter"><code>size</code></em>
when <em class="parameter"><code>buffer</code></em>
did not contain enough data.</p>
@@ -2579,7 +2608,7 @@
newly-allocated memory. <em class="parameter"><code>dest</code></em>
must be freed using <a href="https://developer.gnome.org/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> when done.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.53.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.54.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2633,7 +2662,7 @@
at <em class="parameter"><code>offset</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.54.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.55.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2665,7 +2694,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.54.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.55.6"></a><h4>Returns</h4>
<p> The amount of bytes copied. This value can be lower than <em class="parameter"><code>size</code></em>
when <em class="parameter"><code>buffer</code></em>
did not contain enough data.</p>
@@ -2685,7 +2714,7 @@
starting from <em class="parameter"><code>offset</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.55.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.56.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2718,7 +2747,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.55.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.56.6"></a><h4>Returns</h4>
<p> The amount of bytes filled. This value can be lower than <em class="parameter"><code>size</code></em>
when <em class="parameter"><code>buffer</code></em>
did not contain enough data.</p>
@@ -2750,7 +2779,7 @@
Check <a class="link" href="GstBuffer.html#gst-buffer-copy-deep" title="gst_buffer_copy_deep ()"><code class="function">gst_buffer_copy_deep()</code></a> if you want to force the data
to be copied to newly allocated memory.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.58.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.59.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2765,7 +2794,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.58.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.59.6"></a><h4>Returns</h4>
<p> a new copy of <em class="parameter"><code>buf</code></em>
. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
@@ -2792,7 +2821,7 @@
<p><em class="parameter"><code>flags</code></em>
indicate which fields will be copied.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.59.7"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.60.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2829,7 +2858,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.59.8"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.60.8"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the copying succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</p>
</div>
</div>
@@ -2857,7 +2886,7 @@
to <a class="link" href="GstClock.html#GST-CLOCK-TIME-NONE:CAPS" title="GST_CLOCK_TIME_NONE"><span class="type">GST_CLOCK_TIME_NONE</span></a> and <a class="link" href="GstBuffer.html#GST-BUFFER-OFFSET-NONE:CAPS" title="GST_BUFFER_OFFSET_NONE"><span class="type">GST_BUFFER_OFFSET_NONE</span></a>.</p>
<p>MT safe.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.60.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.61.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2891,7 +2920,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.60.7"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.61.7"></a><h4>Returns</h4>
<p> the new <a class="link" href="GstBuffer.html" title="GstBuffer"><span class="type">GstBuffer</span></a> or <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if the arguments were
invalid. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
@@ -2905,7 +2934,7 @@
<p>Create a copy of the given buffer. This will make a newly allocated
copy of the data the source buffer contains.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.61.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.62.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2920,7 +2949,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.61.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.62.6"></a><h4>Returns</h4>
<p> a new copy of <em class="parameter"><code>buf</code></em>
. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
@@ -2936,7 +2965,7 @@
It is only safe to change buffer metadata when the current reference is
writable, i.e. nobody can see the modifications you will make.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.62.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.63.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2956,11 +2985,25 @@
<a name="gst-buffer-make-writable"></a><h3>gst_buffer_make_writable()</h3>
<pre class="programlisting">#define gst_buffer_make_writable(buf) GST_BUFFER_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST (buf)))
</pre>
-<p>Makes a writable buffer from the given buffer. If the source buffer is
-already writable, this will simply return the same buffer. A copy will
-otherwise be made using <a class="link" href="GstBuffer.html#gst-buffer-copy" title="gst_buffer_copy ()"><code class="function">gst_buffer_copy()</code></a>.</p>
+<p>Returns a writable copy of <em class="parameter"><code>buf</code></em>
+. If the source buffer is
+already writable, this will simply return the same buffer.</p>
+<p>Use this function to ensure that a buffer can be safely modified before
+making changes to it, including changing the metadata such as PTS/DTS.</p>
+<p>If the reference count of the source buffer <em class="parameter"><code>buf</code></em>
+ is exactly one, the caller
+is the sole owner and this function will return the buffer object unchanged.</p>
+<p>If there is more than one reference on the object, a copy will be made using
+<a class="link" href="GstBuffer.html#gst-buffer-copy" title="gst_buffer_copy ()"><code class="function">gst_buffer_copy()</code></a>. The passed-in <em class="parameter"><code>buf</code></em>
+ will be unreffed in that case, and the
+caller will now own a reference to the new returned buffer object. Note
+that this just copies the buffer structure itself, the underlying memory is
+not copied if it can be shared amongst multiple buffers.</p>
+<p>In short, this function unrefs the buf in the argument and refs the buffer
+that it returns. Don't access the argument after calling this function unless
+you have an additional reference to it.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.63.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.64.9"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2975,7 +3018,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.63.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.64.10"></a><h4>Returns</h4>
<p> a writable buffer which may or may not be the
same as <em class="parameter"><code>buf</code></em>
. </p>
@@ -2996,7 +3039,7 @@
or the <a class="link" href="GstBuffer.html" title="GstBuffer"><span class="type">GstBuffer</span></a> pointed to by <em class="parameter"><code>obuf</code></em>
may be <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.64.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.65.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3021,7 +3064,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.64.7"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.65.7"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> when <em class="parameter"><code>obuf</code></em>
was different from <em class="parameter"><code>nbuf</code></em>
.</p>
@@ -3040,7 +3083,7 @@
and <em class="parameter"><code>buf2</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.65.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.66.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3062,7 +3105,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.65.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.66.6"></a><h4>Returns</h4>
<p> the new <a class="link" href="GstBuffer.html" title="GstBuffer"><span class="type">GstBuffer</span></a> that contains the memory
of the two source buffers. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
@@ -3086,7 +3129,7 @@
<em class="parameter"><code>buf2</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.66.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.67.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3120,7 +3163,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.66.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.67.6"></a><h4>Returns</h4>
<p> the new <a class="link" href="GstBuffer.html" title="GstBuffer"><span class="type">GstBuffer</span></a> that contains the memory
of the two source buffers. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
@@ -3140,7 +3183,7 @@
given API use <a class="link" href="GstBuffer.html#gst-buffer-iterate-meta" title="gst_buffer_iterate_meta ()"><code class="function">gst_buffer_iterate_meta()</code></a> or <a class="link" href="GstBuffer.html#gst-buffer-foreach-meta" title="gst_buffer_foreach_meta ()"><code class="function">gst_buffer_foreach_meta()</code></a> instead
and check the meta->info.api member for the API type.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.67.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.68.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3162,7 +3205,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.67.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.68.6"></a><h4>Returns</h4>
<p> the metadata for <em class="parameter"><code>api</code></em>
on
<em class="parameter"><code>buffer</code></em>
@@ -3182,7 +3225,7 @@
using the parameters in <em class="parameter"><code>params</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.68.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.69.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3210,7 +3253,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.68.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.69.6"></a><h4>Returns</h4>
<p> the metadata for the api in <em class="parameter"><code>info</code></em>
on <em class="parameter"><code>buffer</code></em>
. </p>
@@ -3227,7 +3270,7 @@
on <em class="parameter"><code>buffer</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.69.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.70.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3249,7 +3292,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.69.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.70.6"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the metadata existed and was removed, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if no such
metadata was on <em class="parameter"><code>buffer</code></em>
.</p>
@@ -3268,7 +3311,7 @@
<p><em class="parameter"><code>state</code></em>
will be updated with an opaque state pointer</p>
<div class="refsect3">
-<a name="id-1.3.7.8.70.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.71.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3290,7 +3333,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.70.7"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.71.7"></a><h4>Returns</h4>
<p> The next <a class="link" href="gstreamer-GstMeta.html#GstMeta" title="struct GstMeta"><span class="type">GstMeta</span></a> or <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
when there are no more items. </p>
<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="NULL may be passed as the value in, out, in-out; or as a return value."><span class="acronym">nullable</span></acronym>]</span></p>
@@ -3313,7 +3356,7 @@
<p>When <em class="parameter"><code>meta</code></em>
is set to <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, the item will be removed from the buffer.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.71.8"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.72.8"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3340,7 +3383,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.71.9"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.72.9"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> when <a class="link" href="GstBuffer.html#gst-buffer-foreach-meta" title="gst_buffer_foreach_meta ()"><code class="function">gst_buffer_foreach_meta()</code></a> should stop</p>
</div>
</div>
@@ -3361,7 +3404,7 @@
define if this function returns or if the remaining metadata items
in the buffer should be skipped.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.72.6"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.73.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3389,7 +3432,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.72.7"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.73.7"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> when <em class="parameter"><code>func</code></em>
returned <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> for one of the metadata.</p>
</div>
@@ -3405,7 +3448,7 @@
<em class="parameter"><code>ref</code></em>
until the buffer is freed.</p>
<div class="refsect3">
-<a name="id-1.3.7.8.73.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.74.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3427,7 +3470,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.7.8.73.6"></a><h4>Returns</h4>
+<a name="id-1.3.7.8.74.6"></a><h4>Returns</h4>
<p> The <a class="link" href="GstBuffer.html#GstParentBufferMeta" title="struct GstParentBufferMeta"><span class="type">GstParentBufferMeta</span></a> that was added to the buffer. </p>
<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
</div>
@@ -3440,7 +3483,7 @@
<p>Find and return a <a class="link" href="GstBuffer.html#GstParentBufferMeta" title="struct GstParentBufferMeta"><span class="type">GstParentBufferMeta</span></a> if one exists on the
buffer</p>
<div class="refsect3">
-<a name="id-1.3.7.8.74.5"></a><h4>Parameters</h4>
+<a name="id-1.3.7.8.75.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
diff --git a/docs/gst/html/GstCaps.html b/docs/gst/html/GstCaps.html
index 7ae3d89..488f111 100644
--- a/docs/gst/html/GstCaps.html
+++ b/docs/gst/html/GstCaps.html
@@ -2508,7 +2508,10 @@
<em class="parameter"><code>GstStructures</code></em>
.</p>
<p>This function takes ownership of <em class="parameter"><code>caps</code></em>
-.</p>
+ and will call <a class="link" href="GstCaps.html#gst-caps-make-writable" title="gst_caps_make_writable()"><code class="function">gst_caps_make_writable()</code></a>
+on it so you must not use <em class="parameter"><code>caps</code></em>
+ afterwards unless you keep an additional
+reference to it with <a class="link" href="GstCaps.html#gst-caps-ref" title="gst_caps_ref ()"><code class="function">gst_caps_ref()</code></a>.</p>
<div class="refsect3">
<a name="id-1.3.11.8.55.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
@@ -2540,10 +2543,15 @@
same set of formats, but in a simpler form. Component structures that are
identical are merged. Component structures that have values that can be
merged are also merged.</p>
+<p>This function takes ownership of <em class="parameter"><code>caps</code></em>
+ and will call <a class="link" href="GstCaps.html#gst-caps-make-writable" title="gst_caps_make_writable()"><code class="function">gst_caps_make_writable()</code></a>
+on it if necessary, so you must not use <em class="parameter"><code>caps</code></em>
+ afterwards unless you keep an
+additional reference to it with <a class="link" href="GstCaps.html#gst-caps-ref" title="gst_caps_ref ()"><code class="function">gst_caps_ref()</code></a>.</p>
<p>This method does not preserve the original order of <em class="parameter"><code>caps</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.11.8.56.6"></a><h4>Parameters</h4>
+<a name="id-1.3.11.8.56.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2558,7 +2566,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.11.8.56.7"></a><h4>Returns</h4>
+<a name="id-1.3.11.8.56.8"></a><h4>Returns</h4>
<p> The simplified caps.</p>
</div>
</div>
@@ -2811,8 +2819,13 @@
<p>Discard all but the first structure from <em class="parameter"><code>caps</code></em>
. Useful when
fixating.</p>
+<p>This function takes ownership of <em class="parameter"><code>caps</code></em>
+ and will call <a class="link" href="GstCaps.html#gst-caps-make-writable" title="gst_caps_make_writable()"><code class="function">gst_caps_make_writable()</code></a>
+on it if necessary, so you must not use <em class="parameter"><code>caps</code></em>
+ afterwards unless you keep an
+additional reference to it with <a class="link" href="GstCaps.html#gst-caps-ref" title="gst_caps_ref ()"><code class="function">gst_caps_ref()</code></a>.</p>
<div class="refsect3">
-<a name="id-1.3.11.8.63.5"></a><h4>Parameters</h4>
+<a name="id-1.3.11.8.63.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2827,7 +2840,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.11.8.63.6"></a><h4>Returns</h4>
+<a name="id-1.3.11.8.63.7"></a><h4>Returns</h4>
<p> truncated caps. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
</div>
@@ -2841,8 +2854,13 @@
into a representation with only fixed
values. First the caps will be truncated and then the first structure will be
fixated with <a class="link" href="GstStructure.html#gst-structure-fixate" title="gst_structure_fixate ()"><code class="function">gst_structure_fixate()</code></a>.</p>
+<p>This function takes ownership of <em class="parameter"><code>caps</code></em>
+ and will call <a class="link" href="GstCaps.html#gst-caps-make-writable" title="gst_caps_make_writable()"><code class="function">gst_caps_make_writable()</code></a>
+on it so you must not use <em class="parameter"><code>caps</code></em>
+ afterwards unless you keep an additional
+reference to it with <a class="link" href="GstCaps.html#gst-caps-ref" title="gst_caps_ref ()"><code class="function">gst_caps_ref()</code></a>.</p>
<div class="refsect3">
-<a name="id-1.3.11.8.64.5"></a><h4>Parameters</h4>
+<a name="id-1.3.11.8.64.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2857,7 +2875,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.11.8.64.6"></a><h4>Returns</h4>
+<a name="id-1.3.11.8.64.7"></a><h4>Returns</h4>
<p> the fixated caps. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
</div>
diff --git a/docs/gst/html/GstContext.html b/docs/gst/html/GstContext.html
index d1bdbdb..28937b5 100644
--- a/docs/gst/html/GstContext.html
+++ b/docs/gst/html/GstContext.html
@@ -180,6 +180,11 @@
<p>Bins will catch GST_MESSAGE_NEED_CONTEXT messages and will set any previously
known context on the element that asks for it if possible. Otherwise the
application should provide one if it can.</p>
+<p><a class="link" href="GstContext.html" title="GstContext"><span class="type">GstContext</span></a>s can be persistent.
+A persistent <a class="link" href="GstContext.html" title="GstContext"><span class="type">GstContext</span></a> is kept in elements when they reach
+<a class="link" href="GstElement.html#GST-STATE-NULL:CAPS"><code class="literal">GST_STATE_NULL</code></a>, non-persistent ones will be removed.
+Also, a non-persistent context won't override a previous persistent
+context set to an element.</p>
</div>
<div class="refsect1">
<a name="GstContext.functions_details"></a><h2>Functions</h2>
@@ -446,8 +451,8 @@
<div class="refsect3">
<a name="id-1.3.17.8.10.6"></a><h4>Returns</h4>
<p> The structure of the context. The structure is still
-owned by the event, which means that you should not free it and
-that the pointer becomes invalid when you free the event.
+owned by the context, which means that you should not free it and
+that the pointer becomes invalid when you free the context.
This function checks if <em class="parameter"><code>context</code></em>
is writable.</p>
</div>
diff --git a/docs/gst/html/GstControlSource.html b/docs/gst/html/GstControlSource.html
index 0b21e32..78a991f 100644
--- a/docs/gst/html/GstControlSource.html
+++ b/docs/gst/html/GstControlSource.html
@@ -252,8 +252,8 @@
</tr>
<tr>
<td class="parameter_name"><p>value</p></td>
-<td class="parameter_description"><p>the value</p></td>
-<td class="parameter_annotations"> </td>
+<td class="parameter_description"><p> the value. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
</tr>
</tbody>
</table></div>
diff --git a/docs/gst/html/GstElement.html b/docs/gst/html/GstElement.html
index e7e28db..fbf5355 100644
--- a/docs/gst/html/GstElement.html
+++ b/docs/gst/html/GstElement.html
@@ -465,6 +465,30 @@
</tr>
<tr>
<td class="function_type">
+<a class="link" href="GstContext.html" title="GstContext"><span class="returnvalue">GstContext</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="GstElement.html#gst-element-get-context" title="gst_element_get_context ()">gst_element_get_context</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="GstContext.html" title="GstContext"><span class="returnvalue">GstContext</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="GstElement.html#gst-element-get-context-unlocked" title="gst_element_get_context_unlocked ()">gst_element_get_context_unlocked</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="GstElement.html#gst-element-get-contexts" title="gst_element_get_contexts ()">gst_element_get_contexts</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
<a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="returnvalue">GstElementFactory</span></a> *
</td>
<td class="function_name">
@@ -2886,12 +2910,116 @@
</div>
<hr>
<div class="refsect2">
+<a name="gst-element-get-context"></a><h3>gst_element_get_context ()</h3>
+<pre class="programlisting"><a class="link" href="GstContext.html" title="GstContext"><span class="returnvalue">GstContext</span></a> *
+gst_element_get_context (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code>const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *context_type</code></em>);</pre>
+<p>Gets the context with <em class="parameter"><code>context_type</code></em>
+ set on the element or NULL.</p>
+<p>MT safe.</p>
+<div class="refsect3">
+<a name="id-1.3.21.10.60.6"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>element</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to get the context of.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>context_type</p></td>
+<td class="parameter_description"><p>a name of a context to retrieve</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.3.21.10.60.7"></a><h4>Returns</h4>
+<p> A <a class="link" href="GstContext.html" title="GstContext"><span class="type">GstContext</span></a> or NULL. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: 1.8</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-get-context-unlocked"></a><h3>gst_element_get_context_unlocked ()</h3>
+<pre class="programlisting"><a class="link" href="GstContext.html" title="GstContext"><span class="returnvalue">GstContext</span></a> *
+gst_element_get_context_unlocked (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>,
+ <em class="parameter"><code>const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *context_type</code></em>);</pre>
+<p>Gets the context with <em class="parameter"><code>context_type</code></em>
+ set on the element or NULL.</p>
+<div class="refsect3">
+<a name="id-1.3.21.10.61.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>element</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to get the context of.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>context_type</p></td>
+<td class="parameter_description"><p>a name of a context to retrieve</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.3.21.10.61.6"></a><h4>Returns</h4>
+<p> A <a class="link" href="GstContext.html" title="GstContext"><span class="type">GstContext</span></a> or NULL. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: 1.8</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-element-get-contexts"></a><h3>gst_element_get_contexts ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *
+gst_element_get_contexts (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
+<p>Gets the contexts set on the element.</p>
+<p>MT safe.</p>
+<div class="refsect3">
+<a name="id-1.3.21.10.62.6"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>element</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> to set the context of.</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.3.21.10.62.7"></a><h4>Returns</h4>
+<p> List of <a class="link" href="GstContext.html" title="GstContext"><span class="type">GstContext</span></a>. </p>
+<p><span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> Gst.Context][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+<p class="since">Since: 1.8</p>
+</div>
+<hr>
+<div class="refsect2">
<a name="gst-element-get-factory"></a><h3>gst_element_get_factory ()</h3>
<pre class="programlisting"><a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="returnvalue">GstElementFactory</span></a> *
gst_element_get_factory (<em class="parameter"><code><a class="link" href="GstElement.html" title="GstElement"><span class="type">GstElement</span></a> *element</code></em>);</pre>
<p>Retrieves the factory that was used to create this element.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.60.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.63.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2906,7 +3034,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.60.6"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.63.6"></a><h4>Returns</h4>
<p> the <a class="link" href="GstElementFactory.html" title="GstElementFactory"><span class="type">GstElementFactory</span></a> used for creating this
element. no refcounting is needed. </p>
<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
@@ -2919,7 +3047,7 @@
</pre>
<p>Sets the name of the element, getting rid of the old name if there was one.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.61.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.64.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2952,7 +3080,7 @@
For a nameless element, this returns <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, which you can safely <a href="https://developer.gnome.org/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a>
as well.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.62.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.65.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2968,7 +3096,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.62.6"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.65.6"></a><h4>Returns</h4>
<p> the name of <em class="parameter"><code>elem</code></em>
. <a href="https://developer.gnome.org/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a>
after usage. MT safe. </p>
@@ -2982,7 +3110,7 @@
</pre>
<p>Sets the parent of an element.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.63.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.66.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3011,7 +3139,7 @@
</pre>
<p>Get the parent of an element.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.64.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.67.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3026,7 +3154,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.64.6"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.67.6"></a><h4>Returns</h4>
<p> the parent of an element. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
</div>
@@ -3041,7 +3169,7 @@
refcount on the clock. Any previously set clock on the object
is unreffed.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.65.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.68.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3063,7 +3191,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.65.6"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.68.6"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the element accepted the clock. An element can refuse a
clock when it, for example, is not able to slave its internal clock to the
<em class="parameter"><code>clock</code></em>
@@ -3081,7 +3209,7 @@
<p>Elements in a pipeline will only have their clock set when the
pipeline is in the PLAYING state.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.66.6"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.69.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3096,7 +3224,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.66.7"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.69.7"></a><h4>Returns</h4>
<p> the <a class="link" href="GstClock.html" title="GstClock"><span class="type">GstClock</span></a> of the element. unref after usage.</p>
<p>MT safe. </p>
<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
@@ -3111,7 +3239,7 @@
<div class="note">An element is only required to provide a clock in the PAUSED
state. Some elements can provide a clock in other states.</div>
<div class="refsect3">
-<a name="id-1.3.21.10.67.6"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.70.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3126,7 +3254,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.67.7"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.70.7"></a><h4>Returns</h4>
<p> the GstClock provided by the
element or <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if no clock could be provided. Unref after usage.</p>
<p>MT safe. </p>
@@ -3151,7 +3279,7 @@
<p>State changes to <a class="link" href="GstElement.html#GST-STATE-READY:CAPS"><code class="literal">GST_STATE_READY</code></a> or <a class="link" href="GstElement.html#GST-STATE-NULL:CAPS"><code class="literal">GST_STATE_NULL</code></a> never return
<a class="link" href="GstElement.html#GST-STATE-CHANGE-ASYNC:CAPS"><span class="type">GST_STATE_CHANGE_ASYNC</span></a>.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.68.7"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.71.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3173,7 +3301,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.68.8"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.71.8"></a><h4>Returns</h4>
<p> Result of the state change using <a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="type">GstStateChangeReturn</span></a>.</p>
<p>MT safe.</p>
</div>
@@ -3204,7 +3332,7 @@
an element is not producing data to complete the preroll. When setting the
element to playing, the preroll will complete and playback will start.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.69.8"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.72.8"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3239,7 +3367,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.69.9"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.72.9"></a><h4>Returns</h4>
<p> <a class="link" href="GstElement.html#GST-STATE-CHANGE-SUCCESS:CAPS"><code class="literal">GST_STATE_CHANGE_SUCCESS</code></a> if the element has no more pending state
and the last state change succeeded, <a class="link" href="GstElement.html#GST-STATE-CHANGE-ASYNC:CAPS"><code class="literal">GST_STATE_CHANGE_ASYNC</code></a> if the
element is still performing a state change or
@@ -3257,7 +3385,7 @@
this element anymore.</p>
<p>MT safe.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.70.6"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.73.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3279,7 +3407,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.70.7"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.73.7"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the state was changed, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if bad parameters were given
or the elements state-locking needed no change.</p>
</div>
@@ -3296,7 +3424,7 @@
state before changing the state from <a class="link" href="GstElement.html#GST-STATE-NULL:CAPS"><span class="type">GST_STATE_NULL</span></a>.</p>
<p>MT safe.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.71.6"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.74.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3311,7 +3439,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.71.7"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.74.7"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, if the element's state is locked.</p>
</div>
</div>
@@ -3326,7 +3454,7 @@
<p>This function should be called with the STATE_LOCK held.</p>
<p>MT safe.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.72.7"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.75.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3357,7 +3485,7 @@
<p>This method is used internally and should normally not be called by plugins
or applications.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.73.7"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.76.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3379,7 +3507,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.73.8"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.76.8"></a><h4>Returns</h4>
<p> The result of the commit state change.</p>
<p>MT safe.</p>
</div>
@@ -3403,7 +3531,7 @@
<p>This function is used internally and should normally not be called from
plugins or applications.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.74.8"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.77.8"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3425,7 +3553,7 @@
gst_element_state_get_name (<em class="parameter"><code><a class="link" href="GstElement.html#GstState" title="enum GstState"><span class="type">GstState</span></a> state</code></em>);</pre>
<p>Gets a string representing the given state.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.75.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.78.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3440,7 +3568,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.75.6"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.78.6"></a><h4>Returns</h4>
<p> a string with the name of the state. </p>
<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
</div>
@@ -3453,7 +3581,7 @@
(<em class="parameter"><code><a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="type">GstStateChangeReturn</span></a> state_ret</code></em>);</pre>
<p>Gets a string representing the given state change result.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.76.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.79.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3468,7 +3596,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.76.6"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.79.6"></a><h4>Returns</h4>
<p> a string with the name of the state
result. </p>
<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
@@ -3482,7 +3610,7 @@
<p>Tries to change the state of the element to the same as its parent.
If this function returns <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>, the state of element is undefined.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.77.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.80.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3497,7 +3625,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.77.6"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.80.6"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, if the element's state could be synced to the parent's state.</p>
<p>MT safe.</p>
</div>
@@ -3514,7 +3642,7 @@
<p>This function must be called with STATE_LOCK held and is mainly used
internally.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.78.6"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.81.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3536,7 +3664,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.78.7"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.81.7"></a><h4>Returns</h4>
<p> the <a class="link" href="GstElement.html#GstStateChangeReturn" title="enum GstStateChangeReturn"><span class="type">GstStateChangeReturn</span></a> of the state transition.</p>
</div>
</div>
@@ -3559,7 +3687,7 @@
<a class="link" href="GstMessage.html#GST-MESSAGE-INFO:CAPS"><span class="type">GST_MESSAGE_INFO</span></a>.</p>
<p>MT safe.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.79.7"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.82.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3630,7 +3758,7 @@
message; if you want to access the message after this call, you should add an
additional reference before calling.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.80.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.83.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3652,7 +3780,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.80.6"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.83.6"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the message was successfully posted. The function returns
<a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if the element did not have a bus.</p>
<p>MT safe.</p>
@@ -3670,7 +3798,7 @@
random linked sinkpad of this element.</p>
<p>Please note that some queries might need a running pipeline to work.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.81.7"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.84.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3692,7 +3820,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.81.8"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.84.8"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the query could be performed.</p>
<p>MT safe.</p>
</div>
@@ -3711,7 +3839,7 @@
to <em class="parameter"><code>dest_format</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.82.5"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.85.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3748,7 +3876,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.82.6"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.85.6"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the query could be performed.</p>
</div>
</div>
@@ -3768,7 +3896,7 @@
<p>If one repeatedly calls this function one can also create a query and reuse
it in <a class="link" href="GstElement.html#gst-element-query" title="gst_element_query ()"><code class="function">gst_element_query()</code></a>.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.83.6"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.86.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3796,7 +3924,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.83.7"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.86.7"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the query could be performed.</p>
</div>
</div>
@@ -3815,7 +3943,7 @@
message on the pipeline bus, in which case you should re-query the duration
using this function.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.84.6"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.87.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3842,7 +3970,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.84.7"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.87.7"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the query could be performed.</p>
</div>
</div>
@@ -3859,7 +3987,7 @@
<a class="link" href="GstEvent.html#gst-event-ref" title="gst_event_ref ()"><code class="function">gst_event_ref()</code></a> it if you want to reuse the event after this call.</p>
<p>MT safe.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.85.7"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.88.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3881,7 +4009,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.85.8"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.88.8"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the event was handled. Events that trigger a preroll (such
as flushing seeks and steps) will emit <a class="link" href="GstMessage.html#GST-MESSAGE-ASYNC-DONE:CAPS"><code class="literal">GST_MESSAGE_ASYNC_DONE</code></a>.</p>
</div>
@@ -3907,7 +4035,7 @@
PAUSED. If the element supports seek in READY, it will always return <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> when
it receives the event in the READY state.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.86.7"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.89.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3943,7 +4071,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.86.8"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.89.8"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the seek operation succeeded. Flushing seeks will trigger a
preroll, which will emit <a class="link" href="GstMessage.html#GST-MESSAGE-ASYNC-DONE:CAPS"><code class="literal">GST_MESSAGE_ASYNC_DONE</code></a>.</p>
</div>
@@ -3965,7 +4093,7 @@
<a class="link" href="GstElement.html#gst-element-send-event" title="gst_element_send_event ()"><code class="function">gst_element_send_event()</code></a>.</p>
<p>MT safe.</p>
<div class="refsect3">
-<a name="id-1.3.21.10.87.6"></a><h4>Parameters</h4>
+<a name="id-1.3.21.10.90.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -4017,7 +4145,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.21.10.87.7"></a><h4>Returns</h4>
+<a name="id-1.3.21.10.90.7"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the event was handled. Flushing seeks will trigger a
preroll, which will emit <a class="link" href="GstMessage.html#GST-MESSAGE-ASYNC-DONE:CAPS"><code class="literal">GST_MESSAGE_ASYNC_DONE</code></a>.</p>
</div>
@@ -4055,6 +4183,9 @@
guint16 numsinkpads;
GList *sinkpads;
guint32 pads_cookie;
+
+ /* with object LOCK */
+ GList *contexts;
};
</pre>
<p>GStreamer element abstract base class.</p>
@@ -4170,6 +4301,11 @@
<td class="struct_member_description"><p>updated whenever the a pad is added or removed</p></td>
<td class="struct_member_annotations"> </td>
</tr>
+<tr>
+<td class="struct_member_name"><p><a href="https://developer.gnome.org/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> *<em class="structfield"><code><a name="GstElement-struct.contexts"></a>contexts</code></em>;</p></td>
+<td> </td>
+<td> </td>
+</tr>
</tbody>
</table></div>
</div>
diff --git a/docs/gst/html/GstMemory.html b/docs/gst/html/GstMemory.html
index 575cfbd..1f66ffd 100644
--- a/docs/gst/html/GstMemory.html
+++ b/docs/gst/html/GstMemory.html
@@ -1474,7 +1474,7 @@
<tr>
<td class="enum_member_name"><p><a name="GST-MEMORY-FLAG-PHYSICALLY-CONTIGUOUS:CAPS"></a>GST_MEMORY_FLAG_PHYSICALLY_CONTIGUOUS</p></td>
<td class="enum_member_description">
-<p>the memory is physically contiguous. (Since 2.2)</p>
+<p>the memory is physically contiguous. (Since 1.2)</p>
</td>
<td class="enum_member_annotations"> </td>
</tr>
diff --git a/docs/gst/html/GstPad.html b/docs/gst/html/GstPad.html
index a6d2b71..1895a76 100644
--- a/docs/gst/html/GstPad.html
+++ b/docs/gst/html/GstPad.html
@@ -2563,8 +2563,14 @@
<p>Be notified of different states of pads. The provided callback is called for
every state that matches <em class="parameter"><code>mask</code></em>
.</p>
+<p>Probes are called in groups: First GST_PAD_PROBE_TYPE_BLOCK probes are
+called, then others, then finally GST_PAD_PROBE_TYPE_IDLE. The only
+exception here are GST_PAD_PROBE_TYPE_IDLE probes that are called
+immediately if the pad is already idle while calling <a class="link" href="GstPad.html#gst-pad-add-probe" title="gst_pad_add_probe ()"><code class="function">gst_pad_add_probe()</code></a>.
+In each of the groups, probes are called in the order in which they were
+added.</p>
<div class="refsect3">
-<a name="id-1.3.33.10.44.5"></a><h4>Parameters</h4>
+<a name="id-1.3.33.10.44.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -2602,7 +2608,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.33.10.44.6"></a><h4>Returns</h4>
+<a name="id-1.3.33.10.44.7"></a><h4>Returns</h4>
<p> an id or 0 if no probe is pending. The id can be used to remove the
probe with <a class="link" href="GstPad.html#gst-pad-remove-probe" title="gst_pad_remove_probe ()"><code class="function">gst_pad_remove_probe()</code></a>. When using GST_PAD_PROBE_TYPE_IDLE it can
happen that the probe can be run immediately and if the probe returns
diff --git a/docs/gst/html/GstPlugin.html b/docs/gst/html/GstPlugin.html
index 2318182..e5741dc 100644
--- a/docs/gst/html/GstPlugin.html
+++ b/docs/gst/html/GstPlugin.html
@@ -1555,6 +1555,15 @@
</td>
<td class="enum_member_annotations"> </td>
</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-PLUGIN-DEPENDENCY-FLAG-FILE-NAME-IS-PREFIX:CAPS"></a>GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX</p></td>
+<td class="enum_member_description">
+<p>interpret
+ filename argument as filter prefix and check all matching files in
+ the directory. Since 1.8.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
</tbody>
</table></div>
</div>
diff --git a/docs/gst/html/GstPreset.html b/docs/gst/html/GstPreset.html
index 56f211d..7595858 100644
--- a/docs/gst/html/GstPreset.html
+++ b/docs/gst/html/GstPreset.html
@@ -180,7 +180,9 @@
application specific directory and in the users home directory. When getting
a list of presets individual presets are read and overlaid in 1) system,
2) application and 3) user order. Whenever an earlier entry is newer, the
-later entries will be updated.</p>
+later entries will be updated. Since 1.8 you can also provide extra paths
+where to find presets through the GST_PRESET_PATH environment variable.
+Presets found in those paths will be concidered as "app presets".</p>
</div>
<div class="refsect1">
<a name="GstPreset.functions_details"></a><h2>Functions</h2>
diff --git a/docs/gst/html/GstQuery.html b/docs/gst/html/GstQuery.html
index 5911fce..6d54591 100644
--- a/docs/gst/html/GstQuery.html
+++ b/docs/gst/html/GstQuery.html
@@ -3782,7 +3782,7 @@
</tr>
<tr>
<td class="parameter_name"><p>params</p></td>
-<td class="parameter_description"><p> API specific flags. </p></td>
+<td class="parameter_description"><p> API specific parameters. </p></td>
<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
</tr>
</tbody>
@@ -3836,8 +3836,8 @@
has metadata <em class="parameter"><code>api</code></em>
set. When this function returns <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>,
<em class="parameter"><code>index</code></em>
- will contain the index where the requested API and the flags can be
-found.</p>
+ will contain the index where the requested API and the parameters
+can be found.</p>
<div class="refsect3">
<a name="id-1.3.43.8.84.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
diff --git a/docs/gst/html/GstSegment.html b/docs/gst/html/GstSegment.html
index b7446bc..d002138 100644
--- a/docs/gst/html/GstSegment.html
+++ b/docs/gst/html/GstSegment.html
@@ -94,6 +94,22 @@
<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a>
</td>
<td class="function_name">
+<a class="link" href="GstSegment.html#gst-segment-position-from-stream-time" title="gst_segment_position_from_stream_time ()">gst_segment_position_from_stream_time</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="GstSegment.html#gst-segment-position-from-stream-time-full" title="gst_segment_position_from_stream_time_full ()">gst_segment_position_from_stream_time_full</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a>
+</td>
+<td class="function_name">
<a class="link" href="GstSegment.html#gst-segment-to-running-time" title="gst_segment_to_running_time ()">gst_segment_to_running_time</a> <span class="c_punctuation">()</span>
</td>
</tr>
@@ -115,6 +131,30 @@
</tr>
<tr>
<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="GstSegment.html#gst-segment-to-stream-time-full" title="gst_segment_to_stream_time_full ()">gst_segment_to_stream_time_full</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="GstSegment.html#gst-segment-position-from-running-time" title="gst_segment_position_from_running_time ()">gst_segment_position_from_running_time</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="GstSegment.html#gst-segment-position-from-running-time-full" title="gst_segment_position_from_running_time_full ()">gst_segment_position_from_running_time_full</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a>
</td>
<td class="function_name">
@@ -535,6 +575,117 @@
</div>
<hr>
<div class="refsect2">
+<a name="gst-segment-position-from-stream-time"></a><h3>gst_segment_position_from_stream_time ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a>
+gst_segment_position_from_stream_time (<em class="parameter"><code>const <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
+ <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> stream_time</code></em>);</pre>
+<p>Convert <em class="parameter"><code>stream_time</code></em>
+ into a position in the segment so that
+<a class="link" href="GstSegment.html#gst-segment-to-stream-time" title="gst_segment_to_stream_time ()"><code class="function">gst_segment_to_stream_time()</code></a> with that position returns <em class="parameter"><code>stream_time</code></em>
+.</p>
+<div class="refsect3">
+<a name="id-1.3.45.8.8.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>segment</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> structure.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>format</p></td>
+<td class="parameter_description"><p>the format of the segment.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>stream_time</p></td>
+<td class="parameter_description"><p>the stream_time in the segment</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.3.45.8.8.6"></a><h4>Returns</h4>
+<p> the position in the segment for <em class="parameter"><code>stream_time</code></em>
+. This function returns
+-1 when <em class="parameter"><code>stream_time</code></em>
+is -1 or when it is not inside <em class="parameter"><code>segment</code></em>
+.</p>
+</div>
+<p class="since">Since: 1.8</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-segment-position-from-stream-time-full"></a><h3>gst_segment_position_from_stream_time_full ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+gst_segment_position_from_stream_time_full
+ (<em class="parameter"><code>const <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
+ <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> stream_time</code></em>,
+ <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> *position</code></em>);</pre>
+<p>Translate <em class="parameter"><code>stream_time</code></em>
+ to the segment position using the currently configured
+segment. Compared to <a class="link" href="GstSegment.html#gst-segment-position-from-stream-time" title="gst_segment_position_from_stream_time ()"><code class="function">gst_segment_position_from_stream_time()</code></a> this function can
+return negative segment position.</p>
+<p>This function is typically used by elements that need to synchronize buffers
+against the clock or each other.</p>
+<p><em class="parameter"><code>stream_time</code></em>
+ can be any value and the result of this function for values outside
+of the segment is extrapolated.</p>
+<p>When 1 is returned, <em class="parameter"><code>stream_time</code></em>
+ resulted in a positive position returned
+in <em class="parameter"><code>position</code></em>
+.</p>
+<p>When this function returns -1, the returned <em class="parameter"><code>position</code></em>
+ should be negated
+to get the real negative segment position.</p>
+<div class="refsect3">
+<a name="id-1.3.45.8.9.9"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>segment</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> structure.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>format</p></td>
+<td class="parameter_description"><p>the format of the segment.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>stream_time</p></td>
+<td class="parameter_description"><p>the stream-time</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>position</p></td>
+<td class="parameter_description"><p>the resulting position in the segment</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.3.45.8.9.10"></a><h4>Returns</h4>
+<p> a 1 or -1 on success, 0 on failure.</p>
+</div>
+<p class="since">Since: 1.8</p>
+</div>
+<hr>
+<div class="refsect2">
<a name="gst-segment-to-running-time"></a><h3>gst_segment_to_running_time ()</h3>
<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a>
gst_segment_to_running_time (<em class="parameter"><code>const <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
@@ -551,7 +702,7 @@
<p>This function returns -1 if the position is outside of <em class="parameter"><code>segment</code></em>
start and stop.</p>
<div class="refsect3">
-<a name="id-1.3.45.8.8.7"></a><h4>Parameters</h4>
+<a name="id-1.3.45.8.10.7"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -578,7 +729,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.45.8.8.8"></a><h4>Returns</h4>
+<a name="id-1.3.45.8.10.8"></a><h4>Returns</h4>
<p> the position as the total running time or -1 when an invalid position
was given.</p>
</div>
@@ -608,7 +759,7 @@
should be negated
to get the real negative running time.</p>
<div class="refsect3">
-<a name="id-1.3.45.8.9.9"></a><h4>Parameters</h4>
+<a name="id-1.3.45.8.11.9"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -640,7 +791,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.45.8.9.10"></a><h4>Returns</h4>
+<a name="id-1.3.45.8.11.10"></a><h4>Returns</h4>
<p> a 1 or -1 on success, 0 on failure.</p>
</div>
<p class="since">Since: <a class="link" href="ix03.html#api-index-1.6">1.6</a></p>
@@ -666,7 +817,7 @@
The stream time is always between 0 and the total duration of the
media stream.</p>
<div class="refsect3">
-<a name="id-1.3.45.8.10.6"></a><h4>Parameters</h4>
+<a name="id-1.3.45.8.12.6"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -693,24 +844,88 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.45.8.10.7"></a><h4>Returns</h4>
+<a name="id-1.3.45.8.12.7"></a><h4>Returns</h4>
<p> the position in stream_time or -1 when an invalid position
was given.</p>
</div>
+<p class="since">Since: 1.8</p>
</div>
<hr>
<div class="refsect2">
-<a name="gst-segment-to-position"></a><h3>gst_segment_to_position ()</h3>
+<a name="gst-segment-to-stream-time-full"></a><h3>gst_segment_to_stream_time_full ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+gst_segment_to_stream_time_full (<em class="parameter"><code>const <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
+ <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> position</code></em>,
+ <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> *stream_time</code></em>);</pre>
+<p>Translate <em class="parameter"><code>position</code></em>
+ to the total stream time using the currently configured
+segment. Compared to <a class="link" href="GstSegment.html#gst-segment-to-stream-time" title="gst_segment_to_stream_time ()"><code class="function">gst_segment_to_stream_time()</code></a> this function can return
+negative stream-time.</p>
+<p>This function is typically used by elements that need to synchronize buffers
+against the clock or eachother.</p>
+<p><em class="parameter"><code>position</code></em>
+ can be any value and the result of this function for values outside
+of the segment is extrapolated.</p>
+<p>When 1 is returned, <em class="parameter"><code>position</code></em>
+ resulted in a positive stream-time returned
+in <em class="parameter"><code>stream_time</code></em>
+.</p>
+<p>When this function returns -1, the returned <em class="parameter"><code>stream_time</code></em>
+ should be negated
+to get the real negative stream time.</p>
+<div class="refsect3">
+<a name="id-1.3.45.8.13.9"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>segment</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> structure.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>format</p></td>
+<td class="parameter_description"><p>the format of the segment.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>position</p></td>
+<td class="parameter_description"><p>the position in the segment</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>stream_time</p></td>
+<td class="parameter_description"><p>result stream-time</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.3.45.8.13.10"></a><h4>Returns</h4>
+<p> a 1 or -1 on success, 0 on failure.</p>
+</div>
+<p class="since">Since: 1.8</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-segment-position-from-running-time"></a><h3>gst_segment_position_from_running_time ()</h3>
<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a>
-gst_segment_to_position (<em class="parameter"><code>const <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
- <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
- <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> running_time</code></em>);</pre>
+gst_segment_position_from_running_time
+ (<em class="parameter"><code>const <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
+ <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> running_time</code></em>);</pre>
<p>Convert <em class="parameter"><code>running_time</code></em>
into a position in the segment so that
<a class="link" href="GstSegment.html#gst-segment-to-running-time" title="gst_segment_to_running_time ()"><code class="function">gst_segment_to_running_time()</code></a> with that position returns <em class="parameter"><code>running_time</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.45.8.11.5"></a><h4>Parameters</h4>
+<a name="id-1.3.45.8.14.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -737,13 +952,126 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.45.8.11.6"></a><h4>Returns</h4>
+<a name="id-1.3.45.8.14.6"></a><h4>Returns</h4>
<p> the position in the segment for <em class="parameter"><code>running_time</code></em>
. This function returns
-1 when <em class="parameter"><code>running_time</code></em>
is -1 or when it is not inside <em class="parameter"><code>segment</code></em>
.</p>
</div>
+<p class="since">Since: 1.8</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-segment-position-from-running-time-full"></a><h3>gst_segment_position_from_running_time_full ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+gst_segment_position_from_running_time_full
+ (<em class="parameter"><code>const <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
+ <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> running_time</code></em>,
+ <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> *position</code></em>);</pre>
+<p>Translate <em class="parameter"><code>running_time</code></em>
+ to the segment position using the currently configured
+segment. Compared to <a class="link" href="GstSegment.html#gst-segment-position-from-running-time" title="gst_segment_position_from_running_time ()"><code class="function">gst_segment_position_from_running_time()</code></a> this function can
+return negative segment position.</p>
+<p>This function is typically used by elements that need to synchronize buffers
+against the clock or each other.</p>
+<p><em class="parameter"><code>running_time</code></em>
+ can be any value and the result of this function for values
+outside of the segment is extrapolated.</p>
+<p>When 1 is returned, <em class="parameter"><code>running_time</code></em>
+ resulted in a positive position returned
+in <em class="parameter"><code>position</code></em>
+.</p>
+<p>When this function returns -1, the returned <em class="parameter"><code>position</code></em>
+ should be negated
+to get the real negative segment position.</p>
+<div class="refsect3">
+<a name="id-1.3.45.8.15.9"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>segment</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> structure.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>format</p></td>
+<td class="parameter_description"><p>the format of the segment.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>running_time</p></td>
+<td class="parameter_description"><p>the running-time</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>position</p></td>
+<td class="parameter_description"><p>the resulting position in the segment</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.3.45.8.15.10"></a><h4>Returns</h4>
+<p> a 1 or -1 on success, 0 on failure.</p>
+</div>
+<p class="since">Since: 1.8</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-segment-to-position"></a><h3>gst_segment_to_position ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="returnvalue">guint64</span></a>
+gst_segment_to_position (<em class="parameter"><code>const <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> *segment</code></em>,
+ <em class="parameter"><code><a class="link" href="gstreamer-GstFormat.html#GstFormat" title="enum GstFormat"><span class="type">GstFormat</span></a> format</code></em>,
+ <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> running_time</code></em>);</pre>
+<div class="warning"><p><code class="literal">gst_segment_to_position</code> is deprecated and should not be used in newly-written code.</p></div>
+<p>Convert <em class="parameter"><code>running_time</code></em>
+ into a position in the segment so that
+<a class="link" href="GstSegment.html#gst-segment-to-running-time" title="gst_segment_to_running_time ()"><code class="function">gst_segment_to_running_time()</code></a> with that position returns <em class="parameter"><code>running_time</code></em>
+.</p>
+<div class="refsect3">
+<a name="id-1.3.45.8.16.6"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>segment</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstSegment.html" title="GstSegment"><span class="type">GstSegment</span></a> structure.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>format</p></td>
+<td class="parameter_description"><p>the format of the segment.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>running_time</p></td>
+<td class="parameter_description"><p>the running_time in the segment</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.3.45.8.16.7"></a><h4>Returns</h4>
+<p> the position in the segment for <em class="parameter"><code>running_time</code></em>
+. This function returns
+-1 when <em class="parameter"><code>running_time</code></em>
+is -1 or when it is not inside <em class="parameter"><code>segment</code></em>
+.</p>
+<p>Deprecated. Use <a class="link" href="GstSegment.html#gst-segment-position-from-running-time" title="gst_segment_position_from_running_time ()"><code class="function">gst_segment_position_from_running_time()</code></a> instead.</p>
+</div>
</div>
<hr>
<div class="refsect2">
@@ -757,7 +1085,7 @@
buffer will be one with <em class="parameter"><code>running_time</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.45.8.12.5"></a><h4>Parameters</h4>
+<a name="id-1.3.45.8.17.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -784,7 +1112,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.45.8.12.6"></a><h4>Returns</h4>
+<a name="id-1.3.45.8.17.6"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the segment could be updated successfully. If <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> is
returned, <em class="parameter"><code>running_time</code></em>
is -1 or not in <em class="parameter"><code>segment</code></em>
@@ -801,7 +1129,7 @@
into <em class="parameter"><code>dest</code></em>
.</p>
<div class="refsect3">
-<a name="id-1.3.45.8.13.5"></a><h4>Parameters</h4>
+<a name="id-1.3.45.8.18.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -835,7 +1163,7 @@
is applied to all
future running-time calculations.</p>
<div class="refsect3">
-<a name="id-1.3.45.8.14.5"></a><h4>Parameters</h4>
+<a name="id-1.3.45.8.19.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -862,7 +1190,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.45.8.14.6"></a><h4>Returns</h4>
+<a name="id-1.3.45.8.19.6"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the segment could be updated successfully. If <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> is
returned, <em class="parameter"><code>offset</code></em>
is not in <em class="parameter"><code>segment</code></em>
@@ -879,7 +1207,7 @@
<p>Checks for two segments being equal. Equality here is defined
as perfect equality, including floating point values.</p>
<div class="refsect3">
-<a name="id-1.3.45.8.15.5"></a><h4>Parameters</h4>
+<a name="id-1.3.45.8.20.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -901,7 +1229,7 @@
</table></div>
</div>
<div class="refsect3">
-<a name="id-1.3.45.8.15.6"></a><h4>Returns</h4>
+<a name="id-1.3.45.8.20.6"></a><h4>Returns</h4>
<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the segments are equal, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</p>
</div>
<p class="since">Since: <a class="link" href="ix03.html#api-index-1.6">1.6</a></p>
@@ -946,7 +1274,7 @@
</tr>
<tr>
<td class="struct_member_name"><p><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> <em class="structfield"><code><a name="GstSegment-struct.rate"></a>rate</code></em>;</p></td>
-<td class="struct_member_description"><p>the rate of the segment</p></td>
+<td class="struct_member_description"><p>the playback rate of the segment</p></td>
<td class="struct_member_annotations"> </td>
</tr>
<tr>
@@ -961,35 +1289,34 @@
</tr>
<tr>
<td class="struct_member_name"><p><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> <em class="structfield"><code><a name="GstSegment-struct.base"></a>base</code></em>;</p></td>
-<td class="struct_member_description"><p>the base of the segment</p></td>
+<td class="struct_member_description"><p>the running time (plus elapsed time, see offset) of the segment start</p></td>
<td class="struct_member_annotations"> </td>
</tr>
<tr>
<td class="struct_member_name"><p><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> <em class="structfield"><code><a name="GstSegment-struct.offset"></a>offset</code></em>;</p></td>
-<td class="struct_member_description"><p>the offset to apply to <em class="parameter"><code>start</code></em>
-or <em class="parameter"><code>stop</code></em>
-</p></td>
+<td class="struct_member_description"><p>the amount (in buffer timestamps) that has already been elapsed in
+the segment</p></td>
<td class="struct_member_annotations"> </td>
</tr>
<tr>
<td class="struct_member_name"><p><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> <em class="structfield"><code><a name="GstSegment-struct.start"></a>start</code></em>;</p></td>
-<td class="struct_member_description"><p>the start of the segment</p></td>
+<td class="struct_member_description"><p>the start of the segment in buffer timestamp time (PTS)</p></td>
<td class="struct_member_annotations"> </td>
</tr>
<tr>
<td class="struct_member_name"><p><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> <em class="structfield"><code><a name="GstSegment-struct.stop"></a>stop</code></em>;</p></td>
-<td class="struct_member_description"><p>the stop of the segment</p></td>
+<td class="struct_member_description"><p>the stop of the segment in buffer timestamp time (PTS)</p></td>
<td class="struct_member_annotations"> </td>
</tr>
<tr>
<td class="struct_member_name"><p><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> <em class="structfield"><code><a name="GstSegment-struct.time"></a>time</code></em>;</p></td>
-<td class="struct_member_description"><p>the stream time of the segment</p></td>
+<td class="struct_member_description"><p>the stream time of the segment start</p></td>
<td class="struct_member_annotations"> </td>
</tr>
<tr>
<td class="struct_member_name"><p><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a> <em class="structfield"><code><a name="GstSegment-struct.position"></a>position</code></em>;</p></td>
-<td class="struct_member_description"><p>the position in the segment (used internally by elements
-such as sources, demuxers or parsers to track progress)</p></td>
+<td class="struct_member_description"><p>the buffer timestamp position in the segment (used internally by
+elements such as sources, demuxers or parsers to track progress)</p></td>
<td class="struct_member_annotations"> </td>
</tr>
<tr>
diff --git a/docs/gst/html/gst-running.html b/docs/gst/html/gst-running.html
index 2582064..df7914f 100644
--- a/docs/gst/html/gst-running.html
+++ b/docs/gst/html/gst-running.html
@@ -289,6 +289,9 @@
<span class="command"><strong>dot foo.dot -Tsvg -o foo.svg</strong></span> or
<span class="command"><strong>dot foo.dot -Tpng -o foo.png</strong></span> or
<span class="command"><strong>dot foo.dot -Tjpg -o foo.jpg</strong></span>.
+
+There is also a utility called <span class="command"><strong>xdot</strong></span> which allows you to
+view the dot file directly without converting it first.
</p>
<p><a name="GST_REGISTRY"></a><b><code class="envar">GST_REGISTRY</code>, <code class="envar">GST_REGISTRY_1_0</code>. </b>
Set this environment variable to make GStreamer use a different file for the
diff --git a/docs/gst/html/gstreamer-1.0.devhelp2 b/docs/gst/html/gstreamer-1.0.devhelp2
index e9feec5..890f73b 100644
--- a/docs/gst/html/gstreamer-1.0.devhelp2
+++ b/docs/gst/html/gstreamer-1.0.devhelp2
@@ -156,6 +156,7 @@
<keyword type="macro" name="GST_BUFFER_FLAG_UNSET()" link="GstBuffer.html#GST-BUFFER-FLAG-UNSET:CAPS"/>
<keyword type="macro" name="GST_BUFFER_PTS()" link="GstBuffer.html#GST-BUFFER-PTS:CAPS"/>
<keyword type="macro" name="GST_BUFFER_DTS()" link="GstBuffer.html#GST-BUFFER-DTS:CAPS"/>
+ <keyword type="macro" name="GST_BUFFER_DTS_OR_PTS()" link="GstBuffer.html#GST-BUFFER-DTS-OR-PTS:CAPS"/>
<keyword type="macro" name="GST_BUFFER_DURATION()" link="GstBuffer.html#GST-BUFFER-DURATION:CAPS"/>
<keyword type="macro" name="GST_BUFFER_OFFSET()" link="GstBuffer.html#GST-BUFFER-OFFSET:CAPS"/>
<keyword type="macro" name="GST_BUFFER_OFFSET_END()" link="GstBuffer.html#GST-BUFFER-OFFSET-END:CAPS"/>
@@ -615,6 +616,9 @@
<keyword type="function" name="gst_element_set_bus ()" link="GstElement.html#gst-element-set-bus"/>
<keyword type="function" name="gst_element_get_bus ()" link="GstElement.html#gst-element-get-bus"/>
<keyword type="function" name="gst_element_set_context ()" link="GstElement.html#gst-element-set-context"/>
+ <keyword type="function" name="gst_element_get_context ()" link="GstElement.html#gst-element-get-context" since="1.8"/>
+ <keyword type="function" name="gst_element_get_context_unlocked ()" link="GstElement.html#gst-element-get-context-unlocked" since="1.8"/>
+ <keyword type="function" name="gst_element_get_contexts ()" link="GstElement.html#gst-element-get-contexts" since="1.8"/>
<keyword type="function" name="gst_element_get_factory ()" link="GstElement.html#gst-element-get-factory"/>
<keyword type="macro" name="gst_element_set_name()" link="GstElement.html#gst-element-set-name"/>
<keyword type="macro" name="gst_element_get_name()" link="GstElement.html#gst-element-get-name"/>
@@ -1542,10 +1546,15 @@
<keyword type="function" name="gst_segment_copy ()" link="GstSegment.html#gst-segment-copy"/>
<keyword type="function" name="gst_segment_free ()" link="GstSegment.html#gst-segment-free"/>
<keyword type="function" name="gst_segment_do_seek ()" link="GstSegment.html#gst-segment-do-seek"/>
+ <keyword type="function" name="gst_segment_position_from_stream_time ()" link="GstSegment.html#gst-segment-position-from-stream-time" since="1.8"/>
+ <keyword type="function" name="gst_segment_position_from_stream_time_full ()" link="GstSegment.html#gst-segment-position-from-stream-time-full" since="1.8"/>
<keyword type="function" name="gst_segment_to_running_time ()" link="GstSegment.html#gst-segment-to-running-time"/>
<keyword type="function" name="gst_segment_to_running_time_full ()" link="GstSegment.html#gst-segment-to-running-time-full" since="1.6"/>
- <keyword type="function" name="gst_segment_to_stream_time ()" link="GstSegment.html#gst-segment-to-stream-time"/>
- <keyword type="function" name="gst_segment_to_position ()" link="GstSegment.html#gst-segment-to-position"/>
+ <keyword type="function" name="gst_segment_to_stream_time ()" link="GstSegment.html#gst-segment-to-stream-time" since="1.8"/>
+ <keyword type="function" name="gst_segment_to_stream_time_full ()" link="GstSegment.html#gst-segment-to-stream-time-full" since="1.8"/>
+ <keyword type="function" name="gst_segment_position_from_running_time ()" link="GstSegment.html#gst-segment-position-from-running-time" since="1.8"/>
+ <keyword type="function" name="gst_segment_position_from_running_time_full ()" link="GstSegment.html#gst-segment-position-from-running-time-full" since="1.8"/>
+ <keyword type="function" name="gst_segment_to_position ()" link="GstSegment.html#gst-segment-to-position" deprecated=""/>
<keyword type="function" name="gst_segment_set_running_time ()" link="GstSegment.html#gst-segment-set-running-time"/>
<keyword type="function" name="gst_segment_copy_into ()" link="GstSegment.html#gst-segment-copy-into"/>
<keyword type="function" name="gst_segment_offset_running_time ()" link="GstSegment.html#gst-segment-offset-running-time" since="1.2.3"/>
@@ -2276,6 +2285,8 @@
<keyword type="variable" name="GST_CAT_DEFAULT" link="gstreamer-GstInfo.html#GST-CAT-DEFAULT:CAPS"/>
<keyword type="macro" name="GST_TIME_FORMAT" link="gstreamer-GstInfo.html#GST-TIME-FORMAT:CAPS"/>
<keyword type="macro" name="GST_STIME_FORMAT" link="gstreamer-GstInfo.html#GST-STIME-FORMAT:CAPS" since="1.6"/>
+ <keyword type="macro" name="GST_PTR_FORMAT" link="gstreamer-GstInfo.html#GST-PTR-FORMAT:CAPS"/>
+ <keyword type="macro" name="GST_SEGMENT_FORMAT" link="gstreamer-GstInfo.html#GST-SEGMENT-FORMAT:CAPS"/>
<keyword type="constant" name="GST_ALLOCATOR_FLAG_CUSTOM_ALLOC" link="GstAllocator.html#GST-ALLOCATOR-FLAG-CUSTOM-ALLOC:CAPS"/>
<keyword type="constant" name="GST_ALLOCATOR_FLAG_LAST" link="GstAllocator.html#GST-ALLOCATOR-FLAG-LAST:CAPS"/>
<keyword type="constant" name="GST_BIN_FLAG_NO_RESYNC" link="GstBin.html#GST-BIN-FLAG-NO-RESYNC:CAPS"/>
@@ -2642,6 +2653,7 @@
<keyword type="constant" name="GST_PLUGIN_DEPENDENCY_FLAG_RECURSE" link="GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-RECURSE:CAPS"/>
<keyword type="constant" name="GST_PLUGIN_DEPENDENCY_FLAG_PATHS_ARE_DEFAULT_ONLY" link="GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-PATHS-ARE-DEFAULT-ONLY:CAPS"/>
<keyword type="constant" name="GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX" link="GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-FILE-NAME-IS-SUFFIX:CAPS"/>
+ <keyword type="constant" name="GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX" link="GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-FILE-NAME-IS-PREFIX:CAPS"/>
<keyword type="constant" name="GST_RANK_NONE" link="GstPluginFeature.html#GST-RANK-NONE:CAPS"/>
<keyword type="constant" name="GST_RANK_MARGINAL" link="GstPluginFeature.html#GST-RANK-MARGINAL:CAPS"/>
<keyword type="constant" name="GST_RANK_SECONDARY" link="GstPluginFeature.html#GST-RANK-SECONDARY:CAPS"/>
diff --git a/docs/gst/html/gstreamer-GstInfo.html b/docs/gst/html/gstreamer-GstInfo.html
index 40a621e..77bb2e8 100644
--- a/docs/gst/html/gstreamer-GstInfo.html
+++ b/docs/gst/html/gstreamer-GstInfo.html
@@ -652,6 +652,14 @@
<td class="define_keyword">#define</td>
<td class="function_name"><a class="link" href="gstreamer-GstInfo.html#GST-STIME-FORMAT:CAPS" title="GST_STIME_FORMAT">GST_STIME_FORMAT</a></td>
</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="gstreamer-GstInfo.html#GST-PTR-FORMAT:CAPS" title="GST_PTR_FORMAT">GST_PTR_FORMAT</a></td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="gstreamer-GstInfo.html#GST-SEGMENT-FORMAT:CAPS" title="GST_SEGMENT_FORMAT">GST_SEGMENT_FORMAT</a></td>
+</tr>
</tbody>
</table></div>
</div>
@@ -782,7 +790,7 @@
<hr>
<div class="refsect2">
<a name="GST-FUNCTION:CAPS"></a><h3>GST_FUNCTION</h3>
-<pre class="programlisting"># define GST_FUNCTION ((const char*) (__FUNCTION__))
+<pre class="programlisting"># define GST_FUNCTION ((const char*) (__func__))
</pre>
<p>This macro should evaluate to the name of the current function and be should
be defined when configuring your project, as it is compiler dependant. If it
@@ -3005,7 +3013,7 @@
</pre>
<p>To aid debugging applications one can use this method to write out the whole
network of gstreamer elements that form the pipeline into an dot file.
-This file can be processed with graphviz to get an image.</p>
+This file can be processed with graphviz to get an image, like this:</p>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -3017,11 +3025,13 @@
</table>
</div>
+<p>There is also a utility called xdot which allows you to view the dot file
+directly without converting it first.</p>
<p>The macro is only active if gstreamer is configured with
"--gst-enable-gst-debug" and the environment variable
GST_DEBUG_DUMP_DOT_DIR is set to a basepath (e.g. /tmp).</p>
<div class="refsect3">
-<a name="id-1.5.3.7.77.7"></a><h4>Parameters</h4>
+<a name="id-1.5.3.7.77.8"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -3619,6 +3629,22 @@
<p></p>
<p class="since">Since: <a class="link" href="ix03.html#api-index-1.6">1.6</a></p>
</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PTR-FORMAT:CAPS"></a><h3>GST_PTR_FORMAT</h3>
+<pre class="programlisting">#define GST_PTR_FORMAT "p\aA"
+</pre>
+<p>printf format type used to debug GStreamer types.
+This can only be used on types whose size is >= sizeof(gpointer).</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-SEGMENT-FORMAT:CAPS"></a><h3>GST_SEGMENT_FORMAT</h3>
+<pre class="programlisting">#define GST_SEGMENT_FORMAT "p\aB"
+</pre>
+<p>printf format type used to debug GStreamer segments.
+This can only be used on pointers to GstSegment structures.</p>
+</div>
</div>
<div class="refsect1">
<a name="gstreamer-GstInfo.see-also"></a><h2>See Also</h2>
diff --git a/docs/gst/html/gstreamer-GstVersion.html b/docs/gst/html/gstreamer-GstVersion.html
index 5e7084e..228e925 100644
--- a/docs/gst/html/gstreamer-GstVersion.html
+++ b/docs/gst/html/gstreamer-GstVersion.html
@@ -91,14 +91,14 @@
<hr>
<div class="refsect2">
<a name="GST-VERSION-MINOR:CAPS"></a><h3>GST_VERSION_MINOR</h3>
-<pre class="programlisting">#define GST_VERSION_MINOR (6)
+<pre class="programlisting">#define GST_VERSION_MINOR (7)
</pre>
<p>The minor version of GStreamer at compile time:</p>
</div>
<hr>
<div class="refsect2">
<a name="GST-VERSION-MICRO:CAPS"></a><h3>GST_VERSION_MICRO</h3>
-<pre class="programlisting">#define GST_VERSION_MICRO (2)
+<pre class="programlisting">#define GST_VERSION_MICRO (1)
</pre>
<p>The micro version of GStreamer at compile time:</p>
</div>
diff --git a/docs/gst/html/index.html b/docs/gst/html/index.html
index d0a03a5..c1caeb8 100644
--- a/docs/gst/html/index.html
+++ b/docs/gst/html/index.html
@@ -15,7 +15,7 @@
<div>
<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">GStreamer 1.0 Core Reference Manual</p></th></tr></table></div>
<div><p class="releaseinfo">
- for GStreamer Core 1.0 (1.6.2)
+ for GStreamer Core 1.0 (1.7.1)
The latest version of this documentation can be found on-line at
<a class="ulink" href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/</a>.
</p></div>
diff --git a/docs/gst/html/index.sgml b/docs/gst/html/index.sgml
index 57ba068..cb0a74a 100644
--- a/docs/gst/html/index.sgml
+++ b/docs/gst/html/index.sgml
@@ -118,6 +118,7 @@
<ANCHOR id="GST-BUFFER-FLAG-UNSET:CAPS" href="gstreamer-1.0/GstBuffer.html#GST-BUFFER-FLAG-UNSET:CAPS">
<ANCHOR id="GST-BUFFER-PTS:CAPS" href="gstreamer-1.0/GstBuffer.html#GST-BUFFER-PTS:CAPS">
<ANCHOR id="GST-BUFFER-DTS:CAPS" href="gstreamer-1.0/GstBuffer.html#GST-BUFFER-DTS:CAPS">
+<ANCHOR id="GST-BUFFER-DTS-OR-PTS:CAPS" href="gstreamer-1.0/GstBuffer.html#GST-BUFFER-DTS-OR-PTS:CAPS">
<ANCHOR id="GST-BUFFER-DURATION:CAPS" href="gstreamer-1.0/GstBuffer.html#GST-BUFFER-DURATION:CAPS">
<ANCHOR id="GST-BUFFER-OFFSET:CAPS" href="gstreamer-1.0/GstBuffer.html#GST-BUFFER-OFFSET:CAPS">
<ANCHOR id="GST-BUFFER-OFFSET-END:CAPS" href="gstreamer-1.0/GstBuffer.html#GST-BUFFER-OFFSET-END:CAPS">
@@ -764,6 +765,9 @@
<ANCHOR id="gst-element-set-bus" href="gstreamer-1.0/GstElement.html#gst-element-set-bus">
<ANCHOR id="gst-element-get-bus" href="gstreamer-1.0/GstElement.html#gst-element-get-bus">
<ANCHOR id="gst-element-set-context" href="gstreamer-1.0/GstElement.html#gst-element-set-context">
+<ANCHOR id="gst-element-get-context" href="gstreamer-1.0/GstElement.html#gst-element-get-context">
+<ANCHOR id="gst-element-get-context-unlocked" href="gstreamer-1.0/GstElement.html#gst-element-get-context-unlocked">
+<ANCHOR id="gst-element-get-contexts" href="gstreamer-1.0/GstElement.html#gst-element-get-contexts">
<ANCHOR id="gst-element-get-factory" href="gstreamer-1.0/GstElement.html#gst-element-get-factory">
<ANCHOR id="gst-element-set-name" href="gstreamer-1.0/GstElement.html#gst-element-set-name">
<ANCHOR id="gst-element-get-name" href="gstreamer-1.0/GstElement.html#gst-element-get-name">
@@ -1977,6 +1981,7 @@
<ANCHOR id="GST-PLUGIN-DEPENDENCY-FLAG-RECURSE:CAPS" href="gstreamer-1.0/GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-RECURSE:CAPS">
<ANCHOR id="GST-PLUGIN-DEPENDENCY-FLAG-PATHS-ARE-DEFAULT-ONLY:CAPS" href="gstreamer-1.0/GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-PATHS-ARE-DEFAULT-ONLY:CAPS">
<ANCHOR id="GST-PLUGIN-DEPENDENCY-FLAG-FILE-NAME-IS-SUFFIX:CAPS" href="gstreamer-1.0/GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-FILE-NAME-IS-SUFFIX:CAPS">
+<ANCHOR id="GST-PLUGIN-DEPENDENCY-FLAG-FILE-NAME-IS-PREFIX:CAPS" href="gstreamer-1.0/GstPlugin.html#GST-PLUGIN-DEPENDENCY-FLAG-FILE-NAME-IS-PREFIX:CAPS">
<ANCHOR id="GstPlugin.see-also" href="gstreamer-1.0/GstPlugin.html#GstPlugin.see-also">
<ANCHOR id="GstPluginFeature" href="gstreamer-1.0/GstPluginFeature.html">
<ANCHOR id="GstPluginFeature.functions" href="gstreamer-1.0/GstPluginFeature.html#GstPluginFeature.functions">
@@ -2255,9 +2260,14 @@
<ANCHOR id="gst-segment-copy" href="gstreamer-1.0/GstSegment.html#gst-segment-copy">
<ANCHOR id="gst-segment-free" href="gstreamer-1.0/GstSegment.html#gst-segment-free">
<ANCHOR id="gst-segment-do-seek" href="gstreamer-1.0/GstSegment.html#gst-segment-do-seek">
+<ANCHOR id="gst-segment-position-from-stream-time" href="gstreamer-1.0/GstSegment.html#gst-segment-position-from-stream-time">
+<ANCHOR id="gst-segment-position-from-stream-time-full" href="gstreamer-1.0/GstSegment.html#gst-segment-position-from-stream-time-full">
<ANCHOR id="gst-segment-to-running-time" href="gstreamer-1.0/GstSegment.html#gst-segment-to-running-time">
<ANCHOR id="gst-segment-to-running-time-full" href="gstreamer-1.0/GstSegment.html#gst-segment-to-running-time-full">
<ANCHOR id="gst-segment-to-stream-time" href="gstreamer-1.0/GstSegment.html#gst-segment-to-stream-time">
+<ANCHOR id="gst-segment-to-stream-time-full" href="gstreamer-1.0/GstSegment.html#gst-segment-to-stream-time-full">
+<ANCHOR id="gst-segment-position-from-running-time" href="gstreamer-1.0/GstSegment.html#gst-segment-position-from-running-time">
+<ANCHOR id="gst-segment-position-from-running-time-full" href="gstreamer-1.0/GstSegment.html#gst-segment-position-from-running-time-full">
<ANCHOR id="gst-segment-to-position" href="gstreamer-1.0/GstSegment.html#gst-segment-to-position">
<ANCHOR id="gst-segment-set-running-time" href="gstreamer-1.0/GstSegment.html#gst-segment-set-running-time">
<ANCHOR id="gst-segment-copy-into" href="gstreamer-1.0/GstSegment.html#gst-segment-copy-into">
@@ -3249,6 +3259,8 @@
<ANCHOR id="GST-CAT-DEFAULT:CAPS" href="gstreamer-1.0/gstreamer-GstInfo.html#GST-CAT-DEFAULT:CAPS">
<ANCHOR id="GST-TIME-FORMAT:CAPS" href="gstreamer-1.0/gstreamer-GstInfo.html#GST-TIME-FORMAT:CAPS">
<ANCHOR id="GST-STIME-FORMAT:CAPS" href="gstreamer-1.0/gstreamer-GstInfo.html#GST-STIME-FORMAT:CAPS">
+<ANCHOR id="GST-PTR-FORMAT:CAPS" href="gstreamer-1.0/gstreamer-GstInfo.html#GST-PTR-FORMAT:CAPS">
+<ANCHOR id="GST-SEGMENT-FORMAT:CAPS" href="gstreamer-1.0/gstreamer-GstInfo.html#GST-SEGMENT-FORMAT:CAPS">
<ANCHOR id="gstreamer-GstInfo.see-also" href="gstreamer-1.0/gstreamer-GstInfo.html#gstreamer-GstInfo.see-also">
<ANCHOR id="annotation-glossterm-allow-none" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-allow-none">
<ANCHOR id="annotation-glossterm-array" href="gstreamer-1.0/annotation-glossary.html#annotation-glossterm-array">
diff --git a/docs/gst/html/ix01.html b/docs/gst/html/ix01.html
index 8571eac..f668f35 100644
--- a/docs/gst/html/ix01.html
+++ b/docs/gst/html/ix01.html
@@ -363,6 +363,10 @@
</dt>
<dd></dd>
<dt>
+<a class="link" href="GstBuffer.html#GST-BUFFER-DTS-OR-PTS:CAPS" title="GST_BUFFER_DTS_OR_PTS()">GST_BUFFER_DTS_OR_PTS</a>, macro in <a class="link" href="GstBuffer.html" title="GstBuffer">GstBuffer</a>
+</dt>
+<dd></dd>
+<dt>
<a class="link" href="GstBuffer.html#GST-BUFFER-DURATION:CAPS" title="GST_BUFFER_DURATION()">GST_BUFFER_DURATION</a>, macro in <a class="link" href="GstBuffer.html" title="GstBuffer">GstBuffer</a>
</dt>
<dd></dd>
@@ -2554,6 +2558,18 @@
</dt>
<dd></dd>
<dt>
+<a class="link" href="GstElement.html#gst-element-get-context" title="gst_element_get_context ()">gst_element_get_context</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-get-contexts" title="gst_element_get_contexts ()">gst_element_get_contexts</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstElement.html#gst-element-get-context-unlocked" title="gst_element_get_context_unlocked ()">gst_element_get_context_unlocked</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
+</dt>
+<dd></dd>
+<dt>
<a class="link" href="GstElement.html#gst-element-get-factory" title="gst_element_get_factory ()">gst_element_get_factory</a>, function in <a class="link" href="GstElement.html" title="GstElement">GstElement</a>
</dt>
<dd></dd>
@@ -5729,6 +5745,10 @@
<a class="link" href="GstGhostPad.html#gst-proxy-pad-iterate-internal-links-default" title="gst_proxy_pad_iterate_internal_links_default ()">gst_proxy_pad_iterate_internal_links_default</a>, function in <a class="link" href="GstGhostPad.html" title="GstGhostPad">GstGhostPad</a>
</dt>
<dd></dd>
+<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-PTR-FORMAT:CAPS" title="GST_PTR_FORMAT">GST_PTR_FORMAT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
<a name="idxQ"></a><h3 class="title">Q</h3>
<dt>
<a class="link" href="GstEvent.html#GstQOSType" title="enum GstQOSType">GstQOSType</a>, enum in <a class="link" href="GstEvent.html" title="GstEvent">GstEvent</a>
@@ -6449,6 +6469,10 @@
</dt>
<dd></dd>
<dt>
+<a class="link" href="gstreamer-GstInfo.html#GST-SEGMENT-FORMAT:CAPS" title="GST_SEGMENT_FORMAT">GST_SEGMENT_FORMAT</a>, macro in <a class="link" href="gstreamer-GstInfo.html" title="GstInfo">GstInfo</a>
+</dt>
+<dd></dd>
+<dt>
<a class="link" href="GstSegment.html#gst-segment-free" title="gst_segment_free ()">gst_segment_free</a>, function in <a class="link" href="GstSegment.html" title="GstSegment">GstSegment</a>
</dt>
<dd></dd>
@@ -6469,6 +6493,22 @@
</dt>
<dd></dd>
<dt>
+<a class="link" href="GstSegment.html#gst-segment-position-from-running-time" title="gst_segment_position_from_running_time ()">gst_segment_position_from_running_time</a>, function in <a class="link" href="GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstSegment.html#gst-segment-position-from-running-time-full" title="gst_segment_position_from_running_time_full ()">gst_segment_position_from_running_time_full</a>, function in <a class="link" href="GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstSegment.html#gst-segment-position-from-stream-time" title="gst_segment_position_from_stream_time ()">gst_segment_position_from_stream_time</a>, function in <a class="link" href="GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="GstSegment.html#gst-segment-position-from-stream-time-full" title="gst_segment_position_from_stream_time_full ()">gst_segment_position_from_stream_time_full</a>, function in <a class="link" href="GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
<a class="link" href="GstSegment.html#gst-segment-set-running-time" title="gst_segment_set_running_time ()">gst_segment_set_running_time</a>, function in <a class="link" href="GstSegment.html" title="GstSegment">GstSegment</a>
</dt>
<dd></dd>
@@ -6489,6 +6529,10 @@
</dt>
<dd></dd>
<dt>
+<a class="link" href="GstSegment.html#gst-segment-to-stream-time-full" title="gst_segment_to_stream_time_full ()">gst_segment_to_stream_time_full</a>, function in <a class="link" href="GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
+<dt>
<a class="link" href="gstreamer-Gst.html#gst-segtrap-is-enabled" title="gst_segtrap_is_enabled ()">gst_segtrap_is_enabled</a>, function in <a class="link" href="gstreamer-Gst.html" title="Gst">Gst</a>
</dt>
<dd></dd>
diff --git a/docs/gst/html/ix02.html b/docs/gst/html/ix02.html
index cd9ed14..5b29447 100644
--- a/docs/gst/html/ix02.html
+++ b/docs/gst/html/ix02.html
@@ -17,6 +17,8 @@
<span class="dim">|</span>
<a class="shortcut" href="#idxO">O</a>
<span class="dim">|</span>
+ <a class="shortcut" href="#idxS">S</a>
+ <span class="dim">|</span>
<a class="shortcut" href="#idxT">T</a></span></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
<td><img src="up-insensitive.png" width="16" height="16" border="0"></td>
@@ -36,6 +38,11 @@
<a class="link" href="GstObject.html#gst-object-has-ancestor" title="gst_object_has_ancestor ()">gst_object_has_ancestor</a>, function in <a class="link" href="GstObject.html" title="GstObject">GstObject</a>
</dt>
<dd></dd>
+<a name="idxS"></a><h3 class="title">S</h3>
+<dt>
+<a class="link" href="GstSegment.html#gst-segment-to-position" title="gst_segment_to_position ()">gst_segment_to_position</a>, function in <a class="link" href="GstSegment.html" title="GstSegment">GstSegment</a>
+</dt>
+<dd></dd>
<a name="idxT"></a><h3 class="title">T</h3>
<dt>
<a class="link" href="GstTagList.html#gst-tag-list-free" title="gst_tag_list_free()">gst_tag_list_free</a>, macro in <a class="link" href="GstTagList.html" title="GstTagList">GstTagList</a>
diff --git a/docs/gst/running.xml b/docs/gst/running.xml
index 103aebb..b034e6a 100644
--- a/docs/gst/running.xml
+++ b/docs/gst/running.xml
@@ -361,6 +361,11 @@
<command>dot foo.dot -Tpng -o foo.png</command> or
<command>dot foo.dot -Tjpg -o foo.jpg</command>.
</para>
+ <para>
+There is also a utility called <command>xdot</command> which allows you to
+view the dot file directly without converting it first.
+ </para>
+
</formalpara>
diff --git a/docs/libs/Makefile.in b/docs/libs/Makefile.in
index 53485f9..68ad7a5 100644
--- a/docs/libs/Makefile.in
+++ b/docs/libs/Makefile.in
@@ -296,6 +296,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/docs/libs/html/GstBaseSink.html b/docs/libs/html/GstBaseSink.html
index bc15a4f..2d3eb60 100644
--- a/docs/libs/html/GstBaseSink.html
+++ b/docs/libs/html/GstBaseSink.html
@@ -1491,54 +1491,54 @@
<hr>
<div class="refsect2">
<a name="GST-BASE-SINK-GET-PREROLL-COND:CAPS"></a><h3>GST_BASE_SINK_GET_PREROLL_COND()</h3>
-<pre class="programlisting">#define GST_BASE_SINK_GET_PREROLL_COND(pad) (&GST_BASE_SINK_CAST(pad)->preroll_cond)
+<pre class="programlisting">#define GST_BASE_SINK_GET_PREROLL_COND(obj) (&GST_BASE_SINK_CAST(obj)->preroll_cond)
</pre>
</div>
<hr>
<div class="refsect2">
<a name="GST-BASE-SINK-GET-PREROLL-LOCK:CAPS"></a><h3>GST_BASE_SINK_GET_PREROLL_LOCK()</h3>
-<pre class="programlisting">#define GST_BASE_SINK_GET_PREROLL_LOCK(pad) (&GST_BASE_SINK_CAST(pad)->preroll_lock)
+<pre class="programlisting">#define GST_BASE_SINK_GET_PREROLL_LOCK(obj) (&GST_BASE_SINK_CAST(obj)->preroll_lock)
</pre>
</div>
<hr>
<div class="refsect2">
<a name="GST-BASE-SINK-PREROLL-BROADCAST:CAPS"></a><h3>GST_BASE_SINK_PREROLL_BROADCAST()</h3>
-<pre class="programlisting">#define GST_BASE_SINK_PREROLL_BROADCAST(pad) g_cond_broadcast (GST_BASE_SINK_GET_PREROLL_COND (pad));
+<pre class="programlisting">#define GST_BASE_SINK_PREROLL_BROADCAST(obj) g_cond_broadcast (GST_BASE_SINK_GET_PREROLL_COND (obj));
</pre>
</div>
<hr>
<div class="refsect2">
<a name="GST-BASE-SINK-PREROLL-LOCK:CAPS"></a><h3>GST_BASE_SINK_PREROLL_LOCK()</h3>
-<pre class="programlisting">#define GST_BASE_SINK_PREROLL_LOCK(pad) (g_mutex_lock(GST_BASE_SINK_GET_PREROLL_LOCK(pad)))
+<pre class="programlisting">#define GST_BASE_SINK_PREROLL_LOCK(obj) (g_mutex_lock(GST_BASE_SINK_GET_PREROLL_LOCK(obj)))
</pre>
</div>
<hr>
<div class="refsect2">
<a name="GST-BASE-SINK-PREROLL-SIGNAL:CAPS"></a><h3>GST_BASE_SINK_PREROLL_SIGNAL()</h3>
-<pre class="programlisting">#define GST_BASE_SINK_PREROLL_SIGNAL(pad) g_cond_signal (GST_BASE_SINK_GET_PREROLL_COND (pad));
+<pre class="programlisting">#define GST_BASE_SINK_PREROLL_SIGNAL(obj) g_cond_signal (GST_BASE_SINK_GET_PREROLL_COND (obj));
</pre>
</div>
<hr>
<div class="refsect2">
<a name="GST-BASE-SINK-PREROLL-TRYLOCK:CAPS"></a><h3>GST_BASE_SINK_PREROLL_TRYLOCK()</h3>
-<pre class="programlisting">#define GST_BASE_SINK_PREROLL_TRYLOCK(pad) (g_mutex_trylock(GST_BASE_SINK_GET_PREROLL_LOCK(pad)))
+<pre class="programlisting">#define GST_BASE_SINK_PREROLL_TRYLOCK(obj) (g_mutex_trylock(GST_BASE_SINK_GET_PREROLL_LOCK(obj)))
</pre>
</div>
<hr>
<div class="refsect2">
<a name="GST-BASE-SINK-PREROLL-UNLOCK:CAPS"></a><h3>GST_BASE_SINK_PREROLL_UNLOCK()</h3>
-<pre class="programlisting">#define GST_BASE_SINK_PREROLL_UNLOCK(pad) (g_mutex_unlock(GST_BASE_SINK_GET_PREROLL_LOCK(pad)))
+<pre class="programlisting">#define GST_BASE_SINK_PREROLL_UNLOCK(obj) (g_mutex_unlock(GST_BASE_SINK_GET_PREROLL_LOCK(obj)))
</pre>
</div>
<hr>
<div class="refsect2">
<a name="GST-BASE-SINK-PREROLL-WAIT:CAPS"></a><h3>GST_BASE_SINK_PREROLL_WAIT()</h3>
-<pre class="programlisting">#define GST_BASE_SINK_PREROLL_WAIT(pad)</pre>
+<pre class="programlisting">#define GST_BASE_SINK_PREROLL_WAIT(obj)</pre>
</div>
<hr>
<div class="refsect2">
<a name="GST-BASE-SINK-PREROLL-WAIT-UNTIL:CAPS"></a><h3>GST_BASE_SINK_PREROLL_WAIT_UNTIL()</h3>
-<pre class="programlisting">#define GST_BASE_SINK_PREROLL_WAIT_UNTIL(pad, end_time)</pre>
+<pre class="programlisting">#define GST_BASE_SINK_PREROLL_WAIT_UNTIL(obj, end_time)</pre>
</div>
</div>
<div class="refsect1">
diff --git a/docs/libs/html/GstInterpolationControlSource.html b/docs/libs/html/GstInterpolationControlSource.html
index c34ab80..12ee8ac 100644
--- a/docs/libs/html/GstInterpolationControlSource.html
+++ b/docs/libs/html/GstInterpolationControlSource.html
@@ -159,7 +159,17 @@
<tr>
<td class="enum_member_name"><p><a name="GST-INTERPOLATION-MODE-CUBIC:CAPS"></a>GST_INTERPOLATION_MODE_CUBIC</p></td>
<td class="enum_member_description">
-<p>cubic interpolation</p>
+<p>cubic interpolation (natural), may overshoot
+ the min or max values set by the control point, but is more 'curvy'</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-INTERPOLATION-MODE-CUBIC-MONO:CAPS"></a>GST_INTERPOLATION_MODE_CUBIC_MONO</p></td>
+<td class="enum_member_description">
+<p>monotonic cubic interpolation, will not
+ produce any values outside of the min-max range set by the control points
+ (Since 1.8)</p>
</td>
<td class="enum_member_annotations"> </td>
</tr>
diff --git a/docs/libs/html/GstTimedValueControlSource.html b/docs/libs/html/GstTimedValueControlSource.html
index 750ac1b..bc68906 100644
--- a/docs/libs/html/GstTimedValueControlSource.html
+++ b/docs/libs/html/GstTimedValueControlSource.html
@@ -448,7 +448,7 @@
gdouble value;
};
</pre>
-<p>a internal structure for value+time and various temporary
+<p>An internal structure for value+time and various temporary
values used for interpolation. This "inherits" from
GstTimedValue.</p>
<div class="refsect3">
diff --git a/docs/libs/html/gstreamer-libs-1.0.devhelp2 b/docs/libs/html/gstreamer-libs-1.0.devhelp2
index b2b835f..bd96956 100644
--- a/docs/libs/html/gstreamer-libs-1.0.devhelp2
+++ b/docs/libs/html/gstreamer-libs-1.0.devhelp2
@@ -563,7 +563,7 @@
<keyword type="struct" name="struct GstTriggerControlSource" link="GstTriggerControlSource.html#GstTriggerControlSource-struct"/>
<keyword type="property" name="The “tolerance” property" link="GstTriggerControlSource.html#GstTriggerControlSource--tolerance"/>
<keyword type="function" name="gst_buffer_add_net_address_meta ()" link="gstreamer-libs-GstNetAddressMeta.html#gst-buffer-add-net-address-meta"/>
- <keyword type="macro" name="gst_buffer_get_net_address_meta()" link="gstreamer-libs-GstNetAddressMeta.html#gst-buffer-get-net-address-meta"/>
+ <keyword type="function" name="gst_buffer_get_net_address_meta ()" link="gstreamer-libs-GstNetAddressMeta.html#gst-buffer-get-net-address-meta"/>
<keyword type="function" name="gst_net_address_meta_get_info ()" link="gstreamer-libs-GstNetAddressMeta.html#gst-net-address-meta-get-info"/>
<keyword type="struct" name="struct GstNetAddressMeta" link="gstreamer-libs-GstNetAddressMeta.html#GstNetAddressMeta"/>
<keyword type="function" name="gst_net_client_clock_new ()" link="GstNetClientClock.html#gst-net-client-clock-new"/>
@@ -785,6 +785,7 @@
<keyword type="constant" name="GST_INTERPOLATION_MODE_NONE" link="GstInterpolationControlSource.html#GST-INTERPOLATION-MODE-NONE:CAPS"/>
<keyword type="constant" name="GST_INTERPOLATION_MODE_LINEAR" link="GstInterpolationControlSource.html#GST-INTERPOLATION-MODE-LINEAR:CAPS"/>
<keyword type="constant" name="GST_INTERPOLATION_MODE_CUBIC" link="GstInterpolationControlSource.html#GST-INTERPOLATION-MODE-CUBIC:CAPS"/>
+ <keyword type="constant" name="GST_INTERPOLATION_MODE_CUBIC_MONO" link="GstInterpolationControlSource.html#GST-INTERPOLATION-MODE-CUBIC-MONO:CAPS"/>
<keyword type="constant" name="GST_LFO_WAVEFORM_SINE" link="GstLFOControlSource.html#GST-LFO-WAVEFORM-SINE:CAPS"/>
<keyword type="constant" name="GST_LFO_WAVEFORM_SQUARE" link="GstLFOControlSource.html#GST-LFO-WAVEFORM-SQUARE:CAPS"/>
<keyword type="constant" name="GST_LFO_WAVEFORM_SAW" link="GstLFOControlSource.html#GST-LFO-WAVEFORM-SAW:CAPS"/>
diff --git a/docs/libs/html/gstreamer-libs-GstHarness.html b/docs/libs/html/gstreamer-libs-GstHarness.html
index 9d993f9..ca3040a 100644
--- a/docs/libs/html/gstreamer-libs-GstHarness.html
+++ b/docs/libs/html/gstreamer-libs-GstHarness.html
@@ -702,10 +702,10 @@
</div>
<div class="refsect1">
<a name="gstreamer-libs-GstHarness.description"></a><h2>Description</h2>
-<p><a class="link" href="gstreamer-libs-GstHarness.html#GstHarness" title="struct GstHarness"><span class="type">GstHarness</span></a> is ment to make writing unit test for GStreamer much easier.
-It can be though of as a way of treating a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> as a black box,
-deterministially feeding it data, and controlling what data it outputs.</p>
-<p>The basic structure of <a class="link" href="gstreamer-libs-GstHarness.html#GstHarness" title="struct GstHarness"><span class="type">GstHarness</span></a> is two "floating" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPads</span></a>, that connects
+<p><a class="link" href="gstreamer-libs-GstHarness.html#GstHarness" title="struct GstHarness"><span class="type">GstHarness</span></a> is meant to make writing unit test for GStreamer much easier.
+It can be thought of as a way of treating a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> as a black box,
+deterministically feeding it data, and controlling what data it outputs.</p>
+<p>The basic structure of <a class="link" href="gstreamer-libs-GstHarness.html#GstHarness" title="struct GstHarness"><span class="type">GstHarness</span></a> is two "floating" <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPads</span></a> that connect
to the harnessed <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> src and sink <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPads</span></a> like so:</p>
<pre class="programlisting">
__________________________
@@ -718,15 +718,15 @@
</pre>
<p>With this, you can now simulate any environment the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> might find
itself in. By specifying the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstCaps.html"><span class="type">GstCaps</span></a> of the harness <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html"><span class="type">GstPads</span></a>, using
-functions like gst_harness_set_src_caps or gst_harness_set_sink_caps_str,
-you can test how the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> interacts with different capssets.</p>
+functions like <a class="link" href="gstreamer-libs-GstHarness.html#gst-harness-set-src-caps" title="gst_harness_set_src_caps ()"><code class="function">gst_harness_set_src_caps()</code></a> or <a class="link" href="gstreamer-libs-GstHarness.html#gst-harness-set-sink-caps-str" title="gst_harness_set_sink_caps_str ()"><code class="function">gst_harness_set_sink_caps_str()</code></a>,
+you can test how the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> interacts with different caps sets.</p>
<p>Your harnessed <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> can of course also be a bin, and using
-gst_harness_new_parse supporting standard gst-launch syntax, you can
+<a class="link" href="gstreamer-libs-GstHarness.html#gst-harness-new-parse" title="gst_harness_new_parse ()"><code class="function">gst_harness_new_parse()</code></a> supporting standard gst-launch syntax, you can
easily test a whole pipeline instead of just one element.</p>
<p>You can then go on to push <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html"><span class="type">GstBuffers</span></a> and <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstEvent.html"><span class="type">GstEvents</span></a> on to the srcpad,
-using functions like gst_harness_push and gst_harness_push_event, and
-then pull them out to examine them with gst_harness_pull and
-gst_harness_pull_event.</p>
+using functions like <a class="link" href="gstreamer-libs-GstHarness.html#gst-harness-push" title="gst_harness_push ()"><code class="function">gst_harness_push()</code></a> and <a class="link" href="gstreamer-libs-GstHarness.html#gst-harness-push-event" title="gst_harness_push_event ()"><code class="function">gst_harness_push_event()</code></a>, and
+then pull them out to examine them with <a class="link" href="gstreamer-libs-GstHarness.html#gst-harness-pull" title="gst_harness_pull ()"><code class="function">gst_harness_pull()</code></a> and
+<a class="link" href="gstreamer-libs-GstHarness.html#gst-harness-pull-event" title="gst_harness_pull_event ()"><code class="function">gst_harness_pull_event()</code></a>.</p>
<div class="example">
<a name="id-1.2.7.6.6.8"></a><p class="title"><b>Example 1. A simple buffer-in buffer-out example</b></p>
<div class="example-contents">
@@ -797,13 +797,13 @@
<a class="link" href="GstTestClock.html" title="GstTestClock"><span class="type">GstTestClock</span></a>. Operating the <a class="link" href="GstTestClock.html" title="GstTestClock"><span class="type">GstTestClock</span></a> can be very challenging, but
<a class="link" href="gstreamer-libs-GstHarness.html#GstHarness" title="struct GstHarness"><span class="type">GstHarness</span></a> simplifies some of the most desired actions a lot, like wanting
to manually advance the clock while at the same time releasing a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockID"><span class="type">GstClockID</span></a>
-that is waiting, with functions like gst_harness_crank_single_clock_wait.</p>
+that is waiting, with functions like <a class="link" href="gstreamer-libs-GstHarness.html#gst-harness-crank-single-clock-wait" title="gst_harness_crank_single_clock_wait ()"><code class="function">gst_harness_crank_single_clock_wait()</code></a>.</p>
<p><a class="link" href="gstreamer-libs-GstHarness.html#GstHarness" title="struct GstHarness"><span class="type">GstHarness</span></a> also supports sub-harnesses, as a way of generating and
validating data. A sub-harness is another <a class="link" href="gstreamer-libs-GstHarness.html#GstHarness" title="struct GstHarness"><span class="type">GstHarness</span></a> that is managed by
the "parent" harness, and can either be created by using the standard
gst_harness_new type functions directly on the (GstHarness *)->src_harness,
-or using the much more convenient gst_harness_add_src or
-gst_harness_add_sink_parse. If you have a decoder-element you want to test,
+or using the much more convenient <a class="link" href="gstreamer-libs-GstHarness.html#gst-harness-add-src" title="gst_harness_add_src ()"><code class="function">gst_harness_add_src()</code></a> or
+<a class="link" href="gstreamer-libs-GstHarness.html#gst-harness-add-sink-parse" title="gst_harness_add_sink_parse ()"><code class="function">gst_harness_add_sink_parse()</code></a>. If you have a decoder-element you want to test,
(like vp8dec) it can be very useful to add a src-harness with both a
src-element (videotestsrc) and an encoder (vp8enc) to feed the decoder data
with different configurations, by simply doing:</p>
diff --git a/docs/libs/html/gstreamer-libs-GstNetAddressMeta.html b/docs/libs/html/gstreamer-libs-GstNetAddressMeta.html
index 65de030..e64f65d 100644
--- a/docs/libs/html/gstreamer-libs-GstNetAddressMeta.html
+++ b/docs/libs/html/gstreamer-libs-GstNetAddressMeta.html
@@ -48,9 +48,11 @@
</td>
</tr>
<tr>
-<td class="define_keyword">#define</td>
+<td class="function_type">
+<a class="link" href="gstreamer-libs-GstNetAddressMeta.html#GstNetAddressMeta" title="struct GstNetAddressMeta"><span class="returnvalue">GstNetAddressMeta</span></a> *
+</td>
<td class="function_name">
-<a class="link" href="gstreamer-libs-GstNetAddressMeta.html#gst-buffer-get-net-address-meta" title="gst_buffer_get_net_address_meta()">gst_buffer_get_net_address_meta</a><span class="c_punctuation">()</span>
+<a class="link" href="gstreamer-libs-GstNetAddressMeta.html#gst-buffer-get-net-address-meta" title="gst_buffer_get_net_address_meta ()">gst_buffer_get_net_address_meta</a> <span class="c_punctuation">()</span>
</td>
</tr>
<tr>
@@ -130,8 +132,33 @@
</div>
<hr>
<div class="refsect2">
-<a name="gst-buffer-get-net-address-meta"></a><h3>gst_buffer_get_net_address_meta()</h3>
-<pre class="programlisting">#define gst_buffer_get_net_address_meta(b)</pre>
+<a name="gst-buffer-get-net-address-meta"></a><h3>gst_buffer_get_net_address_meta ()</h3>
+<pre class="programlisting"><a class="link" href="gstreamer-libs-GstNetAddressMeta.html#GstNetAddressMeta" title="struct GstNetAddressMeta"><span class="returnvalue">GstNetAddressMeta</span></a> *
+gst_buffer_get_net_address_meta (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
+<p>Find the <a class="link" href="gstreamer-libs-GstNetAddressMeta.html#GstNetAddressMeta" title="struct GstNetAddressMeta"><span class="type">GstNetAddressMeta</span></a> on <em class="parameter"><code>buffer</code></em>
+.</p>
+<div class="refsect3">
+<a name="id-1.2.6.3.7.3.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>buffer</p></td>
+<td class="parameter_description"><p>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html"><span class="type">GstBuffer</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.6.3.7.3.6"></a><h4>Returns</h4>
+<p> the <a class="link" href="gstreamer-libs-GstNetAddressMeta.html#GstNetAddressMeta" title="struct GstNetAddressMeta"><span class="type">GstNetAddressMeta</span></a> or <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> when there
+is no such metadata on <em class="parameter"><code>buffer</code></em>
+. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
</div>
<hr>
<div class="refsect2">
diff --git a/docs/libs/html/index.html b/docs/libs/html/index.html
index 4f4894f..7546e3f 100644
--- a/docs/libs/html/index.html
+++ b/docs/libs/html/index.html
@@ -15,7 +15,7 @@
<div>
<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">GStreamer 1.0 Library Reference Manual</p></th></tr></table></div>
<div><p class="releaseinfo">
- for GStreamer Library 1.0 (1.6.2)
+ for GStreamer Library 1.0 (1.7.1)
The latest version of this documentation can be found on-line at
<a class="ulink" href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/</a>.
</p></div>
diff --git a/docs/libs/html/index.sgml b/docs/libs/html/index.sgml
index b809ca4..d0c5aef 100644
--- a/docs/libs/html/index.sgml
+++ b/docs/libs/html/index.sgml
@@ -666,6 +666,7 @@
<ANCHOR id="GST-INTERPOLATION-MODE-NONE:CAPS" href="gstreamer-libs-1.0/GstInterpolationControlSource.html#GST-INTERPOLATION-MODE-NONE:CAPS">
<ANCHOR id="GST-INTERPOLATION-MODE-LINEAR:CAPS" href="gstreamer-libs-1.0/GstInterpolationControlSource.html#GST-INTERPOLATION-MODE-LINEAR:CAPS">
<ANCHOR id="GST-INTERPOLATION-MODE-CUBIC:CAPS" href="gstreamer-libs-1.0/GstInterpolationControlSource.html#GST-INTERPOLATION-MODE-CUBIC:CAPS">
+<ANCHOR id="GST-INTERPOLATION-MODE-CUBIC-MONO:CAPS" href="gstreamer-libs-1.0/GstInterpolationControlSource.html#GST-INTERPOLATION-MODE-CUBIC-MONO:CAPS">
<ANCHOR id="GstInterpolationControlSource.property-details" href="gstreamer-libs-1.0/GstInterpolationControlSource.html#GstInterpolationControlSource.property-details">
<ANCHOR id="GstInterpolationControlSource--mode" href="gstreamer-libs-1.0/GstInterpolationControlSource.html#GstInterpolationControlSource--mode">
<ANCHOR id="GstLFOControlSource" href="gstreamer-libs-1.0/GstLFOControlSource.html">
diff --git a/docs/libs/html/ix01.html b/docs/libs/html/ix01.html
index e416ff4..e30a991 100644
--- a/docs/libs/html/ix01.html
+++ b/docs/libs/html/ix01.html
@@ -899,7 +899,7 @@
</dt>
<dd></dd>
<dt>
-<a class="link" href="gstreamer-libs-GstNetAddressMeta.html#gst-buffer-get-net-address-meta" title="gst_buffer_get_net_address_meta()">gst_buffer_get_net_address_meta</a>, macro in <a class="link" href="gstreamer-libs-GstNetAddressMeta.html" title="GstNetAddressMeta">GstNetAddressMeta</a>
+<a class="link" href="gstreamer-libs-GstNetAddressMeta.html#gst-buffer-get-net-address-meta" title="gst_buffer_get_net_address_meta ()">gst_buffer_get_net_address_meta</a>, function in <a class="link" href="gstreamer-libs-GstNetAddressMeta.html" title="GstNetAddressMeta">GstNetAddressMeta</a>
</dt>
<dd></dd>
<dt>
diff --git a/docs/manual/Makefile.in b/docs/manual/Makefile.in
index 096dda1..e014b24 100644
--- a/docs/manual/Makefile.in
+++ b/docs/manual/Makefile.in
@@ -327,6 +327,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/docs/manual/advanced-dataaccess.xml b/docs/manual/advanced-dataaccess.xml
index 555d0ba..eb297c8 100644
--- a/docs/manual/advanced-dataaccess.xml
+++ b/docs/manual/advanced-dataaccess.xml
@@ -915,7 +915,7 @@
if (error != NULL) {
g_print ("could not construct pipeline: %s\n", error->message);
- g_error_free (error);
+ g_clear_error (&error);
exit (-1);
}
@@ -1392,11 +1392,11 @@
GstElement *next;
if (GST_EVENT_TYPE (GST_PAD_PROBE_INFO_DATA (info)) != GST_EVENT_EOS)
- return GST_PAD_PROBE_OK;
+ return GST_PAD_PROBE_PASS;
gst_pad_remove_probe (pad, GST_PAD_PROBE_INFO_ID (info));
- /* push current event back into the queue */
+ /* push current effect 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);
@@ -1475,7 +1475,7 @@
gst_message_parse_error (msg, &err, &dbg);
gst_object_default_error (msg->src, err, dbg);
- g_error_free (err);
+ g_clear_error (&err);
g_free (dbg);
g_main_loop_quit (loop);
break;
@@ -1505,6 +1505,8 @@
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);
+ g_clear_error (&err);
+ g_option_context_free (ctx);
return 1;
}
g_option_context_free (ctx);
diff --git a/docs/manual/advanced-metadata.xml b/docs/manual/advanced-metadata.xml
index 78a3677..f975409 100644
--- a/docs/manual/advanced-metadata.xml
+++ b/docs/manual/advanced-metadata.xml
@@ -107,16 +107,23 @@
{
GstElement *pipe, *dec, *sink;
GstMessage *msg;
+ gchar *uri;
gst_init (&argc, &argv);
- if (argc < 2 || !gst_uri_is_valid (argv[1]))
- g_error ("Usage: %s file:///path/to/file", argv[0]);
+ if (argc < 2)
+ g_error ("Usage: %s FILE or URI", argv[0]);
+
+ if (gst_uri_is_valid (argv[1])) {
+ uri = g_strdup (argv[1]);
+ } else {
+ uri = gst_filename_to_uri (argv[1], NULL);
+ }
pipe = gst_pipeline_new ("pipeline");
dec = gst_element_factory_make ("uridecodebin", NULL);
- g_object_set (dec, "uri", argv[1], NULL);
+ g_object_set (dec, "uri", uri, NULL);
gst_bin_add (GST_BIN (pipe), dec);
sink = gst_element_factory_make ("fakesink", NULL);
@@ -144,14 +151,20 @@
gst_tag_list_unref (tags);
gst_message_unref (msg);
- };
+ }
- if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR)
- g_error ("Got error");
+ if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) {
+ GError *err = NULL;
+
+ gst_message_parse_error (msg, &err, NULL);
+ g_printerr ("Got error: %s\n", err->message);
+ g_error_free (err);
+ }
gst_message_unref (msg);
gst_element_set_state (pipe, GST_STATE_NULL);
gst_object_unref (pipe);
+ g_free (uri);
return 0;
}
</programlisting>
diff --git a/docs/manual/appendix-integration.xml b/docs/manual/appendix-integration.xml
index b558788..b288a6b 100644
--- a/docs/manual/appendix-integration.xml
+++ b/docs/manual/appendix-integration.xml
@@ -127,8 +127,11 @@
* calls gtk_init() and gst_init() */
if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
g_print ("Error initializing: %s\n", err->message);
+ g_clear_error (&err);
+ g_option_context_free (ctx);
exit (1);
}
+ g_option_context_free (ctx);
/* any filenames we got passed on the command line? parse them! */
if (cmd_filenames != NULL) {
diff --git a/docs/manual/basics-init.xml b/docs/manual/basics-init.xml
index 7a8467b..3a71be6 100644
--- a/docs/manual/basics-init.xml
+++ b/docs/manual/basics-init.xml
@@ -102,9 +102,11 @@
g_option_context_add_group (ctx, gst_init_get_option_group ());
if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
g_print ("Failed to initialize: %s\n", err->message);
- g_error_free (err);
+ g_clear_error (&err);
+ g_option_context_free (ctx);
return 1;
}
+ g_option_context_free (ctx);
printf ("Run me with --help to see the Application options appended.\n");
diff --git a/docs/plugins/Makefile.in b/docs/plugins/Makefile.in
index 9327733..dd02c7b 100644
--- a/docs/plugins/Makefile.in
+++ b/docs/plugins/Makefile.in
@@ -292,6 +292,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/docs/plugins/gstreamer-plugins-docs.sgml b/docs/plugins/gstreamer-plugins-docs.sgml
index c97ddc4..89edb0c 100644
--- a/docs/plugins/gstreamer-plugins-docs.sgml
+++ b/docs/plugins/gstreamer-plugins-docs.sgml
@@ -20,19 +20,19 @@
<xi:include href="xml/element-capsfilter.xml" />
<xi:include href="xml/element-concat.xml" />
<xi:include href="xml/element-downloadbuffer.xml" />
- <xi:include href="xml/element-fakesrc.xml" />
<xi:include href="xml/element-fakesink.xml" />
+ <xi:include href="xml/element-fakesrc.xml" />
<xi:include href="xml/element-fdsink.xml" />
<xi:include href="xml/element-fdsrc.xml" />
- <xi:include href="xml/element-filesrc.xml" />
<xi:include href="xml/element-filesink.xml" />
+ <xi:include href="xml/element-filesrc.xml" />
<xi:include href="xml/element-funnel.xml" />
<xi:include href="xml/element-identity.xml" />
<xi:include href="xml/element-input-selector.xml" />
<xi:include href="xml/element-multiqueue.xml" />
<xi:include href="xml/element-output-selector.xml" />
- <xi:include href="xml/element-queue.xml" />
<xi:include href="xml/element-queue2.xml" />
+ <xi:include href="xml/element-queue.xml" />
<xi:include href="xml/element-streamiddemux.xml" />
<xi:include href="xml/element-tee.xml" />
<xi:include href="xml/element-typefind.xml" />
diff --git a/docs/plugins/gstreamer-plugins.args b/docs/plugins/gstreamer-plugins.args
index c9bb39c..0796364 100644
--- a/docs/plugins/gstreamer-plugins.args
+++ b/docs/plugins/gstreamer-plugins.args
@@ -249,6 +249,16 @@
</ARG>
<ARG>
+<NAME>GstQueue2::avg-in-rate</NAME>
+<TYPE>gint64</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>r</FLAGS>
+<NICK>Input data rate (bytes/s)</NICK>
+<BLURB>Average input data rate (bytes/s).</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
<NAME>GstQueue::current-level-buffers</NAME>
<TYPE>guint</TYPE>
<RANGE></RANGE>
@@ -499,6 +509,26 @@
</ARG>
<ARG>
+<NAME>GstMultiQueue::unlinked-cache-time</NAME>
+<TYPE>guint64</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Unlinked cache time (ns)</NICK>
+<BLURB>Extra buffering in time for unlinked streams (if 'sync-by-running-time').</BLURB>
+<DEFAULT>250000000</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstMultiQueue::use-interleave</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Use interleave</NICK>
+<BLURB>Adjust time limits based on input interleave.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
<NAME>GstInputSelector::active-pad</NAME>
<TYPE>GstPad*</TYPE>
<RANGE></RANGE>
@@ -669,6 +699,16 @@
</ARG>
<ARG>
+<NAME>GstIdentity::drop-buffer-flags</NAME>
+<TYPE>GstBufferFlags</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Check flags to drop buffers</NICK>
+<BLURB>Drop buffers with the given flags.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
<NAME>GstFileSrc::location</NAME>
<TYPE>gchar*</TYPE>
<RANGE></RANGE>
diff --git a/docs/plugins/gstreamer-plugins.hierarchy b/docs/plugins/gstreamer-plugins.hierarchy
index 892e984..480fce1 100644
--- a/docs/plugins/gstreamer-plugins.hierarchy
+++ b/docs/plugins/gstreamer-plugins.hierarchy
@@ -40,10 +40,16 @@
GstPluginFeature
GstDeviceProviderFactory
GstElementFactory
+ GstTracerFactory
GstTypeFindFactory
GstRegistry
GstTask
GstTaskPool
+ GstTracer
+ GstLatencyTracer
+ GstLogTracer
+ GstRUsageTracer
+ GstStatsTracer
GInterface
GTypePlugin
GstChildProxy
diff --git a/docs/plugins/gstreamer-plugins.signals b/docs/plugins/gstreamer-plugins.signals
index 026f5c2..a0cf066 100644
--- a/docs/plugins/gstreamer-plugins.signals
+++ b/docs/plugins/gstreamer-plugins.signals
@@ -84,3 +84,10 @@
GstPad *arg2
</SIGNAL>
+<SIGNAL>
+<NAME>GstQueue2::overrun</NAME>
+<RETURNS>void</RETURNS>
+<FLAGS>f</FLAGS>
+GstQueue2 *gstqueue2
+</SIGNAL>
+
diff --git a/docs/plugins/html/ch01.html b/docs/plugins/html/ch01.html
index 9ac4f07..7c219d7 100644
--- a/docs/plugins/html/ch01.html
+++ b/docs/plugins/html/ch01.html
@@ -33,10 +33,10 @@
<span class="refentrytitle"><a href="gstreamer-plugins-downloadbuffer.html">downloadbuffer</a></span><span class="refpurpose"></span>
</dt>
<dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-fakesrc.html">fakesrc</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-fakesink.html">fakesink</a></span><span class="refpurpose"></span>
</dt>
<dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-fakesink.html">fakesink</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-fakesrc.html">fakesrc</a></span><span class="refpurpose"></span>
</dt>
<dt>
<span class="refentrytitle"><a href="gstreamer-plugins-fdsink.html">fdsink</a></span><span class="refpurpose"></span>
@@ -45,10 +45,10 @@
<span class="refentrytitle"><a href="gstreamer-plugins-fdsrc.html">fdsrc</a></span><span class="refpurpose"></span>
</dt>
<dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-filesrc.html">filesrc</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-filesink.html">filesink</a></span><span class="refpurpose"></span>
</dt>
<dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-filesink.html">filesink</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-filesrc.html">filesrc</a></span><span class="refpurpose"></span>
</dt>
<dt>
<span class="refentrytitle"><a href="gstreamer-plugins-funnel.html">funnel</a></span><span class="refpurpose"></span>
@@ -66,10 +66,10 @@
<span class="refentrytitle"><a href="gstreamer-plugins-output-selector.html">output-selector</a></span><span class="refpurpose"></span>
</dt>
<dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-queue.html">queue</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-queue2.html">queue2</a></span><span class="refpurpose"></span>
</dt>
<dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-queue2.html">queue2</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-queue.html">queue</a></span><span class="refpurpose"></span>
</dt>
<dt>
<span class="refentrytitle"><a href="gstreamer-plugins-streamiddemux.html">streamiddemux</a></span><span class="refpurpose"></span>
diff --git a/docs/plugins/html/gstreamer-plugins-1.0.devhelp2 b/docs/plugins/html/gstreamer-plugins-1.0.devhelp2
index ff3b17b..2676c58 100644
--- a/docs/plugins/html/gstreamer-plugins-1.0.devhelp2
+++ b/docs/plugins/html/gstreamer-plugins-1.0.devhelp2
@@ -5,19 +5,19 @@
<sub name="capsfilter" link="gstreamer-plugins-capsfilter.html"/>
<sub name="concat" link="gstreamer-plugins-concat.html"/>
<sub name="downloadbuffer" link="gstreamer-plugins-downloadbuffer.html"/>
- <sub name="fakesrc" link="gstreamer-plugins-fakesrc.html"/>
<sub name="fakesink" link="gstreamer-plugins-fakesink.html"/>
+ <sub name="fakesrc" link="gstreamer-plugins-fakesrc.html"/>
<sub name="fdsink" link="gstreamer-plugins-fdsink.html"/>
<sub name="fdsrc" link="gstreamer-plugins-fdsrc.html"/>
- <sub name="filesrc" link="gstreamer-plugins-filesrc.html"/>
<sub name="filesink" link="gstreamer-plugins-filesink.html"/>
+ <sub name="filesrc" link="gstreamer-plugins-filesrc.html"/>
<sub name="funnel" link="gstreamer-plugins-funnel.html"/>
<sub name="identity" link="gstreamer-plugins-identity.html"/>
<sub name="input-selector" link="gstreamer-plugins-input-selector.html"/>
<sub name="multiqueue" link="gstreamer-plugins-multiqueue.html"/>
<sub name="output-selector" link="gstreamer-plugins-output-selector.html"/>
- <sub name="queue" link="gstreamer-plugins-queue.html"/>
<sub name="queue2" link="gstreamer-plugins-queue2.html"/>
+ <sub name="queue" link="gstreamer-plugins-queue.html"/>
<sub name="streamiddemux" link="gstreamer-plugins-streamiddemux.html"/>
<sub name="tee" link="gstreamer-plugins-tee.html"/>
<sub name="typefind" link="gstreamer-plugins-typefind.html"/>
@@ -43,6 +43,18 @@
<keyword type="property" name="The “temp-location” property" link="gstreamer-plugins-downloadbuffer.html#GstDownloadBuffer--temp-location"/>
<keyword type="property" name="The “temp-remove” property" link="gstreamer-plugins-downloadbuffer.html#GstDownloadBuffer--temp-remove"/>
<keyword type="property" name="The “temp-template” property" link="gstreamer-plugins-downloadbuffer.html#GstDownloadBuffer--temp-template"/>
+ <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 “can-activate-push” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--can-activate-push"/>
+ <keyword type="property" name="The “dump” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--dump"/>
+ <keyword type="property" name="The “last-message” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--last-message"/>
+ <keyword type="property" name="The “num-buffers” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--num-buffers"/>
+ <keyword type="property" name="The “signal-handoffs” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--signal-handoffs"/>
+ <keyword type="property" name="The “silent” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--silent"/>
+ <keyword type="property" name="The “state-error” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--state-error"/>
+ <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="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"/>
@@ -66,31 +78,19 @@
<keyword type="property" name="The “sizetype” property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--sizetype"/>
<keyword type="property" name="The “sync” property" link="gstreamer-plugins-fakesrc.html#GstFakeSrc--sync"/>
<keyword type="signal" name="The “handoff” signal" link="gstreamer-plugins-fakesrc.html#GstFakeSrc-handoff"/>
- <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 “can-activate-push” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--can-activate-push"/>
- <keyword type="property" name="The “dump” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--dump"/>
- <keyword type="property" name="The “last-message” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--last-message"/>
- <keyword type="property" name="The “num-buffers” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--num-buffers"/>
- <keyword type="property" name="The “signal-handoffs” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--signal-handoffs"/>
- <keyword type="property" name="The “silent” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--silent"/>
- <keyword type="property" name="The “state-error” property" link="gstreamer-plugins-fakesink.html#GstFakeSink--state-error"/>
- <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="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="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="struct" name="struct GstFileSrc" link="gstreamer-plugins-filesrc.html#GstFileSrc-struct"/>
- <keyword type="property" name="The “location” property" link="gstreamer-plugins-filesrc.html#GstFileSrc--location"/>
<keyword type="struct" name="struct GstFileSink" link="gstreamer-plugins-filesink.html#GstFileSink-struct"/>
<keyword type="enum" name="enum GstFileSinkBufferMode" link="gstreamer-plugins-filesink.html#GstFileSinkBufferMode"/>
<keyword type="property" name="The “append” property" link="gstreamer-plugins-filesink.html#GstFileSink--append"/>
<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 “location” property" link="gstreamer-plugins-filesink.html#GstFileSink--location"/>
+ <keyword type="struct" name="struct GstFileSrc" link="gstreamer-plugins-filesrc.html#GstFileSrc-struct"/>
+ <keyword type="property" name="The “location” property" link="gstreamer-plugins-filesrc.html#GstFileSrc--location"/>
<keyword type="struct" name="struct GstFunnel" link="gstreamer-plugins-funnel.html#GstFunnel-struct"/>
<keyword type="property" name="The “forward-sticky-events” property" link="gstreamer-plugins-funnel.html#GstFunnel--forward-sticky-events"/>
<keyword type="struct" name="struct GstIdentity" link="gstreamer-plugins-identity.html#GstIdentity-struct"/>
@@ -106,6 +106,7 @@
<keyword type="property" name="The “single-segment” property" link="gstreamer-plugins-identity.html#GstIdentity--single-segment"/>
<keyword type="property" name="The “sleep-time” property" link="gstreamer-plugins-identity.html#GstIdentity--sleep-time"/>
<keyword type="property" name="The “sync” property" link="gstreamer-plugins-identity.html#GstIdentity--sync"/>
+ <keyword type="property" name="The “drop-buffer-flags” property" link="gstreamer-plugins-identity.html#GstIdentity--drop-buffer-flags"/>
<keyword type="signal" name="The “handoff” signal" link="gstreamer-plugins-identity.html#GstIdentity-handoff"/>
<keyword type="struct" name="struct GstInputSelector" link="gstreamer-plugins-input-selector.html#GstInputSelector-struct"/>
<keyword type="enum" name="enum GstInputSelectorSyncMode" link="gstreamer-plugins-input-selector.html#GstInputSelectorSyncMode"/>
@@ -125,6 +126,8 @@
<keyword type="property" name="The “max-size-time” property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--max-size-time"/>
<keyword type="property" name="The “sync-by-running-time” property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--sync-by-running-time"/>
<keyword type="property" name="The “use-buffering” property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--use-buffering"/>
+ <keyword type="property" name="The “unlinked-cache-time” property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--unlinked-cache-time"/>
+ <keyword type="property" name="The “use-interleave” property" link="gstreamer-plugins-multiqueue.html#GstMultiQueue--use-interleave"/>
<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="struct" name="struct GstOutputSelector" link="gstreamer-plugins-output-selector.html#GstOutputSelector-struct"/>
@@ -132,6 +135,23 @@
<keyword type="property" name="The “active-pad” property" link="gstreamer-plugins-output-selector.html#GstOutputSelector--active-pad"/>
<keyword type="property" name="The “pad-negotiation-mode” property" link="gstreamer-plugins-output-selector.html#GstOutputSelector--pad-negotiation-mode"/>
<keyword type="property" name="The “resend-latest” property" link="gstreamer-plugins-output-selector.html#GstOutputSelector--resend-latest"/>
+ <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 “current-level-time” property" link="gstreamer-plugins-queue2.html#GstQueue2--current-level-time"/>
+ <keyword type="property" name="The “high-percent” property" link="gstreamer-plugins-queue2.html#GstQueue2--high-percent"/>
+ <keyword type="property" name="The “low-percent” property" link="gstreamer-plugins-queue2.html#GstQueue2--low-percent"/>
+ <keyword type="property" name="The “max-size-buffers” property" link="gstreamer-plugins-queue2.html#GstQueue2--max-size-buffers"/>
+ <keyword type="property" name="The “max-size-bytes” property" link="gstreamer-plugins-queue2.html#GstQueue2--max-size-bytes"/>
+ <keyword type="property" name="The “max-size-time” property" link="gstreamer-plugins-queue2.html#GstQueue2--max-size-time"/>
+ <keyword type="property" name="The “ring-buffer-max-size” property" link="gstreamer-plugins-queue2.html#GstQueue2--ring-buffer-max-size"/>
+ <keyword type="property" name="The “temp-location” property" link="gstreamer-plugins-queue2.html#GstQueue2--temp-location"/>
+ <keyword type="property" name="The “temp-remove” property" link="gstreamer-plugins-queue2.html#GstQueue2--temp-remove"/>
+ <keyword type="property" name="The “temp-template” property" link="gstreamer-plugins-queue2.html#GstQueue2--temp-template"/>
+ <keyword type="property" name="The “use-buffering” property" link="gstreamer-plugins-queue2.html#GstQueue2--use-buffering"/>
+ <keyword type="property" name="The “use-rate-estimate” property" link="gstreamer-plugins-queue2.html#GstQueue2--use-rate-estimate"/>
+ <keyword type="property" name="The “avg-in-rate” property" link="gstreamer-plugins-queue2.html#GstQueue2--avg-in-rate"/>
+ <keyword type="signal" name="The “overrun” signal" link="gstreamer-plugins-queue2.html#GstQueue2-overrun"/>
<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"/>
@@ -150,21 +170,6 @@
<keyword type="signal" name="The “pushing” signal" link="gstreamer-plugins-queue.html#GstQueue-pushing"/>
<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="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 “current-level-time” property" link="gstreamer-plugins-queue2.html#GstQueue2--current-level-time"/>
- <keyword type="property" name="The “high-percent” property" link="gstreamer-plugins-queue2.html#GstQueue2--high-percent"/>
- <keyword type="property" name="The “low-percent” property" link="gstreamer-plugins-queue2.html#GstQueue2--low-percent"/>
- <keyword type="property" name="The “max-size-buffers” property" link="gstreamer-plugins-queue2.html#GstQueue2--max-size-buffers"/>
- <keyword type="property" name="The “max-size-bytes” property" link="gstreamer-plugins-queue2.html#GstQueue2--max-size-bytes"/>
- <keyword type="property" name="The “max-size-time” property" link="gstreamer-plugins-queue2.html#GstQueue2--max-size-time"/>
- <keyword type="property" name="The “ring-buffer-max-size” property" link="gstreamer-plugins-queue2.html#GstQueue2--ring-buffer-max-size"/>
- <keyword type="property" name="The “temp-location” property" link="gstreamer-plugins-queue2.html#GstQueue2--temp-location"/>
- <keyword type="property" name="The “temp-remove” property" link="gstreamer-plugins-queue2.html#GstQueue2--temp-remove"/>
- <keyword type="property" name="The “temp-template” property" link="gstreamer-plugins-queue2.html#GstQueue2--temp-template"/>
- <keyword type="property" name="The “use-buffering” property" link="gstreamer-plugins-queue2.html#GstQueue2--use-buffering"/>
- <keyword type="property" name="The “use-rate-estimate” property" link="gstreamer-plugins-queue2.html#GstQueue2--use-rate-estimate"/>
<keyword type="struct" name="struct GstStreamidDemux" link="gstreamer-plugins-streamiddemux.html#GstStreamidDemux-struct"/>
<keyword type="property" name="The “active-pad” property" link="gstreamer-plugins-streamiddemux.html#GstStreamidDemux--active-pad"/>
<keyword type="struct" name="struct GstTee" link="gstreamer-plugins-tee.html#GstTee-struct"/>
@@ -185,6 +190,13 @@
<keyword type="property" name="The “drop” property" link="gstreamer-plugins-valve.html#GstValve--drop"/>
<keyword type="constant" name="GST_CAPS_FILTER_CAPS_CHANGE_MODE_IMMEDIATE" link="gstreamer-plugins-capsfilter.html#GST-CAPS-FILTER-CAPS-CHANGE-MODE-IMMEDIATE:CAPS"/>
<keyword type="constant" name="GST_CAPS_FILTER_CAPS_CHANGE_MODE_DELAYED" link="gstreamer-plugins-capsfilter.html#GST-CAPS-FILTER-CAPS-CHANGE-MODE-DELAYED:CAPS"/>
+ <keyword type="constant" name="FAKE_SINK_STATE_ERROR_NONE" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-NONE:CAPS"/>
+ <keyword type="constant" name="FAKE_SINK_STATE_ERROR_NULL_READY" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-NULL-READY:CAPS"/>
+ <keyword type="constant" name="FAKE_SINK_STATE_ERROR_READY_PAUSED" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-READY-PAUSED:CAPS"/>
+ <keyword type="constant" name="FAKE_SINK_STATE_ERROR_PAUSED_PLAYING" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PAUSED-PLAYING:CAPS"/>
+ <keyword type="constant" name="FAKE_SINK_STATE_ERROR_PLAYING_PAUSED" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PLAYING-PAUSED:CAPS"/>
+ <keyword type="constant" name="FAKE_SINK_STATE_ERROR_PAUSED_READY" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PAUSED-READY:CAPS"/>
+ <keyword type="constant" name="FAKE_SINK_STATE_ERROR_READY_NULL" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-READY-NULL:CAPS"/>
<keyword type="constant" name="FAKE_SRC_DATA_ALLOCATE" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-DATA-ALLOCATE:CAPS"/>
<keyword type="constant" name="FAKE_SRC_DATA_SUBBUFFER" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-DATA-SUBBUFFER:CAPS"/>
<keyword type="constant" name="FAKE_SRC_FILLTYPE_NOTHING" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-FILLTYPE-NOTHING:CAPS"/>
@@ -203,13 +215,6 @@
<keyword type="constant" name="FAKE_SRC_SIZETYPE_EMPTY" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-SIZETYPE-EMPTY:CAPS"/>
<keyword type="constant" name="FAKE_SRC_SIZETYPE_FIXED" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-SIZETYPE-FIXED:CAPS"/>
<keyword type="constant" name="FAKE_SRC_SIZETYPE_RANDOM" link="gstreamer-plugins-fakesrc.html#FAKE-SRC-SIZETYPE-RANDOM:CAPS"/>
- <keyword type="constant" name="FAKE_SINK_STATE_ERROR_NONE" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-NONE:CAPS"/>
- <keyword type="constant" name="FAKE_SINK_STATE_ERROR_NULL_READY" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-NULL-READY:CAPS"/>
- <keyword type="constant" name="FAKE_SINK_STATE_ERROR_READY_PAUSED" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-READY-PAUSED:CAPS"/>
- <keyword type="constant" name="FAKE_SINK_STATE_ERROR_PAUSED_PLAYING" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PAUSED-PLAYING:CAPS"/>
- <keyword type="constant" name="FAKE_SINK_STATE_ERROR_PLAYING_PAUSED" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PLAYING-PAUSED:CAPS"/>
- <keyword type="constant" name="FAKE_SINK_STATE_ERROR_PAUSED_READY" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PAUSED-READY:CAPS"/>
- <keyword type="constant" name="FAKE_SINK_STATE_ERROR_READY_NULL" link="gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-READY-NULL:CAPS"/>
<keyword type="constant" name="GST_FILE_SINK_BUFFER_MODE_DEFAULT" link="gstreamer-plugins-filesink.html#GST-FILE-SINK-BUFFER-MODE-DEFAULT:CAPS"/>
<keyword type="constant" name="GST_FILE_SINK_BUFFER_MODE_FULL" link="gstreamer-plugins-filesink.html#GST-FILE-SINK-BUFFER-MODE-FULL:CAPS"/>
<keyword type="constant" name="GST_FILE_SINK_BUFFER_MODE_LINE" link="gstreamer-plugins-filesink.html#GST-FILE-SINK-BUFFER-MODE-LINE:CAPS"/>
diff --git a/docs/plugins/html/gstreamer-plugins-downloadbuffer.html b/docs/plugins/html/gstreamer-plugins-downloadbuffer.html
index b02c09d..5352151 100644
--- a/docs/plugins/html/gstreamer-plugins-downloadbuffer.html
+++ b/docs/plugins/html/gstreamer-plugins-downloadbuffer.html
@@ -7,7 +7,7 @@
<link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gstreamer Elements">
<link rel="prev" href="gstreamer-plugins-concat.html" title="concat">
-<link rel="next" href="gstreamer-plugins-fakesrc.html" title="fakesrc">
+<link rel="next" href="gstreamer-plugins-fakesink.html" title="fakesink">
<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
@@ -22,7 +22,7 @@
<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
<td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
<td><a accesskey="p" href="gstreamer-plugins-concat.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gstreamer-plugins-fakesrc.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="gstreamer-plugins-fakesink.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
</tr></table>
<div class="refentry">
<a name="gstreamer-plugins-downloadbuffer"></a><div class="titlepage"></div>
@@ -113,7 +113,7 @@
<p>With max-size-bytes and max-size-time you can configure the buffering limits.
The downloadbuffer element will try to read-ahead these amounts of data. When
the amount of read-ahead data drops below low-percent of the configured max,
-the element will start emiting BUFFERING messages until high-percent of max is
+the element will start emitting BUFFERING messages until high-percent of max is
reached again.</p>
<p>The downloadbuffer provides push and pull based scheduling on its source pad
and will efficiently seek in the upstream element when needed.</p>
diff --git a/docs/plugins/html/gstreamer-plugins-fakesink.html b/docs/plugins/html/gstreamer-plugins-fakesink.html
index 1e45086..cc01fd1 100644
--- a/docs/plugins/html/gstreamer-plugins-fakesink.html
+++ b/docs/plugins/html/gstreamer-plugins-fakesink.html
@@ -6,8 +6,8 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gstreamer Elements">
-<link rel="prev" href="gstreamer-plugins-fakesrc.html" title="fakesrc">
-<link rel="next" href="gstreamer-plugins-fdsink.html" title="fdsink">
+<link rel="prev" href="gstreamer-plugins-downloadbuffer.html" title="downloadbuffer">
+<link rel="next" href="gstreamer-plugins-fakesrc.html" title="fakesrc">
<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
@@ -22,8 +22,8 @@
</td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
<td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gstreamer-plugins-fakesrc.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gstreamer-plugins-fdsink.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="p" href="gstreamer-plugins-downloadbuffer.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gstreamer-plugins-fakesrc.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
</tr></table>
<div class="refentry">
<a name="gstreamer-plugins-fakesink"></a><div class="titlepage"></div>
@@ -142,7 +142,7 @@
<a name="gstreamer-plugins-fakesink.description"></a><h2>Description</h2>
<p>Dummy sink that swallows everything.</p>
<div class="refsect2">
-<a name="id-1.2.6.8.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.5.8.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -158,7 +158,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.6.8.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.5.8.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -184,7 +184,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.6.8.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.5.8.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -228,7 +228,7 @@
<a name="GstFakeSinkStateError"></a><h3>enum GstFakeSinkStateError</h3>
<p>Possible state change errors for the state-error property.</p>
<div class="refsect3">
-<a name="id-1.2.6.10.3.4"></a><h4>Members</h4>
+<a name="id-1.2.5.10.3.4"></a><h4>Members</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="300px" class="enum_members_name">
@@ -368,7 +368,7 @@
<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data)</pre>
<p>This signal gets emitted before unreffing the buffer.</p>
<div class="refsect3">
-<a name="id-1.2.6.12.2.5"></a><h4>Parameters</h4>
+<a name="id-1.2.5.12.2.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -411,7 +411,7 @@
<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data)</pre>
<p>This signal gets emitted before unreffing the buffer.</p>
<div class="refsect3">
-<a name="id-1.2.6.12.3.5"></a><h4>Parameters</h4>
+<a name="id-1.2.5.12.3.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
diff --git a/docs/plugins/html/gstreamer-plugins-fakesrc.html b/docs/plugins/html/gstreamer-plugins-fakesrc.html
index 2596054..46ca1fa 100644
--- a/docs/plugins/html/gstreamer-plugins-fakesrc.html
+++ b/docs/plugins/html/gstreamer-plugins-fakesrc.html
@@ -6,8 +6,8 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gstreamer Elements">
-<link rel="prev" href="gstreamer-plugins-downloadbuffer.html" title="downloadbuffer">
-<link rel="next" href="gstreamer-plugins-fakesink.html" title="fakesink">
+<link rel="prev" href="gstreamer-plugins-fakesink.html" title="fakesink">
+<link rel="next" href="gstreamer-plugins-fdsink.html" title="fdsink">
<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
@@ -22,8 +22,8 @@
</td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
<td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gstreamer-plugins-downloadbuffer.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gstreamer-plugins-fakesink.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="p" href="gstreamer-plugins-fakesink.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gstreamer-plugins-fdsink.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
</tr></table>
<div class="refentry">
<a name="gstreamer-plugins-fakesrc"></a><div class="titlepage"></div>
@@ -196,7 +196,7 @@
<p>It is mostly used as a testing element, one trivial example for testing
basic <span class="application">GStreamer</span> core functionality is:</p>
<div class="refsect2">
-<a name="id-1.2.5.8.4"></a><h3>Example launch line</h3>
+<a name="id-1.2.6.8.4"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -213,7 +213,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.5.8.5.1"></a><h3>Element Information</h3>
+<a name="id-1.2.6.8.5.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -239,7 +239,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.5.8.5.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.6.8.5.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -283,7 +283,7 @@
<a name="GstFakeSrcDataType"></a><h3>enum GstFakeSrcDataType</h3>
<p>The different ways buffers are allocated.</p>
<div class="refsect3">
-<a name="id-1.2.5.10.3.4"></a><h4>Members</h4>
+<a name="id-1.2.6.10.3.4"></a><h4>Members</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="300px" class="enum_members_name">
@@ -314,7 +314,7 @@
<a name="GstFakeSrcFillType"></a><h3>enum GstFakeSrcFillType</h3>
<p>The different ways of filling the buffers.</p>
<div class="refsect3">
-<a name="id-1.2.5.10.4.4"></a><h4>Members</h4>
+<a name="id-1.2.6.10.4.4"></a><h4>Members</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="300px" class="enum_members_name">
@@ -366,7 +366,7 @@
<a name="GstFakeSrcOutputType"></a><h3>enum GstFakeSrcOutputType</h3>
<p>The different output types. Unused currently.</p>
<div class="refsect3">
-<a name="id-1.2.5.10.5.4"></a><h4>Members</h4>
+<a name="id-1.2.6.10.5.4"></a><h4>Members</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="300px" class="enum_members_name">
@@ -439,7 +439,7 @@
<a name="GstFakeSrcSizeType"></a><h3>enum GstFakeSrcSizeType</h3>
<p>The different size of the allocated buffers.</p>
<div class="refsect3">
-<a name="id-1.2.5.10.6.4"></a><h4>Members</h4>
+<a name="id-1.2.6.10.6.4"></a><h4>Members</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="300px" class="enum_members_name">
@@ -626,7 +626,7 @@
<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data)</pre>
<p>This signal gets emitted before sending the buffer.</p>
<div class="refsect3">
-<a name="id-1.2.5.12.2.5"></a><h4>Parameters</h4>
+<a name="id-1.2.6.12.2.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
diff --git a/docs/plugins/html/gstreamer-plugins-fdsink.html b/docs/plugins/html/gstreamer-plugins-fdsink.html
index 1dff00f..b61effb 100644
--- a/docs/plugins/html/gstreamer-plugins-fdsink.html
+++ b/docs/plugins/html/gstreamer-plugins-fdsink.html
@@ -6,7 +6,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gstreamer Elements">
-<link rel="prev" href="gstreamer-plugins-fakesink.html" title="fakesink">
+<link rel="prev" href="gstreamer-plugins-fakesrc.html" title="fakesrc">
<link rel="next" href="gstreamer-plugins-fdsrc.html" title="fdsrc">
<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
@@ -22,7 +22,7 @@
</td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
<td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gstreamer-plugins-fakesink.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="gstreamer-plugins-fakesrc.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
<td><a accesskey="n" href="gstreamer-plugins-fdsrc.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
</tr></table>
<div class="refentry">
diff --git a/docs/plugins/html/gstreamer-plugins-fdsrc.html b/docs/plugins/html/gstreamer-plugins-fdsrc.html
index 64f7bab..61d4c47 100644
--- a/docs/plugins/html/gstreamer-plugins-fdsrc.html
+++ b/docs/plugins/html/gstreamer-plugins-fdsrc.html
@@ -7,7 +7,7 @@
<link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gstreamer Elements">
<link rel="prev" href="gstreamer-plugins-fdsink.html" title="fdsink">
-<link rel="next" href="gstreamer-plugins-filesrc.html" title="filesrc">
+<link rel="next" href="gstreamer-plugins-filesink.html" title="filesink">
<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
@@ -23,7 +23,7 @@
<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
<td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
<td><a accesskey="p" href="gstreamer-plugins-fdsink.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gstreamer-plugins-filesrc.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="gstreamer-plugins-filesink.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
</tr></table>
<div class="refentry">
<a name="gstreamer-plugins-fdsrc"></a><div class="titlepage"></div>
diff --git a/docs/plugins/html/gstreamer-plugins-filesink.html b/docs/plugins/html/gstreamer-plugins-filesink.html
index e35ad20..54b7218 100644
--- a/docs/plugins/html/gstreamer-plugins-filesink.html
+++ b/docs/plugins/html/gstreamer-plugins-filesink.html
@@ -6,8 +6,8 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gstreamer Elements">
-<link rel="prev" href="gstreamer-plugins-filesrc.html" title="filesrc">
-<link rel="next" href="gstreamer-plugins-funnel.html" title="funnel">
+<link rel="prev" href="gstreamer-plugins-fdsrc.html" title="fdsrc">
+<link rel="next" href="gstreamer-plugins-filesrc.html" title="filesrc">
<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
@@ -22,8 +22,8 @@
</td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
<td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gstreamer-plugins-filesrc.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gstreamer-plugins-funnel.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="p" href="gstreamer-plugins-fdsrc.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gstreamer-plugins-filesrc.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
</tr></table>
<div class="refentry">
<a name="gstreamer-plugins-filesink"></a><div class="titlepage"></div>
@@ -106,7 +106,7 @@
<a name="gstreamer-plugins-filesink.description"></a><h2>Description</h2>
<p>Write incoming data to a file in the local file system.</p>
<div class="refsect2">
-<a name="id-1.2.10.8.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.9.8.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -122,7 +122,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.10.8.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.9.8.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -148,7 +148,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.10.8.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.9.8.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -192,7 +192,7 @@
<a name="GstFileSinkBufferMode"></a><h3>enum GstFileSinkBufferMode</h3>
<p>File read buffering mode.</p>
<div class="refsect3">
-<a name="id-1.2.10.10.3.4"></a><h4>Members</h4>
+<a name="id-1.2.9.10.3.4"></a><h4>Members</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="300px" class="enum_members_name">
diff --git a/docs/plugins/html/gstreamer-plugins-filesrc.html b/docs/plugins/html/gstreamer-plugins-filesrc.html
index a4b6890..702df05 100644
--- a/docs/plugins/html/gstreamer-plugins-filesrc.html
+++ b/docs/plugins/html/gstreamer-plugins-filesrc.html
@@ -6,8 +6,8 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gstreamer Elements">
-<link rel="prev" href="gstreamer-plugins-fdsrc.html" title="fdsrc">
-<link rel="next" href="gstreamer-plugins-filesink.html" title="filesink">
+<link rel="prev" href="gstreamer-plugins-filesink.html" title="filesink">
+<link rel="next" href="gstreamer-plugins-funnel.html" title="funnel">
<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
@@ -22,8 +22,8 @@
</td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
<td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gstreamer-plugins-fdsrc.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gstreamer-plugins-filesink.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="p" href="gstreamer-plugins-filesink.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gstreamer-plugins-funnel.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
</tr></table>
<div class="refentry">
<a name="gstreamer-plugins-filesrc"></a><div class="titlepage"></div>
@@ -83,7 +83,7 @@
<a name="gstreamer-plugins-filesrc.description"></a><h2>Description</h2>
<p>Read data from a file in the local file system.</p>
<div class="refsect2">
-<a name="id-1.2.9.8.3"></a><h3>Example launch line</h3>
+<a name="id-1.2.10.8.3"></a><h3>Example launch line</h3>
<div class="informalexample">
<table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
<tbody>
@@ -99,7 +99,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.9.8.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.10.8.4.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -125,7 +125,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.9.8.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.10.8.4.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
diff --git a/docs/plugins/html/gstreamer-plugins-funnel.html b/docs/plugins/html/gstreamer-plugins-funnel.html
index 2f9da4e..7989fed 100644
--- a/docs/plugins/html/gstreamer-plugins-funnel.html
+++ b/docs/plugins/html/gstreamer-plugins-funnel.html
@@ -6,7 +6,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gstreamer Elements">
-<link rel="prev" href="gstreamer-plugins-filesink.html" title="filesink">
+<link rel="prev" href="gstreamer-plugins-filesrc.html" title="filesrc">
<link rel="next" href="gstreamer-plugins-identity.html" title="identity">
<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
@@ -21,7 +21,7 @@
</td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
<td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gstreamer-plugins-filesink.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="gstreamer-plugins-filesrc.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
<td><a accesskey="n" href="gstreamer-plugins-identity.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
</tr></table>
<div class="refentry">
diff --git a/docs/plugins/html/gstreamer-plugins-identity.html b/docs/plugins/html/gstreamer-plugins-identity.html
index cc0c202..4c625f3 100644
--- a/docs/plugins/html/gstreamer-plugins-identity.html
+++ b/docs/plugins/html/gstreamer-plugins-identity.html
@@ -104,6 +104,11 @@
<td class="property_name"><a class="link" href="gstreamer-plugins-identity.html#GstIdentity--sync" title="The “sync” property">sync</a></td>
<td class="property_flags">Read / Write</td>
</tr>
+<tr>
+<td class="property_type"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html#GstBufferFlags"><span class="type">GstBufferFlags</span></a></td>
+<td class="property_name"><a class="link" href="gstreamer-plugins-identity.html#GstIdentity--drop-buffer-flags" title="The “drop-buffer-flags” property">drop-buffer-flags</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
</tbody>
</table></div>
</div>
@@ -342,6 +347,14 @@
<p>Flags: Read / Write</p>
<p>Default value: FALSE</p>
</div>
+<hr>
+<div class="refsect2">
+<a name="GstIdentity--drop-buffer-flags"></a><h3>The <code class="literal">“drop-buffer-flags”</code> property</h3>
+<pre class="programlisting"> “drop-buffer-flags” <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html#GstBufferFlags"><span class="type">GstBufferFlags</span></a></pre>
+<p>Drop buffers with the given flags.</p>
+<p>Flags: Read / Write</p>
+<p class="since">Since: 1.8</p>
+</div>
</div>
<div class="refsect1">
<a name="gstreamer-plugins-identity.signal-details"></a><h2>Signal Details</h2>
diff --git a/docs/plugins/html/gstreamer-plugins-multiqueue.html b/docs/plugins/html/gstreamer-plugins-multiqueue.html
index 5cee73e..6959ce5 100644
--- a/docs/plugins/html/gstreamer-plugins-multiqueue.html
+++ b/docs/plugins/html/gstreamer-plugins-multiqueue.html
@@ -93,6 +93,16 @@
<td class="property_name"><a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue--use-buffering" title="The “use-buffering” property">use-buffering</a></td>
<td class="property_flags">Read / Write</td>
</tr>
+<tr>
+<td class="property_type"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a></td>
+<td class="property_name"><a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue--unlinked-cache-time" title="The “unlinked-cache-time” property">unlinked-cache-time</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gstreamer-plugins-multiqueue.html#GstMultiQueue--use-interleave" title="The “use-interleave” property">use-interleave</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
</tbody>
</table></div>
</div>
@@ -406,6 +416,22 @@
<p>Flags: Read / Write</p>
<p>Default value: FALSE</p>
</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiQueue--unlinked-cache-time"></a><h3>The <code class="literal">“unlinked-cache-time”</code> property</h3>
+<pre class="programlisting"> “unlinked-cache-time” <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a></pre>
+<p>Extra buffering in time for unlinked streams (if 'sync-by-running-time').</p>
+<p>Flags: Read / Write</p>
+<p>Default value: 250000000</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstMultiQueue--use-interleave"></a><h3>The <code class="literal">“use-interleave”</code> property</h3>
+<pre class="programlisting"> “use-interleave” <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Adjust time limits based on input interleave.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: FALSE</p>
+</div>
</div>
<div class="refsect1">
<a name="gstreamer-plugins-multiqueue.signal-details"></a><h2>Signal Details</h2>
diff --git a/docs/plugins/html/gstreamer-plugins-output-selector.html b/docs/plugins/html/gstreamer-plugins-output-selector.html
index 7e019f0..7b40b80 100644
--- a/docs/plugins/html/gstreamer-plugins-output-selector.html
+++ b/docs/plugins/html/gstreamer-plugins-output-selector.html
@@ -7,7 +7,7 @@
<link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gstreamer Elements">
<link rel="prev" href="gstreamer-plugins-multiqueue.html" title="multiqueue">
-<link rel="next" href="gstreamer-plugins-queue.html" title="queue">
+<link rel="next" href="gstreamer-plugins-queue2.html" title="queue2">
<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
@@ -22,7 +22,7 @@
<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
<td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
<td><a accesskey="p" href="gstreamer-plugins-multiqueue.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gstreamer-plugins-queue.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="gstreamer-plugins-queue2.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
</tr></table>
<div class="refentry">
<a name="gstreamer-plugins-output-selector"></a><div class="titlepage"></div>
diff --git a/docs/plugins/html/gstreamer-plugins-plugin-coreelements.html b/docs/plugins/html/gstreamer-plugins-plugin-coreelements.html
index 4760d67..d927a79 100644
--- a/docs/plugins/html/gstreamer-plugins-plugin-coreelements.html
+++ b/docs/plugins/html/gstreamer-plugins-plugin-coreelements.html
@@ -41,7 +41,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gstreamer-plugins-queue.html b/docs/plugins/html/gstreamer-plugins-queue.html
index 2536d4d..e7d80b4 100644
--- a/docs/plugins/html/gstreamer-plugins-queue.html
+++ b/docs/plugins/html/gstreamer-plugins-queue.html
@@ -6,8 +6,8 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gstreamer Elements">
-<link rel="prev" href="gstreamer-plugins-output-selector.html" title="output-selector">
-<link rel="next" href="gstreamer-plugins-queue2.html" title="queue2">
+<link rel="prev" href="gstreamer-plugins-queue2.html" title="queue2">
+<link rel="next" href="gstreamer-plugins-streamiddemux.html" title="streamiddemux">
<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
@@ -22,8 +22,8 @@
</td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
<td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gstreamer-plugins-output-selector.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gstreamer-plugins-queue2.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="p" href="gstreamer-plugins-queue2.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gstreamer-plugins-streamiddemux.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
</tr></table>
<div class="refentry">
<a name="gstreamer-plugins-queue"></a><div class="titlepage"></div>
@@ -194,7 +194,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.16.8.8.1"></a><h3>Element Information</h3>
+<a name="id-1.2.17.8.8.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -220,7 +220,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.16.8.8.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.17.8.8.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -288,7 +288,7 @@
<a name="GstQueueLeaky"></a><h3>enum GstQueueLeaky</h3>
<p>Buffer dropping scheme to avoid the queue to block when full.</p>
<div class="refsect3">
-<a name="id-1.2.16.10.3.4"></a><h4>Members</h4>
+<a name="id-1.2.17.10.3.4"></a><h4>Members</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="300px" class="enum_members_name">
@@ -441,7 +441,7 @@
size) is higher than the boundary values which can be set through the
GObject properties.</p>
<div class="refsect3">
-<a name="id-1.2.16.12.2.5"></a><h4>Parameters</h4>
+<a name="id-1.2.17.12.2.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -473,7 +473,7 @@
<p>Reports when the queue has enough data to start pushing data again on the
source pad.</p>
<div class="refsect3">
-<a name="id-1.2.16.12.3.5"></a><h4>Parameters</h4>
+<a name="id-1.2.17.12.3.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -506,7 +506,7 @@
together with the underrun signal to pause the pipeline on underrun and
wait for the queue to fill-up before resume playback.</p>
<div class="refsect3">
-<a name="id-1.2.16.12.4.5"></a><h4>Parameters</h4>
+<a name="id-1.2.17.12.4.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
@@ -540,7 +540,7 @@
size) is lower than the boundary values which can be set through the
GObject properties.</p>
<div class="refsect3">
-<a name="id-1.2.16.12.5.5"></a><h4>Parameters</h4>
+<a name="id-1.2.17.12.5.5"></a><h4>Parameters</h4>
<div class="informaltable"><table width="100%" border="0">
<colgroup>
<col width="150px" class="parameters_name">
diff --git a/docs/plugins/html/gstreamer-plugins-queue2.html b/docs/plugins/html/gstreamer-plugins-queue2.html
index 0794103..4d04018 100644
--- a/docs/plugins/html/gstreamer-plugins-queue2.html
+++ b/docs/plugins/html/gstreamer-plugins-queue2.html
@@ -6,8 +6,8 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gstreamer Elements">
-<link rel="prev" href="gstreamer-plugins-queue.html" title="queue">
-<link rel="next" href="gstreamer-plugins-streamiddemux.html" title="streamiddemux">
+<link rel="prev" href="gstreamer-plugins-output-selector.html" title="output-selector">
+<link rel="next" href="gstreamer-plugins-queue.html" title="queue">
<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
@@ -17,12 +17,13 @@
<a href="#" class="shortcut">Top</a><span id="nav_description"> <span class="dim">|</span>
<a href="#gstreamer-plugins-queue2.description" class="shortcut">Description</a></span><span id="nav_hierarchy"> <span class="dim">|</span>
<a href="#gstreamer-plugins-queue2.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties"> <span class="dim">|</span>
- <a href="#gstreamer-plugins-queue2.properties" class="shortcut">Properties</a></span>
+ <a href="#gstreamer-plugins-queue2.properties" class="shortcut">Properties</a></span><span id="nav_signals"> <span class="dim">|</span>
+ <a href="#gstreamer-plugins-queue2.signals" class="shortcut">Signals</a></span>
</td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
<td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gstreamer-plugins-queue.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gstreamer-plugins-streamiddemux.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="p" href="gstreamer-plugins-output-selector.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gstreamer-plugins-queue.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
</tr></table>
<div class="refentry">
<a name="gstreamer-plugins-queue2"></a><div class="titlepage"></div>
@@ -114,9 +115,29 @@
<td class="property_name"><a class="link" href="gstreamer-plugins-queue2.html#GstQueue2--use-rate-estimate" title="The “use-rate-estimate” property">use-rate-estimate</a></td>
<td class="property_flags">Read / Write</td>
</tr>
+<tr>
+<td class="property_type"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a></td>
+<td class="property_name"><a class="link" href="gstreamer-plugins-queue2.html#GstQueue2--avg-in-rate" title="The “avg-in-rate” property">avg-in-rate</a></td>
+<td class="property_flags">Read</td>
+</tr>
</tbody>
</table></div>
</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-queue2.signals"></a><h2>Signals</h2>
+<div class="informaltable"><table border="0">
+<colgroup>
+<col width="150px" class="signals_return">
+<col width="300px" class="signals_name">
+<col width="200px" class="signals_flags">
+</colgroup>
+<tbody><tr>
+<td class="signal_type"><span class="returnvalue">void</span></td>
+<td class="signal_name"><a class="link" href="gstreamer-plugins-queue2.html#GstQueue2-overrun" title="The “overrun” signal">overrun</a></td>
+<td class="signal_flags"><a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-FIRST:CAPS">Run First</a></td>
+</tr></tbody>
+</table></div>
+</div>
<a name="GstQueue2"></a><div class="refsect1">
<a name="gstreamer-plugins-queue2.other"></a><h2>Types and Values</h2>
<div class="informaltable"><table width="100%" border="0">
@@ -161,7 +182,7 @@
<div class="refsynopsisdiv">
<h2>Synopsis</h2>
<div class="refsect2">
-<a name="id-1.2.17.7.8.1"></a><h3>Element Information</h3>
+<a name="id-1.2.16.8.8.1"></a><h3>Element Information</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -187,7 +208,7 @@
</div>
<hr>
<div class="refsect2">
-<a name="id-1.2.17.7.8.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.16.8.8.2"></a><h3>Element Pads</h3>
<div class="variablelist"><table border="0" class="variablelist">
<colgroup>
<col align="left" valign="top">
@@ -366,6 +387,52 @@
<p>Flags: Read / Write</p>
<p>Default value: TRUE</p>
</div>
+<hr>
+<div class="refsect2">
+<a name="GstQueue2--avg-in-rate"></a><h3>The <code class="literal">“avg-in-rate”</code> property</h3>
+<pre class="programlisting"> “avg-in-rate” <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint64"><span class="type">gint64</span></a></pre>
+<p>The average input data rate.</p>
+<p>Flags: Read</p>
+<p>Allowed values: >= 0</p>
+<p>Default value: 0</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gstreamer-plugins-queue2.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstQueue2-overrun"></a><h3>The <code class="literal">“overrun”</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+user_function (<a class="link" href="gstreamer-plugins-queue2.html#GstQueue2"><span class="type">GstQueue2</span></a> *queue,
+ <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data)</pre>
+<p>Reports that the buffer became full (overrun).
+A buffer is full if the total amount of data inside it (num-buffers, time,
+size) is higher than the boundary values which can be set through the
+GObject properties.</p>
+<div class="refsect3">
+<a name="id-1.2.16.12.2.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>queue</p></td>
+<td class="parameter_description"><p>the queue2 instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>user_data</p></td>
+<td class="parameter_description"><p>user data set when the signal handler was connected.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<p>Flags: <a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-FIRST:CAPS">Run First</a></p>
+<p class="since">Since: 1.8</p>
+</div>
</div>
</div>
<div class="footer">
diff --git a/docs/plugins/html/gstreamer-plugins-streamiddemux.html b/docs/plugins/html/gstreamer-plugins-streamiddemux.html
index 4c0280e..6c67fb2 100644
--- a/docs/plugins/html/gstreamer-plugins-streamiddemux.html
+++ b/docs/plugins/html/gstreamer-plugins-streamiddemux.html
@@ -6,7 +6,7 @@
<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
<link rel="home" href="index.html" title="GStreamer Core Plugins 1.0 Plugins Reference Manual">
<link rel="up" href="ch01.html" title="gstreamer Elements">
-<link rel="prev" href="gstreamer-plugins-queue2.html" title="queue2">
+<link rel="prev" href="gstreamer-plugins-queue.html" title="queue">
<link rel="next" href="gstreamer-plugins-tee.html" title="tee">
<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
@@ -21,7 +21,7 @@
</td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
<td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gstreamer-plugins-queue2.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="gstreamer-plugins-queue.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
<td><a accesskey="n" href="gstreamer-plugins-tee.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
</tr></table>
<div class="refentry">
diff --git a/docs/plugins/html/index.html b/docs/plugins/html/index.html
index f81dfbe..6118e2f 100644
--- a/docs/plugins/html/index.html
+++ b/docs/plugins/html/index.html
@@ -15,7 +15,7 @@
<div>
<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">GStreamer Core Plugins 1.0 Plugins Reference Manual</p></th></tr></table></div>
<div><p class="releaseinfo">
- for GStreamer Core Plugins 1.0 (1.6.2)
+ for GStreamer Core Plugins 1.0 (1.7.1)
The latest version of this documentation can be found on-line at
<a class="ulink" href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-plugins/html/</a>.
</p></div>
@@ -35,10 +35,10 @@
<span class="refentrytitle"><a href="gstreamer-plugins-downloadbuffer.html">downloadbuffer</a></span><span class="refpurpose"></span>
</dt>
<dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-fakesrc.html">fakesrc</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-fakesink.html">fakesink</a></span><span class="refpurpose"></span>
</dt>
<dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-fakesink.html">fakesink</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-fakesrc.html">fakesrc</a></span><span class="refpurpose"></span>
</dt>
<dt>
<span class="refentrytitle"><a href="gstreamer-plugins-fdsink.html">fdsink</a></span><span class="refpurpose"></span>
@@ -47,10 +47,10 @@
<span class="refentrytitle"><a href="gstreamer-plugins-fdsrc.html">fdsrc</a></span><span class="refpurpose"></span>
</dt>
<dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-filesrc.html">filesrc</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-filesink.html">filesink</a></span><span class="refpurpose"></span>
</dt>
<dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-filesink.html">filesink</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-filesrc.html">filesrc</a></span><span class="refpurpose"></span>
</dt>
<dt>
<span class="refentrytitle"><a href="gstreamer-plugins-funnel.html">funnel</a></span><span class="refpurpose"></span>
@@ -68,10 +68,10 @@
<span class="refentrytitle"><a href="gstreamer-plugins-output-selector.html">output-selector</a></span><span class="refpurpose"></span>
</dt>
<dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-queue.html">queue</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-queue2.html">queue2</a></span><span class="refpurpose"></span>
</dt>
<dt>
-<span class="refentrytitle"><a href="gstreamer-plugins-queue2.html">queue2</a></span><span class="refpurpose"></span>
+<span class="refentrytitle"><a href="gstreamer-plugins-queue.html">queue</a></span><span class="refpurpose"></span>
</dt>
<dt>
<span class="refentrytitle"><a href="gstreamer-plugins-streamiddemux.html">streamiddemux</a></span><span class="refpurpose"></span>
diff --git a/docs/plugins/html/index.sgml b/docs/plugins/html/index.sgml
index 4065783..3cde052 100644
--- a/docs/plugins/html/index.sgml
+++ b/docs/plugins/html/index.sgml
@@ -44,6 +44,37 @@
<ANCHOR id="GstDownloadBuffer--temp-location" href="gstreamer-plugins-1.0/gstreamer-plugins-downloadbuffer.html#GstDownloadBuffer--temp-location">
<ANCHOR id="GstDownloadBuffer--temp-remove" href="gstreamer-plugins-1.0/gstreamer-plugins-downloadbuffer.html#GstDownloadBuffer--temp-remove">
<ANCHOR id="GstDownloadBuffer--temp-template" href="gstreamer-plugins-1.0/gstreamer-plugins-downloadbuffer.html#GstDownloadBuffer--temp-template">
+<ANCHOR id="gstreamer-plugins-fakesink" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html">
+<ANCHOR id="gstreamer-plugins-fakesink.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.properties">
+<ANCHOR id="gstreamer-plugins-fakesink.signals" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.signals">
+<ANCHOR id="GstFakeSink" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink">
+<ANCHOR id="gstreamer-plugins-fakesink.other" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.other">
+<ANCHOR id="gstreamer-plugins-fakesink.object-hierarchy" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-fakesink.description" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.description">
+<ANCHOR id="gstreamer-plugins-fakesink.functions_details" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.functions_details">
+<ANCHOR id="gstreamer-plugins-fakesink.other_details" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.other_details">
+<ANCHOR id="GstFakeSink-struct" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink-struct">
+<ANCHOR id="GstFakeSinkStateError" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSinkStateError">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-NONE:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-NONE:CAPS">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-NULL-READY:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-NULL-READY:CAPS">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-READY-PAUSED:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-READY-PAUSED:CAPS">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-PAUSED-PLAYING:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PAUSED-PLAYING:CAPS">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-PLAYING-PAUSED:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PLAYING-PAUSED:CAPS">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-PAUSED-READY:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PAUSED-READY:CAPS">
+<ANCHOR id="FAKE-SINK-STATE-ERROR-READY-NULL:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-READY-NULL:CAPS">
+<ANCHOR id="gstreamer-plugins-fakesink.property-details" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.property-details">
+<ANCHOR id="GstFakeSink--can-activate-pull" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--can-activate-pull">
+<ANCHOR id="GstFakeSink--can-activate-push" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--can-activate-push">
+<ANCHOR id="GstFakeSink--dump" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--dump">
+<ANCHOR id="GstFakeSink--last-message" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--last-message">
+<ANCHOR id="GstFakeSink--num-buffers" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--num-buffers">
+<ANCHOR id="GstFakeSink--signal-handoffs" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--signal-handoffs">
+<ANCHOR id="GstFakeSink--silent" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--silent">
+<ANCHOR id="GstFakeSink--state-error" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--state-error">
+<ANCHOR id="gstreamer-plugins-fakesink.signal-details" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.signal-details">
+<ANCHOR id="GstFakeSink-handoff" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink-handoff">
+<ANCHOR id="GstFakeSink-preroll-handoff" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink-preroll-handoff">
+<ANCHOR id="gstreamer-plugins-fakesink.see-also" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.see-also">
<ANCHOR id="gstreamer-plugins-fakesrc" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesrc.html">
<ANCHOR id="gstreamer-plugins-fakesrc.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesrc.html#gstreamer-plugins-fakesrc.properties">
<ANCHOR id="gstreamer-plugins-fakesrc.signals" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesrc.html#gstreamer-plugins-fakesrc.signals">
@@ -97,37 +128,6 @@
<ANCHOR id="gstreamer-plugins-fakesrc.signal-details" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesrc.html#gstreamer-plugins-fakesrc.signal-details">
<ANCHOR id="GstFakeSrc-handoff" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesrc.html#GstFakeSrc-handoff">
<ANCHOR id="gstreamer-plugins-fakesrc.see-also" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesrc.html#gstreamer-plugins-fakesrc.see-also">
-<ANCHOR id="gstreamer-plugins-fakesink" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html">
-<ANCHOR id="gstreamer-plugins-fakesink.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.properties">
-<ANCHOR id="gstreamer-plugins-fakesink.signals" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.signals">
-<ANCHOR id="GstFakeSink" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink">
-<ANCHOR id="gstreamer-plugins-fakesink.other" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.other">
-<ANCHOR id="gstreamer-plugins-fakesink.object-hierarchy" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.object-hierarchy">
-<ANCHOR id="gstreamer-plugins-fakesink.description" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.description">
-<ANCHOR id="gstreamer-plugins-fakesink.functions_details" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.functions_details">
-<ANCHOR id="gstreamer-plugins-fakesink.other_details" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.other_details">
-<ANCHOR id="GstFakeSink-struct" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink-struct">
-<ANCHOR id="GstFakeSinkStateError" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSinkStateError">
-<ANCHOR id="FAKE-SINK-STATE-ERROR-NONE:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-NONE:CAPS">
-<ANCHOR id="FAKE-SINK-STATE-ERROR-NULL-READY:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-NULL-READY:CAPS">
-<ANCHOR id="FAKE-SINK-STATE-ERROR-READY-PAUSED:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-READY-PAUSED:CAPS">
-<ANCHOR id="FAKE-SINK-STATE-ERROR-PAUSED-PLAYING:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PAUSED-PLAYING:CAPS">
-<ANCHOR id="FAKE-SINK-STATE-ERROR-PLAYING-PAUSED:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PLAYING-PAUSED:CAPS">
-<ANCHOR id="FAKE-SINK-STATE-ERROR-PAUSED-READY:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-PAUSED-READY:CAPS">
-<ANCHOR id="FAKE-SINK-STATE-ERROR-READY-NULL:CAPS" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#FAKE-SINK-STATE-ERROR-READY-NULL:CAPS">
-<ANCHOR id="gstreamer-plugins-fakesink.property-details" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.property-details">
-<ANCHOR id="GstFakeSink--can-activate-pull" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--can-activate-pull">
-<ANCHOR id="GstFakeSink--can-activate-push" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--can-activate-push">
-<ANCHOR id="GstFakeSink--dump" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--dump">
-<ANCHOR id="GstFakeSink--last-message" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--last-message">
-<ANCHOR id="GstFakeSink--num-buffers" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--num-buffers">
-<ANCHOR id="GstFakeSink--signal-handoffs" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--signal-handoffs">
-<ANCHOR id="GstFakeSink--silent" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--silent">
-<ANCHOR id="GstFakeSink--state-error" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink--state-error">
-<ANCHOR id="gstreamer-plugins-fakesink.signal-details" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.signal-details">
-<ANCHOR id="GstFakeSink-handoff" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink-handoff">
-<ANCHOR id="GstFakeSink-preroll-handoff" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#GstFakeSink-preroll-handoff">
-<ANCHOR id="gstreamer-plugins-fakesink.see-also" href="gstreamer-plugins-1.0/gstreamer-plugins-fakesink.html#gstreamer-plugins-fakesink.see-also">
<ANCHOR id="gstreamer-plugins-fdsink" href="gstreamer-plugins-1.0/gstreamer-plugins-fdsink.html">
<ANCHOR id="gstreamer-plugins-fdsink.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-fdsink.html#gstreamer-plugins-fdsink.properties">
<ANCHOR id="GstFdSink" href="gstreamer-plugins-1.0/gstreamer-plugins-fdsink.html#GstFdSink">
@@ -155,19 +155,6 @@
<ANCHOR id="GstFdSrc--fd" href="gstreamer-plugins-1.0/gstreamer-plugins-fdsrc.html#GstFdSrc--fd">
<ANCHOR id="GstFdSrc--timeout" href="gstreamer-plugins-1.0/gstreamer-plugins-fdsrc.html#GstFdSrc--timeout">
<ANCHOR id="gstreamer-plugins-fdsrc.see-also" href="gstreamer-plugins-1.0/gstreamer-plugins-fdsrc.html#gstreamer-plugins-fdsrc.see-also">
-<ANCHOR id="gstreamer-plugins-filesrc" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html">
-<ANCHOR id="gstreamer-plugins-filesrc.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.properties">
-<ANCHOR id="GstFileSrc" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#GstFileSrc">
-<ANCHOR id="gstreamer-plugins-filesrc.other" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.other">
-<ANCHOR id="gstreamer-plugins-filesrc.object-hierarchy" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.object-hierarchy">
-<ANCHOR id="gstreamer-plugins-filesrc.implemented-interfaces" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.implemented-interfaces">
-<ANCHOR id="gstreamer-plugins-filesrc.description" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.description">
-<ANCHOR id="gstreamer-plugins-filesrc.functions_details" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.functions_details">
-<ANCHOR id="gstreamer-plugins-filesrc.other_details" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.other_details">
-<ANCHOR id="GstFileSrc-struct" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#GstFileSrc-struct">
-<ANCHOR id="gstreamer-plugins-filesrc.property-details" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.property-details">
-<ANCHOR id="GstFileSrc--location" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#GstFileSrc--location">
-<ANCHOR id="gstreamer-plugins-filesrc.see-also" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.see-also">
<ANCHOR id="gstreamer-plugins-filesink" href="gstreamer-plugins-1.0/gstreamer-plugins-filesink.html">
<ANCHOR id="gstreamer-plugins-filesink.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-filesink.html#gstreamer-plugins-filesink.properties">
<ANCHOR id="GstFileSink" href="gstreamer-plugins-1.0/gstreamer-plugins-filesink.html#GstFileSink">
@@ -189,6 +176,19 @@
<ANCHOR id="GstFileSink--buffer-size" href="gstreamer-plugins-1.0/gstreamer-plugins-filesink.html#GstFileSink--buffer-size">
<ANCHOR id="GstFileSink--location" href="gstreamer-plugins-1.0/gstreamer-plugins-filesink.html#GstFileSink--location">
<ANCHOR id="gstreamer-plugins-filesink.see-also" href="gstreamer-plugins-1.0/gstreamer-plugins-filesink.html#gstreamer-plugins-filesink.see-also">
+<ANCHOR id="gstreamer-plugins-filesrc" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html">
+<ANCHOR id="gstreamer-plugins-filesrc.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.properties">
+<ANCHOR id="GstFileSrc" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#GstFileSrc">
+<ANCHOR id="gstreamer-plugins-filesrc.other" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.other">
+<ANCHOR id="gstreamer-plugins-filesrc.object-hierarchy" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-filesrc.implemented-interfaces" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.implemented-interfaces">
+<ANCHOR id="gstreamer-plugins-filesrc.description" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.description">
+<ANCHOR id="gstreamer-plugins-filesrc.functions_details" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.functions_details">
+<ANCHOR id="gstreamer-plugins-filesrc.other_details" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.other_details">
+<ANCHOR id="GstFileSrc-struct" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#GstFileSrc-struct">
+<ANCHOR id="gstreamer-plugins-filesrc.property-details" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.property-details">
+<ANCHOR id="GstFileSrc--location" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#GstFileSrc--location">
+<ANCHOR id="gstreamer-plugins-filesrc.see-also" href="gstreamer-plugins-1.0/gstreamer-plugins-filesrc.html#gstreamer-plugins-filesrc.see-also">
<ANCHOR id="gstreamer-plugins-funnel" href="gstreamer-plugins-1.0/gstreamer-plugins-funnel.html">
<ANCHOR id="gstreamer-plugins-funnel.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-funnel.html#gstreamer-plugins-funnel.properties">
<ANCHOR id="GstFunnel" href="gstreamer-plugins-1.0/gstreamer-plugins-funnel.html#GstFunnel">
@@ -223,6 +223,7 @@
<ANCHOR id="GstIdentity--single-segment" href="gstreamer-plugins-1.0/gstreamer-plugins-identity.html#GstIdentity--single-segment">
<ANCHOR id="GstIdentity--sleep-time" href="gstreamer-plugins-1.0/gstreamer-plugins-identity.html#GstIdentity--sleep-time">
<ANCHOR id="GstIdentity--sync" href="gstreamer-plugins-1.0/gstreamer-plugins-identity.html#GstIdentity--sync">
+<ANCHOR id="GstIdentity--drop-buffer-flags" href="gstreamer-plugins-1.0/gstreamer-plugins-identity.html#GstIdentity--drop-buffer-flags">
<ANCHOR id="gstreamer-plugins-identity.signal-details" href="gstreamer-plugins-1.0/gstreamer-plugins-identity.html#gstreamer-plugins-identity.signal-details">
<ANCHOR id="GstIdentity-handoff" href="gstreamer-plugins-1.0/gstreamer-plugins-identity.html#GstIdentity-handoff">
<ANCHOR id="gstreamer-plugins-input-selector" href="gstreamer-plugins-1.0/gstreamer-plugins-input-selector.html">
@@ -265,6 +266,8 @@
<ANCHOR id="GstMultiQueue--max-size-time" href="gstreamer-plugins-1.0/gstreamer-plugins-multiqueue.html#GstMultiQueue--max-size-time">
<ANCHOR id="GstMultiQueue--sync-by-running-time" href="gstreamer-plugins-1.0/gstreamer-plugins-multiqueue.html#GstMultiQueue--sync-by-running-time">
<ANCHOR id="GstMultiQueue--use-buffering" href="gstreamer-plugins-1.0/gstreamer-plugins-multiqueue.html#GstMultiQueue--use-buffering">
+<ANCHOR id="GstMultiQueue--unlinked-cache-time" href="gstreamer-plugins-1.0/gstreamer-plugins-multiqueue.html#GstMultiQueue--unlinked-cache-time">
+<ANCHOR id="GstMultiQueue--use-interleave" href="gstreamer-plugins-1.0/gstreamer-plugins-multiqueue.html#GstMultiQueue--use-interleave">
<ANCHOR id="gstreamer-plugins-multiqueue.signal-details" href="gstreamer-plugins-1.0/gstreamer-plugins-multiqueue.html#gstreamer-plugins-multiqueue.signal-details">
<ANCHOR id="GstMultiQueue-overrun" href="gstreamer-plugins-1.0/gstreamer-plugins-multiqueue.html#GstMultiQueue-overrun">
<ANCHOR id="GstMultiQueue-underrun" href="gstreamer-plugins-1.0/gstreamer-plugins-multiqueue.html#GstMultiQueue-underrun">
@@ -287,6 +290,34 @@
<ANCHOR id="GstOutputSelector--pad-negotiation-mode" href="gstreamer-plugins-1.0/gstreamer-plugins-output-selector.html#GstOutputSelector--pad-negotiation-mode">
<ANCHOR id="GstOutputSelector--resend-latest" href="gstreamer-plugins-1.0/gstreamer-plugins-output-selector.html#GstOutputSelector--resend-latest">
<ANCHOR id="gstreamer-plugins-output-selector.see-also" href="gstreamer-plugins-1.0/gstreamer-plugins-output-selector.html#gstreamer-plugins-output-selector.see-also">
+<ANCHOR id="gstreamer-plugins-queue2" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html">
+<ANCHOR id="gstreamer-plugins-queue2.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.properties">
+<ANCHOR id="gstreamer-plugins-queue2.signals" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.signals">
+<ANCHOR id="GstQueue2" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2">
+<ANCHOR id="gstreamer-plugins-queue2.other" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.other">
+<ANCHOR id="gstreamer-plugins-queue2.object-hierarchy" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.object-hierarchy">
+<ANCHOR id="gstreamer-plugins-queue2.description" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.description">
+<ANCHOR id="gstreamer-plugins-queue2.functions_details" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.functions_details">
+<ANCHOR id="gstreamer-plugins-queue2.other_details" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.other_details">
+<ANCHOR id="GstQueue2-struct" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2-struct">
+<ANCHOR id="gstreamer-plugins-queue2.property-details" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.property-details">
+<ANCHOR id="GstQueue2--current-level-buffers" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--current-level-buffers">
+<ANCHOR id="GstQueue2--current-level-bytes" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--current-level-bytes">
+<ANCHOR id="GstQueue2--current-level-time" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--current-level-time">
+<ANCHOR id="GstQueue2--high-percent" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--high-percent">
+<ANCHOR id="GstQueue2--low-percent" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--low-percent">
+<ANCHOR id="GstQueue2--max-size-buffers" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--max-size-buffers">
+<ANCHOR id="GstQueue2--max-size-bytes" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--max-size-bytes">
+<ANCHOR id="GstQueue2--max-size-time" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--max-size-time">
+<ANCHOR id="GstQueue2--ring-buffer-max-size" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--ring-buffer-max-size">
+<ANCHOR id="GstQueue2--temp-location" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--temp-location">
+<ANCHOR id="GstQueue2--temp-remove" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--temp-remove">
+<ANCHOR id="GstQueue2--temp-template" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--temp-template">
+<ANCHOR id="GstQueue2--use-buffering" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--use-buffering">
+<ANCHOR id="GstQueue2--use-rate-estimate" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--use-rate-estimate">
+<ANCHOR id="GstQueue2--avg-in-rate" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--avg-in-rate">
+<ANCHOR id="gstreamer-plugins-queue2.signal-details" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.signal-details">
+<ANCHOR id="GstQueue2-overrun" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2-overrun">
<ANCHOR id="gstreamer-plugins-queue" href="gstreamer-plugins-1.0/gstreamer-plugins-queue.html">
<ANCHOR id="gstreamer-plugins-queue.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-queue.html#gstreamer-plugins-queue.properties">
<ANCHOR id="gstreamer-plugins-queue.signals" href="gstreamer-plugins-1.0/gstreamer-plugins-queue.html#gstreamer-plugins-queue.signals">
@@ -319,30 +350,6 @@
<ANCHOR id="GstQueue-pushing" href="gstreamer-plugins-1.0/gstreamer-plugins-queue.html#GstQueue-pushing">
<ANCHOR id="GstQueue-running" href="gstreamer-plugins-1.0/gstreamer-plugins-queue.html#GstQueue-running">
<ANCHOR id="GstQueue-underrun" href="gstreamer-plugins-1.0/gstreamer-plugins-queue.html#GstQueue-underrun">
-<ANCHOR id="gstreamer-plugins-queue2" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html">
-<ANCHOR id="gstreamer-plugins-queue2.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.properties">
-<ANCHOR id="GstQueue2" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2">
-<ANCHOR id="gstreamer-plugins-queue2.other" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.other">
-<ANCHOR id="gstreamer-plugins-queue2.object-hierarchy" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.object-hierarchy">
-<ANCHOR id="gstreamer-plugins-queue2.description" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.description">
-<ANCHOR id="gstreamer-plugins-queue2.functions_details" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.functions_details">
-<ANCHOR id="gstreamer-plugins-queue2.other_details" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.other_details">
-<ANCHOR id="GstQueue2-struct" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2-struct">
-<ANCHOR id="gstreamer-plugins-queue2.property-details" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#gstreamer-plugins-queue2.property-details">
-<ANCHOR id="GstQueue2--current-level-buffers" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--current-level-buffers">
-<ANCHOR id="GstQueue2--current-level-bytes" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--current-level-bytes">
-<ANCHOR id="GstQueue2--current-level-time" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--current-level-time">
-<ANCHOR id="GstQueue2--high-percent" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--high-percent">
-<ANCHOR id="GstQueue2--low-percent" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--low-percent">
-<ANCHOR id="GstQueue2--max-size-buffers" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--max-size-buffers">
-<ANCHOR id="GstQueue2--max-size-bytes" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--max-size-bytes">
-<ANCHOR id="GstQueue2--max-size-time" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--max-size-time">
-<ANCHOR id="GstQueue2--ring-buffer-max-size" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--ring-buffer-max-size">
-<ANCHOR id="GstQueue2--temp-location" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--temp-location">
-<ANCHOR id="GstQueue2--temp-remove" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--temp-remove">
-<ANCHOR id="GstQueue2--temp-template" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--temp-template">
-<ANCHOR id="GstQueue2--use-buffering" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--use-buffering">
-<ANCHOR id="GstQueue2--use-rate-estimate" href="gstreamer-plugins-1.0/gstreamer-plugins-queue2.html#GstQueue2--use-rate-estimate">
<ANCHOR id="gstreamer-plugins-streamiddemux" href="gstreamer-plugins-1.0/gstreamer-plugins-streamiddemux.html">
<ANCHOR id="gstreamer-plugins-streamiddemux.properties" href="gstreamer-plugins-1.0/gstreamer-plugins-streamiddemux.html#gstreamer-plugins-streamiddemux.properties">
<ANCHOR id="GstStreamidDemux" href="gstreamer-plugins-1.0/gstreamer-plugins-streamiddemux.html#GstStreamidDemux">
diff --git a/docs/plugins/inspect/plugin-coreelements.xml b/docs/plugins/inspect/plugin-coreelements.xml
index 87d9f47..821a7b5 100644
--- a/docs/plugins/inspect/plugin-coreelements.xml
+++ b/docs/plugins/inspect/plugin-coreelements.xml
@@ -3,7 +3,7 @@
<description>GStreamer core elements</description>
<filename>../../plugins/elements/.libs/libgstcoreelements.so</filename>
<basename>libgstcoreelements.so</basename>
- <version>1.6.2</version>
+ <version>1.7.1</version>
<license>LGPL</license>
<source>gstreamer</source>
<package>GStreamer source release</package>
diff --git a/docs/plugins/inspect/plugin-coretracers.xml b/docs/plugins/inspect/plugin-coretracers.xml
new file mode 100644
index 0000000..0b4b05d
--- /dev/null
+++ b/docs/plugins/inspect/plugin-coretracers.xml
@@ -0,0 +1,13 @@
+<plugin>
+ <name>coretracers</name>
+ <description>GStreamer core tracers</description>
+ <filename>../../plugins/tracers/.libs/libgstcoretracers.so</filename>
+ <basename>libgstcoretracers.so</basename>
+ <version>1.7.1</version>
+ <license>LGPL</license>
+ <source>gstreamer</source>
+ <package>GStreamer source release</package>
+ <origin>Unknown package origin</origin>
+ <elements>
+ </elements>
+</plugin>
\ No newline at end of file
diff --git a/docs/pwg/Makefile.in b/docs/pwg/Makefile.in
index cc71bab..779acb9 100644
--- a/docs/pwg/Makefile.in
+++ b/docs/pwg/Makefile.in
@@ -327,6 +327,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/docs/pwg/building-boiler.xml b/docs/pwg/building-boiler.xml
index fd171ad..5d78123 100644
--- a/docs/pwg/building-boiler.xml
+++ b/docs/pwg/building-boiler.xml
@@ -73,7 +73,7 @@
and fill in some structures. As mentioned in the previous section, the
easiest way to do this is to copy a template and add functionality
according to your needs. To help you do so, there is a tool in the
- <filename class="directory">./gst-plugins/tools/</filename> directory.
+ <filename class="directory">./gst-plugin/tools/</filename> directory.
This tool, <filename>make_element</filename>, is a command line utility
that creates the boilerplate code for you.
</para>
diff --git a/docs/slides/Makefile.in b/docs/slides/Makefile.in
index c8f61b6..c4ccd26 100644
--- a/docs/slides/Makefile.in
+++ b/docs/slides/Makefile.in
@@ -273,6 +273,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/docs/xsl/Makefile.in b/docs/xsl/Makefile.in
index ca505c0..c89cbe3 100644
--- a/docs/xsl/Makefile.in
+++ b/docs/xsl/Makefile.in
@@ -273,6 +273,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/gst/Makefile.am b/gst/Makefile.am
index 213e3fd..dda710f 100644
--- a/gst/Makefile.am
+++ b/gst/Makefile.am
@@ -115,6 +115,9 @@
gsttoc.c \
gsttocsetter.c \
$(GST_TRACE_SRC) \
+ gsttracer.c \
+ gsttracerfactory.c \
+ gsttracerutils.c \
gsttypefind.c \
gsttypefindfactory.c \
gsturi.c \
@@ -218,6 +221,9 @@
gsttaskpool.h \
gsttoc.h \
gsttocsetter.h \
+ gsttracer.h \
+ gsttracerfactory.h \
+ gsttracerutils.h \
gsttypefind.h \
gsttypefindfactory.h \
gsturi.h \
diff --git a/gst/Makefile.in b/gst/Makefile.in
index 8eebf5d..2b57749 100644
--- a/gst/Makefile.in
+++ b/gst/Makefile.in
@@ -195,7 +195,8 @@
gstprotection.c gstquark.c gstquery.c gstregistry.c \
gstregistrychunks.c gstsample.c gstsegment.c gststructure.c \
gstsystemclock.c gsttaglist.c gsttagsetter.c gsttask.c \
- gsttaskpool.c gsttoc.c gsttocsetter.c gsttrace.c gsttypefind.c \
+ gsttaskpool.c gsttoc.c gsttocsetter.c gsttrace.c gsttracer.c \
+ gsttracerfactory.c gsttracerutils.c gsttypefind.c \
gsttypefindfactory.c gsturi.c gstutils.c gstvalue.c gstparse.c \
gstregistrybinary.c
@GST_DISABLE_TRACE_FALSE@am__objects_1 = libgstreamer_@GST_API_VERSION@_la-gsttrace.lo
@@ -261,6 +262,9 @@
libgstreamer_@GST_API_VERSION@_la-gsttoc.lo \
libgstreamer_@GST_API_VERSION@_la-gsttocsetter.lo \
$(am__objects_1) \
+ libgstreamer_@GST_API_VERSION@_la-gsttracer.lo \
+ libgstreamer_@GST_API_VERSION@_la-gsttracerfactory.lo \
+ libgstreamer_@GST_API_VERSION@_la-gsttracerutils.lo \
libgstreamer_@GST_API_VERSION@_la-gsttypefind.lo \
libgstreamer_@GST_API_VERSION@_la-gsttypefindfactory.lo \
libgstreamer_@GST_API_VERSION@_la-gsturi.lo \
@@ -510,6 +514,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
@@ -772,6 +778,9 @@
gsttoc.c \
gsttocsetter.c \
$(GST_TRACE_SRC) \
+ gsttracer.c \
+ gsttracerfactory.c \
+ gsttracerutils.c \
gsttypefind.c \
gsttypefindfactory.c \
gsturi.c \
@@ -877,6 +886,9 @@
gsttaskpool.h \
gsttoc.h \
gsttocsetter.h \
+ gsttracer.h \
+ gsttracerfactory.h \
+ gsttracerutils.h \
gsttypefind.h \
gsttypefindfactory.h \
gsturi.h \
@@ -1067,6 +1079,9 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttoc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttocsetter.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttrace.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracerfactory.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracerutils.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttypefind.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttypefindfactory.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsturi.Plo@am__quote@
@@ -1517,6 +1532,27 @@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreamer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_API_VERSION@_la-gsttrace.lo `test -f 'gsttrace.c' || echo '$(srcdir)/'`gsttrace.c
+libgstreamer_@GST_API_VERSION@_la-gsttracer.lo: gsttracer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreamer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_API_VERSION@_la-gsttracer.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracer.Tpo -c -o libgstreamer_@GST_API_VERSION@_la-gsttracer.lo `test -f 'gsttracer.c' || echo '$(srcdir)/'`gsttracer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracer.Tpo $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracer.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsttracer.c' object='libgstreamer_@GST_API_VERSION@_la-gsttracer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreamer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_API_VERSION@_la-gsttracer.lo `test -f 'gsttracer.c' || echo '$(srcdir)/'`gsttracer.c
+
+libgstreamer_@GST_API_VERSION@_la-gsttracerfactory.lo: gsttracerfactory.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreamer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_API_VERSION@_la-gsttracerfactory.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracerfactory.Tpo -c -o libgstreamer_@GST_API_VERSION@_la-gsttracerfactory.lo `test -f 'gsttracerfactory.c' || echo '$(srcdir)/'`gsttracerfactory.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracerfactory.Tpo $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracerfactory.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsttracerfactory.c' object='libgstreamer_@GST_API_VERSION@_la-gsttracerfactory.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreamer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_API_VERSION@_la-gsttracerfactory.lo `test -f 'gsttracerfactory.c' || echo '$(srcdir)/'`gsttracerfactory.c
+
+libgstreamer_@GST_API_VERSION@_la-gsttracerutils.lo: gsttracerutils.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreamer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_API_VERSION@_la-gsttracerutils.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracerutils.Tpo -c -o libgstreamer_@GST_API_VERSION@_la-gsttracerutils.lo `test -f 'gsttracerutils.c' || echo '$(srcdir)/'`gsttracerutils.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracerutils.Tpo $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttracerutils.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsttracerutils.c' object='libgstreamer_@GST_API_VERSION@_la-gsttracerutils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreamer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstreamer_@GST_API_VERSION@_la-gsttracerutils.lo `test -f 'gsttracerutils.c' || echo '$(srcdir)/'`gsttracerutils.c
+
libgstreamer_@GST_API_VERSION@_la-gsttypefind.lo: gsttypefind.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstreamer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstreamer_@GST_API_VERSION@_la-gsttypefind.lo -MD -MP -MF $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttypefind.Tpo -c -o libgstreamer_@GST_API_VERSION@_la-gsttypefind.lo `test -f 'gsttypefind.c' || echo '$(srcdir)/'`gsttypefind.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttypefind.Tpo $(DEPDIR)/libgstreamer_@GST_API_VERSION@_la-gsttypefind.Plo
diff --git a/gst/gst.c b/gst/gst.c
index fcd966c..29d737e 100644
--- a/gst/gst.c
+++ b/gst/gst.c
@@ -475,10 +475,6 @@
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 ();
priv_gst_dump_dot_dir = g_getenv ("GST_DEBUG_DUMP_DOT_DIR");
@@ -591,6 +587,7 @@
g_type_class_ref (gst_pad_get_type ());
g_type_class_ref (gst_element_factory_get_type ());
g_type_class_ref (gst_element_get_type ());
+ g_type_class_ref (gst_tracer_factory_get_type ());
g_type_class_ref (gst_type_find_factory_get_type ());
g_type_class_ref (gst_bin_get_type ());
g_type_class_ref (gst_bus_get_type ());
@@ -722,6 +719,10 @@
GLIB_MINOR_VERSION, GLIB_MICRO_VERSION);
GST_INFO ("initialized GStreamer successfully");
+#ifndef GST_DISABLE_GST_DEBUG
+ _priv_gst_tracing_init ();
+#endif
+
return TRUE;
}
@@ -955,6 +956,9 @@
GST_DEBUG ("already deinitialized");
return;
}
+#ifndef GST_DISABLE_GST_DEBUG
+ _priv_gst_tracing_deinit ();
+#endif
g_thread_pool_set_max_unused_threads (0);
bin_class = GST_BIN_CLASS (g_type_class_peek (gst_bin_get_type ()));
@@ -988,6 +992,7 @@
g_type_class_unref (g_type_class_peek (gst_pad_get_type ()));
g_type_class_unref (g_type_class_peek (gst_element_factory_get_type ()));
g_type_class_unref (g_type_class_peek (gst_element_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_tracer_factory_get_type ()));
g_type_class_unref (g_type_class_peek (gst_type_find_factory_get_type ()));
g_type_class_unref (g_type_class_peek (gst_bin_get_type ()));
g_type_class_unref (g_type_class_peek (gst_bus_get_type ()));
diff --git a/gst/gst.h b/gst/gst.h
index 8ebd76c..a9c7dc4 100644
--- a/gst/gst.h
+++ b/gst/gst.h
@@ -77,6 +77,7 @@
#include <gst/gsttaskpool.h>
#include <gst/gsttoc.h>
#include <gst/gsttocsetter.h>
+#include <gst/gsttracerfactory.h>
#include <gst/gsttypefind.h>
#include <gst/gsttypefindfactory.h>
#include <gst/gsturi.h>
diff --git a/gst/gst_private.h b/gst/gst_private.h
index 6de9013..384dc7b 100644
--- a/gst/gst_private.h
+++ b/gst/gst_private.h
@@ -62,6 +62,8 @@
#include "gstdatetime.h"
+#include "gsttracerutils.h"
+
G_BEGIN_DECLS
/* used by gstparse.c and grammar.y */
@@ -393,6 +395,27 @@
gpointer _gst_reserved[GST_PADDING];
};
+struct _GstTracerFactory {
+ GstPluginFeature feature;
+ /* <private> */
+
+ GType type;
+
+ /*
+ gpointer user_data;
+ GDestroyNotify user_data_notify;
+ */
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstTracerFactoryClass {
+ GstPluginFeatureClass parent;
+ /* <private> */
+
+ gpointer _gst_reserved[GST_PADDING];
+};
+
struct _GstElementFactory {
GstPluginFeature parent;
diff --git a/gst/gstallocator.h b/gst/gstallocator.h
index f0e84d8..8293620 100644
--- a/gst/gstallocator.h
+++ b/gst/gstallocator.h
@@ -170,6 +170,10 @@
gsize offset, gsize size, gpointer user_data,
GDestroyNotify notify);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstAllocationParams, gst_allocation_params_free)
+#endif
+
G_END_DECLS
#endif /* __GST_ALLOCATOR_H__ */
diff --git a/gst/gstatomicqueue.h b/gst/gstatomicqueue.h
index 3f674c3..a46e6ec 100644
--- a/gst/gstatomicqueue.h
+++ b/gst/gstatomicqueue.h
@@ -53,6 +53,10 @@
guint gst_atomic_queue_length (GstAtomicQueue * queue);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstAtomicQueue, gst_atomic_queue_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_ATOMIC_QUEUE_H__ */
diff --git a/gst/gstbin.c b/gst/gstbin.c
index 87eac49..4fb1cd9 100644
--- a/gst/gstbin.c
+++ b/gst/gstbin.c
@@ -197,8 +197,6 @@
gboolean posted_eos;
gboolean posted_playing;
-
- GList *contexts;
};
typedef struct
@@ -228,6 +226,9 @@
static gboolean gst_bin_add_func (GstBin * bin, GstElement * element);
static gboolean gst_bin_remove_func (GstBin * bin, GstElement * element);
+static void gst_bin_update_context (GstBin * bin, GstContext * context);
+static void gst_bin_update_context_unlocked (GstBin * bin,
+ GstContext * context);
#if 0
static void gst_bin_set_index_func (GstElement * element, GstIndex * index);
@@ -530,8 +531,6 @@
GST_STR_NULL (GST_OBJECT_NAME (object)));
}
- g_list_free_full (bin->priv->contexts, (GDestroyNotify) gst_context_unref);
-
G_OBJECT_CLASS (parent_class)->dispose (object);
}
@@ -1096,7 +1095,7 @@
gboolean is_sink, is_source, provides_clock, requires_clock;
GstMessage *clock_message = NULL, *async_message = NULL;
GstStateChangeReturn ret;
- GList *l;
+ GList *l, *elem_contexts, *need_context_messages;
GST_DEBUG_OBJECT (bin, "element :%s", GST_ELEMENT_NAME (element));
@@ -1168,9 +1167,36 @@
* a new clock will be selected */
gst_element_set_clock (element, GST_ELEMENT_CLOCK (bin));
- for (l = bin->priv->contexts; l; l = l->next)
+ /* get the element's list of contexts before propagating our own */
+ elem_contexts = gst_element_get_contexts (element);
+ for (l = GST_ELEMENT_CAST (bin)->contexts; l; l = l->next)
gst_element_set_context (element, l->data);
+ need_context_messages = NULL;
+ for (l = elem_contexts; l; l = l->next) {
+ GstContext *replacement, *context = l->data;
+ const gchar *context_type;
+
+ context_type = gst_context_get_context_type (context);
+
+ /* we already set this context above? */
+ replacement =
+ gst_element_get_context_unlocked (GST_ELEMENT (bin), context_type);
+ if (replacement) {
+ gst_context_unref (replacement);
+ } else {
+ GstMessage *msg;
+ GstStructure *s;
+
+ /* ask our parent for the context */
+ msg = gst_message_new_need_context (GST_OBJECT_CAST (bin), context_type);
+ s = (GstStructure *) gst_message_get_structure (msg);
+ gst_structure_set (s, "bin.old.context", GST_TYPE_CONTEXT, context, NULL);
+
+ need_context_messages = g_list_prepend (need_context_messages, msg);
+ }
+ }
+
#if 0
/* set the cached index on the children */
if (bin->priv->index)
@@ -1209,6 +1235,49 @@
no_state_recalc:
GST_OBJECT_UNLOCK (bin);
+ for (l = need_context_messages; l; l = l->next) {
+ GstMessage *msg = l->data;
+ GstStructure *s;
+ const gchar *context_type;
+ GstContext *replacement, *context;
+
+ gst_message_parse_context_type (msg, &context_type);
+
+ GST_LOG_OBJECT (bin, "asking parent for context type: %s "
+ "from %" GST_PTR_FORMAT, context_type, element);
+
+ s = (GstStructure *) gst_message_get_structure (msg);
+ gst_structure_get (s, "bin.old.context", GST_TYPE_CONTEXT, &context, NULL);
+ gst_structure_remove_field (s, "bin.old.context");
+ gst_element_post_message (GST_ELEMENT_CAST (bin), msg);
+
+ /* lock to avoid losing a potential write */
+ GST_OBJECT_LOCK (bin);
+ replacement =
+ gst_element_get_context_unlocked (GST_ELEMENT_CAST (bin), context_type);
+
+ if (replacement) {
+ /* we got the context set from GstElement::set_context */
+ gst_context_unref (replacement);
+ GST_OBJECT_UNLOCK (bin);
+ } else {
+ /* Propagate the element's context upwards */
+ GST_LOG_OBJECT (bin, "propagating existing context type: %s %p "
+ "from %" GST_PTR_FORMAT, context_type, context, element);
+
+ gst_bin_update_context_unlocked (bin, context);
+
+ msg =
+ gst_message_new_have_context (GST_OBJECT_CAST (bin),
+ gst_context_ref (context));
+ GST_OBJECT_UNLOCK (bin);
+ gst_element_post_message (GST_ELEMENT_CAST (bin), msg);
+ }
+ gst_context_unref (context);
+ }
+ g_list_free_full (elem_contexts, (GDestroyNotify) gst_context_unref);
+ g_list_free (need_context_messages);
+
/* post the messages on the bus of the element so that the bin can handle
* them */
if (clock_message)
@@ -1301,7 +1370,9 @@
GST_STR_NULL (GST_ELEMENT_NAME (element)),
GST_STR_NULL (GST_ELEMENT_NAME (bin)));
+ GST_TRACER_BIN_ADD_PRE (bin, element);
result = bclass->add_element (bin, element);
+ GST_TRACER_BIN_ADD_POST (bin, element, result);
return result;
@@ -1625,7 +1696,9 @@
GST_CAT_DEBUG (GST_CAT_PARENTAGE, "removing element %s from bin %s",
GST_ELEMENT_NAME (element), GST_ELEMENT_NAME (bin));
+ GST_TRACER_BIN_REMOVE_PRE (bin, element);
result = bclass->remove_element (bin, element);
+ GST_TRACER_BIN_REMOVE_POST (bin, result);
return result;
@@ -2595,14 +2668,18 @@
switch (next) {
case GST_STATE_PLAYING:
{
- gboolean toplevel;
+ gboolean toplevel, asynchandling;
GST_OBJECT_LOCK (bin);
toplevel = BIN_IS_TOPLEVEL (bin);
+ asynchandling = bin->priv->asynchandling;
GST_OBJECT_UNLOCK (bin);
if (toplevel)
gst_bin_recalculate_latency (bin);
+ if (asynchandling)
+ gst_element_post_message (element,
+ gst_message_new_latency (GST_OBJECT_CAST (element)));
break;
}
case GST_STATE_PAUSED:
@@ -2636,28 +2713,8 @@
bin_remove_messages (bin, NULL, GST_MESSAGE_ANY);
GST_OBJECT_UNLOCK (bin);
if (current == GST_STATE_READY) {
- GList *l;
-
if (!(gst_bin_src_pads_activate (bin, FALSE)))
goto activate_failure;
-
- /* Remove all non-persistent contexts */
- GST_OBJECT_LOCK (bin);
- for (l = bin->priv->contexts; l;) {
- GstContext *context = l->data;
-
- if (!gst_context_is_persistent (context)) {
- GList *next;
-
- gst_context_unref (context);
- next = l->next;
- bin->priv->contexts = g_list_delete_link (bin->priv->contexts, l);
- l = next;
- } else {
- l = l->next;
- }
- }
- GST_OBJECT_UNLOCK (bin);
}
break;
default:
@@ -3366,12 +3423,23 @@
static void
gst_bin_update_context (GstBin * bin, GstContext * context)
{
- GList *l;
- const gchar *context_type;
-
GST_OBJECT_LOCK (bin);
+ gst_bin_update_context_unlocked (bin, context);
+ GST_OBJECT_UNLOCK (bin);
+}
+
+static void
+gst_bin_update_context_unlocked (GstBin * bin, GstContext * context)
+{
+ const gchar *context_type;
+ GList *l, **contexts;
+
+ contexts = &GST_ELEMENT_CAST (bin)->contexts;
context_type = gst_context_get_context_type (context);
- for (l = bin->priv->contexts; l; l = l->next) {
+
+ GST_DEBUG_OBJECT (bin, "set context %p %" GST_PTR_FORMAT, context,
+ gst_context_get_structure (context));
+ for (l = *contexts; l; l = l->next) {
GstContext *tmp = l->data;
const gchar *tmp_type = gst_context_get_context_type (tmp);
@@ -3385,10 +3453,9 @@
}
}
/* Not found? Add */
- if (l == NULL)
- bin->priv->contexts =
- g_list_prepend (bin->priv->contexts, gst_context_ref (context));
- GST_OBJECT_UNLOCK (bin);
+ if (l == NULL) {
+ *contexts = g_list_prepend (*contexts, gst_context_ref (context));
+ }
}
/* handle child messages:
@@ -3751,11 +3818,13 @@
}
case GST_MESSAGE_NEED_CONTEXT:{
const gchar *context_type;
- GList *l;
+ GList *l, *contexts;
gst_message_parse_context_type (message, &context_type);
GST_OBJECT_LOCK (bin);
- for (l = bin->priv->contexts; l; l = l->next) {
+ contexts = GST_ELEMENT_CAST (bin)->contexts;
+ GST_LOG_OBJECT (bin, "got need-context message type: %s", context_type);
+ for (l = contexts; l; l = l->next) {
GstContext *tmp = l->data;
const gchar *tmp_type = gst_context_get_context_type (tmp);
@@ -4149,7 +4218,7 @@
bin = GST_BIN (element);
- gst_bin_update_context (bin, context);
+ GST_ELEMENT_CLASS (parent_class)->set_context (element, context);
children = gst_bin_iterate_elements (bin);
while (gst_iterator_foreach (children, set_context,
diff --git a/gst/gstbin.h b/gst/gstbin.h
index 33c8d98..c8ffeff 100644
--- a/gst/gstbin.h
+++ b/gst/gstbin.h
@@ -198,6 +198,10 @@
gboolean gst_bin_recalculate_latency (GstBin * bin);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBin, gst_object_unref)
+#endif
+
G_END_DECLS
diff --git a/gst/gstbuffer.h b/gst/gstbuffer.h
index 20154aa..f52fe91 100644
--- a/gst/gstbuffer.h
+++ b/gst/gstbuffer.h
@@ -94,6 +94,14 @@
*/
#define GST_BUFFER_DTS(buf) (GST_BUFFER_CAST(buf)->dts)
/**
+ * GST_BUFFER_DTS_OR_PTS:
+ * @buf: a #GstBuffer.:
+ *
+ * Returns the buffer decoding timestamp (dts) if valid, else the buffer
+ * presentation time (pts)
+ */
+#define GST_BUFFER_DTS_OR_PTS(buf) (GST_BUFFER_DTS_IS_VALID(buf) ? GST_BUFFER_DTS(buf) : GST_BUFFER_PTS (buf))
+/**
* GST_BUFFER_DURATION:
* @buf: a #GstBuffer.
*
@@ -337,10 +345,6 @@
*
* Returns: (transfer full): @buf
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstBuffer * gst_buffer_ref (GstBuffer * buf);
-#endif
-
static inline GstBuffer *
gst_buffer_ref (GstBuffer * buf)
{
@@ -354,10 +358,6 @@
* Decreases the refcount of the buffer. If the refcount reaches 0, the buffer
* with the associated metadata and memory will be freed.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_buffer_unref (GstBuffer * buf);
-#endif
-
static inline void
gst_buffer_unref (GstBuffer * buf)
{
@@ -377,10 +377,6 @@
*
* Returns: (transfer full): a new copy of @buf.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstBuffer * gst_buffer_copy (const GstBuffer * buf);
-#endif
-
static inline GstBuffer *
gst_buffer_copy (const GstBuffer * buf)
{
@@ -454,9 +450,24 @@
* gst_buffer_make_writable:
* @buf: (transfer full): a #GstBuffer
*
- * Makes a writable buffer from the given buffer. If the source buffer is
- * already writable, this will simply return the same buffer. A copy will
- * otherwise be made using gst_buffer_copy().
+ * Returns a writable copy of @buf. If the source buffer is
+ * already writable, this will simply return the same buffer.
+ *
+ * Use this function to ensure that a buffer can be safely modified before
+ * making changes to it, including changing the metadata such as PTS/DTS.
+ *
+ * If the reference count of the source buffer @buf is exactly one, the caller
+ * is the sole owner and this function will return the buffer object unchanged.
+ *
+ * If there is more than one reference on the object, a copy will be made using
+ * gst_buffer_copy(). The passed-in @buf will be unreffed in that case, and the
+ * caller will now own a reference to the new returned buffer object. Note
+ * that this just copies the buffer structure itself, the underlying memory is
+ * not copied if it can be shared amongst multiple buffers.
+ *
+ * In short, this function unrefs the buf in the argument and refs the buffer
+ * that it returns. Don't access the argument after calling this function unless
+ * you have an additional reference to it.
*
* Returns: (transfer full): a writable buffer which may or may not be the
* same as @buf
@@ -479,10 +490,6 @@
*
* Returns: %TRUE when @obuf was different from @nbuf.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gboolean gst_buffer_replace (GstBuffer **obuf, GstBuffer *nbuf);
-#endif
-
static inline gboolean
gst_buffer_replace (GstBuffer **obuf, GstBuffer *nbuf)
{
@@ -607,6 +614,14 @@
GstParentBufferMeta *gst_buffer_add_parent_buffer_meta (GstBuffer *buffer,
GstBuffer *ref);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBuffer, gst_buffer_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBufferPool, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_BUFFER_H__ */
diff --git a/gst/gstbufferlist.h b/gst/gstbufferlist.h
index 96ea727..0d3315b 100644
--- a/gst/gstbufferlist.h
+++ b/gst/gstbufferlist.h
@@ -73,10 +73,6 @@
*
* Returns: (transfer full): @list
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstBufferList * gst_buffer_list_ref (GstBufferList * list);
-#endif
-
static inline GstBufferList *
gst_buffer_list_ref (GstBufferList * list)
{
@@ -91,10 +87,6 @@
* Decreases the refcount of the buffer list. If the refcount reaches 0, the
* buffer list will be freed.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_buffer_list_unref (GstBufferList * list);
-#endif
-
static inline void
gst_buffer_list_unref (GstBufferList * list)
{
@@ -112,10 +104,6 @@
*
* Returns: (transfer full): a new copy of @list.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstBufferList * gst_buffer_list_copy (const GstBufferList * list);
-#endif
-
static inline GstBufferList *
gst_buffer_list_copy (const GstBufferList * list)
{
@@ -162,6 +150,10 @@
#define gst_buffer_list_add(l,b) gst_buffer_list_insert((l),-1,(b));
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBufferList, gst_buffer_list_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_BUFFER_LIST_H__ */
diff --git a/gst/gstbus.h b/gst/gstbus.h
index d369682..ed49b2e 100644
--- a/gst/gstbus.h
+++ b/gst/gstbus.h
@@ -179,6 +179,10 @@
void gst_bus_enable_sync_message_emission (GstBus * bus);
void gst_bus_disable_sync_message_emission (GstBus * bus);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBus, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_BUS_H__ */
diff --git a/gst/gstcaps.c b/gst/gstcaps.c
index a8722da..d97bd34 100644
--- a/gst/gstcaps.c
+++ b/gst/gstcaps.c
@@ -951,6 +951,10 @@
* Discard all but the first structure from @caps. Useful when
* fixating.
*
+ * This function takes ownership of @caps and will call gst_caps_make_writable()
+ * on it if necessary, so you must not use @caps afterwards unless you keep an
+ * additional reference to it with gst_caps_ref().
+ *
* Returns: (transfer full): truncated caps
*/
GstCaps *
@@ -1886,7 +1890,9 @@
* @caps, but contains no lists. Each list is expanded into separate
* @GstStructures.
*
- * This function takes ownership of @caps.
+ * This function takes ownership of @caps and will call gst_caps_make_writable()
+ * on it so you must not use @caps afterwards unless you keep an additional
+ * reference to it with gst_caps_ref().
*
* Returns: (transfer full): the normalized #GstCaps
*/
@@ -2043,6 +2049,10 @@
* identical are merged. Component structures that have values that can be
* merged are also merged.
*
+ * This function takes ownership of @caps and will call gst_caps_make_writable()
+ * on it if necessary, so you must not use @caps afterwards unless you keep an
+ * additional reference to it with gst_caps_ref().
+ *
* This method does not preserve the original order of @caps.
*
* Returns: The simplified caps.
@@ -2113,6 +2123,10 @@
* values. First the caps will be truncated and then the first structure will be
* fixated with gst_structure_fixate().
*
+ * This function takes ownership of @caps and will call gst_caps_make_writable()
+ * on it so you must not use @caps afterwards unless you keep an additional
+ * reference to it with gst_caps_ref().
+ *
* Returns: (transfer full): the fixated caps
*/
GstCaps *
diff --git a/gst/gstcaps.h b/gst/gstcaps.h
index 5cd1b78..b9d00dd 100644
--- a/gst/gstcaps.h
+++ b/gst/gstcaps.h
@@ -203,10 +203,6 @@
*
* Returns: the same #GstCaps object.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstCaps * gst_caps_ref (GstCaps * caps);
-#endif
-
static inline GstCaps *
gst_caps_ref (GstCaps * caps)
{
@@ -220,10 +216,6 @@
* Unref a #GstCaps and and free all its structures and the
* structures' values when the refcount reaches 0.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_caps_unref (GstCaps * caps);
-#endif
-
static inline void
gst_caps_unref (GstCaps * caps)
{
@@ -246,10 +238,6 @@
*
* Returns: the new #GstCaps
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstCaps * gst_caps_copy (const GstCaps * caps);
-#endif
-
static inline GstCaps *
gst_caps_copy (const GstCaps * caps)
{
@@ -302,10 +290,6 @@
*
* Returns: %TRUE if @new_caps was different from @old_caps
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gboolean gst_caps_replace (GstCaps **old_caps, GstCaps *new_caps);
-#endif
-
static inline gboolean
gst_caps_replace (GstCaps **old_caps, GstCaps *new_caps)
{
@@ -325,10 +309,6 @@
*
* Returns: %TRUE if @new_caps was different from @old_caps
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gboolean gst_caps_take (GstCaps **old_caps, GstCaps *new_caps);
-#endif
-
static inline gboolean
gst_caps_take (GstCaps **old_caps, GstCaps *new_caps)
{
@@ -521,6 +501,10 @@
gchar * gst_caps_to_string (const GstCaps *caps) G_GNUC_MALLOC;
GstCaps * gst_caps_from_string (const gchar *string) G_GNUC_WARN_UNUSED_RESULT;
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstCaps, gst_caps_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_CAPS_H__ */
diff --git a/gst/gstcapsfeatures.h b/gst/gstcapsfeatures.h
index 618e43f..ba1e5c5 100644
--- a/gst/gstcapsfeatures.h
+++ b/gst/gstcapsfeatures.h
@@ -79,6 +79,10 @@
void gst_caps_features_remove (GstCapsFeatures * features, const gchar * feature);
void gst_caps_features_remove_id (GstCapsFeatures * features, GQuark feature);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstCapsFeatures, gst_caps_features_free)
+#endif
+
G_END_DECLS
#endif /* __GST_CAPS_FEATURES_H__ */
diff --git a/gst/gstclock.h b/gst/gstclock.h
index cb82831..9c2f888 100644
--- a/gst/gstclock.h
+++ b/gst/gstclock.h
@@ -266,8 +266,16 @@
*
* Since: 1.6
*/
-#define GST_STIME_ARGS(t) \
- ((t) >= 0) ? ' ' : '-', GST_TIME_ARGS (ABS (t))
+#define GST_STIME_ARGS(t) \
+ ((t) == GST_CLOCK_STIME_NONE || (t) >= 0) ? '+' : '-', \
+ GST_CLOCK_STIME_IS_VALID (t) ? \
+ (guint) (((GstClockTime)(ABS(t))) / (GST_SECOND * 60 * 60)) : 99, \
+ GST_CLOCK_STIME_IS_VALID (t) ? \
+ (guint) ((((GstClockTime)(ABS(t))) / (GST_SECOND * 60)) % 60) : 99, \
+ GST_CLOCK_STIME_IS_VALID (t) ? \
+ (guint) ((((GstClockTime)(ABS(t))) / GST_SECOND) % 60) : 99, \
+ GST_CLOCK_STIME_IS_VALID (t) ? \
+ (guint) (((GstClockTime)(ABS(t))) % GST_SECOND) : 999999999
typedef struct _GstClockEntry GstClockEntry;
typedef struct _GstClock GstClock;
@@ -567,6 +575,10 @@
GstClockTime start_time,
GstClockTime interval);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstClock, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_CLOCK_H__ */
diff --git a/gst/gstcontext.c b/gst/gstcontext.c
index b535574..a90bd9c 100644
--- a/gst/gstcontext.c
+++ b/gst/gstcontext.c
@@ -49,6 +49,12 @@
* known context on the element that asks for it if possible. Otherwise the
* application should provide one if it can.
*
+ * #GstContext<!-- -->s can be persistent.
+ * A persistent #GstContext is kept in elements when they reach
+ * %GST_STATE_NULL, non-persistent ones will be removed.
+ * Also, a non-persistent context won't override a previous persistent
+ * context set to an element.
+ *
* Since: 1.2
*/
@@ -239,8 +245,8 @@
* Get a writable version of the structure.
*
* Returns: The structure of the context. The structure is still
- * owned by the event, which means that you should not free it and
- * that the pointer becomes invalid when you free the event.
+ * owned by the context, which means that you should not free it and
+ * that the pointer becomes invalid when you free the context.
* This function checks if @context is writable.
*
* Since: 1.2
diff --git a/gst/gstcontext.h b/gst/gstcontext.h
index f1f89f5..d8a126c 100644
--- a/gst/gstcontext.h
+++ b/gst/gstcontext.h
@@ -54,10 +54,6 @@
*
* Returns: @context (for convenience when doing assignments)
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstContext * gst_context_ref (GstContext * context);
-#endif
-
static inline GstContext *
gst_context_ref (GstContext * context)
{
@@ -71,10 +67,6 @@
* Convenience macro to decrease the reference count of the context, possibly
* freeing it.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_context_unref (GstContext * context);
-#endif
-
static inline void
gst_context_unref (GstContext * context)
{
@@ -92,10 +84,6 @@
*
* MT safe
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstContext * gst_context_copy (const GstContext * context);
-#endif
-
static inline GstContext *
gst_context_copy (const GstContext * context)
{
@@ -138,10 +126,6 @@
*
* Returns: %TRUE if @new_context was different from @old_context
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gboolean gst_context_replace (GstContext **old_context, GstContext *new_context);
-#endif
-
static inline gboolean
gst_context_replace (GstContext **old_context, GstContext *new_context)
{
@@ -158,6 +142,10 @@
gboolean gst_context_is_persistent (const GstContext * context);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstContext, gst_context_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_CONTEXT_H__ */
diff --git a/gst/gstcontrolbinding.h b/gst/gstcontrolbinding.h
index f870d34..2f11f2e 100644
--- a/gst/gstcontrolbinding.h
+++ b/gst/gstcontrolbinding.h
@@ -115,6 +115,10 @@
void gst_control_binding_set_disabled (GstControlBinding * binding, gboolean disabled);
gboolean gst_control_binding_is_disabled (GstControlBinding * binding);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstControlBinding, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_CONTROL_BINDING_H__ */
diff --git a/gst/gstcontrolsource.c b/gst/gstcontrolsource.c
index 5165c6b..bb5474e 100644
--- a/gst/gstcontrolsource.c
+++ b/gst/gstcontrolsource.c
@@ -92,7 +92,7 @@
* gst_control_source_get_value: (method)
* @self: the #GstControlSource object
* @timestamp: the time for which the value should be returned
- * @value: the value
+ * @value: (out): the value
*
* Gets the value for this #GstControlSource at a given timestamp.
*
diff --git a/gst/gstcontrolsource.h b/gst/gstcontrolsource.h
index 655205b..b1b5b1b 100644
--- a/gst/gstcontrolsource.h
+++ b/gst/gstcontrolsource.h
@@ -133,6 +133,14 @@
gboolean gst_control_source_get_value_array (GstControlSource *self, GstClockTime timestamp,
GstClockTime interval, guint n_values,
gdouble *values);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstControlSource, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstValueArray, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_CONTROL_SOURCE_H__ */
diff --git a/gst/gstdatetime.h b/gst/gstdatetime.h
index f2bfd02..2d579b9 100644
--- a/gst/gstdatetime.h
+++ b/gst/gstdatetime.h
@@ -118,6 +118,10 @@
void gst_date_time_unref (GstDateTime * datetime);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDateTime, gst_date_time_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_DATE_TIME_H__ */
diff --git a/gst/gstdebugutils.c b/gst/gstdebugutils.c
index 2e3469e..8b4411d 100644
--- a/gst/gstdebugutils.c
+++ b/gst/gstdebugutils.c
@@ -95,8 +95,8 @@
}
static gchar *
-debug_dump_get_element_params (GstElement * element,
- GstDebugGraphDetails details)
+debug_dump_get_object_params (GObject * object,
+ GstDebugGraphDetails details, const char *const *ignored_propnames)
{
gchar *param_name = NULL;
GParamSpec **properties, *property;
@@ -107,10 +107,12 @@
/* get paramspecs and show non-default properties */
properties =
- g_object_class_list_properties (G_OBJECT_CLASS (GST_ELEMENT_GET_CLASS
- (element)), &number_of_properties);
+ g_object_class_list_properties (G_OBJECT_GET_CLASS (object),
+ &number_of_properties);
if (properties) {
for (i = 0; i < number_of_properties; i++) {
+ gint j;
+ gboolean ignore = FALSE;
property = properties[i];
/* skip some properties */
@@ -119,8 +121,16 @@
if (!strcmp (property->name, "name"))
continue;
+ if (ignored_propnames)
+ for (j = 0; ignored_propnames[j]; j++)
+ if (!g_strcmp0 (ignored_propnames[j], property->name))
+ ignore = TRUE;
+
+ if (ignore)
+ continue;
+
g_value_init (&value, property->value_type);
- g_object_get_property (G_OBJECT (element), property->name, &value);
+ g_object_get_property (G_OBJECT (object), property->name, &value);
if (!(g_param_value_defaults (property, &value))) {
tmp = g_strdup_value_contents (&value);
value_str = g_strescape (tmp, NULL);
@@ -166,8 +176,12 @@
{
GstPadTemplate *pad_templ;
GstPadPresence presence;
- gchar *pad_name;
+ gchar *pad_name, *param_name = NULL;
const gchar *style_name;
+ static const char *const ignore_propnames[] =
+ { "parent", "direction", "template",
+ "caps", NULL
+ };
const gchar *spc = MAKE_INDENT (indent);
pad_name = debug_dump_make_object_name (GST_OBJECT (pad));
@@ -183,6 +197,9 @@
style_name = "filled,dashed";
}
}
+
+ param_name =
+ debug_dump_get_object_params (G_OBJECT (pad), details, ignore_propnames);
if (details & GST_DEBUG_GRAPH_SHOW_STATES) {
gchar pad_flags[4];
const gchar *activation_mode = "-><";
@@ -216,16 +233,18 @@
pad_flags[3] = '\0';
g_string_append_printf (str,
- "%s %s_%s [color=black, fillcolor=\"%s\", label=\"%s\\n[%c][%s]%s\", height=\"0.2\", style=\"%s\"];\n",
+ "%s %s_%s [color=black, fillcolor=\"%s\", label=\"%s%s\\n[%c][%s]%s\", height=\"0.2\", style=\"%s\"];\n",
spc, element_name, pad_name, color_name, GST_OBJECT_NAME (pad),
+ (param_name ? param_name : ""),
activation_mode[pad->mode], pad_flags, task_mode, style_name);
} else {
g_string_append_printf (str,
- "%s %s_%s [color=black, fillcolor=\"%s\", label=\"%s\", height=\"0.2\", style=\"%s\"];\n",
+ "%s %s_%s [color=black, fillcolor=\"%s\", label=\"%s%s\", height=\"0.2\", style=\"%s\"];\n",
spc, element_name, pad_name, color_name, GST_OBJECT_NAME (pad),
- style_name);
+ (param_name ? param_name : ""), style_name);
}
+ g_free (param_name);
g_free (pad_name);
}
@@ -555,8 +574,8 @@
state_name = debug_dump_get_element_state (GST_ELEMENT (element));
}
if (details & GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS) {
- param_name = debug_dump_get_element_params (GST_ELEMENT (element),
- details);
+ param_name = debug_dump_get_object_params (G_OBJECT (element),
+ details, NULL);
}
/* elements */
g_string_append_printf (str, "%ssubgraph cluster_%s {\n", spc,
@@ -682,7 +701,7 @@
state_name = debug_dump_get_element_state (GST_ELEMENT (bin));
}
if (details & GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS) {
- param_name = debug_dump_get_element_params (GST_ELEMENT (bin), details);
+ param_name = debug_dump_get_object_params (G_OBJECT (bin), details, NULL);
}
/* write header */
diff --git a/gst/gstdebugutils.h b/gst/gstdebugutils.h
index 06618f9..8363e2d 100644
--- a/gst/gstdebugutils.h
+++ b/gst/gstdebugutils.h
@@ -73,10 +73,12 @@
*
* To aid debugging applications one can use this method to write out the whole
* network of gstreamer elements that form the pipeline into an dot file.
- * This file can be processed with graphviz to get an image.
+ * This file can be processed with graphviz to get an image, like this:
* <informalexample><programlisting>
* dot -Tpng -oimage.png graph_lowlevel.dot
* </programlisting></informalexample>
+ * There is also a utility called xdot which allows you to view the dot file
+ * directly without converting it first.
*
* The macro is only active if gstreamer is configured with
* "--gst-enable-gst-debug" and the environment variable
diff --git a/gst/gstdevice.h b/gst/gstdevice.h
index 79eb908..f50efe2 100644
--- a/gst/gstdevice.h
+++ b/gst/gstdevice.h
@@ -102,6 +102,10 @@
const gchar * classes);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDevice, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_DEVICE_H__ */
diff --git a/gst/gstdevicemonitor.h b/gst/gstdevicemonitor.h
index 4d9c014..5564130 100644
--- a/gst/gstdevicemonitor.h
+++ b/gst/gstdevicemonitor.h
@@ -100,6 +100,10 @@
void gst_device_monitor_set_show_all_devices (GstDeviceMonitor * monitor, gboolean show_all);
gboolean gst_device_monitor_get_show_all_devices (GstDeviceMonitor * monitor);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDeviceMonitor, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_DEVICE_MONITOR_H__ */
diff --git a/gst/gstdeviceprovider.h b/gst/gstdeviceprovider.h
index 239faeb..a83447d 100644
--- a/gst/gstdeviceprovider.h
+++ b/gst/gstdeviceprovider.h
@@ -144,6 +144,10 @@
/* factory management */
GstDeviceProviderFactory * gst_device_provider_get_factory (GstDeviceProvider * provider);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDeviceProvider, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_DEVICE_PROVIDER_H__ */
diff --git a/gst/gstdeviceproviderfactory.h b/gst/gstdeviceproviderfactory.h
index edda736..8c7e24f 100644
--- a/gst/gstdeviceproviderfactory.h
+++ b/gst/gstdeviceproviderfactory.h
@@ -85,6 +85,10 @@
GList * gst_device_provider_factory_list_get_device_providers (
GstRank minrank) G_GNUC_MALLOC;
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDeviceProviderFactory, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_DEVICE_PROVIDER_FACTORY_H__ */
diff --git a/gst/gstelement.c b/gst/gstelement.c
index ccb3734..ce26493 100644
--- a/gst/gstelement.c
+++ b/gst/gstelement.c
@@ -90,6 +90,7 @@
#include "gstutils.h"
#include "gstinfo.h"
#include "gstquark.h"
+#include "gsttracerutils.h"
#include "gstvalue.h"
#include "gst-i18n-lib.h"
#include "glib-compat-private.h"
@@ -119,6 +120,7 @@
static void gst_element_base_class_init (gpointer g_class);
static void gst_element_base_class_finalize (gpointer g_class);
+static void gst_element_constructed (GObject * object);
static void gst_element_dispose (GObject * object);
static void gst_element_finalize (GObject * object);
@@ -133,6 +135,8 @@
static void gst_element_set_bus_func (GstElement * element, GstBus * bus);
static gboolean gst_element_post_message_default (GstElement * element,
GstMessage * message);
+static void gst_element_set_context_default (GstElement * element,
+ GstContext * context);
static gboolean gst_element_default_send_event (GstElement * element,
GstEvent * event);
@@ -229,6 +233,7 @@
gobject_class->dispose = gst_element_dispose;
gobject_class->finalize = gst_element_finalize;
+ gobject_class->constructed = gst_element_constructed;
klass->change_state = GST_DEBUG_FUNCPTR (gst_element_change_state_func);
klass->set_state = GST_DEBUG_FUNCPTR (gst_element_set_state_func);
@@ -239,6 +244,7 @@
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->set_context = GST_DEBUG_FUNCPTR (gst_element_set_context_default);
klass->elementfactory = NULL;
}
@@ -299,6 +305,13 @@
g_cond_init (&element->state_cond);
}
+static void
+gst_element_constructed (GObject * object)
+{
+ GST_TRACER_ELEMENT_NEW (GST_ELEMENT_CAST (object));
+ G_OBJECT_CLASS (parent_class)->constructed (object);
+}
+
/**
* gst_element_release_request_pad:
* @element: a #GstElement to release the request pad of.
@@ -634,7 +647,7 @@
gst_element_add_pad (GstElement * element, GstPad * pad)
{
gchar *pad_name;
- gboolean flushing;
+ gboolean active;
g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
@@ -644,7 +657,7 @@
pad_name = g_strdup (GST_PAD_NAME (pad));
GST_CAT_INFO_OBJECT (GST_CAT_ELEMENT_PADS, element, "adding pad '%s'",
GST_STR_NULL (pad_name));
- flushing = GST_PAD_IS_FLUSHING (pad);
+ active = GST_PAD_IS_ACTIVE (pad);
GST_OBJECT_FLAG_SET (pad, GST_PAD_FLAG_NEED_PARENT);
GST_OBJECT_UNLOCK (pad);
@@ -658,16 +671,13 @@
GST_OBJECT_CAST (element))))
goto had_parent;
- /* check for flushing pads */
- if (flushing && (GST_STATE (element) > GST_STATE_READY ||
+ /* check for active pads */
+ if (!active && (GST_STATE (element) > GST_STATE_READY ||
GST_STATE_NEXT (element) == GST_STATE_PAUSED)) {
- g_warning ("adding flushing pad '%s' to running element '%s', you need to "
+ g_warning ("adding inactive pad '%s' to running element '%s', you need to "
"use gst_pad_set_active(pad,TRUE) before adding it.",
GST_STR_NULL (pad_name), GST_ELEMENT_NAME (element));
- /* unset flushing */
- GST_OBJECT_LOCK (pad);
- GST_PAD_UNSET_FLUSHING (pad);
- GST_OBJECT_UNLOCK (pad);
+ gst_pad_set_active (pad, TRUE);
}
g_free (pad_name);
@@ -692,7 +702,7 @@
/* emit the PAD_ADDED signal */
g_signal_emit (element, gst_element_signals[PAD_ADDED], 0, pad);
-
+ GST_TRACER_ELEMENT_ADD_PAD (element, pad);
return TRUE;
/* ERROR cases */
@@ -804,7 +814,7 @@
/* emit the PAD_REMOVED signal before unparenting and losing the last ref. */
g_signal_emit (element, gst_element_signals[PAD_REMOVED], 0, pad);
-
+ GST_TRACER_ELEMENT_REMOVE_PAD (element, pad);
gst_object_unparent (GST_OBJECT_CAST (pad));
return TRUE;
@@ -1556,13 +1566,13 @@
oclass = GST_ELEMENT_GET_CLASS (element);
- GST_STATE_LOCK (element);
if (oclass->send_event) {
GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "send %s event on element %s",
GST_EVENT_TYPE_NAME (event), GST_ELEMENT_NAME (element));
result = oclass->send_event (element, event);
+ } else {
+ gst_event_unref (event);
}
- GST_STATE_UNLOCK (element);
return result;
}
@@ -1653,18 +1663,22 @@
gst_element_query (GstElement * element, GstQuery * query)
{
GstElementClass *klass;
+ gboolean res = FALSE;
g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
g_return_val_if_fail (query != NULL, FALSE);
+ GST_TRACER_ELEMENT_QUERY_PRE (element, query);
+
klass = GST_ELEMENT_GET_CLASS (element);
if (klass->query) {
GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "send query on element %s",
GST_ELEMENT_NAME (element));
- return klass->query (element, query);
+ res = klass->query (element, query);
}
- return FALSE;
+ GST_TRACER_ELEMENT_QUERY_POST (element, res);
+ return res;
}
static gboolean
@@ -1721,15 +1735,21 @@
gst_element_post_message (GstElement * element, GstMessage * message)
{
GstElementClass *klass;
+ gboolean res = FALSE;
g_return_val_if_fail (GST_IS_ELEMENT (element), FALSE);
g_return_val_if_fail (message != NULL, FALSE);
+ GST_TRACER_ELEMENT_POST_MESSAGE_PRE (element, message);
+
klass = GST_ELEMENT_GET_CLASS (element);
if (klass->post_message)
- return klass->post_message (element, message);
+ res = klass->post_message (element, message);
+ else
+ gst_message_unref (message);
- return FALSE;
+ GST_TRACER_ELEMENT_POST_MESSAGE_POST (element, res);
+ return res;
}
/**
@@ -2599,12 +2619,16 @@
oclass = GST_ELEMENT_GET_CLASS (element);
+ GST_TRACER_ELEMENT_CHANGE_STATE_PRE (element, transition);
+
/* call the state change function so it can set the state */
if (oclass->change_state)
ret = (oclass->change_state) (element, transition);
else
ret = GST_STATE_CHANGE_FAILURE;
+ GST_TRACER_ELEMENT_CHANGE_STATE_POST (element, transition, ret);
+
switch (ret) {
case GST_STATE_CHANGE_FAILURE:
GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
@@ -2816,13 +2840,34 @@
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
break;
case GST_STATE_CHANGE_PAUSED_TO_READY:
- case GST_STATE_CHANGE_READY_TO_NULL:
+ case GST_STATE_CHANGE_READY_TO_NULL:{
+ GList *l;
+
/* deactivate pads in both cases, since they are activated on
ready->paused but the element might not have made it to paused */
if (!gst_element_pads_activate (element, FALSE)) {
result = GST_STATE_CHANGE_FAILURE;
}
+
+ /* Remove all non-persistent contexts */
+ GST_OBJECT_LOCK (element);
+ for (l = element->contexts; l;) {
+ GstContext *context = l->data;
+
+ if (!gst_context_is_persistent (context)) {
+ GList *next;
+
+ gst_context_unref (context);
+ next = l->next;
+ element->contexts = g_list_delete_link (element->contexts, l);
+ l = next;
+ } else {
+ l = l->next;
+ }
+ }
+ GST_OBJECT_UNLOCK (element);
break;
+ }
default:
/* this will catch real but unhandled state changes;
* can only be caused by:
@@ -2919,6 +2964,7 @@
bus_p = &element->bus;
gst_object_replace ((GstObject **) clock_p, NULL);
gst_object_replace ((GstObject **) bus_p, NULL);
+ g_list_free_full (element->contexts, (GDestroyNotify) gst_context_unref);
GST_OBJECT_UNLOCK (element);
GST_CAT_INFO_OBJECT (GST_CAT_REFCOUNTING, element, "parent class dispose");
@@ -3029,6 +3075,35 @@
return result;
}
+static void
+gst_element_set_context_default (GstElement * element, GstContext * context)
+{
+ const gchar *context_type;
+ GList *l;
+
+ GST_OBJECT_LOCK (element);
+ context_type = gst_context_get_context_type (context);
+ for (l = element->contexts; l; l = l->next) {
+ GstContext *tmp = l->data;
+ const gchar *tmp_type = gst_context_get_context_type (tmp);
+
+ /* Always store newest context but never replace
+ * a persistent one by a non-persistent one */
+ if (strcmp (context_type, tmp_type) == 0 &&
+ (gst_context_is_persistent (context) ||
+ !gst_context_is_persistent (tmp))) {
+ gst_context_replace ((GstContext **) & l->data, context);
+ break;
+ }
+ }
+ /* Not found? Add */
+ if (l == NULL) {
+ element->contexts =
+ g_list_prepend (element->contexts, gst_context_ref (context));
+ }
+ GST_OBJECT_UNLOCK (element);
+}
+
/**
* gst_element_set_context:
* @element: a #GstElement to set the context of.
@@ -3054,3 +3129,95 @@
if (oclass->set_context)
oclass->set_context (element, context);
}
+
+/**
+ * gst_element_get_contexts:
+ * @element: a #GstElement to set the context of.
+ *
+ * Gets the contexts set on the element.
+ *
+ * MT safe.
+ *
+ * Returns: (element-type Gst.Context) (transfer full): List of #GstContext
+ *
+ * Since: 1.8
+ */
+GList *
+gst_element_get_contexts (GstElement * element)
+{
+ GList *ret;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+
+ GST_OBJECT_LOCK (element);
+ ret = g_list_copy_deep (element->contexts, (GCopyFunc) gst_context_ref, NULL);
+ GST_OBJECT_UNLOCK (element);
+
+ return ret;
+}
+
+static gint
+_match_context_type (GstContext * c1, const gchar * context_type)
+{
+ const gchar *c1_type;
+
+ c1_type = gst_context_get_context_type (c1);
+
+ return g_strcmp0 (c1_type, context_type);
+}
+
+/**
+ * gst_element_get_context_unlocked:
+ * @element: a #GstElement to get the context of.
+ * @context_type: a name of a context to retrieve
+ *
+ * Gets the context with @context_type set on the element or NULL.
+ *
+ * Returns: (transfer full): A #GstContext or NULL
+ *
+ * Since: 1.8
+ */
+GstContext *
+gst_element_get_context_unlocked (GstElement * element,
+ const gchar * context_type)
+{
+ GstContext *ret = NULL;
+ GList *node;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+
+ node =
+ g_list_find_custom (element->contexts, context_type,
+ (GCompareFunc) _match_context_type);
+ if (node && node->data)
+ ret = gst_context_ref (node->data);
+
+ return ret;
+}
+
+/**
+ * gst_element_get_context:
+ * @element: a #GstElement to get the context of.
+ * @context_type: a name of a context to retrieve
+ *
+ * Gets the context with @context_type set on the element or NULL.
+ *
+ * MT safe.
+ *
+ * Returns: (transfer full): A #GstContext or NULL
+ *
+ * Since: 1.8
+ */
+GstContext *
+gst_element_get_context (GstElement * element, const gchar * context_type)
+{
+ GstContext *ret = NULL;
+
+ g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
+
+ GST_OBJECT_LOCK (element);
+ ret = gst_element_get_context_unlocked (element, context_type);
+ GST_OBJECT_UNLOCK (element);
+
+ return ret;
+}
diff --git a/gst/gstelement.h b/gst/gstelement.h
index 5f45988..0bd92d0 100644
--- a/gst/gstelement.h
+++ b/gst/gstelement.h
@@ -568,8 +568,11 @@
GList *sinkpads;
guint32 pads_cookie;
+ /* with object LOCK */
+ GList *contexts;
+
/*< private >*/
- gpointer _gst_reserved[GST_PADDING];
+ gpointer _gst_reserved[GST_PADDING-1];
};
/**
@@ -745,6 +748,9 @@
/* context */
void gst_element_set_context (GstElement * element, GstContext * context);
+GList * gst_element_get_contexts (GstElement * element);
+GstContext * gst_element_get_context (GstElement * element, const gchar * context_type);
+GstContext * gst_element_get_context_unlocked (GstElement * element, const gchar * context_type);
/* pad management */
gboolean gst_element_add_pad (GstElement *element, GstPad *pad);
@@ -805,6 +811,10 @@
/* factory management */
GstElementFactory* gst_element_get_factory (GstElement *element);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstElement, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_ELEMENT_H__ */
diff --git a/gst/gstelementfactory.c b/gst/gstelementfactory.c
index 486b9fe..22d420f 100644
--- a/gst/gstelementfactory.c
+++ b/gst/gstelementfactory.c
@@ -448,6 +448,7 @@
goto create_failed;
gst_object_unref (factory);
+
return element;
/* ERRORS */
diff --git a/gst/gstelementfactory.h b/gst/gstelementfactory.h
index 17e55ce..788f1c7 100644
--- a/gst/gstelementfactory.h
+++ b/gst/gstelementfactory.h
@@ -205,6 +205,10 @@
GList * gst_element_factory_list_filter (GList *list, const GstCaps *caps,
GstPadDirection direction,
gboolean subsetonly) G_GNUC_MALLOC;
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstElementFactory, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_ELEMENT_FACTORY_H__ */
diff --git a/gst/gstevent.c b/gst/gstevent.c
index 421682c..baeb0f4 100644
--- a/gst/gstevent.c
+++ b/gst/gstevent.c
@@ -1057,6 +1057,9 @@
GST_QUARK (DIFF)));
if (timestamp) {
gint64 offset = gst_event_get_running_time_offset (event);
+ GstClockTimeDiff diff_ =
+ g_value_get_int64 (gst_structure_id_get_value (structure,
+ GST_QUARK (DIFF)));
*timestamp =
g_value_get_uint64 (gst_structure_id_get_value (structure,
@@ -1066,6 +1069,11 @@
*timestamp += offset;
else
*timestamp = 0;
+
+ /* Make sure that timestamp + diff is always >= 0. Because
+ * of the running time offset this might not be true */
+ if (diff_ < 0 && *timestamp < -diff_)
+ *timestamp = (GstClockTime) - diff_;
}
}
diff --git a/gst/gstevent.h b/gst/gstevent.h
index 9fe9bcf..e20c820 100644
--- a/gst/gstevent.h
+++ b/gst/gstevent.h
@@ -291,10 +291,6 @@
*
* Returns: %TRUE if @new_event was different from @old_event
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gboolean gst_event_replace (GstEvent **old_event, GstEvent *new_event);
-#endif
-
static inline gboolean
gst_event_replace (GstEvent **old_event, GstEvent *new_event)
{
@@ -311,10 +307,6 @@
*
* Returns: the #GstEvent that was in @old_event
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstEvent * gst_event_steal (GstEvent **old_event);
-#endif
-
static inline GstEvent *
gst_event_steal (GstEvent **old_event)
{
@@ -336,10 +328,6 @@
*
* Returns: %TRUE if @new_event was different from @old_event
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gboolean gst_event_take (GstEvent **old_event, GstEvent *new_event);
-#endif
-
static inline gboolean
gst_event_take (GstEvent **old_event, GstEvent *new_event)
{
@@ -424,10 +412,6 @@
*
* Returns: (transfer full): @event (for convenience when doing assignments)
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstEvent * gst_event_ref (GstEvent * event);
-#endif
-
static inline GstEvent *
gst_event_ref (GstEvent * event)
{
@@ -440,10 +424,6 @@
*
* Decrease the refcount of an event, freeing it if the refcount reaches 0.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_event_unref (GstEvent * event);
-#endif
-
static inline void
gst_event_unref (GstEvent * event)
{
@@ -459,10 +439,6 @@
*
* Returns: (transfer full): the new event
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstEvent * gst_event_copy (const GstEvent * event);
-#endif
-
static inline GstEvent *
gst_event_copy (const GstEvent * event)
{
@@ -587,6 +563,10 @@
GstEvent* gst_event_new_segment_done (GstFormat format, gint64 position) G_GNUC_MALLOC;
void gst_event_parse_segment_done (GstEvent *event, GstFormat *format, gint64 *position);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstEvent, gst_event_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_EVENT_H__ */
diff --git a/gst/gstghostpad.h b/gst/gstghostpad.h
index cb09031..4e59ec0 100644
--- a/gst/gstghostpad.h
+++ b/gst/gstghostpad.h
@@ -123,6 +123,14 @@
gboolean gst_ghost_pad_internal_activate_mode_default (GstPad * pad, GstObject * parent,
GstPadMode mode, gboolean active);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstGhostPad, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstProxyPad, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_GHOST_PAD_H__ */
diff --git a/gst/gstinfo.h b/gst/gstinfo.h
index d4678ac..bc7580d 100644
--- a/gst/gstinfo.h
+++ b/gst/gstinfo.h
@@ -250,10 +250,10 @@
* function signature in C++ code.
*/
#ifndef GST_FUNCTION
-#if defined (__GNUC__) || (defined (_MSC_VER) && _MSC_VER >= 1300)
-# define GST_FUNCTION ((const char*) (__FUNCTION__))
-#elif defined (__STDC__) && defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#if defined (__STDC__) && defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
# define GST_FUNCTION ((const char*) (__func__))
+#elif defined (__GNUC__) || (defined (_MSC_VER) && _MSC_VER >= 1300)
+# define GST_FUNCTION ((const char*) (__FUNCTION__))
#else
# define GST_FUNCTION ((const char*) ("???"))
#endif
diff --git a/gst/gstiterator.h b/gst/gstiterator.h
index 264f197..6785672 100644
--- a/gst/gstiterator.h
+++ b/gst/gstiterator.h
@@ -268,6 +268,10 @@
gboolean gst_iterator_find_custom (GstIterator *it, GCompareFunc func,
GValue *elem, gpointer user_data);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstIterator, gst_iterator_free)
+#endif
+
G_END_DECLS
#endif /* __GST_ITERATOR_H__ */
diff --git a/gst/gstmemory.h b/gst/gstmemory.h
index c8b8fd4..5d6edec 100644
--- a/gst/gstmemory.h
+++ b/gst/gstmemory.h
@@ -47,7 +47,7 @@
* made when this memory needs to be shared between buffers.
* @GST_MEMORY_FLAG_ZERO_PREFIXED: the memory prefix is filled with 0 bytes
* @GST_MEMORY_FLAG_ZERO_PADDED: the memory padding is filled with 0 bytes
- * @GST_MEMORY_FLAG_PHYSICALLY_CONTIGUOUS: the memory is physically contiguous. (Since 2.2)
+ * @GST_MEMORY_FLAG_PHYSICALLY_CONTIGUOUS: the memory is physically contiguous. (Since 1.2)
* @GST_MEMORY_FLAG_NOT_MAPPABLE: the memory can't be mapped via gst_memory_map() without any preconditions. (Since 1.2)
* @GST_MEMORY_FLAG_LAST: first flag that can be used for custom purposes
*
@@ -323,10 +323,6 @@
*
* Returns: (transfer full): @memory (for convenience when doing assignments)
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstMemory * gst_memory_ref (GstMemory * memory);
-#endif
-
static inline GstMemory *
gst_memory_ref (GstMemory * memory)
{
@@ -339,10 +335,6 @@
*
* Decrease the refcount of an memory, freeing it if the refcount reaches 0.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_memory_unref (GstMemory * memory);
-#endif
-
static inline void
gst_memory_unref (GstMemory * memory)
{
@@ -370,6 +362,14 @@
/* span memory */
gboolean gst_memory_is_span (GstMemory *mem1, GstMemory *mem2, gsize *offset);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstMemory, gst_memory_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstAllocator, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_MEMORY_H__ */
diff --git a/gst/gstmessage.h b/gst/gstmessage.h
index 133d859..1ea4085 100644
--- a/gst/gstmessage.h
+++ b/gst/gstmessage.h
@@ -337,10 +337,6 @@
*
* Returns: @msg (for convenience when doing assignments)
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstMessage * gst_message_ref (GstMessage * msg);
-#endif
-
static inline GstMessage *
gst_message_ref (GstMessage * msg)
{
@@ -354,10 +350,6 @@
* Convenience macro to decrease the reference count of the message, possibly
* freeing it.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_message_unref (GstMessage * msg);
-#endif
-
static inline void
gst_message_unref (GstMessage * msg)
{
@@ -375,10 +367,6 @@
*
* MT safe
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstMessage * gst_message_copy (const GstMessage * msg);
-#endif
-
static inline GstMessage *
gst_message_copy (const GstMessage * msg)
{
@@ -421,10 +409,6 @@
*
* Returns: %TRUE if @new_message was different from @old_message
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gboolean gst_message_replace (GstMessage **old_message, GstMessage *new_message);
-#endif
-
static inline gboolean
gst_message_replace (GstMessage **old_message, GstMessage *new_message)
{
@@ -609,6 +593,10 @@
void gst_message_parse_device_removed (GstMessage * message, GstDevice ** device);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstMessage, gst_message_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_MESSAGE_H__ */
diff --git a/gst/gstobject.h b/gst/gstobject.h
index b478f3b..f5b9b36 100644
--- a/gst/gstobject.h
+++ b/gst/gstobject.h
@@ -265,6 +265,10 @@
GstClockTime gst_object_get_control_rate (GstObject * object);
void gst_object_set_control_rate (GstObject * object, GstClockTime control_rate);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstObject, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_OBJECT_H__ */
diff --git a/gst/gstpad.c b/gst/gstpad.c
index 7f1cb1d..aed3af7 100644
--- a/gst/gstpad.c
+++ b/gst/gstpad.c
@@ -94,6 +94,7 @@
#include "gstutils.h"
#include "gstinfo.h"
#include "gsterror.h"
+#include "gsttracerutils.h"
#include "gstvalue.h"
#include "glib-compat-private.h"
@@ -1323,6 +1324,13 @@
* Be notified of different states of pads. The provided callback is called for
* every state that matches @mask.
*
+ * Probes are called in groups: First GST_PAD_PROBE_TYPE_BLOCK probes are
+ * called, then others, then finally GST_PAD_PROBE_TYPE_IDLE. The only
+ * exception here are GST_PAD_PROBE_TYPE_IDLE probes that are called
+ * immediately if the pad is already idle while calling gst_pad_add_probe().
+ * In each of the groups, probes are called in the order in which they were
+ * added.
+ *
* Returns: an id or 0 if no probe is pending. The id can be used to remove the
* probe with gst_pad_remove_probe(). When using GST_PAD_PROBE_TYPE_IDLE it can
* happen that the probe can be run immediately and if the probe returns
@@ -1364,7 +1372,7 @@
PROBE_COOKIE (hook) = (pad->priv->probe_cookie - 1);
/* add the probe */
- g_hook_prepend (&pad->probes, hook);
+ g_hook_append (&pad->probes, hook);
pad->num_probes++;
/* incremenent cookie so that the new hook get's called */
pad->priv->probe_list_cookie++;
@@ -1818,6 +1826,51 @@
GST_DEBUG_FUNCPTR_NAME (event));
}
+static gboolean
+event_wrap (GstPad * pad, GstObject * object, GstEvent * event)
+{
+ GstFlowReturn ret;
+
+ ret = GST_PAD_EVENTFULLFUNC (pad) (pad, object, event);
+ if (ret == GST_FLOW_OK)
+ return TRUE;
+ return FALSE;
+}
+
+/**
+ * gst_pad_set_event_full_function:
+ * @p: a #GstPad of either direction.
+ * @f: the #GstPadEventFullFunction to set.
+ *
+ * Calls gst_pad_set_event_full_function_full() with %NULL for the user_data and
+ * notify.
+ */
+/**
+ * gst_pad_set_event_full_function_full:
+ * @pad: a #GstPad of either direction.
+ * @event: the #GstPadEventFullFunction to set.
+ * @user_data: user_data passed to @notify
+ * @notify: notify called when @event will not be used anymore.
+ *
+ * Sets the given event handler for the pad.
+ */
+void
+gst_pad_set_event_full_function_full (GstPad * pad,
+ GstPadEventFullFunction event, gpointer user_data, GDestroyNotify notify)
+{
+ g_return_if_fail (GST_IS_PAD (pad));
+
+ if (pad->eventnotify)
+ pad->eventnotify (pad->eventdata);
+ GST_PAD_EVENTFULLFUNC (pad) = event;
+ GST_PAD_EVENTFUNC (pad) = event_wrap;
+ pad->eventdata = user_data;
+ pad->eventnotify = notify;
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "eventfullfunc for set to %s",
+ GST_DEBUG_FUNCPTR_NAME (event));
+}
+
/**
* gst_pad_set_query_function:
* @p: a #GstPad of either direction.
@@ -1986,6 +2039,8 @@
g_return_val_if_fail (GST_IS_PAD (sinkpad), FALSE);
g_return_val_if_fail (GST_PAD_IS_SINK (sinkpad), FALSE);
+ GST_TRACER_PAD_UNLINK_PRE (srcpad, sinkpad);
+
GST_CAT_INFO (GST_CAT_ELEMENT_PADS, "unlinking %s:%s(%p) and %s:%s(%p)",
GST_DEBUG_PAD_NAME (srcpad), srcpad,
GST_DEBUG_PAD_NAME (sinkpad), sinkpad);
@@ -2053,6 +2108,7 @@
GST_STRUCTURE_CHANGE_TYPE_PAD_UNLINK, parent, FALSE));
gst_object_unref (parent);
}
+ GST_TRACER_PAD_UNLINK_POST (srcpad, sinkpad, result);
return result;
/* ERRORS */
@@ -2494,7 +2550,13 @@
GstPadLinkReturn
gst_pad_link (GstPad * srcpad, GstPad * sinkpad)
{
- return gst_pad_link_full (srcpad, sinkpad, GST_PAD_LINK_CHECK_DEFAULT);
+ GstPadLinkReturn ret;
+
+ GST_TRACER_PAD_LINK_PRE (srcpad, sinkpad);
+ ret = gst_pad_link_full (srcpad, sinkpad, GST_PAD_LINK_CHECK_DEFAULT);
+ GST_TRACER_PAD_LINK_POST (srcpad, sinkpad, ret);
+
+ return ret;
}
static void
@@ -2965,7 +3027,7 @@
gst_pad_query_accept_caps_default (GstPad * pad, GstQuery * query)
{
/* get the caps and see if it intersects to something not empty */
- GstCaps *caps, *allowed;
+ GstCaps *caps, *allowed = NULL;
gboolean result;
GST_DEBUG_OBJECT (pad, "query accept-caps %" GST_PTR_FORMAT, query);
@@ -2973,19 +3035,22 @@
/* first forward the query to internally linked pads when we are dealing with
* a PROXY CAPS */
if (GST_PAD_IS_PROXY_CAPS (pad)) {
- if ((result = gst_pad_proxy_query_accept_caps (pad, query))) {
+ result = gst_pad_proxy_query_accept_caps (pad, query);
+ if (result)
+ allowed = gst_pad_get_pad_template_caps (pad);
+ else
goto done;
- }
}
- GST_CAT_DEBUG_OBJECT (GST_CAT_PERFORMANCE, pad,
- "fallback ACCEPT_CAPS query, consider implementing a specialized version");
-
gst_query_parse_accept_caps (query, &caps);
- if (GST_PAD_IS_ACCEPT_TEMPLATE (pad))
- allowed = gst_pad_get_pad_template_caps (pad);
- else
- allowed = gst_pad_query_caps (pad, caps);
+ if (!allowed) {
+ GST_CAT_DEBUG_OBJECT (GST_CAT_PERFORMANCE, pad,
+ "fallback ACCEPT_CAPS query, consider implementing a specialized version");
+ if (GST_PAD_IS_ACCEPT_TEMPLATE (pad))
+ allowed = gst_pad_get_pad_template_caps (pad);
+ else
+ allowed = gst_pad_query_caps (pad, caps);
+ }
if (allowed) {
if (GST_PAD_IS_ACCEPT_INTERSECT (pad)) {
@@ -3813,6 +3878,7 @@
GST_DEBUG_OBJECT (pad, "doing query %p (%s)", query,
GST_QUERY_TYPE_NAME (query));
+ GST_TRACER_PAD_QUERY_PRE (pad, query);
serialized = GST_QUERY_IS_SERIALIZED (query);
if (G_UNLIKELY (serialized))
@@ -3835,6 +3901,7 @@
GST_DEBUG_OBJECT (pad, "sent query %p (%s), result %d", query,
GST_QUERY_TYPE_NAME (query), res);
+ GST_TRACER_PAD_QUERY_POST (pad, res, query);
if (res != TRUE)
goto query_failed;
@@ -4044,7 +4111,7 @@
if (G_UNLIKELY (GST_PAD_MODE (pad) != GST_PAD_MODE_PUSH))
goto wrong_mode;
-#ifndef G_DISABLE_ASSERT
+#ifdef GST_ENABLE_EXTRA_CHECKS
if (G_UNLIKELY (pad->priv->last_cookie != pad->priv->events_cookie)) {
if (!find_event_by_type (pad, GST_EVENT_STREAM_START, 0)) {
g_warning (G_STRLOC
@@ -4297,7 +4364,7 @@
if (G_UNLIKELY (GST_PAD_MODE (pad) != GST_PAD_MODE_PUSH))
goto wrong_mode;
-#ifndef G_DISABLE_ASSERT
+#ifdef GST_ENABLE_EXTRA_CHECKS
if (G_UNLIKELY (pad->priv->last_cookie != pad->priv->events_cookie)) {
if (!find_event_by_type (pad, GST_EVENT_STREAM_START, 0)) {
g_warning (G_STRLOC
@@ -4447,12 +4514,17 @@
GstFlowReturn
gst_pad_push (GstPad * pad, GstBuffer * buffer)
{
+ GstFlowReturn res;
+
g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
g_return_val_if_fail (GST_PAD_IS_SRC (pad), GST_FLOW_ERROR);
g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR);
- return gst_pad_push_data (pad,
+ GST_TRACER_PAD_PUSH_PRE (pad, buffer);
+ res = gst_pad_push_data (pad,
GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_PUSH, buffer);
+ GST_TRACER_PAD_PUSH_POST (pad, res);
+ return res;
}
/**
@@ -4482,12 +4554,17 @@
GstFlowReturn
gst_pad_push_list (GstPad * pad, GstBufferList * list)
{
+ GstFlowReturn res;
+
g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
g_return_val_if_fail (GST_PAD_IS_SRC (pad), GST_FLOW_ERROR);
g_return_val_if_fail (GST_IS_BUFFER_LIST (list), GST_FLOW_ERROR);
- return gst_pad_push_data (pad,
+ GST_TRACER_PAD_PUSH_LIST_PRE (pad, list);
+ res = gst_pad_push_data (pad,
GST_PAD_PROBE_TYPE_BUFFER_LIST | GST_PAD_PROBE_TYPE_PUSH, list);
+ GST_TRACER_PAD_PUSH_LIST_POST (pad, res);
+ return res;
}
static GstFlowReturn
@@ -4751,6 +4828,8 @@
g_return_val_if_fail (*buffer == NULL || (GST_IS_BUFFER (*buffer)
&& gst_buffer_get_size (*buffer) >= size), GST_FLOW_ERROR);
+ GST_TRACER_PAD_PULL_RANGE_PRE (pad, offset, size);
+
GST_OBJECT_LOCK (pad);
if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
goto flushing;
@@ -4797,6 +4876,7 @@
*buffer = res_buf;
+ GST_TRACER_PAD_PULL_RANGE_POST (pad, *buffer, ret);
return ret;
/* ERROR recovery here */
@@ -4806,7 +4886,8 @@
"pullrange, but pad was flushing");
pad->ABI.abi.last_flowret = GST_FLOW_FLUSHING;
GST_OBJECT_UNLOCK (pad);
- return GST_FLOW_FLUSHING;
+ ret = GST_FLOW_FLUSHING;
+ goto done;
}
wrong_mode:
{
@@ -4814,7 +4895,8 @@
GST_DEBUG_PAD_NAME (pad));
pad->ABI.abi.last_flowret = GST_FLOW_ERROR;
GST_OBJECT_UNLOCK (pad);
- return GST_FLOW_ERROR;
+ ret = GST_FLOW_ERROR;
+ goto done;
}
probe_stopped:
{
@@ -4835,7 +4917,7 @@
}
pad->ABI.abi.last_flowret = ret;
GST_OBJECT_UNLOCK (pad);
- return ret;
+ goto done;
}
not_linked:
{
@@ -4843,7 +4925,8 @@
"pulling range, but it was not linked");
pad->ABI.abi.last_flowret = GST_FLOW_NOT_LINKED;
GST_OBJECT_UNLOCK (pad);
- return GST_FLOW_NOT_LINKED;
+ ret = GST_FLOW_NOT_LINKED;
+ goto done;
}
pull_range_failed:
{
@@ -4852,7 +4935,7 @@
GST_CAT_LEVEL_LOG (GST_CAT_SCHEDULING,
(ret >= GST_FLOW_EOS) ? GST_LEVEL_INFO : GST_LEVEL_WARNING,
pad, "pullrange failed, flow: %s", gst_flow_get_name (ret));
- return ret;
+ goto done;
}
probe_stopped_unref:
{
@@ -4868,8 +4951,11 @@
if (*buffer == NULL)
gst_buffer_unref (res_buf);
- return ret;
+ goto done;
}
+done:
+ GST_TRACER_PAD_PULL_RANGE_POST (pad, NULL, ret);
+ return ret;
}
/* must be called with pad object lock */
@@ -5218,6 +5304,8 @@
g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
g_return_val_if_fail (GST_IS_EVENT (event), FALSE);
+ GST_TRACER_PAD_PUSH_EVENT_PRE (pad, event);
+
if (GST_PAD_IS_SRC (pad)) {
if (G_UNLIKELY (!GST_EVENT_IS_DOWNSTREAM (event)))
goto wrong_direction;
@@ -5272,6 +5360,7 @@
}
GST_OBJECT_UNLOCK (pad);
+ GST_TRACER_PAD_PUSH_EVENT_POST (pad, res);
return res;
/* ERROR handling */
@@ -5280,28 +5369,31 @@
g_warning ("pad %s:%s pushing %s event in wrong direction",
GST_DEBUG_PAD_NAME (pad), GST_EVENT_TYPE_NAME (event));
gst_event_unref (event);
- return FALSE;
+ goto done;
}
unknown_direction:
{
g_warning ("pad %s:%s has invalid direction", GST_DEBUG_PAD_NAME (pad));
gst_event_unref (event);
- return FALSE;
+ goto done;
}
flushed:
{
GST_DEBUG_OBJECT (pad, "We're flushing");
GST_OBJECT_UNLOCK (pad);
gst_event_unref (event);
- return FALSE;
+ goto done;
}
eos:
{
GST_DEBUG_OBJECT (pad, "We're EOS");
GST_OBJECT_UNLOCK (pad);
gst_event_unref (event);
- return FALSE;
+ goto done;
}
+done:
+ GST_TRACER_PAD_PUSH_EVENT_POST (pad, FALSE);
+ return FALSE;
}
/* Check if we can call the event function with the given event */
@@ -5342,6 +5434,7 @@
GstEventType event_type;
gboolean serialized, need_unlock = FALSE, sticky;
GstPadEventFunction eventfunc;
+ GstPadEventFullFunction eventfullfunc = NULL;
GstObject *parent;
GST_OBJECT_LOCK (pad);
@@ -5439,7 +5532,9 @@
PROBE_PUSH (pad, type | GST_PAD_PROBE_TYPE_PUSH, event, probe_stopped);
- if (G_UNLIKELY ((eventfunc = GST_PAD_EVENTFUNC (pad)) == NULL))
+ eventfullfunc = GST_PAD_EVENTFULLFUNC (pad);
+ eventfunc = GST_PAD_EVENTFUNC (pad);
+ if (G_UNLIKELY (eventfunc == NULL && eventfullfunc == NULL))
goto no_function;
ACQUIRE_PARENT (pad, parent, no_parent);
@@ -5452,7 +5547,9 @@
if (sticky)
gst_event_ref (event);
- if (eventfunc (pad, parent, event)) {
+ if (eventfullfunc) {
+ ret = eventfullfunc (pad, parent, event);
+ } else if (eventfunc (pad, parent, event)) {
ret = GST_FLOW_OK;
} else {
/* something went wrong */
diff --git a/gst/gstpad.h b/gst/gstpad.h
index 5f93112..20fd9a2 100644
--- a/gst/gstpad.h
+++ b/gst/gstpad.h
@@ -362,6 +362,26 @@
typedef gboolean (*GstPadEventFunction) (GstPad *pad, GstObject *parent,
GstEvent *event);
+/**
+ * GstPadEventFullFunction:
+ * @pad: the #GstPad to handle the event.
+ * @parent: (allow-none): the parent of @pad. If the #GST_PAD_FLAG_NEED_PARENT
+ * flag is set, @parent is guaranteed to be not-%NULL and remain valid
+ * during the execution of this function.
+ * @event: (transfer full): the #GstEvent to handle.
+ *
+ * Function signature to handle an event for the pad.
+ *
+ * This variant is for specific elements that will take into account the
+ * last downstream flow return (from a pad push), in which case they can
+ * return it.
+ *
+ * Returns: %GST_FLOW_OK if the event was handled properly, or any other
+ * #GstFlowReturn dependent on downstream state.
+ */
+typedef GstFlowReturn (*GstPadEventFullFunction) (GstPad *pad, GstObject *parent,
+ GstEvent *event);
+
/* internal links */
/**
@@ -756,6 +776,7 @@
gpointer _gst_reserved[GST_PADDING];
struct {
GstFlowReturn last_flowret;
+ GstPadEventFullFunction eventfullfunc;
} abi;
} ABI;
};
@@ -881,6 +902,17 @@
*/
#define GST_PAD_EVENTFUNC(pad) (GST_PAD_CAST(pad)->eventfunc)
/**
+ * GST_PAD_EVENTFULLFUNC:
+ * @pad: a #GstPad
+ *
+ * Get the #GstPadEventFullFunction from the given @pad, which
+ * is the function that handles events on the pad. You can
+ * use this to set your own event handling function on a pad
+ * after you create it. If your element derives from a base
+ * class, use the base class's virtual functions instead.
+ */
+#define GST_PAD_EVENTFULLFUNC(pad) (GST_PAD_CAST(pad)->ABI.abi.eventfullfunc)
+/**
* GST_PAD_QUERYFUNC:
* @pad: a #GstPad
*
@@ -1306,6 +1338,10 @@
GstPadEventFunction event,
gpointer user_data,
GDestroyNotify notify);
+void gst_pad_set_event_full_function_full (GstPad *pad,
+ GstPadEventFullFunction event,
+ gpointer user_data,
+ GDestroyNotify notify);
#define gst_pad_set_activate_function(p,f) gst_pad_set_activate_function_full((p),(f),NULL,NULL)
#define gst_pad_set_activatemode_function(p,f) gst_pad_set_activatemode_function_full((p),(f),NULL,NULL)
@@ -1313,6 +1349,7 @@
#define gst_pad_set_chain_list_function(p,f) gst_pad_set_chain_list_function_full((p),(f),NULL,NULL)
#define gst_pad_set_getrange_function(p,f) gst_pad_set_getrange_function_full((p),(f),NULL,NULL)
#define gst_pad_set_event_function(p,f) gst_pad_set_event_function_full((p),(f),NULL,NULL)
+#define gst_pad_set_event_full_function(p,f) gst_pad_set_event_full_function_full((p),(f),NULL,NULL)
/* pad links */
void gst_pad_set_link_function_full (GstPad *pad,
@@ -1396,6 +1433,10 @@
gboolean gst_pad_forward (GstPad *pad, GstPadForwardFunction forward,
gpointer user_data);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstPad, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_PAD_H__ */
diff --git a/gst/gstpadtemplate.h b/gst/gstpadtemplate.h
index 636b143..9491647 100644
--- a/gst/gstpadtemplate.h
+++ b/gst/gstpadtemplate.h
@@ -188,6 +188,10 @@
void gst_pad_template_pad_created (GstPadTemplate * templ, GstPad * pad);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstPadTemplate, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_PAD_TEMPLATE_H__ */
diff --git a/gst/gstparse.h b/gst/gstparse.h
index b1ec83d..c2456c9 100644
--- a/gst/gstparse.h
+++ b/gst/gstparse.h
@@ -113,6 +113,10 @@
GstParseFlags flags,
GError ** error) G_GNUC_MALLOC;
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstParseContext, gst_parse_context_free)
+#endif
+
G_END_DECLS
#endif /* __GST_PARSE_H__ */
diff --git a/gst/gstpipeline.h b/gst/gstpipeline.h
index 73fdeb4..ee0efe0 100644
--- a/gst/gstpipeline.h
+++ b/gst/gstpipeline.h
@@ -108,6 +108,10 @@
void gst_pipeline_set_auto_flush_bus (GstPipeline *pipeline, gboolean auto_flush);
gboolean gst_pipeline_get_auto_flush_bus (GstPipeline *pipeline);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstPipeline, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_PIPELINE_H__ */
diff --git a/gst/gstplugin.c b/gst/gstplugin.c
index 4b7a140..8bdf1b5 100644
--- a/gst/gstplugin.c
+++ b/gst/gstplugin.c
@@ -440,7 +440,7 @@
gchar **w;
for (w = _plugin_loading_whitelist; *w != NULL; ++w)
- hash = (hash << 1) ^ g_str_hash (*w);
+ hash ^= g_str_hash (*w);
}
return hash;
@@ -1492,7 +1492,7 @@
static guint
gst_plugin_ext_dep_get_hash_from_stat_entry (GStatBuf * s)
{
- if (!(s->st_mode & (S_IFDIR | S_IFREG)))
+ if (!(s->st_mode & (S_IFDIR | S_IFREG | S_IFBLK | S_IFCHR)))
return (guint) - 1;
/* completely random formula */
@@ -1513,6 +1513,9 @@
if (((flags & GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX)) &&
g_str_has_suffix (entry, *filenames)) {
return TRUE;
+ } else if (((flags & GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX)) &&
+ g_str_has_prefix (entry, *filenames)) {
+ return TRUE;
/* else it's an exact match that's needed */
} else if (strcmp (entry, *filenames) == 0) {
return TRUE;
@@ -1575,7 +1578,7 @@
continue;
}
- hash = (hash + fhash) << 1;
+ hash = hash + fhash;
g_free (full_path);
}
@@ -1589,7 +1592,7 @@
GstPluginDependencyFlags flags)
{
const gchar *empty_filenames[] = { "", NULL };
- gboolean recurse_into_dirs, partial_names;
+ gboolean recurse_into_dirs, partial_names = FALSE;
guint i, hash = 0;
/* to avoid special-casing below (FIXME?) */
@@ -1597,7 +1600,10 @@
filenames = empty_filenames;
recurse_into_dirs = ! !(flags & GST_PLUGIN_DEPENDENCY_FLAG_RECURSE);
- partial_names = ! !(flags & GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX);
+
+ if ((flags & GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX) ||
+ (flags & GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX))
+ partial_names = TRUE;
/* if we can construct the exact paths to check with the data we have, just
* stat them one by one; this is more efficient than opening the directory
@@ -1617,7 +1623,7 @@
fhash = gst_plugin_ext_dep_get_hash_from_stat_entry (&s);
GST_LOG_OBJECT (plugin, "stat: %s (result: %08x)", full_path, fhash);
}
- hash = (hash + fhash) << 1;
+ hash += fhash;
g_free (full_path);
}
} else {
@@ -1661,7 +1667,6 @@
while ((path = g_queue_pop_head (&scan_paths))) {
scan_hash += gst_plugin_ext_dep_scan_path_with_filenames (plugin, path,
(const gchar **) dep->names, dep->flags);
- scan_hash = scan_hash << 1;
g_free (path);
}
diff --git a/gst/gstplugin.h b/gst/gstplugin.h
index c76302f..67e8e59 100644
--- a/gst/gstplugin.h
+++ b/gst/gstplugin.h
@@ -93,6 +93,9 @@
* @GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX : interpret
* filename argument as filter suffix and check all matching files in
* the directory
+ * @GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX : interpret
+ * filename argument as filter prefix and check all matching files in
+ * the directory. Since 1.8.
*
* Flags used in connection with gst_plugin_add_dependency().
*/
@@ -100,7 +103,8 @@
GST_PLUGIN_DEPENDENCY_FLAG_NONE = 0,
GST_PLUGIN_DEPENDENCY_FLAG_RECURSE = (1 << 0),
GST_PLUGIN_DEPENDENCY_FLAG_PATHS_ARE_DEFAULT_ONLY = (1 << 1),
- GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX = (1 << 2)
+ GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX = (1 << 2),
+ GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX = (1 << 3)
} GstPluginDependencyFlags;
/**
@@ -354,6 +358,10 @@
void gst_plugin_list_free (GList *list);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstPlugin, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_PLUGIN_H__ */
diff --git a/gst/gstpluginfeature.h b/gst/gstpluginfeature.h
index 08abb73..38a489d 100644
--- a/gst/gstpluginfeature.h
+++ b/gst/gstpluginfeature.h
@@ -139,6 +139,10 @@
gint gst_plugin_feature_rank_compare_func (gconstpointer p1,
gconstpointer p2);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstPluginFeature, gst_object_unref)
+#endif
+
G_END_DECLS
diff --git a/gst/gstpreset.c b/gst/gstpreset.c
index 1b42024..12f4cd4 100644
--- a/gst/gstpreset.c
+++ b/gst/gstpreset.c
@@ -42,8 +42,9 @@
* application specific directory and in the users home directory. When getting
* a list of presets individual presets are read and overlaid in 1) system,
* 2) application and 3) user order. Whenever an earlier entry is newer, the
- * later entries will be updated.
- *
+ * later entries will be updated. Since 1.8 you can also provide extra paths
+ * where to find presets through the GST_PRESET_PATH environment variable.
+ * Presets found in those paths will be concidered as "app presets".
*/
/* FIXME:
* - non racyness
@@ -365,15 +366,37 @@
guint64 version_user = G_GUINT64_CONSTANT (0);
guint64 version = G_GUINT64_CONSTANT (0);
gboolean merged = FALSE;
- GKeyFile *in_user, *in_app = NULL, *in_system;
+ GKeyFile *in_user = NULL, *in_app = NULL, *in_system;
- preset_get_paths (preset, &preset_user_path, &preset_app_path,
- &preset_system_path);
+ const gchar *envvar;
/* try to load the user, app and system presets, we do this to get the
* versions of all files. */
- in_user = preset_open_and_parse_header (preset, preset_user_path,
- &version_user);
+ envvar = g_getenv ("GST_PRESET_PATH");
+ if (envvar) {
+ gint i;
+ gchar **preset_dirs = g_strsplit (envvar, G_SEARCHPATH_SEPARATOR_S, -1);
+
+ for (i = 0; preset_dirs[i]; i++) {
+ gchar *preset_path = g_strdup_printf ("%s" G_DIR_SEPARATOR_S "%s.prs",
+ preset_dirs[i], G_OBJECT_TYPE_NAME (preset));
+
+ in_user = preset_open_and_parse_header (preset, preset_path,
+ &version_user);
+ g_free (preset_path);
+ if (in_user)
+ break;
+ }
+ g_strfreev (preset_dirs);
+ }
+
+ preset_get_paths (preset, &preset_user_path, &preset_app_path,
+ &preset_system_path);
+ if (!in_user) {
+ in_user = preset_open_and_parse_header (preset, preset_user_path,
+ &version_user);
+ }
+
if (preset_app_path) {
in_app = preset_open_and_parse_header (preset, preset_app_path,
&version_app);
diff --git a/gst/gstquery.c b/gst/gstquery.c
index 2828bd5..72d783d 100644
--- a/gst/gstquery.c
+++ b/gst/gstquery.c
@@ -1820,7 +1820,7 @@
* gst_query_parse_nth_allocation_meta:
* @query: a GST_QUERY_ALLOCATION type query #GstQuery
* @index: position in the metadata API array to read
- * @params: (out) (transfer none) (allow-none): API specific flags
+ * @params: (out) (transfer none) (allow-none): API specific parameters
*
* Parse an available query and get the metadata API
* at @index of the metadata API array.
@@ -1884,8 +1884,8 @@
* @index: (out) (transfer none) (allow-none): the index
*
* Check if @query has metadata @api set. When this function returns %TRUE,
- * @index will contain the index where the requested API and the flags can be
- * found.
+ * @index will contain the index where the requested API and the parameters
+ * can be found.
*
* Returns: %TRUE when @api is in the list of metadata.
*/
diff --git a/gst/gstquery.h b/gst/gstquery.h
index 18a075c..9f7353c 100644
--- a/gst/gstquery.h
+++ b/gst/gstquery.h
@@ -210,10 +210,6 @@
*
* Returns: @q
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstQuery * gst_query_ref (GstQuery * q);
-#endif
-
static inline GstQuery *
gst_query_ref (GstQuery * q)
{
@@ -227,10 +223,6 @@
* Decreases the refcount of the query. If the refcount reaches 0, the query
* will be freed.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_query_unref (GstQuery * q);
-#endif
-
static inline void
gst_query_unref (GstQuery * q)
{
@@ -248,10 +240,6 @@
*
* Returns: (transfer full): a new copy of @q.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstQuery * gst_query_copy (const GstQuery * q);
-#endif
-
static inline GstQuery *
gst_query_copy (const GstQuery * q)
{
@@ -290,10 +278,6 @@
*
* Returns: %TRUE if @new_query was different from @old_query
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gboolean gst_query_replace (GstQuery **old_query, GstQuery *new_query);
-#endif
-
static inline gboolean
gst_query_replace (GstQuery **old_query, GstQuery *new_query)
{
@@ -495,6 +479,10 @@
void gst_query_set_context (GstQuery *query, GstContext *context);
void gst_query_parse_context (GstQuery *query, GstContext **context);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstQuery, gst_query_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_QUERY_H__ */
diff --git a/gst/gstregistry.h b/gst/gstregistry.h
index d0a665b..d72f497 100644
--- a/gst/gstregistry.h
+++ b/gst/gstregistry.h
@@ -99,6 +99,10 @@
guint min_minor,
guint min_micro);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstRegistry, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_REGISTRY_H__ */
diff --git a/gst/gstregistrybinary.h b/gst/gstregistrybinary.h
index f1102c7..22e56d1 100644
--- a/gst/gstregistrybinary.h
+++ b/gst/gstregistrybinary.h
@@ -55,7 +55,7 @@
* This _must_ be updated whenever the registry format changes,
* we currently use the core version where this change happened.
*/
-#define GST_MAGIC_BINARY_VERSION_STR "1.0.0"
+#define GST_MAGIC_BINARY_VERSION_STR "1.3.0"
/*
* GST_MAGIC_BINARY_VERSION_LEN:
diff --git a/gst/gstregistrychunks.c b/gst/gstregistrychunks.c
index f854865..7712fcf 100644
--- a/gst/gstregistrychunks.c
+++ b/gst/gstregistrychunks.c
@@ -31,6 +31,7 @@
#include <gst/gst_private.h>
#include <gst/gstconfig.h>
#include <gst/gstelement.h>
+#include <gst/gsttracerfactory.h>
#include <gst/gsttypefind.h>
#include <gst/gsttypefindfactory.h>
#include <gst/gstdeviceproviderfactory.h>
@@ -350,6 +351,13 @@
/* pack element metadata strings */
gst_registry_chunks_save_string (list,
gst_structure_to_string (factory->metadata));
+ } else if (GST_IS_TRACER_FACTORY (feature)) {
+ /* Initialize with zeroes because of struct padding and
+ * valgrind complaining about copying unitialized memory
+ */
+ pf = g_slice_new0 (GstRegistryChunkPluginFeature);
+ pf_size = sizeof (GstRegistryChunkPluginFeature);
+ chk = gst_registry_chunks_make_data (pf, pf_size);
} else {
GST_WARNING_OBJECT (feature, "unhandled feature type '%s'", type_name);
}
@@ -677,6 +685,7 @@
GST_DEBUG
("Reading/casting for GstRegistryChunkPluginFeature at address %p",
*in);
+
unpack_element (*in, dmf, GstRegistryChunkDeviceProviderFactory, end, fail);
pf = (GstRegistryChunkPluginFeature *) dmf;
@@ -692,6 +701,12 @@
goto fail;
}
}
+ } else if (GST_IS_TRACER_FACTORY (feature)) {
+ align (*in);
+ GST_DEBUG
+ ("Reading/casting for GstRegistryChunkPluginFeature at address %p",
+ *in);
+ unpack_element (*in, pf, GstRegistryChunkPluginFeature, end, fail);
} else {
GST_WARNING ("unhandled factory type : %s", G_OBJECT_TYPE_NAME (feature));
goto fail;
diff --git a/gst/gstsample.h b/gst/gstsample.h
index 71f48ee..6637fa3 100644
--- a/gst/gstsample.h
+++ b/gst/gstsample.h
@@ -71,10 +71,6 @@
*
* Returns: (transfer full): @sample
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstSample * gst_sample_ref (GstSample * sample);
-#endif
-
static inline GstSample *
gst_sample_ref (GstSample * sample)
{
@@ -89,10 +85,6 @@
* Decreases the refcount of the sample. If the refcount reaches 0, the
* sample will be freed.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_sample_unref (GstSample * sample);
-#endif
-
static inline void
gst_sample_unref (GstSample * sample)
{
@@ -111,10 +103,6 @@
*
* Since: 1.2
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstSample * gst_sample_copy (const GstSample * buf);
-#endif
-
static inline GstSample *
gst_sample_copy (const GstSample * buf)
{
@@ -149,6 +137,10 @@
*/
#define gst_value_get_sample(v) GST_SAMPLE_CAST (g_value_get_boxed(v))
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstSample, gst_sample_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_SAMPLE_H__ */
diff --git a/gst/gstsegment.c b/gst/gstsegment.c
index 2594d53..fbb71e3 100644
--- a/gst/gstsegment.c
+++ b/gst/gstsegment.c
@@ -375,6 +375,114 @@
}
/**
+ * gst_segment_to_stream_time_full:
+ * @segment: a #GstSegment structure.
+ * @format: the format of the segment.
+ * @position: the position in the segment
+ * @stream_time: result stream-time
+ *
+ * Translate @position to the total stream time using the currently configured
+ * segment. Compared to gst_segment_to_stream_time() this function can return
+ * negative stream-time.
+ *
+ * This function is typically used by elements that need to synchronize buffers
+ * against the clock or eachother.
+ *
+ * @position can be any value and the result of this function for values outside
+ * of the segment is extrapolated.
+ *
+ * When 1 is returned, @position resulted in a positive stream-time returned
+ * in @stream_time.
+ *
+ * When this function returns -1, the returned @stream_time should be negated
+ * to get the real negative stream time.
+ *
+ * Returns: a 1 or -1 on success, 0 on failure.
+ *
+ * Since: 1.8
+ */
+gint
+gst_segment_to_stream_time_full (const GstSegment * segment, GstFormat format,
+ guint64 position, guint64 * stream_time)
+{
+ guint64 start, stop, time;
+ gdouble abs_applied_rate;
+ gint res;
+
+ /* format does not matter for -1 */
+ if (G_UNLIKELY (position == -1)) {
+ *stream_time = -1;
+ return 0;
+ }
+
+ g_return_val_if_fail (segment != NULL, 0);
+ g_return_val_if_fail (segment->format == format, 0);
+
+ stop = segment->stop;
+
+ start = segment->start;
+ time = segment->time;
+
+ /* time must be known */
+ if (G_UNLIKELY (time == -1))
+ return 0;
+
+ abs_applied_rate = ABS (segment->applied_rate);
+
+ /* add or subtract from segment time based on applied rate */
+ if (G_LIKELY (segment->applied_rate > 0.0)) {
+ if (G_LIKELY (position > start)) {
+ /* bring to uncorrected position in segment */
+ *stream_time = position - start;
+ /* correct for applied rate if needed */
+ if (G_UNLIKELY (abs_applied_rate != 1.0))
+ *stream_time *= abs_applied_rate;
+ /* correct for segment time */
+ *stream_time += time;
+ res = 1;
+ } else {
+ *stream_time = start - position;
+ if (G_UNLIKELY (abs_applied_rate != 1.0))
+ *stream_time *= abs_applied_rate;
+ if (*stream_time > time) {
+ *stream_time -= time;
+ res = -1;
+ } else {
+ *stream_time = time - *stream_time;
+ res = 1;
+ }
+ }
+ } else {
+ /* correct for segment time. Streams with a negative applied_rate
+ * have timestamps between start and stop, as usual, but have the
+ * time member starting high and going backwards. */
+ /* cannot continue without a known segment stop */
+ if (G_UNLIKELY (stop == -1))
+ return 0;
+ if (G_UNLIKELY (position > stop)) {
+ *stream_time = position - stop;
+ if (G_UNLIKELY (abs_applied_rate != 1.0))
+ *stream_time *= abs_applied_rate;
+ if (*stream_time > time) {
+ *stream_time -= time;
+ res = -1;
+ } else {
+ *stream_time = time - *stream_time;
+ res = 1;
+ }
+ } else {
+ *stream_time = stop - position;
+ if (G_UNLIKELY (abs_applied_rate != 1.0))
+ *stream_time *= abs_applied_rate;
+ *stream_time += time;
+ res = 1;
+ }
+ }
+
+ return res;
+}
+
+/**
* gst_segment_to_stream_time:
* @segment: a #GstSegment structure.
* @format: the format of the segment.
@@ -393,65 +501,194 @@
*
* Returns: the position in stream_time or -1 when an invalid position
* was given.
+ *
+ * Since: 1.8
*/
guint64
gst_segment_to_stream_time (const GstSegment * segment, GstFormat format,
guint64 position)
{
- guint64 stream_time, start, stop, time;
- gdouble abs_applied_rate;
-
- /* format does not matter for -1 */
- if (G_UNLIKELY (position == -1))
- return -1;
+ guint64 result;
g_return_val_if_fail (segment != NULL, -1);
g_return_val_if_fail (segment->format == format, -1);
- stop = segment->stop;
-
- /* outside of the segment boundary stop */
- if (G_UNLIKELY (stop != -1 && position > stop))
+ /* before the segment boundary */
+ if (G_UNLIKELY (position < segment->start)) {
+ GST_DEBUG ("position(%" G_GUINT64_FORMAT ") < start(%" G_GUINT64_FORMAT
+ ")", position, segment->start);
return -1;
+ }
+ /* after the segment boundary */
+ if (G_UNLIKELY (segment->stop != -1 && position > segment->stop)) {
+ GST_DEBUG ("position(%" G_GUINT64_FORMAT ") > stop(%" G_GUINT64_FORMAT
+ ")", position, segment->stop);
+ return -1;
+ }
+
+ if (gst_segment_to_stream_time_full (segment, format, position, &result) == 1)
+ return result;
+
+ return -1;
+}
+
+/**
+ * gst_segment_position_from_stream_time_full:
+ * @segment: a #GstSegment structure.
+ * @format: the format of the segment.
+ * @stream_time: the stream-time
+ * @position: the resulting position in the segment
+ *
+ * Translate @stream_time to the segment position using the currently configured
+ * segment. Compared to gst_segment_position_from_stream_time() this function can
+ * return negative segment position.
+ *
+ * This function is typically used by elements that need to synchronize buffers
+ * against the clock or each other.
+ *
+ * @stream_time can be any value and the result of this function for values outside
+ * of the segment is extrapolated.
+ *
+ * When 1 is returned, @stream_time resulted in a positive position returned
+ * in @position.
+ *
+ * When this function returns -1, the returned @position should be negated
+ * to get the real negative segment position.
+ *
+ * Returns: a 1 or -1 on success, 0 on failure.
+ *
+ * Since: 1.8
+ */
+gint
+gst_segment_position_from_stream_time_full (const GstSegment * segment,
+ GstFormat format, guint64 stream_time, guint64 * position)
+{
+ guint64 start, time;
+ gdouble abs_applied_rate;
+ gint res;
+
+ /* format does not matter for -1 */
+ if (G_UNLIKELY (stream_time == -1)) {
+ *position = -1;
+ return 0;
+ }
+
+ g_return_val_if_fail (segment != NULL, -1);
+ g_return_val_if_fail (segment->format == format, -1);
start = segment->start;
-
- /* before the segment boundary */
- if (G_UNLIKELY (position < start))
- return -1;
-
time = segment->time;
/* time must be known */
if (G_UNLIKELY (time == -1))
- return -1;
+ return 0;
abs_applied_rate = ABS (segment->applied_rate);
- /* add or subtract from segment time based on applied rate */
if (G_LIKELY (segment->applied_rate > 0.0)) {
- if (G_UNLIKELY (position < start))
- return -1;
- /* bring to uncorrected position in segment */
- stream_time = position - start;
+ if (G_LIKELY (stream_time > time)) {
+ res = 1;
+ *position = stream_time - time;
+ } else {
+ res = -1;
+ *position = time - stream_time;
+ }
/* correct for applied rate if needed */
if (G_UNLIKELY (abs_applied_rate != 1.0))
- stream_time *= abs_applied_rate;
- /* correct for segment time */
- stream_time += time;
+ *position /= abs_applied_rate;
+
+ if (G_UNLIKELY (res == -1)) {
+ if (*position > start) {
+ *position -= start;
+ } else {
+ *position = start - *position;
+ res = 1;
+ }
+ } else {
+ *position += start;
+ }
} else {
- /* correct for segment time, clamp at 0. Streams with a negative
- * applied_rate have timestamps between start and stop, as usual, but have
- * the time member starting high and going backwards. */
- if (G_UNLIKELY (position > stop))
- return -1;
- stream_time = stop - position;
+ GstClockTime stop = segment->stop;
+ /* cannot continue without a known segment stop */
+ if (G_UNLIKELY (stop == -1))
+ return 0;
+ if (G_UNLIKELY (time > stream_time)) {
+ res = -1;
+ *position = time - stream_time;
+ } else {
+ res = 1;
+ *position = stream_time - time;
+ }
if (G_UNLIKELY (abs_applied_rate != 1.0))
- stream_time *= abs_applied_rate;
- stream_time += time;
+ *position /= abs_applied_rate;
+ if (G_UNLIKELY (stop < *position)) {
+ if (G_LIKELY (res == 1)) {
+ *position -= stop;
+ res = -1;
+ } else {
+ *position += stop;
+ res = 1;
+ }
+ } else {
+ if (G_LIKELY (res == 1)) {
+ *position = stop - *position;
+ res = 1;
+ } else {
+ *position += stop;
+ res = 1;
+ }
+ }
}
- return stream_time;
+ return res;
+}
+
+/**
+ * gst_segment_position_from_stream_time:
+ * @segment: a #GstSegment structure.
+ * @format: the format of the segment.
+ * @stream_time: the stream_time in the segment
+ *
+ * Convert @stream_time into a position in the segment so that
+ * gst_segment_to_stream_time() with that position returns @stream_time.
+ *
+ * Returns: the position in the segment for @stream_time. This function returns
+ * -1 when @stream_time is -1 or when it is not inside @segment.
+ *
+ * Since: 1.8
+ */
+guint64
+gst_segment_position_from_stream_time (const GstSegment * segment,
+ GstFormat format, guint64 stream_time)
+{
+ guint64 position;
+ gint res;
+
+ g_return_val_if_fail (segment != NULL, -1);
+ g_return_val_if_fail (segment->format == format, -1);
+
+ res =
+ gst_segment_position_from_stream_time_full (segment, format, stream_time,
+ &position);
+
+ /* before the segment boundary */
+ if (G_UNLIKELY (position < segment->start)) {
+ GST_DEBUG ("position(%" G_GUINT64_FORMAT ") < start(%" G_GUINT64_FORMAT
+ ")", position, segment->start);
+ return -1;
+ }
+
+ /* after the segment boundary */
+ if (G_UNLIKELY (segment->stop != -1 && position > segment->stop)) {
+ GST_DEBUG ("position(%" G_GUINT64_FORMAT ") > stop(%" G_GUINT64_FORMAT
+ ")", position, segment->stop);
+ return -1;
+ }
+
+ if (res == 1)
+ return position;
+
+ return -1;
}
/**
@@ -679,6 +916,154 @@
}
/**
+ * gst_segment_position_from_running_time:
+ * @segment: a #GstSegment structure.
+ * @format: the format of the segment.
+ * @running_time: the running_time in the segment
+ *
+ * Convert @running_time into a position in the segment so that
+ * gst_segment_to_running_time() with that position returns @running_time.
+ *
+ * Returns: the position in the segment for @running_time. This function returns
+ * -1 when @running_time is -1 or when it is not inside @segment.
+ *
+ * Since: 1.8
+ */
+guint64
+gst_segment_position_from_running_time (const GstSegment * segment,
+ GstFormat format, guint64 running_time)
+{
+ guint64 position;
+ gint res;
+
+ g_return_val_if_fail (segment != NULL, -1);
+ g_return_val_if_fail (segment->format == format, -1);
+
+ res =
+ gst_segment_position_from_running_time_full (segment, format,
+ running_time, &position);
+
+ if (res != 1)
+ return -1;
+
+ /* before the segment boundary */
+ if (G_UNLIKELY (position < segment->start)) {
+ GST_DEBUG ("position(%" G_GUINT64_FORMAT ") < start(%" G_GUINT64_FORMAT
+ ")", position, segment->start);
+ return -1;
+ }
+
+ /* after the segment boundary */
+ if (G_UNLIKELY (segment->stop != -1 && position > segment->stop)) {
+ GST_DEBUG ("position(%" G_GUINT64_FORMAT ") > stop(%" G_GUINT64_FORMAT
+ ")", position, segment->stop);
+ return -1;
+ }
+
+ return position;
+}
+
+/**
+ * gst_segment_position_from_running_time_full:
+ * @segment: a #GstSegment structure.
+ * @format: the format of the segment.
+ * @running_time: the running-time
+ * @position: the resulting position in the segment
+ *
+ * Translate @running_time to the segment position using the currently configured
+ * segment. Compared to gst_segment_position_from_running_time() this function can
+ * return negative segment position.
+ *
+ * This function is typically used by elements that need to synchronize buffers
+ * against the clock or each other.
+ *
+ * @running_time can be any value and the result of this function for values
+ * outside of the segment is extrapolated.
+ *
+ * When 1 is returned, @running_time resulted in a positive position returned
+ * in @position.
+ *
+ * When this function returns -1, the returned @position should be negated
+ * to get the real negative segment position.
+ *
+ * Returns: a 1 or -1 on success, 0 on failure.
+ *
+ * Since: 1.8
+ */
+gint
+gst_segment_position_from_running_time_full (const GstSegment * segment,
+ GstFormat format, guint64 running_time, guint64 * position)
+{
+ gint res;
+ guint64 start, stop, base;
+ gdouble abs_rate;
+
+ if (G_UNLIKELY (running_time == -1)) {
+ *position = -1;
+ return 0;
+ }
+
+ g_return_val_if_fail (segment != NULL, 0);
+ g_return_val_if_fail (segment->format == format, 0);
+
+ base = segment->base;
+
+ abs_rate = ABS (segment->rate);
+
+ start = segment->start;
+ stop = segment->stop;
+
+ if (G_LIKELY (segment->rate > 0.0)) {
+ /* start by subtracting the base time */
+ if (G_LIKELY (running_time >= base)) {
+ *position = running_time - base;
+ /* move into the segment at the right rate */
+ if (G_UNLIKELY (abs_rate != 1.0))
+ *position = ceil (*position * abs_rate);
+ /* bring to corrected position in segment */
+ *position += start + segment->offset;
+ res = 1;
+ } else {
+ *position = base - running_time;
+ if (G_UNLIKELY (abs_rate != 1.0))
+ *position = ceil (*position * abs_rate);
+ if (start + segment->offset > *position) {
+ *position -= start + segment->offset;
+ res = -1;
+ } else {
+ *position = start + segment->offset - *position;
+ res = 1;
+ }
+ }
+ } else {
+ if (G_LIKELY (running_time >= base)) {
+ *position = running_time - base;
+ if (G_UNLIKELY (abs_rate != 1.0))
+ *position = ceil (*position * abs_rate);
+ if (G_UNLIKELY (stop < *position + segment->offset)) {
+ *position += segment->offset - stop;
+ res = -1;
+ } else {
+ *position = stop - *position - segment->offset;
+ res = 1;
+ }
+ } else {
+ *position = base - running_time;
+ if (G_UNLIKELY (abs_rate != 1.0))
+ *position = ceil (*position * abs_rate);
+ if (G_UNLIKELY (stop < segment->offset - *position)) {
+ *position -= segment->offset - stop;
+ res = -1;
+ } else {
+ *position = stop + *position - segment->offset;
+ res = 1;
+ }
+ }
+ }
+ return res;
+}
+
+/**
* gst_segment_to_position:
* @segment: a #GstSegment structure.
* @format: the format of the segment.
@@ -689,56 +1074,21 @@
*
* Returns: the position in the segment for @running_time. This function returns
* -1 when @running_time is -1 or when it is not inside @segment.
+ *
+ * Deprecated. Use gst_segment_position_from_running_time() instead.
*/
+#ifndef GST_REMOVE_DEPRECATED
+#ifdef GST_DISABLE_DEPRECATED
+guint64 gst_segment_to_position (const GstSegment * segment, GstFormat format,
+ guint64 running_time);
+#endif
guint64
gst_segment_to_position (const GstSegment * segment, GstFormat format,
guint64 running_time)
{
- guint64 result;
- guint64 start, stop, base;
- gdouble abs_rate;
-
- if (G_UNLIKELY (running_time == -1))
- return -1;
-
- g_return_val_if_fail (segment != NULL, -1);
- g_return_val_if_fail (segment->format == format, FALSE);
-
- base = segment->base;
-
- /* this running_time was for a previous segment */
- if (running_time < base)
- return -1;
-
- /* start by subtracting the base time */
- result = running_time - base;
-
- /* move into the segment at the right rate */
- abs_rate = ABS (segment->rate);
- if (G_UNLIKELY (abs_rate != 1.0))
- result = ceil (result * abs_rate);
-
- start = segment->start;
- stop = segment->stop;
-
- if (G_LIKELY (segment->rate > 0.0)) {
- /* bring to corrected position in segment */
- result += start + segment->offset;
-
- /* outside of the segment boundary stop */
- if (G_UNLIKELY (stop != -1 && result > stop))
- return -1;
- } else {
- /* cannot continue if no stop position set or outside of
- * the segment. */
- if (G_UNLIKELY (stop == -1 || result + start > stop))
- return -1;
-
- /* bring to corrected position in segment */
- result = stop - result - segment->offset;
- }
- return result;
+ return gst_segment_position_from_running_time (segment, format, running_time);
}
+#endif
/**
* gst_segment_set_running_time:
@@ -760,7 +1110,8 @@
guint64 start, stop;
/* start by bringing the running_time into the segment position */
- position = gst_segment_to_position (segment, format, running_time);
+ position =
+ gst_segment_position_from_running_time (segment, format, running_time);
/* we must have a valid position now */
if (G_UNLIKELY (position == -1))
@@ -823,7 +1174,8 @@
/* subtract all from segment.base, remainder in offset */
offset -= segment->base;
segment->base = 0;
- position = gst_segment_to_position (segment, format, offset);
+ position =
+ gst_segment_position_from_running_time (segment, format, offset);
if (position == -1)
return FALSE;
diff --git a/gst/gstsegment.h b/gst/gstsegment.h
index 85aed25..1fcfd4a 100644
--- a/gst/gstsegment.h
+++ b/gst/gstsegment.h
@@ -172,16 +172,17 @@
/**
* GstSegment:
* @flags: flags for this segment
- * @rate: the rate of the segment
+ * @rate: the playback rate of the segment
* @applied_rate: the already applied rate to the segment
* @format: the format of the segment values
- * @base: the base of the segment
- * @offset: the offset to apply to @start or @stop
- * @start: the start of the segment
- * @stop: the stop of the segment
- * @time: the stream time of the segment
- * @position: the position in the segment (used internally by elements
- * such as sources, demuxers or parsers to track progress)
+ * @base: the running time (plus elapsed time, see offset) of the segment start
+ * @offset: the amount (in buffer timestamps) that has already been elapsed in
+ * the segment
+ * @start: the start of the segment in buffer timestamp time (PTS)
+ * @stop: the stop of the segment in buffer timestamp time (PTS)
+ * @time: the stream time of the segment start
+ * @position: the buffer timestamp position in the segment (used internally by
+ * elements such as sources, demuxers or parsers to track progress)
* @duration: the duration of the segment
*
* A helper structure that holds the configured region of
@@ -217,12 +218,19 @@
void gst_segment_init (GstSegment *segment, GstFormat format);
+gint gst_segment_to_stream_time_full (const GstSegment *segment, GstFormat format, guint64 position, guint64 * stream_time);
guint64 gst_segment_to_stream_time (const GstSegment *segment, GstFormat format, guint64 position);
+gint gst_segment_position_from_stream_time_full (const GstSegment * segment, GstFormat format, guint64 stream_time, guint64 * position);
+guint64 gst_segment_position_from_stream_time (const GstSegment * segment, GstFormat format, guint64 stream_time);
guint64 gst_segment_to_running_time (const GstSegment *segment, GstFormat format, guint64 position);
gint gst_segment_to_running_time_full (const GstSegment *segment, GstFormat format, guint64 position,
guint64 * running_time);
+#ifndef GST_DISABLE_DEPRECATED
guint64 gst_segment_to_position (const GstSegment *segment, GstFormat format, guint64 running_time);
+#endif
+gint gst_segment_position_from_running_time_full (const GstSegment *segment, GstFormat format, guint64 running_time, guint64 * position);
+guint64 gst_segment_position_from_running_time (const GstSegment *segment, GstFormat format, guint64 running_time);
gboolean gst_segment_set_running_time (GstSegment *segment, GstFormat format, guint64 running_time);
@@ -238,6 +246,10 @@
GstSeekType stop_type, guint64 stop, gboolean * update);
gboolean gst_segment_is_equal (const GstSegment * s0, const GstSegment * s1);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstSegment, gst_segment_free)
+#endif
+
G_END_DECLS
#endif /* __GST_SEGMENT_H__ */
diff --git a/gst/gststructure.h b/gst/gststructure.h
index a2b7926..e746ab0 100644
--- a/gst/gststructure.h
+++ b/gst/gststructure.h
@@ -336,6 +336,10 @@
GstStructure * gst_structure_intersect (const GstStructure * struct1,
const GstStructure * struct2) G_GNUC_MALLOC;
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstStructure, gst_structure_free)
+#endif
+
G_END_DECLS
#endif
diff --git a/gst/gstsystemclock.c b/gst/gstsystemclock.c
index 0527af2..8508166 100644
--- a/gst/gstsystemclock.c
+++ b/gst/gstsystemclock.c
@@ -55,6 +55,10 @@
# endif
#endif /* G_OS_WIN32 */
+#ifdef __APPLE__
+#include <mach/mach_time.h>
+#endif
+
#define GET_ENTRY_STATUS(e) ((GstClockReturn) g_atomic_int_get(&GST_CLOCK_ENTRY_STATUS(e)))
#define SET_ENTRY_STATUS(e,val) (g_atomic_int_set(&GST_CLOCK_ENTRY_STATUS(e),(val)))
#define CAS_ENTRY_STATUS(e,old,val) (g_atomic_int_compare_and_exchange(\
@@ -85,6 +89,9 @@
LARGE_INTEGER start;
LARGE_INTEGER frequency;
#endif /* G_OS_WIN32 */
+#ifdef __APPLE__
+ struct mach_timebase_info mach_timebase;
+#endif
};
#define GST_SYSTEM_CLOCK_GET_PRIVATE(obj) \
@@ -195,6 +202,10 @@
QueryPerformanceCounter (&priv->start);
#endif /* G_OS_WIN32 */
+#ifdef __APPLE__
+ mach_timebase_info (&priv->mach_timebase);
+#endif
+
#if 0
/* Uncomment this to start the async clock thread straight away */
GST_OBJECT_LOCK (clock);
@@ -547,6 +558,12 @@
static GstClockTime
gst_system_clock_get_internal_time (GstClock * clock)
{
+#if defined __APPLE__
+ GstSystemClock *sysclock = GST_SYSTEM_CLOCK_CAST (clock);
+ uint64_t mach_t = mach_absolute_time ();
+ return gst_util_uint64_scale (mach_t, sysclock->priv->mach_timebase.numer,
+ sysclock->priv->mach_timebase.denom);
+#else
#ifdef G_OS_WIN32
GstSystemClock *sysclock = GST_SYSTEM_CLOCK_CAST (clock);
@@ -582,11 +599,17 @@
return GST_TIMESPEC_TO_TIME (ts);
}
#endif
+#endif /* __APPLE__ */
}
static guint64
gst_system_clock_get_resolution (GstClock * clock)
{
+#if defined __APPLE__
+ GstSystemClock *sysclock = GST_SYSTEM_CLOCK_CAST (clock);
+ return gst_util_uint64_scale (GST_NSECOND,
+ sysclock->priv->mach_timebase.numer, sysclock->priv->mach_timebase.denom);
+#else
#ifdef G_OS_WIN32
GstSystemClock *sysclock = GST_SYSTEM_CLOCK_CAST (clock);
@@ -612,6 +635,7 @@
return 1 * GST_USECOND;
}
#endif
+#endif /* __APPLE__ */
}
/* synchronously wait on the given GstClockEntry.
diff --git a/gst/gstsystemclock.h b/gst/gstsystemclock.h
index c142708..02105ee 100644
--- a/gst/gstsystemclock.h
+++ b/gst/gstsystemclock.h
@@ -83,6 +83,10 @@
GstClock* gst_system_clock_obtain (void);
void gst_system_clock_set_default (GstClock *new_clock);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstSystemClock, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_SYSTEM_CLOCK_H__ */
diff --git a/gst/gsttaglist.c b/gst/gsttaglist.c
index 5b644dc..8018dda 100644
--- a/gst/gsttaglist.c
+++ b/gst/gsttaglist.c
@@ -401,6 +401,10 @@
gst_tag_register_static (GST_TAG_MIDI_BASE_NOTE, GST_TAG_FLAG_META,
G_TYPE_UINT,
_("midi-base-note"), _("Midi note number of the audio track."), NULL);
+ gst_tag_register_static (GST_TAG_PRIVATE_DATA, GST_TAG_FLAG_META,
+ GST_TYPE_SAMPLE,
+ _("private-data"), _("Private data"), gst_tag_merge_use_first);
+
}
/**
diff --git a/gst/gsttaglist.h b/gst/gsttaglist.h
index 42f944b..21ff06d 100644
--- a/gst/gsttaglist.h
+++ b/gst/gsttaglist.h
@@ -389,10 +389,6 @@
*
* Returns: the same #GstTagList mini object.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstTagList * gst_tag_list_ref (GstTagList * taglist);
-#endif
-
static inline GstTagList *
gst_tag_list_ref (GstTagList * taglist)
{
@@ -405,10 +401,6 @@
*
* Unref a #GstTagList, and and free all its memory when the refcount reaches 0.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_tag_list_unref (GstTagList * taglist);
-#endif
-
static inline void
gst_tag_list_unref (GstTagList * taglist)
{
@@ -431,10 +423,6 @@
*
* Returns: the new #GstTagList
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstTagList * gst_tag_list_copy (const GstTagList * taglist);
-#endif
-
static inline GstTagList *
gst_tag_list_copy (const GstTagList * taglist)
{
@@ -1072,6 +1060,27 @@
* Since: 1.4
*/
#define GST_TAG_MIDI_BASE_NOTE "midi-base-note"
+/**
+ * GST_TAG_PRIVATE_DATA:
+ *
+ * Any private data that may be contained in tags (sample).
+ *
+ * It is represented by #GstSample in which #GstBuffer contains the
+ * binary data and the sample's info #GstStructure may contain any
+ * extra information that identifies the origin or meaning of the data.
+ *
+ * Private frames in ID3v2 tags ('PRIV' frames) will be represented
+ * using this tag, in which case the GstStructure will be named
+ * "ID3PrivateFrame" and contain a field named "owner" of type string
+ * which contains the owner-identification string from the tag.
+ *
+ * Since: 1.8
+ */
+#define GST_TAG_PRIVATE_DATA "private-data"
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTagList, gst_tag_list_unref)
+#endif
G_END_DECLS
diff --git a/gst/gsttask.h b/gst/gsttask.h
index 85117ff..c56cf5e 100644
--- a/gst/gsttask.h
+++ b/gst/gsttask.h
@@ -194,6 +194,10 @@
gboolean gst_task_join (GstTask *task);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTask, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_TASK_H__ */
diff --git a/gst/gsttaskpool.h b/gst/gsttaskpool.h
index a1195dc..f8927c5 100644
--- a/gst/gsttaskpool.h
+++ b/gst/gsttaskpool.h
@@ -96,6 +96,10 @@
void gst_task_pool_cleanup (GstTaskPool *pool);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTaskPool, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_TASK_POOL_H__ */
diff --git a/gst/gsttoc.h b/gst/gsttoc.h
index cb77862..68f3a35 100644
--- a/gst/gsttoc.h
+++ b/gst/gsttoc.h
@@ -184,6 +184,23 @@
const gchar * gst_toc_entry_type_get_nick (GstTocEntryType type);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+static inline void
+_gst_autoptr_toc_unref (GstToc *toc)
+{
+ gst_toc_unref (toc);
+}
+
+static inline void
+_gst_autoptr_toc_entry_unref (GstTocEntry *entry)
+{
+ gst_toc_entry_unref (entry);
+}
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstToc, _gst_autoptr_toc_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTocEntry, _gst_autoptr_toc_entry_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_TOC_H__ */
diff --git a/gst/gsttrace.c b/gst/gsttrace.c
index 4087929..7cb0a3d 100644
--- a/gst/gsttrace.c
+++ b/gst/gsttrace.c
@@ -165,6 +165,20 @@
if (type == GST_TYPE_CAPS) {
extra = gst_caps_to_string (data);
+ } else if (type == GST_TYPE_EVENT) {
+ const GstStructure *s = gst_event_get_structure (data);
+
+ if (s == NULL)
+ extra = g_strdup_printf ("%s", GST_EVENT_TYPE_NAME (data));
+ else
+ extra = gst_structure_to_string (s);
+ } else if (type == GST_TYPE_MESSAGE) {
+ const GstStructure *s = gst_message_get_structure (data);
+
+ if (s == NULL)
+ extra = g_strdup_printf ("%s", GST_MESSAGE_TYPE_NAME (data));
+ else
+ extra = gst_structure_to_string (s);
}
refcount = GST_MINI_OBJECT_REFCOUNT_VALUE (data);
}
diff --git a/gst/gsttracer.c b/gst/gsttracer.c
new file mode 100644
index 0000000..668b98a
--- /dev/null
+++ b/gst/gsttracer.c
@@ -0,0 +1,207 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gsttracer.c: tracer base class
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * SECTION:gsttracer
+ * @short_description: Tracing base class
+ *
+ * Tracing modules will subclass #GstTracer and register through
+ * gst_tracer_register(). Modules can attach to various hook-types - see
+ * #GstTracerHook. When invoked they receive hook specific contextual data,
+ * which they must not modify.
+ */
+
+#define GST_USE_UNSTABLE_API
+
+#include "gst_private.h"
+#include "gstenumtypes.h"
+#include "gsttracer.h"
+#include "gsttracerfactory.h"
+
+GST_DEBUG_CATEGORY_EXTERN (tracer_debug);
+#define GST_CAT_DEFAULT tracer_debug
+
+/* tracing plugins base class */
+
+enum
+{
+ PROP_0,
+ PROP_PARAMS,
+ PROP_LAST
+};
+
+static GParamSpec *properties[PROP_LAST];
+
+static void gst_tracer_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_tracer_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
+struct _GstTracerPrivate
+{
+ gchar *params;
+};
+
+#define gst_tracer_parent_class parent_class
+G_DEFINE_ABSTRACT_TYPE (GstTracer, gst_tracer, GST_TYPE_OBJECT);
+
+static void
+gst_tracer_dispose (GObject * object)
+{
+ GstTracer *tracer = GST_TRACER (object);
+ g_free (tracer->priv->params);
+}
+
+static void
+gst_tracer_class_init (GstTracerClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ gobject_class->set_property = gst_tracer_set_property;
+ gobject_class->get_property = gst_tracer_get_property;
+ gobject_class->dispose = gst_tracer_dispose;
+
+ properties[PROP_PARAMS] =
+ g_param_spec_string ("params", "Params", "Extra configuration parameters",
+ NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties (gobject_class, PROP_LAST, properties);
+ g_type_class_add_private (klass, sizeof (GstTracerPrivate));
+}
+
+static void
+gst_tracer_init (GstTracer * tracer)
+{
+ tracer->priv = G_TYPE_INSTANCE_GET_PRIVATE (tracer, GST_TYPE_TRACER,
+ GstTracerPrivate);
+}
+
+static void
+gst_tracer_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstTracer *self = GST_TRACER_CAST (object);
+
+ switch (prop_id) {
+ case PROP_PARAMS:
+ self->priv->params = g_value_dup_string (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_tracer_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+{
+ GstTracer *self = GST_TRACER_CAST (object);
+
+ switch (prop_id) {
+ case PROP_PARAMS:
+ g_value_set_string (value, self->priv->params);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+/* tracing modules */
+
+gboolean
+gst_tracer_register (GstPlugin * plugin, const gchar * name, GType type)
+{
+ GstPluginFeature *existing_feature;
+ GstRegistry *registry;
+ GstTracerFactory *factory;
+
+ g_return_val_if_fail (name != NULL, FALSE);
+ g_return_val_if_fail (g_type_is_a (type, GST_TYPE_TRACER), FALSE);
+
+ registry = gst_registry_get ();
+ /* check if feature already exists, if it exists there is no need to update it
+ * when the registry is getting updated, outdated plugins and all their
+ * features are removed and readded.
+ */
+ existing_feature = gst_registry_lookup_feature (registry, name);
+ if (existing_feature) {
+ GST_DEBUG_OBJECT (registry, "update existing feature %p (%s)",
+ existing_feature, name);
+ factory = GST_TRACER_FACTORY_CAST (existing_feature);
+ factory->type = type;
+ existing_feature->loaded = TRUE;
+ gst_object_unref (existing_feature);
+ return TRUE;
+ }
+
+ factory = g_object_newv (GST_TYPE_TRACER_FACTORY, 0, NULL);
+ GST_DEBUG_OBJECT (factory, "new tracer factory for %s", name);
+
+ gst_plugin_feature_set_name (GST_PLUGIN_FEATURE_CAST (factory), name);
+ gst_plugin_feature_set_rank (GST_PLUGIN_FEATURE_CAST (factory),
+ GST_RANK_NONE);
+
+ factory->type = type;
+ GST_DEBUG_OBJECT (factory, "tracer factory for %u:%s",
+ (guint) type, g_type_name (type));
+
+ if (plugin && plugin->desc.name) {
+ GST_PLUGIN_FEATURE_CAST (factory)->plugin_name = plugin->desc.name; /* interned string */
+ GST_PLUGIN_FEATURE_CAST (factory)->plugin = plugin;
+ g_object_add_weak_pointer ((GObject *) plugin,
+ (gpointer *) & GST_PLUGIN_FEATURE_CAST (factory)->plugin);
+ } else {
+ GST_PLUGIN_FEATURE_CAST (factory)->plugin_name = "NULL";
+ GST_PLUGIN_FEATURE_CAST (factory)->plugin = NULL;
+ }
+ GST_PLUGIN_FEATURE_CAST (factory)->loaded = TRUE;
+
+ gst_registry_add_feature (gst_registry_get (),
+ GST_PLUGIN_FEATURE_CAST (factory));
+
+ return TRUE;
+}
+
+/* tracing module helpers */
+
+void
+gst_tracer_log_trace (GstStructure * s)
+{
+ GST_TRACE ("%" GST_PTR_FORMAT, s);
+ /* expands to:
+ gst_debug_log_valist (
+ GST_CAT_DEFAULT, GST_LEVEL_TRACE,
+ file, func, line, object
+ "%" GST_PTR_FORMAT, s);
+ // does it make sense to use the {file, line, func} from the tracer hook?
+ // a)
+ // - we'd need to pass them in the macros to gst_tracer_dispatch()
+ // - and each tracer needs to grab them from the va_list and pass them here
+ // b)
+ // - we create a content in dispatch, pass that to the tracer
+ // - and the tracer will pass that here
+ // ideally we also use *our* ts instead of the one that
+ // gst_debug_log_default() will pick
+ */
+ gst_structure_free (s);
+}
diff --git a/gst/gsttracer.h b/gst/gsttracer.h
new file mode 100644
index 0000000..a5953f2
--- /dev/null
+++ b/gst/gsttracer.h
@@ -0,0 +1,83 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gsttracer.h: tracer base class
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_TRACER_H__
+#define __GST_TRACER_H__
+
+#ifndef GST_USE_UNSTABLE_API
+#warning "The tracer subsystem is unstable API and may change in future."
+#warning "You can define GST_USE_UNSTABLE_API to avoid this warning."
+#endif
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gst/gstconfig.h>
+#include <gst/gsttracerutils.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstTracer GstTracer;
+typedef struct _GstTracerPrivate GstTracerPrivate;
+typedef struct _GstTracerClass GstTracerClass;
+
+#define GST_TYPE_TRACER (gst_tracer_get_type())
+#define GST_TRACER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TRACER,GstTracer))
+#define GST_TRACER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TRACER,GstTracerClass))
+#define GST_IS_TRACER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TRACER))
+#define GST_IS_TRACER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TRACER))
+#define GST_TRACER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_TRACER,GstTracerClass))
+#define GST_TRACER_CAST(obj) ((GstTracer *)(obj))
+
+struct _GstTracer {
+ GstObject parent;
+ /*< private >*/
+ GstTracerPrivate *priv;
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+struct _GstTracerClass {
+ GstObjectClass parent_class;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+};
+
+GType gst_tracer_get_type (void);
+
+void gst_tracing_register_hook (GstTracer *tracer, const gchar *detail,
+ GCallback func);
+void gst_tracing_register_hook_id (GstTracer *tracer, GQuark detail,
+ GCallback func);
+
+/* tracing modules */
+gboolean gst_tracer_register (GstPlugin * plugin, const gchar * name, GType type);
+
+/* tracing module helpers */
+void gst_tracer_log_trace (GstStructure * s);
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTracer, gst_object_unref)
+#endif
+
+G_END_DECLS
+
+#endif /* __GST_TRACER_H__ */
+
diff --git a/gst/gsttracerfactory.c b/gst/gsttracerfactory.c
new file mode 100644
index 0000000..ec7ba53
--- /dev/null
+++ b/gst/gsttracerfactory.c
@@ -0,0 +1,76 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gsttracerfactory.c: tracing subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * SECTION:gsttracerfactory
+ * @short_description: Information about registered tracer functions
+ *
+ * Use gst_tracer_factory_get_list() to get a list of tracer factories known to
+ * GStreamer.
+ */
+
+#include "gst_private.h"
+#include "gstinfo.h"
+#include "gsttracerfactory.h"
+#include "gstregistry.h"
+
+GST_DEBUG_CATEGORY (tracer_debug);
+#define GST_CAT_DEFAULT tracer_debug
+
+#define _do_init \
+{ \
+ GST_DEBUG_CATEGORY_INIT (tracer_debug, "GST_TRACER", \
+ GST_DEBUG_FG_BLUE, "tracing subsystem"); \
+}
+
+#define gst_tracer_factory_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstTracerFactory, gst_tracer_factory,
+ GST_TYPE_PLUGIN_FEATURE, _do_init);
+
+static void
+gst_tracer_factory_class_init (GstTracerFactoryClass * klass)
+{
+}
+
+static void
+gst_tracer_factory_init (GstTracerFactory * factory)
+{
+}
+
+/**
+ * gst_tracer_factory_get_list:
+ *
+ * Gets the list of all registered tracer factories. You must free the
+ * list using gst_plugin_feature_list_free().
+ *
+ * The returned factories are sorted by factory name.
+ *
+ * Free-function: gst_plugin_feature_list_free
+ *
+ * Returns: (transfer full) (element-type Gst.TracerFactory): the list of all
+ * registered #GstTracerFactory.
+ */
+GList *
+gst_tracer_factory_get_list (void)
+{
+ return gst_registry_get_feature_list (gst_registry_get (),
+ GST_TYPE_TRACER_FACTORY);
+}
diff --git a/gst/gsttracerfactory.h b/gst/gsttracerfactory.h
new file mode 100644
index 0000000..09d357f
--- /dev/null
+++ b/gst/gsttracerfactory.h
@@ -0,0 +1,59 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gsttracerfactory.h: tracing subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_TRACER_FACTORY_H__
+#define __GST_TRACER_FACTORY_H__
+
+#include <gst/gstcaps.h>
+#include <gst/gstplugin.h>
+#include <gst/gstpluginfeature.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_TRACER_FACTORY (gst_tracer_factory_get_type())
+#define GST_TRACER_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TRACER_FACTORY, GstTracerFactory))
+#define GST_IS_TRACER_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TRACER_FACTORY))
+#define GST_TRACER_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_TRACER_FACTORY, GstTracerFactoryClass))
+#define GST_IS_TRACER_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_TRACER_FACTORY))
+#define GST_TRACER_FACTORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_TRACER_FACTORY, GstTracerFactoryClass))
+#define GST_TRACER_FACTORY_CAST(obj) ((GstTracerFactory *)(obj))
+
+/**
+ * GstTracerFactory:
+ *
+ * Opaque object that stores information about a tracer function.
+ */
+typedef struct _GstTracerFactory GstTracerFactory;
+typedef struct _GstTracerFactoryClass GstTracerFactoryClass;
+
+/* tracering interface */
+
+GType gst_tracer_factory_get_type (void);
+GList * gst_tracer_factory_get_list (void);
+
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTracerFactory, gst_object_unref)
+#endif
+
+G_END_DECLS
+
+#endif /* __GST_TRACER_FACTORY_H__ */
diff --git a/gst/gsttracerutils.c b/gst/gsttracerutils.c
new file mode 100644
index 0000000..64c24af
--- /dev/null
+++ b/gst/gsttracerutils.c
@@ -0,0 +1,193 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gsttracerutils.c: tracing subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * SECTION:gsttracerutils
+ * @short_description: Tracing subsystem
+ *
+ * The tracing subsystem provides hooks in the core library and API for modules
+ * to attach to them.
+ *
+ * The user can activate tracers by setting the environment variable GST_TRACE
+ * to a ';' separated list of tracers.
+ */
+
+#define GST_USE_UNSTABLE_API
+
+#include "gst_private.h"
+#include "gsttracer.h"
+#include "gsttracerfactory.h"
+#include "gsttracerutils.h"
+
+#ifndef GST_DISABLE_GST_DEBUG
+
+/* tracer quarks */
+
+/* These strings must match order and number declared in the GstTracerQuarkId
+ * enum in gsttracerutils.h! */
+static const gchar *_quark_strings[] = {
+ "pad-push-pre", "pad-push-post", "pad-push-list-pre", "pad-push-list-post",
+ "pad-pull-range-pre", "pad-pull-range-post", "pad-push-event-pre",
+ "pad-push-event-post", "pad-query-pre", "pad-query-post",
+ "element-post-message-pre",
+ "element-post-message-post", "element-query-pre", "element-query-post",
+ "element-new", "element-add-pad", "element-remove-pad",
+ "bin-add-pre", "bin-add-post", "bin-remove-pre", "bin-remove-post",
+ "pad-link-pre", "pad-link-post", "pad-unlink-pre", "pad-unlink-post",
+ "element-change-state-pre", "element-change-state-post"
+};
+
+GQuark _priv_gst_tracer_quark_table[GST_TRACER_QUARK_MAX];
+
+/* tracing helpers */
+
+gboolean _priv_tracer_enabled = FALSE;
+GHashTable *_priv_tracers = NULL;
+
+/* Initialize the tracing system */
+void
+_priv_gst_tracing_init (void)
+{
+ const gchar *env = g_getenv ("GST_TRACER_PLUGINS");
+
+ if (env != NULL && *env != '\0') {
+ GstRegistry *registry = gst_registry_get ();
+ GstPluginFeature *feature;
+ GstTracerFactory *factory;
+ gchar **t = g_strsplit_set (env, ";", 0);
+ gint i = 0;
+ gchar *params;
+
+ GST_INFO ("enabling tracers: '%s'", env);
+
+ if (G_N_ELEMENTS (_quark_strings) != GST_TRACER_QUARK_MAX)
+ g_warning ("the quark table is not consistent! %d != %d",
+ (gint) G_N_ELEMENTS (_quark_strings), GST_TRACER_QUARK_MAX);
+
+ for (i = 0; i < GST_TRACER_QUARK_MAX; i++) {
+ _priv_gst_tracer_quark_table[i] =
+ g_quark_from_static_string (_quark_strings[i]);
+ }
+
+ _priv_tracers = g_hash_table_new (NULL, NULL);
+
+ i = 0;
+ while (t[i]) {
+ // check t[i] for params
+ if ((params = strchr (t[i], '('))) {
+ gchar *end = strchr (¶ms[1], ')');
+ *params = '\0';
+ params++;
+ if (end)
+ *end = '\0';
+ } else {
+ params = NULL;
+ }
+
+ GST_INFO ("checking tracer: '%s'", t[i]);
+
+ if ((feature = gst_registry_lookup_feature (registry, t[i]))) {
+ factory = GST_TRACER_FACTORY (gst_plugin_feature_load (feature));
+ if (factory) {
+ GST_INFO_OBJECT (factory, "creating tracer: type-id=%u",
+ (guint) factory->type);
+
+ /* tracers register them self to the hooks */
+ gst_object_unref (g_object_new (factory->type, "params", params,
+ NULL));
+ } else {
+ GST_WARNING_OBJECT (feature,
+ "loading plugin containing feature %s failed!", t[i]);
+ }
+ } else {
+ GST_WARNING ("no tracer named '%s'", t[i]);
+ }
+ i++;
+ }
+ g_strfreev (t);
+ }
+}
+
+void
+_priv_gst_tracing_deinit (void)
+{
+ GList *h_list, *h_node, *t_node;
+ GstTracerHook *hook;
+
+ _priv_tracer_enabled = FALSE;
+ if (!_priv_tracers)
+ return;
+
+ /* shutdown tracers for final reports */
+ h_list = g_hash_table_get_values (_priv_tracers);
+ for (h_node = h_list; h_node; h_node = g_list_next (h_node)) {
+ for (t_node = h_node->data; t_node; t_node = g_list_next (t_node)) {
+ hook = (GstTracerHook *) t_node->data;
+ gst_object_unref (hook->tracer);
+ g_slice_free (GstTracerHook, hook);
+ }
+ g_list_free (h_node->data);
+ }
+ g_list_free (h_list);
+ g_hash_table_destroy (_priv_tracers);
+ _priv_tracers = NULL;
+}
+
+/**
+ * gst_tracing_register_hook_id:
+ * @tracer: the tracer
+ * @detail: the detailed hook
+ * @func: (scope async): the callback
+ *
+ * Register @func to be called when the trace hook @detail is getting invoked.
+ */
+void
+gst_tracing_register_hook_id (GstTracer * tracer, GQuark detail, GCallback func)
+{
+ gpointer key = GINT_TO_POINTER (detail);
+ GList *list = g_hash_table_lookup (_priv_tracers, key);
+ GstTracerHook *hook = g_slice_new0 (GstTracerHook);
+ hook->tracer = gst_object_ref (tracer);
+ hook->func = func;
+
+ list = g_list_prepend (list, hook);
+ g_hash_table_replace (_priv_tracers, key, list);
+ GST_DEBUG ("registering tracer for '%s', list.len=%d",
+ (detail ? g_quark_to_string (detail) : "*"), g_list_length (list));
+ _priv_tracer_enabled = TRUE;
+}
+
+/**
+ * gst_tracing_register_hook:
+ * @tracer: the tracer
+ * @detail: the detailed hook
+ * @func: (scope async): the callback
+ *
+ * Register @func to be called when the trace hook @detail is getting invoked.
+ */
+void
+gst_tracing_register_hook (GstTracer * tracer, const gchar * detail,
+ GCallback func)
+{
+ gst_tracing_register_hook_id (tracer, g_quark_try_string (detail), func);
+}
+
+#endif /* GST_DISABLE_GST_DEBUG */
diff --git a/gst/gsttracerutils.h b/gst/gsttracerutils.h
new file mode 100644
index 0000000..52c9a37
--- /dev/null
+++ b/gst/gsttracerutils.h
@@ -0,0 +1,341 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gsttracerutils.h: tracing subsystem
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+
+#ifndef __GST_TRACER_UTILS_H__
+#define __GST_TRACER_UTILS_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gst/gstconfig.h>
+#include <gst/gstbin.h>
+
+G_BEGIN_DECLS
+
+#ifndef GST_DISABLE_GST_DEBUG
+
+/* tracing hooks */
+
+void _priv_gst_tracing_init (void);
+void _priv_gst_tracing_deinit (void);
+
+/* tracer quarks */
+
+/* These enums need to match the number and order
+ * of strings declared in _quark_table, in gsttracerutils.c */
+typedef enum /*< skip >*/
+{
+ GST_TRACER_QUARK_HOOK_PAD_PUSH_PRE = 0,
+ GST_TRACER_QUARK_HOOK_PAD_PUSH_POST,
+ GST_TRACER_QUARK_HOOK_PAD_PUSH_LIST_PRE,
+ GST_TRACER_QUARK_HOOK_PAD_PUSH_LIST_POST,
+ GST_TRACER_QUARK_HOOK_PAD_PULL_RANGE_PRE,
+ GST_TRACER_QUARK_HOOK_PAD_PULL_RANGE_POST,
+ GST_TRACER_QUARK_HOOK_PAD_PUSH_EVENT_PRE ,
+ GST_TRACER_QUARK_HOOK_PAD_PUSH_EVENT_POST,
+ GST_TRACER_QUARK_HOOK_PAD_QUERY_PRE ,
+ GST_TRACER_QUARK_HOOK_PAD_QUERY_POST,
+ GST_TRACER_QUARK_HOOK_ELEMENT_POST_MESSAGE_PRE,
+ GST_TRACER_QUARK_HOOK_ELEMENT_POST_MESSAGE_POST,
+ GST_TRACER_QUARK_HOOK_ELEMENT_QUERY_PRE,
+ GST_TRACER_QUARK_HOOK_ELEMENT_QUERY_POST,
+ GST_TRACER_QUARK_HOOK_ELEMENT_NEW,
+ GST_TRACER_QUARK_HOOK_ELEMENT_ADD_PAD,
+ GST_TRACER_QUARK_HOOK_ELEMENT_REMOVE_PAD,
+ GST_TRACER_QUARK_HOOK_BIN_ADD_PRE,
+ GST_TRACER_QUARK_HOOK_BIN_ADD_POST,
+ GST_TRACER_QUARK_HOOK_BIN_REMOVE_PRE,
+ GST_TRACER_QUARK_HOOK_BIN_REMOVE_POST,
+ GST_TRACER_QUARK_HOOK_PAD_LINK_PRE,
+ GST_TRACER_QUARK_HOOK_PAD_LINK_POST,
+ GST_TRACER_QUARK_HOOK_PAD_UNLINK_PRE,
+ GST_TRACER_QUARK_HOOK_PAD_UNLINK_POST,
+ GST_TRACER_QUARK_HOOK_ELEMENT_CHANGE_STATE_PRE,
+ GST_TRACER_QUARK_HOOK_ELEMENT_CHANGE_STATE_POST,
+ GST_TRACER_QUARK_MAX
+} GstTracerQuarkId;
+
+extern GQuark _priv_gst_tracer_quark_table[GST_TRACER_QUARK_MAX];
+
+#define GST_TRACER_QUARK(q) _priv_gst_tracer_quark_table[GST_TRACER_QUARK_##q]
+
+/* tracing module helpers */
+
+typedef struct {
+ GObject *tracer;
+ GCallback func;
+} GstTracerHook;
+
+extern gboolean _priv_tracer_enabled;
+/* key are hook-id quarks, values are GstTracerHook */
+extern GHashTable *_priv_tracers;
+
+#define GST_TRACER_IS_ENABLED (_priv_tracer_enabled)
+
+#define GST_TRACER_TS \
+ GST_CLOCK_DIFF (_priv_gst_info_start_time, gst_util_get_timestamp ())
+
+/* tracing hooks */
+
+#define GST_TRACER_ARGS h->tracer, ts
+#define GST_TRACER_DISPATCH(key,type,args) G_STMT_START{ \
+ if (GST_TRACER_IS_ENABLED) { \
+ GstClockTime ts = GST_TRACER_TS; \
+ GList *__l, *__n; \
+ GstTracerHook *h; \
+ __l = g_hash_table_lookup (_priv_tracers, GINT_TO_POINTER (key)); \
+ for (__n = __l; __n; __n = g_list_next (__n)) { \
+ h = (GstTracerHook *) __n->data; \
+ ((type)(h->func)) args; \
+ } \
+ __l = g_hash_table_lookup (_priv_tracers, NULL); \
+ for (__n = __l; __n; __n = g_list_next (__n)) { \
+ h = (GstTracerHook *) __n->data; \
+ ((type)(h->func)) args; \
+ } \
+ } \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadPushPre) (GObject *, GstClockTime, GstPad *,
+ GstBuffer *);
+#define GST_TRACER_PAD_PUSH_PRE(pad, buffer) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_PRE), \
+ GstTracerHookPadPushPre, (GST_TRACER_ARGS, pad, buffer)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadPushPost) (GObject *, GstClockTime, GstPad *,
+ GstFlowReturn);
+#define GST_TRACER_PAD_PUSH_POST(pad, res) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_POST), \
+ GstTracerHookPadPushPost, (GST_TRACER_ARGS, pad, res)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadPushListPre) (GObject *, GstClockTime, GstPad *,
+ GstBufferList *);
+#define GST_TRACER_PAD_PUSH_LIST_PRE(pad, list) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_LIST_PRE), \
+ GstTracerHookPadPushListPre, (GST_TRACER_ARGS, pad, list)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadPushListPost) (GObject *, GstClockTime, GstPad *,
+ GstFlowReturn);
+#define GST_TRACER_PAD_PUSH_LIST_POST(pad, res) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_LIST_POST), \
+ GstTracerHookPadPushListPost, (GST_TRACER_ARGS, pad, res)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadPullRangePre) (GObject *, GstClockTime, GstPad *,
+ guint64, guint);
+#define GST_TRACER_PAD_PULL_RANGE_PRE(pad, offset, size) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PULL_RANGE_PRE), \
+ GstTracerHookPadPullRangePre, (GST_TRACER_ARGS, pad, offset, size)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadPullRangePost) (GObject *, GstClockTime,
+ GstPad *, GstBuffer *, GstFlowReturn);
+#define GST_TRACER_PAD_PULL_RANGE_POST(pad, buffer, res) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PULL_RANGE_POST), \
+ GstTracerHookPadPullRangePost, (GST_TRACER_ARGS, pad, buffer, res)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadPushEventPre) (GObject *, GstClockTime, GstPad *,
+ GstEvent *);
+#define GST_TRACER_PAD_PUSH_EVENT_PRE(pad, event) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_EVENT_PRE), \
+ GstTracerHookPadPushEventPre, (GST_TRACER_ARGS, pad, event)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadPushEventPost) (GObject *, GstClockTime,
+ GstPad *, gboolean);
+#define GST_TRACER_PAD_PUSH_EVENT_POST(pad, res) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_PUSH_EVENT_POST), \
+ GstTracerHookPadPushEventPost, (GST_TRACER_ARGS, pad, res)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadQueryPre) (GObject *, GstClockTime, GstPad *,
+ GstQuery *);
+#define GST_TRACER_PAD_QUERY_PRE(pad, query) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_QUERY_PRE), \
+ GstTracerHookPadQueryPre, (GST_TRACER_ARGS, pad, query)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadQueryPost) (GObject *, GstClockTime,
+ GstPad *, gboolean, GstQuery *);
+#define GST_TRACER_PAD_QUERY_POST(pad, res, query) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_QUERY_POST), \
+ GstTracerHookPadQueryPost, (GST_TRACER_ARGS, pad, res, query)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookElementPostMessagePre) (GObject *, GstClockTime,
+ GstElement *, GstMessage *);
+#define GST_TRACER_ELEMENT_POST_MESSAGE_PRE(element, message) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_POST_MESSAGE_PRE), \
+ GstTracerHookElementPostMessagePre, (GST_TRACER_ARGS, element, message)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookElementPostMessagePost) (GObject *, GstClockTime,
+ GstElement *, gboolean);
+#define GST_TRACER_ELEMENT_POST_MESSAGE_POST(element, res) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_POST_MESSAGE_POST), \
+ GstTracerHookElementPostMessagePost, (GST_TRACER_ARGS, element, res)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookElementQueryPre) (GObject *, GstClockTime,
+ GstElement *, GstQuery *);
+#define GST_TRACER_ELEMENT_QUERY_PRE(element, query) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_QUERY_PRE), \
+ GstTracerHookElementQueryPre, (GST_TRACER_ARGS, element, query)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookElementQueryPost) (GObject *, GstClockTime,
+ GstElement *, gboolean);
+#define GST_TRACER_ELEMENT_QUERY_POST(element, res) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_QUERY_POST), \
+ GstTracerHookElementQueryPost, (GST_TRACER_ARGS, element, res)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookElementNew) (GObject *, GstClockTime,
+ GstElement *);
+#define GST_TRACER_ELEMENT_NEW(element) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_NEW), \
+ GstTracerHookElementNew, (GST_TRACER_ARGS, element)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookElementAddPad) (GObject *, GstClockTime,
+ GstElement *, GstPad *);
+#define GST_TRACER_ELEMENT_ADD_PAD(element, pad) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_ADD_PAD), \
+ GstTracerHookElementAddPad, (GST_TRACER_ARGS, element, pad)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookElementRemovePad) (GObject *, GstClockTime,
+ GstElement *, GstPad *);
+#define GST_TRACER_ELEMENT_REMOVE_PAD(element, pad) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_REMOVE_PAD), \
+ GstTracerHookElementRemovePad, (GST_TRACER_ARGS, element, pad)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookElementChangeStatePre) (GObject *, GstClockTime,
+ GstElement *, GstStateChange);
+#define GST_TRACER_ELEMENT_CHANGE_STATE_PRE(element, transition) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_CHANGE_STATE_PRE), \
+ GstTracerHookElementChangeStatePre, (GST_TRACER_ARGS, element, transition)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookElementChangeStatePost) (GObject *, GstClockTime,
+ GstElement *, GstStateChange, GstStateChangeReturn);
+#define GST_TRACER_ELEMENT_CHANGE_STATE_POST(element, transition, result) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_CHANGE_STATE_POST), \
+ GstTracerHookElementChangeStatePost, (GST_TRACER_ARGS, element, transition, result)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookBinAddPre) (GObject *, GstClockTime,
+ GstBin *, GstElement *);
+#define GST_TRACER_BIN_ADD_PRE(bin, element) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_BIN_ADD_PRE), \
+ GstTracerHookBinAddPre, (GST_TRACER_ARGS, bin, element)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookBinAddPost) (GObject *, GstClockTime,
+ GstBin *, GstElement *, gboolean);
+#define GST_TRACER_BIN_ADD_POST(bin, element, result) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_BIN_ADD_POST), \
+ GstTracerHookBinAddPost, (GST_TRACER_ARGS, bin, element, result)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookBinRemovePre) (GObject *, GstClockTime,
+ GstBin *, GstElement *);
+#define GST_TRACER_BIN_REMOVE_PRE(bin, element) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_BIN_REMOVE_PRE), \
+ GstTracerHookBinRemovePre, (GST_TRACER_ARGS, bin, element)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookBinRemovePost) (GObject *, GstClockTime,
+ GstBin *, gboolean);
+#define GST_TRACER_BIN_REMOVE_POST(bin, result) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_BIN_REMOVE_POST), \
+ GstTracerHookBinRemovePost, (GST_TRACER_ARGS, bin, result)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadLinkPre) (GObject *, GstClockTime,
+ GstPad *, GstPad *);
+#define GST_TRACER_PAD_LINK_PRE(srcpad, sinkpad) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_LINK_PRE), \
+ GstTracerHookPadLinkPre, (GST_TRACER_ARGS, srcpad, sinkpad)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadLinkPost) (GObject *, GstClockTime,
+ GstPad *, GstPad *, GstPadLinkReturn);
+#define GST_TRACER_PAD_LINK_POST(srcpad, sinkpad, result) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_LINK_POST), \
+ GstTracerHookPadLinkPost, (GST_TRACER_ARGS, srcpad, sinkpad, result)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadUnlinkPre) (GObject *, GstClockTime,
+ GstPad *, GstPad *);
+#define GST_TRACER_PAD_UNLINK_PRE(srcpad, sinkpad) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_UNLINK_PRE), \
+ GstTracerHookPadUnlinkPre, (GST_TRACER_ARGS, srcpad, sinkpad)); \
+}G_STMT_END
+
+typedef void (*GstTracerHookPadUnlinkPost) (GObject *, GstClockTime,
+ GstPad *, GstPad *, gboolean);
+#define GST_TRACER_PAD_UNLINK_POST(srcpad, sinkpad, result) G_STMT_START{ \
+ GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_UNLINK_POST), \
+ GstTracerHookPadUnlinkPost, (GST_TRACER_ARGS, srcpad, sinkpad, result)); \
+}G_STMT_END
+
+#else /* !GST_DISABLE_GST_DEBUG */
+
+#define GST_TRACER_PAD_PUSH_PRE(pad, buffer)
+#define GST_TRACER_PAD_PUSH_POST(pad, res)
+#define GST_TRACER_PAD_PUSH_LIST_PRE(pad, list)
+#define GST_TRACER_PAD_PUSH_LIST_POST(pad, res)
+#define GST_TRACER_PAD_PULL_RANGE_PRE(pad, offset, size)
+#define GST_TRACER_PAD_PULL_RANGE_POST(pad, buffer, res)
+#define GST_TRACER_PAD_PUSH_EVENT_PRE(pad, event)
+#define GST_TRACER_PAD_PUSH_EVENT_POST(pad, res)
+#define GST_TRACER_PAD_QUERY_PRE(pad, query)
+#define GST_TRACER_PAD_QUERY_POST(pad, res, query)
+#define GST_TRACER_ELEMENT_POST_MESSAGE_PRE(element, message)
+#define GST_TRACER_ELEMENT_POST_MESSAGE_POST(element, res)
+#define GST_TRACER_ELEMENT_QUERY_PRE(element, query)
+#define GST_TRACER_ELEMENT_QUERY_POST(element, res)
+#define GST_TRACER_ELEMENT_NEW(element)
+#define GST_TRACER_ELEMENT_ADD_PAD(element, pad)
+#define GST_TRACER_ELEMENT_REMOVE_PAD(element, pad)
+#define GST_TRACER_ELEMENT_CHANGE_STATE_PRE(element, transition)
+#define GST_TRACER_ELEMENT_CHANGE_STATE_POST(element, transition, res)
+#define GST_TRACER_BIN_ADD_PRE(bin, element)
+#define GST_TRACER_BIN_ADD_POST(bin, element, res)
+#define GST_TRACER_BIN_REMOVE_PRE(bin, element)
+#define GST_TRACER_BIN_REMOVE_POST(bin, res)
+#define GST_TRACER_PAD_LINK_PRE(srcpad, sinkpad)
+#define GST_TRACER_PAD_LINK_POST(srcpad, sinkpad, res)
+#define GST_TRACER_PAD_UNLINK_PRE(srcpad, sinkpad)
+#define GST_TRACER_PAD_UNLINK_POST(srcpad, sinkpad, res)
+
+#endif /* GST_DISABLE_GST_DEBUG */
+
+G_END_DECLS
+
+#endif /* __GST_TRACER_UTILS_H__ */
+
diff --git a/gst/gsttypefindfactory.h b/gst/gsttypefindfactory.h
index 64238ce..02573f7 100644
--- a/gst/gsttypefindfactory.h
+++ b/gst/gsttypefindfactory.h
@@ -57,6 +57,10 @@
void gst_type_find_factory_call_function (GstTypeFindFactory *factory,
GstTypeFind *find);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTypeFindFactory, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_TYPE_FIND_FACTORY_H__ */
diff --git a/gst/gsturi.c b/gst/gsturi.c
index 52f951b..8623d44 100644
--- a/gst/gsturi.c
+++ b/gst/gsturi.c
@@ -118,25 +118,6 @@
}
#endif
-#if !GLIB_CHECK_VERSION (2, 33, 4)
-#define g_list_copy_deep gst_g_list_copy_deep
-static GList *
-gst_g_list_copy_deep (GList * list, GCopyFunc func, gpointer user_data)
-{
- list = g_list_copy (list);
-
- if (func != NULL) {
- GList *l;
-
- for (l = list; l != NULL; l = l->next) {
- l->data = func (l->data, user_data);
- }
- }
-
- return list;
-}
-#endif
-
GType
gst_uri_handler_get_type (void)
{
diff --git a/gst/gsturi.h b/gst/gsturi.h
index 64dc65b..6e1504c 100644
--- a/gst/gsturi.h
+++ b/gst/gsturi.h
@@ -261,10 +261,6 @@
* Returns: (transfer full): A new #GstUri object which is a copy of this
* #GstUri or %NULL.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstUri * gst_uri_copy (const GstUri * uri);
-#endif
-
static inline GstUri *
gst_uri_copy (const GstUri * uri)
{
@@ -280,10 +276,6 @@
*
* Returns: This object with the reference count incremented.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC GstUri * gst_uri_ref (GstUri * uri);
-#endif
-
static inline GstUri *
gst_uri_ref (GstUri * uri)
{
@@ -300,16 +292,16 @@
*
* See gst_mini_object_unref() for further info.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void gst_uri_unref (GstUri * uri);
-#endif
-
static inline void
gst_uri_unref (GstUri * uri)
{
gst_mini_object_unref (GST_MINI_OBJECT_CAST (uri));
}
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstUri, gst_uri_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_URI_H__ */
diff --git a/gst/gstutils.h b/gst/gstutils.h
index 186f439..457a76a 100644
--- a/gst/gstutils.h
+++ b/gst/gstutils.h
@@ -116,22 +116,22 @@
#ifndef __GTK_DOC_IGNORE__
#if GST_HAVE_UNALIGNED_ACCESS
static inline guint16 __gst_fast_read16(const guint8 *v) {
- return *(const guint16*)(v);
+ return *(const guint16*)(const void*)(v);
}
static inline guint32 __gst_fast_read32(const guint8 *v) {
- return *(const guint32*)(v);
+ return *(const guint32*)(const void*)(v);
}
static inline guint64 __gst_fast_read64(const guint8 *v) {
- return *(const guint64*)(v);
+ return *(const guint64*)(const void*)(v);
}
static inline guint16 __gst_fast_read_swap16(const guint8 *v) {
- return GUINT16_SWAP_LE_BE(*(const guint16*)(v));
+ return GUINT16_SWAP_LE_BE(*(const guint16*)(const void*)(v));
}
static inline guint32 __gst_fast_read_swap32(const guint8 *v) {
- return GUINT32_SWAP_LE_BE(*(const guint32*)(v));
+ return GUINT32_SWAP_LE_BE(*(const guint32*)(const void*)(v));
}
static inline guint64 __gst_fast_read_swap64(const guint8 *v) {
- return GUINT64_SWAP_LE_BE(*(const guint64*)(v));
+ return GUINT64_SWAP_LE_BE(*(const guint64*)(const void*)(v));
}
# define _GST_FAST_READ(s, d) __gst_fast_read##s((const guint8 *)(d))
# define _GST_FAST_READ_SWAP(s, d) __gst_fast_read_swap##s((const guint8 *)(d))
@@ -451,11 +451,7 @@
*
* Returns: @in byte-swapped.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gfloat GFLOAT_SWAP_LE_BE (gfloat in);
-#endif
-
-inline static gfloat
+static inline gfloat
GFLOAT_SWAP_LE_BE(gfloat in)
{
union
@@ -477,11 +473,7 @@
*
* Returns: @in byte-swapped.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gdouble GDOUBLE_SWAP_LE_BE (gdouble in);
-#endif
-
-inline static gdouble
+static inline gdouble
GDOUBLE_SWAP_LE_BE(gdouble in)
{
union
@@ -584,11 +576,7 @@
*
* Returns: The floating point value read from @data
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gfloat GST_READ_FLOAT_LE (const guint8 *data);
-#endif
-
-inline static gfloat
+static inline gfloat
GST_READ_FLOAT_LE(const guint8 *data)
{
union
@@ -609,11 +597,7 @@
*
* Returns: The floating point value read from @data
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gfloat GST_READ_FLOAT_BE (const guint8 *data);
-#endif
-
-inline static gfloat
+static inline gfloat
GST_READ_FLOAT_BE(const guint8 *data)
{
union
@@ -634,11 +618,7 @@
*
* Returns: The double-precision floating point value read from @data
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gdouble GST_READ_DOUBLE_LE (const guint8 *data);
-#endif
-
-inline static gdouble
+static inline gdouble
GST_READ_DOUBLE_LE(const guint8 *data)
{
union
@@ -659,11 +639,7 @@
*
* Returns: The double-precision floating point value read from @data
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC gdouble GST_READ_DOUBLE_BE (const guint8 *data);
-#endif
-
-inline static gdouble
+static inline gdouble
GST_READ_DOUBLE_BE(const guint8 *data)
{
union
@@ -683,11 +659,7 @@
*
* Store a 32 bit float value in little endian format into the memory buffer.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void GST_WRITE_FLOAT_LE (guint8 *data, gfloat num);
-#endif
-
-inline static void
+static inline void
GST_WRITE_FLOAT_LE(guint8 *data, gfloat num)
{
union
@@ -707,11 +679,7 @@
*
* Store a 32 bit float value in big endian format into the memory buffer.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void GST_WRITE_FLOAT_BE (guint8 *data, gfloat num);
-#endif
-
-inline static void
+static inline void
GST_WRITE_FLOAT_BE(guint8 *data, gfloat num)
{
union
@@ -731,11 +699,7 @@
*
* Store a 64 bit double value in little endian format into the memory buffer.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void GST_WRITE_DOUBLE_LE (guint8 *data, gdouble num);
-#endif
-
-inline static void
+static inline void
GST_WRITE_DOUBLE_LE(guint8 *data, gdouble num)
{
union
@@ -755,11 +719,7 @@
*
* Store a 64 bit double value in big endian format into the memory buffer.
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC void GST_WRITE_DOUBLE_BE (guint8 *data, gdouble num);
-#endif
-
-inline static void
+static inline void
GST_WRITE_DOUBLE_BE(guint8 *data, gdouble num)
{
union
diff --git a/gst/gstvalue.c b/gst/gstvalue.c
index 37a59bf..f876be0 100644
--- a/gst/gstvalue.c
+++ b/gst/gstvalue.c
@@ -6568,20 +6568,7 @@
GType
gst_g_thread_get_type (void)
{
-#if GLIB_CHECK_VERSION(2,35,3)
return G_TYPE_THREAD;
-#else
- static volatile gsize type_id = 0;
-
- if (g_once_init_enter (&type_id)) {
- GType tmp =
- g_boxed_type_register_static (g_intern_static_string ("GstGThread"),
- (GBoxedCopyFunc) g_thread_ref, (GBoxedFreeFunc) g_thread_unref);
- g_once_init_leave (&type_id, tmp);
- }
-
- return type_id;
-#endif
}
#define SERIAL_VTABLE(t,c,s,d) { t, c, s, d }
diff --git a/gst/parse/Makefile.in b/gst/parse/Makefile.in
index ab17d32..8375bd4 100644
--- a/gst/parse/Makefile.in
+++ b/gst/parse/Makefile.in
@@ -332,6 +332,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/gst/printf/Makefile.in b/gst/printf/Makefile.in
index a93e9e4..fd805fb 100644
--- a/gst/printf/Makefile.in
+++ b/gst/printf/Makefile.in
@@ -329,6 +329,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/gstreamer.doap b/gstreamer.doap
index 91fa19c..49483f0 100644
--- a/gstreamer.doap
+++ b/gstreamer.doap
@@ -40,6 +40,16 @@
<release>
<Version>
+ <revision>1.7.1</revision>
+ <branch>master</branch>
+ <name></name>
+ <created>2015-12-24</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.7.1.tar.xz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
<revision>1.6.2</revision>
<branch>1.6</branch>
<name></name>
diff --git a/gstreamer.spec b/gstreamer.spec
index 742eff8..4d473a7 100644
--- a/gstreamer.spec
+++ b/gstreamer.spec
@@ -1,10 +1,10 @@
%define gstreamer gstreamer1
%define majorminor 1.0
-%define _glib2 2.32.0
+%define _glib2 2.40.0
Name: %{gstreamer}
-Version: 1.6.2
+Version: 1.7.1
Release: 1
Summary: GStreamer streaming media framework runtime
diff --git a/libs/Makefile.in b/libs/Makefile.in
index 7c0f0e8..d831f14 100644
--- a/libs/Makefile.in
+++ b/libs/Makefile.in
@@ -333,6 +333,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/libs/gst/Makefile.in b/libs/gst/Makefile.in
index 97d94e6..cf98105 100644
--- a/libs/gst/Makefile.in
+++ b/libs/gst/Makefile.in
@@ -332,6 +332,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/libs/gst/base/Makefile.am b/libs/gst/base/Makefile.am
index 92424ab..fd26842 100644
--- a/libs/gst/base/Makefile.am
+++ b/libs/gst/base/Makefile.am
@@ -69,7 +69,8 @@
$(INTROSPECTION_SCANNER) -v --namespace GstBase \
--nsversion=@GST_API_VERSION@ \
--warn-all \
- --strip-prefix=Gst \
+ --identifier-prefix=Gst \
+ --symbol-prefix=gst \
-I$(top_srcdir) \
-I$(top_srcdir)/libs \
-I$(top_builddir) \
diff --git a/libs/gst/base/Makefile.in b/libs/gst/base/Makefile.in
index a6f1742..4b39ab2 100644
--- a/libs/gst/base/Makefile.in
+++ b/libs/gst/base/Makefile.in
@@ -379,6 +379,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
@@ -1124,7 +1126,8 @@
@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_SCANNER) -v --namespace GstBase \
@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_API_VERSION@ \
@HAVE_INTROSPECTION_TRUE@ --warn-all \
-@HAVE_INTROSPECTION_TRUE@ --strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ --identifier-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ --symbol-prefix=gst \
@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir) \
@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir)/libs \
@HAVE_INTROSPECTION_TRUE@ -I$(top_builddir) \
diff --git a/libs/gst/base/gstadapter.h b/libs/gst/base/gstadapter.h
index a5cfb68..bb8c77d 100644
--- a/libs/gst/base/gstadapter.h
+++ b/libs/gst/base/gstadapter.h
@@ -82,6 +82,10 @@
gssize gst_adapter_masked_scan_uint32_peek (GstAdapter * adapter, guint32 mask,
guint32 pattern, gsize offset, gsize size, guint32 * value);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstAdapter, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_ADAPTER_H__ */
diff --git a/libs/gst/base/gstbaseparse.c b/libs/gst/base/gstbaseparse.c
index c9a57c5..ac357d9 100644
--- a/libs/gst/base/gstbaseparse.c
+++ b/libs/gst/base/gstbaseparse.c
@@ -219,6 +219,9 @@
#define MIN_FRAMES_TO_POST_BITRATE 10
#define TARGET_DIFFERENCE (20 * GST_SECOND)
#define MAX_INDEX_ENTRIES 4096
+#define UPDATE_THRESHOLD 2
+
+#define ABSDIFF(a,b) (((a) > (b)) ? ((a) - (b)) : ((b) - (a)))
GST_DEBUG_CATEGORY_STATIC (gst_base_parse_debug);
#define GST_CAT_DEFAULT gst_base_parse_debug
@@ -1691,11 +1694,8 @@
static void
gst_base_parse_update_bitrates (GstBaseParse * parse, GstBaseParseFrame * frame)
{
- /* Only update the tag on a 10 kbps delta */
- static const gint update_threshold = 10000;
-
guint64 data_len, frame_dur;
- gint overhead, frame_bitrate, old_avg_bitrate;
+ gint overhead, frame_bitrate;
GstBuffer *buffer = frame->buffer;
overhead = frame->overhead;
@@ -1755,11 +1755,14 @@
parse->priv->tags_changed = TRUE;
}
- old_avg_bitrate = parse->priv->posted_avg_bitrate;
- if (((gint) (old_avg_bitrate - parse->priv->avg_bitrate) > update_threshold
- || (gint) (parse->priv->avg_bitrate - old_avg_bitrate) >
- update_threshold) && parse->priv->post_avg_bitrate)
- parse->priv->tags_changed = TRUE;
+ /* Only update the tag on a 2% change */
+ if (parse->priv->post_avg_bitrate && parse->priv->avg_bitrate) {
+ guint64 diffprev = gst_util_uint64_scale_int (100,
+ ABSDIFF (parse->priv->avg_bitrate, parse->priv->posted_avg_bitrate),
+ parse->priv->avg_bitrate);
+ if (diffprev >= UPDATE_THRESHOLD)
+ parse->priv->tags_changed = TRUE;
+ }
}
}
diff --git a/libs/gst/base/gstbaseparse.h b/libs/gst/base/gstbaseparse.h
index 94522cc..f3081ef 100644
--- a/libs/gst/base/gstbaseparse.h
+++ b/libs/gst/base/gstbaseparse.h
@@ -349,6 +349,14 @@
GstTagList * tags,
GstTagMergeMode mode);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBaseParseFrame, gst_base_parse_frame_free)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBaseParse, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_BASE_PARSE_H__ */
diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c
index f5fea82..34ccdac 100644
--- a/libs/gst/base/gstbasesink.c
+++ b/libs/gst/base/gstbasesink.c
@@ -1659,7 +1659,9 @@
/* update the segment clipping regions for non-flushing seeks */
if (segment->rate > 0.0) {
if (end != -1)
- position = gst_segment_to_position (segment, GST_FORMAT_TIME, end);
+ position =
+ gst_segment_position_from_running_time (segment, GST_FORMAT_TIME,
+ end);
else
position = segment->stop;
@@ -1667,7 +1669,9 @@
segment->position = position;
} else {
if (end != -1)
- position = gst_segment_to_position (segment, GST_FORMAT_TIME, end);
+ position =
+ gst_segment_position_from_running_time (segment, GST_FORMAT_TIME,
+ end);
else
position = segment->start;
@@ -1803,10 +1807,14 @@
step_end = TRUE;
if (segment->rate > 0.0) {
*rstart = end;
- *cstart = gst_segment_to_position (segment, GST_FORMAT_TIME, end);
+ *cstart =
+ gst_segment_position_from_running_time (segment, GST_FORMAT_TIME,
+ end);
} else {
*rstop = end;
- *cstop = gst_segment_to_position (segment, GST_FORMAT_TIME, end);
+ *cstop =
+ gst_segment_position_from_running_time (segment, GST_FORMAT_TIME,
+ end);
}
}
GST_DEBUG_OBJECT (sink,
diff --git a/libs/gst/base/gstbasesink.h b/libs/gst/base/gstbasesink.h
index d09b7e8..1df5d65 100644
--- a/libs/gst/base/gstbasesink.h
+++ b/libs/gst/base/gstbasesink.h
@@ -44,18 +44,18 @@
*/
#define GST_BASE_SINK_PAD(obj) (GST_BASE_SINK_CAST (obj)->sinkpad)
-#define GST_BASE_SINK_GET_PREROLL_LOCK(pad) (&GST_BASE_SINK_CAST(pad)->preroll_lock)
-#define GST_BASE_SINK_PREROLL_LOCK(pad) (g_mutex_lock(GST_BASE_SINK_GET_PREROLL_LOCK(pad)))
-#define GST_BASE_SINK_PREROLL_TRYLOCK(pad) (g_mutex_trylock(GST_BASE_SINK_GET_PREROLL_LOCK(pad)))
-#define GST_BASE_SINK_PREROLL_UNLOCK(pad) (g_mutex_unlock(GST_BASE_SINK_GET_PREROLL_LOCK(pad)))
+#define GST_BASE_SINK_GET_PREROLL_LOCK(obj) (&GST_BASE_SINK_CAST(obj)->preroll_lock)
+#define GST_BASE_SINK_PREROLL_LOCK(obj) (g_mutex_lock(GST_BASE_SINK_GET_PREROLL_LOCK(obj)))
+#define GST_BASE_SINK_PREROLL_TRYLOCK(obj) (g_mutex_trylock(GST_BASE_SINK_GET_PREROLL_LOCK(obj)))
+#define GST_BASE_SINK_PREROLL_UNLOCK(obj) (g_mutex_unlock(GST_BASE_SINK_GET_PREROLL_LOCK(obj)))
-#define GST_BASE_SINK_GET_PREROLL_COND(pad) (&GST_BASE_SINK_CAST(pad)->preroll_cond)
-#define GST_BASE_SINK_PREROLL_WAIT(pad) \
- g_cond_wait (GST_BASE_SINK_GET_PREROLL_COND (pad), GST_BASE_SINK_GET_PREROLL_LOCK (pad))
-#define GST_BASE_SINK_PREROLL_WAIT_UNTIL(pad, end_time) \
- g_cond_wait_until (GST_BASE_SINK_GET_PREROLL_COND (pad), GST_BASE_SINK_GET_PREROLL_LOCK (pad), end_time)
-#define GST_BASE_SINK_PREROLL_SIGNAL(pad) g_cond_signal (GST_BASE_SINK_GET_PREROLL_COND (pad));
-#define GST_BASE_SINK_PREROLL_BROADCAST(pad) g_cond_broadcast (GST_BASE_SINK_GET_PREROLL_COND (pad));
+#define GST_BASE_SINK_GET_PREROLL_COND(obj) (&GST_BASE_SINK_CAST(obj)->preroll_cond)
+#define GST_BASE_SINK_PREROLL_WAIT(obj) \
+ g_cond_wait (GST_BASE_SINK_GET_PREROLL_COND (obj), GST_BASE_SINK_GET_PREROLL_LOCK (obj))
+#define GST_BASE_SINK_PREROLL_WAIT_UNTIL(obj, end_time) \
+ g_cond_wait_until (GST_BASE_SINK_GET_PREROLL_COND (obj), GST_BASE_SINK_GET_PREROLL_LOCK (obj), end_time)
+#define GST_BASE_SINK_PREROLL_SIGNAL(obj) g_cond_signal (GST_BASE_SINK_GET_PREROLL_COND (obj));
+#define GST_BASE_SINK_PREROLL_BROADCAST(obj) g_cond_broadcast (GST_BASE_SINK_GET_PREROLL_COND (obj));
typedef struct _GstBaseSink GstBaseSink;
typedef struct _GstBaseSinkClass GstBaseSinkClass;
@@ -254,6 +254,10 @@
GstFlowReturn gst_base_sink_wait (GstBaseSink *sink, GstClockTime time,
GstClockTimeDiff *jitter);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBaseSink, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_BASE_SINK_H__ */
diff --git a/libs/gst/base/gstbasesrc.h b/libs/gst/base/gstbasesrc.h
index 4ddfda9..a89c8a8 100644
--- a/libs/gst/base/gstbasesrc.h
+++ b/libs/gst/base/gstbasesrc.h
@@ -272,6 +272,10 @@
GstAllocationParams *params);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBaseSrc, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_BASE_SRC_H__ */
diff --git a/libs/gst/base/gstbasetransform.c b/libs/gst/base/gstbasetransform.c
index aa169c3..de04a48 100644
--- a/libs/gst/base/gstbasetransform.c
+++ b/libs/gst/base/gstbasetransform.c
@@ -536,7 +536,7 @@
ret = klass->transform_caps (trans, direction, caps, filter);
GST_LOG_OBJECT (trans, " to: %" GST_PTR_FORMAT, ret);
-#ifndef G_DISABLE_ASSERT
+#ifdef GST_ENABLE_EXTRA_CHECKS
if (filter) {
if (!gst_caps_is_subset (ret, filter)) {
GstCaps *intersection;
diff --git a/libs/gst/base/gstbasetransform.h b/libs/gst/base/gstbasetransform.h
index ab795e8..2fe25ec 100644
--- a/libs/gst/base/gstbasetransform.h
+++ b/libs/gst/base/gstbasetransform.h
@@ -317,6 +317,10 @@
void gst_base_transform_reconfigure_src (GstBaseTransform *trans);
gboolean gst_base_transform_update_src_caps (GstBaseTransform *trans,
GstCaps *updated_caps);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstBaseTransform, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_BASE_TRANSFORM_H__ */
diff --git a/libs/gst/base/gstbytewriter.h b/libs/gst/base/gstbytewriter.h
index f5c5502..c01bfcb 100644
--- a/libs/gst/base/gstbytewriter.h
+++ b/libs/gst/base/gstbytewriter.h
@@ -90,11 +90,6 @@
*
* Returns: The current, initialized size of the data
*/
-#ifdef _FOOL_GTK_DOC_
-G_INLINE_FUNC guint gst_byte_writer_get_pos (const GstByteWriter *writer);
-G_INLINE_FUNC gboolean gst_byte_writer_set_pos (GstByteWriter *writer, guint pos);
-G_INLINE_FUNC guint gst_byte_writer_get_size (const GstByteWriter *writer);
-#else
static inline guint
gst_byte_writer_get_pos (const GstByteWriter *writer)
{
@@ -112,7 +107,6 @@
{
return gst_byte_reader_get_size ((const GstByteReader *) writer);
}
-#endif
guint gst_byte_writer_get_remaining (const GstByteWriter *writer);
gboolean gst_byte_writer_ensure_free_space (GstByteWriter *writer, guint size);
diff --git a/libs/gst/base/gstcollectpads.c b/libs/gst/base/gstcollectpads.c
index 8edfe41..dc18222 100644
--- a/libs/gst/base/gstcollectpads.c
+++ b/libs/gst/base/gstcollectpads.c
@@ -508,8 +508,7 @@
*outbuf = buf;
/* invalid left alone and passed */
- if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DTS (buf))
- || GST_CLOCK_TIME_IS_VALID (GST_BUFFER_PTS (buf)))) {
+ if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DTS_OR_PTS (buf)))) {
GstClockTime time;
GstClockTime buf_dts, abs_dts;
gint dts_sign;
@@ -1479,10 +1478,7 @@
buffer = gst_collect_pads_peek (pads, data);
/* if we have a buffer check if it is better then the current best one */
if (buffer != NULL) {
- timestamp = GST_BUFFER_DTS (buffer);
- if (!GST_CLOCK_TIME_IS_VALID (timestamp)) {
- timestamp = GST_BUFFER_PTS (buffer);
- }
+ timestamp = GST_BUFFER_DTS_OR_PTS (buffer);
gst_buffer_unref (buffer);
if (best == NULL || pads->priv->compare_func (pads, data, timestamp,
best, best_time, pads->priv->compare_user_data) < 0) {
@@ -2207,9 +2203,7 @@
if (G_LIKELY (data->segment.format == GST_FORMAT_TIME)) {
GstClockTime timestamp;
- timestamp = GST_BUFFER_DTS (buffer);
- if (!GST_CLOCK_TIME_IS_VALID (timestamp))
- timestamp = GST_BUFFER_PTS (buffer);
+ timestamp = GST_BUFFER_DTS_OR_PTS (buffer);
if (GST_CLOCK_TIME_IS_VALID (timestamp))
data->segment.position = timestamp;
diff --git a/libs/gst/base/gstcollectpads.h b/libs/gst/base/gstcollectpads.h
index cfa29eb..0a73785 100644
--- a/libs/gst/base/gstcollectpads.h
+++ b/libs/gst/base/gstcollectpads.h
@@ -410,6 +410,10 @@
GstQuery * query, gboolean discard);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstCollectPads, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_COLLECT_PADS_H__ */
diff --git a/libs/gst/base/gstdataqueue.h b/libs/gst/base/gstdataqueue.h
index cc454f8..f1fd9be 100644
--- a/libs/gst/base/gstdataqueue.h
+++ b/libs/gst/base/gstdataqueue.h
@@ -161,6 +161,10 @@
void gst_data_queue_limits_changed (GstDataQueue * queue);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDataQueue, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_DATA_QUEUE_H__ */
diff --git a/libs/gst/base/gstflowcombiner.h b/libs/gst/base/gstflowcombiner.h
index 79e4bed..2ea3937 100644
--- a/libs/gst/base/gstflowcombiner.h
+++ b/libs/gst/base/gstflowcombiner.h
@@ -60,6 +60,10 @@
GType gst_flow_combiner_get_type (void);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstFlowCombiner, gst_flow_combiner_free)
+#endif
+
G_END_DECLS
#endif /* __GST_FLOW_COMBINER_H__ */
diff --git a/libs/gst/base/gstindex.h b/libs/gst/base/gstindex.h
index b943efb..c80fa6c 100644
--- a/libs/gst/base/gstindex.h
+++ b/libs/gst/base/gstindex.h
@@ -217,6 +217,7 @@
const gchar *key;
} format;
} data;
+ // FIXME 2.0: add padding
};
/**
@@ -238,6 +239,7 @@
/* peer group that contains more certain entries */
gint peergroup;
+ // FIXME 2.0: add padding
};
/**
diff --git a/libs/gst/base/gstpushsrc.h b/libs/gst/base/gstpushsrc.h
index 768d4ba..dbee559 100644
--- a/libs/gst/base/gstpushsrc.h
+++ b/libs/gst/base/gstpushsrc.h
@@ -84,6 +84,10 @@
GType gst_push_src_get_type(void);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstPushSrc, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_PUSH_SRC_H__ */
diff --git a/libs/gst/check/Makefile.am b/libs/gst/check/Makefile.am
index 1791c83..57593ea 100644
--- a/libs/gst/check/Makefile.am
+++ b/libs/gst/check/Makefile.am
@@ -218,7 +218,8 @@
GST_PLUGIN_SYSTEM_PATH_1_0="" GST_PLUGIN_PATH_1_0="" GST_REGISTRY_UPDATE=no \
$(INTROSPECTION_SCANNER) -v --namespace GstCheck \
--nsversion=@GST_API_VERSION@ \
- --strip-prefix=Gst \
+ --identifier-prefix=Gst \
+ --symbol-prefix=gst \
--warn-all \
-I$(top_srcdir) \
-I$(top_srcdir)/libs \
diff --git a/libs/gst/check/Makefile.in b/libs/gst/check/Makefile.in
index 2de7b42..f7142d9 100644
--- a/libs/gst/check/Makefile.in
+++ b/libs/gst/check/Makefile.in
@@ -414,6 +414,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
@@ -1341,7 +1343,8 @@
@HAVE_INTROSPECTION_TRUE@ GST_PLUGIN_SYSTEM_PATH_1_0="" GST_PLUGIN_PATH_1_0="" GST_REGISTRY_UPDATE=no \
@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_SCANNER) -v --namespace GstCheck \
@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_API_VERSION@ \
-@HAVE_INTROSPECTION_TRUE@ --strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ --identifier-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ --symbol-prefix=gst \
@HAVE_INTROSPECTION_TRUE@ --warn-all \
@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir) \
@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir)/libs \
diff --git a/libs/gst/check/gstharness.c b/libs/gst/check/gstharness.c
index a196e48..68b6b4e 100644
--- a/libs/gst/check/gstharness.c
+++ b/libs/gst/check/gstharness.c
@@ -23,11 +23,11 @@
* @short_description: A test-harness for writing GStreamer unit tests
* @see_also: #GstTestClock,\
*
- * #GstHarness is ment to make writing unit test for GStreamer much easier.
- * It can be though of as a way of treating a #GstElement as a black box,
- * deterministially feeding it data, and controlling what data it outputs.
+ * #GstHarness is meant to make writing unit test for GStreamer much easier.
+ * It can be thought of as a way of treating a #GstElement as a black box,
+ * deterministically feeding it data, and controlling what data it outputs.
*
- * The basic structure of #GstHarness is two "floating" #GstPads, that connects
+ * The basic structure of #GstHarness is two "floating" #GstPads that connect
* to the harnessed #GstElement src and sink #GstPads like so:
*
* <programlisting>
@@ -42,17 +42,17 @@
*
* With this, you can now simulate any environment the #GstElement might find
* itself in. By specifying the #GstCaps of the harness #GstPads, using
- * functions like gst_harness_set_src_caps or gst_harness_set_sink_caps_str,
- * you can test how the #GstElement interacts with different capssets.
+ * functions like gst_harness_set_src_caps() or gst_harness_set_sink_caps_str(),
+ * you can test how the #GstElement interacts with different caps sets.
*
* Your harnessed #GstElement can of course also be a bin, and using
- * gst_harness_new_parse supporting standard gst-launch syntax, you can
+ * gst_harness_new_parse() supporting standard gst-launch syntax, you can
* easily test a whole pipeline instead of just one element.
*
* You can then go on to push #GstBuffers and #GstEvents on to the srcpad,
- * using functions like gst_harness_push and gst_harness_push_event, and
- * then pull them out to examine them with gst_harness_pull and
- * gst_harness_pull_event.
+ * using functions like gst_harness_push() and gst_harness_push_event(), and
+ * then pull them out to examine them with gst_harness_pull() and
+ * gst_harness_pull_event().
*
* <example>
* <title>A simple buffer-in buffer-out example</title>
@@ -92,14 +92,14 @@
* #GstTestClock. Operating the #GstTestClock can be very challenging, but
* #GstHarness simplifies some of the most desired actions a lot, like wanting
* to manually advance the clock while at the same time releasing a #GstClockID
- * that is waiting, with functions like gst_harness_crank_single_clock_wait.
+ * that is waiting, with functions like gst_harness_crank_single_clock_wait().
*
* #GstHarness also supports sub-harnesses, as a way of generating and
* validating data. A sub-harness is another #GstHarness that is managed by
* the "parent" harness, and can either be created by using the standard
* gst_harness_new type functions directly on the (GstHarness *)->src_harness,
- * or using the much more convenient gst_harness_add_src or
- * gst_harness_add_sink_parse. If you have a decoder-element you want to test,
+ * or using the much more convenient gst_harness_add_src() or
+ * gst_harness_add_sink_parse(). If you have a decoder-element you want to test,
* (like vp8dec) it can be very useful to add a src-harness with both a
* src-element (videotestsrc) and an encoder (vp8enc) to feed the decoder data
* with different configurations, by simply doing:
diff --git a/libs/gst/check/gsttestclock.h b/libs/gst/check/gsttestclock.h
index af7a5f1..cccbae3 100644
--- a/libs/gst/check/gsttestclock.h
+++ b/libs/gst/check/gsttestclock.h
@@ -114,6 +114,10 @@
GstClockTime gst_test_clock_id_list_get_latest_time (const GList * pending_list);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTestClock, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_TEST_CLOCK_H__ */
diff --git a/libs/gst/check/libcheck/Makefile.in b/libs/gst/check/libcheck/Makefile.in
index 2e0a7f2..a03ca69 100644
--- a/libs/gst/check/libcheck/Makefile.in
+++ b/libs/gst/check/libcheck/Makefile.in
@@ -370,6 +370,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/libs/gst/controller/Makefile.am b/libs/gst/controller/Makefile.am
index c89aa9c..ffc4afd 100644
--- a/libs/gst/controller/Makefile.am
+++ b/libs/gst/controller/Makefile.am
@@ -41,7 +41,8 @@
$(INTROSPECTION_SCANNER) -v --namespace GstController \
--nsversion=@GST_API_VERSION@ \
--warn-all \
- --strip-prefix=Gst \
+ --identifier-prefix=Gst \
+ --symbol-prefix=gst \
-I$(top_srcdir) \
-I$(top_srcdir)/libs \
-I$(top_builddir) \
diff --git a/libs/gst/controller/Makefile.in b/libs/gst/controller/Makefile.in
index 6b88ff9..7436270 100644
--- a/libs/gst/controller/Makefile.in
+++ b/libs/gst/controller/Makefile.in
@@ -354,6 +354,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
@@ -960,7 +962,8 @@
@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_SCANNER) -v --namespace GstController \
@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_API_VERSION@ \
@HAVE_INTROSPECTION_TRUE@ --warn-all \
-@HAVE_INTROSPECTION_TRUE@ --strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ --identifier-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ --symbol-prefix=gst \
@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir) \
@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir)/libs \
@HAVE_INTROSPECTION_TRUE@ -I$(top_builddir) \
diff --git a/libs/gst/controller/gstargbcontrolbinding.h b/libs/gst/controller/gstargbcontrolbinding.h
index 6b51197..c698b07 100644
--- a/libs/gst/controller/gstargbcontrolbinding.h
+++ b/libs/gst/controller/gstargbcontrolbinding.h
@@ -93,6 +93,10 @@
GstControlSource * cs_a, GstControlSource * cs_r,
GstControlSource * cs_g, GstControlSource * cs_b);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstARGBControlBinding, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_ARGB_CONTROL_BINDING_H__ */
diff --git a/libs/gst/controller/gstdirectcontrolbinding.h b/libs/gst/controller/gstdirectcontrolbinding.h
index 5b816c8..5732ad8 100644
--- a/libs/gst/controller/gstdirectcontrolbinding.h
+++ b/libs/gst/controller/gstdirectcontrolbinding.h
@@ -90,7 +90,8 @@
struct {
gboolean want_absolute;
} abi;
- } ABI;};
+ } ABI;
+};
/**
* GstDirectControlBindingClass:
@@ -118,6 +119,10 @@
GstControlBinding * gst_direct_control_binding_new_absolute (GstObject * object, const gchar * property_name,
GstControlSource * cs);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstDirectControlBinding, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_DIRECT_CONTROL_BINDING_H__ */
diff --git a/libs/gst/controller/gstinterpolationcontrolsource.c b/libs/gst/controller/gstinterpolationcontrolsource.c
index b8a3c22..5957049 100644
--- a/libs/gst/controller/gstinterpolationcontrolsource.c
+++ b/libs/gst/controller/gstinterpolationcontrolsource.c
@@ -46,13 +46,67 @@
#define GST_CAT_DEFAULT controller_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
+/* helper functions */
+
+static inline gboolean
+_get_nearest_control_points (GstTimedValueControlSource * self,
+ GstClockTime ts, GstControlPoint ** cp1, GstControlPoint ** cp2)
+{
+ GSequenceIter *iter;
+
+ iter = gst_timed_value_control_source_find_control_point_iter (self, ts);
+ if (iter) {
+ *cp1 = g_sequence_get (iter);
+ iter = g_sequence_iter_next (iter);
+ if (iter && !g_sequence_iter_is_end (iter)) {
+ *cp2 = g_sequence_get (iter);
+ } else {
+ *cp2 = NULL;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static inline void
+_get_nearest_control_points2 (GstTimedValueControlSource * self,
+ GstClockTime ts, GstControlPoint ** cp1, GstControlPoint ** cp2,
+ GstClockTime * next_ts)
+{
+ GSequenceIter *iter1, *iter2 = NULL;
+
+ *cp1 = *cp2 = NULL;
+ iter1 = gst_timed_value_control_source_find_control_point_iter (self, ts);
+ if (iter1) {
+ *cp1 = g_sequence_get (iter1);
+ iter2 = g_sequence_iter_next (iter1);
+ } else {
+ if (G_LIKELY (self->values)) {
+ /* all values in the control point list come after the given timestamp */
+ iter2 = g_sequence_get_begin_iter (self->values);
+ /* why this? if !cp1 we don't interpolate anyway
+ * if we can eliminate this, we can also use _get_nearest_control_points()
+ * here, is this just to set next_ts? */
+ } else {
+ /* no values */
+ iter2 = NULL;
+ }
+ }
+
+ if (iter2 && !g_sequence_iter_is_end (iter2)) {
+ *cp2 = g_sequence_get (iter2);
+ *next_ts = (*cp2)->timestamp;
+ } else {
+ *next_ts = GST_CLOCK_TIME_NONE;
+ }
+}
+
+
/* steps-like (no-)interpolation, default */
/* just returns the value for the most recent key-frame */
static inline gdouble
-_interpolate_none (GstTimedValueControlSource * self, GSequenceIter * iter)
+_interpolate_none (GstTimedValueControlSource * self, GstControlPoint * cp)
{
- GstControlPoint *cp = g_sequence_get (iter);
-
return cp->value;
}
@@ -62,13 +116,15 @@
{
gboolean ret = FALSE;
GSequenceIter *iter;
+ GstControlPoint *cp;
g_mutex_lock (&self->lock);
iter =
gst_timed_value_control_source_find_control_point_iter (self, timestamp);
if (iter) {
- *value = _interpolate_none (self, iter);
+ cp = g_sequence_get (iter);
+ *value = _interpolate_none (self, cp);
ret = TRUE;
}
g_mutex_unlock (&self->lock);
@@ -84,43 +140,24 @@
guint i;
GstClockTime ts = timestamp;
GstClockTime next_ts = 0;
- gdouble val;
- GSequenceIter *iter1 = NULL, *iter2 = NULL;
+ GstControlPoint *cp1 = NULL, *cp2 = NULL;
g_mutex_lock (&self->lock);
for (i = 0; i < n_values; i++) {
GST_LOG ("values[%3d] : ts=%" GST_TIME_FORMAT ", next_ts=%" GST_TIME_FORMAT,
i, GST_TIME_ARGS (ts), GST_TIME_ARGS (next_ts));
- val = NAN;
if (ts >= next_ts) {
- iter1 = gst_timed_value_control_source_find_control_point_iter (self, ts);
- if (!iter1) {
- if (G_LIKELY (self->values))
- iter2 = g_sequence_get_begin_iter (self->values);
- else
- iter2 = NULL;
- } else {
- iter2 = g_sequence_iter_next (iter1);
- }
-
- if (iter2 && !g_sequence_iter_is_end (iter2)) {
- GstControlPoint *cp;
-
- cp = g_sequence_get (iter2);
- next_ts = cp->timestamp;
- } else {
- next_ts = GST_CLOCK_TIME_NONE;
- }
+ _get_nearest_control_points2 (self, ts, &cp1, &cp2, &next_ts);
}
- if (iter1) {
- val = _interpolate_none (self, iter1);
+ if (cp1) {
+ *values = _interpolate_none (self, cp1);
ret = TRUE;
- GST_LOG ("values[%3d]=%lf", i, val);
+ GST_LOG ("values[%3d]=%lf", i, *values);
} else {
+ *values = NAN;
GST_LOG ("values[%3d]=-", i);
}
- *values = val;
ts += interval;
values++;
}
@@ -152,22 +189,11 @@
GstClockTime timestamp, gdouble * value)
{
gboolean ret = FALSE;
- GSequenceIter *iter;
GstControlPoint *cp1, *cp2;
g_mutex_lock (&self->lock);
- iter =
- gst_timed_value_control_source_find_control_point_iter (self, timestamp);
- if (iter) {
- cp1 = g_sequence_get (iter);
- iter = g_sequence_iter_next (iter);
- if (iter && !g_sequence_iter_is_end (iter)) {
- cp2 = g_sequence_get (iter);
- } else {
- cp2 = NULL;
- }
-
+ if (_get_nearest_control_points (self, timestamp, &cp1, &cp2)) {
*value = _interpolate_linear (cp1->timestamp, cp1->value,
(cp2 ? cp2->timestamp : GST_CLOCK_TIME_NONE),
(cp2 ? cp2->value : 0.0), timestamp);
@@ -186,8 +212,6 @@
guint i;
GstClockTime ts = timestamp;
GstClockTime next_ts = 0;
- gdouble val;
- GSequenceIter *iter1, *iter2 = NULL;
GstControlPoint *cp1 = NULL, *cp2 = NULL;
g_mutex_lock (&self->lock);
@@ -195,37 +219,19 @@
for (i = 0; i < n_values; i++) {
GST_LOG ("values[%3d] : ts=%" GST_TIME_FORMAT ", next_ts=%" GST_TIME_FORMAT,
i, GST_TIME_ARGS (ts), GST_TIME_ARGS (next_ts));
- val = NAN;
if (ts >= next_ts) {
- cp1 = cp2 = NULL;
- iter1 = gst_timed_value_control_source_find_control_point_iter (self, ts);
- if (!iter1) {
- if (G_LIKELY (self->values))
- iter2 = g_sequence_get_begin_iter (self->values);
- else
- iter2 = NULL;
- } else {
- cp1 = g_sequence_get (iter1);
- iter2 = g_sequence_iter_next (iter1);
- }
-
- if (iter2 && !g_sequence_iter_is_end (iter2)) {
- cp2 = g_sequence_get (iter2);
- next_ts = cp2->timestamp;
- } else {
- next_ts = GST_CLOCK_TIME_NONE;
- }
+ _get_nearest_control_points2 (self, ts, &cp1, &cp2, &next_ts);
}
if (cp1) {
- val = _interpolate_linear (cp1->timestamp, cp1->value,
+ *values = _interpolate_linear (cp1->timestamp, cp1->value,
(cp2 ? cp2->timestamp : GST_CLOCK_TIME_NONE),
(cp2 ? cp2->value : 0.0), ts);
ret = TRUE;
- GST_LOG ("values[%3d]=%lf", i, val);
+ GST_LOG ("values[%3d]=%lf", i, *values);
} else {
+ *values = NAN;
GST_LOG ("values[%3d]=-", i);
}
- *values = val;
ts += interval;
values++;
}
@@ -366,7 +372,6 @@
GstClockTime timestamp, gdouble * value)
{
gboolean ret = FALSE;
- GSequenceIter *iter;
GstControlPoint *cp1, *cp2 = NULL;
if (self->nvalues <= 2)
@@ -374,16 +379,7 @@
g_mutex_lock (&self->lock);
- iter =
- gst_timed_value_control_source_find_control_point_iter (self, timestamp);
- if (iter) {
- cp1 = g_sequence_get (iter);
- iter = g_sequence_iter_next (iter);
- if (iter && !g_sequence_iter_is_end (iter)) {
- cp2 = g_sequence_get (iter);
- } else {
- cp2 = NULL;
- }
+ if (_get_nearest_control_points (self, timestamp, &cp1, &cp2)) {
*value = _interpolate_cubic (self, cp1, cp1->value, cp2,
(cp2 ? cp2->value : 0.0), timestamp);
ret = TRUE;
@@ -401,8 +397,6 @@
guint i;
GstClockTime ts = timestamp;
GstClockTime next_ts = 0;
- gdouble val;
- GSequenceIter *iter1, *iter2 = NULL;
GstControlPoint *cp1 = NULL, *cp2 = NULL;
if (self->nvalues <= 2)
@@ -414,36 +408,18 @@
for (i = 0; i < n_values; i++) {
GST_LOG ("values[%3d] : ts=%" GST_TIME_FORMAT ", next_ts=%" GST_TIME_FORMAT,
i, GST_TIME_ARGS (ts), GST_TIME_ARGS (next_ts));
- val = NAN;
if (ts >= next_ts) {
- cp1 = cp2 = NULL;
- iter1 = gst_timed_value_control_source_find_control_point_iter (self, ts);
- if (!iter1) {
- if (G_LIKELY (self->values))
- iter2 = g_sequence_get_begin_iter (self->values);
- else
- iter2 = NULL;
- } else {
- cp1 = g_sequence_get (iter1);
- iter2 = g_sequence_iter_next (iter1);
- }
-
- if (iter2 && !g_sequence_iter_is_end (iter2)) {
- cp2 = g_sequence_get (iter2);
- next_ts = cp2->timestamp;
- } else {
- next_ts = GST_CLOCK_TIME_NONE;
- }
+ _get_nearest_control_points2 (self, ts, &cp1, &cp2, &next_ts);
}
if (cp1) {
- val = _interpolate_cubic (self, cp1, cp1->value, cp2,
+ *values = _interpolate_cubic (self, cp1, cp1->value, cp2,
(cp2 ? cp2->value : 0.0), ts);
ret = TRUE;
- GST_LOG ("values[%3d]=%lf", i, val);
+ GST_LOG ("values[%3d]=%lf", i, *values);
} else {
+ *values = NAN;
GST_LOG ("values[%3d]=-", i);
}
- *values = val;
ts += interval;
values++;
}
@@ -451,6 +427,176 @@
return ret;
}
+
+/* monotonic cubic interpolation */
+
+/* the following functions implement monotonic cubic spline interpolation.
+ * For details: http://en.wikipedia.org/wiki/Monotone_cubic_interpolation
+ *
+ * In contrast to the previous cubic mode, the values won't overshoot.
+ */
+
+static void
+_interpolate_cubic_mono_update_cache (GstTimedValueControlSource * self)
+{
+ gint i, n = self->nvalues;
+ gdouble *dxs = g_new0 (gdouble, n);
+ gdouble *dys = g_new0 (gdouble, n);
+ gdouble *ms = g_new0 (gdouble, n);
+ gdouble *c1s = g_new0 (gdouble, n);
+
+ GSequenceIter *iter;
+ GstControlPoint *cp;
+ GstClockTime x, x_next, dx;
+ gdouble y, y_next, dy;
+
+ /* Get consecutive differences and slopes */
+ iter = g_sequence_get_begin_iter (self->values);
+ cp = g_sequence_get (iter);
+ x_next = cp->timestamp;
+ y_next = cp->value;
+ for (i = 0; i < n - 1; i++) {
+ x = x_next;
+ y = y_next;
+ iter = g_sequence_iter_next (iter);
+ cp = g_sequence_get (iter);
+ x_next = cp->timestamp;
+ y_next = cp->value;
+
+ dx = gst_guint64_to_gdouble (x_next - x);
+ dy = y_next - y;
+ dxs[i] = dx;
+ dys[i] = dy;
+ ms[i] = dy / dx;
+ }
+
+ /* Get degree-1 coefficients */
+ c1s[0] = ms[0];
+ for (i = 1; i < n; i++) {
+ gdouble m = ms[i - 1];
+ gdouble m_next = ms[i];
+
+ if (m * m_next <= 0) {
+ c1s[i] = 0.0;
+ } else {
+ gdouble dx_next, dx_sum;
+
+ dx = dxs[i], dx_next = dxs[i + 1], dx_sum = dx + dx_next;
+ c1s[i] = 3.0 * dx_sum / ((dx_sum + dx_next) / m + (dx_sum + dx) / m_next);
+ }
+ }
+ c1s[n - 1] = ms[n - 1];
+
+ /* Get degree-2 and degree-3 coefficients */
+ iter = g_sequence_get_begin_iter (self->values);
+ for (i = 0; i < n - 1; i++) {
+ gdouble c1, m, inv_dx, common;
+ cp = g_sequence_get (iter);
+
+ c1 = c1s[i];
+ m = ms[i];
+ inv_dx = 1.0 / dxs[i];
+ common = c1 + c1s[i + 1] - m - m;
+
+ cp->cache.cubic_mono.c1s = c1;
+ cp->cache.cubic_mono.c2s = (m - c1 - common) * inv_dx;
+ cp->cache.cubic_mono.c3s = common * inv_dx * inv_dx;
+
+ iter = g_sequence_iter_next (iter);
+ }
+
+ /* Free our temporary arrays */
+ g_free (dxs);
+ g_free (dys);
+ g_free (ms);
+ g_free (c1s);
+}
+
+static inline gdouble
+_interpolate_cubic_mono (GstTimedValueControlSource * self,
+ GstControlPoint * cp1, gdouble value1, GstControlPoint * cp2,
+ gdouble value2, GstClockTime timestamp)
+{
+ if (!self->valid_cache) {
+ _interpolate_cubic_mono_update_cache (self);
+ self->valid_cache = TRUE;
+ }
+
+ if (cp2) {
+ gdouble diff = gst_guint64_to_gdouble (timestamp - cp1->timestamp);
+ gdouble diff2 = diff * diff;
+ gdouble out;
+
+ out = value1 + cp1->cache.cubic_mono.c1s * diff;
+ out += cp1->cache.cubic_mono.c2s * diff2;
+ out += cp1->cache.cubic_mono.c3s * diff * diff2;
+ return out;
+ } else {
+ return value1;
+ }
+}
+
+static gboolean
+interpolate_cubic_mono_get (GstTimedValueControlSource * self,
+ GstClockTime timestamp, gdouble * value)
+{
+ gboolean ret = FALSE;
+ GstControlPoint *cp1, *cp2 = NULL;
+
+ if (self->nvalues <= 2)
+ return interpolate_linear_get (self, timestamp, value);
+
+ g_mutex_lock (&self->lock);
+
+ if (_get_nearest_control_points (self, timestamp, &cp1, &cp2)) {
+ *value = _interpolate_cubic_mono (self, cp1, cp1->value, cp2,
+ (cp2 ? cp2->value : 0.0), timestamp);
+ ret = TRUE;
+ }
+ g_mutex_unlock (&self->lock);
+ return ret;
+}
+
+static gboolean
+interpolate_cubic_mono_get_value_array (GstTimedValueControlSource * self,
+ GstClockTime timestamp, GstClockTime interval, guint n_values,
+ gdouble * values)
+{
+ gboolean ret = FALSE;
+ guint i;
+ GstClockTime ts = timestamp;
+ GstClockTime next_ts = 0;
+ GstControlPoint *cp1 = NULL, *cp2 = NULL;
+
+ if (self->nvalues <= 2)
+ return interpolate_linear_get_value_array (self, timestamp, interval,
+ n_values, values);
+
+ g_mutex_lock (&self->lock);
+
+ for (i = 0; i < n_values; i++) {
+ GST_LOG ("values[%3d] : ts=%" GST_TIME_FORMAT ", next_ts=%" GST_TIME_FORMAT,
+ i, GST_TIME_ARGS (ts), GST_TIME_ARGS (next_ts));
+ if (ts >= next_ts) {
+ _get_nearest_control_points2 (self, ts, &cp1, &cp2, &next_ts);
+ }
+ if (cp1) {
+ *values = _interpolate_cubic_mono (self, cp1, cp1->value, cp2,
+ (cp2 ? cp2->value : 0.0), ts);
+ ret = TRUE;
+ GST_LOG ("values[%3d]=%lf", i, *values);
+ } else {
+ *values = NAN;
+ GST_LOG ("values[%3d]=-", i);
+ }
+ ts += interval;
+ values++;
+ }
+ g_mutex_unlock (&self->lock);
+ return ret;
+}
+
+
static struct
{
GstControlSourceGetValue get;
@@ -462,8 +608,10 @@
(GstControlSourceGetValue) interpolate_linear_get,
(GstControlSourceGetValueArray) interpolate_linear_get_value_array}, {
(GstControlSourceGetValue) interpolate_cubic_get,
- (GstControlSourceGetValueArray) interpolate_cubic_get_value_array}
-};
+ (GstControlSourceGetValueArray) interpolate_cubic_get_value_array}, {
+ (GstControlSourceGetValue) interpolate_cubic_mono_get,
+ (GstControlSourceGetValueArray)
+interpolate_cubic_mono_get_value_array}};
static const guint num_interpolation_modes = G_N_ELEMENTS (interpolation_modes);
@@ -480,6 +628,8 @@
{GST_INTERPOLATION_MODE_NONE, "GST_INTERPOLATION_MODE_NONE", "none"},
{GST_INTERPOLATION_MODE_LINEAR, "GST_INTERPOLATION_MODE_LINEAR", "linear"},
{GST_INTERPOLATION_MODE_CUBIC, "GST_INTERPOLATION_MODE_CUBIC", "cubic"},
+ {GST_INTERPOLATION_MODE_CUBIC_MONO, "GST_INTERPOLATION_MODE_CUBIC_MONO",
+ "cubic-mono"},
{0, NULL, NULL}
};
diff --git a/libs/gst/controller/gstinterpolationcontrolsource.h b/libs/gst/controller/gstinterpolationcontrolsource.h
index f4b2fbf..bb3d78d 100644
--- a/libs/gst/controller/gstinterpolationcontrolsource.h
+++ b/libs/gst/controller/gstinterpolationcontrolsource.h
@@ -54,7 +54,11 @@
* GstInterpolationMode:
* @GST_INTERPOLATION_MODE_NONE: steps-like interpolation, default
* @GST_INTERPOLATION_MODE_LINEAR: linear interpolation
- * @GST_INTERPOLATION_MODE_CUBIC: cubic interpolation
+ * @GST_INTERPOLATION_MODE_CUBIC: cubic interpolation (natural), may overshoot
+ * the min or max values set by the control point, but is more 'curvy'
+ * @GST_INTERPOLATION_MODE_CUBIC_MONO: monotonic cubic interpolation, will not
+ * produce any values outside of the min-max range set by the control points
+ * (Since 1.8)
*
* The various interpolation modes available.
*/
@@ -62,7 +66,8 @@
{
GST_INTERPOLATION_MODE_NONE,
GST_INTERPOLATION_MODE_LINEAR,
- GST_INTERPOLATION_MODE_CUBIC
+ GST_INTERPOLATION_MODE_CUBIC,
+ GST_INTERPOLATION_MODE_CUBIC_MONO,
} GstInterpolationMode;
/**
@@ -92,6 +97,10 @@
GstControlSource * gst_interpolation_control_source_new (void);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstInterpolationControlSource, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_INTERPOLATION_CONTROL_SOURCE_H__ */
diff --git a/libs/gst/controller/gstlfocontrolsource.h b/libs/gst/controller/gstlfocontrolsource.h
index 337ab53..8724229 100644
--- a/libs/gst/controller/gstlfocontrolsource.h
+++ b/libs/gst/controller/gstlfocontrolsource.h
@@ -95,6 +95,10 @@
GstControlSource *gst_lfo_control_source_new (void);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstLFOControlSource, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_LFO_CONTROL_SOURCE_H__ */
diff --git a/libs/gst/controller/gsttimedvaluecontrolsource.c b/libs/gst/controller/gsttimedvaluecontrolsource.c
index 4c8dca9..04101c2 100644
--- a/libs/gst/controller/gsttimedvaluecontrolsource.c
+++ b/libs/gst/controller/gsttimedvaluecontrolsource.c
@@ -171,36 +171,25 @@
gst_timed_value_control_source_set_internal (GstTimedValueControlSource *
self, GstClockTime timestamp, const gdouble value)
{
- GSequenceIter *iter;
GstControlPoint *cp;
g_mutex_lock (&self->lock);
/* check if a control point for the timestamp already exists */
- /* iter contains the iter right *after* timestamp */
if (G_LIKELY (self->values)) {
- iter =
- g_sequence_search (self->values, ×tamp,
+ GSequenceIter *iter = g_sequence_lookup (self->values, ×tamp,
(GCompareDataFunc) gst_control_point_find, NULL);
+
if (iter) {
- GSequenceIter *prev = g_sequence_iter_prev (iter);
+ GstControlPoint *cp = g_sequence_get (iter);
- if (!g_sequence_iter_is_end (prev)) {
- GstControlPoint *cp = g_sequence_get (prev);
+ /* update control point */
+ cp->value = value;
+ g_mutex_unlock (&self->lock);
- /* If the timestamp is the same just update the control point value */
- if (cp->timestamp == timestamp) {
-
- /* update control point */
- cp->value = value;
- g_mutex_unlock (&self->lock);
-
- g_signal_emit (self,
- gst_timed_value_control_source_signals[VALUE_CHANGED_SIGNAL], 0,
- cp);
- goto done;
- }
- }
+ g_signal_emit (self,
+ gst_timed_value_control_source_signals[VALUE_CHANGED_SIGNAL], 0, cp);
+ goto done;
}
} else {
self->values = g_sequence_new ((GDestroyNotify) gst_control_point_free);
@@ -337,24 +326,17 @@
g_mutex_lock (&self->lock);
/* check if a control point for the timestamp exists */
if (G_LIKELY (self->values) && (iter =
- g_sequence_search (self->values, ×tamp,
+ g_sequence_lookup (self->values, ×tamp,
(GCompareDataFunc) gst_control_point_find, NULL))) {
/* Iter contains the iter right after timestamp, i.e.
* we need to get the previous one and check the timestamp
*/
- iter = g_sequence_iter_prev (iter);
- cp = g_sequence_get (iter);
- if (cp->timestamp == timestamp) {
- cp = g_slice_dup (GstControlPoint, cp);
- g_sequence_remove (iter);
- self->nvalues--;
- self->valid_cache = FALSE;
- res = TRUE;
- } else {
- cp = NULL;
- }
-
+ cp = g_slice_dup (GstControlPoint, g_sequence_get (iter));
+ g_sequence_remove (iter);
+ self->nvalues--;
+ self->valid_cache = FALSE;
+ res = TRUE;
}
g_mutex_unlock (&self->lock);
diff --git a/libs/gst/controller/gsttimedvaluecontrolsource.h b/libs/gst/controller/gsttimedvaluecontrolsource.h
index b661da9..bfc5b07 100644
--- a/libs/gst/controller/gsttimedvaluecontrolsource.h
+++ b/libs/gst/controller/gsttimedvaluecontrolsource.h
@@ -55,7 +55,7 @@
* @timestamp: timestamp of the value change
* @value: the new value
*
- * a internal structure for value+time and various temporary
+ * An internal structure for value+time and various temporary
* values used for interpolation. This "inherits" from
* GstTimedValue.
*/
@@ -70,12 +70,15 @@
/* Caches for the interpolators */
/* FIXME: we should not have this here already ... */
union {
- struct {
+ struct { /* 16 bytes */
gdouble h;
gdouble z;
} cubic;
+ struct { /* 24 bytes */
+ gdouble c1s, c2s, c3s;
+ } cubic_mono;
+ guint8 _gst_reserved[64];
} cache;
-
};
GType gst_control_point_get_type (void);
@@ -132,6 +135,10 @@
gint gst_timed_value_control_source_get_count (GstTimedValueControlSource * self);
void gst_timed_value_control_invalidate_cache (GstTimedValueControlSource * self);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTimedValueControlSource, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_TIMED_VALUE_CONTROL_SOURCE_H__ */
diff --git a/libs/gst/controller/gsttriggercontrolsource.h b/libs/gst/controller/gsttriggercontrolsource.h
index 16e3ac9..2e9f21c 100644
--- a/libs/gst/controller/gsttriggercontrolsource.h
+++ b/libs/gst/controller/gsttriggercontrolsource.h
@@ -78,6 +78,10 @@
GstControlSource *gst_trigger_control_source_new (void);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstTriggerControlSource, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_TRIGGER_CONTROL_SOURCE_H__ */
diff --git a/libs/gst/helpers/Makefile.in b/libs/gst/helpers/Makefile.in
index a8f55bd..db5c8d3 100644
--- a/libs/gst/helpers/Makefile.in
+++ b/libs/gst/helpers/Makefile.in
@@ -391,6 +391,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/libs/gst/helpers/gst-completion-helper.c b/libs/gst/helpers/gst-completion-helper.c
index e99b73b..95821c8 100644
--- a/libs/gst/helpers/gst-completion-helper.c
+++ b/libs/gst/helpers/gst-completion-helper.c
@@ -235,6 +235,8 @@
g_printerr ("Error initializing: %s\n", GST_STR_NULL (err->message));
else
g_printerr ("Error initializing: Unknown error!\n");
+ g_clear_error (&err);
+ g_option_context_free (ctx);
exit (1);
}
g_option_context_free (ctx);
diff --git a/libs/gst/helpers/gst-ptp-helper.c b/libs/gst/helpers/gst-ptp-helper.c
index ba5de97..423c4ef 100644
--- a/libs/gst/helpers/gst-ptp-helper.c
+++ b/libs/gst/helpers/gst-ptp-helper.c
@@ -99,6 +99,7 @@
read = g_socket_receive (socket, buffer, sizeof (buffer), NULL, &err);
if (read == -1)
g_error ("Failed to read from socket: %s", err->message);
+ g_clear_error (&err);
if (verbose)
g_message ("Received %" G_GSSIZE_FORMAT " bytes from %s socket", read,
@@ -112,6 +113,7 @@
sizeof (header), &written, &err);
if (status == G_IO_STATUS_ERROR) {
g_error ("Failed to write to stdout: %s", err->message);
+ g_clear_error (&err);
} else if (status == G_IO_STATUS_EOF) {
g_message ("EOF on stdout");
exit (0);
@@ -125,6 +127,7 @@
g_io_channel_write_chars (stdout_channel, buffer, read, &written, &err);
if (status == G_IO_STATUS_ERROR) {
g_error ("Failed to write to stdout: %s", err->message);
+ g_clear_error (&err);
} else if (status == G_IO_STATUS_EOF) {
g_message ("EOF on stdout");
exit (0);
@@ -158,6 +161,7 @@
&read, &err);
if (status == G_IO_STATUS_ERROR) {
g_error ("Failed to read from stdin: %s", err->message);
+ g_clear_error (&err);
} else if (status == G_IO_STATUS_EOF) {
g_message ("EOF on stdin");
exit (0);
@@ -172,6 +176,7 @@
status = g_io_channel_read_chars (channel, buffer, header.size, &read, &err);
if (status == G_IO_STATUS_ERROR) {
g_error ("Failed to read from stdin: %s", err->message);
+ g_clear_error (&err);
} else if (status == G_IO_STATUS_EOF) {
g_message ("EOF on stdin");
exit (0);
@@ -193,7 +198,7 @@
g_error ("Failed to write to socket: %s", err->message);
else if (written != header.size)
g_error ("Unexpected write size: %" G_GSSIZE_FORMAT, written);
-
+ g_clear_error (&err);
if (verbose)
g_message ("Sent %" G_GSSIZE_FORMAT " bytes to %s socket", read,
(header.type == TYPE_EVENT ? "event" : "general"));
@@ -220,6 +225,7 @@
G_SOCKET_PROTOCOL_UDP, &err);
if (!socket_event)
g_error ("Couldn't create event socket: %s", err->message);
+ g_clear_error (&err);
g_socket_set_multicast_loopback (socket_event, FALSE);
socket_general =
@@ -227,6 +233,7 @@
G_SOCKET_PROTOCOL_UDP, &err);
if (!socket_general)
g_error ("Couldn't create general socket: %s", err->message);
+ g_clear_error (&err);
g_socket_set_multicast_loopback (socket_general, FALSE);
/* Bind sockets */
@@ -461,18 +468,22 @@
if (!g_socket_join_multicast_group (socket_event, mcast_addr, FALSE, NULL,
&err))
g_error ("Couldn't join multicast group: %s", err->message);
+ g_clear_error (&err);
if (!g_socket_join_multicast_group (socket_general, mcast_addr, FALSE,
NULL, &err))
g_error ("Couldn't join multicast group: %s", err->message);
+ g_clear_error (&err);
}
} else {
/* Join multicast group without any interface */
if (!g_socket_join_multicast_group (socket_event, mcast_addr, FALSE, NULL,
&err))
g_error ("Couldn't join multicast group: %s", err->message);
+ g_clear_error (&err);
if (!g_socket_join_multicast_group (socket_general, mcast_addr, FALSE, NULL,
&err))
g_error ("Couldn't join multicast group: %s", err->message);
+ g_clear_error (&err);
}
event_saddr = g_inet_socket_address_new (mcast_addr, PTP_EVENT_PORT);
@@ -595,6 +606,7 @@
sizeof (header), &written, &err);
if (status == G_IO_STATUS_ERROR) {
g_error ("Failed to write to stdout: %s", err->message);
+ g_clear_error (&err);
} else if (status == G_IO_STATUS_EOF) {
g_message ("EOF on stdout");
exit (0);
@@ -609,6 +621,7 @@
(const gchar *) clock_id_array, sizeof (clock_id_array), &written, &err);
if (status == G_IO_STATUS_ERROR) {
g_error ("Failed to write to stdout: %s", err->message);
+ g_clear_error (&err);
} else if (status == G_IO_STATUS_EOF) {
g_message ("EOF on stdout");
exit (0);
@@ -657,6 +670,7 @@
g_option_context_add_main_entries (opt_ctx, opt_entries, NULL);
if (!g_option_context_parse (opt_ctx, &argc, &argv, &err))
g_error ("Error parsing options: %s", err->message);
+ g_clear_error (&err);
g_option_context_free (opt_ctx);
setup_sockets ();
diff --git a/libs/gst/net/Makefile.am b/libs/gst/net/Makefile.am
index 3daf640..1fc581f 100644
--- a/libs/gst/net/Makefile.am
+++ b/libs/gst/net/Makefile.am
@@ -58,7 +58,8 @@
$(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" GI_SCANNER_DISABLE_CACHE=yes\
GST_PLUGIN_SYSTEM_PATH_1_0="" GST_PLUGIN_PATH_1_0="" GST_REGISTRY_UPDATE=no \
$(INTROSPECTION_SCANNER) -v --namespace GstNet \
- --strip-prefix=Gst \
+ --identifier-prefix=Gst \
+ --symbol-prefix=gst \
--warn-all \
--nsversion=@GST_API_VERSION@ \
-I$(top_srcdir) \
diff --git a/libs/gst/net/Makefile.in b/libs/gst/net/Makefile.in
index a5020bd..95ee785 100644
--- a/libs/gst/net/Makefile.in
+++ b/libs/gst/net/Makefile.in
@@ -375,6 +375,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
@@ -1052,7 +1054,8 @@
@HAVE_INTROSPECTION_TRUE@ $(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" GI_SCANNER_DISABLE_CACHE=yes\
@HAVE_INTROSPECTION_TRUE@ GST_PLUGIN_SYSTEM_PATH_1_0="" GST_PLUGIN_PATH_1_0="" GST_REGISTRY_UPDATE=no \
@HAVE_INTROSPECTION_TRUE@ $(INTROSPECTION_SCANNER) -v --namespace GstNet \
-@HAVE_INTROSPECTION_TRUE@ --strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ --identifier-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@ --symbol-prefix=gst \
@HAVE_INTROSPECTION_TRUE@ --warn-all \
@HAVE_INTROSPECTION_TRUE@ --nsversion=@GST_API_VERSION@ \
@HAVE_INTROSPECTION_TRUE@ -I$(top_srcdir) \
diff --git a/libs/gst/net/gstnetaddressmeta.c b/libs/gst/net/gstnetaddressmeta.c
index c4cdd4d..e54d0c8 100644
--- a/libs/gst/net/gstnetaddressmeta.c
+++ b/libs/gst/net/gstnetaddressmeta.c
@@ -119,3 +119,19 @@
return meta;
}
+
+/**
+ * gst_buffer_get_net_address_meta:
+ * @buffer: a #GstBuffer
+ *
+ * Find the #GstNetAddressMeta on @buffer.
+ *
+ * Returns: (transfer none): the #GstNetAddressMeta or %NULL when there
+ * is no such metadata on @buffer.
+ */
+GstNetAddressMeta *
+gst_buffer_get_net_address_meta (GstBuffer * buffer)
+{
+ return (GstNetAddressMeta *)
+ gst_buffer_get_meta (buffer, GST_NET_ADDRESS_META_API_TYPE);
+}
diff --git a/libs/gst/net/gstnetaddressmeta.h b/libs/gst/net/gstnetaddressmeta.h
index ff8b523..01febb5 100644
--- a/libs/gst/net/gstnetaddressmeta.h
+++ b/libs/gst/net/gstnetaddressmeta.h
@@ -43,15 +43,13 @@
GType gst_net_address_meta_api_get_type (void);
#define GST_NET_ADDRESS_META_API_TYPE (gst_net_address_meta_api_get_type())
-#define gst_buffer_get_net_address_meta(b) \
- ((GstNetAddressMeta*)gst_buffer_get_meta((b),GST_NET_ADDRESS_META_API_TYPE))
-
/* implementation */
const GstMetaInfo *gst_net_address_meta_get_info (void);
#define GST_NET_ADDRESS_META_INFO (gst_net_address_meta_get_info())
GstNetAddressMeta * gst_buffer_add_net_address_meta (GstBuffer *buffer,
GSocketAddress *addr);
+GstNetAddressMeta * gst_buffer_get_net_address_meta (GstBuffer *buffer);
G_END_DECLS
diff --git a/libs/gst/net/gstnetclientclock.h b/libs/gst/net/gstnetclientclock.h
index 0839d73..47850f5 100644
--- a/libs/gst/net/gstnetclientclock.h
+++ b/libs/gst/net/gstnetclientclock.h
@@ -91,6 +91,14 @@
GstClock* gst_ntp_clock_new (const gchar *name, const gchar *remote_address,
gint remote_port, GstClockTime base_time);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstNetClientClock, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstNtpClock, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_NET_CLIENT_CLOCK_H__ */
diff --git a/libs/gst/net/gstnettimepacket.h b/libs/gst/net/gstnettimepacket.h
index 3f82264..cccf191 100644
--- a/libs/gst/net/gstnettimepacket.h
+++ b/libs/gst/net/gstnettimepacket.h
@@ -64,6 +64,10 @@
GSocketAddress * dest_address,
GError ** error);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstNetTimePacket, gst_net_time_packet_free)
+#endif
+
G_END_DECLS
diff --git a/libs/gst/net/gstnettimeprovider.h b/libs/gst/net/gstnettimeprovider.h
index d9834c2..f730d9e 100644
--- a/libs/gst/net/gstnettimeprovider.h
+++ b/libs/gst/net/gstnettimeprovider.h
@@ -68,6 +68,10 @@
const gchar *address,
gint port);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstNetTimeProvider, gst_object_unref)
+#endif
+
G_END_DECLS
diff --git a/libs/gst/net/gstptpclock.h b/libs/gst/net/gstptpclock.h
index 7a85cab..1e69177 100644
--- a/libs/gst/net/gstptpclock.h
+++ b/libs/gst/net/gstptpclock.h
@@ -143,6 +143,10 @@
GstClock* gst_ptp_clock_new (const gchar *name,
guint domain);
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstPtpClock, gst_object_unref)
+#endif
+
G_END_DECLS
#endif /* __GST_PTP_CLOCK_H__ */
diff --git a/m4/Makefile.in b/m4/Makefile.in
index 73001ee..a294314 100644
--- a/m4/Makefile.in
+++ b/m4/Makefile.in
@@ -273,6 +273,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/pkgconfig/Makefile.in b/pkgconfig/Makefile.in
index 1e15507..19fc784 100644
--- a/pkgconfig/Makefile.in
+++ b/pkgconfig/Makefile.in
@@ -317,6 +317,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index 4e46e71..cee04aa 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -1,3 +1,4 @@
-SUBDIRS = elements
+SUBDIRS = elements tracers
-DIST_SUBDIRS = elements
+DIST_SUBDIRS = elements tracers
+
diff --git a/plugins/Makefile.in b/plugins/Makefile.in
index cf163b9..ead0d07 100644
--- a/plugins/Makefile.in
+++ b/plugins/Makefile.in
@@ -332,6 +332,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
@@ -502,8 +504,8 @@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
-SUBDIRS = elements
-DIST_SUBDIRS = elements
+SUBDIRS = elements tracers
+DIST_SUBDIRS = elements tracers
all: all-recursive
.SUFFIXES:
diff --git a/plugins/elements/Makefile.in b/plugins/elements/Makefile.in
index 9d3538f..239f6d1 100644
--- a/plugins/elements/Makefile.in
+++ b/plugins/elements/Makefile.in
@@ -380,6 +380,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/plugins/elements/gstcapsfilter.c b/plugins/elements/gstcapsfilter.c
index 74dbafb..6d5d180 100644
--- a/plugins/elements/gstcapsfilter.c
+++ b/plugins/elements/gstcapsfilter.c
@@ -359,19 +359,6 @@
gst_base_transform_reconfigure_sink (base);
}
- if (ret) {
- /* if we can intersect, see if the other end also accepts */
- if (direction == GST_PAD_SRC)
- ret =
- gst_pad_peer_query_accept_caps (GST_BASE_TRANSFORM_SINK_PAD (base),
- caps);
- else
- ret =
- gst_pad_peer_query_accept_caps (GST_BASE_TRANSFORM_SRC_PAD (base),
- caps);
- GST_DEBUG_OBJECT (capsfilter, "peer accept: %d", ret);
- }
-
gst_caps_unref (filter_caps);
return ret;
diff --git a/plugins/elements/gstdownloadbuffer.c b/plugins/elements/gstdownloadbuffer.c
index f805036..7be3afa 100644
--- a/plugins/elements/gstdownloadbuffer.c
+++ b/plugins/elements/gstdownloadbuffer.c
@@ -30,7 +30,7 @@
* With max-size-bytes and max-size-time you can configure the buffering limits.
* The downloadbuffer element will try to read-ahead these amounts of data. When
* the amount of read-ahead data drops below low-percent of the configured max,
- * the element will start emiting BUFFERING messages until high-percent of max is
+ * the element will start emitting BUFFERING messages until high-percent of max is
* reached again.
*
* The downloadbuffer provides push and pull based scheduling on its source pad
@@ -70,8 +70,6 @@
#include <io.h> /* lseek, open, close, read */
#undef lseek
#define lseek _lseeki64
-#undef off_t
-#define off_t guint64
#else
#include <unistd.h>
#endif
@@ -874,7 +872,7 @@
GST_DEBUG_OBJECT (dlbuf, "opening temp file %s", dlbuf->temp_template);
- /* If temp_template was set, allocate a filename and open that filen */
+ /* If temp_template was set, allocate a filename and open that file */
/* nothing to do */
if (dlbuf->temp_template == NULL)
diff --git a/plugins/elements/gstfdsrc.c b/plugins/elements/gstfdsrc.c
index fe607de..8a59907 100644
--- a/plugins/elements/gstfdsrc.c
+++ b/plugins/elements/gstfdsrc.c
@@ -64,8 +64,6 @@
#include <io.h> /* lseek, open, close, read */
#undef lseek
#define lseek _lseeki64
-#undef off_t
-#define off_t guint64
#endif
#include <sys/stat.h>
diff --git a/plugins/elements/gstfilesink.c b/plugins/elements/gstfilesink.c
index b90d8a1..273ca91 100644
--- a/plugins/elements/gstfilesink.c
+++ b/plugins/elements/gstfilesink.c
@@ -226,7 +226,7 @@
/**
* GstFileSink:append
- *
+ *
* Append to an already existing file.
*/
g_object_class_install_property (gobject_class, PROP_APPEND,
@@ -446,7 +446,8 @@
{
if (sink->file) {
if (fclose (sink->file) != 0)
- goto close_failed;
+ GST_ELEMENT_ERROR (sink, RESOURCE, CLOSE,
+ (_("Error closing file \"%s\"."), sink->filename), GST_ERROR_SYSTEM);
GST_DEBUG_OBJECT (sink, "closed file");
sink->file = NULL;
@@ -454,15 +455,6 @@
g_free (sink->buffer);
sink->buffer = NULL;
}
- return;
-
- /* ERRORS */
-close_failed:
- {
- GST_ELEMENT_ERROR (sink, RESOURCE, CLOSE,
- (_("Error closing file \"%s\"."), sink->filename), GST_ERROR_SYSTEM);
- return;
- }
}
static gboolean
diff --git a/plugins/elements/gstfilesink.h b/plugins/elements/gstfilesink.h
index bd0e0ba..6e3897c 100644
--- a/plugins/elements/gstfilesink.h
+++ b/plugins/elements/gstfilesink.h
@@ -81,7 +81,7 @@
gint buffer_mode;
guint buffer_size;
gchar *buffer;
-
+
gboolean append;
};
diff --git a/plugins/elements/gstidentity.c b/plugins/elements/gstidentity.c
index 0214596..f0e9833 100644
--- a/plugins/elements/gstidentity.c
+++ b/plugins/elements/gstidentity.c
@@ -63,6 +63,7 @@
#define DEFAULT_DUPLICATE 1
#define DEFAULT_ERROR_AFTER -1
#define DEFAULT_DROP_PROBABILITY 0.0
+#define DEFAULT_DROP_BUFFER_FLAGS 0
#define DEFAULT_DATARATE 0
#define DEFAULT_SILENT TRUE
#define DEFAULT_SINGLE_SEGMENT FALSE
@@ -78,6 +79,7 @@
PROP_SLEEP_TIME,
PROP_ERROR_AFTER,
PROP_DROP_PROBABILITY,
+ PROP_DROP_BUFFER_FLAGS,
PROP_DATARATE,
PROP_SILENT,
PROP_SINGLE_SEGMENT,
@@ -159,6 +161,19 @@
"The Probability a buffer is dropped", 0.0, 1.0,
DEFAULT_DROP_PROBABILITY,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GstIdentity:drop-buffer-flags:
+ *
+ * Drop buffers with the given flags.
+ *
+ * Since: 1.8
+ **/
+ g_object_class_install_property (gobject_class, PROP_DROP_BUFFER_FLAGS,
+ g_param_spec_flags ("drop-buffer-flags", "Check flags to drop buffers",
+ "Drop buffers with the given flags",
+ GST_TYPE_BUFFER_FLAGS, DEFAULT_DROP_BUFFER_FLAGS,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_DATARATE,
g_param_spec_int ("datarate", "Datarate",
"(Re)timestamps buffers with number of bytes per second (0 = inactive)",
@@ -251,6 +266,7 @@
identity->sleep_time = DEFAULT_SLEEP_TIME;
identity->error_after = DEFAULT_ERROR_AFTER;
identity->drop_probability = DEFAULT_DROP_PROBABILITY;
+ identity->drop_buffer_flags = DEFAULT_DROP_BUFFER_FLAGS;
identity->datarate = DEFAULT_DATARATE;
identity->silent = DEFAULT_SILENT;
identity->single_segment = DEFAULT_SINGLE_SEGMENT;
@@ -581,6 +597,9 @@
goto dropped;
}
+ if (GST_BUFFER_FLAG_IS_SET (buf, identity->drop_buffer_flags))
+ goto dropped;
+
if (identity->dump) {
GstMapInfo info;
@@ -687,6 +706,9 @@
case PROP_DROP_PROBABILITY:
identity->drop_probability = g_value_get_float (value);
break;
+ case PROP_DROP_BUFFER_FLAGS:
+ identity->drop_buffer_flags = g_value_get_flags (value);
+ break;
case PROP_DATARATE:
identity->datarate = g_value_get_int (value);
break;
@@ -730,6 +752,9 @@
case PROP_DROP_PROBABILITY:
g_value_set_float (value, identity->drop_probability);
break;
+ case PROP_DROP_BUFFER_FLAGS:
+ g_value_set_flags (value, identity->drop_buffer_flags);
+ break;
case PROP_DATARATE:
g_value_set_int (value, identity->datarate);
break;
diff --git a/plugins/elements/gstidentity.h b/plugins/elements/gstidentity.h
index 315cdbd..c562d47 100644
--- a/plugins/elements/gstidentity.h
+++ b/plugins/elements/gstidentity.h
@@ -65,6 +65,7 @@
gboolean check_imperfect_timestamp;
gboolean check_imperfect_offset;
gboolean single_segment;
+ GstBufferFlags drop_buffer_flags;
GstClockTime prev_timestamp;
GstClockTime prev_duration;
guint64 prev_offset;
diff --git a/plugins/elements/gstmultiqueue.c b/plugins/elements/gstmultiqueue.c
index 479db52..bd0b06c 100644
--- a/plugins/elements/gstmultiqueue.c
+++ b/plugins/elements/gstmultiqueue.c
@@ -149,7 +149,9 @@
* in every segment usage */
/* position of src/sink */
- GstClockTime sinktime, srctime;
+ GstClockTimeDiff sinktime, srctime;
+ /* cached input value, used for interleave */
+ GstClockTimeDiff cached_sinktime;
/* TRUE if either position needs to be recalculated */
gboolean sink_tainted, src_tainted;
@@ -158,20 +160,25 @@
GstDataQueueSize max_size, extra_size;
GstClockTime cur_time;
gboolean is_eos;
+ gboolean is_sparse;
gboolean flushing;
+ gboolean active;
/* Protected by global lock */
guint32 nextid; /* ID of the next object waiting to be pushed */
guint32 oldid; /* ID of the last object pushed (last in a series) */
guint32 last_oldid; /* Previously observed old_id, reset to MAXUINT32 on flush */
- GstClockTime next_time; /* End running time of next buffer to be pushed */
- GstClockTime last_time; /* Start running time of last pushed buffer */
+ GstClockTimeDiff next_time; /* End running time of next buffer to be pushed */
+ GstClockTimeDiff last_time; /* Start running time of last pushed buffer */
GCond turn; /* SingleQueue turn waiting conditional */
/* for serialized queries */
GCond query_handled;
gboolean last_query;
GstQuery *last_handled_query;
+
+ /* For interleave calculation */
+ GThread *thread;
};
@@ -248,6 +255,8 @@
#define DEFAULT_LOW_PERCENT 10
#define DEFAULT_HIGH_PERCENT 99
#define DEFAULT_SYNC_BY_RUNNING_TIME FALSE
+#define DEFAULT_USE_INTERLEAVE FALSE
+#define DEFAULT_UNLINKED_CACHE_TIME 250 * GST_MSECOND
enum
{
@@ -262,6 +271,8 @@
PROP_LOW_PERCENT,
PROP_HIGH_PERCENT,
PROP_SYNC_BY_RUNNING_TIME,
+ PROP_USE_INTERLEAVE,
+ PROP_UNLINKED_CACHE_TIME,
PROP_LAST
};
@@ -281,6 +292,23 @@
} \
} G_STMT_END
+/* Convenience function */
+static inline GstClockTimeDiff
+my_segment_to_running_time (GstSegment * segment, GstClockTime val)
+{
+ GstClockTimeDiff res = GST_CLOCK_STIME_NONE;
+
+ if (GST_CLOCK_TIME_IS_VALID (val)) {
+ gboolean sign =
+ gst_segment_to_running_time_full (segment, GST_FORMAT_TIME, val, &val);
+ if (sign > 0)
+ res = val;
+ else if (sign < 0)
+ res = -val;
+ }
+ return res;
+}
+
static void gst_multi_queue_finalize (GObject * object);
static void gst_multi_queue_set_property (GObject * object,
guint prop_id, const GValue * value, GParamSpec * pspec);
@@ -428,6 +456,19 @@
DEFAULT_SYNC_BY_RUNNING_TIME,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_USE_INTERLEAVE,
+ g_param_spec_boolean ("use-interleave", "Use interleave",
+ "Adjust time limits based on input interleave",
+ DEFAULT_USE_INTERLEAVE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_UNLINKED_CACHE_TIME,
+ g_param_spec_uint64 ("unlinked-cache-time", "Unlinked cache time (ns)",
+ "Extra buffering in time for unlinked streams (if 'sync-by-running-time')",
+ 0, G_MAXUINT64, DEFAULT_UNLINKED_CACHE_TIME,
+ G_PARAM_READWRITE | GST_PARAM_MUTABLE_PLAYING |
+ G_PARAM_STATIC_STRINGS));
+
+
gobject_class->finalize = gst_multi_queue_finalize;
gst_element_class_set_static_metadata (gstelement_class,
@@ -465,10 +506,12 @@
mqueue->high_percent = DEFAULT_HIGH_PERCENT;
mqueue->sync_by_running_time = DEFAULT_SYNC_BY_RUNNING_TIME;
+ mqueue->use_interleave = DEFAULT_USE_INTERLEAVE;
+ mqueue->unlinked_cache_time = DEFAULT_UNLINKED_CACHE_TIME;
mqueue->counter = 1;
mqueue->highid = -1;
- mqueue->high_time = GST_CLOCK_TIME_NONE;
+ mqueue->high_time = GST_CLOCK_STIME_NONE;
g_mutex_init (&mqueue->qlock);
g_mutex_init (&mqueue->buffering_post_lock);
@@ -606,6 +649,15 @@
case PROP_SYNC_BY_RUNNING_TIME:
mq->sync_by_running_time = g_value_get_boolean (value);
break;
+ case PROP_USE_INTERLEAVE:
+ mq->use_interleave = g_value_get_boolean (value);
+ break;
+ case PROP_UNLINKED_CACHE_TIME:
+ GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+ mq->unlinked_cache_time = g_value_get_uint64 (value);
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+ gst_multi_queue_post_buffering (mq);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -651,6 +703,12 @@
case PROP_SYNC_BY_RUNNING_TIME:
g_value_set_boolean (value, mq->sync_by_running_time);
break;
+ case PROP_USE_INTERLEAVE:
+ g_value_set_boolean (value, mq->use_interleave);
+ break;
+ case PROP_UNLINKED_CACHE_TIME:
+ g_value_set_uint64 (value, mq->unlinked_cache_time);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -865,12 +923,13 @@
sq->nextid = 0;
sq->oldid = 0;
sq->last_oldid = G_MAXUINT32;
- sq->next_time = GST_CLOCK_TIME_NONE;
- sq->last_time = GST_CLOCK_TIME_NONE;
+ sq->next_time = GST_CLOCK_STIME_NONE;
+ sq->last_time = GST_CLOCK_STIME_NONE;
+ sq->cached_sinktime = GST_CLOCK_STIME_NONE;
gst_data_queue_set_flushing (sq->queue, FALSE);
/* Reset high time to be recomputed next */
- mq->high_time = GST_CLOCK_TIME_NONE;
+ mq->high_time = GST_CLOCK_STIME_NONE;
sq->flushing = FALSE;
GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
@@ -898,7 +957,7 @@
size.bytes, sq->max_size.bytes, sq->cur_time, sq->max_size.time);
/* get bytes and time percentages and take the max */
- if (sq->is_eos || sq->srcresult == GST_FLOW_NOT_LINKED) {
+ if (sq->is_eos || sq->srcresult == GST_FLOW_NOT_LINKED || sq->is_sparse) {
percent = 100;
} else {
percent = 0;
@@ -984,22 +1043,111 @@
g_mutex_unlock (&mq->buffering_post_lock);
}
+static void
+calculate_interleave (GstMultiQueue * mq)
+{
+ GstClockTimeDiff low, high;
+ GstClockTime interleave;
+ GList *tmp;
+
+ low = high = GST_CLOCK_STIME_NONE;
+ interleave = mq->interleave;
+ /* Go over all single queues and calculate lowest/highest value */
+ for (tmp = mq->queues; tmp; tmp = tmp->next) {
+ GstSingleQueue *sq = (GstSingleQueue *) tmp->data;
+ /* Ignore sparse streams for interleave calculation */
+ if (sq->is_sparse)
+ continue;
+ /* If a stream is not active yet (hasn't received any buffers), set
+ * a maximum interleave to allow it to receive more data */
+ if (!sq->active) {
+ GST_LOG_OBJECT (mq,
+ "queue %d is not active yet, forcing interleave to 5s", sq->id);
+ mq->interleave = 5 * GST_SECOND;
+ /* Update max-size time */
+ mq->max_size.time = mq->interleave;
+ SET_CHILD_PROPERTY (mq, time);
+ goto beach;
+ }
+ if (GST_CLOCK_STIME_IS_VALID (sq->cached_sinktime)) {
+ if (low == GST_CLOCK_STIME_NONE || sq->cached_sinktime < low)
+ low = sq->cached_sinktime;
+ if (high == GST_CLOCK_STIME_NONE || sq->cached_sinktime > high)
+ high = sq->cached_sinktime;
+ }
+ GST_LOG_OBJECT (mq,
+ "queue %d , sinktime:%" GST_STIME_FORMAT " low:%" GST_STIME_FORMAT
+ " high:%" GST_STIME_FORMAT, sq->id,
+ GST_STIME_ARGS (sq->cached_sinktime), GST_STIME_ARGS (low),
+ GST_STIME_ARGS (high));
+ }
+
+ if (GST_CLOCK_STIME_IS_VALID (low) && GST_CLOCK_STIME_IS_VALID (high)) {
+ interleave = high - low;
+ /* Padding of interleave and minimum value */
+ /* FIXME : Make the minimum time interleave a property */
+ interleave = (150 * interleave / 100) + 250 * GST_MSECOND;
+
+ /* Update the stored interleave if:
+ * * No data has arrived yet (high == low)
+ * * Or it went higher
+ * * Or it went lower and we've gone past the previous interleave needed */
+ if (high == low || interleave > mq->interleave ||
+ ((mq->last_interleave_update + (2 * MIN (GST_SECOND,
+ mq->interleave)) < low)
+ && interleave < (mq->interleave * 3 / 4))) {
+ /* Update the interleave */
+ mq->interleave = interleave;
+ mq->last_interleave_update = high;
+ /* Update max-size time */
+ mq->max_size.time = mq->interleave;
+ SET_CHILD_PROPERTY (mq, time);
+ }
+ }
+
+beach:
+ GST_DEBUG_OBJECT (mq,
+ "low:%" GST_STIME_FORMAT " high:%" GST_STIME_FORMAT " interleave:%"
+ GST_TIME_FORMAT " mq->interleave:%" GST_TIME_FORMAT
+ " last_interleave_update:%" GST_STIME_FORMAT, GST_STIME_ARGS (low),
+ GST_STIME_ARGS (high), GST_TIME_ARGS (interleave),
+ GST_TIME_ARGS (mq->interleave),
+ GST_STIME_ARGS (mq->last_interleave_update));
+}
+
+
/* calculate the diff between running time on the sink and src of the queue.
* This is the total amount of time in the queue.
* WITH LOCK TAKEN */
static void
update_time_level (GstMultiQueue * mq, GstSingleQueue * sq)
{
- gint64 sink_time, src_time;
+ GstClockTimeDiff sink_time, src_time;
if (sq->sink_tainted) {
- sink_time = sq->sinktime =
- gst_segment_to_running_time (&sq->sink_segment, GST_FORMAT_TIME,
+ sink_time = sq->sinktime = my_segment_to_running_time (&sq->sink_segment,
sq->sink_segment.position);
- if (G_UNLIKELY (sink_time != GST_CLOCK_TIME_NONE))
+ GST_DEBUG_OBJECT (mq,
+ "queue %d sink_segment.position:%" GST_TIME_FORMAT ", sink_time:%"
+ GST_STIME_FORMAT, sq->id, GST_TIME_ARGS (sq->sink_segment.position),
+ GST_STIME_ARGS (sink_time));
+
+ if (G_UNLIKELY (sq->last_time == GST_CLOCK_STIME_NONE)) {
+ /* If the single queue still doesn't have a last_time set, this means
+ * that nothing has been pushed out yet.
+ * In order for the high_time computation to be as efficient as possible,
+ * we set the last_time */
+ sq->last_time = sink_time;
+ }
+ if (G_UNLIKELY (sink_time != GST_CLOCK_STIME_NONE)) {
/* if we have a time, we become untainted and use the time */
sq->sink_tainted = FALSE;
+ if (mq->use_interleave) {
+ sq->cached_sinktime = sink_time;
+ calculate_interleave (mq);
+ }
+ }
} else
sink_time = sq->sinktime;
@@ -1023,21 +1171,22 @@
position = sq->sink_segment.position;
}
- src_time = sq->srctime =
- gst_segment_to_running_time (segment, GST_FORMAT_TIME, position);
+ src_time = sq->srctime = my_segment_to_running_time (segment, position);
/* if we have a time, we become untainted and use the time */
- if (G_UNLIKELY (src_time != GST_CLOCK_TIME_NONE))
+ if (G_UNLIKELY (src_time != GST_CLOCK_STIME_NONE)) {
sq->src_tainted = FALSE;
+ }
} else
src_time = sq->srctime;
GST_DEBUG_OBJECT (mq,
- "queue %d, sink %" GST_TIME_FORMAT ", src %" GST_TIME_FORMAT, sq->id,
- GST_TIME_ARGS (sink_time), GST_TIME_ARGS (src_time));
+ "queue %d, sink %" GST_STIME_FORMAT ", src %" GST_STIME_FORMAT, sq->id,
+ GST_STIME_ARGS (sink_time), GST_STIME_ARGS (src_time));
/* This allows for streams with out of order timestamping - sometimes the
* emerging timestamp is later than the arriving one(s) */
- if (G_LIKELY (sink_time != -1 && src_time != -1 && sink_time > src_time))
+ if (G_LIKELY (GST_CLOCK_STIME_IS_VALID (sink_time) &&
+ GST_CLOCK_STIME_IS_VALID (src_time) && sink_time > src_time))
sq->cur_time = sink_time - src_time;
else
sq->cur_time = 0;
@@ -1068,6 +1217,12 @@
}
GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+ /* Make sure we have a valid initial segment position (and not garbage
+ * from upstream) */
+ if (segment->rate > 0.0)
+ segment->position = segment->start;
+ else
+ segment->position = segment->stop;
if (segment == &sq->sink_segment)
sq->sink_tainted = TRUE;
else {
@@ -1101,8 +1256,9 @@
if (duration != GST_CLOCK_TIME_NONE)
timestamp += duration;
- GST_DEBUG_OBJECT (mq, "queue %d, position updated to %" GST_TIME_FORMAT,
- sq->id, GST_TIME_ARGS (timestamp));
+ GST_DEBUG_OBJECT (mq, "queue %d, %s position updated to %" GST_TIME_FORMAT,
+ sq->id, segment == &sq->sink_segment ? "sink" : "src",
+ GST_TIME_ARGS (timestamp));
segment->position = timestamp;
@@ -1149,21 +1305,21 @@
gst_multi_queue_post_buffering (mq);
}
-static GstClockTime
+static GstClockTimeDiff
get_running_time (GstSegment * segment, GstMiniObject * object, gboolean end)
{
- GstClockTime time = GST_CLOCK_TIME_NONE;
+ GstClockTimeDiff time = GST_CLOCK_STIME_NONE;
if (GST_IS_BUFFER (object)) {
GstBuffer *buf = GST_BUFFER_CAST (object);
+ GstClockTime btime = GST_BUFFER_DTS_OR_PTS (buf);
- if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
- time = GST_BUFFER_TIMESTAMP (buf);
+ if (GST_CLOCK_TIME_IS_VALID (btime)) {
if (end && GST_BUFFER_DURATION_IS_VALID (buf))
- time += GST_BUFFER_DURATION (buf);
- if (time > segment->stop)
- time = segment->stop;
- time = gst_segment_to_running_time (segment, GST_FORMAT_TIME, time);
+ btime += GST_BUFFER_DURATION (buf);
+ if (btime > segment->stop)
+ btime = segment->stop;
+ time = my_segment_to_running_time (segment, btime);
}
} else if (GST_IS_BUFFER_LIST (object)) {
GstBufferList *list = GST_BUFFER_LIST_CAST (object);
@@ -1172,14 +1328,15 @@
n = gst_buffer_list_length (list);
for (i = 0; i < n; i++) {
+ GstClockTime btime;
buf = gst_buffer_list_get (list, i);
- if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
- time = GST_BUFFER_TIMESTAMP (buf);
+ btime = GST_BUFFER_DTS_OR_PTS (buf);
+ if (GST_CLOCK_TIME_IS_VALID (btime)) {
if (end && GST_BUFFER_DURATION_IS_VALID (buf))
- time += GST_BUFFER_DURATION (buf);
- if (time > segment->stop)
- time = segment->stop;
- time = gst_segment_to_running_time (segment, GST_FORMAT_TIME, time);
+ btime += GST_BUFFER_DURATION (buf);
+ if (btime > segment->stop)
+ btime = segment->stop;
+ time = my_segment_to_running_time (segment, btime);
if (!end)
goto done;
} else if (!end) {
@@ -1196,7 +1353,7 @@
gst_event_parse_segment (event, &new_segment);
if (new_segment->format == GST_FORMAT_TIME) {
time =
- gst_segment_to_running_time (new_segment, GST_FORMAT_TIME,
+ my_segment_to_running_time ((GstSegment *) new_segment,
new_segment->start);
}
}
@@ -1217,7 +1374,7 @@
GstClockTime timestamp, duration;
buffer = GST_BUFFER_CAST (object);
- timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ timestamp = GST_BUFFER_DTS_OR_PTS (buffer);
duration = GST_BUFFER_DURATION (buffer);
apply_buffer (mq, sq, timestamp, duration, &sq->src_segment);
@@ -1376,7 +1533,7 @@
GstMiniObject *object = NULL;
guint32 newid;
GstFlowReturn result;
- GstClockTime next_time;
+ GstClockTimeDiff next_time;
gboolean is_buffer;
gboolean do_update_buffering = FALSE;
gboolean dropping = FALSE;
@@ -1404,8 +1561,8 @@
is_buffer = GST_IS_BUFFER (object);
- /* Get running time of the item. Events will have GST_CLOCK_TIME_NONE */
- next_time = get_running_time (&sq->src_segment, object, TRUE);
+ /* Get running time of the item. Events will have GST_CLOCK_STIME_NONE */
+ next_time = get_running_time (&sq->src_segment, object, FALSE);
GST_LOG_OBJECT (mq, "SingleQueue %d : newid:%d , oldid:%d",
sq->id, newid, sq->last_oldid);
@@ -1431,6 +1588,9 @@
/* Update the nextid so other threads know when to wake us up */
sq->nextid = newid;
+ /* Take into account the extra cache time since we're unlinked */
+ if (GST_CLOCK_STIME_IS_VALID (next_time))
+ next_time += mq->unlinked_cache_time;
sq->next_time = next_time;
/* Update the oldid (the last ID we output) for highid tracking */
@@ -1445,17 +1605,17 @@
/* Recompute the high time */
compute_high_time (mq);
- while (((mq->sync_by_running_time && next_time != GST_CLOCK_TIME_NONE &&
- (mq->high_time == GST_CLOCK_TIME_NONE
- || next_time >= mq->high_time))
+ while (((mq->sync_by_running_time && GST_CLOCK_STIME_IS_VALID (next_time)
+ && (mq->high_time == GST_CLOCK_STIME_NONE
+ || next_time > mq->high_time))
|| (!mq->sync_by_running_time && newid > mq->highid))
&& sq->srcresult == GST_FLOW_NOT_LINKED) {
GST_DEBUG_OBJECT (mq,
"queue %d sleeping for not-linked wakeup with "
- "newid %u, highid %u, next_time %" GST_TIME_FORMAT
- ", high_time %" GST_TIME_FORMAT, sq->id, newid, mq->highid,
- GST_TIME_ARGS (next_time), GST_TIME_ARGS (mq->high_time));
+ "newid %u, highid %u, next_time %" GST_STIME_FORMAT
+ ", high_time %" GST_STIME_FORMAT, sq->id, newid, mq->highid,
+ GST_STIME_ARGS (next_time), GST_STIME_ARGS (mq->high_time));
/* Wake up all non-linked pads before we sleep */
wake_up_next_non_linked (mq);
@@ -1473,37 +1633,39 @@
compute_high_time (mq);
GST_DEBUG_OBJECT (mq, "queue %d woken from sleeping for not-linked "
- "wakeup with newid %u, highid %u, next_time %" GST_TIME_FORMAT
- ", high_time %" GST_TIME_FORMAT, sq->id, newid, mq->highid,
- GST_TIME_ARGS (next_time), GST_TIME_ARGS (mq->high_time));
+ "wakeup with newid %u, highid %u, next_time %" GST_STIME_FORMAT
+ ", high_time %" GST_STIME_FORMAT, sq->id, newid, mq->highid,
+ GST_STIME_ARGS (next_time), GST_STIME_ARGS (mq->high_time));
}
/* Re-compute the high_id in case someone else pushed */
compute_high_id (mq);
+ compute_high_time (mq);
} else {
compute_high_id (mq);
+ compute_high_time (mq);
/* Wake up all non-linked pads */
wake_up_next_non_linked (mq);
}
/* We're done waiting, we can clear the nextid and nexttime */
sq->nextid = 0;
- sq->next_time = GST_CLOCK_TIME_NONE;
+ sq->next_time = GST_CLOCK_STIME_NONE;
}
GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
if (sq->flushing)
goto out_flushing;
- GST_LOG_OBJECT (mq, "BEFORE PUSHING sq->srcresult: %s",
+ GST_LOG_OBJECT (mq, "sq:%d BEFORE PUSHING sq->srcresult: %s", sq->id,
gst_flow_get_name (sq->srcresult));
/* Update time stats */
GST_MULTI_QUEUE_MUTEX_LOCK (mq);
- next_time = get_running_time (&sq->src_segment, object, FALSE);
- if (next_time != GST_CLOCK_TIME_NONE) {
- if (sq->last_time == GST_CLOCK_TIME_NONE || sq->last_time < next_time)
+ next_time = get_running_time (&sq->src_segment, object, TRUE);
+ if (GST_CLOCK_STIME_IS_VALID (next_time)) {
+ if (sq->last_time == GST_CLOCK_STIME_NONE || sq->last_time < next_time)
sq->last_time = next_time;
- if (mq->high_time == GST_CLOCK_TIME_NONE || mq->high_time <= next_time) {
+ if (mq->high_time == GST_CLOCK_STIME_NONE || mq->high_time <= next_time) {
/* Wake up all non-linked pads now that we advanced the high time */
mq->high_time = next_time;
wake_up_next_non_linked (mq);
@@ -1587,7 +1749,7 @@
&& result != GST_FLOW_EOS)
goto out_flushing;
- GST_LOG_OBJECT (mq, "AFTER PUSHING sq->srcresult: %s",
+ GST_LOG_OBJECT (mq, "sq:%d AFTER PUSHING sq->srcresult: %s", sq->id,
gst_flow_get_name (sq->srcresult));
GST_MULTI_QUEUE_MUTEX_LOCK (mq);
@@ -1665,16 +1827,44 @@
if (sq->is_eos)
goto was_eos;
+ sq->active = TRUE;
+
/* Get a unique incrementing id */
curid = g_atomic_int_add ((gint *) & mq->counter, 1);
- GST_LOG_OBJECT (mq, "SingleQueue %d : about to enqueue buffer %p with id %d",
- sq->id, buffer, curid);
+ timestamp = GST_BUFFER_DTS_OR_PTS (buffer);
+ duration = GST_BUFFER_DURATION (buffer);
+
+ GST_LOG_OBJECT (mq,
+ "SingleQueue %d : about to enqueue buffer %p with id %d (pts:%"
+ GST_TIME_FORMAT " dts:%" GST_TIME_FORMAT " dur:%" GST_TIME_FORMAT ")",
+ sq->id, buffer, curid, GST_TIME_ARGS (GST_BUFFER_PTS (buffer)),
+ GST_TIME_ARGS (GST_BUFFER_DTS (buffer)), GST_TIME_ARGS (duration));
item = gst_multi_queue_buffer_item_new (GST_MINI_OBJECT_CAST (buffer), curid);
- timestamp = GST_BUFFER_TIMESTAMP (buffer);
- duration = GST_BUFFER_DURATION (buffer);
+ /* Update interleave before pushing data into queue */
+ if (mq->use_interleave) {
+ GstClockTime val = timestamp;
+ GstClockTimeDiff dval;
+
+ GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+ if (val == GST_CLOCK_TIME_NONE)
+ val = sq->sink_segment.position;
+ if (duration != GST_CLOCK_TIME_NONE)
+ val += duration;
+
+ dval = my_segment_to_running_time (&sq->sink_segment, val);
+ if (GST_CLOCK_STIME_IS_VALID (dval)) {
+ sq->cached_sinktime = dval;
+ GST_DEBUG_OBJECT (mq,
+ "Queue %d cached sink time now %" G_GINT64_FORMAT " %"
+ GST_STIME_FORMAT, sq->id, sq->cached_sinktime,
+ GST_STIME_ARGS (sq->cached_sinktime));
+ calculate_interleave (mq);
+ }
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+ }
if (!(gst_data_queue_push (sq->queue, (GstDataQueueItem *) item)))
goto flushing;
@@ -1759,14 +1949,15 @@
return res;
}
-static gboolean
+static GstFlowReturn
gst_multi_queue_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
{
GstSingleQueue *sq;
GstMultiQueue *mq;
guint32 curid;
GstMultiQueueItem *item;
- gboolean res;
+ gboolean res = TRUE;
+ GstFlowReturn flowret = GST_FLOW_OK;
GstEventType type;
GstEvent *sref = NULL;
@@ -1776,6 +1967,24 @@
type = GST_EVENT_TYPE (event);
switch (type) {
+ case GST_EVENT_STREAM_START:
+ {
+ if (mq->sync_by_running_time) {
+ GstStreamFlags stream_flags;
+ gst_event_parse_stream_flags (event, &stream_flags);
+ if ((stream_flags & GST_STREAM_FLAG_SPARSE)) {
+ GST_INFO_OBJECT (mq, "SingleQueue %d is a sparse stream", sq->id);
+ sq->is_sparse = TRUE;
+ }
+ sq->thread = g_thread_self ();
+ }
+
+ sq->thread = g_thread_self ();
+
+ /* Remove EOS flag */
+ sq->is_eos = FALSE;
+ }
+ break;
case GST_EVENT_FLUSH_START:
GST_DEBUG_OBJECT (mq, "SingleQueue %d : received flush start event",
sq->id);
@@ -1795,10 +2004,28 @@
goto done;
case GST_EVENT_SEGMENT:
+ sref = gst_event_ref (event);
+ break;
case GST_EVENT_GAP:
/* take ref because the queue will take ownership and we need the event
* afterwards to update the segment */
sref = gst_event_ref (event);
+ if (mq->use_interleave) {
+ GstClockTime val, dur;
+ GstClockTime stime;
+ gst_event_parse_gap (event, &val, &dur);
+ if (GST_CLOCK_TIME_IS_VALID (val)) {
+ GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+ if (GST_CLOCK_TIME_IS_VALID (dur))
+ val += dur;
+ stime = my_segment_to_running_time (&sq->sink_segment, val);
+ if (GST_CLOCK_STIME_IS_VALID (stime)) {
+ sq->cached_sinktime = stime;
+ calculate_interleave (mq);
+ }
+ GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+ }
+ }
break;
default:
@@ -1822,7 +2049,7 @@
"SingleQueue %d : Enqueuing event %p of type %s with id %d",
sq->id, event, GST_EVENT_TYPE_NAME (event), curid);
- if (!(res = gst_data_queue_push (sq->queue, (GstDataQueueItem *) item)))
+ if (!gst_data_queue_push (sq->queue, (GstDataQueueItem *) item))
goto flushing;
/* mark EOS when we received one, we must do that after putting the
@@ -1864,13 +2091,19 @@
GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
break;
case GST_EVENT_GAP:
+ sq->active = TRUE;
apply_gap (mq, sq, sref, &sq->sink_segment);
gst_event_unref (sref);
default:
break;
}
+
done:
- return res;
+ if (res == FALSE)
+ flowret = GST_FLOW_ERROR;
+ GST_DEBUG_OBJECT (mq, "SingleQueue %d : returning %s", sq->id,
+ gst_flow_get_name (flowret));
+ return flowret;
flushing:
{
@@ -1879,14 +2112,13 @@
if (sref)
gst_event_unref (sref);
gst_multi_queue_item_destroy (item);
- goto done;
+ return sq->srcresult;
}
was_eos:
{
- GST_DEBUG_OBJECT (mq, "we are EOS, dropping event, return FALSE");
+ GST_DEBUG_OBJECT (mq, "we are EOS, dropping event, return GST_FLOW_EOS");
gst_event_unref (event);
- res = FALSE;
- goto done;
+ return GST_FLOW_EOS;
}
}
@@ -2046,15 +2278,23 @@
if (mq->numwaiting < 1)
return;
- /* Else figure out which singlequeue(s) need waking up */
- for (tmp = mq->queues; tmp; tmp = g_list_next (tmp)) {
- GstSingleQueue *sq = (GstSingleQueue *) tmp->data;
-
- if (sq->srcresult == GST_FLOW_NOT_LINKED) {
- if ((mq->sync_by_running_time && mq->high_time != GST_CLOCK_TIME_NONE
- && sq->next_time != GST_CLOCK_TIME_NONE
- && sq->next_time >= mq->high_time)
- || (sq->nextid != 0 && sq->nextid <= mq->highid)) {
+ if (mq->sync_by_running_time && GST_CLOCK_STIME_IS_VALID (mq->high_time)) {
+ /* Else figure out which singlequeue(s) need waking up */
+ for (tmp = mq->queues; tmp; tmp = tmp->next) {
+ GstSingleQueue *sq = (GstSingleQueue *) tmp->data;
+ if (sq->srcresult == GST_FLOW_NOT_LINKED
+ && GST_CLOCK_STIME_IS_VALID (sq->next_time)
+ && sq->next_time <= mq->high_time) {
+ GST_LOG_OBJECT (mq, "Waking up singlequeue %d", sq->id);
+ g_cond_signal (&sq->turn);
+ }
+ }
+ } else {
+ /* Else figure out which singlequeue(s) need waking up */
+ for (tmp = mq->queues; tmp; tmp = tmp->next) {
+ GstSingleQueue *sq = (GstSingleQueue *) tmp->data;
+ if (sq->srcresult == GST_FLOW_NOT_LINKED &&
+ sq->nextid != 0 && sq->nextid <= mq->highid) {
GST_LOG_OBJECT (mq, "Waking up singlequeue %d", sq->id);
g_cond_signal (&sq->turn);
}
@@ -2109,43 +2349,57 @@
static void
compute_high_time (GstMultiQueue * mq)
{
- /* The high-id is either the highest id among the linked pads, or if all
- * pads are not-linked, it's the lowest not-linked pad */
+ /* The high-time is either the highest last time among the linked
+ * pads, or if all pads are not-linked, it's the lowest nex time of
+ * not-linked pad */
GList *tmp;
- GstClockTime highest = GST_CLOCK_TIME_NONE;
- GstClockTime lowest = GST_CLOCK_TIME_NONE;
+ GstClockTimeDiff highest = GST_CLOCK_STIME_NONE;
+ GstClockTimeDiff lowest = GST_CLOCK_STIME_NONE;
- for (tmp = mq->queues; tmp; tmp = g_list_next (tmp)) {
+ if (!mq->sync_by_running_time)
+ return;
+
+ for (tmp = mq->queues; tmp; tmp = tmp->next) {
GstSingleQueue *sq = (GstSingleQueue *) tmp->data;
GST_LOG_OBJECT (mq,
- "inspecting sq:%d , next_time:%" GST_TIME_FORMAT ", last_time:%"
- GST_TIME_FORMAT ", srcresult:%s", sq->id, GST_TIME_ARGS (sq->next_time),
- GST_TIME_ARGS (sq->last_time), gst_flow_get_name (sq->srcresult));
+ "inspecting sq:%d , next_time:%" GST_STIME_FORMAT ", last_time:%"
+ GST_STIME_FORMAT ", srcresult:%s", sq->id,
+ GST_STIME_ARGS (sq->next_time), GST_STIME_ARGS (sq->last_time),
+ gst_flow_get_name (sq->srcresult));
if (sq->srcresult == GST_FLOW_NOT_LINKED) {
/* No need to consider queues which are not waiting */
- if (sq->next_time == GST_CLOCK_TIME_NONE) {
+ if (!GST_CLOCK_STIME_IS_VALID (sq->next_time)) {
GST_LOG_OBJECT (mq, "sq:%d is not waiting - ignoring", sq->id);
continue;
}
- if (lowest == GST_CLOCK_TIME_NONE || sq->next_time < lowest)
+ if (lowest == GST_CLOCK_STIME_NONE || sq->next_time < lowest)
lowest = sq->next_time;
} else if (sq->srcresult != GST_FLOW_EOS) {
- /* If we don't have a global highid, or the global highid is lower than
- * this single queue's last outputted id, store the queue's one,
- * unless the singlequeue is at EOS (srcresult = EOS) */
- if (highest == GST_CLOCK_TIME_NONE || sq->last_time > highest)
+ /* If we don't have a global high time, or the global high time
+ * is lower than this single queue's last outputted time, store
+ * the queue's one, unless the singlequeue is at EOS (srcresult
+ * = EOS) */
+ if (highest == GST_CLOCK_STIME_NONE
+ || (sq->last_time != GST_CLOCK_STIME_NONE && sq->last_time > highest))
highest = sq->last_time;
}
+ GST_LOG_OBJECT (mq,
+ "highest now %" GST_STIME_FORMAT " lowest %" GST_STIME_FORMAT,
+ GST_STIME_ARGS (highest), GST_STIME_ARGS (lowest));
}
- mq->high_time = highest;
+ if (highest == GST_CLOCK_STIME_NONE)
+ mq->high_time = lowest;
+ else
+ mq->high_time = highest;
GST_LOG_OBJECT (mq,
- "High time is now : %" GST_TIME_FORMAT ", lowest non-linked %"
- GST_TIME_FORMAT, GST_TIME_ARGS (mq->high_time), GST_TIME_ARGS (lowest));
+ "High time is now : %" GST_STIME_FORMAT ", lowest non-linked %"
+ GST_STIME_FORMAT, GST_STIME_ARGS (mq->high_time),
+ GST_STIME_ARGS (lowest));
}
#define IS_FILLED(q, format, value) (((q)->max_size.format) != 0 && \
@@ -2174,7 +2428,7 @@
GST_MULTI_QUEUE_MUTEX_LOCK (mq);
/* check if we reached the hard time/bytes limits */
- if (sq->is_eos || IS_FILLED (sq, bytes, size.bytes) ||
+ if (sq->is_eos || sq->is_sparse || IS_FILLED (sq, bytes, size.bytes) ||
IS_FILLED (sq, time, sq->cur_time)) {
goto done;
}
@@ -2192,7 +2446,7 @@
}
GST_LOG_OBJECT (mq, "Checking Queue %d", oq->id);
- if (gst_data_queue_is_empty (oq->queue)) {
+ if (gst_data_queue_is_empty (oq->queue) && !oq->is_sparse) {
GST_LOG_OBJECT (mq, "Queue %d is empty", oq->id);
empty_found = TRUE;
break;
@@ -2252,7 +2506,7 @@
gst_data_queue_limits_changed (oq->queue);
}
}
- if (!gst_data_queue_is_empty (oq->queue))
+ if (!gst_data_queue_is_empty (oq->queue) || oq->is_sparse)
empty = FALSE;
}
GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
@@ -2284,7 +2538,19 @@
return TRUE;
/* check time or bytes */
- res = IS_FILLED (sq, time, sq->cur_time) || IS_FILLED (sq, bytes, bytes);
+ res = IS_FILLED (sq, bytes, bytes);
+ /* We only care about limits in time if we're not a sparse stream or
+ * we're not syncing by running time */
+ if (!sq->is_sparse || !mq->sync_by_running_time) {
+ /* If unlinked, take into account the extra unlinked cache time */
+ if (mq->sync_by_running_time && sq->srcresult == GST_FLOW_NOT_LINKED) {
+ if (sq->cur_time > mq->unlinked_cache_time)
+ res |= IS_FILLED (sq, time, sq->cur_time - mq->unlinked_cache_time);
+ else
+ res = FALSE;
+ } else
+ res |= IS_FILLED (sq, time, sq->cur_time);
+ }
return res;
}
@@ -2397,19 +2663,21 @@
(GstDataQueueFullCallback) single_queue_overrun_cb,
(GstDataQueueEmptyCallback) single_queue_underrun_cb, sq);
sq->is_eos = FALSE;
+ sq->is_sparse = FALSE;
sq->flushing = FALSE;
+ sq->active = FALSE;
gst_segment_init (&sq->sink_segment, GST_FORMAT_TIME);
gst_segment_init (&sq->src_segment, GST_FORMAT_TIME);
sq->nextid = 0;
sq->oldid = 0;
- sq->next_time = GST_CLOCK_TIME_NONE;
- sq->last_time = GST_CLOCK_TIME_NONE;
+ sq->next_time = GST_CLOCK_STIME_NONE;
+ sq->last_time = GST_CLOCK_STIME_NONE;
g_cond_init (&sq->turn);
g_cond_init (&sq->query_handled);
- sq->sinktime = GST_CLOCK_TIME_NONE;
- sq->srctime = GST_CLOCK_TIME_NONE;
+ sq->sinktime = GST_CLOCK_STIME_NONE;
+ sq->srctime = GST_CLOCK_STIME_NONE;
sq->sink_tainted = TRUE;
sq->src_tainted = TRUE;
@@ -2421,7 +2689,7 @@
GST_DEBUG_FUNCPTR (gst_multi_queue_chain));
gst_pad_set_activatemode_function (sq->sinkpad,
GST_DEBUG_FUNCPTR (gst_multi_queue_sink_activate_mode));
- gst_pad_set_event_function (sq->sinkpad,
+ gst_pad_set_event_full_function (sq->sinkpad,
GST_DEBUG_FUNCPTR (gst_multi_queue_sink_event));
gst_pad_set_query_function (sq->sinkpad,
GST_DEBUG_FUNCPTR (gst_multi_queue_sink_query));
diff --git a/plugins/elements/gstmultiqueue.h b/plugins/elements/gstmultiqueue.h
index d63eda5..98e4bc1 100644
--- a/plugins/elements/gstmultiqueue.h
+++ b/plugins/elements/gstmultiqueue.h
@@ -51,6 +51,7 @@
GstElement element;
gboolean sync_by_running_time;
+ gboolean use_interleave;
/* number of queues */
guint nbqueues;
@@ -67,7 +68,7 @@
guint counter; /* incoming object counter, use atomic accesses */
guint32 highid; /* contains highest id of last outputted object */
- GstClockTime high_time; /* highest start running time */
+ GstClockTimeDiff high_time; /* highest start running time */
GMutex qlock; /* Global queue lock (vs object lock or individual */
/* queues lock). Protects nbqueues, queues, global */
@@ -77,6 +78,11 @@
gboolean percent_changed;
GMutex buffering_post_lock; /* assures only one posted at a time */
+
+ GstClockTime interleave; /* Input interleave */
+ GstClockTimeDiff last_interleave_update;
+
+ GstClockTime unlinked_cache_time;
};
struct _GstMultiQueueClass {
diff --git a/plugins/elements/gstqueue.c b/plugins/elements/gstqueue.c
index 1d55522..72c915d 100644
--- a/plugins/elements/gstqueue.c
+++ b/plugins/elements/gstqueue.c
@@ -200,8 +200,8 @@
static GstFlowReturn gst_queue_push_one (GstQueue * queue);
static void gst_queue_loop (GstPad * pad);
-static gboolean gst_queue_handle_sink_event (GstPad * pad, GstObject * parent,
- GstEvent * event);
+static GstFlowReturn gst_queue_handle_sink_event (GstPad * pad,
+ GstObject * parent, GstEvent * event);
static gboolean gst_queue_handle_sink_query (GstPad * pad, GstObject * parent,
GstQuery * query);
@@ -431,7 +431,7 @@
gst_pad_set_chain_list_function (queue->sinkpad, gst_queue_chain_list);
gst_pad_set_activatemode_function (queue->sinkpad,
gst_queue_sink_activate_mode);
- gst_pad_set_event_function (queue->sinkpad, gst_queue_handle_sink_event);
+ gst_pad_set_event_full_function (queue->sinkpad, gst_queue_handle_sink_event);
gst_pad_set_query_function (queue->sinkpad, gst_queue_handle_sink_query);
GST_PAD_SET_PROXY_CAPS (queue->sinkpad);
gst_element_add_pad (GST_ELEMENT (queue), queue->sinkpad);
@@ -601,7 +601,7 @@
{
GstClockTime duration, timestamp;
- timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ timestamp = GST_BUFFER_DTS_OR_PTS (buffer);
duration = GST_BUFFER_DURATION (buffer);
/* if no timestamp is set, assume it's continuous with the previous
@@ -631,14 +631,16 @@
buffer_list_apply_time (GstBuffer ** buf, guint idx, gpointer user_data)
{
GstClockTime *timestamp = user_data;
+ GstClockTime btime;
- GST_TRACE ("buffer %u has ts %" GST_TIME_FORMAT
- " duration %" GST_TIME_FORMAT, idx,
- GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (*buf)),
+ GST_TRACE ("buffer %u has pts %" GST_TIME_FORMAT " dts %" GST_TIME_FORMAT
+ " duration %" GST_TIME_FORMAT, idx, GST_TIME_ARGS (GST_BUFFER_DTS (*buf)),
+ GST_TIME_ARGS (GST_BUFFER_PTS (*buf)),
GST_TIME_ARGS (GST_BUFFER_DURATION (*buf)));
- if (GST_BUFFER_TIMESTAMP_IS_VALID (*buf))
- *timestamp = GST_BUFFER_TIMESTAMP (*buf);
+ btime = GST_BUFFER_DTS_OR_PTS (*buf);
+ if (GST_CLOCK_TIME_IS_VALID (btime))
+ *timestamp = btime;
if (GST_BUFFER_DURATION_IS_VALID (*buf))
*timestamp += GST_BUFFER_DURATION (*buf);
@@ -895,7 +897,7 @@
}
}
-static gboolean
+static GstFlowReturn
gst_queue_handle_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
{
gboolean ret = TRUE;
@@ -983,7 +985,9 @@
}
break;
}
- return ret;
+ if (ret == FALSE)
+ return GST_FLOW_ERROR;
+ return GST_FLOW_OK;
/* ERRORS */
out_eos:
@@ -991,7 +995,7 @@
GST_CAT_LOG_OBJECT (queue_dataflow, queue, "refusing event, we are EOS");
GST_QUEUE_MUTEX_UNLOCK (queue);
gst_event_unref (event);
- return FALSE;
+ return GST_FLOW_EOS;
}
out_flow_error:
{
@@ -999,7 +1003,7 @@
"refusing event, we have a downstream flow error: %s",
gst_flow_get_name (queue->srcresult));
gst_event_unref (event);
- return FALSE;
+ return queue->srcresult;
}
}
@@ -1146,7 +1150,7 @@
GstClockTime duration, timestamp;
GstBuffer *buffer = GST_BUFFER_CAST (obj);
- timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ timestamp = GST_BUFFER_DTS_OR_PTS (buffer);
duration = GST_BUFFER_DURATION (buffer);
GST_CAT_LOG_OBJECT (queue_dataflow, queue, "received buffer %p of size %"
diff --git a/plugins/elements/gstqueue2.c b/plugins/elements/gstqueue2.c
index 9dbf26c..167eaf4 100644
--- a/plugins/elements/gstqueue2.c
+++ b/plugins/elements/gstqueue2.c
@@ -97,6 +97,7 @@
enum
{
+ SIGNAL_OVERRUN,
LAST_SIGNAL
};
@@ -136,6 +137,7 @@
PROP_TEMP_LOCATION,
PROP_TEMP_REMOVE,
PROP_RING_BUFFER_MAX_SIZE,
+ PROP_AVG_IN_RATE,
PROP_LAST
};
@@ -289,7 +291,7 @@
GstMiniObject *item;
} GstQueue2Item;
-/* static guint gst_queue2_signals[LAST_SIGNAL] = { 0 }; */
+static guint gst_queue2_signals[LAST_SIGNAL] = { 0 };
static void
gst_queue2_class_init (GstQueue2Class * klass)
@@ -300,6 +302,23 @@
gobject_class->set_property = gst_queue2_set_property;
gobject_class->get_property = gst_queue2_get_property;
+ /* signals */
+ /**
+ * GstQueue2::overrun:
+ * @queue: the queue2 instance
+ *
+ * Reports that the buffer became full (overrun).
+ * A buffer is full if the total amount of data inside it (num-buffers, time,
+ * size) is higher than the boundary values which can be set through the
+ * GObject properties.
+ *
+ * Since: 1.8
+ */
+ gst_queue2_signals[SIGNAL_OVERRUN] =
+ g_signal_new ("overrun", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GstQueue2Class, overrun), NULL, NULL,
+ g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
/* properties */
g_object_class_install_property (gobject_class, PROP_CUR_LEVEL_BYTES,
g_param_spec_uint ("current-level-bytes", "Current level (kB)",
@@ -388,6 +407,16 @@
0, G_MAXUINT64, DEFAULT_RING_BUFFER_MAX_SIZE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstQueue2:avg-in-rate
+ *
+ * The average input data rate.
+ */
+ g_object_class_install_property (gobject_class, PROP_AVG_IN_RATE,
+ g_param_spec_int64 ("avg-in-rate", "Input data rate (bytes/s)",
+ "Average input data rate (bytes/s)",
+ 0, G_MAXINT64, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
/* set several parent class virtual functions */
gobject_class->finalize = gst_queue2_finalize;
@@ -705,7 +734,7 @@
/* now configure the values, we use these to track timestamps on the
* sinkpad. */
if (segment->format != GST_FORMAT_TIME) {
- /* non-time format, pretent the current time segment is closed with a
+ /* non-time format, pretend the current time segment is closed with a
* 0 start and unknown stop time. */
segment->format = GST_FORMAT_TIME;
segment->start = 0;
@@ -758,7 +787,7 @@
{
GstClockTime duration, timestamp;
- timestamp = GST_BUFFER_TIMESTAMP (buffer);
+ timestamp = GST_BUFFER_DTS_OR_PTS (buffer);
duration = GST_BUFFER_DURATION (buffer);
/* if no timestamp is set, assume it's continuous with the previous
@@ -788,14 +817,17 @@
buffer_list_apply_time (GstBuffer ** buf, guint idx, gpointer data)
{
GstClockTime *timestamp = data;
+ GstClockTime btime;
- GST_TRACE ("buffer %u has ts %" GST_TIME_FORMAT
+ GST_TRACE ("buffer %u has pts %" GST_TIME_FORMAT " dts %" GST_TIME_FORMAT
" duration %" GST_TIME_FORMAT, idx,
- GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (*buf)),
+ GST_TIME_ARGS (GST_BUFFER_PTS (*buf)),
+ GST_TIME_ARGS (GST_BUFFER_DTS (*buf)),
GST_TIME_ARGS (GST_BUFFER_DURATION (*buf)));
- if (GST_BUFFER_TIMESTAMP_IS_VALID (*buf))
- *timestamp = GST_BUFFER_TIMESTAMP (*buf);
+ btime = GST_BUFFER_DTS_OR_PTS (*buf);
+ if (GST_CLOCK_TIME_IS_VALID (btime))
+ *timestamp = btime;
if (GST_BUFFER_DURATION_IS_VALID (*buf))
*timestamp += GST_BUFFER_DURATION (*buf);
@@ -851,6 +883,11 @@
perc = 100;
GST_LOG_OBJECT (queue, "we are EOS");
} else {
+ GST_LOG_OBJECT (queue,
+ "Cur level bytes/time/buffers %u/%" GST_TIME_FORMAT "/%u",
+ queue->cur_level.bytes, GST_TIME_ARGS (queue->cur_level.time),
+ queue->cur_level.buffers);
+
/* figure out the percent we are filled, we take the max of all formats. */
if (!QUEUE_IS_USING_RING_BUFFER (queue)) {
perc = GET_PERCENT (bytes, 0);
@@ -864,6 +901,10 @@
/* also apply the rate estimate when we need to */
if (queue->use_rate_estimate)
perc = MAX (perc, GET_PERCENT (rate_time, 0));
+
+ /* Don't get to 0% unless we're really empty */
+ if (queue->cur_level.bytes > 0)
+ perc = MAX (1, perc);
}
#undef GET_PERCENT
@@ -983,6 +1024,7 @@
queue->byte_in_rate = 0.0;
queue->byte_in_period = 0;
queue->byte_out_rate = 0.0;
+ queue->last_update_in_rates_elapsed = 0.0;
queue->last_in_elapsed = 0.0;
queue->last_out_elapsed = 0.0;
queue->in_timer_started = FALSE;
@@ -1013,7 +1055,8 @@
return;
}
- elapsed = g_timer_elapsed (queue->in_timer, NULL);
+ queue->last_update_in_rates_elapsed = elapsed =
+ g_timer_elapsed (queue->in_timer, NULL);
/* recalc after each interval. */
if (queue->last_in_elapsed + RATE_INTERVAL < elapsed) {
@@ -1500,7 +1543,7 @@
GST_DEBUG_OBJECT (queue, "opening temp file %s", queue->temp_template);
- /* If temp_template was set, allocate a filename and open that filen */
+ /* If temp_template was set, allocate a filename and open that file */
/* nothing to do */
if (queue->temp_template == NULL)
@@ -1662,6 +1705,13 @@
GST_CAT_DEBUG_OBJECT (queue_dataflow, queue,
"queue is full, waiting for free space");
do {
+ GST_QUEUE2_MUTEX_UNLOCK (queue);
+ g_signal_emit (queue, gst_queue2_signals[SIGNAL_OVERRUN], 0);
+ GST_QUEUE2_MUTEX_LOCK_CHECK (queue, queue->srcresult, out_flushing);
+ /* we recheck, the signal could have changed the thresholds */
+ if (!gst_queue2_is_filled (queue))
+ break;
+
/* Wait for space to be available, we could be unlocked because of a flush. */
GST_QUEUE2_WAIT_DEL_CHECK (queue, queue->sinkresult, out_flushing);
}
@@ -3605,6 +3655,19 @@
case PROP_RING_BUFFER_MAX_SIZE:
g_value_set_uint64 (value, queue->ring_buffer_max_size);
break;
+ case PROP_AVG_IN_RATE:
+ {
+ gdouble in_rate = queue->byte_in_rate;
+
+ /* During the first RATE_INTERVAL, byte_in_rate will not have been
+ * calculated, so calculate it here. */
+ if (in_rate == 0.0 && queue->bytes_in
+ && queue->last_update_in_rates_elapsed > 0.0)
+ in_rate = queue->bytes_in / queue->last_update_in_rates_elapsed;
+
+ g_value_set_int64 (value, (gint64) in_rate);
+ break;
+ }
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
diff --git a/plugins/elements/gstqueue2.h b/plugins/elements/gstqueue2.h
index 9a881b0..1f4cd06 100644
--- a/plugins/elements/gstqueue2.h
+++ b/plugins/elements/gstqueue2.h
@@ -115,6 +115,7 @@
/* for measuring input/output rates */
GTimer *in_timer;
gboolean in_timer_started;
+ gdouble last_update_in_rates_elapsed;
gdouble last_in_elapsed;
guint64 bytes_in;
gdouble byte_in_rate;
@@ -165,6 +166,9 @@
struct _GstQueue2Class
{
GstElementClass parent_class;
+
+ /* signals */
+ void (*overrun) (GstQueue2 *queue2);
};
G_GNUC_INTERNAL GType gst_queue2_get_type (void);
diff --git a/plugins/elements/gstsparsefile.c b/plugins/elements/gstsparsefile.c
index 080be41..f8a0af1 100644
--- a/plugins/elements/gstsparsefile.c
+++ b/plugins/elements/gstsparsefile.c
@@ -145,7 +145,7 @@
/**
* gst_sparse_file_new:
*
- * Make a new #GstSparseFile backed by the file represented with @fd.
+ * Make a new #GstSparseFile
*
* Returns: a new #GstSparseFile, gst_sparse_file_free() after usage.
*
@@ -243,7 +243,7 @@
* If @available is not %NULL, it will be updated with the amount of
* data already available after the last written byte.
*
- * Returns: The number of bytes written of 0 on error.
+ * Returns: The number of bytes written or 0 on error.
*
* Since: 1.4
*/
diff --git a/plugins/elements/gsttee.c b/plugins/elements/gsttee.c
index 006ad26..ab726cd 100644
--- a/plugins/elements/gsttee.c
+++ b/plugins/elements/gsttee.c
@@ -361,8 +361,7 @@
GST_OBJECT_LOCK (tee);
- if (name_templ) {
- sscanf (name_templ, "src_%u", &index);
+ if (name_templ && sscanf (name_templ, "src_%u", &index) == 1) {
GST_LOG_OBJECT (element, "name: %s (index %d)", name_templ, index);
if (g_hash_table_contains (tee->pad_indexes, GUINT_TO_POINTER (index))) {
GST_ERROR_OBJECT (element, "pad name %s is not unique", name_templ);
diff --git a/plugins/tracers/Makefile.am b/plugins/tracers/Makefile.am
new file mode 100644
index 0000000..f6efee6
--- /dev/null
+++ b/plugins/tracers/Makefile.am
@@ -0,0 +1,46 @@
+
+plugin_LTLIBRARIES = libgstcoretracers.la
+
+if HAVE_GETRUSAGE
+RUSAGE_SOURCES = gstrusage.c
+else
+RUSAGE_SOURCES =
+endif
+
+if GST_DISABLE_GST_DEBUG
+LOG_SOURCES =
+GST_PRINTF_LA =
+else
+LOG_SOURCES = gstlog.c
+GST_PRINTF_LA = $(top_builddir)/gst/printf/libgstprintf.la
+endif
+
+libgstcoretracers_la_DEPENDENCIES = $(top_builddir)/gst/libgstreamer-@GST_API_VERSION@.la
+libgstcoretracers_la_SOURCES = \
+ gstlatency.c \
+ $(LOG_SOURCES) \
+ $(RUSAGE_SOURCES) \
+ gststats.c \
+ gsttracers.c
+
+libgstcoretracers_la_CFLAGS = $(GST_OBJ_CFLAGS) \
+ -DGST_USE_UNSTABLE_API
+libgstcoretracers_la_LIBADD = \
+ $(GST_PRINTF_LA) \
+ $(GST_OBJ_LIBS)
+libgstcoretracers_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstcoretracers_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
+
+noinst_HEADERS = \
+ gstlatency.h \
+ gstlog.h \
+ gstrusage.h \
+ gststats.h
+
+CLEANFILES = *.gcno *.gcda *.gcov *.gcov.out
+
+%.c.gcov: .libs/libgstcoretracers_la-%.gcda %.c
+ $(GCOV) -b -f -o $^ > $@.out
+
+gcov: $(libgstcoretracers_la_SOURCES:=.gcov)
+
diff --git a/plugins/tracers/Makefile.in b/plugins/tracers/Makefile.in
new file mode 100644
index 0000000..5fdaf46
--- /dev/null
+++ b/plugins/tracers/Makefile.in
@@ -0,0 +1,940 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+subdir = plugins/tracers
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
+ $(top_srcdir)/common/m4/as-auto-alt.m4 \
+ $(top_srcdir)/common/m4/as-compiler-flag.m4 \
+ $(top_srcdir)/common/m4/as-docbook.m4 \
+ $(top_srcdir)/common/m4/as-libtool.m4 \
+ $(top_srcdir)/common/m4/as-version.m4 \
+ $(top_srcdir)/common/m4/ax_create_stdint_h.m4 \
+ $(top_srcdir)/common/m4/ax_pthread.m4 \
+ $(top_srcdir)/common/m4/gst-arch.m4 \
+ $(top_srcdir)/common/m4/gst-args.m4 \
+ $(top_srcdir)/common/m4/gst-check.m4 \
+ $(top_srcdir)/common/m4/gst-doc.m4 \
+ $(top_srcdir)/common/m4/gst-error.m4 \
+ $(top_srcdir)/common/m4/gst-feature.m4 \
+ $(top_srcdir)/common/m4/gst-function.m4 \
+ $(top_srcdir)/common/m4/gst-gettext.m4 \
+ $(top_srcdir)/common/m4/gst-glib2.m4 \
+ $(top_srcdir)/common/m4/gst-package-release-datetime.m4 \
+ $(top_srcdir)/common/m4/gst-parser.m4 \
+ $(top_srcdir)/common/m4/gst-platform.m4 \
+ $(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+ $(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst.m4 \
+ $(top_srcdir)/common/m4/gtk-doc.m4 \
+ $(top_srcdir)/common/m4/introspection.m4 \
+ $(top_srcdir)/common/m4/pkg.m4 \
+ $(top_srcdir)/m4/check-checks.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/longlong.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/stdint_h.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \
+ $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(plugindir)"
+LTLIBRARIES = $(plugin_LTLIBRARIES)
+@GST_DISABLE_GST_DEBUG_FALSE@am__DEPENDENCIES_1 = $(top_builddir)/gst/printf/libgstprintf.la
+am__DEPENDENCIES_2 =
+am__libgstcoretracers_la_SOURCES_DIST = gstlatency.c gstlog.c \
+ gstrusage.c gststats.c gsttracers.c
+@GST_DISABLE_GST_DEBUG_FALSE@am__objects_1 = \
+@GST_DISABLE_GST_DEBUG_FALSE@ libgstcoretracers_la-gstlog.lo
+@HAVE_GETRUSAGE_TRUE@am__objects_2 = \
+@HAVE_GETRUSAGE_TRUE@ libgstcoretracers_la-gstrusage.lo
+am_libgstcoretracers_la_OBJECTS = libgstcoretracers_la-gstlatency.lo \
+ $(am__objects_1) $(am__objects_2) \
+ libgstcoretracers_la-gststats.lo \
+ libgstcoretracers_la-gsttracers.lo
+libgstcoretracers_la_OBJECTS = $(am_libgstcoretracers_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+libgstcoretracers_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+ --mode=link $(CCLD) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) \
+ $(libgstcoretracers_la_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(libgstcoretracers_la_SOURCES)
+DIST_SOURCES = $(am__libgstcoretracers_la_SOURCES_DIST)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+HEADERS = $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BASH_COMPLETION_CFLAGS = @BASH_COMPLETION_CFLAGS@
+BASH_COMPLETION_DIR = @BASH_COMPLETION_DIR@
+BASH_COMPLETION_LIBS = @BASH_COMPLETION_LIBS@
+BASH_HELPERS_DIR = @BASH_HELPERS_DIR@
+BISON_PATH = @BISON_PATH@
+CAP_LIBS = @CAP_LIBS@
+CAT_ENTRY_END = @CAT_ENTRY_END@
+CAT_ENTRY_START = @CAT_ENTRY_START@
+CC = @CC@
+CCAS = @CCAS@
+CCASDEPMODE = @CCASDEPMODE@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHECK_MAJOR_VERSION = @CHECK_MAJOR_VERSION@
+CHECK_MICRO_VERSION = @CHECK_MICRO_VERSION@
+CHECK_MINOR_VERSION = @CHECK_MINOR_VERSION@
+CHECK_VERSION = @CHECK_VERSION@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DATADIR = @DATADIR@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DLLTOOL = @DLLTOOL@
+DOCBOOK_ROOT = @DOCBOOK_ROOT@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SUBUNIT = @ENABLE_SUBUNIT@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+EXEEXT = @EXEEXT@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLEX_PATH = @FLEX_PATH@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GMP_LIBS = @GMP_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+GSL_LIBS = @GSL_LIBS@
+GST_AGE = @GST_AGE@
+GST_ALL_CFLAGS = @GST_ALL_CFLAGS@
+GST_ALL_CXXFLAGS = @GST_ALL_CXXFLAGS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_ALL_LIBS = @GST_ALL_LIBS@
+GST_API_VERSION = @GST_API_VERSION@
+GST_CURRENT = @GST_CURRENT@
+GST_DISABLE_ALLOC_TRACE_DEFINE = @GST_DISABLE_ALLOC_TRACE_DEFINE@
+GST_DISABLE_GST_DEBUG_DEFINE = @GST_DISABLE_GST_DEBUG_DEFINE@
+GST_DISABLE_OPTION_PARSING_DEFINE = @GST_DISABLE_OPTION_PARSING_DEFINE@
+GST_DISABLE_PARSE_DEFINE = @GST_DISABLE_PARSE_DEFINE@
+GST_DISABLE_PLUGIN_DEFINE = @GST_DISABLE_PLUGIN_DEFINE@
+GST_DISABLE_REGISTRY_DEFINE = @GST_DISABLE_REGISTRY_DEFINE@
+GST_DISABLE_TRACE_DEFINE = @GST_DISABLE_TRACE_DEFINE@
+GST_HAVE_MONOTONIC_CLOCK_DEFINE = @GST_HAVE_MONOTONIC_CLOCK_DEFINE@
+GST_HAVE_POSIX_TIMERS_DEFINE = @GST_HAVE_POSIX_TIMERS_DEFINE@
+GST_HAVE_UNALIGNED_ACCESS_DEFINE = @GST_HAVE_UNALIGNED_ACCESS_DEFINE@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+GST_LICENSE = @GST_LICENSE@
+GST_LT_LDFLAGS = @GST_LT_LDFLAGS@
+GST_OBJ_CFLAGS = @GST_OBJ_CFLAGS@
+GST_OBJ_CXXFLAGS = @GST_OBJ_CXXFLAGS@
+GST_OBJ_LIBS = @GST_OBJ_LIBS@
+GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@
+GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@
+GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
+GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_LIBTOOLFLAGS = @GST_PLUGIN_LIBTOOLFLAGS@
+GST_PLUGIN_SCANNER_INSTALLED = @GST_PLUGIN_SCANNER_INSTALLED@
+GST_PTP_HELPER_INSTALLED = @GST_PTP_HELPER_INSTALLED@
+GST_REGISTRY_DOC_TYPES = @GST_REGISTRY_DOC_TYPES@
+GST_REVISION = @GST_REVISION@
+GST_VERSION_MAJOR = @GST_VERSION_MAJOR@
+GST_VERSION_MICRO = @GST_VERSION_MICRO@
+GST_VERSION_MINOR = @GST_VERSION_MINOR@
+GST_VERSION_NANO = @GST_VERSION_NANO@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+HAVE_CAP = @HAVE_CAP@
+HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
+HAVE_DVIPS = @HAVE_DVIPS@
+HAVE_EPSTOPDF = @HAVE_EPSTOPDF@
+HAVE_FORK = @HAVE_FORK@
+HAVE_GMP = @HAVE_GMP@
+HAVE_GSL = @HAVE_GSL@
+HAVE_JADETEX = @HAVE_JADETEX@
+HAVE_PNGTOPNM = @HAVE_PNGTOPNM@
+HAVE_PNMTOPS = @HAVE_PNMTOPS@
+HAVE_PS2PDF = @HAVE_PS2PDF@
+HAVE_XMLLINT = @HAVE_XMLLINT@
+HAVE_XSLTPROC = @HAVE_XSLTPROC@
+HOST_CPU = @HOST_CPU@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_INIT = @INTROSPECTION_INIT@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDIR = @LIBDIR@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL_PATH = @PERL_PATH@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PRINTF_CFLAGS = @PRINTF_CFLAGS@
+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@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+SED = @SED@
+SETCAP = @SETCAP@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SOCKET_LIBS = @SOCKET_LIBS@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VERSION = @VERSION@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WIN32_LIBS = @WIN32_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XML_CATALOG = @XML_CATALOG@
+XSLTPROC = @XSLTPROC@
+XSLTPROC_FLAGS = @XSLTPROC_FLAGS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+plugindir = @plugindir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+plugin_LTLIBRARIES = libgstcoretracers.la
+@HAVE_GETRUSAGE_FALSE@RUSAGE_SOURCES =
+@HAVE_GETRUSAGE_TRUE@RUSAGE_SOURCES = gstrusage.c
+@GST_DISABLE_GST_DEBUG_FALSE@LOG_SOURCES = gstlog.c
+@GST_DISABLE_GST_DEBUG_TRUE@LOG_SOURCES =
+@GST_DISABLE_GST_DEBUG_FALSE@GST_PRINTF_LA = $(top_builddir)/gst/printf/libgstprintf.la
+@GST_DISABLE_GST_DEBUG_TRUE@GST_PRINTF_LA =
+libgstcoretracers_la_DEPENDENCIES = $(top_builddir)/gst/libgstreamer-@GST_API_VERSION@.la
+libgstcoretracers_la_SOURCES = \
+ gstlatency.c \
+ $(LOG_SOURCES) \
+ $(RUSAGE_SOURCES) \
+ gststats.c \
+ gsttracers.c
+
+libgstcoretracers_la_CFLAGS = $(GST_OBJ_CFLAGS) \
+ -DGST_USE_UNSTABLE_API
+
+libgstcoretracers_la_LIBADD = \
+ $(GST_PRINTF_LA) \
+ $(GST_OBJ_LIBS)
+
+libgstcoretracers_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstcoretracers_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
+noinst_HEADERS = \
+ gstlatency.h \
+ gstlog.h \
+ gstrusage.h \
+ gststats.h
+
+CLEANFILES = *.gcno *.gcda *.gcov *.gcov.out
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu plugins/tracers/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu plugins/tracers/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \
+ list2=; for p in $$list; do \
+ if test -f $$p; then \
+ list2="$$list2 $$p"; \
+ else :; fi; \
+ done; \
+ test -z "$$list2" || { \
+ echo " $(MKDIR_P) '$(DESTDIR)$(plugindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(plugindir)" || exit 1; \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \
+ }
+
+uninstall-pluginLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \
+ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \
+ done
+
+clean-pluginLTLIBRARIES:
+ -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES)
+ @list='$(plugin_LTLIBRARIES)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+
+libgstcoretracers.la: $(libgstcoretracers_la_OBJECTS) $(libgstcoretracers_la_DEPENDENCIES) $(EXTRA_libgstcoretracers_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libgstcoretracers_la_LINK) -rpath $(plugindir) $(libgstcoretracers_la_OBJECTS) $(libgstcoretracers_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoretracers_la-gstlatency.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoretracers_la-gstlog.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoretracers_la-gstrusage.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoretracers_la-gststats.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstcoretracers_la-gsttracers.Plo@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+libgstcoretracers_la-gstlatency.lo: gstlatency.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) -MT libgstcoretracers_la-gstlatency.lo -MD -MP -MF $(DEPDIR)/libgstcoretracers_la-gstlatency.Tpo -c -o libgstcoretracers_la-gstlatency.lo `test -f 'gstlatency.c' || echo '$(srcdir)/'`gstlatency.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoretracers_la-gstlatency.Tpo $(DEPDIR)/libgstcoretracers_la-gstlatency.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstlatency.c' object='libgstcoretracers_la-gstlatency.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) -c -o libgstcoretracers_la-gstlatency.lo `test -f 'gstlatency.c' || echo '$(srcdir)/'`gstlatency.c
+
+libgstcoretracers_la-gstlog.lo: gstlog.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) -MT libgstcoretracers_la-gstlog.lo -MD -MP -MF $(DEPDIR)/libgstcoretracers_la-gstlog.Tpo -c -o libgstcoretracers_la-gstlog.lo `test -f 'gstlog.c' || echo '$(srcdir)/'`gstlog.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoretracers_la-gstlog.Tpo $(DEPDIR)/libgstcoretracers_la-gstlog.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstlog.c' object='libgstcoretracers_la-gstlog.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) -c -o libgstcoretracers_la-gstlog.lo `test -f 'gstlog.c' || echo '$(srcdir)/'`gstlog.c
+
+libgstcoretracers_la-gstrusage.lo: gstrusage.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) -MT libgstcoretracers_la-gstrusage.lo -MD -MP -MF $(DEPDIR)/libgstcoretracers_la-gstrusage.Tpo -c -o libgstcoretracers_la-gstrusage.lo `test -f 'gstrusage.c' || echo '$(srcdir)/'`gstrusage.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoretracers_la-gstrusage.Tpo $(DEPDIR)/libgstcoretracers_la-gstrusage.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstrusage.c' object='libgstcoretracers_la-gstrusage.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) -c -o libgstcoretracers_la-gstrusage.lo `test -f 'gstrusage.c' || echo '$(srcdir)/'`gstrusage.c
+
+libgstcoretracers_la-gststats.lo: gststats.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) -MT libgstcoretracers_la-gststats.lo -MD -MP -MF $(DEPDIR)/libgstcoretracers_la-gststats.Tpo -c -o libgstcoretracers_la-gststats.lo `test -f 'gststats.c' || echo '$(srcdir)/'`gststats.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoretracers_la-gststats.Tpo $(DEPDIR)/libgstcoretracers_la-gststats.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gststats.c' object='libgstcoretracers_la-gststats.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) -c -o libgstcoretracers_la-gststats.lo `test -f 'gststats.c' || echo '$(srcdir)/'`gststats.c
+
+libgstcoretracers_la-gsttracers.lo: gsttracers.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) -MT libgstcoretracers_la-gsttracers.lo -MD -MP -MF $(DEPDIR)/libgstcoretracers_la-gsttracers.Tpo -c -o libgstcoretracers_la-gsttracers.lo `test -f 'gsttracers.c' || echo '$(srcdir)/'`gsttracers.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstcoretracers_la-gsttracers.Tpo $(DEPDIR)/libgstcoretracers_la-gsttracers.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gsttracers.c' object='libgstcoretracers_la-gsttracers.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstcoretracers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstcoretracers_la_CFLAGS) $(CFLAGS) -c -o libgstcoretracers_la-gsttracers.lo `test -f 'gsttracers.c' || echo '$(srcdir)/'`gsttracers.c
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(plugindir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pluginLTLIBRARIES
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-pluginLTLIBRARIES
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+ clean-libtool clean-pluginLTLIBRARIES cscopelist-am ctags \
+ ctags-am distclean distclean-compile distclean-generic \
+ distclean-libtool distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-pluginLTLIBRARIES install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-pluginLTLIBRARIES
+
+.PRECIOUS: Makefile
+
+
+%.c.gcov: .libs/libgstcoretracers_la-%.gcda %.c
+ $(GCOV) -b -f -o $^ > $@.out
+
+gcov: $(libgstcoretracers_la_SOURCES:=.gcov)
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/plugins/tracers/gstlatency.c b/plugins/tracers/gstlatency.c
new file mode 100644
index 0000000..3e19fba
--- /dev/null
+++ b/plugins/tracers/gstlatency.c
@@ -0,0 +1,244 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gstlatency.c: tracing module that logs processing latency stats
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+/**
+ * SECTION:gstlatency
+ * @short_description: log processing latency stats
+ *
+ * A tracing module that determines src-to-sink latencies by injecting custom
+ * events at sources and process them at sinks.
+ */
+/* TODO(ensonic): if there are two sources feeding into a mixer/muxer and later
+ * we fan-out with tee and have two sinks, each sink would get all two events,
+ * the later event would overwrite the former. Unfortunately when the buffer
+ * arrives on the sink we don't know to which event it correlates. Better would
+ * be to use the buffer meta in 1.0 instead of the event. Or we track a min/max
+ * latency.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "gstlatency.h"
+
+GST_DEBUG_CATEGORY_STATIC (gst_latency_debug);
+#define GST_CAT_DEFAULT gst_latency_debug
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (gst_latency_debug, "latency", 0, "latency tracer");
+#define gst_latency_tracer_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstLatencyTracer, gst_latency_tracer, GST_TYPE_TRACER,
+ _do_init);
+
+static GQuark latency_probe_id;
+static GQuark latency_probe_pad;
+static GQuark latency_probe_ts;
+
+/* data helpers */
+
+/*
+ * Get the element/bin owning the pad.
+ *
+ * in: a normal pad
+ * out: the element
+ *
+ * in: a proxy pad
+ * out: the element that contains the peer of the proxy
+ *
+ * in: a ghost pad
+ * out: the bin owning the ghostpad
+ */
+/* TODO(ensonic): gst_pad_get_parent_element() would not work here, should we
+ * add this as new api, e.g. gst_pad_find_parent_element();
+ */
+static GstElement *
+get_real_pad_parent (GstPad * pad)
+{
+ GstObject *parent;
+
+ if (!pad)
+ return NULL;
+
+ parent = GST_OBJECT_PARENT (pad);
+
+ /* if parent of pad is a ghost-pad, then pad is a proxy_pad */
+ if (parent && GST_IS_GHOST_PAD (parent)) {
+ pad = GST_PAD_CAST (parent);
+ parent = GST_OBJECT_PARENT (pad);
+ }
+ return GST_ELEMENT_CAST (parent);
+}
+
+/* hooks */
+
+static void
+log_latency (const GstStructure * data, GstPad * sink_pad, guint64 sink_ts)
+{
+ GstPad *src_pad;
+ guint64 src_ts;
+ gchar *src, *sink;
+
+ gst_structure_id_get (data,
+ latency_probe_pad, GST_TYPE_PAD, &src_pad,
+ latency_probe_ts, G_TYPE_UINT64, &src_ts, NULL);
+
+ src = g_strdup_printf ("%s_%s", GST_DEBUG_PAD_NAME (src_pad));
+ sink = g_strdup_printf ("%s_%s", GST_DEBUG_PAD_NAME (sink_pad));
+
+ /* TODO(ensonic): report format is still unstable */
+ gst_tracer_log_trace (gst_structure_new ("latency",
+ "src", G_TYPE_STRING, src,
+ "sink", G_TYPE_STRING, sink,
+ "time", G_TYPE_UINT64, GST_CLOCK_DIFF (src_ts, sink_ts), NULL));
+ g_free (src);
+ g_free (sink);
+}
+
+static void
+send_latency_probe (GstElement * parent, GstPad * pad, guint64 ts)
+{
+ if (parent && (!GST_IS_BIN (parent)) &&
+ GST_OBJECT_FLAG_IS_SET (parent, GST_ELEMENT_FLAG_SOURCE)) {
+ GstEvent *latency_probe = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM,
+ gst_structure_new_id (latency_probe_id,
+ latency_probe_pad, GST_TYPE_PAD, pad,
+ latency_probe_ts, G_TYPE_UINT64, ts,
+ NULL));
+ gst_pad_push_event (pad, latency_probe);
+ }
+}
+
+static void
+do_push_buffer_pre (GstTracer * self, guint64 ts, GstPad * pad)
+{
+ GstElement *parent = get_real_pad_parent (pad);
+
+ send_latency_probe (parent, pad, ts);
+}
+
+static void
+do_pull_range_pre (GstTracer * self, guint64 ts, GstPad * pad)
+{
+ GstPad *peer_pad = GST_PAD_PEER (pad);
+ GstElement *parent = get_real_pad_parent (peer_pad);
+
+ send_latency_probe (parent, peer_pad, ts);
+}
+
+static void
+calculate_latency (GstElement * parent, GstPad * pad, guint64 ts)
+{
+ if (parent && (!GST_IS_BIN (parent)) &&
+ GST_OBJECT_FLAG_IS_SET (parent, GST_ELEMENT_FLAG_SINK)) {
+ GstEvent *ev = g_object_get_qdata ((GObject *) pad, latency_probe_id);
+
+ log_latency (gst_event_get_structure (ev), pad, ts);
+ gst_event_unref (ev);
+ }
+}
+
+static void
+do_push_buffer_post (GstTracer * self, guint64 ts, GstPad * pad)
+{
+ GstPad *peer_pad = GST_PAD_PEER (pad);
+ GstElement *parent = get_real_pad_parent (peer_pad);
+
+ calculate_latency (parent, peer_pad, ts);
+}
+
+static void
+do_pull_range_post (GstTracer * self, guint64 ts, GstPad * pad)
+{
+ GstElement *parent = get_real_pad_parent (pad);
+
+ calculate_latency (parent, pad, ts);
+}
+
+static void
+do_push_event_pre (GstTracer * self, guint64 ts, GstPad * pad, GstEvent * ev)
+{
+ GstPad *peer_pad = GST_PAD_PEER (pad);
+ GstElement *parent = get_real_pad_parent (peer_pad);
+
+ if (parent && (!GST_IS_BIN (parent)) &&
+ GST_OBJECT_FLAG_IS_SET (parent, GST_ELEMENT_FLAG_SINK)) {
+ if (GST_EVENT_TYPE (ev) == GST_EVENT_CUSTOM_DOWNSTREAM) {
+ const GstStructure *data = gst_event_get_structure (ev);
+
+ if (gst_structure_get_name_id (data) == latency_probe_id) {
+ /* store event and calculate latency when the buffer that follows
+ * has been processed */
+ g_object_set_qdata ((GObject *) peer_pad, latency_probe_id,
+ gst_event_ref (ev));
+ }
+ }
+ }
+}
+
+/* tracer class */
+
+static void
+gst_latency_tracer_class_init (GstLatencyTracerClass * klass)
+{
+ latency_probe_id = g_quark_from_static_string ("latency_probe.id");
+ latency_probe_pad = g_quark_from_static_string ("latency_probe.pad");
+ latency_probe_ts = g_quark_from_static_string ("latency_probe.ts");
+
+ /* announce trace formats */
+ /* *INDENT-OFF* */
+ gst_tracer_log_trace (gst_structure_new ("latency.class",
+ "src", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "pad", /* TODO: use genum */
+ NULL),
+ "sink", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "pad", /* TODO: use genum */
+ NULL),
+ "time", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+ "type", G_TYPE_GTYPE, G_TYPE_UINT64,
+ "description", G_TYPE_STRING,
+ "time it took for the buffer to go from src to sink ns",
+ "flags", G_TYPE_STRING, "aggregated", /* TODO: use gflags */
+ "min", G_TYPE_UINT64, G_GUINT64_CONSTANT (0),
+ "max", G_TYPE_UINT64, G_MAXUINT64,
+ NULL),
+ NULL));
+ /* *INDENT-ON* */
+}
+
+static void
+gst_latency_tracer_init (GstLatencyTracer * self)
+{
+ GstTracer *tracer = GST_TRACER (self);
+ gst_tracing_register_hook (tracer, "pad-push-pre",
+ G_CALLBACK (do_push_buffer_pre));
+ gst_tracing_register_hook (tracer, "pad-push-list-pre",
+ G_CALLBACK (do_push_buffer_pre));
+ gst_tracing_register_hook (tracer, "pad-push-post",
+ G_CALLBACK (do_push_buffer_post));
+ gst_tracing_register_hook (tracer, "pad-push-list-post",
+ G_CALLBACK (do_push_buffer_post));
+ gst_tracing_register_hook (tracer, "pad-pull-range-pre",
+ G_CALLBACK (do_pull_range_pre));
+ gst_tracing_register_hook (tracer, "pad-pull-range-post",
+ G_CALLBACK (do_pull_range_post));
+ gst_tracing_register_hook (tracer, "pad-push-event-pre",
+ G_CALLBACK (do_push_event_pre));
+}
diff --git a/plugins/tracers/gstlatency.h b/plugins/tracers/gstlatency.h
new file mode 100644
index 0000000..e234303
--- /dev/null
+++ b/plugins/tracers/gstlatency.h
@@ -0,0 +1,66 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gstrusage.h: tracing module that logs resource usage stats
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_LATENCY_TRACER_H__
+#define __GST_LATENCY_TRACER_H__
+
+#include <gst/gst.h>
+#include <gst/gsttracer.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_LATENCY_TRACER \
+ (gst_latency_tracer_get_type())
+#define GST_LATENCY_TRACER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_LATENCY_TRACER,GstLatencyTracer))
+#define GST_LATENCY_TRACER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_LATENCY_TRACER,GstLatencyTracerClass))
+#define GST_IS_LATENCY_TRACER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_LATENCY_TRACER))
+#define GST_IS_LATENCY_TRACER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_LATENCY_TRACER))
+#define GST_LATENCY_TRACER_CAST(obj) ((GstLatencyTracer *)(obj))
+
+typedef struct _GstLatencyTracer GstLatencyTracer;
+typedef struct _GstLatencyTracerClass GstLatencyTracerClass;
+
+/**
+ * GstLatencyTracer:
+ *
+ * Opaque #GstLatencyTracer data structure
+ */
+struct _GstLatencyTracer {
+ GstTracer parent;
+
+ /*< private >*/
+};
+
+struct _GstLatencyTracerClass {
+ GstTracerClass parent_class;
+
+ /* signals */
+};
+
+G_GNUC_INTERNAL GType gst_latency_tracer_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_LATENCY_TRACER_H__ */
diff --git a/plugins/tracers/gstlog.c b/plugins/tracers/gstlog.c
new file mode 100644
index 0000000..ac9ae17
--- /dev/null
+++ b/plugins/tracers/gstlog.c
@@ -0,0 +1,358 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gstlog.c: tracing module that logs events
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+/**
+ * SECTION:gstlog
+ * @short_description: log hook event
+ *
+ * A tracing module that logs all data from all hooks.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "gstlog.h"
+
+#include <gst/printf/printf.h>
+
+GST_DEBUG_CATEGORY_STATIC (gst_log_debug);
+#define GST_CAT_DEFAULT gst_log_debug
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_BIN);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_BUFFER);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_BUFFER_LIST);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_EVENT);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_MESSAGE);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_QUERY);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_STATES);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_PADS);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_ELEMENT_PADS);
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_ELEMENT_FACTORY);
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (gst_log_debug, "log", 0, "log tracer"); \
+ GST_DEBUG_CATEGORY_GET (GST_CAT_BUFFER, "GST_BUFFER"); \
+ GST_DEBUG_CATEGORY_GET (GST_CAT_BUFFER_LIST, "GST_BUFFER_LIST"); \
+ GST_DEBUG_CATEGORY_GET (GST_CAT_EVENT, "GST_EVENT"); \
+ GST_DEBUG_CATEGORY_GET (GST_CAT_MESSAGE, "GST_MESSAGE"); \
+ GST_DEBUG_CATEGORY_GET (GST_CAT_STATES, "GST_STATES"); \
+ GST_DEBUG_CATEGORY_GET (GST_CAT_PADS, "GST_PADS"); \
+ GST_DEBUG_CATEGORY_GET (GST_CAT_ELEMENT_PADS, "GST_ELEMENT_PADS"); \
+ GST_DEBUG_CATEGORY_GET (GST_CAT_ELEMENT_FACTORY, "GST_ELEMENT_FACTORY"); \
+ GST_DEBUG_CATEGORY_GET (GST_CAT_QUERY, "query"); \
+ GST_DEBUG_CATEGORY_GET (GST_CAT_BIN, "bin");
+#define gst_log_tracer_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstLogTracer, gst_log_tracer, GST_TYPE_TRACER,
+ _do_init);
+
+static void
+do_log (GstDebugCategory * cat, const char *fmt, ...)
+{
+ va_list var_args;
+
+ va_start (var_args, fmt);
+ gst_debug_log_valist (cat, GST_LEVEL_TRACE, "", "", 0, NULL, fmt, var_args);
+ va_end (var_args);
+}
+
+static void
+do_push_buffer_pre (GstTracer * self, guint64 ts, GstPad * pad,
+ GstBuffer * buffer)
+{
+ do_log (GST_CAT_BUFFER,
+ "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", buffer=%" GST_PTR_FORMAT,
+ GST_TIME_ARGS (ts), pad, buffer);
+}
+
+static void
+do_push_buffer_post (GstTracer * self, guint64 ts, GstPad * pad,
+ GstFlowReturn res)
+{
+ do_log (GST_CAT_BUFFER,
+ "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", res=%d",
+ GST_TIME_ARGS (ts), pad, res);
+}
+
+static void
+do_push_buffer_list_pre (GstTracer * self, guint64 ts, GstPad * pad,
+ GstBufferList * list)
+{
+ do_log (GST_CAT_BUFFER_LIST,
+ "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", list=%p",
+ GST_TIME_ARGS (ts), pad, list);
+}
+
+static void
+do_push_buffer_list_post (GstTracer * self, guint64 ts, GstPad * pad,
+ GstFlowReturn res)
+{
+ do_log (GST_CAT_BUFFER_LIST,
+ "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", res=%d",
+ GST_TIME_ARGS (ts), pad, res);
+}
+
+static void
+do_pull_range_pre (GstTracer * self, guint64 ts, GstPad * pad, guint64 offset,
+ guint size)
+{
+ do_log (GST_CAT_BUFFER,
+ "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", offset=%" G_GUINT64_FORMAT
+ ", size=%u", GST_TIME_ARGS (ts), pad, offset, size);
+}
+
+static void
+do_pull_range_post (GstTracer * self, guint64 ts, GstPad * pad,
+ GstBuffer * buffer, GstFlowReturn res)
+{
+ do_log (GST_CAT_BUFFER,
+ "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", buffer=%" GST_PTR_FORMAT
+ ", res=%d", GST_TIME_ARGS (ts), pad, buffer, res);
+}
+
+static void
+do_push_event_pre (GstTracer * self, guint64 ts, GstPad * pad, GstEvent * event)
+{
+ do_log (GST_CAT_EVENT,
+ "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", event=%" GST_PTR_FORMAT,
+ GST_TIME_ARGS (ts), pad, event);
+}
+
+static void
+do_push_event_post (GstTracer * self, guint64 ts, GstPad * pad, gboolean res)
+{
+ do_log (GST_CAT_EVENT,
+ "%" GST_TIME_FORMAT ", pad=%" GST_PTR_FORMAT ", res=%d",
+ GST_TIME_ARGS (ts), pad, res);
+}
+
+static void
+do_post_message_pre (GstTracer * self, guint64 ts, GstElement * elem,
+ GstMessage * msg)
+{
+ do_log (GST_CAT_EVENT,
+ "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", message=%"
+ GST_PTR_FORMAT, GST_TIME_ARGS (ts), elem, msg);
+}
+
+static void
+do_post_message_post (GstTracer * self, guint64 ts, GstElement * elem,
+ gboolean res)
+{
+ do_log (GST_CAT_EVENT,
+ "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", res=%d",
+ GST_TIME_ARGS (ts), elem, res);
+}
+
+static void
+do_query_pre (GstTracer * self, guint64 ts, GstElement * elem, GstQuery * query)
+{
+ do_log (GST_CAT_QUERY,
+ "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", query=%"
+ GST_PTR_FORMAT, GST_TIME_ARGS (ts), elem, query);
+}
+
+static void
+do_query_post (GstTracer * self, guint64 ts, GstElement * elem, gboolean res)
+{
+ do_log (GST_CAT_QUERY,
+ "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", res=%d",
+ GST_TIME_ARGS (ts), elem, res);
+}
+
+static void
+do_element_new (GstTracer * self, guint64 ts, GstElement * elem)
+{
+ do_log (GST_CAT_ELEMENT_FACTORY,
+ "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT,
+ GST_TIME_ARGS (ts), elem);
+}
+
+static void
+do_element_add_pad (GstTracer * self, guint64 ts, GstElement * elem,
+ GstPad * pad)
+{
+ do_log (GST_CAT_ELEMENT_PADS,
+ "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", pad=%" GST_PTR_FORMAT,
+ GST_TIME_ARGS (ts), elem, pad);
+}
+
+static void
+do_element_remove_pad (GstTracer * self, guint64 ts, GstElement * elem,
+ GstPad * pad)
+{
+ do_log (GST_CAT_ELEMENT_PADS,
+ "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", pad=%" GST_PTR_FORMAT,
+ GST_TIME_ARGS (ts), elem, pad);
+}
+
+static void
+do_element_change_state_pre (GstTracer * self, guint64 ts, GstElement * elem,
+ GstStateChange change)
+{
+ do_log (GST_CAT_STATES,
+ "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", change=%d",
+ GST_TIME_ARGS (ts), elem, (gint) change);
+}
+
+static void
+do_element_change_state_post (GstTracer * self, guint64 ts, GstElement * elem,
+ GstStateChange change, GstStateChangeReturn res)
+{
+ do_log (GST_CAT_STATES,
+ "%" GST_TIME_FORMAT ", element=%" GST_PTR_FORMAT ", change=%d, res=%d",
+ GST_TIME_ARGS (ts), elem, (gint) change, (gint) res);
+}
+
+static void
+do_bin_add_pre (GstTracer * self, guint64 ts, GstBin * bin, GstElement * elem)
+{
+ do_log (GST_CAT_BIN,
+ "%" GST_TIME_FORMAT ", bin=%" GST_PTR_FORMAT ", element=%" GST_PTR_FORMAT,
+ GST_TIME_ARGS (ts), bin, elem);
+}
+
+static void
+do_bin_add_post (GstTracer * self, guint64 ts, GstBin * bin, GstElement * elem,
+ gboolean res)
+{
+ do_log (GST_CAT_BIN,
+ "%" GST_TIME_FORMAT ", bin=%" GST_PTR_FORMAT ", element=%" GST_PTR_FORMAT
+ ", res=%d", GST_TIME_ARGS (ts), bin, elem, res);
+}
+
+static void
+do_bin_remove_pre (GstTracer * self, guint64 ts, GstBin * bin,
+ GstElement * elem)
+{
+ do_log (GST_CAT_BIN,
+ "%" GST_TIME_FORMAT ", bin=%" GST_PTR_FORMAT ", element=%" GST_PTR_FORMAT,
+ GST_TIME_ARGS (ts), bin, elem);
+}
+
+static void
+do_bin_remove_post (GstTracer * self, guint64 ts, GstBin * bin, gboolean res)
+{
+ do_log (GST_CAT_BIN,
+ "%" GST_TIME_FORMAT ", bin=%" GST_PTR_FORMAT ", res=%d",
+ GST_TIME_ARGS (ts), bin, res);
+}
+
+static void
+do_pad_link_pre (GstTracer * self, guint64 ts, GstPad * src, GstElement * sink)
+{
+ do_log (GST_CAT_PADS,
+ "%" GST_TIME_FORMAT ", src=%" GST_PTR_FORMAT ", sink=%" GST_PTR_FORMAT,
+ GST_TIME_ARGS (ts), src, sink);
+}
+
+static void
+do_pad_link_post (GstTracer * self, guint64 ts, GstPad * src, GstElement * sink,
+ GstPadLinkReturn res)
+{
+ do_log (GST_CAT_PADS,
+ "%" GST_TIME_FORMAT ", src=%" GST_PTR_FORMAT ", sink=%" GST_PTR_FORMAT
+ ", res=%d", GST_TIME_ARGS (ts), src, sink, (gint) res);
+}
+
+static void
+do_pad_unlink_pre (GstTracer * self, guint64 ts, GstPad * src,
+ GstElement * sink)
+{
+ do_log (GST_CAT_PADS,
+ "%" GST_TIME_FORMAT ", src=%" GST_PTR_FORMAT ", sink=%" GST_PTR_FORMAT,
+ GST_TIME_ARGS (ts), src, sink);
+}
+
+static void
+do_pad_unlink_post (GstTracer * self, guint64 ts, GstPad * src,
+ GstElement * sink, gboolean res)
+{
+ do_log (GST_CAT_PADS,
+ "%" GST_TIME_FORMAT ", src=%" GST_PTR_FORMAT ", sink=%" GST_PTR_FORMAT
+ ", res=%d", GST_TIME_ARGS (ts), src, sink, (gint) res);
+}
+
+/* tracer class */
+
+static void
+gst_log_tracer_class_init (GstLogTracerClass * klass)
+{
+}
+
+static void
+gst_log_tracer_init (GstLogTracer * self)
+{
+ GstTracer *tracer = GST_TRACER (self);
+
+ gst_tracing_register_hook (tracer, "pad-push-pre",
+ G_CALLBACK (do_push_buffer_pre));
+ gst_tracing_register_hook (tracer, "pad-push-post",
+ G_CALLBACK (do_push_buffer_post));
+ gst_tracing_register_hook (tracer, "pad-push-list-pre",
+ G_CALLBACK (do_push_buffer_list_pre));
+ gst_tracing_register_hook (tracer, "pad-push-list-post",
+ G_CALLBACK (do_push_buffer_list_post));
+ gst_tracing_register_hook (tracer, "pad-pull-range-pre",
+ G_CALLBACK (do_pull_range_pre));
+ gst_tracing_register_hook (tracer, "pad-pull-range-post",
+ G_CALLBACK (do_pull_range_post));
+ gst_tracing_register_hook (tracer, "pad-push-event-pre",
+ G_CALLBACK (do_push_event_pre));
+ gst_tracing_register_hook (tracer, "pad-push-event-post",
+ G_CALLBACK (do_push_event_post));
+ gst_tracing_register_hook (tracer, "pad-query-pre",
+ G_CALLBACK (do_query_pre));
+ gst_tracing_register_hook (tracer, "pad-query-post",
+ G_CALLBACK (do_query_post));
+ gst_tracing_register_hook (tracer, "element-post-message-pre",
+ G_CALLBACK (do_post_message_pre));
+ gst_tracing_register_hook (tracer, "element-post-message-post",
+ G_CALLBACK (do_post_message_post));
+ gst_tracing_register_hook (tracer, "element-query-pre",
+ G_CALLBACK (do_query_pre));
+ gst_tracing_register_hook (tracer, "element-query-post",
+ G_CALLBACK (do_query_post));
+ gst_tracing_register_hook (tracer, "element-new",
+ G_CALLBACK (do_element_new));
+ gst_tracing_register_hook (tracer, "element-add-pad",
+ G_CALLBACK (do_element_add_pad));
+ gst_tracing_register_hook (tracer, "element-remove-pad",
+ G_CALLBACK (do_element_remove_pad));
+ gst_tracing_register_hook (tracer, "element-change-state-pre",
+ G_CALLBACK (do_element_change_state_pre));
+ gst_tracing_register_hook (tracer, "element-change-state-post",
+ G_CALLBACK (do_element_change_state_post));
+ gst_tracing_register_hook (tracer, "bin-add-pre",
+ G_CALLBACK (do_bin_add_pre));
+ gst_tracing_register_hook (tracer, "bin-add-post",
+ G_CALLBACK (do_bin_add_post));
+ gst_tracing_register_hook (tracer, "bin-remove-pre",
+ G_CALLBACK (do_bin_remove_pre));
+ gst_tracing_register_hook (tracer, "bin-remove-post",
+ G_CALLBACK (do_bin_remove_post));
+ gst_tracing_register_hook (tracer, "pad-link-pre",
+ G_CALLBACK (do_pad_link_pre));
+ gst_tracing_register_hook (tracer, "pad-link-post",
+ G_CALLBACK (do_pad_link_post));
+ gst_tracing_register_hook (tracer, "pad-unlink-pre",
+ G_CALLBACK (do_pad_unlink_pre));
+ gst_tracing_register_hook (tracer, "pad-unlink-post",
+ G_CALLBACK (do_pad_unlink_post));
+}
diff --git a/plugins/tracers/gstlog.h b/plugins/tracers/gstlog.h
new file mode 100644
index 0000000..6f0dd7f
--- /dev/null
+++ b/plugins/tracers/gstlog.h
@@ -0,0 +1,66 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gstlog.h: tracing module that logs events
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_LOG_TRACER_H__
+#define __GST_LOG_TRACER_H__
+
+#include <gst/gst.h>
+#include <gst/gsttracer.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_LOG_TRACER \
+ (gst_log_tracer_get_type())
+#define GST_LOG_TRACER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_LOG_TRACER,GstLogTracer))
+#define GST_LOG_TRACER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_LOG_TRACER,GstLogTracerClass))
+#define GST_IS_LOG_TRACER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_LOG_TRACER))
+#define GST_IS_LOG_TRACER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_LOG_TRACER))
+#define GST_LOG_TRACER_CAST(obj) ((GstLogTracer *)(obj))
+
+typedef struct _GstLogTracer GstLogTracer;
+typedef struct _GstLogTracerClass GstLogTracerClass;
+
+/**
+ * GstLogTracer:
+ *
+ * Opaque #GstLogTracer data structure
+ */
+struct _GstLogTracer {
+ GstTracer parent;
+
+ /*< private >*/
+};
+
+struct _GstLogTracerClass {
+ GstTracerClass parent_class;
+
+ /* signals */
+};
+
+G_GNUC_INTERNAL GType gst_log_tracer_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_LOG_TRACER_H__ */
diff --git a/plugins/tracers/gstrusage.c b/plugins/tracers/gstrusage.c
new file mode 100644
index 0000000..6ea2685
--- /dev/null
+++ b/plugins/tracers/gstrusage.c
@@ -0,0 +1,361 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gstrusage.c: tracing module that logs resource usage stats
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+/**
+ * SECTION:gstrusage
+ * @short_description: log resource usage stats
+ *
+ * A tracing module that take rusage() snapshots and logs them.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <unistd.h>
+#include "gstrusage.h"
+
+#ifdef HAVE_SYS_RESOURCE_H
+#ifndef __USE_GNU
+# define __USE_GNU /* RUSAGE_THREAD */
+#endif
+#include <sys/resource.h>
+#endif
+
+GST_DEBUG_CATEGORY_STATIC (gst_rusage_debug);
+#define GST_CAT_DEFAULT gst_rusage_debug
+
+G_LOCK_DEFINE (_proc);
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (gst_rusage_debug, "rusage", 0, "rusage tracer");
+#define gst_rusage_tracer_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstRUsageTracer, gst_rusage_tracer, GST_TYPE_TRACER,
+ _do_init);
+
+/* remember x measurements per self->window */
+#define WINDOW_SUBDIV 100
+
+/* number of cpus to scale cpu-usage in threads */
+static glong num_cpus = 1;
+
+typedef struct
+{
+ /* time spend in this thread */
+ GstClockTime tthread;
+ GstTraceValues *tvs_thread;
+} GstThreadStats;
+
+/* data helper */
+
+static void
+free_trace_value (gpointer data)
+{
+ g_slice_free (GstTraceValue, data);
+}
+
+static GstTraceValues *
+make_trace_values (GstClockTime window)
+{
+ GstTraceValues *self = g_slice_new0 (GstTraceValues);
+ self->window = window;
+ g_queue_init (&self->values);
+ return self;
+}
+
+static void
+free_trace_values (GstTraceValues * self)
+{
+ g_queue_free_full (&self->values, free_trace_value);
+ g_slice_free (GstTraceValues, self);
+}
+
+static gboolean
+update_trace_value (GstTraceValues * self, GstClockTime nts,
+ GstClockTime nval, GstClockTime * dts, GstClockTime * dval)
+{
+ GstTraceValue *lv;
+ GstClockTimeDiff dt;
+ GstClockTime window = self->window;
+ GQueue *q = &self->values;
+ GList *node = q->tail;
+ gboolean ret = FALSE;
+
+
+ /* search from the tail of the queue for a good GstTraceValue */
+ while (node) {
+ lv = node->data;
+ dt = GST_CLOCK_DIFF (lv->ts, nts);
+ if (dt < window) {
+ break;
+ } else {
+ node = g_list_previous (node);
+ }
+ }
+
+ if (node) {
+ /* calculate the windowed value */
+ *dts = dt;
+ *dval = GST_CLOCK_DIFF (lv->val, nval);
+
+ /* drop all older measurements */
+ while (q->tail != node) {
+ free_trace_value (g_queue_pop_tail (q));
+ }
+ ret = TRUE;
+ } else {
+ *dts = nts;
+ *dval = nval;
+ }
+
+ /* don't push too many data items */
+ lv = q->head ? q->head->data : NULL;
+ if (!lv || (GST_CLOCK_DIFF (lv->ts, nts) > (window / WINDOW_SUBDIV))) {
+ /* push the new measurement */
+ lv = g_slice_new0 (GstTraceValue);
+ lv->ts = nts;
+ lv->val = nval;
+ g_queue_push_head (q, lv);
+ }
+ return ret;
+}
+
+
+static void
+free_thread_stats (gpointer data)
+{
+ free_trace_values (((GstThreadStats *) data)->tvs_thread);
+ g_slice_free (GstThreadStats, data);
+}
+
+static void
+do_stats (GstTracer * obj, guint64 ts)
+{
+ GstRUsageTracer *self = GST_RUSAGE_TRACER_CAST (obj);
+ GstThreadStats *stats;
+ gpointer thread_id = g_thread_self ();
+ guint avg_cpuload, cur_cpuload;
+ struct rusage ru;
+ GstClockTime tproc = G_GUINT64_CONSTANT (0);
+ GstClockTime tthread = G_GUINT64_CONSTANT (0);
+ GstClockTime dts, dtproc;
+
+#ifdef HAVE_CLOCK_GETTIME
+ {
+ struct timespec now;
+
+ if (!clock_gettime (CLOCK_PROCESS_CPUTIME_ID, &now)) {
+ tproc = GST_TIMESPEC_TO_TIME (now);
+ } else {
+ GST_WARNING_OBJECT (obj,
+ "clock_gettime (CLOCK_PROCESS_CPUTIME_ID,...) failed: %s",
+ g_strerror (errno));
+ getrusage (RUSAGE_SELF, &ru);
+ tproc =
+ GST_TIMEVAL_TO_TIME (ru.ru_utime) + GST_TIMEVAL_TO_TIME (ru.ru_stime);
+ }
+
+ /* cpu time per thread */
+ if (!clock_gettime (CLOCK_THREAD_CPUTIME_ID, &now)) {
+ tthread = GST_TIMESPEC_TO_TIME (now);
+ } else {
+ GST_WARNING_OBJECT (obj,
+ "clock_gettime (CLOCK_THREAD_CPUTIME_ID,...) failed: %s",
+ g_strerror (errno));
+#ifdef RUSAGE_THREAD
+ getrusage (RUSAGE_THREAD, &ru);
+ tthread =
+ GST_TIMEVAL_TO_TIME (ru.ru_utime) + GST_TIMEVAL_TO_TIME (ru.ru_stime);
+#endif
+ }
+ }
+#else
+ getrusage (RUSAGE_SELF, &ru);
+ tproc = GST_TIMEVAL_TO_TIME (ru.ru_utime) + GST_TIMEVAL_TO_TIME (ru.ru_stime);
+#ifdef RUSAGE_THREAD
+ getrusage (RUSAGE_THREAD, &ru);
+ tthread =
+ GST_TIMEVAL_TO_TIME (ru.ru_utime) + GST_TIMEVAL_TO_TIME (ru.ru_stime);
+#endif
+#endif
+ /* get stats record for current thread */
+ if (!(stats = g_hash_table_lookup (self->threads, thread_id))) {
+ stats = g_slice_new0 (GstThreadStats);
+ stats->tvs_thread = make_trace_values (GST_SECOND);
+ g_hash_table_insert (self->threads, thread_id, stats);
+ }
+ stats->tthread = tthread;
+
+ /* Calibrate ts for the process and main thread. For tthread[main] and tproc
+ * the time is larger than ts, as our base-ts is taken after the process has
+ * started.
+ */
+ if (G_UNLIKELY (thread_id == self->main_thread_id)) {
+ self->main_thread_id = NULL;
+ /* when the registry gets updated, the tproc is less than the debug time ? */
+ /* TODO(ensonic): we still see cases where tproc overtakes ts, especially
+ * when with sync=false, can this be due to multiple cores in use? */
+ if (tproc > ts) {
+ self->tproc_base = tproc - ts;
+ GST_DEBUG ("rusage: calibrating by %" G_GUINT64_FORMAT ", thread: %"
+ G_GUINT64_FORMAT ", proc: %" G_GUINT64_FORMAT,
+ self->tproc_base, stats->tthread, tproc);
+ stats->tthread -= self->tproc_base;
+ }
+ }
+ /* we always need to correct proc time */
+ tproc -= self->tproc_base;
+
+ /* FIXME: how can we take cpu-frequency scaling into account?
+ * - looking at /sys/devices/system/cpu/cpu0/cpufreq/
+ * scale_factor=scaling_max_freq/scaling_cur_freq
+ * - as a workaround we can switch it via /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
+ * cpufreq-selector -g performance
+ * cpufreq-selector -g ondemand
+ */
+ /* *INDENT-OFF* */
+ avg_cpuload = (guint) gst_util_uint64_scale (stats->tthread,
+ G_GINT64_CONSTANT (1000), ts);
+ update_trace_value (stats->tvs_thread, ts, stats->tthread, &dts, &dtproc);
+ cur_cpuload = (guint) gst_util_uint64_scale (dtproc,
+ G_GINT64_CONSTANT (1000), dts);
+ gst_tracer_log_trace (gst_structure_new ("thread-rusage",
+ "ts", G_TYPE_UINT64, ts,
+ "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (thread_id),
+ "average-cpuload", G_TYPE_UINT, MIN (avg_cpuload, 1000),
+ "current-cpuload", G_TYPE_UINT, MIN (cur_cpuload, 1000),
+ "time", G_TYPE_UINT64, stats->tthread,
+ NULL));
+
+ avg_cpuload = (guint) gst_util_uint64_scale (tproc / num_cpus,
+ G_GINT64_CONSTANT (1000), ts);
+ G_LOCK (_proc);
+ update_trace_value (self->tvs_proc, ts, tproc, &dts, &dtproc);
+ G_UNLOCK (_proc);
+ cur_cpuload = (guint) gst_util_uint64_scale (dtproc / num_cpus,
+ G_GINT64_CONSTANT (1000), dts);
+ gst_tracer_log_trace (gst_structure_new ("proc-rusage",
+ "ts", G_TYPE_UINT64, ts,
+ "average-cpuload", G_TYPE_UINT, MIN (avg_cpuload, 1000),
+ "current-cpuload", G_TYPE_UINT, MIN (cur_cpuload, 1000),
+ "time", G_TYPE_UINT64, tproc,
+ NULL));
+ /* *INDENT-ON* */
+}
+
+/* tracer class */
+
+static void
+gst_rusage_tracer_finalize (GObject * obj)
+{
+ GstRUsageTracer *self = GST_RUSAGE_TRACER (obj);
+
+ g_hash_table_destroy (self->threads);
+ free_trace_values (self->tvs_proc);
+
+ G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+static void
+gst_rusage_tracer_class_init (GstRUsageTracerClass * klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ gobject_class->finalize = gst_rusage_tracer_finalize;
+
+ if ((num_cpus = sysconf (_SC_NPROCESSORS_ONLN)) == -1) {
+ GST_WARNING ("failed to get number of cpus online");
+ if ((num_cpus = sysconf (_SC_NPROCESSORS_CONF)) == -1) {
+ GST_WARNING ("failed to get number of cpus, assuming 1");
+ num_cpus = 1;
+ }
+ }
+ GST_DEBUG ("rusage: num_cpus=%ld", num_cpus);
+
+ /* announce trace formats */
+ /* *INDENT-OFF* */
+ gst_tracer_log_trace (gst_structure_new ("thread-rusage.class",
+ "thread-id", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "thread", /* TODO: use genum */
+ NULL),
+ "average-cpuload", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+ "type", G_TYPE_GTYPE, G_TYPE_UINT,
+ "description", G_TYPE_STRING, "average cpu usage per thread in ‰",
+ "flags", G_TYPE_STRING, "aggregated", /* TODO: use gflags */
+ "min", G_TYPE_UINT, 0,
+ "max", G_TYPE_UINT, 1000,
+ NULL),
+ "current-cpuload", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+ "type", G_TYPE_GTYPE, G_TYPE_UINT,
+ "description", G_TYPE_STRING, "current cpu usage per thread in ‰",
+ "flags", G_TYPE_STRING, "windowed", /* TODO: use gflags */
+ "min", G_TYPE_UINT, 0,
+ "max", G_TYPE_UINT, 1000,
+ NULL),
+ "time", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+ "type", G_TYPE_GTYPE, G_TYPE_UINT64,
+ "description", G_TYPE_STRING, "time spent in thread in ns",
+ "flags", G_TYPE_STRING, "aggregated", /* TODO: use gflags */
+ "min", G_TYPE_UINT64, G_GUINT64_CONSTANT (0),
+ "max", G_TYPE_UINT64, G_MAXUINT64,
+ NULL),
+ NULL));
+ gst_tracer_log_trace (gst_structure_new ("proc-rusage.class",
+ "thread-id", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "process", /* TODO: use genum */
+ NULL),
+ "average-cpuload", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+ "type", G_TYPE_GTYPE, G_TYPE_UINT,
+ "description", G_TYPE_STRING, "average cpu usage per process in ‰",
+ "flags", G_TYPE_STRING, "aggregated", /* TODO: use gflags */
+ "min", G_TYPE_UINT, 0,
+ "max", G_TYPE_UINT, 1000,
+ NULL),
+ "current-cpuload", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+ "type", G_TYPE_GTYPE, G_TYPE_UINT,
+ "description", G_TYPE_STRING, "current cpu usage per process in ‰",
+ "flags", G_TYPE_STRING, "windowed", /* TODO: use gflags */
+ "min", G_TYPE_UINT, 0,
+ "max", G_TYPE_UINT, 1000,
+ NULL),
+ "time", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+ "type", G_TYPE_GTYPE, G_TYPE_UINT64,
+ "description", G_TYPE_STRING, "time spent in process in ns",
+ "flags", G_TYPE_STRING, "aggregated", /* TODO: use gflags */
+ "min", G_TYPE_UINT64, G_GUINT64_CONSTANT (0),
+ "max", G_TYPE_UINT64, G_MAXUINT64,
+ NULL),
+ NULL));
+ /* *INDENT-ON* */
+}
+
+static void
+gst_rusage_tracer_init (GstRUsageTracer * self)
+{
+ GstTracer *tracer = GST_TRACER (self);
+
+ gst_tracing_register_hook_id (tracer, 0, G_CALLBACK (do_stats));
+
+ self->threads = g_hash_table_new_full (NULL, NULL, NULL, free_thread_stats);
+ self->tvs_proc = make_trace_values (GST_SECOND);
+ self->main_thread_id = g_thread_self ();
+
+ GST_DEBUG ("rusage: main thread=%p", self->main_thread_id);
+}
diff --git a/plugins/tracers/gstrusage.h b/plugins/tracers/gstrusage.h
new file mode 100644
index 0000000..b5abbca
--- /dev/null
+++ b/plugins/tracers/gstrusage.h
@@ -0,0 +1,84 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gstrusage.h: tracing module that logs resource usage stats
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_RUSAGE_TRACER_H__
+#define __GST_RUSAGE_TRACER_H__
+
+#include <gst/gst.h>
+#include <gst/gsttracer.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_RUSAGE_TRACER \
+ (gst_rusage_tracer_get_type())
+#define GST_RUSAGE_TRACER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RUSAGE_TRACER,GstRUsageTracer))
+#define GST_RUSAGE_TRACER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RUSAGE_TRACER,GstRUsageTracerClass))
+#define GST_IS_RUSAGE_TRACER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RUSAGE_TRACER))
+#define GST_IS_RUSAGE_TRACER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RUSAGE_TRACER))
+#define GST_RUSAGE_TRACER_CAST(obj) ((GstRUsageTracer *)(obj))
+
+typedef struct _GstRUsageTracer GstRUsageTracer;
+typedef struct _GstRUsageTracerClass GstRUsageTracerClass;
+
+typedef struct
+{
+ GstClockTime ts;
+ GstClockTime val;
+} GstTraceValue;
+
+typedef struct
+{
+ GstClockTime window;
+ GQueue values; /* GstTraceValue* */
+} GstTraceValues;
+
+/**
+ * GstRUsageTracer:
+ *
+ * Opaque #GstRUsageTracer data structure
+ */
+struct _GstRUsageTracer {
+ GstTracer parent;
+
+ /*< private >*/
+ GHashTable *threads;
+ GstTraceValues *tvs_proc;
+
+ /* for ts calibration */
+ gpointer main_thread_id;
+ guint64 tproc_base;
+};
+
+struct _GstRUsageTracerClass {
+ GstTracerClass parent_class;
+
+ /* signals */
+};
+
+G_GNUC_INTERNAL GType gst_rusage_tracer_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_RUSAGE_TRACER_H__ */
diff --git a/plugins/tracers/gststats.c b/plugins/tracers/gststats.c
new file mode 100644
index 0000000..8296a8d
--- /dev/null
+++ b/plugins/tracers/gststats.c
@@ -0,0 +1,702 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gststats.c: tracing module that logs events
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+/**
+ * SECTION:gststats
+ * @short_description: log event stats
+ *
+ * A tracing module that builds usage statistic for elements and pads.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "gststats.h"
+
+#include <stdio.h>
+
+GST_DEBUG_CATEGORY_STATIC (gst_stats_debug);
+#define GST_CAT_DEFAULT gst_stats_debug
+
+static GQuark data_quark;
+G_LOCK_DEFINE (_elem_stats);
+G_LOCK_DEFINE (_pad_stats);
+
+#define _do_init \
+ GST_DEBUG_CATEGORY_INIT (gst_stats_debug, "stats", 0, "stats tracer"); \
+ data_quark = g_quark_from_static_string ("gststats:data");
+#define gst_stats_tracer_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstStatsTracer, gst_stats_tracer, GST_TYPE_TRACER,
+ _do_init);
+
+typedef struct
+{
+ /* we can't rely on the address to be unique over time */
+ guint index;
+ /* for pre + post */
+ GstClockTime last_ts;
+ /* hierarchy */
+ guint parent_ix;
+} GstPadStats;
+
+typedef struct
+{
+ /* we can't rely on the address to be unique over time */
+ guint index;
+ /* for pre + post */
+ GstClockTime last_ts;
+ /* time spend in this element */
+ GstClockTime treal;
+ /* hierarchy */
+ guint parent_ix;
+} GstElementStats;
+
+/* data helper */
+
+static GstElementStats no_elem_stats = { 0, };
+
+static GstElementStats *
+fill_element_stats (GstStatsTracer * self, GstElement * element)
+{
+ GstElementStats *stats = g_slice_new0 (GstElementStats);
+
+ stats->index = self->num_elements++;
+ stats->parent_ix = G_MAXUINT;
+ return stats;
+}
+
+static void
+log_new_element_stats (GstElementStats * stats, GstElement * element,
+ GstClockTime elapsed)
+{
+ gst_tracer_log_trace (gst_structure_new ("new-element",
+ "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()),
+ "ts", G_TYPE_UINT64, elapsed,
+ "ix", G_TYPE_UINT, stats->index,
+ "parent-ix", G_TYPE_UINT, stats->parent_ix,
+ "name", G_TYPE_STRING, GST_OBJECT_NAME (element),
+ "type", G_TYPE_STRING, G_OBJECT_TYPE_NAME (element),
+ "is-bin", G_TYPE_BOOLEAN, GST_IS_BIN (element), NULL));
+}
+
+static void
+free_element_stats (gpointer data)
+{
+ g_slice_free (GstElementStats, data);
+}
+
+static GstElementStats *
+create_element_stats (GstStatsTracer * self, GstElement * element)
+{
+ GstElementStats *stats;
+
+ stats = fill_element_stats (self, element);
+ g_object_set_qdata_full ((GObject *) element, data_quark, stats,
+ free_element_stats);
+
+ return stats;
+}
+
+static inline GstElementStats *
+get_element_stats (GstStatsTracer * self, GstElement * element)
+{
+ GstElementStats *stats;
+ gboolean is_new = FALSE;
+
+ if (!element) {
+ no_elem_stats.index = G_MAXUINT;
+ return &no_elem_stats;
+ }
+
+ G_LOCK (_elem_stats);
+ if (!(stats = g_object_get_qdata ((GObject *) element, data_quark))) {
+ stats = create_element_stats (self, element);
+ is_new = TRUE;
+ }
+ G_UNLOCK (_elem_stats);
+ if (G_UNLIKELY (stats->parent_ix == G_MAXUINT)) {
+ GstElement *parent = GST_ELEMENT_PARENT (element);
+ if (parent) {
+ GstElementStats *parent_stats = get_element_stats (self, parent);
+ stats->parent_ix = parent_stats->index;
+ }
+ }
+ if (G_UNLIKELY (is_new)) {
+ log_new_element_stats (stats, element, GST_CLOCK_TIME_NONE);
+ }
+ return stats;
+}
+
+/*
+ * Get the element/bin owning the pad.
+ *
+ * in: a normal pad
+ * out: the element
+ *
+ * in: a proxy pad
+ * out: the element that contains the peer of the proxy
+ *
+ * in: a ghost pad
+ * out: the bin owning the ghostpad
+ */
+/* TODO(ensonic): gst_pad_get_parent_element() would not work here, should we
+ * add this as new api, e.g. gst_pad_find_parent_element();
+ */
+static GstElement *
+get_real_pad_parent (GstPad * pad)
+{
+ GstObject *parent;
+
+ if (!pad)
+ return NULL;
+
+ parent = GST_OBJECT_PARENT (pad);
+
+ /* if parent of pad is a ghost-pad, then pad is a proxy_pad */
+ if (parent && GST_IS_GHOST_PAD (parent)) {
+ pad = GST_PAD_CAST (parent);
+ parent = GST_OBJECT_PARENT (pad);
+ }
+ return GST_ELEMENT_CAST (parent);
+}
+
+static GstPadStats no_pad_stats = { 0, };
+
+static GstPadStats *
+fill_pad_stats (GstStatsTracer * self, GstPad * pad)
+{
+ GstPadStats *stats = g_slice_new0 (GstPadStats);
+
+ stats->index = self->num_pads++;
+ stats->parent_ix = G_MAXUINT;
+
+ return stats;
+}
+
+static void
+log_new_pad_stats (GstPadStats * stats, GstPad * pad)
+{
+ gst_tracer_log_trace (gst_structure_new ("new-pad",
+ "ix", G_TYPE_UINT, stats->index,
+ "parent-ix", G_TYPE_UINT, stats->parent_ix,
+ "name", G_TYPE_STRING, GST_OBJECT_NAME (pad),
+ "type", G_TYPE_STRING, G_OBJECT_TYPE_NAME (pad),
+ "is-ghostpad", G_TYPE_BOOLEAN, GST_IS_GHOST_PAD (pad),
+ "pad-direction", GST_TYPE_PAD_DIRECTION, GST_PAD_DIRECTION (pad),
+ "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()), NULL));
+}
+
+static void
+free_pad_stats (gpointer data)
+{
+ g_slice_free (GstPadStats, data);
+}
+
+static GstPadStats *
+get_pad_stats (GstStatsTracer * self, GstPad * pad)
+{
+ GstPadStats *stats;
+ gboolean is_new = FALSE;
+
+ if (!pad) {
+ no_pad_stats.index = G_MAXUINT;
+ return &no_pad_stats;
+ }
+
+ G_LOCK (_pad_stats);
+ if (!(stats = g_object_get_qdata ((GObject *) pad, data_quark))) {
+ stats = fill_pad_stats (self, pad);
+ g_object_set_qdata_full ((GObject *) pad, data_quark, stats,
+ free_pad_stats);
+ is_new = TRUE;
+ }
+ G_UNLOCK (_pad_stats);
+ if (G_UNLIKELY (stats->parent_ix == G_MAXUINT)) {
+ GstElement *elem = get_real_pad_parent (pad);
+ if (elem) {
+ GstElementStats *elem_stats = get_element_stats (self, elem);
+
+ stats->parent_ix = elem_stats->index;
+ }
+ }
+ if (G_UNLIKELY (is_new)) {
+ log_new_pad_stats (stats, pad);
+ }
+ return stats;
+}
+
+static void
+do_buffer_stats (GstStatsTracer * self, GstPad * this_pad,
+ GstPadStats * this_pad_stats, GstPad * that_pad,
+ GstPadStats * that_pad_stats, GstBuffer * buf, GstClockTime elapsed)
+{
+ GstElement *this_elem = get_real_pad_parent (this_pad);
+ GstElementStats *this_elem_stats = get_element_stats (self, this_elem);
+ GstElement *that_elem = get_real_pad_parent (that_pad);
+ GstElementStats *that_elem_stats = get_element_stats (self, that_elem);
+
+ /* TODO(ensonic): need a quark-table (shared with the tracer-front-ends?) */
+ gst_tracer_log_trace (gst_structure_new ("buffer",
+ "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()),
+ "ts", G_TYPE_UINT64, elapsed,
+ "pad-ix", G_TYPE_UINT, this_pad_stats->index,
+ "elem-ix", G_TYPE_UINT, this_elem_stats->index,
+ "peer-pad-ix", G_TYPE_UINT, that_pad_stats->index,
+ "peer-elem-ix", G_TYPE_UINT, that_elem_stats->index,
+ "buffer-size", G_TYPE_UINT, gst_buffer_get_size (buf),
+ "buffer-pts", G_TYPE_UINT64, GST_BUFFER_PTS (buf),
+ "buffer-dts", G_TYPE_UINT64, GST_BUFFER_DTS (buf),
+ "buffer-duration", G_TYPE_UINT64, GST_BUFFER_DURATION (buf),
+ "buffer-flags", GST_TYPE_BUFFER_FLAGS, GST_BUFFER_FLAGS (buf),
+ /*
+ scheduling-jitter: for this we need the last_ts on the pad
+ */
+ NULL));
+}
+
+static void
+do_query_stats (GstStatsTracer * self, GstPad * this_pad,
+ GstPadStats * this_pad_stats, GstPad * that_pad,
+ GstPadStats * that_pad_stats, GstQuery * qry, GstClockTime elapsed,
+ gboolean res, gboolean pre)
+{
+ GstElement *this_elem = get_real_pad_parent (this_pad);
+ GstElementStats *this_elem_stats = get_element_stats (self, this_elem);
+ GstElement *that_elem = get_real_pad_parent (that_pad);
+ GstElementStats *that_elem_stats = get_element_stats (self, that_elem);
+ GstStructure *s;
+
+ s = gst_structure_new ("query",
+ "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()),
+ "ts", G_TYPE_UINT64, elapsed,
+ "pad-ix", G_TYPE_UINT, this_pad_stats->index,
+ "elem-ix", G_TYPE_UINT, this_elem_stats->index,
+ "peer-pad-ix", G_TYPE_UINT, that_pad_stats->index,
+ "peer-elem-ix", G_TYPE_UINT, that_elem_stats->index,
+ "name", G_TYPE_STRING, GST_QUERY_TYPE_NAME (qry),
+ "structure", GST_TYPE_STRUCTURE, gst_query_get_structure (qry), NULL);
+ if (!pre) {
+ gst_structure_set (s, "res", G_TYPE_BOOLEAN, res, NULL);
+ }
+ gst_tracer_log_trace (s);
+}
+
+static void
+do_element_stats (GstStatsTracer * self, GstPad * pad, GstClockTime elapsed1,
+ GstClockTime elapsed2)
+{
+ GstClockTimeDiff elapsed = GST_CLOCK_DIFF (elapsed1, elapsed2);
+ GstObject *parent = GST_OBJECT_PARENT (pad);
+ GstElement *this =
+ GST_ELEMENT_CAST (GST_IS_PAD (parent) ? GST_OBJECT_PARENT (parent) :
+ parent);
+ GstElementStats *this_stats = get_element_stats (self, this);
+ GstPad *peer_pad = GST_PAD_PEER (pad);
+ GstElementStats *peer_stats;
+
+ if (!peer_pad)
+ return;
+
+ /* walk the ghost pad chain downstream to get the real pad */
+ /* if parent of peer_pad is a ghost-pad, then peer_pad is a proxy_pad */
+ parent = GST_OBJECT_PARENT (peer_pad);
+ if (parent && GST_IS_GHOST_PAD (parent)) {
+ peer_pad = GST_PAD_CAST (parent);
+ /* if this is now the ghost pad, get the peer of this */
+ get_pad_stats (self, peer_pad);
+ if ((parent = GST_OBJECT_PARENT (peer_pad))) {
+ get_element_stats (self, GST_ELEMENT_CAST (parent));
+ }
+ peer_pad = GST_PAD_PEER (GST_GHOST_PAD_CAST (peer_pad));
+ parent = peer_pad ? GST_OBJECT_PARENT (peer_pad) : NULL;
+ }
+ /* walk the ghost pad chain upstream to get the real pad */
+ /* if peer_pad is a ghost-pad, then parent is a bin and it is the parent of
+ * a proxy_pad */
+ while (peer_pad && GST_IS_GHOST_PAD (peer_pad)) {
+ get_pad_stats (self, peer_pad);
+ get_element_stats (self, GST_ELEMENT_CAST (parent));
+ peer_pad = gst_ghost_pad_get_target (GST_GHOST_PAD_CAST (peer_pad));
+ parent = peer_pad ? GST_OBJECT_PARENT (peer_pad) : NULL;
+ }
+
+ if (!parent) {
+ printf ("%" GST_TIME_FORMAT
+ " transmission on unparented target pad %s_%s -> %s_%s\n",
+ GST_TIME_ARGS (elapsed), GST_DEBUG_PAD_NAME (pad),
+ GST_DEBUG_PAD_NAME (peer_pad));
+ return;
+ }
+ peer_stats = get_element_stats (self, GST_ELEMENT_CAST (parent));
+
+ /* we'd like to gather time spend in each element, but this does not make too
+ * much sense yet
+ * pure push/pull-based:
+ * - the time spend in the push/pull_range is accounted for the peer and
+ * removed from the current element
+ * - this works for chains
+ * - drawback is sink elements that block to sync have a high time usage
+ * - we could rerun the ests with sync=false
+ * both:
+ * - a.g. demuxers both push and pull. thus we subtract time for the pull
+ * and the push operations, but never add anything.
+ * - can we start a counter after push/pull in such elements and add then
+ * time to the element upon next pad activity?
+ */
+#if 1
+ /* this does not make sense for demuxers */
+ this_stats->treal -= elapsed;
+ peer_stats->treal += elapsed;
+#else
+ /* this creates several >100% figures */
+ this_stats->treal += GST_CLOCK_DIFF (this_stats->last_ts, elapsed2) - elapsed;
+ peer_stats->treal += elapsed;
+ this_stats->last_ts = elapsed2;
+ peer_stats->last_ts = elapsed2;
+#endif
+}
+
+/* hooks */
+
+static void
+do_push_buffer_pre (GstStatsTracer * self, guint64 ts, GstPad * this_pad,
+ GstBuffer * buffer)
+{
+ GstPadStats *this_pad_stats = get_pad_stats (self, this_pad);
+ GstPad *that_pad = GST_PAD_PEER (this_pad);
+ GstPadStats *that_pad_stats = get_pad_stats (self, that_pad);
+
+ do_buffer_stats (self, this_pad, this_pad_stats, that_pad, that_pad_stats,
+ buffer, ts);
+}
+
+static void
+do_push_buffer_post (GstStatsTracer * self, guint64 ts, GstPad * pad)
+{
+ GstPadStats *stats = get_pad_stats (self, pad);
+
+ do_element_stats (self, pad, stats->last_ts, ts);
+}
+
+typedef struct
+{
+ GstStatsTracer *self;
+ GstPad *this_pad;
+ GstPadStats *this_pad_stats;
+ GstPad *that_pad;
+ GstPadStats *that_pad_stats;
+ guint64 ts;
+} DoPushBufferListArgs;
+
+static gboolean
+do_push_buffer_list_item (GstBuffer ** buffer, guint idx, gpointer user_data)
+{
+ DoPushBufferListArgs *args = (DoPushBufferListArgs *) user_data;
+
+ do_buffer_stats (args->self, args->this_pad, args->this_pad_stats,
+ args->that_pad, args->that_pad_stats, *buffer, args->ts);
+ return TRUE;
+}
+
+static void
+do_push_buffer_list_pre (GstStatsTracer * self, guint64 ts, GstPad * this_pad,
+ GstBufferList * list)
+{
+ GstPadStats *this_pad_stats = get_pad_stats (self, this_pad);
+ GstPad *that_pad = GST_PAD_PEER (this_pad);
+ GstPadStats *that_pad_stats = get_pad_stats (self, that_pad);
+ DoPushBufferListArgs args = { self, this_pad, this_pad_stats, that_pad,
+ that_pad_stats, ts
+ };
+
+ gst_buffer_list_foreach (list, do_push_buffer_list_item, &args);
+}
+
+static void
+do_push_buffer_list_post (GstStatsTracer * self, guint64 ts, GstPad * pad)
+{
+ GstPadStats *stats = get_pad_stats (self, pad);
+
+ do_element_stats (self, pad, stats->last_ts, ts);
+}
+
+static void
+do_pull_range_pre (GstStatsTracer * self, guint64 ts, GstPad * pad)
+{
+ GstPadStats *stats = get_pad_stats (self, pad);
+ stats->last_ts = ts;
+}
+
+static void
+do_pull_range_post (GstStatsTracer * self, guint64 ts, GstPad * this_pad,
+ GstBuffer * buffer)
+{
+ GstPadStats *this_pad_stats = get_pad_stats (self, this_pad);
+ guint64 last_ts = this_pad_stats->last_ts;
+ GstPad *that_pad = GST_PAD_PEER (this_pad);
+ GstPadStats *that_pad_stats = get_pad_stats (self, that_pad);
+
+ if (buffer != NULL) {
+ do_buffer_stats (self, this_pad, this_pad_stats, that_pad, that_pad_stats,
+ buffer, ts);
+ }
+ do_element_stats (self, this_pad, last_ts, ts);
+}
+
+static void
+do_push_event_pre (GstStatsTracer * self, guint64 ts, GstPad * pad,
+ GstEvent * ev)
+{
+ GstElement *elem = get_real_pad_parent (pad);
+ GstElementStats *elem_stats = get_element_stats (self, elem);
+ GstPadStats *pad_stats = get_pad_stats (self, pad);
+
+ elem_stats->last_ts = ts;
+ gst_tracer_log_trace (gst_structure_new ("event",
+ "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()),
+ "ts", G_TYPE_UINT64, ts,
+ "pad-ix", G_TYPE_UINT, pad_stats->index,
+ "elem-ix", G_TYPE_UINT, elem_stats->index,
+ "name", G_TYPE_STRING, GST_EVENT_TYPE_NAME (ev), NULL));
+}
+
+static void
+do_post_message_pre (GstStatsTracer * self, guint64 ts, GstElement * elem,
+ GstMessage * msg)
+{
+ GstElementStats *stats = get_element_stats (self, elem);
+ const GstStructure *msg_s;
+ GstStructure *structure = gst_structure_new ("message",
+ "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()),
+ "ts", G_TYPE_UINT64, ts,
+ "elem-ix", G_TYPE_UINT, stats->index,
+ "name", G_TYPE_STRING, GST_MESSAGE_TYPE_NAME (msg),
+ NULL);
+
+ stats->last_ts = ts;
+
+ if ((msg_s = gst_message_get_structure (msg))) {
+ gst_structure_set (structure, "structure", GST_TYPE_STRUCTURE, msg_s, NULL);
+ }
+
+ gst_tracer_log_trace (structure);
+}
+
+static void
+do_element_new (GstStatsTracer * self, guint64 ts, GstElement * elem)
+{
+ GstElementStats *stats;
+
+ stats = create_element_stats (self, elem);
+ log_new_element_stats (stats, elem, ts);
+}
+
+static void
+do_element_query_pre (GstStatsTracer * self, guint64 ts, GstElement * elem,
+ GstQuery * qry)
+{
+ GstElementStats *stats = get_element_stats (self, elem);
+
+ stats->last_ts = ts;
+ gst_tracer_log_trace (gst_structure_new ("element-query",
+ "thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()),
+ "ts", G_TYPE_UINT64, ts,
+ "elem-ix", G_TYPE_UINT, stats->index,
+ "name", G_TYPE_STRING, GST_QUERY_TYPE_NAME (qry), NULL));
+}
+
+static void
+do_query_pre (GstStatsTracer * self, guint64 ts, GstPad * this_pad,
+ GstQuery * qry)
+{
+ GstPadStats *this_pad_stats = get_pad_stats (self, this_pad);
+ GstPad *that_pad = GST_PAD_PEER (this_pad);
+ GstPadStats *that_pad_stats = get_pad_stats (self, that_pad);
+
+ do_query_stats (self, this_pad, this_pad_stats, that_pad, that_pad_stats,
+ qry, ts, FALSE, TRUE);
+}
+
+static void
+do_query_post (GstStatsTracer * self, guint64 ts, GstPad * this_pad,
+ gboolean res, GstQuery * qry)
+{
+ GstPadStats *this_pad_stats = get_pad_stats (self, this_pad);
+ GstPad *that_pad = GST_PAD_PEER (this_pad);
+ GstPadStats *that_pad_stats = get_pad_stats (self, that_pad);
+
+ do_query_stats (self, this_pad, this_pad_stats, that_pad, that_pad_stats,
+ qry, ts, res, FALSE);
+}
+
+/* tracer class */
+
+static void
+gst_stats_tracer_class_init (GstStatsTracerClass * klass)
+{
+ /* announce trace formats */
+ /* *INDENT-OFF* */
+ gst_tracer_log_trace (gst_structure_new ("buffer.class",
+ "thread-id", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "thread", /* TODO use genum */
+ NULL),
+ "pad-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "pad", /* TODO: use genum */
+ NULL),
+ "element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "element", /* TODO: use genum */
+ NULL),
+ "peer-pad-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "pad", /* TODO: use genum */
+ NULL),
+ "peer-element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "element", /* TODO: use genum */
+ NULL),
+ "buffer-size", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+ "type", G_TYPE_GTYPE, G_TYPE_UINT,
+ "description", G_TYPE_STRING, "size of buffer in bytes",
+ "flags", G_TYPE_STRING, "", /* TODO: use gflags */
+ "min", G_TYPE_UINT, 0,
+ "max", G_TYPE_UINT, G_MAXUINT,
+ NULL),
+ "buffer-ts", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+ "type", G_TYPE_GTYPE, G_TYPE_UINT64,
+ "description", G_TYPE_STRING, "timestamp of the buffer in ns",
+ "flags", G_TYPE_STRING, "", /* TODO: use gflags */
+ "min", G_TYPE_UINT64, G_GUINT64_CONSTANT (0),
+ "max", G_TYPE_UINT64, G_MAXUINT64,
+ NULL),
+ "buffer-duration", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+ "type", G_TYPE_GTYPE, G_TYPE_UINT64,
+ "description", G_TYPE_STRING, "duration of the buffer in ns",
+ "flags", G_TYPE_STRING, "", /* TODO: use gflags */
+ "min", G_TYPE_UINT64, G_GUINT64_CONSTANT (0),
+ "max", G_TYPE_UINT64, G_MAXUINT64,
+ NULL),
+ /* TODO(ensonic): "buffer-flags" */
+ NULL));
+ gst_tracer_log_trace (gst_structure_new ("event.class",
+ "thread-id", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "thread", /* TODO use genum */
+ NULL),
+ "pad-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "pad", /* TODO: use genum */
+ NULL),
+ "element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "element", /* TODO: use genum */
+ NULL),
+ "name", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+ "type", G_TYPE_GTYPE, G_TYPE_STRING,
+ "description", G_TYPE_STRING, "name of the event",
+ "flags", G_TYPE_STRING, "", /* TODO: use gflags */
+ NULL),
+ NULL));
+ gst_tracer_log_trace (gst_structure_new ("message.class",
+ "thread-id", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "thread", /* TODO use genum */
+ NULL),
+ "element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "element", /* TODO: use genum */
+ NULL),
+ "name", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+ "type", G_TYPE_GTYPE, G_TYPE_STRING,
+ "description", G_TYPE_STRING, "name of the message",
+ "flags", G_TYPE_STRING, "", /* TODO: use gflags */
+ NULL),
+ "structure", GST_TYPE_STRUCTURE, gst_structure_new ("structure",
+ "type", G_TYPE_GTYPE, GST_TYPE_STRUCTURE,
+ "description", G_TYPE_STRING, "message structure",
+ NULL),
+ NULL));
+ gst_tracer_log_trace (gst_structure_new ("elementquery.class",
+ "thread-id", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "thread", /* TODO use genum */
+ NULL),
+ "element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "element", /* TODO: use genum */
+ NULL),
+ "name", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+ "type", G_TYPE_GTYPE, G_TYPE_STRING,
+ "description", G_TYPE_STRING, "name of the query",
+ "flags", G_TYPE_STRING, "", /* TODO: use gflags */
+ NULL),
+ NULL));
+ gst_tracer_log_trace (gst_structure_new ("query.class",
+ "thread-id", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "thread", /* TODO use genum */
+ NULL),
+ "pad-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "pad", /* TODO: use genum */
+ NULL),
+ "element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "element", /* TODO: use genum */
+ NULL),
+ "peer-pad-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "pad", /* TODO: use genum */
+ NULL),
+ "peer-element-ix", GST_TYPE_STRUCTURE, gst_structure_new ("scope",
+ "related-to", G_TYPE_STRING, "element", /* TODO: use genum */
+ NULL),
+ "name", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+ "type", G_TYPE_GTYPE, G_TYPE_STRING,
+ "description", G_TYPE_STRING, "name of the query",
+ "flags", G_TYPE_STRING, "", /* TODO: use gflags */
+ NULL),
+ "structure", GST_TYPE_STRUCTURE, gst_structure_new ("value",
+ "type", G_TYPE_GTYPE, GST_TYPE_STRUCTURE,
+ "description", G_TYPE_STRING, "query structure",
+ "flags", G_TYPE_STRING, "", /* TODO: use gflags */
+ NULL),
+ /* TODO(ensonic): "buffer-flags" */
+ NULL));
+ /* *INDENT-ON* */
+}
+
+static void
+gst_stats_tracer_init (GstStatsTracer * self)
+{
+ GstTracer *tracer = GST_TRACER (self);
+
+ gst_tracing_register_hook (tracer, "pad-push-pre",
+ G_CALLBACK (do_push_buffer_pre));
+ gst_tracing_register_hook (tracer, "pad-push-post",
+ G_CALLBACK (do_push_buffer_post));
+ gst_tracing_register_hook (tracer, "pad-push-list-pre",
+ G_CALLBACK (do_push_buffer_list_pre));
+ gst_tracing_register_hook (tracer, "pad-push-list-post",
+ G_CALLBACK (do_push_buffer_list_post));
+ gst_tracing_register_hook (tracer, "pad-pull-range-pre",
+ G_CALLBACK (do_pull_range_pre));
+ gst_tracing_register_hook (tracer, "pad-pull-range-post",
+ G_CALLBACK (do_pull_range_post));
+ gst_tracing_register_hook (tracer, "pad-push-event-pre",
+ G_CALLBACK (do_push_event_pre));
+ gst_tracing_register_hook (tracer, "element-new",
+ G_CALLBACK (do_element_new));
+ gst_tracing_register_hook (tracer, "element-post-message-pre",
+ G_CALLBACK (do_post_message_pre));
+ gst_tracing_register_hook (tracer, "element-query-pre",
+ G_CALLBACK (do_element_query_pre));
+ gst_tracing_register_hook (tracer, "pad-query-pre",
+ G_CALLBACK (do_query_pre));
+ gst_tracing_register_hook (tracer, "pad-query-post",
+ G_CALLBACK (do_query_post));
+}
diff --git a/plugins/tracers/gststats.h b/plugins/tracers/gststats.h
new file mode 100644
index 0000000..a846b1b
--- /dev/null
+++ b/plugins/tracers/gststats.h
@@ -0,0 +1,67 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gststats.h: tracing module that logs events
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GST_STATS_TRACER_H__
+#define __GST_STATS_TRACER_H__
+
+#include <gst/gst.h>
+#include <gst/gsttracer.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_STATS_TRACER \
+ (gst_stats_tracer_get_type())
+#define GST_STATS_TRACER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_STATS_TRACER,GstStatsTracer))
+#define GST_STATS_TRACER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_STATS_TRACER,GstStatsTracerClass))
+#define GST_IS_STATS_TRACER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_STATS_TRACER))
+#define GST_IS_STATS_TRACER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_STATS_TRACER))
+#define GST_STATS_TRACER_CAST(obj) ((GstStatsTracer *)(obj))
+
+typedef struct _GstStatsTracer GstStatsTracer;
+typedef struct _GstStatsTracerClass GstStatsTracerClass;
+
+/**
+ * GstStatsTracer:
+ *
+ * Opaque #GstStatsTracer data structure
+ */
+struct _GstStatsTracer {
+ GstTracer parent;
+
+ /*< private >*/
+ guint num_elements, num_pads;
+};
+
+struct _GstStatsTracerClass {
+ GstTracerClass parent_class;
+
+ /* signals */
+};
+
+G_GNUC_INTERNAL GType gst_stats_tracer_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_STATS_TRACER_H__ */
diff --git a/plugins/tracers/gsttracers.c b/plugins/tracers/gsttracers.c
new file mode 100644
index 0000000..010c185
--- /dev/null
+++ b/plugins/tracers/gsttracers.c
@@ -0,0 +1,52 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gsttracers.c: tracing modules
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gst/gst.h>
+#include "gstlatency.h"
+#include "gstlog.h"
+#include "gstrusage.h"
+#include "gststats.h"
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+ if (!gst_tracer_register (plugin, "latency", gst_latency_tracer_get_type ()))
+ return FALSE;
+#ifndef GST_DISABLE_GST_DEBUG
+ if (!gst_tracer_register (plugin, "log", gst_log_tracer_get_type ()))
+ return FALSE;
+#endif
+#ifdef HAVE_GETRUSAGE
+ if (!gst_tracer_register (plugin, "rusage", gst_rusage_tracer_get_type ()))
+ return FALSE;
+#endif
+ if (!gst_tracer_register (plugin, "stats", gst_stats_tracer_get_type ()))
+ return FALSE;
+ return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, coretracers,
+ "GStreamer core tracers", plugin_init, VERSION, GST_LICENSE,
+ GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
diff --git a/po/af.gmo b/po/af.gmo
index 59a7360..77f3976 100644
--- a/po/af.gmo
+++ b/po/af.gmo
Binary files differ
diff --git a/po/af.po b/po/af.po
index 1050b15..9c1ebe4 100644
--- a/po/af.po
+++ b/po/af.po
@@ -7,7 +7,7 @@
msgstr ""
"Project-Id-Version: gstreamer 0.9.7\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+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"
@@ -827,6 +827,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/az.gmo b/po/az.gmo
index d46e592..98ebcb4 100644
--- a/po/az.gmo
+++ b/po/az.gmo
Binary files differ
diff --git a/po/az.po b/po/az.po
index 2ea3af5..74e9b06 100644
--- a/po/az.po
+++ b/po/az.po
@@ -7,7 +7,7 @@
msgstr ""
"Project-Id-Version: gstreamer-0.8.0\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+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"
@@ -780,6 +780,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/be.gmo b/po/be.gmo
index e5e03a7..db2ff2c 100644
--- a/po/be.gmo
+++ b/po/be.gmo
Binary files differ
diff --git a/po/be.po b/po/be.po
index 7c08286..448f5bf 100644
--- a/po/be.po
+++ b/po/be.po
@@ -6,7 +6,7 @@
msgstr ""
"Project-Id-Version: gstreamer 0.9.7\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+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"
@@ -786,6 +786,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ""
diff --git a/po/bg.gmo b/po/bg.gmo
index e14018f..199dd93 100644
--- a/po/bg.gmo
+++ b/po/bg.gmo
Binary files differ
diff --git a/po/bg.po b/po/bg.po
index 75b2654..5d24952 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -8,7 +8,7 @@
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+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"
@@ -819,6 +819,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/ca.gmo b/po/ca.gmo
index 2ff23fe..8aca101 100644
--- a/po/ca.gmo
+++ b/po/ca.gmo
Binary files differ
diff --git a/po/ca.po b/po/ca.po
index 2e9b8ed..de16212 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -7,7 +7,7 @@
msgstr ""
"Project-Id-Version: gstreamer 0.10.30.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+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"
@@ -828,6 +828,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/cs.gmo b/po/cs.gmo
index ce912c8..fe0dd58 100644
--- a/po/cs.gmo
+++ b/po/cs.gmo
Binary files differ
diff --git a/po/cs.po b/po/cs.po
index b72b031..daeef2a 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -9,7 +9,7 @@
msgstr ""
"Project-Id-Version: gstreamer 1.6.0\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2015-10-15 21:04+0200\n"
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
"Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n"
@@ -817,6 +817,12 @@
msgid "Midi note number of the audio track."
msgstr "Číslo noty MIDI pro zvukovou stopu."
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr "; "
diff --git a/po/da.gmo b/po/da.gmo
index 61a13a4..1215fc3 100644
--- a/po/da.gmo
+++ b/po/da.gmo
Binary files differ
diff --git a/po/da.po b/po/da.po
index a96cc46..b18e6b3 100644
--- a/po/da.po
+++ b/po/da.po
@@ -8,7 +8,7 @@
msgstr ""
"Project-Id-Version: gstreamer 1.3.90\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2014-07-16 13:26+0200\n"
"Last-Translator: Mogens Jaeger <mogensjaeger@gmail.com>\n"
"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
@@ -816,6 +816,12 @@
msgid "Midi note number of the audio track."
msgstr "Midi-nodenummer på lydsporet."
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/de.gmo b/po/de.gmo
index dccae71..f7af715 100644
--- a/po/de.gmo
+++ b/po/de.gmo
Binary files differ
diff --git a/po/de.po b/po/de.po
index b2ba43e..7ea44d4 100644
--- a/po/de.po
+++ b/po/de.po
@@ -9,7 +9,7 @@
msgstr ""
"Project-Id-Version: gstreamer 1.6.0\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2015-10-21 00:13+0200\n"
"Last-Translator: Christian Kirbach <christian.kirbach@gmail.com>\n"
"Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
@@ -844,6 +844,12 @@
msgid "Midi note number of the audio track."
msgstr "Midi-Notenzahl der Tonspur."
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/el.gmo b/po/el.gmo
index 6c321b9..f2ff7b5 100644
--- a/po/el.gmo
+++ b/po/el.gmo
Binary files differ
diff --git a/po/el.po b/po/el.po
index 6e3ed39..9f357af 100644
--- a/po/el.po
+++ b/po/el.po
@@ -6,7 +6,7 @@
msgstr ""
"Project-Id-Version: gstreamer-0.10.30.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+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"
@@ -840,6 +840,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/en_GB.gmo b/po/en_GB.gmo
index 7fb7f77..487db6f 100644
--- a/po/en_GB.gmo
+++ b/po/en_GB.gmo
Binary files differ
diff --git a/po/en_GB.po b/po/en_GB.po
index 4ca1e33..aee667b 100644
--- a/po/en_GB.po
+++ b/po/en_GB.po
@@ -6,7 +6,7 @@
msgstr ""
"Project-Id-Version: gstreamer 0.8.1\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+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"
@@ -831,6 +831,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/eo.gmo b/po/eo.gmo
index 4f3cf83..a84f589 100644
--- a/po/eo.gmo
+++ b/po/eo.gmo
Binary files differ
diff --git a/po/eo.po b/po/eo.po
index 8f592f9..0c6a4c6 100644
--- a/po/eo.po
+++ b/po/eo.po
@@ -7,7 +7,7 @@
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+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"
@@ -770,6 +770,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/es.gmo b/po/es.gmo
index 10609cb..48e54a8 100644
--- a/po/es.gmo
+++ b/po/es.gmo
Binary files differ
diff --git a/po/es.po b/po/es.po
index e9d1861..17de2b1 100644
--- a/po/es.po
+++ b/po/es.po
@@ -7,7 +7,7 @@
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+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"
@@ -831,6 +831,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/eu.gmo b/po/eu.gmo
index 15900a7..eed82b8 100644
--- a/po/eu.gmo
+++ b/po/eu.gmo
Binary files differ
diff --git a/po/eu.po b/po/eu.po
index 9b1cb88..1056f3a 100644
--- a/po/eu.po
+++ b/po/eu.po
@@ -8,7 +8,7 @@
msgstr ""
"Project-Id-Version: gstreamer-0.10.26.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+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"
@@ -829,6 +829,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/fi.gmo b/po/fi.gmo
index 8e42759..0e85820 100644
--- a/po/fi.gmo
+++ b/po/fi.gmo
Binary files differ
diff --git a/po/fi.po b/po/fi.po
index 85b4973..bc94f34 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -12,7 +12,7 @@
msgstr ""
"Project-Id-Version: gstreamer 0.10.30.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+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"
@@ -826,6 +826,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/fr.gmo b/po/fr.gmo
index 77cece8..ab1dabb 100644
--- a/po/fr.gmo
+++ b/po/fr.gmo
Binary files differ
diff --git a/po/fr.po b/po/fr.po
index b360ade..1c784b6 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -8,10 +8,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: gstreamer 1.4.1\n"
+"Project-Id-Version: gstreamer 1.6.0\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
-"PO-Revision-Date: 2015-04-26 19:49+0200\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
+"PO-Revision-Date: 2015-12-23 01:29+0100\n"
"Last-Translator: Stéphane Aulery <lkppo@free.fr>\n"
"Language-Team: French <traduc@traduc.org>\n"
"Language: fr\n"
@@ -43,8 +43,8 @@
"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
msgstr ""
"Liste séparée par des virgules de paires nom_catégorie:niveau définissant "
-"des niveaux spécifiques pour chaque catégorie.\n"
-"Exemple : GST_AUTOPLUG:5,GST_ELEMENT_*:3"
+"des niveaux spécifiques pour chaque catégorie. Exemple : GST_AUTOPLUG:5,"
+"GST_ELEMENT_*:3"
msgid "LIST"
msgstr "LISTE"
@@ -56,6 +56,8 @@
"Changes coloring mode of the debug log. Possible modes: off, on, disable, "
"auto, unix"
msgstr ""
+"Modification du mode de coloration du journal de debug. Modes disponibles : "
+"off, on, disable, auto, unix"
msgid "Disable debugging"
msgstr "Désactive le débogage"
@@ -208,9 +210,8 @@
msgid "No space left on the resource."
msgstr "Espace libre insuffisant dans la ressource."
-#, fuzzy
msgid "Not authorized to access resource."
-msgstr "Espace libre insuffisant dans la ressource."
+msgstr "Accès à la ressource interdit."
msgid "GStreamer encountered a general stream error."
msgstr "GStreamer a rencontré une erreur générale de flux."
@@ -265,7 +266,7 @@
#, c-format
msgid "Error writing registry cache to %s: %s"
-msgstr ""
+msgstr "Erreur d’écriture du cache de registre à %s : %s"
msgid "title"
msgstr "titre"
@@ -805,21 +806,29 @@
"Indique la manière de pivoter ou de retourner l'image avant de l'afficher"
msgid "publisher"
-msgstr ""
+msgstr "éditeur"
msgid "Name of the label or publisher"
-msgstr ""
+msgstr "Nom de l’étiquette ou de l’éditeur"
msgid "interpreted-by"
-msgstr ""
+msgstr "interprété-par"
msgid "Information about the people behind a remix and similar interpretations"
msgstr ""
+"Information sur les personnes qui ont fait un remix et interprétations "
+"similaires"
msgid "midi-base-note"
-msgstr ""
+msgstr "midi-base-note"
msgid "Midi note number of the audio track."
+msgstr "Numèro de note Midi d’une piste audio."
+
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
msgstr ""
msgid ", "
@@ -827,11 +836,11 @@
#, c-format
msgid "No URI handler for the %s protocol found"
-msgstr ""
+msgstr "Aucun gestionnaire d’URI trouvé pour le protocole %s"
#, c-format
msgid "URI scheme '%s' not supported"
-msgstr ""
+msgstr "schèma URI « %s » non pris en charge"
#, c-format
msgid "ERROR: from element %s: %s\n"
@@ -847,11 +856,11 @@
#, c-format
msgid "link has no source [sink=%s@%p]"
-msgstr ""
+msgstr "lien sans source [sink=%s@%p]"
#, c-format
msgid "link has no sink [source=%s@%p]"
-msgstr ""
+msgstr "lien sans sink [source=%s@%p]"
#, c-format
msgid "no property \"%s\" in element \"%s\""
@@ -871,11 +880,11 @@
#, c-format
msgid "unexpected reference \"%s\" - ignoring"
-msgstr ""
+msgstr "référence « %s » inattendue - ignoré"
#, c-format
msgid "unexpected pad-reference \"%s\" - ignoring"
-msgstr ""
+msgstr "pad-référence « %s » inattendue - ignoré"
#, c-format
msgid "could not parse caps \"%s\""
@@ -922,7 +931,7 @@
msgstr "Erreur d'horloge interne."
msgid "Failed to map buffer."
-msgstr ""
+msgstr "Impossible de mapper les buffer."
msgid "Filter caps"
msgstr "Capacités de filtrage"
@@ -936,10 +945,10 @@
"fourni."
msgid "Caps Change Mode"
-msgstr ""
+msgstr "Mode majuscule activé"
msgid "Filter caps change behaviour"
-msgstr ""
+msgstr "Filtre de comportement de modification des majuscules"
msgid "No Temp directory specified."
msgstr "Aucun répertoire temporaire indiqué."
@@ -1007,9 +1016,8 @@
msgid "force caps without doing a typefind"
msgstr "force les capacités sans faire de recherche de type"
-#, fuzzy
msgid "Stream contains not enough data."
-msgstr "Le flux ne contient aucune donnée."
+msgstr "Le flux ne contient pas assez de données."
msgid "Stream contains no data."
msgstr "Le flux ne contient aucune donnée."
@@ -1024,7 +1032,7 @@
msgstr "accès en écriture"
msgid "deprecated"
-msgstr ""
+msgstr "obsolète"
msgid "controllable"
msgstr "contrôlable"
@@ -1199,15 +1207,15 @@
#, c-format
msgid "Progress: (%s) %s\n"
-msgstr ""
+msgstr "Progression : (%s) %s\n"
#, c-format
msgid "Missing element: %s\n"
msgstr "Élément manquant : %s\n"
-#, fuzzy, c-format
+#, c-format
msgid "Got context from element '%s': %s=%s\n"
-msgstr "AVERTISSEMENT : de l'élément %s : %s\n"
+msgstr "Contexte de l’élément « %s » : %s=%s\n"
msgid "Output tags (also known as metadata)"
msgstr "Affiche les balises (aussi connues sous le nom de métadonnées)"
@@ -1228,9 +1236,11 @@
"Do not output status information for the specified property if verbose "
"output is enabled (can be used multiple times)"
msgstr ""
+"Ne pas afficher les informations de la propriété spécifiée si le mode "
+"verbeux est activé (peut être utilisé plusieurs fois)"
msgid "PROPERTY-NAME"
-msgstr ""
+msgstr "NOM-PROPRIÉTÉ"
msgid "Do not install a fault handler"
msgstr "N'installe pas de gestionnaire de dysfonctionnement"
diff --git a/po/gl.gmo b/po/gl.gmo
index a6f7e82..04c1914 100644
--- a/po/gl.gmo
+++ b/po/gl.gmo
Binary files differ
diff --git a/po/gl.po b/po/gl.po
index 07d0f66..7dc05ed 100644
--- a/po/gl.po
+++ b/po/gl.po
@@ -6,7 +6,7 @@
msgstr ""
"Project-Id-Version: gstreamer 1.0.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2012-12-15 03:29+0200\n"
"Last-Translator: Fran Dieguez <frandieguez@ubuntu.com>\n"
"Language-Team: Galician <proxecto@trasno.net>\n"
@@ -819,6 +819,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/gstreamer-1.0.pot b/po/gstreamer-1.0.pot
index 4e422ec..820ef92 100644
--- a/po/gstreamer-1.0.pot
+++ b/po/gstreamer-1.0.pot
@@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: gstreamer 1.6.2\n"
+"Project-Id-Version: gstreamer 1.7.1\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+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"
@@ -105,7 +105,7 @@
msgid "Show GStreamer Options"
msgstr ""
-#: gst/gst.c:884
+#: gst/gst.c:885
msgid "Unknown option"
msgstr ""
@@ -1004,16 +1004,24 @@
msgid "Midi note number of the audio track."
msgstr ""
-#: gst/gsttaglist.c:442
+#: gst/gsttaglist.c:406
+msgid "private-data"
+msgstr ""
+
+#: gst/gsttaglist.c:406
+msgid "Private data"
+msgstr ""
+
+#: gst/gsttaglist.c:446
msgid ", "
msgstr ""
-#: gst/gsturi.c:674
+#: gst/gsturi.c:655
#, c-format
msgid "No URI handler for the %s protocol found"
msgstr ""
-#: gst/gsturi.c:849
+#: gst/gsturi.c:830
#, c-format
msgid "URI scheme '%s' not supported"
msgstr ""
@@ -1107,22 +1115,22 @@
msgid "empty pipeline not allowed"
msgstr ""
-#: libs/gst/base/gstbasesink.c:2845
+#: libs/gst/base/gstbasesink.c:2853
msgid "A lot of buffers are being dropped."
msgstr ""
-#: libs/gst/base/gstbasesink.c:3373
+#: libs/gst/base/gstbasesink.c:3381
msgid "Internal data flow problem."
msgstr ""
-#: libs/gst/base/gstbasesink.c:4086
+#: libs/gst/base/gstbasesink.c:4094
msgid "Internal data stream error."
msgstr ""
-#: libs/gst/base/gstbasesink.c:4096 libs/gst/base/gstbasesrc.c:2942
-#: libs/gst/base/gstbasesrc.c:2951 plugins/elements/gstdownloadbuffer.c:1353
-#: plugins/elements/gstqueue.c:966 plugins/elements/gstqueue.c:1513
-#: plugins/elements/gstqueue2.c:2368 plugins/elements/gstqueue2.c:2844
+#: libs/gst/base/gstbasesink.c:4104 libs/gst/base/gstbasesrc.c:2942
+#: libs/gst/base/gstbasesrc.c:2951 plugins/elements/gstdownloadbuffer.c:1351
+#: plugins/elements/gstqueue.c:968 plugins/elements/gstqueue.c:1517
+#: plugins/elements/gstqueue2.c:2418 plugins/elements/gstqueue2.c:2894
msgid "Internal data flow error."
msgstr ""
@@ -1152,22 +1160,22 @@
msgid "Filter caps change behaviour"
msgstr ""
-#: plugins/elements/gstdownloadbuffer.c:924 plugins/elements/gstqueue2.c:1550
+#: plugins/elements/gstdownloadbuffer.c:922 plugins/elements/gstqueue2.c:1593
msgid "No Temp directory specified."
msgstr ""
-#: plugins/elements/gstdownloadbuffer.c:930 plugins/elements/gstqueue2.c:1556
+#: plugins/elements/gstdownloadbuffer.c:928 plugins/elements/gstqueue2.c:1599
#, c-format
msgid "Could not create temp file \"%s\"."
msgstr ""
-#: plugins/elements/gstdownloadbuffer.c:938 plugins/elements/gstfilesrc.c:529
-#: plugins/elements/gstqueue2.c:1564
+#: plugins/elements/gstdownloadbuffer.c:936 plugins/elements/gstfilesrc.c:529
+#: plugins/elements/gstqueue2.c:1607
#, c-format
msgid "Could not open file \"%s\" for reading."
msgstr ""
-#: plugins/elements/gstdownloadbuffer.c:1262 plugins/elements/gstqueue2.c:1970
+#: plugins/elements/gstdownloadbuffer.c:1260 plugins/elements/gstqueue2.c:2020
msgid "Error while writing to download file."
msgstr ""
@@ -1180,18 +1188,18 @@
msgid "Could not open file \"%s\" for writing."
msgstr ""
-#: plugins/elements/gstfilesink.c:463
+#: plugins/elements/gstfilesink.c:450
#, c-format
msgid "Error closing file \"%s\"."
msgstr ""
-#: plugins/elements/gstfilesink.c:627
+#: plugins/elements/gstfilesink.c:619
#, c-format
msgid "Error while seeking in file \"%s\"."
msgstr ""
-#: plugins/elements/gstfilesink.c:635 plugins/elements/gstfilesink.c:712
-#: plugins/elements/gstfilesink.c:747
+#: plugins/elements/gstfilesink.c:627 plugins/elements/gstfilesink.c:704
+#: plugins/elements/gstfilesink.c:739
#, c-format
msgid "Error while writing to file \"%s\"."
msgstr ""
@@ -1215,7 +1223,7 @@
msgid "File \"%s\" is a socket."
msgstr ""
-#: plugins/elements/gstidentity.c:641
+#: plugins/elements/gstidentity.c:660
msgid "Failed after iterations as requested."
msgstr ""
@@ -1316,15 +1324,15 @@
msgstr[0] ""
msgstr[1] ""
-#: tools/gst-inspect.c:1456
+#: tools/gst-inspect.c:1469
msgid "Print all elements"
msgstr ""
-#: tools/gst-inspect.c:1458
+#: tools/gst-inspect.c:1471
msgid "Print list of blacklisted files"
msgstr ""
-#: tools/gst-inspect.c:1460
+#: tools/gst-inspect.c:1473
msgid ""
"Print a machine-parsable list of features the specified plugin or all "
"plugins provide.\n"
@@ -1332,30 +1340,30 @@
"automatic plugin installation mechanisms"
msgstr ""
-#: tools/gst-inspect.c:1465
+#: tools/gst-inspect.c:1478
msgid "List the plugin contents"
msgstr ""
-#: tools/gst-inspect.c:1467
+#: tools/gst-inspect.c:1480
msgid "Check if the specified element or plugin exists"
msgstr ""
-#: tools/gst-inspect.c:1470
+#: tools/gst-inspect.c:1483
msgid ""
"When checking if an element or plugin exists, also check that its version is "
"at least the version specified"
msgstr ""
-#: tools/gst-inspect.c:1474
+#: tools/gst-inspect.c:1487
msgid "Print supported URI schemes, with the elements that implement them"
msgstr ""
-#: tools/gst-inspect.c:1617
+#: tools/gst-inspect.c:1632
#, c-format
msgid "Could not load plugin file: %s\n"
msgstr ""
-#: tools/gst-inspect.c:1622
+#: tools/gst-inspect.c:1637
#, c-format
msgid "No such element or plugin '%s'\n"
msgstr ""
@@ -1524,92 +1532,92 @@
msgid "Gather and print index statistics"
msgstr ""
-#: tools/gst-launch.c:1002
+#: tools/gst-launch.c:1004
#, c-format
msgid "ERROR: pipeline could not be constructed: %s.\n"
msgstr ""
-#: tools/gst-launch.c:1006
+#: tools/gst-launch.c:1008
msgid "ERROR: pipeline could not be constructed.\n"
msgstr ""
-#: tools/gst-launch.c:1010
+#: tools/gst-launch.c:1012
#, c-format
msgid "WARNING: erroneous pipeline: %s\n"
msgstr ""
-#: tools/gst-launch.c:1026
+#: tools/gst-launch.c:1028
msgid "ERROR: the 'pipeline' element wasn't found.\n"
msgstr ""
-#: tools/gst-launch.c:1057 tools/gst-launch.c:1158
+#: tools/gst-launch.c:1059 tools/gst-launch.c:1160
msgid "Setting pipeline to PAUSED ...\n"
msgstr ""
-#: tools/gst-launch.c:1062
+#: tools/gst-launch.c:1064
msgid "ERROR: Pipeline doesn't want to pause.\n"
msgstr ""
-#: tools/gst-launch.c:1067
+#: tools/gst-launch.c:1069
msgid "Pipeline is live and does not need PREROLL ...\n"
msgstr ""
-#: tools/gst-launch.c:1071
+#: tools/gst-launch.c:1073
msgid "Pipeline is PREROLLING ...\n"
msgstr ""
-#: tools/gst-launch.c:1074 tools/gst-launch.c:1088
+#: tools/gst-launch.c:1076 tools/gst-launch.c:1090
msgid "ERROR: pipeline doesn't want to preroll.\n"
msgstr ""
-#: tools/gst-launch.c:1081
+#: tools/gst-launch.c:1083
msgid "Pipeline is PREROLLED ...\n"
msgstr ""
-#: tools/gst-launch.c:1094
+#: tools/gst-launch.c:1096
msgid "Setting pipeline to PLAYING ...\n"
msgstr ""
-#: tools/gst-launch.c:1101
+#: tools/gst-launch.c:1103
msgid "ERROR: pipeline doesn't want to play.\n"
msgstr ""
-#: tools/gst-launch.c:1120
+#: tools/gst-launch.c:1122
msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
msgstr ""
-#: tools/gst-launch.c:1124
+#: tools/gst-launch.c:1126
msgid "EOS on shutdown enabled -- waiting for EOS after Error\n"
msgstr ""
-#: tools/gst-launch.c:1127
+#: tools/gst-launch.c:1129
msgid "Waiting for EOS...\n"
msgstr ""
-#: tools/gst-launch.c:1134
+#: tools/gst-launch.c:1136
msgid "EOS received - stopping pipeline...\n"
msgstr ""
-#: tools/gst-launch.c:1138
+#: tools/gst-launch.c:1140
msgid "Interrupt while waiting for EOS - stopping pipeline...\n"
msgstr ""
-#: tools/gst-launch.c:1143
+#: tools/gst-launch.c:1145
msgid "An error happened while waiting for EOS\n"
msgstr ""
-#: tools/gst-launch.c:1154
+#: tools/gst-launch.c:1156
msgid "Execution ended after %"
msgstr ""
-#: tools/gst-launch.c:1170
+#: tools/gst-launch.c:1172
msgid "Setting pipeline to READY ...\n"
msgstr ""
-#: tools/gst-launch.c:1182
+#: tools/gst-launch.c:1184
msgid "Setting pipeline to NULL ...\n"
msgstr ""
-#: tools/gst-launch.c:1186
+#: tools/gst-launch.c:1188
msgid "Freeing pipeline ...\n"
msgstr ""
diff --git a/po/hr.gmo b/po/hr.gmo
index eee439c..8083e18 100644
--- a/po/hr.gmo
+++ b/po/hr.gmo
Binary files differ
diff --git a/po/hr.po b/po/hr.po
index 2f19a43..61498e5 100644
--- a/po/hr.po
+++ b/po/hr.po
@@ -6,7 +6,7 @@
msgstr ""
"Project-Id-Version: gstreamer 0.10.32.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2012-05-25 16:47+0200\n"
"Last-Translator: Tomislav Krznar <tomislav.krznar@gmail.com>\n"
"Language-Team: Croatian <lokalizacija@linux.hr>\n"
@@ -813,6 +813,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/hu.gmo b/po/hu.gmo
index 87150d0..4a3890a 100644
--- a/po/hu.gmo
+++ b/po/hu.gmo
Binary files differ
diff --git a/po/hu.po b/po/hu.po
index 679dd29..b8abe90 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -8,7 +8,7 @@
msgstr ""
"Project-Id-Version: gstreamer 1.6.0\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2015-11-20 23:51+0100\n"
"Last-Translator: Balázs Úr <urbalazs@gmail.com>\n"
"Language-Team: Hungarian <translation-team-hu@lists.sourceforge.net>\n"
@@ -815,6 +815,12 @@
msgid "Midi note number of the audio track."
msgstr "A hangsáv midi hangjegy száma."
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/id.gmo b/po/id.gmo
index f0bfec2..f52bb72 100644
--- a/po/id.gmo
+++ b/po/id.gmo
Binary files differ
diff --git a/po/id.po b/po/id.po
index 4265713..c17246b 100644
--- a/po/id.po
+++ b/po/id.po
@@ -7,7 +7,7 @@
msgstr ""
"Project-Id-Version: gstreamer 1.3.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2014-05-31 22:06+0700\n"
"Last-Translator: Andhika Padmawan <andhika.padmawan@gmail.com>\n"
"Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n"
@@ -818,6 +818,12 @@
msgid "Midi note number of the audio track."
msgstr "Nomor catatan midi dari jalur audio."
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/it.gmo b/po/it.gmo
index 2681bf4..62fd5ca 100644
--- a/po/it.gmo
+++ b/po/it.gmo
Binary files differ
diff --git a/po/it.po b/po/it.po
index 0a14b1c..6fe8b58 100644
--- a/po/it.po
+++ b/po/it.po
@@ -106,7 +106,7 @@
msgstr ""
"Project-Id-Version: gstreamer 0.10.30.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+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"
@@ -973,6 +973,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/ja.gmo b/po/ja.gmo
index f078534..dacbdcd 100644
--- a/po/ja.gmo
+++ b/po/ja.gmo
Binary files differ
diff --git a/po/ja.po b/po/ja.po
index 712dc50..88e3883 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -6,7 +6,7 @@
msgstr ""
"Project-Id-Version: gstreamer 1.0.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2013-08-20 14:56+0900\n"
"Last-Translator: Makoto Kato <makoto.kt@gmail.com>\n"
"Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n"
@@ -784,6 +784,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/lt.gmo b/po/lt.gmo
index 1c63b4f..9ad6606 100644
--- a/po/lt.gmo
+++ b/po/lt.gmo
Binary files differ
diff --git a/po/lt.po b/po/lt.po
index 9038b98..39e3555 100644
--- a/po/lt.po
+++ b/po/lt.po
@@ -7,7 +7,7 @@
msgstr ""
"Project-Id-Version: gstreamer 0.10.29.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+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"
@@ -824,6 +824,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/nb.gmo b/po/nb.gmo
index 5f9ce3f..b21ce36 100644
--- a/po/nb.gmo
+++ b/po/nb.gmo
Binary files differ
diff --git a/po/nb.po b/po/nb.po
index 723ef10..a84abb0 100644
--- a/po/nb.po
+++ b/po/nb.po
@@ -1,20 +1,23 @@
# Norwegian bokmaal translation of gstreamer.
# This file is put in the public domain.
+#
# Kjartan Maraas <kmaraas@gnome.org>, 2004-2010.
+# Johnny A. Solbu <johnny@solbu.net>, 2015
#
msgid ""
msgstr ""
-"Project-Id-Version: gstreamer 0.10.30.3\n"
+"Project-Id-Version: gstreamer 1.6.0\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
-"PO-Revision-Date: 2010-10-24 21:36+0200\n"
-"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
+"PO-Revision-Date: 2015-12-23 02:02+0100\n"
+"Last-Translator: Johnny A. Solbu <johnny@solbu.net>\n"
"Language-Team: Norwegian Bokmaal <i18n-nb@lister.ping.uio.no>\n"
-"Language: \n"
+"Language: nb_NO\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.6.9\n"
msgid "Print the GStreamer version"
msgstr "Skriv ut versjonsnummer for GStreamer"
@@ -28,6 +31,8 @@
msgid ""
"Default debug level from 1 (only error) to 9 (anything) or 0 for no output"
msgstr ""
+"Standard feilsøkingsnivå fra 1 (kun feil) til 9 (noe) eller 0 for ingen "
+"utdata"
msgid "LEVEL"
msgstr "NIVÅ"
@@ -36,6 +41,8 @@
"Comma-separated list of category_name:level pairs to set specific levels for "
"the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
msgstr ""
+"Kommaseparert liste over kategori_navn:nivå par for å sette spesifikke "
+"nivåer for de enkelte kategoriene. eksempel: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
msgid "LIST"
msgstr "LISTE"
@@ -47,15 +54,17 @@
"Changes coloring mode of the debug log. Possible modes: off, on, disable, "
"auto, unix"
msgstr ""
+"Endrer fargemodus for feilsøking logg. Mulige moduser: av, på, deaktivere, "
+"auto, unix"
msgid "Disable debugging"
msgstr "Slå av feilsøking"
msgid "Enable verbose plugin loading diagnostics"
-msgstr ""
+msgstr "Aktiver utførlig diagnostikk ved lasting av programtillegg"
msgid "Colon-separated paths containing plugins"
-msgstr ""
+msgstr "Kolon-separerte stier som inneholder programtillegg"
msgid "PATHS"
msgstr "STIER"
@@ -64,18 +73,20 @@
"Comma-separated list of plugins to preload in addition to the list stored in "
"environment variable GST_PLUGIN_PATH"
msgstr ""
+"Kommaseparert liste av programtillegg til å forhåndslaste i tillegg til "
+"listen som er lagret i miljøvariabelen GST_PLUGIN_PATH"
msgid "PLUGINS"
msgstr "TILLEGG"
msgid "Disable trapping of segmentation faults during plugin loading"
-msgstr ""
+msgstr "Deaktiver fangst av segmenteringsfeil under programtillegglasting"
msgid "Disable updating the registry"
-msgstr ""
+msgstr "Deaktiver oppdatering av registeret"
msgid "Disable spawning a helper process while scanning the registry"
-msgstr ""
+msgstr "Deaktiver forgrening av hjelperprosess under scanning av registeret"
msgid "GStreamer Options"
msgstr "GStreamer-flagg"
@@ -87,54 +98,59 @@
msgstr "Ukjent flagg"
msgid "GStreamer encountered a general core library error."
-msgstr ""
+msgstr "GStreamer møtte en generell kjernebiblioteksfeil."
msgid ""
"GStreamer developers were too lazy to assign an error code to this error."
msgstr ""
+"GStreamerutviklerne var for lat til å tildele denne feilen en feilkode ."
msgid "Internal GStreamer error: code not implemented."
-msgstr ""
+msgstr "Intern GStreamerfeil: kode ikke implementert."
msgid ""
"GStreamer error: state change failed and some element failed to post a "
"proper error message with the reason for the failure."
msgstr ""
+"GStreamerfeil: statusendring mislyktes og noen element mislyktes i å legge "
+"inn en skikkelig feilmelding med årsaken til svikten."
msgid "Internal GStreamer error: pad problem."
-msgstr ""
+msgstr "Intern GStreamerfeil: utfyllingsproblem."
msgid "Internal GStreamer error: thread problem."
-msgstr ""
+msgstr "Intern GStreamerfeil: trådproblem."
msgid "GStreamer error: negotiation problem."
-msgstr ""
+msgstr "Intern GStreamerfeil: forhandlingsproblem."
msgid "Internal GStreamer error: event problem."
-msgstr ""
+msgstr "Intern GStreamerfeil: hendelsesproblem."
msgid "Internal GStreamer error: seek problem."
-msgstr ""
+msgstr "Intern GStreamerfeil: søkeproblem."
msgid "Internal GStreamer error: caps problem."
-msgstr ""
+msgstr "Intern GStreamerfeil: caps-problem."
msgid "Internal GStreamer error: tag problem."
-msgstr ""
+msgstr "Intern GStreamerfeil: Taggproblem."
msgid "Your GStreamer installation is missing a plug-in."
-msgstr ""
+msgstr "GStreamerinstallasjonen din mangler et programtillegg."
msgid "GStreamer error: clock problem."
-msgstr ""
+msgstr "Intern GStreamerfeil: klokkeproblem."
msgid ""
"This application is trying to use GStreamer functionality that has been "
"disabled."
msgstr ""
+"Dette programmet prøver å bruke GStreamerfunksjonalitet som har blitt "
+"deaktivert."
msgid "GStreamer encountered a general supporting library error."
-msgstr ""
+msgstr "GStreamer har møtt et generelt støttebiblioteksfeil."
msgid "Could not initialize supporting library."
msgstr "Kunne ikke initiere støttebibliotek."
@@ -149,7 +165,7 @@
msgstr "Feil i koding."
msgid "GStreamer encountered a general resource error."
-msgstr ""
+msgstr "GStreamer har møtt en generelt resursfeil."
msgid "Resource not found."
msgstr "Ressursen ble ikke funnet."
@@ -187,24 +203,25 @@
msgid "No space left on the resource."
msgstr "Ingen plass igjen på ressursen."
-#, fuzzy
msgid "Not authorized to access resource."
-msgstr "Ingen plass igjen på ressursen."
+msgstr "Ikke autorisert til å få tilgang til ressursen."
msgid "GStreamer encountered a general stream error."
-msgstr ""
+msgstr "GStreamer har møtt en generelt strømmefeil."
msgid "Element doesn't implement handling of this stream. Please file a bug."
msgstr ""
+"Element implementerer ikke håndtering av denne strømmen. Send inn en "
+"feilrapport."
msgid "Could not determine type of stream."
msgstr "Kunne ikke bestemme type strøm."
msgid "The stream is of a different type than handled by this element."
-msgstr ""
+msgstr "Strømmen er av en annen type enn det som håndteres av dette elementet."
msgid "There is no codec present that can handle the stream's type."
-msgstr ""
+msgstr "Det er ingen kodek til stede som kan håndtere strømmens type."
msgid "Could not decode stream."
msgstr "Kunne ikke dekode strøm."
@@ -228,6 +245,8 @@
"The stream is encrypted and can't be decrypted because no suitable key has "
"been supplied."
msgstr ""
+"Strømmen er kryptert og kan ikke dekrypteres fordi ingen passende nøkkel er "
+"oppgitt."
#, c-format
msgid "No error message for domain %s."
@@ -242,7 +261,7 @@
#, c-format
msgid "Error writing registry cache to %s: %s"
-msgstr ""
+msgstr "Kunne ikke skrive registerbuffer til %s: %s"
msgid "title"
msgstr "tittel"
@@ -251,7 +270,7 @@
msgstr "ofte brukt tittel"
msgid "title sortname"
-msgstr ""
+msgstr "tittelsorteringsstreng"
msgid "commonly used title for sorting purposes"
msgstr "ofte brukt tittel for sorteringsformål"
@@ -275,23 +294,22 @@
msgstr "album som inneholder disse dataene"
msgid "album sortname"
-msgstr ""
+msgstr "albumsorteringsstreng"
-#, fuzzy
msgid "album containing this data for sorting purposes"
-msgstr "album som inneholder disse dataene"
+msgstr "album som inneholder disse dataene for sorteringsformål"
msgid "album artist"
msgstr "albumartist"
msgid "The artist of the entire album, as it should be displayed"
-msgstr ""
+msgstr "Artisten av hele albumet, som det burde bli vist"
msgid "album artist sortname"
-msgstr ""
+msgstr "album-, artistsorteringsstreng"
msgid "The artist of the entire album, as it should be sorted"
-msgstr ""
+msgstr "Artisten av hele albumet, som det burde bli sortert"
msgid "date"
msgstr "dato"
@@ -302,10 +320,9 @@
msgid "datetime"
msgstr "datotid"
-#, fuzzy
msgid "date and time the data was created (as a GstDateTime structure)"
msgstr ""
-"dato for oppretting av dataene (kalenderdager i den Julianske kalenderen)"
+"dato og klokkeslett dataene ble opprettet (som et GstDateTime-struktur)"
msgid "genre"
msgstr "sjanger"
@@ -322,7 +339,6 @@
msgid "extended comment"
msgstr "utvidet kommentar"
-#, fuzzy
msgid "free text commenting the data in key=value or key[en]=comment form"
msgstr "fritekstkommentar som beskriver dataene"
@@ -336,19 +352,19 @@
msgstr "antall spor"
msgid "count of tracks inside collection this track belongs to"
-msgstr ""
+msgstr "telling av sporene inne i samlingen dette sporet tilhører"
msgid "disc number"
msgstr "platenummer"
msgid "disc number inside a collection"
-msgstr ""
+msgstr "disknummer inne i en samling"
msgid "disc count"
-msgstr ""
+msgstr "disktelling"
msgid "count of discs inside collection this disc belongs to"
-msgstr ""
+msgstr "telling av diskene i samlingen denne disken tilhører"
msgid "location"
msgstr "plassering"
@@ -357,12 +373,15 @@
"Origin of media as a URI (location, where the original of the file or stream "
"is hosted)"
msgstr ""
+"Opprinnelsen til mediet som en URI (plassering, hvor den originale fil eller "
+"strøm ligger)"
msgid "homepage"
msgstr "hjemmeside"
msgid "Homepage for this media (i.e. artist or movie homepage)"
msgstr ""
+"Hjemmesiden til dette mediet (dvs. hjemmesiden til artisten eller filmen)"
msgid "description"
msgstr "beskrivelse"
@@ -380,7 +399,7 @@
msgstr "ISRC"
msgid "International Standard Recording Code - see http://www.ifpi.org/isrc/"
-msgstr ""
+msgstr "International Standard Recording Code - se http://www.ifpi.org/isrc/"
msgid "organization"
msgstr "organisasjon"
@@ -394,16 +413,14 @@
msgid "copyright uri"
msgstr "lenke til informasjon om opphavsrett"
-#, fuzzy
msgid "URI to the copyright notice of the data"
-msgstr "melding om opphavsrett for data"
+msgstr "Lenke til melding om opphavsrett for data"
-#, fuzzy
msgid "encoded by"
-msgstr "koder"
+msgstr "kodet av"
msgid "name of the encoding person or organization"
-msgstr ""
+msgstr "Navnet på personen eller organisasjonen som kodet"
msgid "contact"
msgstr "kontakt"
@@ -420,9 +437,8 @@
msgid "license uri"
msgstr "lenke til lisens"
-#, fuzzy
msgid "URI to the license of the data"
-msgstr "lisens for data"
+msgstr "Lenke til lisensen for dataene"
msgid "performer"
msgstr "utøver"
@@ -440,51 +456,49 @@
msgstr "varighet"
msgid "length in GStreamer time units (nanoseconds)"
-msgstr ""
+msgstr "lengde i GStreamer tidsenheter (nanosekunder)"
msgid "codec"
msgstr "codec"
msgid "codec the data is stored in"
-msgstr ""
+msgstr "kodek dataene er lagret i"
msgid "video codec"
-msgstr ""
+msgstr "videokodek"
msgid "codec the video data is stored in"
-msgstr ""
+msgstr "kodek videodataene er lagret i"
msgid "audio codec"
msgstr "lydkodek"
msgid "codec the audio data is stored in"
-msgstr ""
+msgstr "kodek lyddataene er lagret i"
-#, fuzzy
msgid "subtitle codec"
-msgstr "lydkodek"
+msgstr "undertekstkodek"
msgid "codec the subtitle data is stored in"
-msgstr ""
+msgstr "kodek undertekstdataene er lagret i"
-#, fuzzy
msgid "container format"
-msgstr "kontaktinformasjon"
+msgstr "beholderformat"
msgid "container format the data is stored in"
-msgstr ""
+msgstr "beholderformatet dataene er lagret i"
msgid "bitrate"
msgstr "bitrate"
msgid "exact or average bitrate in bits/s"
-msgstr ""
+msgstr "eksakt eller gjennomsnittlig bitrate i bits/s"
msgid "nominal bitrate"
msgstr "nominell bitrate"
msgid "nominal bitrate in bits/s"
-msgstr ""
+msgstr "nominell bitrate i bits/s"
msgid "minimum bitrate"
msgstr "minste bitrate"
@@ -496,19 +510,19 @@
msgstr "maksimal bitrate"
msgid "maximum bitrate in bits/s"
-msgstr ""
+msgstr "maksimal bitrate i bits/s"
msgid "encoder"
msgstr "koder"
msgid "encoder used to encode this stream"
-msgstr ""
+msgstr "omkoder som skal brukes til å kode denne strømmen"
msgid "encoder version"
msgstr "versjon av koder"
msgid "version of the encoder used to encode this stream"
-msgstr ""
+msgstr "versjon av omkoderen som brukes til å kode denne strømmen"
msgid "serial"
msgstr "serienummer"
@@ -517,66 +531,65 @@
msgstr "serienummer for spor"
msgid "replaygain track gain"
-msgstr ""
+msgstr "avspillingsforsterkning sporforsterkning"
msgid "track gain in db"
-msgstr ""
+msgstr "sporforsterkning i db"
msgid "replaygain track peak"
-msgstr ""
+msgstr "avspillingsforsterkning sportmaksimum"
msgid "peak of the track"
-msgstr ""
+msgstr "sporets maksimum"
msgid "replaygain album gain"
-msgstr ""
+msgstr "avspillingsforsterkning albumforsterkning"
msgid "album gain in db"
-msgstr ""
+msgstr "albumforsterkning i db"
msgid "replaygain album peak"
-msgstr ""
+msgstr "avspillingsforsterkning albummaksimum"
msgid "peak of the album"
-msgstr ""
+msgstr "albumets maksimum"
msgid "replaygain reference level"
-msgstr ""
+msgstr "avspillingsforsterkning referansenivå"
msgid "reference level of track and album gain values"
-msgstr ""
+msgstr "referansenivå for spor- og albumforsterkningsverdier"
msgid "language code"
msgstr "språkkode"
msgid "language code for this stream, conforming to ISO-639-1 or ISO-639-2"
-msgstr ""
+msgstr "språkkoden for denne strømmen, i samsvar med ISO-639-1 eller ISO-639-2"
-#, fuzzy
msgid "language name"
-msgstr "språkkode"
+msgstr "språknavn"
msgid "freeform name of the language this stream is in"
-msgstr ""
+msgstr "friformnavnet på språket denne strømmen er i"
msgid "image"
msgstr "bilde"
msgid "image related to this stream"
-msgstr ""
+msgstr "bilde relatert til denne strømmen"
#. TRANSLATORS: 'preview image' = image that shows a preview of the full image
msgid "preview image"
-msgstr ""
+msgstr "forhåndsvis bilde"
msgid "preview image related to this stream"
-msgstr ""
+msgstr "forhåndsvis bilde relatert til denne strømmen"
msgid "attachment"
msgstr "vedlegg"
msgid "file attached to this stream"
-msgstr ""
+msgstr "fil vedlagt denne strømmen"
msgid "beats per minute"
msgstr "slag i minuttet"
@@ -590,138 +603,148 @@
msgid "comma separated keywords describing the content"
msgstr "kommaseparerte nøkkelord som beskriver innholdet"
-#, fuzzy
msgid "geo location name"
-msgstr "plassering"
+msgstr "geografisk stedsnavn"
msgid ""
"human readable descriptive location of where the media has been recorded or "
"produced"
msgstr ""
+"lesbar beskrivende plassering av hvor mediene har blitt innspilt eller "
+"produsert"
msgid "geo location latitude"
-msgstr ""
+msgstr "geografisk breddegrad"
msgid ""
"geo latitude location of where the media has been recorded or produced in "
"degrees according to WGS84 (zero at the equator, negative values for "
"southern latitudes)"
msgstr ""
+"geografisk breddegradplassering hvor mediene har vært innspilt eller "
+"produsert i grader i henhold til WGS84 (null ved ekvator, negative verdier "
+"for sydlige breddegrader)"
msgid "geo location longitude"
-msgstr ""
+msgstr "geografisk lengdegrad"
msgid ""
"geo longitude location of where the media has been recorded or produced in "
"degrees according to WGS84 (zero at the prime meridian in Greenwich/UK, "
"negative values for western longitudes)"
msgstr ""
+"geografisk lengdegradplassering hvor mediene har vært innspilt eller "
+"produsert i grader i henhold til WGS84 (null ved nullmeridianen i "
+"Greenwich / UK, negative verdier for vestlige lengdegrader)"
msgid "geo location elevation"
-msgstr ""
+msgstr "geografisk høyde"
msgid ""
"geo elevation of where the media has been recorded or produced in meters "
"according to WGS84 (zero is average sea level)"
msgstr ""
+"geografisk høyde i meter der mediene er innspilt eller produsert, i henhold "
+"til WGS84 (null er gjennomsnittlig havnivå)"
-#, fuzzy
msgid "geo location country"
-msgstr "plassering"
+msgstr "geografisk nasjon"
msgid "country (english name) where the media has been recorded or produced"
-msgstr ""
+msgstr "land (engelsk navn) der mediene er innspilt eller produsert"
-#, fuzzy
msgid "geo location city"
-msgstr "plassering"
+msgstr "geografisk by"
msgid "city (english name) where the media has been recorded or produced"
-msgstr ""
+msgstr "by (engelsk navn) der mediene er innspilt eller produsert"
-#, fuzzy
msgid "geo location sublocation"
-msgstr "plassering"
+msgstr "geografisk underlokasjon"
msgid ""
"a location within a city where the media has been produced or created (e.g. "
"the neighborhood)"
msgstr ""
+"et sted i en by hvor mediene har blitt produsert eller laget (f.eks "
+"nabolaget)"
-#, fuzzy
msgid "geo location horizontal error"
-msgstr "plassering"
+msgstr "geografisk plassering horisontalfeil"
msgid "expected error of the horizontal positioning measures (in meters)"
-msgstr ""
+msgstr "forventet feil i den horisontale posisjoneringsmål (i meter)"
-#, fuzzy
msgid "geo location movement speed"
-msgstr "plassering"
+msgstr "geografisk bevegelseshastighet"
msgid ""
"movement speed of the capturing device while performing the capture in m/s"
-msgstr ""
+msgstr "bevegelseshastigheten til opptaksenheten mens du utfører opptak i m/s"
-#, fuzzy
msgid "geo location movement direction"
-msgstr "plassering"
+msgstr "geografisk bevegelsesretning"
msgid ""
"indicates the movement direction of the device performing the capture of a "
"media. It is represented as degrees in floating point representation, 0 "
"means the geographic north, and increases clockwise"
msgstr ""
+"indikerer bevegelsesretningen av innretningen som utfører opptak av et "
+"medium. Det er representert som grader i flyttall-representasjon, 0 betyr "
+"geografisk nord og øker med klokken"
-#, fuzzy
msgid "geo location capture direction"
-msgstr "plassering"
+msgstr "geografisk opptaksretning"
msgid ""
"indicates the direction the device is pointing to when capturing a media. "
"It is represented as degrees in floating point representation, 0 means the "
"geographic north, and increases clockwise"
msgstr ""
+"indikerer i hvilken retning enheten peker når du tar opp et medie. Det er "
+"representert som grader i flyttall-representasjon, 0 betyr geografisk nord "
+"og øker med klokken"
#. TRANSLATORS: 'show name' = 'TV/radio/podcast show name' here
msgid "show name"
msgstr "navn på program"
msgid "Name of the tv/podcast/series show the media is from"
-msgstr ""
+msgstr "Navnet på serien tv- eller podcasten mediet stammer fra"
#. TRANSLATORS: 'show sortname' = 'TV/radio/podcast show name as used for sorting purposes' here
msgid "show sortname"
-msgstr ""
+msgstr "serie-sorteringsnavn"
msgid ""
"Name of the tv/podcast/series show the media is from, for sorting purposes"
msgstr ""
+"Navnet på serien tv- eller podcasten mediet stammer fra, for sorteringsformål"
msgid "episode number"
msgstr "episodenummer"
msgid "The episode number in the season the media is part of"
-msgstr ""
+msgstr "Episodenummeret i sesongen mediet er en del av"
msgid "season number"
msgstr "sesongnummer"
msgid "The season number of the show the media is part of"
-msgstr ""
+msgstr "Sesongnummeret i serien mediet er en del av"
msgid "lyrics"
msgstr "tekster"
msgid "The lyrics of the media, commonly used for songs"
-msgstr ""
+msgstr "Teksten til mediene, vanligvis brukt for sanger"
msgid "composer sortname"
-msgstr ""
+msgstr "komponist-sorteringsnavn"
-#, fuzzy
msgid "person(s) who composed the recording, for sorting purposes"
-msgstr "person(er) som er ansvarlige for opptaket"
+msgstr "person(er) som komponert opptaket, for sorteringsformål"
msgid "grouping"
msgstr "gruppering"
@@ -730,63 +753,71 @@
"Groups related media that spans multiple tracks, like the different pieces "
"of a concerto. It is a higher level than a track, but lower than an album"
msgstr ""
+"Grupperelaterte media som går over flere spor, som de forskjellige delene av "
+"en konsert. Det er et høyere nivå enn et spor, men lavere enn et album"
-#, fuzzy
msgid "user rating"
-msgstr "varighet"
+msgstr "brukerrangering"
msgid ""
"Rating attributed by a user. The higher the rank, the more the user likes "
"this media"
msgstr ""
+"Rating tilskrevet av en bruker. Jo høyere rang, jo mer liker brukeren dette "
+"mediet"
msgid "device manufacturer"
-msgstr ""
+msgstr "enhetsprodusent"
msgid "Manufacturer of the device used to create this media"
-msgstr ""
+msgstr "Produsenten av enheten som brukes til å lage dette mediet"
msgid "device model"
-msgstr ""
+msgstr "enhetsmodell"
msgid "Model of the device used to create this media"
-msgstr ""
+msgstr "Modell av enheten som brukes til å lage dette mediet"
-#, fuzzy
msgid "application name"
-msgstr "plassering"
+msgstr "Programnavn"
msgid "Application used to create the media"
-msgstr ""
+msgstr "Program brukt til å lage mediet"
msgid "application data"
-msgstr ""
+msgstr "Programdata"
msgid "Arbitrary application data to be serialized into the media"
-msgstr ""
+msgstr "Vilkårlige programdata som skal serialiseres i mediet"
msgid "image orientation"
-msgstr ""
+msgstr "bildeorientering"
msgid "How the image should be rotated or flipped before display"
-msgstr ""
+msgstr "Hvordan bildet skal roteres eller snus før visning"
msgid "publisher"
-msgstr ""
+msgstr "utgiver"
msgid "Name of the label or publisher"
-msgstr ""
+msgstr "Navnet på forlaget eller utgiveren"
msgid "interpreted-by"
-msgstr ""
+msgstr "tolket av"
msgid "Information about the people behind a remix and similar interpretations"
-msgstr ""
+msgstr "Informasjon om menneskene bak en remiks og lignende tolkninger"
msgid "midi-base-note"
-msgstr ""
+msgstr "midi-base-node"
msgid "Midi note number of the audio track."
+msgstr "Midi-nodenummer på lydsporet."
+
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
msgstr ""
msgid ", "
@@ -794,11 +825,11 @@
#, c-format
msgid "No URI handler for the %s protocol found"
-msgstr ""
+msgstr "Ingen URI-behandler for %s protokollen funnet"
#, c-format
msgid "URI scheme '%s' not supported"
-msgstr ""
+msgstr "URI-ordningen «%s» støttes ikke"
#, c-format
msgid "ERROR: from element %s: %s\n"
@@ -857,10 +888,10 @@
msgstr ""
msgid "syntax error"
-msgstr ""
+msgstr "Syntaksfeil"
msgid "bin"
-msgstr ""
+msgstr "bin"
#, c-format
msgid "specified empty bin \"%s\", not allowed"
@@ -916,9 +947,8 @@
msgid "Could not open file \"%s\" for reading."
msgstr "Kunne ikke åpne fil «%s» for lesing."
-#, fuzzy
msgid "Error while writing to download file."
-msgstr "Feil ved skriving til fil «%s»."
+msgstr ""
msgid "No file name specified for writing."
msgstr "Ingen filnavn oppgitt for skriving."
@@ -972,9 +1002,8 @@
msgid "force caps without doing a typefind"
msgstr ""
-#, fuzzy
msgid "Stream contains not enough data."
-msgstr "Strømmen inneholder ikke data."
+msgstr "Strømmen inneholder ikke nok data."
msgid "Stream contains no data."
msgstr "Strømmen inneholder ikke data."
@@ -1071,25 +1100,25 @@
msgid "Index statistics"
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Got message #%u from element \"%s\" (%s): "
-msgstr "FEIL: fra element %s: %s\n"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Got message #%u from pad \"%s:%s\" (%s): "
-msgstr "FEIL: fra element %s: %s\n"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Got message #%u from object \"%s\" (%s): "
-msgstr "FEIL: fra element %s: %s\n"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Got message #%u (%s): "
-msgstr "FEIL: fra element %s: %s\n"
+msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Got EOS from element \"%s\".\n"
-msgstr "FEIL: fra element %s: %s\n"
+msgstr ""
#, c-format
msgid "FOUND TAG : found by element \"%s\".\n"
@@ -1125,9 +1154,9 @@
"INFO:\n"
"%s\n"
-#, fuzzy, c-format
+#, c-format
msgid "WARNING: from element %s: %s\n"
-msgstr "FEIL: fra element %s: %s\n"
+msgstr "ADVARSEL: fra element %s: %s\n"
msgid "Prerolled, waiting for buffering to finish...\n"
msgstr ""
@@ -1158,13 +1187,13 @@
msgid "Progress: (%s) %s\n"
msgstr ""
-#, fuzzy, c-format
+#, c-format
msgid "Missing element: %s\n"
-msgstr "ingen element «%s»"
+msgstr "Mangler element: %s\n"
-#, fuzzy, c-format
+#, c-format
msgid "Got context from element '%s': %s=%s\n"
-msgstr "FEIL: fra element %s: %s\n"
+msgstr "Fikk sammenheng fra element «%s»: %s=%s\n"
msgid "Output tags (also known as metadata)"
msgstr ""
@@ -1269,5 +1298,8 @@
#~ msgid "TYPE1,TYPE2,..."
#~ msgstr "TYPE1,TYPE2,..."
+#~ msgid "maximum"
+#~ msgstr "maksimum"
+
#~ msgid "FILE"
#~ msgstr "FIL"
diff --git a/po/nl.gmo b/po/nl.gmo
index f8eb7b3..4460abb 100644
--- a/po/nl.gmo
+++ b/po/nl.gmo
Binary files differ
diff --git a/po/nl.po b/po/nl.po
index 7fbd028..b3735b7 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -10,7 +10,7 @@
msgstr ""
"Project-Id-Version: gstreamer 1.6.0\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2015-10-17 12:38+0200\n"
"Last-Translator: Freek de Kruijf <f.de.kruijf@gmail.com>\n"
"Language-Team: Dutch <vertaling@vrijschrift.org>\n"
@@ -827,6 +827,12 @@
msgid "Midi note number of the audio track."
msgstr "Midi notitienummer van de geluidstrack"
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/pl.gmo b/po/pl.gmo
index 6ba71e0..63dd1d9 100644
--- a/po/pl.gmo
+++ b/po/pl.gmo
Binary files differ
diff --git a/po/pl.po b/po/pl.po
index 48c0fca..a4c5807 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -6,7 +6,7 @@
msgstr ""
"Project-Id-Version: gstreamer 1.6.0\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2015-10-15 20:45+0200\n"
"Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n"
"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
@@ -820,6 +820,12 @@
msgid "Midi note number of the audio track."
msgstr "Numer dźwięku MIDI ścieżki dźwiękowej."
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo
index 8ec3164..e90f06f 100644
--- a/po/pt_BR.gmo
+++ b/po/pt_BR.gmo
Binary files differ
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 849c6a4..c2a03be 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -17,7 +17,7 @@
msgstr ""
"Project-Id-Version: gstreamer-1.2.1\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2013-12-29 18:20-0200\n"
"Last-Translator: Fabrício Godoy <skarllot@gmail.com>\n"
"Language-Team: Brazilian Portuguese <ldpbr-translation@lists.sourceforge."
@@ -835,6 +835,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/ro.gmo b/po/ro.gmo
index 847c059..c8f44eb 100644
--- a/po/ro.gmo
+++ b/po/ro.gmo
Binary files differ
diff --git a/po/ro.po b/po/ro.po
index 013aef17..e51d846 100644
--- a/po/ro.po
+++ b/po/ro.po
@@ -5,7 +5,7 @@
msgstr ""
"Project-Id-Version: gstreamer 0.10.29.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+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"
@@ -841,6 +841,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/ru.gmo b/po/ru.gmo
index c9f2931..8c13f8b 100644
--- a/po/ru.gmo
+++ b/po/ru.gmo
Binary files differ
diff --git a/po/ru.po b/po/ru.po
index 27f5a60..d7bb92a 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -9,7 +9,7 @@
msgstr ""
"Project-Id-Version: gstreamer 1.6.0\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2015-10-18 13:38+0300\n"
"Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n"
"Language-Team: Russian <gnu@d07.ru>\n"
@@ -819,6 +819,12 @@
msgid "Midi note number of the audio track."
msgstr "Номер ноты midi на аудио дорожке."
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/rw.gmo b/po/rw.gmo
index 754fed3..be23945 100644
--- a/po/rw.gmo
+++ b/po/rw.gmo
Binary files differ
diff --git a/po/rw.po b/po/rw.po
index 4841c2d..d04494f 100644
--- a/po/rw.po
+++ b/po/rw.po
@@ -15,7 +15,7 @@
msgstr ""
"Project-Id-Version: gstreamer 0.8.8\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+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"
@@ -984,6 +984,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/sk.gmo b/po/sk.gmo
index f844c0a..fe1df5b 100644
--- a/po/sk.gmo
+++ b/po/sk.gmo
Binary files differ
diff --git a/po/sk.po b/po/sk.po
index 18a6e4f..474e76a 100644
--- a/po/sk.po
+++ b/po/sk.po
@@ -8,7 +8,7 @@
msgstr ""
"Project-Id-Version: gstreamer 1.2.1\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2014-01-30 10:24+0100\n"
"Last-Translator: Peter Tuhársky <tuharsky@misbb.sk>\n"
"Language-Team: Slovak <sk-i18n@lists.linux.sk>\n"
@@ -820,6 +820,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/sl.gmo b/po/sl.gmo
index 2ccd09e..d5ffbb5 100644
--- a/po/sl.gmo
+++ b/po/sl.gmo
Binary files differ
diff --git a/po/sl.po b/po/sl.po
index 66ed8f2..eeb00df 100644
--- a/po/sl.po
+++ b/po/sl.po
@@ -10,7 +10,7 @@
msgstr ""
"Project-Id-Version: gstreamer-1.2.1\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2014-04-09 22:38+0100\n"
"Last-Translator: Klemen Košir <klemen913@gmail.com>\n"
"Language-Team: Slovenian <translation-team-sl@lists.sourceforge.net>\n"
@@ -816,6 +816,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/sq.gmo b/po/sq.gmo
index fbc97fe..53ead54 100644
--- a/po/sq.gmo
+++ b/po/sq.gmo
Binary files differ
diff --git a/po/sq.po b/po/sq.po
index d5c3aaa..1db061f 100644
--- a/po/sq.po
+++ b/po/sq.po
@@ -6,7 +6,7 @@
msgstr ""
"Project-Id-Version: gstreamer 0.8.4\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+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"
@@ -837,6 +837,12 @@
msgid "Midi note number of the audio track."
msgstr ""
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/sr.gmo b/po/sr.gmo
index 32d670a..1fe9e32 100644
--- a/po/sr.gmo
+++ b/po/sr.gmo
Binary files differ
diff --git a/po/sr.po b/po/sr.po
index 06ab679..a2f3ced 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -7,7 +7,7 @@
msgstr ""
"Project-Id-Version: gstreamer-1.3.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2014-06-18 20:12+0200\n"
"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
"Language-Team: Serbian <(nothing)>\n"
@@ -818,6 +818,12 @@
msgid "Midi note number of the audio track."
msgstr "Број миди ноте звучне нумере."
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/sv.gmo b/po/sv.gmo
index eb27c93..fdfee55 100644
--- a/po/sv.gmo
+++ b/po/sv.gmo
Binary files differ
diff --git a/po/sv.po b/po/sv.po
index 2e08d3d..87551c7 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -9,7 +9,7 @@
msgstr ""
"Project-Id-Version: gstreamer 1.6.0\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2015-11-01 00:50+0100\n"
"Last-Translator: Sebastian Rasmussen <sebras@gmail.com>\n"
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
@@ -818,6 +818,12 @@
msgid "Midi note number of the audio track."
msgstr "Midi-not-nummer för ljudspåret."
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/tr.gmo b/po/tr.gmo
index e7a490a..208fa67 100644
--- a/po/tr.gmo
+++ b/po/tr.gmo
Binary files differ
diff --git a/po/tr.po b/po/tr.po
index 8362798..bba4365 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -7,7 +7,7 @@
msgstr ""
"Project-Id-Version: gstreamer 1.4.1\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2015-01-10 21:06+0100\n"
"Last-Translator: Volkan Gezer <volkangezer@gmail.com>\n"
"Language-Team: Turkish <gnu-tr-u12a@lists.sourceforge.net>\n"
@@ -806,6 +806,12 @@
msgid "Midi note number of the audio track."
msgstr "Ses kaydının midi notu numarası."
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/uk.gmo b/po/uk.gmo
index 008faad..b041fef 100644
--- a/po/uk.gmo
+++ b/po/uk.gmo
Binary files differ
diff --git a/po/uk.po b/po/uk.po
index 536d0d6..04712d3 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -8,7 +8,7 @@
msgstr ""
"Project-Id-Version: gstreamer 1.6.0\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2015-10-15 20:39+0300\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <translation-team-uk@lists.sourceforge.net>\n"
@@ -816,6 +816,12 @@
msgid "Midi note number of the audio track."
msgstr "Номер ноти MIDI звукової доріжки."
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/vi.gmo b/po/vi.gmo
index ab888ca..9d42c43 100644
--- a/po/vi.gmo
+++ b/po/vi.gmo
Binary files differ
diff --git a/po/vi.po b/po/vi.po
index bdd1874..dd05539 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -9,7 +9,7 @@
msgstr ""
"Project-Id-Version: gstreamer 1.6.0\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2015-10-16 08:03+0700\n"
"Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
"Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
@@ -820,6 +820,12 @@
msgid "Midi note number of the audio track."
msgstr "Số ghi chú midi của rãnh âm thanh."
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo
index 8d8aa64..f917259 100644
--- a/po/zh_CN.gmo
+++ b/po/zh_CN.gmo
Binary files differ
diff --git a/po/zh_CN.po b/po/zh_CN.po
index b993bb2..6c7b555 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -7,7 +7,7 @@
msgstr ""
"Project-Id-Version: gstreamer 1.6.0\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2015-10-16 19:25+0800\n"
"Last-Translator: Tianze Wang <zwpwjwtz@126.com>\n"
"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
@@ -785,6 +785,12 @@
msgid "Midi note number of the audio track."
msgstr "音频轨的midi注解编号"
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ", "
diff --git a/po/zh_TW.gmo b/po/zh_TW.gmo
index 433ed26..8749b66 100644
--- a/po/zh_TW.gmo
+++ b/po/zh_TW.gmo
Binary files differ
diff --git a/po/zh_TW.po b/po/zh_TW.po
index 809b13a..9397e01 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -27,7 +27,7 @@
msgstr ""
"Project-Id-Version: gstreamer 1.3.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 18:49+0100\n"
+"POT-Creation-Date: 2015-12-24 12:45+0100\n"
"PO-Revision-Date: 2014-06-08 00:22+0800\n"
"Last-Translator: Wen Liao <wen.cf83@gmail.com>\n"
"Language-Team: Chinese (traditional) <zh-l10n@linux.org.tw>\n"
@@ -810,6 +810,12 @@
msgid "Midi note number of the audio track."
msgstr "音軌Midi簡譜"
+msgid "private-data"
+msgstr ""
+
+msgid "Private data"
+msgstr ""
+
msgid ", "
msgstr ""
diff --git a/scripts/gst-uninstalled b/scripts/gst-uninstalled
index 648582a..5aa5531 100755
--- a/scripts/gst-uninstalled
+++ b/scripts/gst-uninstalled
@@ -107,6 +107,7 @@
DYLD_LIBRARY_PATH=$GST/gst-plugins-bad/gst-libs/gst/$path/.libs:$DYLD_LIBRARY_PATH
GI_TYPELIB_PATH=$GST/gst-plugins-bad/gst-libs/gst/$path:$GI_TYPELIB_PATH
done
+export GST_HAAR_CASCADES_PATH=$GST/gst-plugins-bad/ext/opencv/
# GStreamer core libraries
for path in base check controller net
@@ -168,6 +169,16 @@
:$GST/gst-editing-services/plugins/nle/.libs\
${GST_PLUGIN_PATH:+:$GST_PLUGIN_PATH}"
+export GST_PRESET_PATH="\
+$GST/gst-plugins-good/gst/equalizer/\
+:$GST/gst-plugins-good/gst/equalizer\
+:$GST/gst-plugins-good/ext/vpx/\
+:$GST/gst-plugins-ugly/ext/x264\
+:$GST/gst-plugins-ugly/ext/amrnb\
+:$GST/gst-plugins-bad/gst/freeverb\
+:$GST/gst-plugins-bad/ext/voamrwbenc\
+${GST_PRESET_PATH:+:$GST_PRESET_PATH}"
+
# don't use any system-installed plug-ins at all
export GST_PLUGIN_SYSTEM_PATH=
# set our registry somewhere else so we don't mess up the registry generated
@@ -176,6 +187,8 @@
export GST_REGISTRY=$GST/gstreamer/registry.dat
# Point at the uninstalled plugin scanner
export GST_PLUGIN_SCANNER=$GST/gstreamer/libs/gst/helpers/gst-plugin-scanner
+# Point at the uninstalled PTP helper
+export GST_PTP_HELPER=$GST/gstreamer/libs/gst/helpers/.libs/gst-ptp-helper
# once MANPATH is set, it needs at least an "empty"component to keep pulling
# in the system-configured man paths from man.config
diff --git a/tests/Makefile.in b/tests/Makefile.in
index cf4f293..02dc173 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -332,6 +332,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/benchmarks/Makefile.in b/tests/benchmarks/Makefile.in
index eec38dd..f09d503 100644
--- a/tests/benchmarks/Makefile.in
+++ b/tests/benchmarks/Makefile.in
@@ -372,6 +372,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/benchmarks/capsnego.c b/tests/benchmarks/capsnego.c
index e035ddc..dc60194 100644
--- a/tests/benchmarks/capsnego.c
+++ b/tests/benchmarks/capsnego.c
@@ -157,7 +157,7 @@
gst_message_parse_warning (msg, &err, &dbg);
GST_WARNING_OBJECT (GST_MESSAGE_SRC (msg), "%s (%s)", err->message,
(dbg ? dbg : "no details"));
- g_error_free (err);
+ g_clear_error (&err);
g_free (dbg);
break;
}
@@ -168,7 +168,7 @@
gst_message_parse_error (msg, &err, &dbg);
GST_ERROR_OBJECT (GST_MESSAGE_SRC (msg), "%s (%s)", err->message,
(dbg ? dbg : "no details"));
- g_error_free (err);
+ g_clear_error (&err);
g_free (dbg);
running = FALSE;
break;
@@ -218,6 +218,8 @@
g_option_context_add_group (ctx, gst_init_get_option_group ());
if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
g_print ("Error initializing: %s\n", GST_STR_NULL (err->message));
+ g_clear_error (&err);
+ g_option_context_free (ctx);
return 1;
}
g_option_context_free (ctx);
diff --git a/tests/check/Makefile.in b/tests/check/Makefile.in
index bbf784f..1c18760 100644
--- a/tests/check/Makefile.in
+++ b/tests/check/Makefile.in
@@ -1297,6 +1297,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
@@ -3657,7 +3659,7 @@
--show-possibly-lost=no \
--leak-resolution=high --num-callers=20 \
./$* 2>&1 | tee $$valgrind_log ; \
- if grep "==" $$valgrind_log > /dev/null 2>&1; then \
+ if grep "^==" $$valgrind_log > /dev/null 2>&1; then \
rm $$valgrind_log; \
exit 1; \
fi ; \
diff --git a/tests/check/elements/funnel.c b/tests/check/elements/funnel.c
index fa64a3a..af56d54 100644
--- a/tests/check/elements/funnel.c
+++ b/tests/check/elements/funnel.c
@@ -377,16 +377,16 @@
{
GstHarness *h0 = gst_harness_new_with_padnames ("funnel", "sink_0", "src");
GstHarness *h1 = gst_harness_new_with_element (h0->element, "sink_1", NULL);
- GstHarnessThread *state, *req, *push0, *push1;
- GstPadTemplate *templ = gst_element_class_get_pad_template (
- GST_ELEMENT_GET_CLASS (h0->element), "sink_%u");
+ GstHarnessThread *req, *push0, *push1;
+ GstPadTemplate *templ =
+ gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (h0->element),
+ "sink_%u");
GstCaps *caps = gst_caps_from_string ("testcaps");
GstBuffer *buf = gst_buffer_new ();
GstSegment segment;
gst_segment_init (&segment, GST_FORMAT_TIME);
- state = gst_harness_stress_statechange_start (h0);
req = gst_harness_stress_requestpad_start (h0, templ, NULL, NULL, TRUE);
push0 = gst_harness_stress_push_buffer_start (h0, caps, &segment, buf);
push1 = gst_harness_stress_push_buffer_start (h1, caps, &segment, buf);
@@ -400,7 +400,6 @@
gst_harness_stress_thread_stop (push1);
gst_harness_stress_thread_stop (push0);
gst_harness_stress_thread_stop (req);
- gst_harness_stress_thread_stop (state);
gst_harness_teardown (h1);
gst_harness_teardown (h0);
diff --git a/tests/check/elements/queue2.c b/tests/check/elements/queue2.c
index 18170c1..4970f03 100644
--- a/tests/check/elements/queue2.c
+++ b/tests/check/elements/queue2.c
@@ -269,6 +269,77 @@
GST_END_TEST;
+static gint overrun_count;
+
+static void
+queue_overrun (GstElement * queue, gpointer user_data)
+{
+ overrun_count++;
+ GST_DEBUG ("queue overrun %d", overrun_count);
+}
+
+static gpointer
+pull_buffer (GstPad * srcpad)
+{
+ GstBuffer *buffer = NULL;
+ gst_pad_get_range (srcpad, 0, 1024, &buffer);
+ gst_buffer_unref (buffer);
+ return NULL;
+}
+
+GST_START_TEST (test_overrun)
+{
+ GstElement *queue2;
+ GstBuffer *buffer;
+ GstPad *sinkpad, *srcpad;
+ GstSegment segment;
+ GThread *thread;
+
+ overrun_count = 0;
+ queue2 = gst_element_factory_make ("queue2", NULL);
+ sinkpad = gst_element_get_static_pad (queue2, "sink");
+ srcpad = gst_element_get_static_pad (queue2, "src");
+
+ g_signal_connect (queue2, "overrun", G_CALLBACK (queue_overrun), srcpad);
+ g_object_set (queue2, "ring-buffer-max-size", (guint64) 4 * 1024,
+ "use-buffering", FALSE,
+ "max-size-buffers", (guint) 0, "max-size-time", (guint64) 0,
+ "max-size-bytes", (guint) 4 * 1024, NULL);
+
+
+ gst_pad_activate_mode (srcpad, GST_PAD_MODE_PULL, TRUE);
+ gst_element_set_state (queue2, GST_STATE_PLAYING);
+
+ gst_segment_init (&segment, GST_FORMAT_BYTES);
+ gst_pad_send_event (sinkpad, gst_event_new_stream_start ("test"));
+ gst_pad_send_event (sinkpad, gst_event_new_segment (&segment));
+
+ /* Fill the queue */
+ buffer = gst_buffer_new_and_alloc (4 * 1024);
+ fail_unless (gst_pad_chain (sinkpad, buffer) == GST_FLOW_OK);
+
+
+ /* Make sure the queue doesn't remain full */
+ thread =
+ g_thread_try_new ("gst-check", (GThreadFunc) pull_buffer, srcpad, NULL);
+ fail_unless (thread != NULL);
+
+ /* Push a new buffer in the full queue, should trigger overrun */
+ buffer = gst_buffer_new_and_alloc (1024);
+ fail_unless (gst_pad_chain (sinkpad, buffer) == GST_FLOW_OK);
+ fail_unless (overrun_count == 1);
+
+ g_thread_join (thread);
+
+ gst_element_set_state (queue2, GST_STATE_NULL);
+
+ gst_object_unref (sinkpad);
+ gst_object_unref (srcpad);
+ gst_object_unref (queue2);
+}
+
+GST_END_TEST;
+
static Suite *
queue2_suite (void)
@@ -283,6 +354,7 @@
tcase_add_test (tc_chain, test_simple_shutdown_while_running);
tcase_add_test (tc_chain, test_simple_shutdown_while_running_ringbuffer);
tcase_add_test (tc_chain, test_filled_read);
+ tcase_add_test (tc_chain, test_overrun);
return s;
}
diff --git a/tests/check/gst/gstcontext.c b/tests/check/gst/gstcontext.c
index 5ba0cd2..63d8b79 100644
--- a/tests/check/gst/gstcontext.c
+++ b/tests/check/gst/gstcontext.c
@@ -75,6 +75,9 @@
{
if (strcmp (gst_context_get_context_type (context), "foobar") == 0)
((GstContextElement *) element)->have_foobar = TRUE;
+
+ GST_ELEMENT_CLASS (gst_context_element_parent_class)->set_context (element,
+ context);
}
static GstStateChangeReturn
@@ -91,9 +94,7 @@
if (celement->set_before_ready && !have_foobar)
return GST_STATE_CHANGE_FAILURE;
else if (celement->set_before_ready)
- return
- GST_ELEMENT_CLASS (gst_context_element_parent_class)->change_state
- (element, transition);
+ goto chain_up;
if (celement->set_from_need_context && have_foobar)
return GST_STATE_CHANGE_FAILURE;
@@ -109,9 +110,7 @@
if (celement->set_from_need_context && !have_foobar)
return GST_STATE_CHANGE_FAILURE;
else if (celement->set_from_need_context)
- return
- GST_ELEMENT_CLASS (gst_context_element_parent_class)->change_state
- (element, transition);
+ goto chain_up;
if (celement->create_self && have_foobar)
return GST_STATE_CHANGE_FAILURE;
@@ -125,11 +124,9 @@
gst_element_post_message (element, msg);
gst_context_unref (context);
}
- return
- GST_ELEMENT_CLASS (gst_context_element_parent_class)->change_state
- (element, transition);
}
+chain_up:
return
GST_ELEMENT_CLASS (gst_context_element_parent_class)->change_state
(element, transition);
@@ -321,6 +318,117 @@
GST_END_TEST;
+GST_START_TEST (test_add_element_to_bin)
+{
+ GstBus *bus;
+ GstElement *bin;
+ GstElement *element;
+ GList *contexts, *contexts2, *l;
+
+ /* Start with an element not inside a bin requesting a context. Add the
+ * element to a bin and check the context propagation. */
+ element = g_object_new (gst_context_element_get_type (), NULL);
+
+ ((GstContextElement *) element)->create_self = TRUE;
+
+ fail_unless (gst_element_set_state (element,
+ GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS);
+
+ fail_unless (((GstContextElement *) element)->have_foobar);
+
+ bin = gst_bin_new (NULL);
+
+ bus = gst_bus_new ();
+ gst_element_set_bus (bin, bus);
+
+ fail_unless (gst_element_set_state (bin,
+ GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS);
+
+ gst_bin_add (GST_BIN (bin), element);
+
+ /* check the contexts are the same */
+ contexts = gst_element_get_contexts (element);
+ contexts2 = gst_element_get_contexts (bin);
+ for (l = contexts; l; l = l->next)
+ fail_unless (g_list_find (contexts2, l->data));
+ g_list_free_full (contexts, (GDestroyNotify) gst_context_unref);
+ g_list_free_full (contexts2, (GDestroyNotify) gst_context_unref);
+
+ gst_element_set_bus (bin, NULL);
+ fail_unless (gst_element_set_state (bin,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS);
+
+ gst_object_unref (bus);
+ gst_object_unref (bin);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_add_element_to_bin_collision)
+{
+ GstBus *bus;
+ GstElement *bin;
+ GstElement *element, *element2;
+ GList *contexts, *contexts2, *l;
+
+ /* Start with a bin containing an element that requests a context and then add
+ * another element to the bin that has already requested the same context. */
+
+ bin = gst_bin_new (NULL);
+ element = g_object_new (gst_context_element_get_type (), NULL);
+ gst_bin_add (GST_BIN (bin), element);
+
+ ((GstContextElement *) element)->create_self = TRUE;
+
+ bus = gst_bus_new ();
+ gst_element_set_bus (bin, bus);
+
+ fail_unless (gst_element_set_state (bin,
+ GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS);
+
+ fail_unless (((GstContextElement *) element)->have_foobar);
+
+ /* propagate a context without a parent bin */
+ element2 = g_object_new (gst_context_element_get_type (), NULL);
+ ((GstContextElement *) element2)->create_self = TRUE;
+
+ fail_unless (gst_element_set_state (element2,
+ GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS);
+
+ fail_unless (((GstContextElement *) element2)->have_foobar);
+
+ ((GstContextElement *) element)->have_foobar = FALSE;
+ ((GstContextElement *) element2)->have_foobar = FALSE;
+
+ /* add element to bin should result in the propagation of contexts to the
+ * added element */
+ gst_bin_add (GST_BIN (bin), element2);
+
+ fail_unless (((GstContextElement *) element)->have_foobar == FALSE);
+ fail_unless (((GstContextElement *) element2)->have_foobar);
+
+ /* check the contexts are the same */
+ contexts = gst_element_get_contexts (element);
+ contexts2 = gst_element_get_contexts (element2);
+ for (l = contexts; l; l = l->next)
+ fail_unless (g_list_find (contexts2, l->data));
+ g_list_free_full (contexts, (GDestroyNotify) gst_context_unref);
+ contexts = gst_element_get_contexts (bin);
+ for (l = contexts; l; l = l->next)
+ fail_unless (g_list_find (contexts2, l->data));
+ g_list_free_full (contexts, (GDestroyNotify) gst_context_unref);
+ g_list_free_full (contexts2, (GDestroyNotify) gst_context_unref);
+
+ gst_element_set_bus (bin, NULL);
+ fail_unless (gst_element_set_state (bin,
+ GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS);
+
+ gst_object_unref (bus);
+ gst_object_unref (bin);
+}
+
+GST_END_TEST;
+
static Suite *
gst_context_suite (void)
{
@@ -335,6 +443,8 @@
tcase_add_test (tc_chain, test_element_set_from_need_context);
tcase_add_test (tc_chain, test_element_create_self);
tcase_add_test (tc_chain, test_element_bin_caching);
+ tcase_add_test (tc_chain, test_add_element_to_bin);
+ tcase_add_test (tc_chain, test_add_element_to_bin_collision);
return s;
}
diff --git a/tests/check/gst/gstpad.c b/tests/check/gst/gstpad.c
index f74318f..bb52088 100644
--- a/tests/check/gst/gstpad.c
+++ b/tests/check/gst/gstpad.c
@@ -1762,6 +1762,56 @@
GST_END_TEST;
+#define NUM_PROBES 4
+static guint count;
+
+static GstPadProbeReturn
+order_others_probe_cb (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
+{
+ *(guint *) (user_data) = ++count;
+
+ return GST_PAD_PROBE_REMOVE;
+}
+
+GST_START_TEST (test_pad_probe_call_order)
+{
+ GstFlowReturn flow;
+ GstPad *src, *sink;
+ guint counters[NUM_PROBES];
+ guint i;
+
+ src = gst_pad_new ("src", GST_PAD_SRC);
+ gst_pad_set_active (src, TRUE);
+ sink = gst_pad_new ("sink", GST_PAD_SINK);
+ gst_pad_set_chain_function (sink, gst_check_chain_func);
+ gst_pad_set_active (sink, TRUE);
+
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_stream_start ("test")) == TRUE);
+ fail_unless (gst_pad_push_event (src,
+ gst_event_new_segment (&dummy_segment)) == TRUE);
+
+ fail_unless_equals_int (gst_pad_link (src, sink), GST_PAD_LINK_OK);
+
+ for (i = 0; i < NUM_PROBES; i++) {
+ gst_pad_add_probe (src,
+ GST_PAD_PROBE_TYPE_BUFFER, order_others_probe_cb, &(counters[i]), NULL);
+ }
+
+ /* push a buffer so the events are propagated downstream */
+ flow = gst_pad_push (src, gst_buffer_new ());
+ fail_unless_equals_int (flow, GST_FLOW_OK);
+
+ for (i = 0; i < NUM_PROBES; i++) {
+ fail_unless (counters[i] == i + 1);
+ }
+
+ gst_object_unref (src);
+ gst_object_unref (sink);
+}
+
+GST_END_TEST;
+
static gboolean got_notify;
static void
@@ -2444,6 +2494,197 @@
GST_END_TEST;
+/* For proxy caps flag tests */
+
+typedef struct _GstProxyTestElement GstProxyTestElement;
+typedef struct _GstProxyTestElementClass GstProxyTestElementClass;
+
+struct _GstProxyTestElement
+{
+ GstElement element;
+};
+
+struct _GstProxyTestElementClass
+{
+ GstElementClass parent_class;
+};
+
+G_GNUC_INTERNAL GType gst_proxytestelement_get_type (void);
+
+static GstStaticPadTemplate proxytestelement_peer_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("test/proxy, option=(int)1"));
+
+static GstStaticPadTemplate proxytestelement_peer_incompatible_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("test/proxy-incompatible"));
+
+static GstStaticPadTemplate proxytestelement_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("test/proxy"));
+
+static GstStaticPadTemplate proxytestelement_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS_ANY);
+
+G_DEFINE_TYPE (GstProxyTestElement, gst_proxytestelement, GST_TYPE_ELEMENT);
+
+static void
+gst_proxytestelement_class_init (GstProxyTestElementClass * klass)
+{
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
+
+ gst_element_class_set_static_metadata (gstelement_class,
+ "Proxy Test Element", "Test", "Proxy test element",
+ "Thiago Santos <thiagoss@osg.samsung.com>");
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&proxytestelement_sink_template));
+}
+
+static void
+gst_proxytestelement_init (GstProxyTestElement * element)
+{
+ GstPad *sinkpad;
+ sinkpad =
+ gst_pad_new_from_static_template (&proxytestelement_sink_template,
+ "sink");
+ GST_PAD_SET_PROXY_CAPS (sinkpad);
+ gst_element_add_pad (GST_ELEMENT_CAST (element), sinkpad);
+}
+
+GST_START_TEST (test_proxy_accept_caps_no_proxy)
+{
+ GstElement *element;
+ GstPad *sinkpad;
+ GstCaps *caps;
+
+ gst_element_register (NULL, "proxytestelement", GST_RANK_NONE,
+ gst_proxytestelement_get_type ());
+ element = gst_element_factory_make ("proxytestelement", NULL);
+ sinkpad = gst_element_get_static_pad (element, "sink");
+
+ gst_element_set_state (element, GST_STATE_PLAYING);
+
+ caps = gst_caps_from_string ("test/proxy");
+ fail_unless (gst_pad_query_accept_caps (sinkpad, caps));
+ gst_caps_unref (caps);
+
+ caps = gst_caps_from_string ("test/bad");
+ fail_if (gst_pad_query_accept_caps (sinkpad, caps));
+ gst_caps_unref (caps);
+
+ gst_object_unref (sinkpad);
+ gst_element_set_state (element, GST_STATE_NULL);
+ gst_object_unref (element);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_proxy_accept_caps_with_proxy)
+{
+ GstElement *element;
+ GstPad *sinkpad, *srcpad;
+ GstPad *peerpad;
+ GstCaps *caps;
+
+ gst_element_register (NULL, "proxytestelement", GST_RANK_NONE,
+ gst_proxytestelement_get_type ());
+ element = gst_element_factory_make ("proxytestelement", NULL);
+
+ srcpad =
+ gst_pad_new_from_static_template (&proxytestelement_src_template, "src");
+ gst_element_add_pad (GST_ELEMENT_CAST (element), srcpad);
+
+ sinkpad = gst_element_get_static_pad (element, "sink");
+ srcpad = gst_element_get_static_pad (element, "src");
+
+ peerpad =
+ gst_pad_new_from_static_template (&proxytestelement_peer_template,
+ "sink");
+ fail_unless (gst_pad_link (srcpad, peerpad) == GST_PAD_LINK_OK);
+ gst_pad_set_active (peerpad, TRUE);
+
+ gst_element_set_state (element, GST_STATE_PLAYING);
+
+ caps = gst_caps_from_string ("test/bad");
+ fail_if (gst_pad_query_accept_caps (sinkpad, caps));
+ gst_caps_unref (caps);
+
+ caps = gst_caps_from_string ("test/proxy, option=(int)1");
+ fail_unless (gst_pad_query_accept_caps (sinkpad, caps));
+ gst_caps_unref (caps);
+
+ caps = gst_caps_from_string ("test/proxy, option=(int)2");
+ fail_if (gst_pad_query_accept_caps (sinkpad, caps));
+ gst_caps_unref (caps);
+
+ gst_object_unref (sinkpad);
+ gst_object_unref (srcpad);
+ gst_pad_set_active (peerpad, FALSE);
+ gst_object_unref (peerpad);
+ gst_element_set_state (element, GST_STATE_NULL);
+ gst_object_unref (element);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_proxy_accept_caps_with_incompatible_proxy)
+{
+ GstElement *element;
+ GstPad *sinkpad, *srcpad;
+ GstPad *peerpad;
+ GstCaps *caps;
+
+ gst_element_register (NULL, "proxytestelement", GST_RANK_NONE,
+ gst_proxytestelement_get_type ());
+ element = gst_element_factory_make ("proxytestelement", NULL);
+
+ srcpad =
+ gst_pad_new_from_static_template (&proxytestelement_src_template, "src");
+ gst_element_add_pad (GST_ELEMENT_CAST (element), srcpad);
+
+ sinkpad = gst_element_get_static_pad (element, "sink");
+ srcpad = gst_element_get_static_pad (element, "src");
+
+ peerpad =
+ gst_pad_new_from_static_template
+ (&proxytestelement_peer_incompatible_template, "sink");
+ fail_unless (gst_pad_link (srcpad, peerpad) == GST_PAD_LINK_OK);
+
+ gst_element_set_state (element, GST_STATE_PLAYING);
+
+ caps = gst_caps_from_string ("test/bad");
+ fail_if (gst_pad_query_accept_caps (sinkpad, caps));
+ gst_caps_unref (caps);
+
+ caps = gst_caps_from_string ("test/proxy");
+ fail_if (gst_pad_query_accept_caps (sinkpad, caps));
+ gst_caps_unref (caps);
+
+ caps = gst_caps_from_string ("test/proxy-incompatible");
+ fail_if (gst_pad_query_accept_caps (sinkpad, caps));
+ gst_caps_unref (caps);
+
+ gst_object_unref (sinkpad);
+ gst_object_unref (srcpad);
+ gst_pad_set_active (peerpad, FALSE);
+ gst_object_unref (peerpad);
+ gst_element_set_state (element, GST_STATE_NULL);
+ gst_object_unref (element);
+}
+
+GST_END_TEST;
+
static Suite *
gst_pad_suite (void)
{
@@ -2481,6 +2722,7 @@
tcase_add_test (tc_chain, test_pad_probe_block_add_remove);
tcase_add_test (tc_chain, test_pad_probe_block_and_drop_buffer);
tcase_add_test (tc_chain, test_pad_probe_flush_events);
+ tcase_add_test (tc_chain, test_pad_probe_call_order);
tcase_add_test (tc_chain, test_events_query_unlinked);
tcase_add_test (tc_chain, test_queue_src_caps_notify_linked);
tcase_add_test (tc_chain, test_queue_src_caps_notify_not_linked);
@@ -2494,6 +2736,9 @@
tcase_add_test (tc_chain, test_last_flow_return_push);
tcase_add_test (tc_chain, test_last_flow_return_pull);
tcase_add_test (tc_chain, test_flush_stop_inactive);
+ tcase_add_test (tc_chain, test_proxy_accept_caps_no_proxy);
+ tcase_add_test (tc_chain, test_proxy_accept_caps_with_proxy);
+ tcase_add_test (tc_chain, test_proxy_accept_caps_with_incompatible_proxy);
return s;
}
diff --git a/tests/check/gst/gstsegment.c b/tests/check/gst/gstsegment.c
index f0efd9f..f3433e8 100644
--- a/tests/check/gst/gstsegment.c
+++ b/tests/check/gst/gstsegment.c
@@ -22,20 +22,26 @@
#include <gst/check/gstcheck.h>
-static void
-check_times (GstSegment * segment, guint64 position, guint64 stream_time,
- guint64 running_time)
-{
- guint64 st, rt;
-
- st = gst_segment_to_stream_time (segment, segment->format, position);
- rt = gst_segment_to_running_time (segment, segment->format, position);
- GST_DEBUG ("position %" G_GUINT64_FORMAT ", st %" G_GUINT64_FORMAT ", rt %"
- G_GUINT64_FORMAT, position, stream_time, running_time);
-
- fail_unless_equals_int64 (st, stream_time);
- fail_unless_equals_int64 (rt, running_time);
-}
+#define check_times(segment, position, stream_time, running_time) G_STMT_START { \
+ guint64 st, rt, pos; \
+ \
+ st = gst_segment_to_stream_time ((segment), (segment)->format, (position)); \
+ rt = gst_segment_to_running_time ((segment), (segment)->format, (position)); \
+ GST_DEBUG ("position %" G_GUINT64_FORMAT ", st %" G_GUINT64_FORMAT ", rt %" \
+ G_GUINT64_FORMAT, (guint64) (position), (guint64) (stream_time), (guint64) (running_time)); \
+ \
+ fail_unless_equals_int64 (st, (stream_time)); \
+ fail_unless_equals_int64 (rt, (running_time)); \
+ if ((stream_time) != -1) { \
+ pos = gst_segment_position_from_stream_time ((segment), (segment)->format, st); \
+ fail_unless_equals_int64 (pos, (position)); \
+ } \
+ \
+ if ((running_time) != -1) { \
+ pos = gst_segment_position_from_running_time ((segment), (segment)->format, rt); \
+ fail_unless_equals_int64 (pos, (position)); \
+ } \
+} G_STMT_END;
/* mess with the segment structure in the bytes format */
GST_START_TEST (segment_seek_nosize)
@@ -749,7 +755,7 @@
GST_START_TEST (segment_full)
{
GstSegment segment;
- guint64 rt;
+ guint64 rt, pos;
gst_segment_init (&segment, GST_FORMAT_TIME);
@@ -764,9 +770,15 @@
fail_unless (gst_segment_to_running_time_full (&segment, GST_FORMAT_TIME,
50, &rt) == 1);
fail_unless (rt == 0);
+ fail_unless (gst_segment_position_from_running_time_full (&segment,
+ GST_FORMAT_TIME, rt, &pos) == 1);
+ fail_unless (pos == 50);
fail_unless (gst_segment_to_running_time_full (&segment, GST_FORMAT_TIME,
200, &rt) == 1);
fail_unless (rt == 150);
+ fail_unless (gst_segment_position_from_running_time_full (&segment,
+ GST_FORMAT_TIME, rt, &pos) == 1);
+ fail_unless (pos == 200);
fail_unless (!gst_segment_clip (&segment, GST_FORMAT_TIME, 40, 40, NULL,
NULL));
fail_unless (gst_segment_to_running_time_full (&segment, GST_FORMAT_TIME, 40,
@@ -779,6 +791,9 @@
NULL));
fail_unless (gst_segment_to_running_time_full (&segment, GST_FORMAT_TIME, 201,
&rt) == 1);
+ fail_unless (gst_segment_position_from_running_time_full (&segment,
+ GST_FORMAT_TIME, rt, &pos) == 1);
+ fail_unless (pos == 201);
fail_unless (gst_segment_offset_running_time (&segment, GST_FORMAT_TIME,
-50) == TRUE);
@@ -788,6 +803,99 @@
50, &rt) == -1);
GST_DEBUG ("%" G_GUINT64_FORMAT, rt);
fail_unless (rt == 50);
+
+ segment.start = 50;
+ segment.stop = 300;
+ segment.position = 150;
+ segment.time = 0;
+ segment.offset = 0;
+ gst_segment_set_running_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless_equals_int (segment.base, 100);
+ fail_unless (gst_segment_position_from_running_time_full (&segment,
+ GST_FORMAT_TIME, 70, &pos) == -1);
+ fail_unless (gst_segment_position_from_running_time_full (&segment,
+ GST_FORMAT_TIME, 140, &pos) == 1);
+ fail_unless_equals_int (pos, 190);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (segment_stream_time_full)
+{
+ GstSegment segment;
+ guint64 st, pos;
+
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+
+ segment.start = 50;
+ segment.stop = 200;
+ segment.time = 30;
+ segment.position = 0;
+
+ fail_unless (gst_segment_to_stream_time_full (&segment, GST_FORMAT_TIME,
+ 0, &st) == -1);
+ fail_unless_equals_int (st, 20);
+ fail_unless (gst_segment_to_stream_time_full (&segment, GST_FORMAT_TIME,
+ 20, &st) == 1);
+ fail_unless_equals_int (st, 0);
+ fail_unless (gst_segment_position_from_stream_time_full (&segment,
+ GST_FORMAT_TIME, 0, &pos) == 1);
+ fail_unless_equals_int (pos, 20);
+ fail_unless (gst_segment_to_stream_time_full (&segment, GST_FORMAT_TIME,
+ 10, &st) == -1);
+ fail_unless_equals_int (st, 10);
+ fail_unless (gst_segment_to_stream_time_full (&segment, GST_FORMAT_TIME,
+ 40, &st) == 1);
+ fail_unless_equals_int (st, 20);
+ fail_unless (gst_segment_position_from_stream_time_full (&segment,
+ GST_FORMAT_TIME, st, &pos) == 1);
+ fail_unless_equals_int (pos, 40);
+ segment.time = 100;
+ fail_unless (gst_segment_position_from_stream_time_full (&segment,
+ GST_FORMAT_TIME, 40, &pos) == -1);
+ fail_unless_equals_int (pos, 10);
+ fail_unless (gst_segment_position_from_stream_time_full (&segment,
+ GST_FORMAT_TIME, 60, &pos) == 1);
+ fail_unless_equals_int (pos, 10);
+
+ segment.start = 50;
+ segment.position = 150;
+ segment.stop = 200;
+ segment.time = 0;
+ segment.applied_rate = -1;
+ segment.rate = -1;
+
+ fail_unless (gst_segment_to_stream_time_full (&segment, GST_FORMAT_TIME,
+ 0, &st) == 1);
+ fail_unless_equals_int (st, 200);
+ fail_unless (gst_segment_position_from_stream_time_full (&segment,
+ GST_FORMAT_TIME, 200, &pos) == 1);
+ fail_unless_equals_int (pos, 0);
+ fail_unless (gst_segment_to_stream_time_full (&segment, GST_FORMAT_TIME,
+ 250, &st) == -1);
+ fail_unless_equals_int (st, 50);
+ fail_unless (gst_segment_position_from_stream_time_full (&segment,
+ GST_FORMAT_TIME, 200, &pos) == 1);
+ fail_unless_equals_int (pos, 0);
+ fail_unless (gst_segment_position_from_stream_time_full (&segment,
+ GST_FORMAT_TIME, 250, &pos) == -1);
+ fail_unless_equals_int (pos, 50);
+
+ segment.time = 70;
+ fail_unless (gst_segment_to_stream_time_full (&segment, GST_FORMAT_TIME,
+ 250, &st) == 1);
+ fail_unless_equals_int (st, 20);
+ fail_unless (gst_segment_position_from_stream_time_full (&segment,
+ GST_FORMAT_TIME, 50, &pos) == 1);
+ fail_unless_equals_int (pos, 220);
+ fail_unless (gst_segment_position_from_stream_time_full (&segment,
+ GST_FORMAT_TIME, 90, &pos) == 1);
+ fail_unless_equals_int (pos, 180);
+
+ segment.stop = 60;
+ fail_unless (gst_segment_position_from_stream_time_full (&segment,
+ GST_FORMAT_TIME, 5, &pos) == 1);
+ fail_unless_equals_int (pos, 125);
}
GST_END_TEST;
@@ -891,6 +999,7 @@
tcase_add_test (tc_chain, segment_full);
tcase_add_test (tc_chain, segment_negative_rate);
tcase_add_test (tc_chain, segment_negative_applied_rate);
+ tcase_add_test (tc_chain, segment_stream_time_full);
return s;
}
diff --git a/tests/check/gst/gstsystemclock.c b/tests/check/gst/gstsystemclock.c
index 86f012b..a8dbcca 100644
--- a/tests/check/gst/gstsystemclock.c
+++ b/tests/check/gst/gstsystemclock.c
@@ -670,6 +670,36 @@
GST_END_TEST;
+GST_START_TEST (test_resolution)
+{
+ GstClock *clock;
+ GstClockTime now_t, prev_t, resolution;
+ int i;
+
+ now_t = prev_t = GST_CLOCK_TIME_NONE;
+ clock = gst_system_clock_obtain ();
+ fail_unless (clock != NULL, "Could not create default system clock");
+ resolution = gst_clock_get_resolution (clock);
+ fail_unless (resolution != GST_CLOCK_TIME_NONE);
+
+ for (i = 0; i < 100000; ++i) {
+ now_t = gst_clock_get_internal_time (clock);
+ fail_unless (now_t != GST_CLOCK_TIME_NONE);
+ if (prev_t != GST_CLOCK_TIME_NONE) {
+ GstClockTime diff;
+ fail_unless (now_t >= prev_t);
+ diff = now_t - prev_t;
+ fail_unless (diff == 0 || diff >= resolution);
+ }
+ prev_t = now_t;
+ g_thread_yield ();
+ }
+ g_object_unref (clock);
+ clock = NULL;
+}
+
+GST_END_TEST;
+
static Suite *
gst_systemclock_suite (void)
{
@@ -688,6 +718,7 @@
tcase_add_test (tc_chain, test_mixed);
tcase_add_test (tc_chain, test_async_full);
tcase_add_test (tc_chain, test_set_default);
+ tcase_add_test (tc_chain, test_resolution);
return s;
}
diff --git a/tests/check/gst/gsturi.c b/tests/check/gst/gsturi.c
index d3656c9..e7ce6df 100644
--- a/tests/check/gst/gsturi.c
+++ b/tests/check/gst/gsturi.c
@@ -800,6 +800,20 @@
g_free (tmp_str);
gst_uri_unref (url2);
+ url2 = gst_uri_from_string_with_base (url1, "http://foobar.com/bla");
+ fail_unless_equals_string (gst_uri_get_scheme (url2), "http");
+ fail_unless_equals_string (gst_uri_get_host (url2), "foobar.com");
+ fail_unless (gst_uri_get_port (url2) == 0);
+ tmp_str = gst_uri_get_path (url2);
+ fail_unless_equals_string (tmp_str, "/bla");
+ g_free (tmp_str);
+ fail_unless (gst_uri_get_query_table (url2) == NULL);
+ fail_unless (gst_uri_get_fragment (url2) == NULL);
+ tmp_str = gst_uri_to_string (url2);
+ fail_unless_equals_string (tmp_str, "http://foobar.com/bla");
+ g_free (tmp_str);
+ gst_uri_unref (url2);
+
url2 = gst_uri_copy (url1);
fail_unless (gst_uri_equal (url1, url2));
gst_uri_set_query_value (url2, "key", "value");
diff --git a/tests/check/libs/struct_arm.h b/tests/check/libs/struct_arm.h
index 8c99bf2..21310de 100644
--- a/tests/check/libs/struct_arm.h
+++ b/tests/check/libs/struct_arm.h
@@ -22,7 +22,7 @@
{"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 152},
{"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 124},
{"GstLFOControlSource", sizeof (GstLFOControlSource), 120},
- {"GstControlPoint", sizeof (GstControlPoint), 32},
+ {"GstControlPoint", sizeof (GstControlPoint), 80},
{"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 124},
{"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 128},
{"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 140},
diff --git a/tests/check/libs/struct_hppa.h b/tests/check/libs/struct_hppa.h
index 484298e..9cdb923 100644
--- a/tests/check/libs/struct_hppa.h
+++ b/tests/check/libs/struct_hppa.h
@@ -22,7 +22,7 @@
{"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 240},
{"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 248},
{"GstLFOControlSource", sizeof (GstLFOControlSource), 184},
- {"GstControlPoint", sizeof (GstControlPoint), 32},
+ {"GstControlPoint", sizeof (GstControlPoint), 80},
{"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 248},
{"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 200},
{"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 280},
diff --git a/tests/check/libs/struct_i386.h b/tests/check/libs/struct_i386.h
index 3f1e938..fd13063 100644
--- a/tests/check/libs/struct_i386.h
+++ b/tests/check/libs/struct_i386.h
@@ -22,7 +22,7 @@
{"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 140},
{"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 124},
{"GstLFOControlSource", sizeof (GstLFOControlSource), 108},
- {"GstControlPoint", sizeof (GstControlPoint), 32},
+ {"GstControlPoint", sizeof (GstControlPoint), 80},
{"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 124},
{"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 120},
{"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 140},
diff --git a/tests/check/libs/struct_ppc32.h b/tests/check/libs/struct_ppc32.h
index 8c99bf2..21310de 100644
--- a/tests/check/libs/struct_ppc32.h
+++ b/tests/check/libs/struct_ppc32.h
@@ -22,7 +22,7 @@
{"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 152},
{"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 124},
{"GstLFOControlSource", sizeof (GstLFOControlSource), 120},
- {"GstControlPoint", sizeof (GstControlPoint), 32},
+ {"GstControlPoint", sizeof (GstControlPoint), 80},
{"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 124},
{"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 128},
{"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 140},
diff --git a/tests/check/libs/struct_ppc64.h b/tests/check/libs/struct_ppc64.h
index 484298e..9cdb923 100644
--- a/tests/check/libs/struct_ppc64.h
+++ b/tests/check/libs/struct_ppc64.h
@@ -22,7 +22,7 @@
{"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 240},
{"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 248},
{"GstLFOControlSource", sizeof (GstLFOControlSource), 184},
- {"GstControlPoint", sizeof (GstControlPoint), 32},
+ {"GstControlPoint", sizeof (GstControlPoint), 80},
{"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 248},
{"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 200},
{"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 280},
diff --git a/tests/check/libs/struct_sparc.h b/tests/check/libs/struct_sparc.h
index 484298e..9cdb923 100644
--- a/tests/check/libs/struct_sparc.h
+++ b/tests/check/libs/struct_sparc.h
@@ -22,7 +22,7 @@
{"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 240},
{"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 248},
{"GstLFOControlSource", sizeof (GstLFOControlSource), 184},
- {"GstControlPoint", sizeof (GstControlPoint), 32},
+ {"GstControlPoint", sizeof (GstControlPoint), 80},
{"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 248},
{"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 200},
{"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 280},
diff --git a/tests/check/libs/struct_x86_64.h b/tests/check/libs/struct_x86_64.h
index 484298e..9cdb923 100644
--- a/tests/check/libs/struct_x86_64.h
+++ b/tests/check/libs/struct_x86_64.h
@@ -22,7 +22,7 @@
{"GstInterpolationControlSource", sizeof (GstInterpolationControlSource), 240},
{"GstLFOControlSourceClass", sizeof (GstLFOControlSourceClass), 248},
{"GstLFOControlSource", sizeof (GstLFOControlSource), 184},
- {"GstControlPoint", sizeof (GstControlPoint), 32},
+ {"GstControlPoint", sizeof (GstControlPoint), 80},
{"GstTimedValueControlSourceClass", sizeof (GstTimedValueControlSourceClass), 248},
{"GstTimedValueControlSource", sizeof (GstTimedValueControlSource), 200},
{"GstTriggerControlSourceClass", sizeof (GstTriggerControlSourceClass), 280},
diff --git a/tests/examples/Makefile.in b/tests/examples/Makefile.in
index 5c47f83..4fffe09 100644
--- a/tests/examples/Makefile.in
+++ b/tests/examples/Makefile.in
@@ -338,6 +338,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/examples/adapter/Makefile.in b/tests/examples/adapter/Makefile.in
index e074dc4..318169c 100644
--- a/tests/examples/adapter/Makefile.in
+++ b/tests/examples/adapter/Makefile.in
@@ -328,6 +328,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/examples/controller/Makefile.am b/tests/examples/controller/Makefile.am
index 6ead70c..146416c 100644
--- a/tests/examples/controller/Makefile.am
+++ b/tests/examples/controller/Makefile.am
@@ -5,3 +5,13 @@
LDADD = \
$(top_builddir)/libs/gst/controller/libgstcontroller-@GST_API_VERSION@.la \
$(GST_OBJ_LIBS)
+
+if HAVE_GTK
+noinst_PROGRAMS += controller-graph
+
+controller_graph_CFLAGS = $(GST_OBJ_CFLAGS) $(GTK_CFLAGS)
+controller_graph_LDADD = \
+ $(top_builddir)/libs/gst/controller/libgstcontroller-@GST_API_VERSION@.la \
+ $(GST_OBJ_LIBS) $(GTK_LIBS)
+
+endif
\ No newline at end of file
diff --git a/tests/examples/controller/Makefile.in b/tests/examples/controller/Makefile.in
index d17e8ed..c2781db 100644
--- a/tests/examples/controller/Makefile.in
+++ b/tests/examples/controller/Makefile.in
@@ -90,7 +90,9 @@
host_triplet = @host@
target_triplet = @target@
noinst_PROGRAMS = audio-example$(EXEEXT) control-sources$(EXEEXT) \
- text-color-example$(EXEEXT) absolute-example$(EXEEXT)
+ text-color-example$(EXEEXT) absolute-example$(EXEEXT) \
+ $(am__EXEEXT_1)
+@HAVE_GTK_TRUE@am__append_1 = controller-graph
subdir = tests/examples/controller
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
@@ -136,6 +138,7 @@
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
+@HAVE_GTK_TRUE@am__EXEEXT_1 = controller-graph$(EXEEXT)
PROGRAMS = $(noinst_PROGRAMS)
absolute_example_SOURCES = absolute-example.c
absolute_example_OBJECTS = absolute-example.$(OBJEXT)
@@ -157,6 +160,15 @@
control_sources_LDADD = $(LDADD)
control_sources_DEPENDENCIES = $(top_builddir)/libs/gst/controller/libgstcontroller-@GST_API_VERSION@.la \
$(am__DEPENDENCIES_1)
+controller_graph_SOURCES = controller-graph.c
+controller_graph_OBJECTS = \
+ controller_graph-controller-graph.$(OBJEXT)
+@HAVE_GTK_TRUE@controller_graph_DEPENDENCIES = $(top_builddir)/libs/gst/controller/libgstcontroller-@GST_API_VERSION@.la \
+@HAVE_GTK_TRUE@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+controller_graph_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(controller_graph_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
text_color_example_SOURCES = text-color-example.c
text_color_example_OBJECTS = text-color-example.$(OBJEXT)
text_color_example_LDADD = $(LDADD)
@@ -197,9 +209,9 @@
am__v_CCLD_0 = @echo " CCLD " $@;
am__v_CCLD_1 =
SOURCES = absolute-example.c audio-example.c control-sources.c \
- text-color-example.c
+ controller-graph.c text-color-example.c
DIST_SOURCES = absolute-example.c audio-example.c control-sources.c \
- text-color-example.c
+ controller-graph.c text-color-example.c
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
@@ -344,6 +356,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
@@ -519,6 +533,11 @@
$(top_builddir)/libs/gst/controller/libgstcontroller-@GST_API_VERSION@.la \
$(GST_OBJ_LIBS)
+@HAVE_GTK_TRUE@controller_graph_CFLAGS = $(GST_OBJ_CFLAGS) $(GTK_CFLAGS)
+@HAVE_GTK_TRUE@controller_graph_LDADD = \
+@HAVE_GTK_TRUE@ $(top_builddir)/libs/gst/controller/libgstcontroller-@GST_API_VERSION@.la \
+@HAVE_GTK_TRUE@ $(GST_OBJ_LIBS) $(GTK_LIBS)
+
all: all-am
.SUFFIXES:
@@ -574,6 +593,10 @@
@rm -f control-sources$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(control_sources_OBJECTS) $(control_sources_LDADD) $(LIBS)
+controller-graph$(EXEEXT): $(controller_graph_OBJECTS) $(controller_graph_DEPENDENCIES) $(EXTRA_controller_graph_DEPENDENCIES)
+ @rm -f controller-graph$(EXEEXT)
+ $(AM_V_CCLD)$(controller_graph_LINK) $(controller_graph_OBJECTS) $(controller_graph_LDADD) $(LIBS)
+
text-color-example$(EXEEXT): $(text_color_example_OBJECTS) $(text_color_example_DEPENDENCIES) $(EXTRA_text_color_example_DEPENDENCIES)
@rm -f text-color-example$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(text_color_example_OBJECTS) $(text_color_example_LDADD) $(LIBS)
@@ -587,6 +610,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/absolute-example.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audio-example.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/control-sources.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/controller_graph-controller-graph.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/text-color-example.Po@am__quote@
.c.o:
@@ -613,6 +637,20 @@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+controller_graph-controller-graph.o: controller-graph.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(controller_graph_CFLAGS) $(CFLAGS) -MT controller_graph-controller-graph.o -MD -MP -MF $(DEPDIR)/controller_graph-controller-graph.Tpo -c -o controller_graph-controller-graph.o `test -f 'controller-graph.c' || echo '$(srcdir)/'`controller-graph.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/controller_graph-controller-graph.Tpo $(DEPDIR)/controller_graph-controller-graph.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='controller-graph.c' object='controller_graph-controller-graph.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) $(controller_graph_CFLAGS) $(CFLAGS) -c -o controller_graph-controller-graph.o `test -f 'controller-graph.c' || echo '$(srcdir)/'`controller-graph.c
+
+controller_graph-controller-graph.obj: controller-graph.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(controller_graph_CFLAGS) $(CFLAGS) -MT controller_graph-controller-graph.obj -MD -MP -MF $(DEPDIR)/controller_graph-controller-graph.Tpo -c -o controller_graph-controller-graph.obj `if test -f 'controller-graph.c'; then $(CYGPATH_W) 'controller-graph.c'; else $(CYGPATH_W) '$(srcdir)/controller-graph.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/controller_graph-controller-graph.Tpo $(DEPDIR)/controller_graph-controller-graph.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='controller-graph.c' object='controller_graph-controller-graph.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) $(controller_graph_CFLAGS) $(CFLAGS) -c -o controller_graph-controller-graph.obj `if test -f 'controller-graph.c'; then $(CYGPATH_W) 'controller-graph.c'; else $(CYGPATH_W) '$(srcdir)/controller-graph.c'; fi`
+
mostlyclean-libtool:
-rm -f *.lo
diff --git a/tests/examples/controller/controller-graph.c b/tests/examples/controller/controller-graph.c
new file mode 100644
index 0000000..ef90a27
--- /dev/null
+++ b/tests/examples/controller/controller-graph.c
@@ -0,0 +1,185 @@
+/* GStreamer
+ * Copyright (C) <2015> Stefan Sauer <ensonic@users.sf.net>
+ *
+ * controller-graph: explore interpolation types
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <math.h>
+
+#include <glib.h>
+#include <gtk/gtk.h>
+
+#include <gst/gst.h>
+#include <gst/controller/gstinterpolationcontrolsource.h>
+
+GtkWidget *graph;
+GstControlSource *cs = NULL;
+gdouble yval[] = { 0.0, 0.2, 0.8, 0.1, 0.1, 1.0 };
+
+static gboolean
+on_graph_draw (GtkWidget * widget, cairo_t * cr, gpointer user_data)
+{
+ GtkStyleContext *style = gtk_widget_get_style_context (widget);
+ GtkAllocation alloc;
+ gint x, y, w, h;
+ gdouble *data;
+ guint64 ts, ts_step;
+ gint i;
+ GstTimedValueControlSource *tvcs = (GstTimedValueControlSource *) cs;
+
+ gtk_widget_get_allocation (widget, &alloc);
+ w = alloc.width;
+ h = alloc.height;
+ gtk_render_background (style, cr, 0, 0, w, h);
+ // add some border:
+ x = 5;
+ y = 5;
+ w -= (x + x);
+ h -= (y + y);
+
+ // build graph
+ ts = G_GUINT64_CONSTANT (0);
+ ts_step = w / (G_N_ELEMENTS (yval) - 1);
+ gst_timed_value_control_source_unset_all (tvcs);
+ for (i = 0; i < G_N_ELEMENTS (yval); i++) {
+ gst_timed_value_control_source_set (tvcs, ts, yval[i]);
+ ts += ts_step;
+ }
+ data = g_new (gdouble, w);
+ gst_control_source_get_value_array (cs, 0, 1, w, data);
+
+ // draw background
+ cairo_set_source_rgb (cr, 0.5, 0.5, 0.5);
+ cairo_rectangle (cr, x, y, w, h);
+ cairo_stroke_preserve (cr);
+ cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
+ cairo_fill (cr);
+
+
+ // plot graph
+ cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+ cairo_set_line_width (cr, 1.0);
+ cairo_move_to (cr, x, y + data[0] * h);
+ for (i = 1; i < w; i++) {
+ cairo_line_to (cr, x + i, y + CLAMP (data[i], 0.0, 1.0) * h);
+ }
+ cairo_stroke (cr);
+
+ // plot control points
+ ts = G_GUINT64_CONSTANT (0);
+ for (i = 0; i < G_N_ELEMENTS (yval); i++) {
+ cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+ cairo_arc (cr, x + ts, y + yval[i] * h, 3.0, 0.0, 2 * M_PI);
+ cairo_stroke_preserve (cr);
+ cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
+ cairo_fill (cr);
+ ts += ts_step;
+ }
+
+ g_free (data);
+
+ return TRUE;
+}
+
+static void
+on_mode_changed (GtkComboBox * combo, gpointer user_data)
+{
+ g_object_set (cs, "mode", gtk_combo_box_get_active (combo), NULL);
+ gtk_widget_queue_draw (graph);
+}
+
+static void
+on_yval_changed (GtkSpinButton * spin, gpointer user_data)
+{
+ guint ix = GPOINTER_TO_UINT (user_data);
+ yval[ix] = gtk_spin_button_get_value (spin);
+ gtk_widget_queue_draw (graph);
+}
+
+int
+main (int argc, char **argv)
+{
+ GtkWidget *window;
+ GtkWidget *layout, *label, *combo, *box, *spin;
+ GEnumClass *enum_class;
+ GEnumValue *enum_value;
+ gint i;
+
+ gst_init (&argc, &argv);
+ gtk_init (&argc, &argv);
+
+ cs = gst_interpolation_control_source_new ();
+ g_object_set (cs, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL);
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ g_signal_connect (G_OBJECT (window), "delete-event", gtk_main_quit, NULL);
+ gtk_window_set_default_size (GTK_WINDOW (window), 320, 240);
+ gtk_window_set_title (GTK_WINDOW (window),
+ "GstInterpolationControlSource demo");
+
+ layout = gtk_grid_new ();
+
+ graph = gtk_drawing_area_new ();
+ gtk_widget_add_events (graph, GDK_POINTER_MOTION_MASK);
+ g_signal_connect (graph, "draw", G_CALLBACK (on_graph_draw), NULL);
+ g_object_set (graph, "hexpand", TRUE, "vexpand", TRUE, "margin-bottom", 3,
+ NULL);
+ gtk_grid_attach (GTK_GRID (layout), graph, 0, 0, 2, 1);
+
+ // add controls to move the yvals
+ box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
+ g_object_set (box, "homogeneous", TRUE, "margin-bottom", 3, NULL);
+ for (i = 0; i < G_N_ELEMENTS (yval); i++) {
+ spin = gtk_spin_button_new_with_range (0.0, 1.0, 0.05);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), yval[i]);
+ g_signal_connect (spin, "changed", G_CALLBACK (on_yval_changed),
+ GUINT_TO_POINTER (i));
+ gtk_container_add (GTK_CONTAINER (box), spin);
+ }
+ gtk_grid_attach (GTK_GRID (layout), box, 0, 1, 2, 1);
+
+ // combo for interpolation modes
+ label = gtk_label_new ("interpolation mode");
+ gtk_grid_attach (GTK_GRID (layout), label, 0, 2, 1, 1);
+
+ combo = gtk_combo_box_text_new ();
+ enum_class = g_type_class_ref (GST_TYPE_INTERPOLATION_MODE);
+ for (i = enum_class->minimum; i <= enum_class->maximum; i++) {
+ if ((enum_value = g_enum_get_value (enum_class, i))) {
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo),
+ enum_value->value_nick);
+ }
+ }
+ gtk_combo_box_set_active (GTK_COMBO_BOX (combo),
+ GST_INTERPOLATION_MODE_LINEAR);
+ g_signal_connect (combo, "changed", G_CALLBACK (on_mode_changed), NULL);
+ g_object_set (combo, "hexpand", TRUE, "margin-left", 3, NULL);
+ gtk_grid_attach (GTK_GRID (layout), combo, 1, 2, 1, 1);
+
+ gtk_container_set_border_width (GTK_CONTAINER (window), 6);
+ gtk_container_add (GTK_CONTAINER (window), layout);
+ gtk_widget_show_all (window);
+
+ gtk_main ();
+
+ return 0;
+}
diff --git a/tests/examples/helloworld/Makefile.in b/tests/examples/helloworld/Makefile.in
index ceb1ba1..bc83a6c 100644
--- a/tests/examples/helloworld/Makefile.in
+++ b/tests/examples/helloworld/Makefile.in
@@ -327,6 +327,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/examples/manual/Makefile.am b/tests/examples/manual/Makefile.am
index 0e4da6b..42ae9e5 100644
--- a/tests/examples/manual/Makefile.am
+++ b/tests/examples/manual/Makefile.am
@@ -14,9 +14,9 @@
AM_TESTS_ENVIRONMENT = \
$(REGISTRY_ENVIRONMENT) \
- GST_PLUGIN_SCANNER=$(top_builddir)/libs/gst/helpers/gst-plugin-scanner \
- GST_PLUGIN_SYSTEM_PATH= \
- GST_PLUGIN_PATH=$(top_builddir)/plugins
+ GST_PLUGIN_SCANNER_1_0=$(top_builddir)/libs/gst/helpers/gst-plugin-scanner \
+ GST_PLUGIN_SYSTEM_PATH_1_0= \
+ GST_PLUGIN_PATH_1_0=$(top_builddir)/plugins
EXTRA_DIST = extract.pl
diff --git a/tests/examples/manual/Makefile.in b/tests/examples/manual/Makefile.in
index 16e7b1b..7e9a67b 100644
--- a/tests/examples/manual/Makefile.in
+++ b/tests/examples/manual/Makefile.in
@@ -688,6 +688,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
@@ -873,9 +875,9 @@
AM_TESTS_ENVIRONMENT = \
$(REGISTRY_ENVIRONMENT) \
- GST_PLUGIN_SCANNER=$(top_builddir)/libs/gst/helpers/gst-plugin-scanner \
- GST_PLUGIN_SYSTEM_PATH= \
- GST_PLUGIN_PATH=$(top_builddir)/plugins
+ GST_PLUGIN_SCANNER_1_0=$(top_builddir)/libs/gst/helpers/gst-plugin-scanner \
+ GST_PLUGIN_SYSTEM_PATH_1_0= \
+ GST_PLUGIN_PATH_1_0=$(top_builddir)/plugins
EXTRA_DIST = extract.pl
EXAMPLES = $(GNOME) elementcreate elementmake elementfactory \
diff --git a/tests/examples/manual/appsink.c b/tests/examples/manual/appsink.c
index 40e1207..5c569e7 100644
--- a/tests/examples/manual/appsink.c
+++ b/tests/examples/manual/appsink.c
@@ -38,7 +38,7 @@
if (error != NULL) {
g_print ("could not construct pipeline: %s\n", error->message);
- g_error_free (error);
+ g_clear_error (&error);
exit (-1);
}
diff --git a/tests/examples/manual/effectswitch.c b/tests/examples/manual/effectswitch.c
index 21ee712..3b0e56b 100644
--- a/tests/examples/manual/effectswitch.c
+++ b/tests/examples/manual/effectswitch.c
@@ -22,11 +22,11 @@
GstElement *next;
if (GST_EVENT_TYPE (GST_PAD_PROBE_INFO_DATA (info)) != GST_EVENT_EOS)
- return GST_PAD_PROBE_OK;
+ return GST_PAD_PROBE_PASS;
gst_pad_remove_probe (pad, GST_PAD_PROBE_INFO_ID (info));
- /* push current event back into the queue */
+ /* push current effect 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);
@@ -105,7 +105,7 @@
gst_message_parse_error (msg, &err, &dbg);
gst_object_default_error (msg->src, err, dbg);
- g_error_free (err);
+ g_clear_error (&err);
g_free (dbg);
g_main_loop_quit (loop);
break;
@@ -135,6 +135,8 @@
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);
+ g_clear_error (&err);
+ g_option_context_free (ctx);
return 1;
}
g_option_context_free (ctx);
diff --git a/tests/examples/memory/Makefile.in b/tests/examples/memory/Makefile.in
index 46995f0..f96c1af 100644
--- a/tests/examples/memory/Makefile.in
+++ b/tests/examples/memory/Makefile.in
@@ -329,6 +329,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/examples/netclock/Makefile.in b/tests/examples/netclock/Makefile.in
index 372dba1..aebc630 100644
--- a/tests/examples/netclock/Makefile.in
+++ b/tests/examples/netclock/Makefile.in
@@ -339,6 +339,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/examples/ptp/Makefile.in b/tests/examples/ptp/Makefile.in
index efbcc73..6021b7c 100644
--- a/tests/examples/ptp/Makefile.in
+++ b/tests/examples/ptp/Makefile.in
@@ -330,6 +330,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/examples/ptp/ptp-print-times.c b/tests/examples/ptp/ptp-print-times.c
index e6c666f..b7de82a 100644
--- a/tests/examples/ptp/ptp-print-times.c
+++ b/tests/examples/ptp/ptp-print-times.c
@@ -70,6 +70,7 @@
g_option_context_add_group (opt_ctx, gst_init_get_option_group ());
if (!g_option_context_parse (opt_ctx, &argc, &argv, &err))
g_error ("Error parsing options: %s", err->message);
+ g_clear_error (&err);
g_option_context_free (opt_ctx);
if (!gst_ptp_init (GST_PTP_CLOCK_ID_NONE, NULL))
diff --git a/tests/examples/stepping/Makefile.in b/tests/examples/stepping/Makefile.in
index d9988e8..3d97504 100644
--- a/tests/examples/stepping/Makefile.in
+++ b/tests/examples/stepping/Makefile.in
@@ -327,6 +327,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/examples/streamiddemux/Makefile.in b/tests/examples/streamiddemux/Makefile.in
index 06054d2..c0e945d 100644
--- a/tests/examples/streamiddemux/Makefile.in
+++ b/tests/examples/streamiddemux/Makefile.in
@@ -329,6 +329,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/examples/streams/Makefile.in b/tests/examples/streams/Makefile.in
index f2d7d8d..62d4abd 100644
--- a/tests/examples/streams/Makefile.in
+++ b/tests/examples/streams/Makefile.in
@@ -336,6 +336,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tests/misc/Makefile.in b/tests/misc/Makefile.in
index d22badc..a9f8313 100644
--- a/tests/misc/Makefile.in
+++ b/tests/misc/Makefile.in
@@ -273,6 +273,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 46f814d..ffea17d 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -1,12 +1,17 @@
bin_PROGRAMS = \
gst-inspect-@GST_API_VERSION@ \
+ gst-stats-@GST_API_VERSION@ \
gst-typefind-@GST_API_VERSION@
gst_inspect_@GST_API_VERSION@_SOURCES = gst-inspect.c tools.h
gst_inspect_@GST_API_VERSION@_CFLAGS = $(GST_OBJ_CFLAGS)
gst_inspect_@GST_API_VERSION@_LDADD = $(GST_OBJ_LIBS)
+gst_stats_@GST_API_VERSION@_SOURCES = gst-stats.c tools.h
+gst_stats_@GST_API_VERSION@_CFLAGS = $(GST_OBJ_CFLAGS)
+gst_stats_@GST_API_VERSION@_LDADD = $(GST_OBJ_LIBS)
+
gst_typefind_@GST_API_VERSION@_SOURCES = gst-typefind.c tools.h
gst_typefind_@GST_API_VERSION@_CFLAGS = $(GST_OBJ_CFLAGS)
gst_typefind_@GST_API_VERSION@_LDADD = $(GST_OBJ_LIBS)
diff --git a/tools/Makefile.in b/tools/Makefile.in
index b32f33f..7b96942 100644
--- a/tools/Makefile.in
+++ b/tools/Makefile.in
@@ -92,6 +92,7 @@
host_triplet = @host@
target_triplet = @target@
bin_PROGRAMS = gst-inspect-@GST_API_VERSION@$(EXEEXT) \
+ gst-stats-@GST_API_VERSION@$(EXEEXT) \
gst-typefind-@GST_API_VERSION@$(EXEEXT) $(am__EXEEXT_1)
@GST_DISABLE_PARSE_FALSE@am__append_1 = gst-launch-@GST_API_VERSION@
@GST_DISABLE_PARSE_FALSE@am__append_2 = gst-launch-@GST_API_VERSION@.1
@@ -168,6 +169,15 @@
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
$(gst_launch_@GST_API_VERSION@_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
$(LDFLAGS) -o $@
+am_gst_stats_@GST_API_VERSION@_OBJECTS = \
+ gst_stats_@GST_API_VERSION@-gst-stats.$(OBJEXT)
+gst_stats_@GST_API_VERSION@_OBJECTS = \
+ $(am_gst_stats_@GST_API_VERSION@_OBJECTS)
+gst_stats_@GST_API_VERSION@_DEPENDENCIES = $(am__DEPENDENCIES_1)
+gst_stats_@GST_API_VERSION@_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(gst_stats_@GST_API_VERSION@_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+ $(LDFLAGS) -o $@
am_gst_typefind_@GST_API_VERSION@_OBJECTS = \
gst_typefind_@GST_API_VERSION@-gst-typefind.$(OBJEXT)
gst_typefind_@GST_API_VERSION@_OBJECTS = \
@@ -214,9 +224,11 @@
am__v_CCLD_1 =
SOURCES = $(gst_inspect_@GST_API_VERSION@_SOURCES) \
$(gst_launch_@GST_API_VERSION@_SOURCES) \
+ $(gst_stats_@GST_API_VERSION@_SOURCES) \
$(gst_typefind_@GST_API_VERSION@_SOURCES)
DIST_SOURCES = $(gst_inspect_@GST_API_VERSION@_SOURCES) \
$(am__gst_launch_@GST_API_VERSION@_SOURCES_DIST) \
+ $(gst_stats_@GST_API_VERSION@_SOURCES) \
$(gst_typefind_@GST_API_VERSION@_SOURCES)
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
@@ -393,6 +405,8 @@
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
HAVE_CAP = @HAVE_CAP@
HAVE_DOCBOOK2PS = @HAVE_DOCBOOK2PS@
HAVE_DVIPS = @HAVE_DVIPS@
@@ -566,6 +580,9 @@
gst_inspect_@GST_API_VERSION@_SOURCES = gst-inspect.c tools.h
gst_inspect_@GST_API_VERSION@_CFLAGS = $(GST_OBJ_CFLAGS)
gst_inspect_@GST_API_VERSION@_LDADD = $(GST_OBJ_LIBS)
+gst_stats_@GST_API_VERSION@_SOURCES = gst-stats.c tools.h
+gst_stats_@GST_API_VERSION@_CFLAGS = $(GST_OBJ_CFLAGS)
+gst_stats_@GST_API_VERSION@_LDADD = $(GST_OBJ_LIBS)
gst_typefind_@GST_API_VERSION@_SOURCES = gst-typefind.c tools.h
gst_typefind_@GST_API_VERSION@_CFLAGS = $(GST_OBJ_CFLAGS)
gst_typefind_@GST_API_VERSION@_LDADD = $(GST_OBJ_LIBS)
@@ -677,6 +694,10 @@
@rm -f gst-launch-@GST_API_VERSION@$(EXEEXT)
$(AM_V_CCLD)$(gst_launch_@GST_API_VERSION@_LINK) $(gst_launch_@GST_API_VERSION@_OBJECTS) $(gst_launch_@GST_API_VERSION@_LDADD) $(LIBS)
+gst-stats-@GST_API_VERSION@$(EXEEXT): $(gst_stats_@GST_API_VERSION@_OBJECTS) $(gst_stats_@GST_API_VERSION@_DEPENDENCIES) $(EXTRA_gst_stats_@GST_API_VERSION@_DEPENDENCIES)
+ @rm -f gst-stats-@GST_API_VERSION@$(EXEEXT)
+ $(AM_V_CCLD)$(gst_stats_@GST_API_VERSION@_LINK) $(gst_stats_@GST_API_VERSION@_OBJECTS) $(gst_stats_@GST_API_VERSION@_LDADD) $(LIBS)
+
gst-typefind-@GST_API_VERSION@$(EXEEXT): $(gst_typefind_@GST_API_VERSION@_OBJECTS) $(gst_typefind_@GST_API_VERSION@_DEPENDENCIES) $(EXTRA_gst_typefind_@GST_API_VERSION@_DEPENDENCIES)
@rm -f gst-typefind-@GST_API_VERSION@$(EXEEXT)
$(AM_V_CCLD)$(gst_typefind_@GST_API_VERSION@_LINK) $(gst_typefind_@GST_API_VERSION@_OBJECTS) $(gst_typefind_@GST_API_VERSION@_LDADD) $(LIBS)
@@ -689,6 +710,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gst_inspect_@GST_API_VERSION@-gst-inspect.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gst_launch_@GST_API_VERSION@-gst-launch.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gst_stats_@GST_API_VERSION@-gst-stats.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gst_typefind_@GST_API_VERSION@-gst-typefind.Po@am__quote@
.c.o:
@@ -743,6 +765,20 @@
@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) $(gst_launch_@GST_API_VERSION@_CFLAGS) $(CFLAGS) -c -o gst_launch_@GST_API_VERSION@-gst-launch.obj `if test -f 'gst-launch.c'; then $(CYGPATH_W) 'gst-launch.c'; else $(CYGPATH_W) '$(srcdir)/gst-launch.c'; fi`
+gst_stats_@GST_API_VERSION@-gst-stats.o: gst-stats.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_stats_@GST_API_VERSION@_CFLAGS) $(CFLAGS) -MT gst_stats_@GST_API_VERSION@-gst-stats.o -MD -MP -MF $(DEPDIR)/gst_stats_@GST_API_VERSION@-gst-stats.Tpo -c -o gst_stats_@GST_API_VERSION@-gst-stats.o `test -f 'gst-stats.c' || echo '$(srcdir)/'`gst-stats.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gst_stats_@GST_API_VERSION@-gst-stats.Tpo $(DEPDIR)/gst_stats_@GST_API_VERSION@-gst-stats.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gst-stats.c' object='gst_stats_@GST_API_VERSION@-gst-stats.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) $(gst_stats_@GST_API_VERSION@_CFLAGS) $(CFLAGS) -c -o gst_stats_@GST_API_VERSION@-gst-stats.o `test -f 'gst-stats.c' || echo '$(srcdir)/'`gst-stats.c
+
+gst_stats_@GST_API_VERSION@-gst-stats.obj: gst-stats.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_stats_@GST_API_VERSION@_CFLAGS) $(CFLAGS) -MT gst_stats_@GST_API_VERSION@-gst-stats.obj -MD -MP -MF $(DEPDIR)/gst_stats_@GST_API_VERSION@-gst-stats.Tpo -c -o gst_stats_@GST_API_VERSION@-gst-stats.obj `if test -f 'gst-stats.c'; then $(CYGPATH_W) 'gst-stats.c'; else $(CYGPATH_W) '$(srcdir)/gst-stats.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gst_stats_@GST_API_VERSION@-gst-stats.Tpo $(DEPDIR)/gst_stats_@GST_API_VERSION@-gst-stats.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gst-stats.c' object='gst_stats_@GST_API_VERSION@-gst-stats.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) $(gst_stats_@GST_API_VERSION@_CFLAGS) $(CFLAGS) -c -o gst_stats_@GST_API_VERSION@-gst-stats.obj `if test -f 'gst-stats.c'; then $(CYGPATH_W) 'gst-stats.c'; else $(CYGPATH_W) '$(srcdir)/gst-stats.c'; fi`
+
gst_typefind_@GST_API_VERSION@-gst-typefind.o: gst-typefind.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gst_typefind_@GST_API_VERSION@_CFLAGS) $(CFLAGS) -MT gst_typefind_@GST_API_VERSION@-gst-typefind.o -MD -MP -MF $(DEPDIR)/gst_typefind_@GST_API_VERSION@-gst-typefind.Tpo -c -o gst_typefind_@GST_API_VERSION@-gst-typefind.o `test -f 'gst-typefind.c' || echo '$(srcdir)/'`gst-typefind.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/gst_typefind_@GST_API_VERSION@-gst-typefind.Tpo $(DEPDIR)/gst_typefind_@GST_API_VERSION@-gst-typefind.Po
diff --git a/tools/gst-inspect.c b/tools/gst-inspect.c
index 141c7bd..845f52e 100644
--- a/tools/gst-inspect.c
+++ b/tools/gst-inspect.c
@@ -1141,6 +1141,7 @@
GList *features, *origlist;
gint num_features = 0;
gint num_elements = 0;
+ gint num_tracers = 0;
gint num_typefinders = 0;
gint num_devproviders = 0;
gint num_other = 0;
@@ -1191,6 +1192,10 @@
gst_device_provider_factory_get_metadata (factory,
GST_ELEMENT_METADATA_LONGNAME));
num_devproviders++;
+ } else if (GST_IS_TRACER_FACTORY (feature)) {
+ n_print (" %s (%s)\n", gst_object_get_name (GST_OBJECT (feature)),
+ g_type_name (G_OBJECT_TYPE (feature)));
+ num_tracers++;
} else if (feature) {
n_print (" %s (%s)\n", gst_object_get_name (GST_OBJECT (feature)),
g_type_name (G_OBJECT_TYPE (feature)));
@@ -1210,6 +1215,8 @@
n_print (" +-- %d typefinders\n", num_typefinders);
if (num_devproviders > 0)
n_print (" +-- %d device providers\n", num_devproviders);
+ if (num_tracers > 0)
+ n_print (" +-- %d tracers\n", num_tracers);
if (num_other > 0)
n_print (" +-- %d other objects\n", num_other);
@@ -1228,6 +1235,12 @@
n_print ("%s: a typefind function\n", element_name);
return 0;
}
+ feature = gst_registry_find_feature (gst_registry_get (), element_name,
+ GST_TYPE_TRACER_FACTORY);
+ if (feature) {
+ n_print ("%s: a tracer module\n", element_name);
+ return 0;
+ }
return -1;
}
@@ -1499,6 +1512,8 @@
g_option_context_add_group (ctx, gst_init_get_option_group ());
if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
g_printerr ("Error initializing: %s\n", err->message);
+ g_clear_error (&err);
+ g_option_context_free (ctx);
return -1;
}
g_option_context_free (ctx);
@@ -1615,7 +1630,7 @@
}
} else {
g_printerr (_("Could not load plugin file: %s\n"), error->message);
- g_error_free (error);
+ g_clear_error (&error);
return -1;
}
} else {
diff --git a/tools/gst-launch.1.in b/tools/gst-launch.1.in
index c04ddc6..409727f 100644
--- a/tools/gst-launch.1.in
+++ b/tools/gst-launch.1.in
@@ -429,7 +429,8 @@
When set to a filesystem path, store 'dot' files of pipeline graphs there.
These can then later be converted into an image using the 'dot' utility from
the graphviz set of tools, like this: dot foo.dot -Tsvg -o foo.svg (png or jpg
-are also possible as output format)
+are also possible as output format). There is also a utility called 'xdot'
+which allows you to view the .dot file directly without converting it first.
.TP
\fBGST_REGISTRY\fR
Path of the plugin registry file. Default is
diff --git a/tools/gst-launch.c b/tools/gst-launch.c
index 7c0da04..859f9db 100644
--- a/tools/gst-launch.c
+++ b/tools/gst-launch.c
@@ -325,7 +325,7 @@
if (debug != NULL)
g_printerr (_("Additional debug info:\n%s\n"), debug);
- g_error_free (err);
+ g_clear_error (&err);
g_free (debug);
g_free (name);
}
@@ -650,7 +650,7 @@
if (debug) {
PRINT (_("INFO:\n%s\n"), debug);
}
- g_error_free (gerror);
+ g_clear_error (&gerror);
g_free (debug);
g_free (name);
break;
@@ -669,7 +669,7 @@
if (debug) {
PRINT (_("Additional debug info:\n%s\n"), debug);
}
- g_error_free (gerror);
+ g_clear_error (&gerror);
g_free (debug);
g_free (name);
break;
@@ -974,6 +974,8 @@
g_printerr ("Error initializing: %s\n", GST_STR_NULL (err->message));
else
g_printerr ("Error initializing: Unknown error!\n");
+ g_clear_error (&error);
+ g_option_context_free (ctx);
exit (1);
}
g_option_context_free (ctx);
@@ -1001,7 +1003,7 @@
if (error) {
g_printerr (_("ERROR: pipeline could not be constructed: %s.\n"),
GST_STR_NULL (error->message));
- g_error_free (error);
+ g_clear_error (&error);
} else {
g_printerr (_("ERROR: pipeline could not be constructed.\n"));
}
@@ -1009,7 +1011,7 @@
} else if (error) {
g_printerr (_("WARNING: erroneous pipeline: %s\n"),
GST_STR_NULL (error->message));
- g_error_free (error);
+ g_clear_error (&error);
return 1;
}
diff --git a/tools/gst-stats.c b/tools/gst-stats.c
new file mode 100644
index 0000000..f5efdda
--- /dev/null
+++ b/tools/gst-stats.c
@@ -0,0 +1,900 @@
+/* GStreamer
+ * Copyright (C) 2013 Stefan Sauer <ensonic@users.sf.net>
+ *
+ * gst-stats.c: statistics tracing front end
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "tools.h"
+
+/* log parser */
+static GRegex *raw_log = NULL;
+static GRegex *ansi_log = NULL;
+
+/* global statistics */
+static GHashTable *threads = NULL;
+static GPtrArray *elements = NULL;
+static GPtrArray *pads = NULL;
+static guint64 num_buffers = 0, num_events = 0, num_messages = 0, num_queries =
+ 0;
+static guint num_elements = 0, num_bins = 0, num_pads = 0, num_ghostpads = 0;
+static GstClockTime last_ts = G_GUINT64_CONSTANT (0);
+static guint total_cpuload = 0;
+static gboolean have_cpuload = FALSE;
+
+typedef struct
+{
+ /* human readable pad name and details */
+ gchar *name, *type_name;
+ guint index;
+ gboolean is_ghost_pad;
+ GstPadDirection dir;
+ /* buffer statistics */
+ guint num_buffers;
+ guint num_live, num_decode_only, num_discont, num_resync, num_corrupted,
+ num_marker, num_header, num_gap, num_droppable, num_delta;
+ guint min_size, max_size, avg_size;
+ /* first and last activity on the pad, expected next_ts */
+ GstClockTime first_ts, last_ts, next_ts;
+ /* in which thread does it operate */
+ guint thread_id;
+ /* hierarchy */
+ guint parent_ix;
+} GstPadStats;
+
+typedef struct
+{
+ /* human readable element name */
+ gchar *name, *type_name;
+ guint index;
+ gboolean is_bin;
+ /* buffer statistics */
+ guint recv_buffers, sent_buffers;
+ guint64 recv_bytes, sent_bytes;
+ /* event, message statistics */
+ guint num_events, num_messages, num_queries;
+ /* first activity on the element */
+ GstClockTime first_ts, last_ts;
+ /* hierarchy */
+ guint parent_ix;
+} GstElementStats;
+
+typedef struct
+{
+ /* time spend in this thread */
+ GstClockTime tthread;
+ guint cpuload;
+} GstThreadStats;
+
+/* stats helper */
+
+static void
+free_element_stats (gpointer data)
+{
+ g_slice_free (GstElementStats, data);
+}
+
+static inline GstElementStats *
+get_element_stats (guint ix)
+{
+ return (ix != G_MAXUINT) ? g_ptr_array_index (elements, ix) : NULL;
+}
+
+static inline GstPadStats *
+get_pad_stats (guint ix)
+{
+ return (ix != G_MAXUINT) ? g_ptr_array_index (pads, ix) : NULL;
+}
+
+static void
+free_pad_stats (gpointer data)
+{
+ g_slice_free (GstPadStats, data);
+}
+
+static inline GstThreadStats *
+get_thread_stats (guint id)
+{
+ GstThreadStats *stats = g_hash_table_lookup (threads, GUINT_TO_POINTER (id));
+
+ if (G_UNLIKELY (!stats)) {
+ stats = g_slice_new0 (GstThreadStats);
+ stats->tthread = GST_CLOCK_TIME_NONE;
+ g_hash_table_insert (threads, GUINT_TO_POINTER (id), stats);
+ }
+ return stats;
+}
+
+static void
+new_pad_stats (GstStructure * s)
+{
+ GstPadStats *stats;
+ guint ix, parent_ix;
+ gchar *type, *name;
+ gboolean is_ghost_pad;
+ GstPadDirection dir;
+ guint thread_id;
+
+ gst_structure_get (s,
+ "ix", G_TYPE_UINT, &ix,
+ "parent-ix", G_TYPE_UINT, &parent_ix,
+ "name", G_TYPE_STRING, &name,
+ "type", G_TYPE_STRING, &type,
+ "is-ghostpad", G_TYPE_BOOLEAN, &is_ghost_pad,
+ "pad-direction", GST_TYPE_PAD_DIRECTION, &dir,
+ "thread-id", G_TYPE_UINT, &thread_id, NULL);
+
+ stats = g_slice_new0 (GstPadStats);
+ if (is_ghost_pad)
+ num_ghostpads++;
+ num_pads++;
+ stats->name = name;
+ stats->type_name = type;
+ stats->index = ix;
+ stats->is_ghost_pad = is_ghost_pad;
+ stats->dir = dir;
+ stats->min_size = G_MAXUINT;
+ stats->first_ts = stats->last_ts = stats->next_ts = GST_CLOCK_TIME_NONE;
+ stats->thread_id = thread_id;
+ stats->parent_ix = parent_ix;
+
+ if (pads->len <= ix)
+ g_ptr_array_set_size (pads, ix + 1);
+ g_ptr_array_index (pads, ix) = stats;
+}
+
+static void
+new_element_stats (GstStructure * s)
+{
+ GstElementStats *stats;
+ guint ix, parent_ix;
+ gchar *type, *name;
+ gboolean is_bin;
+
+ gst_structure_get (s,
+ "ix", G_TYPE_UINT, &ix,
+ "parent-ix", G_TYPE_UINT, &parent_ix,
+ "name", G_TYPE_STRING, &name,
+ "type", G_TYPE_STRING, &type, "is-bin", G_TYPE_BOOLEAN, &is_bin, NULL);
+
+ stats = g_slice_new0 (GstElementStats);
+ if (is_bin)
+ num_bins++;
+ num_elements++;
+ stats->index = ix;
+ stats->name = name;
+ stats->type_name = type;
+ stats->is_bin = is_bin;
+ stats->first_ts = GST_CLOCK_TIME_NONE;
+ stats->parent_ix = parent_ix;
+
+ if (elements->len <= ix)
+ g_ptr_array_set_size (elements, ix + 1);
+ g_ptr_array_index (elements, ix) = stats;
+}
+
+static void
+free_thread_stats (gpointer data)
+{
+ g_slice_free (GstThreadStats, data);
+}
+
+static void
+do_pad_stats (GstPadStats * stats, guint elem_ix, guint size, guint64 ts,
+ guint64 buffer_ts, guint64 buffer_dur, GstBufferFlags buffer_flags)
+{
+ gulong avg_size;
+
+ /* parentage */
+ if (stats->parent_ix == G_MAXUINT) {
+ stats->parent_ix = elem_ix;
+ }
+
+ if (stats->thread_id) {
+ get_thread_stats (stats->thread_id);
+ }
+
+ /* size stats */
+ avg_size = (((gulong) stats->avg_size * (gulong) stats->num_buffers) + size);
+ stats->num_buffers++;
+ stats->avg_size = (guint) (avg_size / stats->num_buffers);
+ if (size < stats->min_size)
+ stats->min_size = size;
+ else if (size > stats->max_size)
+ stats->max_size = size;
+ /* time stats */
+ if (!GST_CLOCK_TIME_IS_VALID (stats->last_ts))
+ stats->first_ts = ts;
+ stats->last_ts = ts;
+ /* flag stats */
+ if (buffer_flags & GST_BUFFER_FLAG_LIVE)
+ stats->num_live++;
+ if (buffer_flags & GST_BUFFER_FLAG_DECODE_ONLY)
+ stats->num_decode_only++;
+ if (buffer_flags & GST_BUFFER_FLAG_DISCONT)
+ stats->num_discont++;
+ if (buffer_flags & GST_BUFFER_FLAG_RESYNC)
+ stats->num_resync++;
+ if (buffer_flags & GST_BUFFER_FLAG_CORRUPTED)
+ stats->num_corrupted++;
+ if (buffer_flags & GST_BUFFER_FLAG_MARKER)
+ stats->num_marker++;
+ if (buffer_flags & GST_BUFFER_FLAG_HEADER)
+ stats->num_header++;
+ if (buffer_flags & GST_BUFFER_FLAG_GAP)
+ stats->num_gap++;
+ if (buffer_flags & GST_BUFFER_FLAG_DROPPABLE)
+ stats->num_droppable++;
+ if (buffer_flags & GST_BUFFER_FLAG_DELTA_UNIT)
+ stats->num_delta++;
+ /* update timestamps */
+ if (GST_CLOCK_TIME_IS_VALID (buffer_ts) &&
+ GST_CLOCK_TIME_IS_VALID (buffer_dur)) {
+ stats->next_ts = buffer_ts + buffer_dur;
+ } else {
+ stats->next_ts = GST_CLOCK_TIME_NONE;
+ }
+}
+
+static void
+do_element_stats (GstElementStats * stats, GstElementStats * peer_stats,
+ guint size, guint64 ts)
+{
+ stats->sent_buffers++;
+ peer_stats->recv_buffers++;
+ stats->sent_bytes += size;
+ peer_stats->recv_bytes += size;
+ /* time stats */
+ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (stats->first_ts))) {
+ stats->first_ts = ts;
+ }
+ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (peer_stats->first_ts))) {
+ peer_stats->first_ts = ts + 1;
+ }
+}
+
+static void
+do_buffer_stats (GstStructure * s)
+{
+ guint64 ts, buffer_pts, buffer_dur;
+ guint pad_ix, elem_ix, peer_elem_ix;
+ guint size;
+ GstBufferFlags buffer_flags;
+ GstPadStats *pad_stats;
+ GstElementStats *elem_stats, *peer_elem_stats;
+
+ num_buffers++;
+ gst_structure_get (s, "ts", G_TYPE_UINT64, &ts,
+ "pad-ix", G_TYPE_UINT, &pad_ix,
+ "elem-ix", G_TYPE_UINT, &elem_ix,
+ "peer-elem-ix", G_TYPE_UINT, &peer_elem_ix,
+ "buffer-size", G_TYPE_UINT, &size,
+ "buffer-pts", G_TYPE_UINT64, &buffer_pts,
+ "buffer-duration", G_TYPE_UINT64, &buffer_dur,
+ "buffer-flags", GST_TYPE_BUFFER_FLAGS, &buffer_flags, NULL);
+ last_ts = MAX (last_ts, ts);
+ if (!(pad_stats = get_pad_stats (pad_ix))) {
+ GST_WARNING ("no pad stats found for ix=%u", pad_ix);
+ return;
+ }
+ if (!(elem_stats = get_element_stats (elem_ix))) {
+ GST_WARNING ("no element stats found for ix=%u", elem_ix);
+ return;
+ }
+ if (!(peer_elem_stats = get_element_stats (peer_elem_ix))) {
+ GST_WARNING ("no element stats found for ix=%u", peer_elem_ix);
+ return;
+ }
+ do_pad_stats (pad_stats, elem_ix, size, ts, buffer_pts, buffer_dur,
+ buffer_flags);
+ if (pad_stats->dir == GST_PAD_SRC) {
+ /* push */
+ do_element_stats (elem_stats, peer_elem_stats, size, ts);
+ } else {
+ /* pull */
+ do_element_stats (peer_elem_stats, elem_stats, size, ts);
+ }
+}
+
+static void
+do_event_stats (GstStructure * s)
+{
+ guint64 ts;
+ guint pad_ix, elem_ix;
+ GstPadStats *pad_stats;
+ GstElementStats *elem_stats;
+
+ num_events++;
+ gst_structure_get (s, "ts", G_TYPE_UINT64, &ts,
+ "pad-ix", G_TYPE_UINT, &pad_ix, "elem-ix", G_TYPE_UINT, &elem_ix, NULL);
+ last_ts = MAX (last_ts, ts);
+ if (!(pad_stats = get_pad_stats (pad_ix))) {
+ GST_WARNING ("no pad stats found for ix=%u", pad_ix);
+ return;
+ }
+ if (!(elem_stats = get_element_stats (elem_ix))) {
+ // e.g. reconfigure events are send over unparented pads
+ GST_INFO ("no element stats found for ix=%u", elem_ix);
+ return;
+ }
+ elem_stats->num_events++;
+}
+
+static void
+do_message_stats (GstStructure * s)
+{
+ guint64 ts;
+ guint elem_ix;
+ GstElementStats *elem_stats;
+
+ num_messages++;
+ gst_structure_get (s, "ts", G_TYPE_UINT64, &ts,
+ "elem-ix", G_TYPE_UINT, &elem_ix, NULL);
+ last_ts = MAX (last_ts, ts);
+ if (!(elem_stats = get_element_stats (elem_ix))) {
+ GST_WARNING ("no element stats found for ix=%u", elem_ix);
+ return;
+ }
+ elem_stats->num_messages++;
+}
+
+static void
+do_query_stats (GstStructure * s)
+{
+ guint64 ts;
+ guint elem_ix;
+ GstElementStats *elem_stats;
+
+ num_queries++;
+ gst_structure_get (s, "ts", G_TYPE_UINT64, &ts,
+ "elem-ix", G_TYPE_UINT, &elem_ix, NULL);
+ last_ts = MAX (last_ts, ts);
+ if (!(elem_stats = get_element_stats (elem_ix))) {
+ GST_WARNING ("no element stats found for ix=%u", elem_ix);
+ return;
+ }
+ elem_stats->num_queries++;
+}
+
+static void
+do_thread_rusage_stats (GstStructure * s)
+{
+ guint64 ts, tthread;
+ guint thread_id, cpuload;
+ GstThreadStats *thread_stats;
+
+ gst_structure_get (s, "ts", G_TYPE_UINT64, &ts,
+ "thread-id", G_TYPE_UINT, &thread_id,
+ "average-cpuload", G_TYPE_UINT, &cpuload, "time", G_TYPE_UINT64, &tthread,
+ NULL);
+ thread_stats = get_thread_stats (thread_id);
+ thread_stats->cpuload = cpuload;
+ thread_stats->tthread = tthread;
+ last_ts = MAX (last_ts, ts);
+}
+
+static void
+do_proc_rusage_stats (GstStructure * s)
+{
+ guint64 ts;
+
+ gst_structure_get (s, "ts", G_TYPE_UINT64, &ts,
+ "average-cpuload", G_TYPE_UINT, &total_cpuload, NULL);
+ last_ts = MAX (last_ts, ts);
+ have_cpuload = TRUE;
+}
+
+/* reporting */
+
+static gint
+find_pad_stats_for_thread (gconstpointer value, gconstpointer user_data)
+{
+ const GstPadStats *stats = (const GstPadStats *) value;
+
+ if ((stats->thread_id == GPOINTER_TO_UINT (user_data)) &&
+ (stats->num_buffers)) {
+ return 0;
+ }
+ return 1;
+}
+
+static void
+print_pad_stats (gpointer value, gpointer user_data)
+{
+ GstPadStats *stats = (GstPadStats *) value;
+
+ if (stats->thread_id == GPOINTER_TO_UINT (user_data)) {
+ /* there seem to be some temporary pads */
+ if (stats->num_buffers) {
+ GstClockTimeDiff running =
+ GST_CLOCK_DIFF (stats->first_ts, stats->last_ts);
+ GstElementStats *elem_stats = get_element_stats (stats->parent_ix);
+ gchar fullname[30 + 1];
+
+ g_snprintf (fullname, 30, "%s.%s", elem_stats->name, stats->name);
+
+ printf
+ (" %c %-30.30s: buffers %7u (live %5u,dec %5u,dis %5u,res %5u,"
+ "cor %5u,mar %5u,hdr %5u,gap %5u,drop %5u,dlt %5u),",
+ (stats->dir == GST_PAD_SRC) ? '>' : '<', fullname, stats->num_buffers,
+ stats->num_live, stats->num_decode_only, stats->num_discont,
+ stats->num_resync, stats->num_corrupted, stats->num_marker,
+ stats->num_header, stats->num_gap, stats->num_droppable,
+ stats->num_delta);
+ if (stats->min_size == stats->max_size) {
+ printf (" size (min/avg/max) ......./%7u/.......,", stats->avg_size);
+ } else {
+ printf (" size (min/avg/max) %7u/%7u/%7u,",
+ stats->min_size, stats->avg_size, stats->max_size);
+ }
+ printf (" time %" GST_TIME_FORMAT ","
+ " bytes/sec %lf\n",
+ GST_TIME_ARGS (running),
+ ((gdouble) (stats->num_buffers * stats->avg_size) * GST_SECOND) /
+ ((gdouble) running));
+ }
+ }
+}
+
+static void
+print_thread_stats (gpointer key, gpointer value, gpointer user_data)
+{
+ GSList *list = user_data;
+ GSList *node = g_slist_find_custom (list, key, find_pad_stats_for_thread);
+ GstThreadStats *stats = (GstThreadStats *) value;
+
+ /* skip stats if there are no pads for that thread (e.g. a pipeline) */
+ if (!node)
+ return;
+
+ printf ("Thread %p Statistics:\n", key);
+ if (GST_CLOCK_TIME_IS_VALID (stats->tthread)) {
+ printf (" Time: %" GST_TIME_FORMAT "\n", GST_TIME_ARGS (stats->tthread));
+ printf (" Avg CPU load: %4.1f %%\n", (gfloat) stats->cpuload / 10.0);
+ }
+
+ puts (" Pad Statistics:");
+ g_slist_foreach (node, print_pad_stats, key);
+}
+
+static void
+print_element_stats (gpointer value, gpointer user_data)
+{
+ GstElementStats *stats = (GstElementStats *) value;
+
+ /* skip temporary elements */
+ if (stats->first_ts != GST_CLOCK_TIME_NONE) {
+ gchar fullname[45 + 1];
+
+ g_snprintf (fullname, 45, "%s:%s", stats->type_name, stats->name);
+
+ printf (" %-45s:", fullname);
+ if (stats->recv_buffers)
+ printf (" buffers in/out %7u", stats->recv_buffers);
+ else
+ printf (" buffers in/out %7s", "-");
+ if (stats->sent_buffers)
+ printf ("/%7u", stats->sent_buffers);
+ else
+ printf ("/%7s", "-");
+ if (stats->recv_bytes)
+ printf (" bytes in/out %12" G_GUINT64_FORMAT, stats->recv_bytes);
+ else
+ printf (" bytes in/out %12s", "-");
+ if (stats->sent_bytes)
+ printf ("/%12" G_GUINT64_FORMAT, stats->sent_bytes);
+ else
+ printf ("/%12s", "-");
+ printf (" first activity %" GST_TIME_FORMAT ", "
+ " ev/msg/qry sent %5u/%5u/%5u\n", GST_TIME_ARGS (stats->first_ts),
+ stats->num_events, stats->num_messages, stats->num_queries);
+ }
+}
+
+static void
+accum_element_stats (gpointer value, gpointer user_data)
+{
+ GstElementStats *stats = (GstElementStats *) value;
+
+ if (stats->parent_ix != G_MAXUINT) {
+ GstElementStats *parent_stats = get_element_stats (stats->parent_ix);
+
+ parent_stats->num_events += stats->num_events;
+ parent_stats->num_messages += stats->num_messages;
+ parent_stats->num_queries += stats->num_queries;
+ if (!GST_CLOCK_TIME_IS_VALID (parent_stats->first_ts)) {
+ parent_stats->first_ts = stats->first_ts;
+ } else if (GST_CLOCK_TIME_IS_VALID (stats->first_ts)) {
+ parent_stats->first_ts = MIN (parent_stats->first_ts, stats->first_ts);
+ }
+ if (!GST_CLOCK_TIME_IS_VALID (parent_stats->last_ts)) {
+ parent_stats->last_ts = stats->last_ts;
+ } else if (GST_CLOCK_TIME_IS_VALID (stats->last_ts)) {
+ parent_stats->last_ts = MAX (parent_stats->last_ts, stats->last_ts);
+ }
+ }
+}
+
+/* sorting */
+
+static gint
+sort_pad_stats_by_first_activity (gconstpointer ps1, gconstpointer ps2)
+{
+ GstPadStats *s1 = (GstPadStats *) ps1;
+ GstPadStats *s2 = (GstPadStats *) ps2;
+
+ gint order = GST_CLOCK_DIFF (s2->first_ts, s1->first_ts);
+
+ if (!order) {
+ order = s1->dir - s2->dir;
+ }
+ return (order);
+}
+
+static void
+sort_pad_stats (gpointer value, gpointer user_data)
+{
+ GSList **list = user_data;
+
+ *list =
+ g_slist_insert_sorted (*list, value, sort_pad_stats_by_first_activity);
+}
+
+static gint
+sort_element_stats_by_first_activity (gconstpointer es1, gconstpointer es2)
+{
+ return (GST_CLOCK_DIFF (((GstElementStats *) es2)->first_ts,
+ ((GstElementStats *) es1)->first_ts));
+}
+
+static void
+sort_bin_stats (gpointer value, gpointer user_data)
+{
+ if (((GstElementStats *) value)->is_bin) {
+ GSList **list = user_data;
+
+ *list =
+ g_slist_insert_sorted (*list, value,
+ sort_element_stats_by_first_activity);
+ }
+}
+
+static void
+sort_element_stats (gpointer value, gpointer user_data)
+{
+ if (!(((GstElementStats *) value)->is_bin)) {
+ GSList **list = user_data;
+
+ *list =
+ g_slist_insert_sorted (*list, value,
+ sort_element_stats_by_first_activity);
+ }
+}
+
+static gboolean
+check_bin_parent (gpointer key, gpointer value, gpointer user_data)
+{
+ GstElementStats *stats = (GstElementStats *) value;
+
+ return (stats->parent_ix == GPOINTER_TO_UINT (user_data));
+}
+
+static gboolean
+process_leaf_bins (gpointer key, gpointer value, gpointer user_data)
+{
+ GHashTable *accum_bins = user_data;
+
+ /* if we find no bin that has this bin as a parent ... */
+ if (!g_hash_table_find (accum_bins, check_bin_parent, key)) {
+ /* accumulate stats to the parent and remove */
+ accum_element_stats (value, NULL);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* main */
+
+static gboolean
+init (void)
+{
+ /* compile the parser regexps */
+ /* 0:00:00.004925027 31586 0x1c5c600 DEBUG GST_REGISTRY gstregistry.c:463:gst_registry_add_plugin:<registry0> adding plugin 0x1c79160 for filename "/usr/lib/gstreamer-1.0/libgstxxx.so" */
+ raw_log = g_regex_new (
+ /* 1: ts */
+ "^([0-9:.]+) +"
+ /* 2: pid */
+ "([0-9]+) +"
+ /* 3: thread */
+ "(0x[0-9a-fA-F]+) +"
+ /* 4: level */
+ "([A-Z]+) +"
+ /* 5: category */
+ "([a-zA-Z_-]+) +"
+ /* 6: file:line:func: */
+ "([^:]+:[0-9]+:[^:]+:)"
+ /* 7: (obj)? log-text */
+ "(.*)$", 0, 0, NULL);
+ if (!raw_log) {
+ GST_WARNING ("failed to compile the 'raw' parser");
+ return FALSE;
+ }
+
+ ansi_log = g_regex_new (
+ /* 1: ts */
+ "^([0-9:.]+) +"
+ /* 2: pid */
+ "\\\e\\\[[0-9;]+m *([0-9]+)\\\e\\\[00m +"
+ /* 3: thread */
+ "(0x[0-9a-fA-F]+) +"
+ /* 4: level */
+ "(?:\\\e\\\[[0-9;]+m)?([A-Z]+) +\\\e\\\[00m +"
+ /* 5: category */
+ "\\\e\\\[[0-9;]+m +([a-zA-Z_-]+) +"
+ /* 6: file:line:func: */
+ "([^:]+:[0-9]+:[^:]+:)(?:\\\e\\\[00m)?"
+ /* 7: (obj)? log-text */
+ "(.*)$", 0, 0, NULL);
+ if (!raw_log) {
+ GST_WARNING ("failed to compile the 'ansi' parser");
+ return FALSE;
+ }
+
+ elements = g_ptr_array_new_with_free_func (free_element_stats);
+ pads = g_ptr_array_new_with_free_func (free_pad_stats);
+ threads = g_hash_table_new_full (NULL, NULL, NULL, free_thread_stats);
+
+ return TRUE;
+}
+
+static void
+done (void)
+{
+ if (pads)
+ g_ptr_array_free (pads, TRUE);
+ if (elements)
+ g_ptr_array_free (elements, TRUE);
+ if (threads)
+ g_hash_table_destroy (threads);
+
+ if (raw_log)
+ g_regex_unref (raw_log);
+ if (ansi_log)
+ g_regex_unref (ansi_log);
+}
+
+static void
+print_stats (void)
+{
+ guint num_threads = g_hash_table_size (threads);
+
+ /* print overall stats */
+ puts ("\nOverall Statistics:");
+ printf ("Number of Threads: %u\n", num_threads);
+ printf ("Number of Elements: %u\n", num_elements - num_bins);
+ printf ("Number of Bins: %u\n", num_bins);
+ printf ("Number of Pads: %u\n", num_pads - num_ghostpads);
+ printf ("Number of GhostPads: %u\n", num_ghostpads);
+ printf ("Number of Buffers passed: %" G_GUINT64_FORMAT "\n", num_buffers);
+ printf ("Number of Events sent: %" G_GUINT64_FORMAT "\n", num_events);
+ printf ("Number of Message sent: %" G_GUINT64_FORMAT "\n", num_messages);
+ printf ("Number of Queries sent: %" G_GUINT64_FORMAT "\n", num_queries);
+ printf ("Time: %" GST_TIME_FORMAT "\n", GST_TIME_ARGS (last_ts));
+ if (have_cpuload) {
+ printf ("Avg CPU load: %4.1f %%\n", (gfloat) total_cpuload / 10.0);
+ }
+ puts ("");
+
+ /* thread stats */
+ if (num_threads) {
+ GSList *list = NULL;
+
+ g_ptr_array_foreach (pads, sort_pad_stats, &list);
+ g_hash_table_foreach (threads, print_thread_stats, list);
+ puts ("");
+ g_slist_free (list);
+ }
+
+ /* element stats */
+ if (num_elements) {
+ GSList *list = NULL;
+
+ puts ("Element Statistics:");
+ /* sort by first_activity */
+ g_ptr_array_foreach (elements, sort_element_stats, &list);
+ /* attribute element stats to bins */
+ g_slist_foreach (list, accum_element_stats, NULL);
+ g_slist_foreach (list, print_element_stats, NULL);
+ puts ("");
+ g_slist_free (list);
+ }
+
+ /* bin stats */
+ if (num_bins) {
+ GSList *list = NULL;
+ guint i;
+ GHashTable *accum_bins = g_hash_table_new_full (NULL, NULL, NULL, NULL);
+
+ puts ("Bin Statistics:");
+ /* attribute bin stats to parent-bins */
+ for (i = 0; i < num_elements; i++) {
+ GstElementStats *stats = g_ptr_array_index (elements, i);
+ if (stats->is_bin) {
+ g_hash_table_insert (accum_bins, GUINT_TO_POINTER (i), stats);
+ }
+ }
+ while (g_hash_table_size (accum_bins)) {
+ g_hash_table_foreach_remove (accum_bins, process_leaf_bins, accum_bins);
+ }
+ g_hash_table_destroy (accum_bins);
+ /* sort by first_activity */
+ g_ptr_array_foreach (elements, sort_bin_stats, &list);
+ g_slist_foreach (list, print_element_stats, NULL);
+ puts ("");
+ g_slist_free (list);
+ }
+}
+
+static void
+collect_stats (const gchar * filename)
+{
+ FILE *log;
+
+ if ((log = fopen (filename, "rt"))) {
+ gchar line[5001];
+
+ /* probe format */
+ if (fgets (line, 5000, log)) {
+ GMatchInfo *match_info;
+ GRegex *parser;
+ GstStructure *s;
+ guint lnr = 0;
+ gchar *level, *data;
+
+ if (strchr (line, 27)) {
+ parser = ansi_log;
+ GST_INFO ("format is 'ansi'");
+ } else {
+ parser = raw_log;
+ GST_INFO ("format is 'raw'");
+ }
+ rewind (log);
+
+ /* parse the log */
+ while (!feof (log)) {
+ if (fgets (line, 5000, log)) {
+ if (g_regex_match (parser, line, 0, &match_info)) {
+ /* filter by level */
+ level = g_match_info_fetch (match_info, 4);
+ if (!strcmp (level, "TRACE")) {
+ data = g_match_info_fetch (match_info, 7);
+ if ((s = gst_structure_from_string (data, NULL))) {
+ const gchar *name = gst_structure_get_name (s);
+
+ if (!strcmp (name, "new-pad")) {
+ new_pad_stats (s);
+ } else if (!strcmp (name, "new-element")) {
+ new_element_stats (s);
+ } else if (!strcmp (name, "buffer")) {
+ do_buffer_stats (s);
+ } else if (!strcmp (name, "event")) {
+ do_event_stats (s);
+ } else if (!strcmp (name, "message")) {
+ do_message_stats (s);
+ } else if (!strcmp (name, "query")) {
+ do_query_stats (s);
+ } else if (!strcmp (name, "thread-rusage")) {
+ do_thread_rusage_stats (s);
+ } else if (!strcmp (name, "proc-rusage")) {
+ do_proc_rusage_stats (s);
+ } else {
+ // TODO(ensonic): parse the xxx.class log lines
+ if (!g_str_has_suffix (data, ".class")) {
+ GST_WARNING ("unknown log entry: '%s'", data);
+ }
+ }
+ gst_structure_free (s);
+ } else {
+ GST_WARNING ("unknown log entry: '%s'", data);
+ }
+ }
+ } else {
+ if (*line) {
+ GST_WARNING ("foreign log entry: %s:%d:'%s'", filename, lnr,
+ g_strchomp (line));
+ }
+ }
+ g_match_info_free (match_info);
+ match_info = NULL;
+ lnr++;
+ } else {
+ if (!feof (log)) {
+ // TODO(ensonic): run wc -L on the log file
+ fprintf (stderr, "line too long");
+ }
+ }
+ }
+ } else {
+ GST_WARNING ("empty log");
+ }
+ fclose (log);
+ }
+}
+
+gint
+main (gint argc, gchar * argv[])
+{
+ gchar **filenames = NULL;
+ guint num;
+ GError *err = NULL;
+ GOptionContext *ctx;
+ GOptionEntry options[] = {
+ GST_TOOLS_GOPTION_VERSION,
+ // TODO(ensonic): add a summary flag, if set read the whole thing, print
+ // stats once, and exit
+ {G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &filenames, NULL}
+ ,
+ {NULL}
+ };
+
+#ifdef ENABLE_NLS
+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ textdomain (GETTEXT_PACKAGE);
+#endif
+
+ g_set_prgname ("gst-stats-" GST_API_VERSION);
+
+ ctx = g_option_context_new ("FILE");
+ g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE);
+ g_option_context_add_group (ctx, gst_init_get_option_group ());
+ if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
+ g_print ("Error initializing: %s\n", GST_STR_NULL (err->message));
+ exit (1);
+ }
+ g_option_context_free (ctx);
+
+ gst_tools_print_version ();
+
+ if (filenames == NULL || *filenames == NULL) {
+ g_print ("Please give one filename to %s\n\n", g_get_prgname ());
+ return 1;
+ }
+ num = g_strv_length (filenames);
+ if (num == 0 || num > 1) {
+ g_print ("Please give exactly one filename to %s (%d given).\n\n",
+ g_get_prgname (), num);
+ return 1;
+ }
+
+ if (init ()) {
+ collect_stats (filenames[0]);
+ print_stats ();
+ }
+ done ();
+
+ g_strfreev (filenames);
+ return 0;
+}
diff --git a/tools/gst-typefind.c b/tools/gst-typefind.c
index 830d7e6..490aca8 100644
--- a/tools/gst-typefind.c
+++ b/tools/gst-typefind.c
@@ -106,7 +106,7 @@
if (msg) {
gst_message_parse_error (msg, &err, NULL);
g_printerr ("%s - FAILED: %s\n", filename, err->message);
- g_error_free (err);
+ g_clear_error (&err);
gst_message_unref (msg);
} else {
g_printerr ("%s - FAILED: unknown error\n", filename);
@@ -162,6 +162,8 @@
g_option_context_add_group (ctx, gst_init_get_option_group ());
if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
g_print ("Error initializing: %s\n", GST_STR_NULL (err->message));
+ g_clear_error (&err);
+ g_option_context_free (ctx);
exit (1);
}
g_option_context_free (ctx);
diff --git a/win32/common/config.h b/win32/common/config.h
index ace70cc..1f32ef2 100644
--- a/win32/common/config.h
+++ b/win32/common/config.h
@@ -40,6 +40,9 @@
/* Define if pipeline parsing code is disabled */
#undef GST_DISABLE_PARSE
+/* Define if extra runtime checks should be enabled */
+#undef GST_ENABLE_EXTRA_CHECKS
+
/* Extra platform specific plugin suffix */
#undef GST_EXTRA_MODULE_SUFFIX
@@ -65,7 +68,7 @@
#define GST_PACKAGE_ORIGIN "Unknown package origin"
/* GStreamer package release date/time for plugins as YYYY-MM-DD */
-#define GST_PACKAGE_RELEASE_DATETIME "2015-12-14"
+#define GST_PACKAGE_RELEASE_DATETIME "2015-12-24"
/* Define if static plugins should be built */
#undef GST_PLUGIN_BUILD_STATIC
@@ -194,6 +197,9 @@
/* Define to 1 if you have the `getpid' function. */
#undef HAVE_GETPID
+/* Define to 1 if you have the `getrusage' function. */
+#undef HAVE_GETRUSAGE
+
/* Define if the GNU gettext() function is already present or preinstalled. */
#undef HAVE_GETTEXT
@@ -355,6 +361,9 @@
/* Define to 1 if you have the <sys/prctl.h> header file. */
#undef HAVE_SYS_PRCTL_H
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#undef HAVE_SYS_RESOURCE_H
+
/* Define to 1 if you have the <sys/socket.h> header file. */
#undef HAVE_SYS_SOCKET_H
@@ -454,7 +463,7 @@
#define PACKAGE_NAME "GStreamer"
/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "GStreamer 1.6.2"
+#define PACKAGE_STRING "GStreamer 1.7.1"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "gstreamer"
@@ -463,7 +472,7 @@
#undef PACKAGE_URL
/* Define to the version of this package. */
-#define PACKAGE_VERSION "1.6.2"
+#define PACKAGE_VERSION "1.7.1"
/* directory where plugins are located */
#ifdef _DEBUG
@@ -507,7 +516,7 @@
#undef USE_POISONING
/* Version number of package */
-#define VERSION "1.6.2"
+#define VERSION "1.7.1"
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
significant byte first (like Motorola and SPARC, unlike Intel). */
diff --git a/win32/common/gstenumtypes.c b/win32/common/gstenumtypes.c
index a29942a..7d7b337 100644
--- a/win32/common/gstenumtypes.c
+++ b/win32/common/gstenumtypes.c
@@ -1437,6 +1437,9 @@
{C_FLAGS (GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX),
"GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_SUFFIX",
"file-name-is-suffix"},
+ {C_FLAGS (GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX),
+ "GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX",
+ "file-name-is-prefix"},
{0, NULL, NULL}
};
diff --git a/win32/common/gstversion.h b/win32/common/gstversion.h
index 0216c54..6842248 100644
--- a/win32/common/gstversion.h
+++ b/win32/common/gstversion.h
@@ -54,13 +54,13 @@
*
* The minor version of GStreamer at compile time:
*/
-#define GST_VERSION_MINOR (6)
+#define GST_VERSION_MINOR (7)
/**
* GST_VERSION_MICRO:
*
* The micro version of GStreamer at compile time:
*/
-#define GST_VERSION_MICRO (2)
+#define GST_VERSION_MICRO (1)
/**
* GST_VERSION_NANO:
*
diff --git a/win32/common/libgstnet.def b/win32/common/libgstnet.def
index 9cbd905..6fdab1e 100644
--- a/win32/common/libgstnet.def
+++ b/win32/common/libgstnet.def
@@ -1,6 +1,7 @@
EXPORTS
gst_buffer_add_net_address_meta
gst_buffer_add_net_control_message_meta
+ gst_buffer_get_net_address_meta
gst_net_address_meta_api_get_type
gst_net_address_meta_get_info
gst_net_client_clock_get_type
diff --git a/win32/common/libgstreamer.def b/win32/common/libgstreamer.def
index 43979cc..ce553fa 100644
--- a/win32/common/libgstreamer.def
+++ b/win32/common/libgstreamer.def
@@ -511,6 +511,9 @@
gst_element_get_clock
gst_element_get_compatible_pad
gst_element_get_compatible_pad_template
+ gst_element_get_context
+ gst_element_get_context_unlocked
+ gst_element_get_contexts
gst_element_get_factory
gst_element_get_request_pad
gst_element_get_start_time
@@ -892,6 +895,7 @@
gst_pad_set_chain_function_full
gst_pad_set_chain_list_function_full
gst_pad_set_element_private
+ gst_pad_set_event_full_function_full
gst_pad_set_event_function_full
gst_pad_set_getrange_function_full
gst_pad_set_iterate_internal_links_function_full
@@ -1154,11 +1158,16 @@
gst_segment_is_equal
gst_segment_new
gst_segment_offset_running_time
+ gst_segment_position_from_running_time
+ gst_segment_position_from_running_time_full
+ gst_segment_position_from_stream_time
+ gst_segment_position_from_stream_time_full
gst_segment_set_running_time
gst_segment_to_position
gst_segment_to_running_time
gst_segment_to_running_time_full
gst_segment_to_stream_time
+ gst_segment_to_stream_time_full
gst_segtrap_is_enabled
gst_segtrap_set_enabled
gst_state_change_get_type
@@ -1375,6 +1384,13 @@
gst_toc_setter_get_type
gst_toc_setter_reset
gst_toc_setter_set_toc
+ gst_tracer_factory_get_list
+ gst_tracer_factory_get_type
+ gst_tracer_get_type
+ gst_tracer_log_trace
+ gst_tracer_register
+ gst_tracing_register_hook
+ gst_tracing_register_hook_id
gst_type_find_factory_call_function
gst_type_find_factory_get_caps
gst_type_find_factory_get_extensions