From b6fe77c450df54605648a94f90fc3d329f6d5bca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Tue, 10 May 2011 08:55:10 +0100 Subject: [PATCH 01/30] Release 0.10.33 Highlights: - new parser base class: GstBaseParse - new core element: funnel - OSX multi-arch fixes - new QoS type for QoS events - new progress message API to notify applications of asynchronous operations - countless other fixes and improvements --- ChangeLog | 3210 +++++++++++++++++- NEWS | 158 +- RELEASE | 255 +- configure.ac | 4 +- docs/plugins/inspect/plugin-coreelements.xml | 4 +- docs/plugins/inspect/plugin-coreindexers.xml | 4 +- gstreamer.doap | 11 + po/af.po | 2 +- po/az.po | 2 +- po/be.po | 2 +- po/bg.po | 2 +- po/ca.po | 2 +- po/cs.po | 2 +- po/da.po | 2 +- po/de.po | 2 +- po/el.po | 2 +- po/en_GB.po | 2 +- po/es.po | 2 +- po/eu.po | 2 +- po/fi.po | 2 +- po/fr.po | 2 +- po/gl.po | 2 +- po/hu.po | 2 +- po/id.po | 2 +- po/it.po | 2 +- po/ja.po | 2 +- po/lt.po | 2 +- po/nb.po | 2 +- po/nl.po | 2 +- po/pl.po | 2 +- po/pt_BR.po | 2 +- po/ro.po | 2 +- po/ru.po | 2 +- po/rw.po | 2 +- po/sk.po | 2 +- po/sl.po | 2 +- po/sq.po | 2 +- po/sr.po | 2 +- po/sv.po | 2 +- po/tr.po | 2 +- po/uk.po | 2 +- po/vi.po | 2 +- po/zh_CN.po | 2 +- po/zh_TW.po | 2 +- win32/common/config.h | 10 +- win32/common/gstversion.h | 4 +- 46 files changed, 3617 insertions(+), 117 deletions(-) diff --git a/ChangeLog b/ChangeLog index 23fa97ef2e..bb746fab86 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,9 +1,3213 @@ -=== release 0.10.32 === +=== release 0.10.33 === -2011-01-21 Tim-Philipp Müller +2011-05-10 Tim-Philipp Müller * configure.ac: - releasing 0.10.32, "Take Me to the Bonus Level" + releasing 0.10.33, "Prior Spaceflight Experience is an Advantage" + +2011-05-06 23:40:58 +0100 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.c: + baseparse: don't post loads of empty taglists + Only post bitrate updates if there's something to post, don't + post empty taglists if nothing changed. + +2011-05-06 11:35:36 +0300 Stefan Kost + + * gst/gstinfo.h: + info: avoid redefinition of symbols when debugging is off + The refactoring of gst_debug_add_log_function() now causes build failure when + debug-logging is turned off. Just move it to the conditional part of the header. + +2011-05-04 15:29:42 +0100 Tim-Philipp Müller + + * tests/check/gst/gstminiobject.c: + tests: fix compiler warning in new miniobject test + gst/gstminiobject.c: In function ‘test_dup_null_mini_object’: + gst/gstminiobject.c:459:7: warning: assignment from incompatible pointer type + +2011-05-02 11:30:06 -0300 Thiago Santos + + * gst/gstminiobject.c: + * tests/check/gst/gstminiobject.c: + miniobject: Fix dup_mini_object function to handle NULL gvalues + g_value_dup_object handles gvalues that contain NULL pointers, + gst_value_dup_mini_object should do the same. + https://bugzilla.gnome.org/show_bug.cgi?id=649195 + +2011-05-03 13:55:43 +0300 Stefan Kost + + * libs/gst/base/gstbaseparse.c: + docs: it its %TRUE (constant) + As spotted by Tim. + +2011-05-02 16:22:56 +0300 Stefan Kost + + * gst/gstelementfactory.c: + docs: fix copy'n'paste doc header mistake + +2011-05-02 16:20:24 +0300 Stefan Kost + + * gst/gstelement.h: + * gst/gstpluginfeature.h: + docs: add two trivial doc blobs + +2011-05-02 16:03:29 +0300 Stefan Kost + + * libs/gst/base/gstbaseparse.c: + docs: add missing parameter docs + +2011-05-02 16:00:52 +0300 Stefan Kost + + * libs/gst/dataprotocol/dataprotocol.h: + docs: add docs for GstDPPacketizer + +2011-05-02 15:52:58 +0300 Stefan Kost + + * gst/gstcaps.h: + docs: improve the syntax for the capsintersectmode docs + +2011-05-02 15:48:01 +0300 Stefan Kost + + * gst/gstelement.c: + docs: fixup broken xref + +2011-05-02 15:46:59 +0300 Stefan Kost + + * docs/gst/gstreamer-sections.txt: + * docs/libs/gstreamer-libs-sections.txt: + docs: add new api to -section.txt + +2011-05-02 15:35:52 +0300 Stefan Kost + + * gst/gstatomicqueue.h: + docs: fix gtk-doc syntax + +2011-05-02 15:30:13 +0300 Stefan Kost + + * plugins/elements/gstfunnel.c: + docs: don't duplicate info that we take from element-details + +2011-04-28 15:37:02 +0300 Stefan Kost + + * docs/gst/gstreamer-sections.txt: + docs: remove non existing symbol + +2011-04-28 15:05:28 +0300 Stefan Kost + + * gst/gstbufferlist.c: + * gst/gstsystemclock.h: + docs: we don't need to document private members in opaque structs + +2011-04-30 16:55:36 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/inspect/plugin-coreelements.xml: + * docs/plugins/inspect/plugin-coreindexers.xml: + * docs/plugins/inspect/plugin-staticelements.xml: + * po/de.po: + * po/fr.po: + * win32/common/config.h: + * win32/common/gstversion.h: + 0.10.32.4 pre-release + +2011-04-29 23:44:55 +0100 Tim-Philipp Müller + + * gst/gstpluginfeature.h: + pluginfeature: include plugin.h in header where we use a GstPlugin pointer + Should fix issue with gstreamermm build where is included + directly instead of gst/gst.h. + +2011-04-27 11:49:11 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/inspect/plugin-coreelements.xml: + * docs/plugins/inspect/plugin-coreindexers.xml: + * po/bg.po: + * po/nl.po: + * po/pl.po: + * po/ru.po: + * win32/common/config.h: + * win32/common/gstversion.h: + 0.10.32.3 pre-release + +2011-04-26 15:42:46 +0100 Tim-Philipp Müller + + * gst/gst_private.h: + * gst/gstbin.c: + * gst/gstbus.c: + * gst/gstbus.h: + Revert lockfree GstBus for the release + Drop in old GstBus code for the release to play it safe, since + regressions that are apparently hard to track down and reproduce + have been reported (on windows/OSX mostly) against the lockfree + version, and more time is needed to fix them. + This reverts commit 03391a897001d35d1d290f27dd12e98a8b729fb4. + This reverts commit 43cdbc17e6f944cdf02aeed78d1d5f6bde5190c9. + This reverts commit 80eb160e0f62350271f061daa5f289d9d4277cf4. + This reverts commit c41b0ade28790ffdb0e484b41cd7929c4e145dec. + This reverts commit 874d60e5899dd5b89854679d1a4ad016a58ba4e0. + This reverts commit 79370d4b1781af9c9a65f2d1e3498124d8c4c413. + This reverts commit 2cb3e5235196eb71fb25e0a4a4b8749d6d0a8453. + This reverts commit bd1c40011434c1efaa696dc98ef855ef9cce9b28. + This reverts commit 4bf8f1524f6e3374b3f3bc57322337723d06b928. + This reverts commit 14d7db1b527b05f029819057aef5c123ac7e013d. + https://bugzilla.gnome.org/show_bug.cgi?id=647493 + +2011-04-15 22:00:11 -0700 David Schleef + + * gst/gstutils.c: + minor inline documentation fix + +2011-04-24 14:02:51 +0100 Tim-Philipp Müller + + * common: + Automatic update of common submodule + From c3cafe1 to 46dfcea + +2011-04-24 11:44:19 +0100 Tim-Philipp Müller + + * tests/check/gst/gstbin.c: + tests: clean up properly in the bin test_link_structure_change unit test + Don't forget to set the pipeline back to NULL state, which makes + valgrind happy again. + +2011-04-24 09:58:53 +0100 Tim-Philipp Müller + + * gst/gstregistry.c: + registry: when removing a cached-but-no-longer-existing plugin, only remove features that belong to it + When a plugin file no longer exists, e.g. because it's been removed or + renamed, don't remove all features in the registry based on the *name* + of the plugin they belong to, but only remove those who actually belong + to that particular plugin (object/pointer). + This fixes issues of plugin features disappearing when a plugin .so file + is renamed. + https://bugzilla.gnome.org/show_bug.cgi?id=604094 + +2011-04-24 09:53:39 +0100 Tim-Philipp Müller + + * gst/gstelementfactory.c: + * gst/gstpluginfeature.c: + * gst/gstpluginfeature.h: + * gst/gstregistrychunks.c: + * gst/gsttypefind.c: + pluginfeature: store pointer to plugin in addition to the plugin name + So we can reliably remove plugin features for a specific plugin later. + https://bugzilla.gnome.org/show_bug.cgi?id=604094 + +2011-04-24 11:05:58 +0100 Tim-Philipp Müller + + * gst/gstregistry.c: + registry: use TRACE log level to log files that don't look like plugins + Cuts down the noise in uninstalled setups. + +2011-04-19 20:35:04 -0300 Thiago Santos + + * libs/gst/base/gstbasetransform.c: + basetransform: fix negotiation regression + Fixup patch for 83597767b169dd6c39a07b6144a650c1f098825a + Use a separate variable for knowing if a pad alloc has been made + instead of checking for the flow return that might not be the + result of the pad alloc + https://bugzilla.gnome.org/show_bug.cgi?id=648220 + +2011-04-21 12:33:10 +0100 Tim-Philipp Müller + + * tests/check/gst/gstpipeline.c: + tests: add simple pipeline-in-pipeline unit test + https://bugzilla.gnome.org/show_bug.cgi?id=648297 + +2011-04-20 15:39:16 +0200 Mark Nauwelaerts + + * gst/gstbus.c: + bus: also allow popping a message without timeout if no poll available + ... which happens in particular flushing a bus, possibly as part + of a state change, e.g. when having a pipeline in a pipeline + and then changing state back to NULL. The interior pipeline + will/might then flush the bus, which is a child bus from the + parent which does not have a poll anymore these days. + https://bugzilla.gnome.org/show_bug.cgi?id=648297 + +2011-04-19 14:05:23 +0200 Havard Graff + + * gst/gstpad.c: + pad: unlock before freeing the cache to avoid deadlock + https://bugzilla.gnome.org/show_bug.cgi?id=648199 + +2011-04-14 10:15:26 +0200 Havard Graff + + * libs/gst/base/gstbasetransform.c: + basetransform: don't unref trans until the function is done using it + trans->priv->force_alloc = FALSE would crash if the ref held is the last + https://bugzilla.gnome.org/show_bug.cgi?id=648215 + +2011-04-19 13:23:19 +0100 Tim-Philipp Müller + + * gst/gstindex.c: + docs: add note/warning to gst_index_get_writer_id() docs about the OBJECT_LOCK + https://bugzilla.gnome.org/show_bug.cgi?id=646811 + +2011-04-19 13:05:53 +0100 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.c: + baseparse: don't deadlock when setting external index + Protect index with its own lock. gst_index_get_writer_id() may take + the object lock internally (the default resolver, GST_INDEX_RESOLVER_PATH, + will anyway), so if we're using that to protect the index as well, + we'll deadlock. + https://bugzilla.gnome.org/show_bug.cgi?id=646811 + +2011-04-19 11:51:30 +0100 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.c: + baseparse: make fmtlist constant + +2011-04-19 11:48:05 +0100 Tim-Philipp Müller + + * gst/gstquery.c: + * gst/gstquery.h: + query: const-ify formats arguments to gst_query_set_formatsv() + +2011-04-16 15:20:08 +0100 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.c: + docs: remove reference to baseparse API that didn't make it + +2011-04-16 14:56:03 +0100 Tim-Philipp Müller + + * configure.ac: + * docs/plugins/gstreamer-plugins.args: + * docs/plugins/inspect/plugin-coreelements.xml: + * docs/plugins/inspect/plugin-coreindexers.xml: + * win32/common/config.h: + * win32/common/gstenumtypes.c: + * win32/common/gstenumtypes.h: + * win32/common/gstversion.h: + 0.10.32.2 pre-release + +2011-04-16 14:54:00 +0100 Tim-Philipp Müller + + * po/af.po: + * po/az.po: + * po/be.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/nb.po: + * po/nl.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/rw.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + * po/zh_TW.po: + po: update translations + +2011-04-16 14:52:40 +0100 Tim-Philipp Müller + + * tools/gst-launch.c: + gst-launch: remove newline from translatable string + +2011-04-16 13:49:45 +0100 Tim-Philipp Müller + + * gst/Makefile.am: + gst: gobject-introspection scanner doesn't need to scan or update plugin info + +2011-04-16 14:34:08 +0200 Sebastian Dröge + + * gst/Makefile.am: + gst: make sure gobject-introspection scanner calls gst_init() + https://bugzilla.gnome.org/show_bug.cgi?id=647922 + +2011-04-16 10:45:16 +0100 Tim-Philipp Müller + + * libs/gst/base/Makefile.am: + * libs/gst/check/Makefile.am: + * libs/gst/controller/Makefile.am: + * libs/gst/dataprotocol/Makefile.am: + * libs/gst/net/Makefile.am: + libs: gobject-introspection scanner doesn't need to scan or update plugin info + Make sure the scanner doesn't load or introspect or check any plugins, + (especially not outside the build directory). + +2011-04-16 10:33:21 +0100 Tim-Philipp Müller + + * libs/gst/base/Makefile.am: + * libs/gst/check/Makefile.am: + * libs/gst/controller/Makefile.am: + * libs/gst/dataprotocol/Makefile.am: + * libs/gst/net/Makefile.am: + libs: make sure gobject-introspection scanner calls gst_init() + https://bugzilla.gnome.org/show_bug.cgi?id=647922 + +2011-04-16 10:17:24 +0100 Tim-Philipp Müller + + * win32/common/libgstbase.def: + win32: add new baseparse API to libgstbase.def + +2011-04-16 09:32:17 +0200 Sebastian Dröge + + * win32/common/libgstreamer.def: + win32: Add exports for the GstParseContext and GstBufferListIterator types + +2011-04-15 20:58:51 +0100 Tim-Philipp Müller + + * gst/gstpluginloader.c: + pluginloader: only run gst-plugin-scanner with /usr/bin/arch wrapper on OS X >= 10.5 + Based on patch by: Daniel Macks + Earlier versions of OSX don't support proper multiarch and + trying to use /usr/bin/arch -foo with those versions would + just break things. + https://bugzilla.gnome.org/show_bug.cgi?id=615357 + +2011-04-15 19:07:55 +0100 Tim-Philipp Müller + + * docs/libs/gstreamer-libs-sections.txt: + * libs/gst/base/gstbaseparse.c: + * libs/gst/base/gstbaseparse.h: + baseparse: expose gst_base_parse_frame_free() for completeness + API: gst_base_parse_frame_free() + +2011-04-15 18:52:18 +0100 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.c: + baseparse: init frames on the stack with gst_base_parse_frame_init() + Frames must now be inited this way, can't just zero them + out and use them. + +2011-04-15 18:38:46 +0100 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.c: + baseparse: more debug logging, minor clean-up + Trace frames, split out code to queue a frame for later. + +2011-04-15 18:00:21 +0100 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.c: + * libs/gst/base/gstbaseparse.h: + baseparse: change gst_base_parse_frame_init() to not take a GstBaseParse argument + +2011-04-15 17:41:02 +0100 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.c: + * libs/gst/base/gstbaseparse.h: + baseparse: make GstBaseParseFrame handling more bindings-friendly + Change semantics of gst_base_parse_push_frame() and make it take + ownership of the whole frame, not just the frame contents. This + is more in line with how gst_pad_push() etc. work. Just transfering + the content, but not the container of something that's not really + known to be a container is hard to annotate properly and probably + won't work. We mark frames allocated on the stack now with a private + flag in gst_base_parse_frame_init(), so gst_base_parse_frame_free() + only frees the contents in that case but not the frame struct itself. + https://bugzilla.gnome.org/show_bug.cgi?id=518857 + API: gst_base_parse_frame_new() + +2011-04-15 15:02:20 +0100 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.c: + * libs/gst/base/gstbaseparse.h: + baseparse: register boxed type for GstBaseFrameParse + To make this usable for bindings. + https://bugzilla.gnome.org/show_bug.cgi?id=518857 + +2011-04-15 13:57:47 +0200 Sebastian Dröge + + * plugins/elements/gstqueue2.c: + queue2: Add missing ) to the ring-buffer-max-size property description + +2011-04-15 10:53:56 +0200 Robert Swain + + * libs/gst/base/gstbaseparse.c: + baseparse: Remove unused but set variable + GCC 4.6.0 spits warnings about these. + +2011-04-14 16:06:16 +0200 Sebastian Dröge + + * gst/gst.c: + * gst/gstbufferlist.c: + * gst/gstbufferlist.h: + bufferlist: Add boxed type for GstBufferListIterator for gobject-introspection + +2011-04-14 15:59:28 +0200 Sebastian Dröge + + * gst/gst.c: + * gst/gstparse.c: + * gst/gstparse.h: + parse: Add boxed type for GstParseContext for gobject-introspection + +2011-04-14 15:51:24 +0200 Sebastian Dröge + + * gst/gstbufferlist.c: + * gst/gstfilter.c: + * gst/gstinterface.c: + * gst/gstiterator.c: + * gst/gstminiobject.c: + * gst/gstregistry.c: + * gst/gststructure.c: + * gst/gstutils.c: + gst: Add some more gobject-introspection annotations + +2011-04-14 09:07:48 +0200 Sebastian Dröge + + * plugins/elements/gstmultiqueue.c: + multiqueue: Don't leak the sinkpad name + +2011-04-14 09:07:25 +0200 Sebastian Dröge + + * tests/check/elements/multiqueue.c: + multiqueue: Don't leak pads in the named pads unit test + +2011-04-14 08:59:14 +0200 Sebastian Dröge + + * gst/gstutils.c: + utils: Fix caps leaks in gst_element_factory_can_accept_{any,all}_caps_in_direction() + +2011-04-13 09:20:13 -0700 David Schleef + + * gst/parse/parse.l: + * tests/check/pipelines/parse-launch.c: + parser: Allow element names to begin with digits + +2011-04-13 10:24:33 -0700 David Schleef + + * tests/check/gst/gstutils.c: + tests: Add test for greatest common divisor + +2011-01-06 18:11:31 +0100 Ole André Vadla Ravnås + + * plugins/elements/gstfunnel.c: + * plugins/elements/gstinputselector.c: + * plugins/elements/gstoutputselector.c: + * plugins/elements/gstqueue.c: + * plugins/elements/gsttee.c: + elements: Fix pad callbacks so they handle when parent goes away + 1) We need to lock and get a strong ref to the parent, if still there. + 2) If it has gone away, we need to handle that gracefully. + This is necessary in order to safely modify a running pipeline. Has been + observed when a streaming thread is doing a buffer_alloc() while an + application thread sends an event on a pad further downstream, and from + within a pad probe (holding STREAM_LOCK) carries out the pipeline plumbing + while the streaming thread has its buffer_alloc() in progress. + +2011-01-06 18:11:31 +0100 Ole André Vadla Ravnås + + * libs/gst/base/gstbasesink.c: + * libs/gst/base/gstbasetransform.c: + base: Fix pad callbacks so they handle when parent goes away + 1) We need to lock and get a strong ref to the parent, if still there. + 2) If it has gone away, we need to handle that gracefully. + This is necessary in order to safely modify a running pipeline. Has been + observed when a streaming thread is doing a buffer_alloc() while an + application thread sends an event on a pad further downstream, and from + within a pad probe (holding STREAM_LOCK) carries out the pipeline plumbing + while the streaming thread has its buffer_alloc() in progress. + +2011-01-06 18:11:31 +0100 Ole André Vadla Ravnås + + * gst/gstghostpad.c: + ghostpad: Fix pad callbacks so they handle when parent goes away + 1) We need to lock and get a strong ref to the parent, if still there. + 2) If it has gone away, we need to handle that gracefully. + This is necessary in order to safely modify a running pipeline. Has been + observed when a streaming thread is doing a buffer_alloc() while an + application thread sends an event on a pad further downstream, and from + within a pad probe (holding STREAM_LOCK) carries out the pipeline plumbing + while the streaming thread has its buffer_alloc() in progress. + +2011-04-13 17:26:54 +0200 Janne Grunau + + * plugins/elements/gstqueue2.c: + queue2: prevent calculation with GST_CLOCK_TIME_NONE in update_time_level() + +2011-04-11 15:08:30 +0100 Tim-Philipp Müller + + * tests/check/elements/multiqueue.c: + * tests/check/elements/queue2.c: + * tests/check/gst/gstvalue.c: + * tests/check/libs/test_transform.c: + tests: fix unusued-but-assigned-variable warnings with gcc 4.6 + +2011-04-11 13:04:32 +0100 Tim-Philipp Müller + + * tests/check/gst/gstbin.c: + tests: disable test_many_bins unit test for now + It fails on the OSX bot (both with git and the last release), and + it doesn't really test anything useful, so may just as well disable + it for now. + +2011-04-11 12:51:36 +0100 Tim-Philipp Müller + + * gst/gstpluginloader.c: + pluginloader: fix compiler warnings + Cast string constants to make compiler happy. + +2011-04-11 12:04:34 +0100 Tim-Philipp Müller + + * tests/check/gst/gstbin.c: + tests: allow more time for the test_many_bins pipeline to preroll + Hopefully makes this test work on the OSX build bot and other + not-so-powerful machines. + https://bugzilla.gnome.org/show_bug.cgi?id=646624 + +2011-04-11 11:29:00 +0100 Jan Schmidt + + * gst/gstpluginloader.c: + pluginloader: make sure gst-plugin-scanner is called with the right arch on OSX + On OSX, GStreamer might be built as a 'fat/universal' binary containing + both 32-bit and 64-bit code. We must take care that gst-plugin-scanner + is executed with the same architecture as the GStreamer core, otherwise + bad things may happen and core/scanner will not be able to communicate + properly. + Should fix issues with (32-bit) firefox using a 32-bit GStreamer core + which then spawns a 'universal' gst-plugin-scanner binary which gets + run in 64-bit mode, causing 100% cpu usage / busy loops or just hanging + firefox until killed. + https://bugzilla.gnome.org/show_bug.cgi?id=615357 + +2011-04-11 11:05:24 +0200 Robert Swain + + * gst/gstpad.c: + pad: Allow tracking of buffers in GST_SCHEDULING debug output + As GST_SCHEDULING reports when buffers pass through pads due to + gst_pad_push calls, they are a good way of tracking the progress of + buffers through pipelines. As such, adding output of the buffer pointers + to these messages allows tracking of specific buffers, easing debugging. + +2011-01-27 14:33:08 +0100 Alessandro Decina + + * .gitignore: + * Android.mk: + * android/NOTICE: + * android/base.mk: + * android/controller.mk: + * android/dataprotocol.mk: + * android/elements.mk: + * android/gst-inspect.mk: + * android/gst-launch.mk: + * android/gst-plugin-scanner.mk: + * android/gst.mk: + * android/gst/gstconfig.h: + * android/gst/gstenumtypes.c: + * android/gst/gstenumtypes.h: + * android/gst/gstmarshal.c: + * android/gst/gstmarshal.h: + * android/gst/gstversion.h: + * android/gst/parse/grammar.output: + * android/gst/parse/grammar.tab.c: + * android/gst/parse/grammar.tab.h: + * android/gst/parse/lex._gst_parse_yy.c: + * android/indexers.mk: + * android/net.mk: + * android/tools.mk: + * gst/Makefile.am: + * gst/parse/Makefile.am: + * libs/Makefile.am: + * libs/gst/Makefile.am: + * libs/gst/base/Makefile.am: + * libs/gst/controller/Makefile.am: + * libs/gst/dataprotocol/Makefile.am: + * libs/gst/helpers/Makefile.am: + * libs/gst/net/Makefile.am: + * plugins/Makefile.am: + * plugins/elements/Makefile.am: + * plugins/indexers/Makefile.am: + * tools/Makefile.am: + android: make it ready for androgenizer + Remove the android/ top dir + Fixe the Makefile.am to be androgenized + To build gstreamer for android we are now using androgenizer which generates the needed Android.mk files. + Androgenizer can be found here: http://git.collabora.co.uk/?p=user/derek/androgenizer.git + +2011-04-09 23:54:20 +0100 Tim-Philipp Müller + + * gst/gsttrace.c: + trace: don't put code with side effects into g_return_if_fail() + +2011-04-09 22:57:46 +0100 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.c: + docs: minor fixes for baseparse docs + Class vfunc references still aren't right, no idea what + the correct markup for those is. + +2011-04-09 18:04:55 +0100 Tim-Philipp Müller + + * gst/gstelement.c: + element: unref event in default_send_event in case element has no pads + Spotted by Haakon Sporsheim. + +2011-04-08 19:07:02 +0100 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.c: + baseparse: minor variable name clean-up + +2011-04-08 15:31:14 +0100 Tim-Philipp Müller + + * docs/libs/gstreamer-libs-sections.txt: + * docs/plugins/gstreamer-plugins.args: + * libs/gst/base/gstbaseparse.c: + * libs/gst/base/gstbaseparse.h: + * win32/common/libgstbase.def: + baseparse: rename _set_frame_props() to _set_frame_rate() + Seems like the best fit to what it does, and is shorter than + set_frame_properties() which might also have been confusing + because of GstBaseParseFrame. + https://bugzilla.gnome.org/show_bug.cgi?id=518857 + +2011-04-06 17:43:27 +0100 Tim-Philipp Müller + + * docs/libs/gstreamer-libs-sections.txt: + * libs/gst/base/gstbaseparse.c: + * libs/gst/base/gstbaseparse.h: + baseparse: replace format flags with gst_base_parse_set_{passthrough,syncable,has_timing_info} + This is more in line with e.g. GstBaseTransform's API, and makes for nicer + to read code. No getters for now since I don't see any use case for them, + the API is for subclasses, which usually know what format they're + dealing with already and hence know what they've set. + https://bugzilla.gnome.org/show_bug.cgi?id=518857 + +2011-04-04 17:58:59 +0100 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.c: + * libs/gst/base/gstbaseparse.h: + baseparse: make DRAIN and SYNC flags on baseparse, not the frame, and change to DRAINING and LOST_SYNC + The first because it seems a better fit conceptually, the second + to express booleanness. Also change the accessor macros for subclasses + to GST_BASE_PARSE_DRAINING and GST_BASE_PARSE_LOST_SYNC. + https://bugzilla.gnome.org/show_bug.cgi?id=518857 + +2011-04-02 14:18:57 +0100 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.h: + baseparse: add some padding to GstBaseParseFrame + Esp. since it's usually allocated on the stack. + https://bugzilla.gnome.org/show_bug.cgi?id=518857 + +2011-04-02 14:08:46 +0100 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.h: + baseparse: fix typo in docs for GST_BASE_PARSE_FORMAT_FLAG_PASSTHROUGH + https://bugzilla.gnome.org/show_bug.cgi?id=518857 + +2011-04-02 14:04:42 +0100 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.c: + baseparse: use GQueue instead of GList for queued frames + and make buffer metadata writable before setting caps on queued + buffer. + https://bugzilla.gnome.org/show_bug.cgi?id=646341 + +2011-04-02 13:02:01 +0100 Zaheer Abbas Merali + + * libs/gst/base/gstbaseparse.c: + * libs/gst/base/gstbaseparse.h: + baseparse: add GST_BASE_PARSE_FLOW_QUEUED to queue buffers until caps are known + This is useful for parser like flacparse or h264parse which may need to process + some buffers before they can construct the final caps, in which case they may + want to delay pushing the initial buffers until the full and proper caps are + known. + https://bugzilla.gnome.org/show_bug.cgi?id=646341 + +2011-03-31 15:50:22 +0100 Tim-Philipp Müller + + * docs/libs/gstreamer-libs-docs.sgml: + * docs/libs/gstreamer-libs-sections.txt: + * libs/gst/base/gstbaseparse.c: + * libs/gst/base/gstbaseparse.h: + baseparse: add to docs and fix up gtk-doc markup a little + And add Since markers. + +2011-03-31 14:48:47 +0100 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.c: + * libs/gst/base/gstbaseparse.h: + baseparse: replace set_seek() with _set_average_bitrate() and FLAG_SYNCABLE + This makes more sense conceptually, since the bitrate may be used + to estimate a seek position if there's no seek table or just for + duration reporting/estimation if we can't seek. Also, even if the + format is not syncable, we could still seek by pushing data from the + start and using the segment to make downstream clip. + https://bugzilla.gnome.org/show_bug.cgi?id=518857 + +2011-03-24 17:30:53 +0000 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.c: + * libs/gst/base/gstbaseparse.h: + baseparse: rename GstBaseFormat to GstBaseFormatFlags and fix up associated API + Also change gst_base_parse_set_format(parse,flags,switch_on) to + gst_base_parse_set_format_flags(parse,flags) which is more in line + with the rest of our API and how the function is used. + +2011-03-13 23:43:52 +0000 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.c: + * libs/gst/base/gstbaseparse.h: + baseparse: don't expose GstAdapter in public header + None of the existing subclasses needs access to that, so there's + no reason to expose it for now. + https://bugzilla.gnome.org/show_bug.cgi?id=518857 + +2011-03-13 23:38:12 +0000 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.c: + * libs/gst/base/gstbaseparse.h: + baseparse: move various segment-related members into the private instance struct + If none of the existing subclasses uses these, there's probably no + need to expose them at the moment. Keep the segment itself exposed + though. + https://bugzilla.gnome.org/show_bug.cgi?id=518857 + +2011-03-13 23:30:51 +0000 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.h: + baseparse: remove unused GST_BASE_PARSE_{SINK,SRC}_NAME + https://bugzilla.gnome.org/show_bug.cgi?id=518857 + +2011-03-12 16:16:22 +0000 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.h: + baseparse: re-indent header + +2011-03-12 15:34:33 +0000 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.c: + baseparse: fix up GType name and make _get_type() function thread-safe + Rename GType from GstBaseParseBad to GstBaseParse. + +2011-03-12 15:29:38 +0000 Tim-Philipp Müller + + * libs/gst/base/Makefile.am: + libs: add GstBaseParse which was moved from -bad + +2011-02-23 17:24:14 -0800 David Schleef + + * libs/gst/base/gstbaseparse.c: + baseparse: make_metadata_writable() fix + +2011-02-21 13:24:03 +0000 Tim-Philipp Müller + + * libs/gst/base/gstbaseparse.c: + baseparse: rename GType from GstAudioBaseParseBad to GstBaseParseBad + We use it for video as well now. + +2011-02-18 15:05:31 +0200 Stefan Kost + + * libs/gst/base/gstbaseparse.c: + baseparse: trim trailing whitespace + +2011-02-18 15:05:03 +0200 Stefan Kost + + * libs/gst/base/gstbaseparse.c: + baseparse: use delta-unit flags instead of none + +2011-02-17 13:22:28 -0800 David Schleef + + * libs/gst/base/gstbaseparse.h: + baseparse: update documentation for API changes + +2010-10-13 15:39:55 -0700 David Schleef + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + * libs/gst/base/gstbaseparse.c: + * libs/gst/base/gstbaseparse.h: + baseparse: Create baseparse library + +2011-02-07 14:46:57 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: tune QUERY_SEEKING response + Even if we currently do not have a duration yet, assume seekable if + it looks like we'll likely be able to determine it later on + (which coincides with needed information to perform seeking). + Fixes #641047. + +2011-02-08 23:39:24 +0530 Arun Raghavan + + * gst/audioparsers/gstbaseparse.c: + baseparse: Update min/max bitrate before first posting them + This avoids posting an initial min-bitrate of G_UINTMAX and max-bitrate + of 0. + https://bugzilla.gnome.org/show_bug.cgi?id=641857 + +2011-01-21 14:53:39 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: tune default duration estimate update interval + Rather than a fixed default frame count, estimate frame count to aim for + an interval duration depending on fps if available, otherwise use old + fixed default. + +2011-01-14 15:16:04 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: reverse playback; mind keyframes for fragment boundary + +2011-01-12 14:40:37 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: ensure non-empty candidate frames + +2011-01-11 15:24:23 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: clarify some debug statements + +2011-01-11 15:24:02 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: properly track upstream timestamps + ... rather than with a delay. + +2011-01-11 15:23:29 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: need proper frame duration to obtain sensible frame bitrate + +2011-01-11 15:22:51 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: proper initial values for index tracking variables + +2011-01-11 12:05:13 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: arrange for consistent event handling + +2011-01-10 16:59:59 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.h: + baseparse: header style cleaning + +2011-01-10 17:07:38 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: provide some more initial frame metadata in parse_frame + ... and document accordingly. + +2011-01-10 16:56:36 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: refactor passthrough into format flags + Also add a format flag to signal baseparse that subclass/format can provide + (parsed) timestamp rather than an estimated one. In particular, such "strong" + timestamp then allows to e.g. determine duration. + +2011-01-10 15:34:48 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: introduce a baseparse frame to serve as context + ... and adjust subclass parsers accordingly + +2011-01-07 16:39:51 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: restrict duration scanning to pull mode and avoid extra set_caps call + +2011-01-07 15:58:49 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: update some documentation + Also add some more debug. + +2011-01-06 11:41:44 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: allow increasing min_size for current frame parsing only + Also check that subclass actually either directs to skip bytes or + increases expected frame size to avoid going nowhere in bogus + indefinite looping. + +2011-01-14 15:26:37 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baesparse: fix refactor regression in loop based parsing + +2011-01-06 11:16:56 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: pass all available data to subclass rather than minimum + Also reduce some adapter calls and add a few debug statements. + +2010-12-10 15:59:49 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: fix reverse playback handling + +2010-12-10 14:56:13 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: minor typo and debug statement cleanup + +2010-12-10 14:40:05 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: reduce locking + ... which is either already mute and/or implicitly handled by STREAM_LOCK. + +2011-01-14 14:08:38 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: avoid loop in frame locating interpolation + +2011-01-14 16:30:11 -0300 Thiago Santos + + * gst/audioparsers/gstbaseparse.c: + audioparsers: baseparse: Be careful to not lose the event ref + Don't unref the event if it hasn't been handled, because the caller + assumes it is still valid and might reuse it. + I ran into this problem when transcoding an AVI (with mp3 inside) + to gpp. + https://bugzilla.gnome.org/show_bug.cgi?id=639555 + +2011-01-13 16:27:04 +0000 Tim-Philipp Müller + + * gst/audioparsers/gstbaseparse.c: + docs: minor baseparse docs/comment fixes + Remove copy'n'paste leftovers. + +2010-11-08 19:58:31 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: increase keyframe awareness + ... which is not particular relevant for audio parsing, but more so + in video cases. In particular, auto-determine if dealing with video (caps). + +2010-11-30 15:41:02 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: avoid unexpected stray metadata + +2010-11-30 15:40:28 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: use proper _NONE output value when applicable + +2010-11-25 18:56:42 +0100 Edward Hervey + + * gst/audioparsers/gstbaseparse.c: + audioparsers: Remove dead assignments + +2010-11-25 17:14:23 +0100 Andoni Morales Alastruey + + * gst/audioparsers/gstbaseparse.c: + audioparse: fix possible division-by-zero + https://bugzilla.gnome.org/show_bug.cgi?id=635786 + +2010-11-17 16:23:42 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: use correct offset when adding index entry + ... bearing in mind that BUFFER_OFFSET is media specific and may not + reflect the basic offset after having been parsed. + +2010-11-17 14:30:09 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: enhancements for timestamp marked framed formats + That is, as such formats allow subclass to extract position from frame, + it is possible to extract duration (if not otherwise provided) + from (near) last frame, and a seek can fairly accurately target the required + position. + Fixes #631389. + +2010-11-16 17:06:14 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: refactor frame scanning peformed by _loop + +2010-11-16 18:04:00 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: slightly optimize sending of pending newsegment events + +2010-11-16 17:04:35 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: minor fixes and enhancements + Arrange for upstream as well as downstream flushing when seeking. + Also determine upstream size as well as seekability. Adjust some comments + to reality and employ debug statement in proper order. + +2010-10-29 14:08:58 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: use only upstream duration if it provides one + +2010-10-25 14:15:50 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: reflow update_bitrate code + ... which makes local variables represent real state better, and avoids + triggering unneeded updates/actions. + +2010-10-25 14:13:51 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: add some debug statements + +2010-10-11 17:49:46 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: perform bitrate handling and posting after newsegment sending + +2010-10-11 17:36:19 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: immediately post subclass provided bitrate + +2010-10-05 11:17:52 +0100 Tim-Philipp Müller + + * gst/audioparsers/gstbaseparse.c: + Revert "baseparse: add skip property" + This reverts commit b5a3d60363d837a10f0533c141ec93d10b742312. + Reverting this for now, since no one really seems to remember why this + property exists or what it could possibly be good for. It seems to have + been in the original mp3parse since the beginning of time and was back- + ported from there. + +2010-10-03 23:50:29 +0200 Sebastian Dröge + + * gst/audioparsers/gstbaseparse.c: + audioparser: Let the format string agree with the parameters to fix compiler warning + +2010-09-22 15:44:43 +0530 Arun Raghavan + + * gst/audioparsers/gstbaseparse.c: + baseparse: Fix debug output + We lose the reference to the buffer after gst_pad_push(), so the debug + print should happen before. + https://bugzilla.gnome.org/show_bug.cgi?id=622276 + +2010-09-29 16:12:42 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: support reverse playback + ... in pull mode or upstream driven. + +2010-09-27 12:16:43 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: remove done TODOs and update documentation + +2010-09-25 14:40:54 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: use determined seekability in answering SEEKING query + +2010-09-25 14:32:06 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: add skip property + +2010-09-22 15:07:09 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: use _set_frame_props to configure frame lead_in and lead_out + ... provided a corresponding decoder with sufficient leading and following + frames to carry out full decoding for a particular segment. + +2010-09-22 14:13:17 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: use _set_duration to configure duration update interval + ... as it logically belongs there as one or the other; either subclass + can provide a duration, or an estimate must be made (reguarly updated). + +2010-09-22 13:55:20 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: localize use of provided fps information + +2010-09-22 12:13:12 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: seek table and accurate seek support + +2010-09-21 13:57:10 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: proper and more extended segment and seek handling + That is, loop pause handling, segment seek support, newsegment for gaps, etc + +2010-09-21 10:57:04 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: add index support + +2010-09-21 09:59:56 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: refactor state reset + +2010-09-20 16:39:37 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: prevent indefinite resyncing + +2010-09-20 13:57:55 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: specific EOS handling if no output so far + +2010-09-20 13:31:57 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: adjust _set_frame_prop documentation and set default as claimed + +2010-09-20 13:30:54 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: fix bitrate copy-and-paste and update heuristic + +2010-09-17 18:33:29 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: post duration message if average bitrates is updated + +2010-09-17 18:24:22 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: remove is_seekable vmethod and use a set_seek instead + Seekability, like duration, etc is unlikely to change (frequently), and + the default assumption covers most cases, so let subclass set when needed. + At the same time, allow subclass to indicate if it has seek-metadata (table) + available, and possibly have it provide an average bitrate. + +2010-09-17 17:21:46 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: add another hook for subclass prior to pushing buffer + ... and allow subclass to perform custom segment clipping, or to + emit tags or messages at this time. + +2010-09-17 17:19:37 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: 0 converts to 0 by default + +2010-09-16 18:56:46 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: refactor conversion using helper function and export default convert + +2010-09-16 18:35:47 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: streamline query handling + +2010-09-16 11:51:20 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: cleanup struct and remove unused member + +2010-09-22 16:07:24 +0530 Arun Raghavan + + * gst/audioparsers/gstbaseparse.c: + baseparse: Allow chaining of subclass event handlers + This allows the child class to chain its event handler with + GstBaseParse, so that subclasses don't have to duplicate all the default + event handling logic. + https://bugzilla.gnome.org/show_bug.cgi?id=622276 + +2010-08-27 18:35:10 +0200 Sebastian Dröge + + * gst/audioparsers/gstbaseparse.c: + baseparse: Don't use GST_FLOW_IS_FATAL() + Also don't post an error message for UNEXPECTED and do it + for NOT_LINKED. + +2010-09-06 14:12:00 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: non-TIME seek event is simply not handled + +2010-06-15 15:34:05 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: fix seek event ref handling + +2010-06-15 15:33:37 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: prevent arithmetic overflows in pull mode buffer cache handling + +2010-06-15 15:32:34 +0200 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: fix seek handling + Allow a few more seek event type combinations, and really use the result + of gst_segment_set_seek to perform the seek. Also add some debug. + +2010-03-26 18:56:49 +0000 Arun Raghavan + + * gst/audioparsers/gstbaseparse.c: + baseparse: Don't emit bitrate tags too early + We wait to parse a minimum number of frames (10, arbitrarily) before + emiting bitrate tags so that our early estimates are not wildly + inaccurate for streams that start with a silence. If the stream ends + before that, we just emit the tags anyway. + While it _would_ be nicer to be specify the threshold to start pushing + the tags in terms of duration, this would introduce more complexity than + this merits. + https://bugzilla.gnome.org/show_bug.cgi?id=614991 + +2010-03-26 18:20:24 +0100 Sebastian Dröge + + * gst/audioparsers/gstbaseparse.c: + baseparse: Set the last stop to the buffer starttime if the duration is invalid + ...instead of not setting it at all. + +2010-03-26 18:19:00 +0100 Joshua M. Doe + + * gst/audioparsers/gstbaseparse.c: + baseparse: Send NEWSEGMENT event with correct start and position + Instead of taking the last stop (which could be buffer endtime instead + of starttime) always take the buffer starttime. + Fixes bug #614016. + +2010-03-25 17:09:17 +0000 Tim-Philipp Müller + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + audioparsers: remove unused GstBaseParseClassPrivate structure + +2010-03-25 11:22:58 +0000 Arun Raghavan + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + audioparsers: Add bitrate calculation to baseparse + This makes baseparse keep a running average of the stream bitrate, as + well as the minimum and maximum bitrates. Subclasses can override a + vfunc to make sure that per-frame overhead from the container is not + accounted for in the bitrate calculation. + We take care not to override the bitrate, minimum-bitrate, and + maximum-bitrate tags if they have been posted upstream. We also + rate-limit the emission of bitrate so that it is only triggered by a + change of >10 kbps. + +2010-01-14 11:50:33 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + audioparsers: rename baseparse GType name to avoid possible conflicts + +2010-01-05 15:05:05 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + audioparsers: documentation fixes + +2009-12-21 18:18:39 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: adjust seek handling and newsegment sending + Perform sanity check on type of seek, and only perform one that is + appropriately supported. Adjust downstream newsegment event + to first buffer timestamp that is sent downstream. + +2009-12-21 11:59:45 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: minor refactor cleanup + Also add some debug logging. + +2009-12-18 21:02:40 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: implement leftover draining in pull mode + +2009-12-16 18:38:33 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: provide default conversion using bps if no fps available + Also store estimated duration as such, rather than pretending otherwise + (e.g. set by subclass). + +2009-12-18 13:30:29 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: check for remaining data when draining in push mode + +2009-12-18 13:30:07 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + baseparse: fix pull mode cache size comparison + +2009-12-11 10:25:16 -0800 Michael Smith + + * gst/audioparsers/gstbaseparse.c: + audioparse: fix a format string as reported on irc. + +2009-10-29 15:18:37 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + baseparse: custom bufferflag indicates not to count frame in stats + +2009-11-27 17:27:32 +0100 Mark Nauwelaerts + + * gst/audioparsers/gstbaseparse.c: + audioparsers: reference GstBaseParse now lives here + +2009-11-28 18:13:31 +0100 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + * gst/aacparse/gstbaseparse.h: + * gst/audioparsers/gstbaseparse.c: + * gst/audioparsers/gstbaseparse.h: + audioparsers: rename 'aacparse' plugin to generic 'audioparsers' plugin + +2009-10-29 16:05:00 +0100 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + baseparse: reset passthrough mode to default (disabled) on activation + +2009-10-29 15:16:59 +0100 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + baseparse: ensure buffer metadata is writable + +2009-10-28 14:06:13 +0100 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + * gst/aacparse/gstbaseparse.h: + baseparse: fix/enhance DISCONT marking + In particular, consider DISCONT == !sync, and allow subclass to query + sync state, as it may want to perform additional checks depending + on whether sync was achieved earlier on. + Also arrange for subclass to query whether leftover data is being drained. + +2009-11-23 15:48:25 +0100 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + * gst/aacparse/gstbaseparse.h: + baseparse: add timestamp handling, and default conversion + In particular, (optionally) provide baseparse with a notion of frames per second + (and therefore also frame duration) and have it track frame and byte counts. + This way, subclass can provide baseparse with fps and have it provide default + buffer time metadata and conversions, though subclass can still install + callbacks to handle such itself. + +2009-10-28 12:02:03 +0100 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + baseparse: documentation fixes + +2009-10-28 12:00:08 +0100 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + baseparse: use_fixed_caps for src pad + After all, stream is as-is, and there is little molding to downstream's + taste that can be done. If subclass can and wants to do so, it can + still override as such. + +2009-11-20 17:32:13 +0100 Julien Moutte + + * gst/aacparse/gstbaseparse.c: + aacparse: Fix compilation warnings + +2009-10-11 11:22:11 +0200 Josep Torra + + * gst/aacparse/gstbaseparse.c: + aacparse: fix warnings in macosx snow leopard + +2009-09-25 17:02:53 +0200 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + * gst/aacparse/gstbaseparse.h: + aacparse: forego (bogus) parsing of already parsed (raw) input + +2009-08-07 13:07:17 +0200 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + baseparse: prevent infinite loop when draining + +2009-08-07 13:06:28 +0200 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + baseparse: fix minor memory leak + +2009-07-14 14:08:04 +0200 Sebastian Dröge + + * gst/aacparse/gstbaseparse.c: + * gst/aacparse/gstbaseparse.h: + aacparse: Add function for the baseparse subclass to push buffers downstream + Also handle the case gracefully where the subclass decides to drop + the first buffers and has no caps set yet. It's still required to + have valid caps set when the first buffer should be passed downstream. + +2009-07-14 14:07:44 +0200 Sebastian Dröge + + * gst/aacparse/gstbaseparse.c: + baseparse: Fix seek event leaking + +2009-06-01 13:56:18 +0100 Tim-Philipp Müller + + * gst/aacparse/gstbaseparse.c: + baseparse: propagate return value of GstBaseParse::set_sink_caps() + gst_base_parse_sink_setcaps() presumably should fail if the subclass + returns FALSE from its ::set_sink_caps() function. + +2009-06-01 13:47:01 +0100 Tim-Philipp Müller + + * gst/aacparse/gstbaseparse.c: + baseparse: don't try to GST_LOG an already-freed caps string + The proper way to log caps is via GST_PTR_FORMAT anyway. + +2009-05-26 19:43:53 +0200 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + baseparse: fix debug category + +2009-04-27 22:39:15 +0200 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + baseparse: fix (regression in) newsegment handling + (aacparse, amrparse, flacparse). Fixes #580133. + +2009-04-07 04:53:02 +0300 René Stadler + + * gst/aacparse/gstbaseparse.c: + baseparse: Fix slightly broken buffer-in-segment check (aacparse, amrparse, flacparse) + +2009-04-05 03:50:19 +0300 René Stadler + + * gst/aacparse/gstbaseparse.c: + baseparse: Fix push mode seeking (aacparse, amrparse) + Sending the flush-start event forward before taking the stream lock actually + works, in contrast to deadlocking in downstream preroll_wait (hunk 1). + After that we get the chain function being stuck in a busy loop. This is fixed + by updating the minimum frame size inside the synchronization loop because the + subclass asks for more data in this way (hunk 2). + Finally, this leads to a very probable crash because the subclass can find a + valid frame with a size greater than the currently available data in the + adapter. This makes the subsequent gst_adapter_take_buffer call return NULL, + which is not expected (hunk 3). + +2009-03-31 16:07:46 +0200 Mark Nauwelaerts + + * gst/aacparse/gstbaseparse.c: + baseparse: Delay newsegment as long as possible. + If newsegment is sent (too) early, caps may not yet be fixed/set, + and downstream may not have been linked. + +2009-02-27 11:24:37 +0200 Stefan Kost + + * gst/aacparse/gstbaseparse.c: + baseparse: revert last change and properly fix + Baseparse internaly breaks the semantics of a _chain function by calling it with + buffer==NULL. The reson I belived it was okay to remove it was that there is + also an unchecked access to buffer later in _chain. Actually that code is wrong, + as it most probably wants to set discont on the outgoing buffer. + +2009-02-26 11:02:06 +0200 Stefan Kost + + * gst/aacparse/gstbaseparse.c: + baseparse: remove checks for buffer==NULL + Accordifn to docs for GstPadChainFunction buffer cannot be NULL. If we would + leave the check, we would also need more such check below. + +2009-01-30 18:18:10 +0000 Jan Schmidt + + * gst/aacparse/gstbaseparse.c: + Fix the return value of the default parse_frame function. + Fix the return value of the default parse_frame function in both + copies of GstBaseParse + +2008-11-13 14:21:39 +0000 Stefan Kost + + gst/: Fix baseparse type name. + Original commit message from CVS: + * gst/aacparse/gstbaseparse.c: + * gst/amrparse/gstbaseparse.c: + Fix baseparse type name. + +2008-11-13 12:59:34 +0000 Stefan Kost + + Add two new baseparse based parsers (aac and amr) from Bug #518857. + Original commit message from CVS: + * configure.ac: + * gst/aacparse/Makefile.am: + * gst/aacparse/gstaacparse.c: + * gst/aacparse/gstaacparse.h: + * gst/aacparse/gstbaseparse.c: + * gst/aacparse/gstbaseparse.h: + * gst/amrparse/Makefile.am: + * gst/amrparse/gstamrparse.c: + * gst/amrparse/gstamrparse.h: + * gst/amrparse/gstbaseparse.c: + * gst/amrparse/gstbaseparse.h: + Add two new baseparse based parsers (aac and amr) from Bug #518857. + +2011-03-20 00:56:08 +0100 Havard Graff + + * plugins/elements/gstqueue.c: + * plugins/elements/gstqueue2.c: + queue[2]: Make src query MT-safe + It is possible that the element might be going down while the event arrives + +2011-03-20 00:56:08 +0100 Havard Graff + + * libs/gst/base/gstbasesrc.c: + basesrc: Make src query MT-safe + It is possible that the element might be going down while the event arrives + +2011-04-08 14:56:37 +0200 Sebastian Dröge + + * plugins/elements/gstqueue.c: + * plugins/elements/gstqueue2.c: + queue[2]: Unref events if the parent element disappeared + +2011-03-21 16:01:05 +0100 Havard Graff + + * plugins/elements/gstqueue.c: + * plugins/elements/gstqueue2.c: + queue[2]: Make upstream events MT-safe + +2011-04-08 14:55:09 +0200 Sebastian Dröge + + * libs/gst/base/gstbasesrc.c: + * libs/gst/base/gstbasetransform.c: + base: Unref events if the parent element disappeared + And also unref events if the basetransform subclass has no + event handler and the event is not forwarded at all. + +2011-03-21 16:01:05 +0100 Havard Graff + + * libs/gst/base/gstbasesrc.c: + * libs/gst/base/gstbasetransform.c: + base: Make upstream events MT-safe + +2011-03-29 11:57:06 +0200 Stian Selnes + + * plugins/elements/gstqueue.c: + * plugins/elements/gstqueue2.c: + gstqueue, gstqueue2: check if parent of pad is NULL in _getcaps + Parent of the pad (the queue) may be set to NULL while there is + a buffer alloc going on. + +2011-04-08 14:50:10 +0200 Sebastian Dröge + + * plugins/elements/gstinputselector.c: + inputselector: Fix getcaps and event function from last commit + Return ANY caps if the parent disappeared, i.e. the template caps + and don't leak events if the parent disappeared. + +2011-04-01 08:46:14 +0200 Havard Graff + + * plugins/elements/gstinputselector.c: + inputselector: Protect against pad-parent disappearing + +2010-12-14 16:06:46 +0100 Stian Selnes + + * gst/gstiterator.c: + iterator: resync to avoid infinite loop + +2011-04-08 09:20:28 +0200 Sebastian Dröge + + * tests/check/gst/gstutils.c: + utils: Fix uninitialized variable compiler warnings + +2011-04-08 09:15:10 +0200 Sebastian Dröge + + * gst/gstbus.c: + bus: Removed unused GCond + +2011-04-08 09:07:59 +0200 Sebastian Dröge + + * plugins/elements/gstmultiqueue.c: + multiqueue: Add another check for the flushing flag after taking the lock + This prevents another potential deadlock when flushing the pad + at exactly the right time. + +2011-04-07 11:24:35 +0200 Sebastian Dröge + + * gst/gstbus.c: + bus: Immediately drop messages after calling the sync handler if this is a synchronous bus + Otherwise we might wait forever for the message to be popped from + the queue if a sync handler returned GST_BUS_ASYNC. + https://bugzilla.gnome.org/show_bug.cgi?id=647005 + +2011-04-07 11:19:57 +0200 Sebastian Dröge + + * gst/gst_private.h: + * gst/gstbin.c: + * gst/gstbus.c: + bus: Use a construct-only property to distinguish between child buses and normal buses + This allows to only create the socketpair when it is really required instead + of always creating it and immediately destroying it again for child buses. + https://bugzilla.gnome.org/show_bug.cgi?id=647005 + +2011-04-07 20:47:25 +0100 Tim-Philipp Müller + + * tests/check/Makefile.am: + * tests/check/elements/.gitignore: + * tests/check/elements/queue2.c: + tests: add some basic unit tests for queue2 + +2011-04-07 20:45:22 +0100 Tim-Philipp Müller + + * plugins/elements/gstqueue2.c: + queue2: fix buffer leak on eos when using the ring buffer + +2011-01-11 14:27:35 +0100 Idar Tollefsen + + * plugins/elements/gstqueue2.c: + queue2: Fixes memory leak on out_flushing error in gst_queue2_create_read. + https://bugzilla.gnome.org/show_bug.cgi?id=646972 + +2011-04-07 19:44:44 +0100 Tim-Philipp Müller + + * plugins/elements/gstqueue2.c: + queue2: fix minor memory leak + +2011-04-07 17:34:10 +0100 Tim-Philipp Müller + + * plugins/elements/gstfunnel.c: + funnel: minor element description fix + +2011-04-07 16:08:34 +0300 Stefan Kost + + * docs/random/draft-missing-plugins.txt: + docs: remove file as we have docs/design/part-missing-plugins.txt + +2011-04-07 10:48:04 +0200 Sebastian Dröge + + * libs/gst/base/gstbasesrc.c: + basesrc: Handle tag and custom downstream events the same + Especially drop tag events when flushing to not send them over + and over again. + Should've been in the last commit already but I forgot to call + git rebase --continue... + +2011-04-07 10:40:16 +0200 Sebastian Dröge + + * libs/gst/base/gstbasesrc.c: + bla + +2011-04-07 10:29:41 +0200 Sebastian Dröge + + * libs/gst/base/gstbasesrc.c: + basesrc: Send syncronized custom downstream/both events downstream from the streaming thread + Instead of just silently dropping them. The same was done for tag events + before already. + Fixes bug #635718. + +2011-04-06 14:06:49 +0200 Sebastian Dröge + + * gst/gst_private.h: + * gst/gstbin.c: + * gst/gstbus.c: + bus: Add private API to set a GstBus in child mode + This is used by GstBin to create a child bus without + a socketpair because child buses will always work + synchronous. Otherwise too many sockets could be + created and the limit of file descriptors for the + process could be reached. + Fixes bug #646624. + +2011-04-06 13:56:49 +0200 Sebastian Dröge + + * gst/gstbus.c: + Revert "bus: Only create the signalling socket pair when required" + This reverts commit 4bf8f1524f6e3374b3f3bc57322337723d06b928. + +2011-04-06 13:56:46 +0200 Sebastian Dröge + + * gst/gstbus.c: + Revert "bus: Check if pending messages are in the queue" + This reverts commit bd1c40011434c1efaa696dc98ef855ef9cce9b28. + +2011-04-06 11:38:57 +0100 Tim-Philipp Müller + + * tests/check/gst/gstbin.c: + checks: make tests_many_bins in bin unit test a bit faster + Not doing expensive checks when linking elements makes things + much faster. + +2011-04-06 11:30:18 +0100 Tim-Philipp Müller + + * tests/check/gst/gstbin.c: + checks: add some queues to test_many_bins unit test + To limit the number of calls in a row per thread. + +2011-04-06 12:03:18 +0200 Sebastian Dröge + + * gst/gstbus.c: + bus: Check if pending messages are in the queue + We can't rely completely on the poll fd because the fd might be + created after messages were posted to the bus. + +2011-04-06 11:45:27 +0200 Sebastian Dröge + + * tests/check/gst/gstvalue.c: + value: GstDate/GDate has a abbreviation now + +2011-04-03 16:11:50 +0100 Tim-Philipp Müller + + * tests/check/gst/gstbin.c: + checks: add GstBin unit test that creates a lot of bins + Currently fails (in normal circumstances) because we create a + socket pair for each bin's bus and exhaust the number of available + file descriptors. + https://bugzilla.gnome.org/show_bug.cgi?id=646624 + +2011-04-05 16:22:48 +0200 Sebastian Dröge + + * gst/gstbus.c: + bus: Only create the signalling socket pair when required + Otherwise a new one would be created for every single bus and + the process could easily run out of file descriptors. + Fixes bug #646624. + +2011-04-05 14:36:43 +0200 Sebastian Dröge + + * gst/gststructure.c: + structure: Add date as a type abbreviation of GDate + See bug #646696. + +2011-04-04 15:56:30 +0300 Stefan Kost + + * common: + Automatic update of common submodule + From 1ccbe09 to c3cafe1 + +2011-04-04 03:33:46 +0200 Andoni Morales Alastruey + + * gst/gstpoll.c: + gstpoll: retry reading the control socket to release properly all wakeups + if set->control_pending is set to 0 but we didn't not succed reading + the control socket, future calls to gst_poll_wait() will be awaiken + by the control socket which will not be released properly because + set->control_pending is already 0, causing an infinite loop. + +2011-04-04 10:18:14 +0200 Sebastian Dröge + + * gst/gststructure.c: + structure: Don't allow invalid GDates in all structures and don't allow NULL GDates in taglists + Some code (e.g. gstvorbistag.c) assumes non-NULL GDates in taglists and + explodes otherwise and NULL or invalid GDates don't make much sense anyway. + +2011-03-25 15:56:07 +0100 Thomas Kristensen + + * gst/gstpoll.c: + poll: don't call WSAWaitForMultipleEvents with no events + Fixes error caught by Microsoft Application Verifier. + +2011-04-03 16:18:54 +0100 Tim-Philipp Müller + + * gst/gstevent.h: + docs: add pointer to part-seeking.txt design docs to event seek flags docs + +2011-04-03 16:18:14 +0100 Tim-Philipp Müller + + * tests/check/elements/.gitignore: + checks: ignore new funnel unit test binary + +2011-04-02 14:51:18 +0100 Bastien Nocera + + * gst/gstutils.h: + utils: Avoid using "type" as name for a variable and a macro argument in GST_BOILERPLATE + This caused "re-declaration" problems. + ./clutter-gst-video-sink.c: In function ‘clutter_gst_video_sink_init_interfaces’: + ./clutter-gst-video-sink.c:231:1: warning: declaration of ‘ClutterGstVideoSink’ shadows a global declaration [-Wshadow] + ./clutter-gst-video-sink.h:64:44: warning: shadowed declaration is here [-Wshadow] + https://bugzilla.gnome.org/show_bug.cgi?id=646531 + +2011-04-01 13:56:09 +0200 Sebastian Dröge + + * gst/gstelement.c: + element: When requesting an existing pad print a g_critical() instead of using an assertion + Some applications are requesting the same pad name multiple times + and the behaviour is undefined and different from element to element + but we don't want to break applications that work just fine. + In 0.11 this check should be an assertion again, although elements + have to do manual checking if the pad already exists again because + it can't be done in a threadsafe way here. + +2011-04-01 13:53:39 +0200 Sebastian Dröge + + * gst/gstelement.c: + element: Use gint64/guint64 string parsing functions + And check that the requested pad names are inside the valid + gint/guint range. + +2011-04-01 13:51:31 +0200 Josep Torra + + * gst/gstelement.c: + element: strto[u]l() returns a g[u]long + +2011-03-31 19:25:30 +0100 Tim-Philipp Müller + + * docs/design/part-seeking.txt: + design docs: document expected behaviour for ACCURATE and KEY_UNIT seek flags + +2011-03-31 10:53:03 +0200 Sebastian Dröge + + * tests/check/gst/struct_x86_64.h: + gstabi: Add some new structures for x86-64 + +2011-03-31 10:46:40 +0200 Sebastian Dröge + + * tests/check/libs/libsabi.c: + * tests/check/libs/struct_x86_64.h: + libsabi: Add lots of new structures for x86-64 + +2011-03-30 10:48:47 +0200 Sebastian Dröge + + * plugins/elements/gstmultiqueue.c: + * tests/check/elements/multiqueue.c: + multiqueue: Make assignment of queue IDs and pad names threadsafe + Also add a test for naming pads by the caller and return NULL + when requesting an already existing pad. + +2011-03-29 23:58:43 +0200 Andreas Frisch + + * plugins/elements/gstmultiqueue.c: + multiqueue: Set the single queue ID to the ID of the requested pad if one was given by the caller + +2011-03-29 16:22:46 +0200 Sebastian Dröge + + * gst/gstelement.c: + element: Fix sanity checks for request pad templates without % + +2011-03-29 11:57:58 +0200 Sebastian Dröge + + * gst/gstelement.c: + element: Add some more sanity checks to the pad name checking of request pads in all cases + Especially check if a pad with that name already exists. + +2011-03-29 11:52:06 +0200 Sebastian Dröge + + * gst/gstelement.c: + element: Check %u too when trying to find a pad template for a request pad + +2011-03-28 21:01:13 +0200 Fraxinas + + * plugins/elements/gstmultiqueue.c: + multiqueue: Fix arbitrary sink + source pad naming + Use the string provided by the caller for the sinkpad name + if possible. Note that all sanity checking for this name + is already done in GstElement. + Fixes Bug #645931 + +2011-03-29 11:18:36 +0200 Sebastian Dröge + + * plugins/elements/gstfunnel.c: + funnel: Add some more documentation about the behaviour of funnel + +2011-03-29 11:08:57 +0200 Sebastian Dröge + + * plugins/elements/gstfunnel.c: + funnel: Send a newsegment event after flush-stop + +2011-03-29 11:07:48 +0200 Sebastian Dröge + + * plugins/elements/gstfunnel.c: + funnel: Some random cleanup + +2011-03-29 10:56:00 +0200 Sebastian Dröge + + * plugins/elements/gstfunnel.c: + funnel: Use a GstPad subclass for the sinkpads instead of using the pad's element private data + +2011-03-29 10:42:31 +0200 Sebastian Dröge + + * docs/plugins/gstreamer-plugins-docs.sgml: + * docs/plugins/gstreamer-plugins-sections.txt: + * docs/plugins/gstreamer-plugins.hierarchy: + * docs/plugins/inspect/plugin-coreelements.xml: + * docs/plugins/inspect/plugin-staticelements.xml: + * plugins/elements/Makefile.am: + * plugins/elements/gstelements.c: + * plugins/elements/gstfunnel.c: + * plugins/elements/gstfunnel.h: + * tests/check/Makefile.am: + * tests/check/elements/funnel.c: + funnel: Integrate into the build system and rename the types + +2011-03-29 10:39:42 +0200 Sebastian Dröge + + * plugins/elements/gstfunnel.c: + * plugins/elements/gstfunnel.h: + * tests/check/elements/funnel.c: + funnel: Import funnel element from farsight2 + +2011-03-28 21:21:00 +0530 Arun Raghavan + + * gst/gstbin.c: + * libs/gst/base/gstbasesrc.c: + basesrc: Return FALSE if we don't handle an event + basesrc's default event handler returns TRUE regardless of whether the + event is handled or not. This fixes the handler to conform with the + expected behaviour (which is to only return TRUE when the event has + actually benn handled). gst_bin_do_latency_func() depended on this + (incorrect) behaviour, and is now modified as well. + (Remaining 1-liner change in gstbasesrc.c is to keep gst-indent happy) + +2011-03-25 22:08:41 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From 193b717 to 1ccbe09 + +2011-03-25 14:55:39 +0200 Stefan Kost + + * common: + Automatic update of common submodule + From b77e2bf to 193b717 + +2011-03-25 09:27:58 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From d8814b6 to b77e2bf + +2011-03-25 08:59:37 +0100 Sebastian Dröge + + * common: + Automatic update of common submodule + From 6aaa286 to d8814b6 + +2011-03-24 18:48:41 +0200 Stefan Kost + + * common: + Automatic update of common submodule + From 6aec6b9 to 6aaa286 + +2011-03-24 18:27:09 +0200 Stefan Kost + + * docs/plugins/gstreamer-plugins-sections.txt: + * plugins/elements/gstqueue.h: + docs: fix some gtk-doc warnings + Document the queue leaky enums. + +2011-03-24 18:25:08 +0200 Stefan Kost + + * plugins/elements/gstqueue2.c: + queue2: set max value for to the matching one for the datatype + The property is guint64, so use G_MAXUINT64 instead of G_MAXUINT. + +2011-03-24 13:22:57 +0200 Stefan Kost + + * libs/gst/base/gstbasesrc.c: + * libs/gst/base/gstbasesrc.h: + * libs/gst/base/gstbasetransform.h: + * libs/gst/base/gstcollectpads.c: + docs: cleanup and xref fixes + Deal with the hints from gtk-doc and fix the xrefs. Apply a work-around for () + precedence over @. Move "MT Safe" text to doc body in many places. Trim eol + whitespaces. + +2011-03-23 16:42:24 +0200 Stefan Kost + + * libs/gst/base/gstbasesink.c: + basesink: print flow return as a name in debug log + +2011-03-23 17:13:58 +0200 Stefan Kost + + * docs/libs/Makefile.am: + * docs/plugins/Makefile.am: + docs: do xrefs for non installed books too + Get the xrefs from the builddir for the books in the same packages. This fixes + the cross references if one does not have the docs already installed. + +2010-04-19 20:39:53 +0200 Edward Hervey + + * libs/gst/base/gstbasesrc.c: + basesrc: Keep downstream caps order when fixating + This allows use to use the first intersecting format prefered by downstream. + https://bugzilla.gnome.org/show_bug.cgi?id=617045 + +2010-04-19 20:40:56 +0200 Edward Hervey + + * libs/gst/base/gstbasetransform.c: + basetransform: Retain caps order when getting caps + If the element gave us caps in a specific order, let's retain that + by intersecting against the template but retaining the order given + by the element. + https://bugzilla.gnome.org/show_bug.cgi?id=617045 + +2011-02-25 10:25:26 -0300 Thiago Santos + + * tests/check/gst/gstcaps.c: + tests: caps: Tests for the new caps intersection mode + Adds test cases for the caps 'first' intersect mode + Adds another test for the 'zigzag' mode + Fixes #617045 + +2011-02-25 08:50:12 -0300 Edward Hervey + + * gst/gst.c: + * gst/gstcaps.c: + * gst/gstcaps.h: + * win32/common/libgstreamer.def: + gstcaps: new API : gst_caps_intersect_full + Just like gst_caps_intersect, but adds a new parameter 'mode' + that allows selecting the intersection algorithm to use. + Currently we have GST_CAPS_INTERSECT_MODE_ZIG_ZAG (default) and + GST_CAPS_INTERSECT_MODE_FIRST. + API: gst_caps_intersect_full + API: GstCapsIntersectMode + API: GST_CAPS_INTERSECT_MODE_ZIG_ZAG + API: GST_CAPS_INTERSECT_MODE_FIRST + https://bugzilla.gnome.org/show_bug.cgi?id=617045 + +2011-03-12 17:01:39 +0000 Tim-Philipp Müller + + * tests/check/Makefile.am: + * tests/check/libs/.gitignore: + * tests/check/libs/gstlibscpp.cc: + tests: add libscpp unit test to make sure g++ likes our library headers + +2011-03-12 16:58:01 +0000 Tim-Philipp Müller + + * libs/gst/base/gstbytereader.h: + * libs/gst/base/gstbytewriter.h: + bytereader, bytewriter: fix up inline functions to make g++ happy + gstbytereader.h: In function ‘guint8* gst_byte_reader_dup_data_unchecked(GstByteReader*, guint)’: + gstbytereader.h:249:75: error: invalid conversion from ‘void*’ to ‘guint8*’ + gstbytewriter.h: In function ‘gboolean _gst_byte_writer_ensure_free_space_inline(GstByteWriter*, guint)’: + gstbytewriter.h:196:75: error: invalid conversion from ‘void*’ to ‘guint8*’ + https://bugzilla.gnome.org/show_bug.cgi?id=645595 + +2011-03-22 16:26:56 -0300 Thiago Santos + + * gst/gstelement.h: + gstelement: Fix typo in the docs + GST_ELEMENT_INFO will post a INFO message, not a WARNING + +2011-03-18 08:22:23 -0300 Thiago Santos + + * gst/gsttagsetter.c: + tagsetter: Removing unused debug category + tagsetter's debug category had a typo and was unused. Removing it. + +2011-03-18 19:34:57 +0100 Luis de Bethencourt + + * autogen.sh: + autogen: wingo signed comment + +2011-03-22 11:04:20 +0100 Sebastian Dröge + + * plugins/elements/gstmultiqueue.c: + multiqueue: Don't leak objects when flushing after dequeueing and before pushing the object + +2011-03-21 17:54:10 +0100 Sebastian Dröge + + * plugins/elements/gstmultiqueue.h: + multiqueue: Really remove unused variable + +2011-03-21 17:52:13 +0100 Sebastian Dröge + + * plugins/elements/gstmultiqueue.c: + * plugins/elements/gstmultiqueue.h: + multiqueue: Increment unique item counter with atomic operations + Before it was only protected by the stream lock but every pad + has its own stream lock, making the protection rather useless. + +2011-03-21 17:17:22 +0100 Sebastian Dröge + + * plugins/elements/gstmultiqueue.c: + multiqueue: Unblock all waiting pads when shutting down + +2011-03-21 12:39:34 +0100 Sebastian Dröge + + * plugins/elements/gstmultiqueue.c: + multiqueue: Remove unused variable + +2011-03-21 16:28:37 +0100 Sebastian Dröge + + * plugins/elements/gstmultiqueue.c: + multiqueue: Exit loop function if the pad is flushing + Fixes possible deadlocks when flushing an unlinked pad that waits + for other pads to advance. + +2011-03-19 17:06:12 -0500 Jason D. Clinton + + * gst/gstpoll.c: + * libs/gst/controller/gstinterpolation.c: + * plugins/elements/gstfilesrc.c: + build: fix build with -Werror with GCC 4.6.0 + This touches three areas of code, removes unused variables and discards + return values from two functions with (void). + https://bugzilla.gnome.org/show_bug.cgi?id=645267 + +2011-03-19 10:39:28 +0100 Sebastian Dröge + + * gst/gstevent.h: + event: Add since marker to GST_EVENT_SINK_MESSAGE + +2011-03-19 08:55:57 +0100 Sebastian Dröge + + * plugins/elements/gstinputselector.c: + inputselector: Stop waiting for a pad switch when the pad is flushing + +2011-03-19 08:50:06 +0100 Sebastian Dröge + + * plugins/elements/gstinputselector.c: + inputselector: Move locking and signalling macros from the header to the source file + +2011-03-17 23:42:48 +0000 Tim-Philipp Müller + + * gst/gsttask.h: + task: fix GST_TASK_BROADCAST + Surprisingly enough, you can't "breadcast" on a GCond. + Spotted by Rune Sætre. + https://bugzilla.gnome.org/show_bug.cgi?id=645022 + +2011-03-17 14:21:17 +0100 Sebastian Dröge + + * plugins/elements/gstinputselector.c: + inputselector: Hold the selector lock while reading properties of the active pad + +2011-03-17 14:10:49 +0100 Sebastian Dröge + + * plugins/elements/gstinputselector.c: + inputselector: Make sure that EOS is always sent downstream for the active pad + It can happen that the currently active pad got the EOS event + before it was activated and the previously active pad got the + EOS event after it was deactivated. In that case we have to + send the EOS event from an inactive pad downstream. + +2011-03-16 18:19:11 +0100 Sebastian Dröge + + * plugins/elements/gstinputselector.c: + inputselector: Return GST_FLOW_OK until the selected pad pushed something downstream + This makes sure that during switches at no point in time all pads + have returned not-linked, which can happen when playing an audio-only + file with playbin2 and switching between the streams for example. + Fixes bug #644935. + +2011-03-16 12:01:21 +0100 Sebastian Dröge + + * gst/gstpad.c: + pad: Document that pad blocks only make sense for sink pads in pull mode and src pads in push mode + See bug #644907. + +2011-03-16 11:53:53 +0100 Sebastian Dröge + + * gst/gstghostpad.c: + ghostpad: The internally linked pad of the proxypad is the ghostpad + Previously we were returning the peerpad, which is the target + of the ghostpad. + +2011-02-25 16:20:49 +0100 Jonas Holmberg + + * gst/gstbufferlist.c: + * tests/check/gst/gstbufferlist.c: + bufferlist: Use a GQueue instead of a GList + Adding a buffer to the end of a GstBufferList is supposed to be a fast + operation, but it was not since the iterator does not advance its + nextpointer when adding buffers and GList does not have a tail pointer. + Using a GQueue to store the buffers makes it easier to add buffers to + the end of the list and this operation will now be much more efficient. + Adding an entire GList of buffers using + gst_buffer_list_iterator_add_list() will however have to iterate over + the list being added to be able to update the tail pointer in the + GQueue. + +2011-03-10 17:48:26 +0000 Tim-Philipp Müller + + * gst/gstutils.c: + * win32/common/libgstreamer.def: + utils: fix ABI break when compiling gstreamer with -DGST_DISABLE_DEPRECATED + GST_DISABLE_DEPRECATED should only affect visibility of declarations in headers, + not actually remove symbols. See GitDeveloperGuidelines and DeprecatingAPI + pages in wiki. + https://bugzilla.gnome.org/show_bug.cgi?id=402141 + +2011-03-10 16:46:04 +0100 Edward Hervey + + * win32/common/libgstreamer.def: + win32: Update .def file for API addition + +2011-03-09 16:15:33 +0200 Stefan Kost + + * docs/pwg/advanced-types.xml: + pwg: fix element name "videodrop" to "videorate" + +2011-03-08 12:11:08 +0200 Stefan Kost + + * tests/check/gst/gstelementfactory.c: + test: add tests for new element_factory api. + +2010-06-23 22:00:04 +0200 Thijs Vermeir + + * gst/gstutils.c: + * gst/gstutils.h: + * win32/common/libgstreamer.def: + gstutils: replace gst_element_factory_can_{sink,src}_caps + Add new functions to clarify how the caps are compared to the template caps of + the element factory. Improve the docs to point out the difference. + Deprecate: gst_element_factory_can_{src|sink}_caps + API: add gst_element_factory_can_{src|sink}_{any|all}_capps + https://bugzilla.gnome.org/show_bug.cgi?id=402141 + +2011-03-07 23:13:56 +0200 Stefan Kost + + * tests/check/gst/gstcaps.c: + tests: add a unit test for gst_caps_new_simple + Add a test for the crash in bug #642271. + +2011-03-08 11:55:29 +0200 Stefan Kost + + * tests/check/gst/gstelementfactory.c: + tests: add test to create a factory + +2011-03-08 10:36:30 +0200 Stefan Kost + + * tests/check/Makefile.am: + * tests/check/gst/.gitignore: + * tests/check/gst/gstelement.c: + * tests/check/gst/gstelementfactory.c: + tests: start a new test suite for element factories + Move one test from gstelement suite. + +2011-03-08 11:34:19 +0200 Stefan Kost + + * gst/gstpadtemplate.c: + padtemplate: add missing ; in example (and trim whitespace) + +2011-03-08 09:58:55 +0200 Stefan Kost + + * gst/gststructure.c: + structure: gst_structure_empty_new() does better error checking + No need to check for media_type!=NULL as the function we call that actual create + the structure does a full check anyway. + +2011-03-08 10:06:23 +0200 Stefan Kost + + * gst/gstcaps.c: + * gst/gststructure.c: + caps,structure: trim trailing whitespace + +2011-03-04 08:28:25 +1000 Jonathan Matthew + + * gst/gstcaps.c: + caps: don't create broken caps for invalid media types + Check if structure has been created before appending it to the caps. Free the + caps in the case of an error to not conceal it be returning empty caps. + Fixes #642271 + +2011-03-07 16:21:47 +0200 Stefan Kost + + * tests/examples/helloworld/helloworld.c: + examples: update hello world example + Our helloworld example thatw e reference from the manual has been a bit + complicated to serve a first contact with gstreamer. Since we have and + promote playbin2 as a playback api use it here. + Based on work from Mathias Hasselmann + Fixes #424143 + +2011-03-02 13:55:36 +0530 Arun Raghavan + + * docs/faq/git.xml: + faq: Minor update to ssh key generation commands + fd.o requires RSA keys, and in general, users would probably want to + make a per-server key file rather than overwrite id_rsa, id_rsa.pub. + +2011-02-28 18:43:41 +0100 Mark Nauwelaerts + + * configure.ac: + configure.ac: export plugin description more platform independent + Fixes #642504. + +2011-02-28 18:32:07 +0100 Mark Nauwelaerts + + * common: + Automatic update of common submodule + From 1de7f6a to 6aec6b9 + +2011-02-28 15:01:54 +0000 Tim-Philipp Müller + + * gst/gstregistry.h: + * gst/gstutils.c: + * libs/gst/controller/gsthelper.c: + docs: typo fixes + convinience -> convenience + +2011-02-28 14:56:23 +0000 Tim-Philipp Müller + + * tools/gst-inspect.c: + tools: print "pad-added", "pad-removed" and "no-more-pads" signals for elements with sometimes pads + It's often not obvious to people that elements like e.g. uridecodebin + (or demuxers) automatically support the standard signals of the + GstElement class, so let's print the useful pad-related ones for + elements with sometimes pads. + +2011-02-28 16:27:01 +0200 Stefan Kost + + * gst/gstutils.c: + docs: small updates as suggested on a blog + Link from convinience api to the underlying api. + +2011-02-24 17:11:49 +0000 Tim-Philipp Müller + + * gst/gsturi.c: + uri: make win32 buildbot happy + gsturi.c:854:16: error: unused variable 'abs_clean' + gsturi.c:788:1: error: 'gst_file_utils_canonicalise_path' defined but not used + +2011-02-24 15:32:00 +0000 Tim-Philipp Müller + + * plugins/elements/gstfilesink.c: + * plugins/elements/gstfilesrc.c: + * tests/check/elements/filesrc.c: + filesrc, filesink: fix URI creation regression for non-absolute locations + Passing e.g. location=foo would lead to warnings because g_filename_to_uri() + wants an absolute file path and returns NULL otherwise. Use brand-new + gst_filename_to_uri() instead, which will try harder to create a proper + URI for us. + Also add unit test. + +2011-02-24 15:18:43 +0000 Tim-Philipp Müller + + * docs/gst/gstreamer-sections.txt: + * gst/gsturi.c: + * gst/gsturi.h: + * win32/common/libgstreamer.def: + uri: add gst_filename_to_uri() that takes relative filenames + Add function that (unlike the GLib equivalent) also accepts paths that + aren't absolute and will clean up relative markers such as ./ and ../ + before forming a URI. + Fixes warnings with e.g. filesrc location=foo ! typefind caused by the + recent switch to g_filename_to_uri(), but also actually creates valid + URIs for the first time. + Windows code paths could need some more work, e.g. we don't clean up + the relative markers there for now (because path could have \ and / + as separators). + API: gst_filename_to_uri() + +2011-02-24 16:20:01 +0200 Stefan Kost + + * tests/check/gst/gstabi.c: + * tests/check/libs/libsabi.c: + tests: refix the tests (missing #endif) + +2011-02-24 16:11:17 +0200 Stefan Kost + + * tests/check/Makefile.am: + Makefile.am: add new abi headers to nodist_HEADERS + +2011-02-21 11:24:45 +0200 Stefan Kost + + * tools/gst-launch.1.in: + * tools/gst-launch.c: + gst-launch: add index support + When option "-i" is given, set an index object on the pipeline and compute + statistics for all index writers. Print a sumary when shutting down the + pipeline. + +2011-02-24 15:12:14 +0200 Stefan Kost + + * tests/check/libs/libsabi.c: + * tests/check/libs/struct_arm.h: + tests: add abi check data for ARM (libs) + +2011-02-24 15:02:37 +0200 Stefan Kost + + * tests/check/gst/gstabi.c: + * tests/check/gst/struct_arm.h: + tests: add abi check data for ARM + +2011-02-23 12:33:58 +0200 Stefan Kost + + * docs/gst/running.xml: + docs: tell that ORC_CODE can contain a list of flags + +2011-02-14 18:05:09 -0300 Thiago Santos + + * libs/gst/base/gstbasetransform.c: + * tests/check/libs/transform1.c: + basetransform: Be smarter with pad allocs + Avoid doing unnecessary pad-allocs when on passthrough mode. + If multiple basetransform elements are on a pipeline, they + would do a pad-alloc for each received buffer, each element + would do this, so we would have lots of pad allocs on the + pipeline for a single buffer being pushed through it. + This patch attempts to reduce this amount by avoiding + doing pad-allocs if the element has already done it + after the last pushed buffer. So it will only be allowed + to do a new pad-alloc after it has pushed a buffer, so we get + 1x1 pad-alloc and buffer ratio + https://bugzilla.gnome.org/show_bug.cgi?id=642373 + +2011-02-21 13:39:38 +0100 Philip Jägenstedt + + * gst/gstindex.c: + docs: fix typo in gst_index_new() docs + https://bugzilla.gnome.org/show_bug.cgi?id=642869 + +2011-02-21 12:44:05 +0000 Tim-Philipp Müller + + * plugins/elements/gstfakesink.c: + fakesink: print new MEDIA4 flag as well + +2011-01-03 11:37:05 +0100 Robert Swain + + * gst/gstbuffer.h: + * gst/gstminiobject.h: + miniobject, buffer: steal miniobject flag for use as MEDIA4 buffer flag + This was required to add a new MEDIA4 buffer flag for indicating + progressive/mixed telecine video buffers. There is no space for + additional flags in GstBuffer, so steal one from GstMiniObject. + https://bugzilla.gnome.org/show_bug.cgi?id=642671 + +2011-02-20 16:11:27 +0000 Tim-Philipp Müller + + * gst/gstatomicqueue.c: + * gst/gstatomicqueue.h: + docs: add some more Since: markers to atomic queue docs + +2011-02-21 11:55:50 +0100 Edward Hervey + + * gst/gstelement.c: + Revert "element: Call ->release_pad() to clean up pad" + This commit changes the request pad behaviour for plugins and applications. + Reopens Bug #402562 + The proper fix for that bug is to keep track of created request pads. + This reverts commit a5e44ffffaa6d7a8d7af8dcb77e37990996253a5. + +2011-02-21 10:03:16 +0200 Stefan Kost + + * gst/gstindex.c: + index: add FIXME-0.11: comments + +2011-02-15 10:57:08 +0200 Stefan Kost + + * gst/gstindex.c: + docs: improve index docs + +2011-02-18 17:09:14 +0200 Stefan Kost + + * docs/design/part-progress.txt: + docs: spell-check + +2011-02-15 19:15:16 -0800 David Schleef + + * plugins/elements/gstfakesink.c: + fakesink: print buffer flags + +2010-12-04 18:53:55 -0800 David Schleef + + * gst/gstelement.c: + element: Call ->release_pad() to clean up pad + Fixes #636011 and #402562. + +2011-02-17 14:50:40 +0200 Stefan Kost + + * gst/gstindex.c: + index: fix creation of writer id for unparented pads + Also do some cleanup in the impl. + +2011-02-17 10:34:37 +0000 Tim-Philipp Müller + + * gst/gstvalue.c: + * tests/check/gst/gstvalue.c: + value: add (de)serialisation function for uchar + .. since we sadly have a plugin in -good that has a uchar property + (cmmlenc) + https://bugzilla.gnome.org/show_bug.cgi?id=642522 + +2011-02-16 19:54:57 +0100 Wim Taymans + + * gst/gstatomicqueue.c: + atomicqueue: fix include order atomicqueue: fix include order# Please enter the commit message for your changes. Lines starting + +2010-10-28 13:27:43 +0100 Wim Taymans + + * gst/gstbus.c: + * gst/gstbus.h: + bus: make the bus almost lockfree + Use new GstPoll functionality to wakeup the mainloop. + Use an atomic queue on the writer side to post the messages. + The reader side it protected with the lock still because we don't want multiple + concurrent readers. + +2011-02-16 17:21:52 +0100 Wim Taymans + + * win32/common/libgstreamer.def: + defs: fix defs file for new symbols + +2011-02-16 17:14:11 +0100 Wim Taymans + + * gst/gstatomicqueue.c: + atomicqueue: use correct array sizes + +2011-02-16 16:21:58 +0100 Wim Taymans + + * gst/gstatomicqueue.c: + atomicqueue: fix docs some more + +2011-02-16 16:19:46 +0100 Wim Taymans + + * docs/gst/gstreamer-docs.sgml: + * docs/gst/gstreamer-sections.txt: + * gst/gstatomicqueue.c: + * gst/gstatomicqueue.h: + atomicqueue: add refcounting and docs + +2011-02-16 12:48:59 +0100 Wim Taymans + + * gst/gstatomicqueue.c: + atomicqueue: make sure a min initial_size is used + +2010-10-28 16:02:39 +0100 Wim Taymans + + * gst/Makefile.am: + * gst/gstatomicqueue.c: + * gst/gstatomicqueue.h: + atomicqueue: add an atomic queue + Add an atomic queue. The queue can be used from multiple threads simultaneously + and without taking any locks or doing any blocking operations. This makes it + highly scalable for things like the bus, bufferpools and object recycling. + +2011-02-16 17:14:46 +0100 Wim Taymans + + * tests/check/gst/gstbus.c: + check: fix a leak in the bus unit test + +2011-02-16 17:28:15 +0100 Wim Taymans + + * gst/gst.c: + deinit: add progress type class unref + +2011-02-16 15:13:05 +0200 Stefan Kost + + * gst/gstutils.c: + utils: tell also what pad a pad is already linked against + +2011-02-15 22:56:35 +0100 Sebastian Dröge + + * tests/check/elements/filesink.c: + * tests/check/elements/filesrc.c: + file{sink,src}: Check if non-URI characters are escaped, but only for the URI not the location property + +2011-02-15 22:49:26 +0100 Sebastian Dröge + + * tests/check/elements/filesink.c: + * tests/check/elements/filesrc.c: + file{src,sink}: Fix unit tests + filesink and filesrc should return exactly the same URI as passed + and must not escape path separators. + +2011-02-15 22:48:44 +0100 Sebastian Dröge + + * plugins/elements/gstfilesink.c: + filesink: Fix escaping of URIs + Especially don't escape / as path separators + +2011-02-15 22:05:31 +0100 Andoni Morales Alastruey + + * plugins/elements/gstfilesrc.c: + filesrc: Fix escaping of file uris + Fixes bug #642393. + +2011-02-15 18:26:00 +0100 Wim Taymans + + * gst/gstmessage.c: + * gst/gstquark.c: + * gst/gstquark.h: + message: add timeout to progress message + Add a timeout member to the progress messages to let the application know about + the timeout so that it can do some gui things with it. + +2011-02-15 18:14:16 +0100 Wim Taymans + + * docs/design/part-progress.txt: + design: mention timeout in the progress message + +2011-02-15 17:20:08 +0100 Wim Taymans + + * docs/design/draft-progress.txt: + * docs/design/part-progress.txt: + design: make progress draft official + +2011-01-06 18:55:43 +0100 Wim Taymans + + * docs/design/draft-progress.txt: + * gst/gstmessage.c: + * gst/gstmessage.h: + * gst/gstquark.c: + * gst/gstquark.h: + message: rename category to code + +2011-01-06 15:58:47 +0100 Wim Taymans + + * gst/gstmessage.c: + message: add new message quark + +2011-01-06 15:58:23 +0100 Wim Taymans + + * docs/design/draft-progress.txt: + docs: add more standard categories + +2011-01-05 13:53:00 +0100 Wim Taymans + + * gst/gst.c: + gst: register new type + +2011-01-05 13:48:51 +0100 Wim Taymans + + * tests/check/gst/gstmessage.c: + check: add progress message unit test + +2011-01-05 13:41:08 +0100 Wim Taymans + + * docs/gst/gstreamer-sections.txt: + * gst/gstmessage.c: + * gst/gstmessage.h: + * gst/gstquark.c: + * gst/gstquark.h: + * win32/common/libgstreamer.def: + message: add progress message functions + +2011-01-05 13:39:19 +0100 Wim Taymans + + * docs/design/draft-progress.txt: + docs: update progress field + Avoid naming the progress free text field 'message' as it conflicts with the + message itself. + +2011-02-15 14:42:58 +0100 Mark Nauwelaerts + + * plugins/elements/gstqueue2.c: + queue2: don't read beyond the end of file upstream in pull mode + ... which could lead to a premature eos being reported downstream, + rather than a successful partial read which would result when + performed directly on e.g. basesrc. + +2011-01-26 16:46:25 +0800 Chen Rui + + * gst/gstutils.c: + utils: return real error in compatible link check + We need to ensure we call gst_pad_check_link() with the two pads in the correct + order. The order depends on wheter we iterate src or sink pads. + Signed-off-by: Chen Rui + +2011-02-14 17:31:25 +0100 Wim Taymans + + * gst/gstpad.c: + pad: Check sinkpad for flushing + Check the sinkpad for the flushing state before calling the chainfunction on the + pad. We do this by checking the cache (which is also cleared on the srcpad when + the sink is set to flushing). + Fixes #641928 + +2011-02-11 17:47:17 -0300 Thiago Santos + + * libs/gst/base/gstbasetransform.c: + basetransform: Check for pad alloc caps when suggestion is not fixed + If after computing the suggestion with downstream caps we still have + a non-fixed suggestion caps try to intersect with the input caps + of the pad alloc to avoid useless renegotiations. + https://bugzilla.gnome.org/show_bug.cgi?id=642130 + +2011-02-14 14:00:38 +0100 Wim Taymans + + * libs/gst/base/gstbasesink.c: + basesink: improve duration calculation + Keep track of the average distance between incomming timestamps and + use that to estimate the frame duration when buffers have no duration set on + them. + +2011-02-14 13:49:10 +0100 Wim Taymans + + * libs/gst/base/gstbasesink.c: + basesink: improve rate calculation + When there is no duration on input buffers, assume the rate is 1.0 + instead of (the undefined) 0.0. + +2011-02-14 13:47:02 +0100 Wim Taymans + + * libs/gst/base/gstbasesink.c: + basesink: improve average duration calculation + Improve the calculation of the duration. When we have no input duration set on + the input buffers stop is set to start and then we end up using a 0 duration in + the average calculation. + +2011-02-14 12:21:39 +0100 Wim Taymans + + * libs/gst/base/gstbasesink.c: + basesink: rename variable + Rename an internal variable to better reflact what its value means. + +2011-02-14 15:39:21 +0200 Stefan Kost + + * gst/parse/grammar.y: + parse-launch: trim whitespaces + +2011-02-14 15:37:23 +0200 Stefan Kost + + * gst/parse/grammar.y: + parse-launch: fix typo in pad-list length comparision + It was comparing the length with itself. + Fixes #642071. + +2011-02-14 12:52:30 +0200 Stefan Kost + + * common: + Automatic update of common submodule + From f94d739 to 1de7f6a + +2011-02-13 22:56:15 +0000 Tim-Philipp Müller + + * tools/gst-launch.c: + gst-launch: pretty-print datetime tags + +2011-02-10 23:30:21 +0000 Tim-Philipp Müller + + * gstreamer.doap: + gstreamer.doap: update mailing list host + +2011-02-10 14:53:34 +0100 Wim Taymans + + * libs/gst/base/gstbasesink.c: + basesink: fix some comments + +2011-02-10 14:50:04 +0100 Wim Taymans + + * libs/gst/base/gstbasesink.c: + basesink: keep track of earliest QoS timestamp + Keep track of the earliest allowed timestamp according to the latest + QoS report and drop buffers before that time. Activate this filter + when throttling is enabled. We could later also activate this in the + other QoS cases. + See #638891 + +2011-02-10 14:17:12 +0100 Wim Taymans + + * libs/gst/base/gstbasesink.c: + basesink: use new QoS type + Use the new QoS type and send throttling QoS messages. + +2011-02-10 13:42:05 +0100 Wim Taymans + + * docs/libs/gstreamer-libs-sections.txt: + * libs/gst/base/gstbasesink.c: + * libs/gst/base/gstbasesink.h: + * win32/common/libgstbase.def: + basesink: add property to configure a throttle-time + Add a property to configure the throttle time on a sink. The + property is not yet used. + See #638891 + +2011-02-10 12:02:03 +0100 Wim Taymans + + * docs/gst/gstreamer-sections.txt: + * gst/gst.c: + * gst/gstevent.c: + * gst/gstevent.h: + * tests/check/gst/gstevent.c: + * win32/common/libgstreamer.def: + event: add QoS event type + Add a parameter to the QoS event to specify the QoS event type. + Update docs and add unit test. + See #638891 + +2011-02-10 12:00:47 +0100 Wim Taymans + + * gst/gstclock.c: + clock: fix parameter docs + +2011-02-10 10:49:22 +0100 Wim Taymans + + * docs/design/part-qos.txt: + design: tweak docs a little + +2011-02-10 10:34:57 +0100 Wim Taymans + + * docs/design/part-qos.txt: + design: update QoS document + Add new QoS types and talk about the new throttle QoS message. + +2011-02-10 13:46:08 +0000 Tim-Philipp Müller + + * docs/design/draft-bufferpool.txt: + docs: fix some typos in the bufferpool draft + +2011-02-10 10:19:38 +0000 Tim-Philipp Müller + + * gst/gstevent.c: + events: fix g-i annotation for gst_event_new_tag() which takes ownership of the tag list + +2011-02-10 00:02:23 +0000 Tim-Philipp Müller + + * docs/manual/basics-bins.xml: + * docs/manual/basics-elements.xml: + * docs/manual/basics-pads.xml: + * gst/gstbin.c: + * gst/gstelement.c: + docs: mention that it's necessary to set the state of elements added to an already-running pipeline + https://bugzilla.gnome.org/show_bug.cgi?id=641631 + +2011-02-09 16:22:04 +0100 Wim Taymans + + * docs/design/draft-bufferpool.txt: + design: add draft for first ideas for a bufferpool feature + Add a first draft with some ideas and use cases for the implementation + for bufferpools. The purpose is to be able to make elements negotiate + their buffer requirements as well as provide an infrastructure to + preallocate and reuse buffers in an easy way. + +2011-02-09 15:23:13 +0200 Stefan Kost + + * gst/gsttaglist.h: + docs: clarify the NOMINAL_BITRATE docs + Tell that its a target bitrate and actual values might be different. + +2011-02-03 15:17:13 +0100 Mark Nauwelaerts + + * gst/gstpoll.c: + poll: trigger rebuild setup in _new + Failing to do so in the Windows case (implicitly triggered otherwise) + would have a subsequent _wait return immediately leading to high CPU + usage timeout loops. + Fixes #640675. + +2011-02-03 10:53:27 +0000 Tim-Philipp Müller + + * gst/gstinfo.c: + * gst/gstinfo.h: + info: make adding/removing of gst_debug_log_default() work properly + Make adding/removing gst_debug_log_default() work reliably in all + circumstances. The problem was that depending on platform and linker + flags the function argument might resolve to different addresses, + which made it impossible to remove the default log function added + in gst_init() from application code (because the pointer values + didn't match). The new approach should keep things simple by passing + NULL for the default function, which the code in libgstreamer can + then handle. + https://bugzilla.gnome.org/show_bug.cgi?id=625396 + https://bugzilla.gnome.org/show_bug.cgi?id=640771 + +2011-02-03 10:28:01 +0000 Tim-Philipp Müller + + * gst/gstinfo.c: + Revert "info: use the publicly visible address to fix the tests" + This reverts commit eb56687a6dfd207507a4ca000eae53f93b5e33ea. + While this commit may have fixed a problem on one of the build bots, + it didn't actually fix the original bug reported for win32. + Also, it causes other problems, such as the lookup failing when + called from C++ code (gst-phonon, amarok). + This needs to be fixed differently. + https://bugzilla.gnome.org/show_bug.cgi?id=640771 + https://bugzilla.gnome.org/show_bug.cgi?id=625396 + +2011-02-02 15:35:45 +0100 Mark Nauwelaerts + + * plugins/elements/gstqueue2.c: + queue2: properly identity dequeued event as such + ... which avoids terminating with ERROR rather than UNEXPECTED. + +2011-02-02 02:07:58 +0000 Peter Collingbourne + + * scripts/gst-uninstalled: + gst-uninstalled: use $GST_PREFIX variable + This makes it easier to change the prefix by editing the script. + https://bugzilla.gnome.org/show_bug.cgi?id=641212 + +2010-08-19 22:43:07 +0300 Sreerenj Balachandran + + * docs/gst/gstreamer-sections.txt: + * gst/gsttaglist.c: + * gst/gsttaglist.h: + taglist: add a new "encoded-by" tag + Usecase: ID3v2 TENC ("Encoded by") frame. + API: GST_TAG_ENCODED_BY + https://bugzilla.gnome.org/show_bug.cgi?id=627268 + +2011-01-29 18:02:11 +0100 Mark Nauwelaerts + + * libs/gst/net/gstnettimeprovider.c: + * libs/gst/net/gstnettimeprovider.h: + net: use socklen_t where appropriate rather than specific type + In particular, fixes Cygwin build where socklen_t is defined as int + in line with native win32 api definition. + +2011-01-31 15:58:18 +0000 Tim-Philipp Müller + + * gst/gstbus.c: + * tests/check/gst/gstbus.c: + bus: honour any per-thread default main context set via g_main_thread_push_thread_default() + Makes gst_bus_add_watch(), gst_bus_add_watch_full(), gst_bus_add_signal_watch(), + and gst_bus_add_signal_watch_full() convenience functions automatically pick up + any non-default main contexts set for the current thread via + g_main_thread_push_thread_default(). + +2011-01-28 15:36:33 -0500 Olivier Crête + + * plugins/elements/gstvalve.c: + valve: Only set discont on the first buffer after drops + Reset the discont member after setting discont on the first buffer after + dropping. + +2011-01-28 19:08:08 +0000 Bastien Nocera + + * gst/gstelement.c: + GstElement: Fix warning with GCC 4.6 + gstelement.c: In function ‘gst_element_get_request_pad’: + gstelement.c:1052:18: error: variable ‘tmp’ set but not used [-Werror=unused-but-set-variable] + https://bugzilla.gnome.org/show_bug.cgi?id=640850 + +2011-01-27 09:28:07 +0000 Tim-Philipp Müller + + * plugins/elements/gstidentity.c: + identity: print unset buffer timestamps or durations as 'none' + Like fakesink and fakesrc do. + +2011-01-12 16:03:30 +0200 Stefan Kost + + * plugins/elements/gsttypefindelement.c: + typefind: don't take object lock for reading the found caps + Once we switch to normal mode, we're not typefinding anymore and thus the caps + will not change. Therefore can avoid the object lock in the data-flow path. + The locking was added in order to fix bug #608877. + +2011-01-25 09:39:45 +0800 Zhang Wanming + + * docs/design/part-gstbin.txt: + * docs/design/part-gstghostpad.txt: + * docs/random/caps: + * docs/random/omega/TODO-0.1.0: + * docs/random/thomasvs/capturing: + * docs/random/wtay/events: + * docs/random/wtay/events3: + * docs/slides/outline: + docs: fix a few more typos + https://bugzilla.gnome.org/show_bug.cgi?id=640502 + +2011-01-25 18:48:40 +0000 Tim-Philipp Müller + + * plugins/elements/gsttypefindelement.c: + docs: flesh out typefindelement docs some more + Mention that have-type signal may be emitted from streaming + thread or application thread, and fix a typo. + +2011-01-12 16:03:57 +0200 Stefan Kost + + * plugins/elements/gsttypefindelement.c: + typefind: code and comment cleanups + Make code two places of the code the pushes the buffer store more similar. More + comments and debug logging. + +2011-01-12 13:05:06 +0200 Stefan Kost + + * gst/gsttrace.c: + trace: ensure messages are \0 terminated + +2011-01-12 12:58:44 +0200 Stefan Kost + + * libs/gst/net/gstnettimeprovider.c: + nettimeprovider: handle invalid network addresses earlier + Handle inet_aton() return code. + +2011-01-12 12:44:59 +0200 Stefan Kost + + * libs/gst/check/gstconsistencychecker.c: + checks: add a comment to indicate that we intentionally leave out the 'break' + +2011-01-12 12:43:04 +0200 Stefan Kost + + * gst/gstregistrybinary.c: + registry: remove dead code + The GError is only used for the mmap operations. If we have an error we handle + and clean it there already. + +2011-01-12 09:33:53 +0200 Stefan Kost + + * libs/gst/controller/gstcontroller.c: + docs: small controller api docs improvement + +2011-01-11 15:09:52 +0200 Stefan Kost + + * plugins/elements/gsttypefindelement.c: + typefind: canonicalize signal name + +2011-01-11 15:09:30 +0200 Stefan Kost + + * plugins/elements/gsttypefindelement.c: + docs: mention have-type signal in the docs. + +2011-01-25 09:15:49 +0000 Tim-Philipp Müller + + * tools/gst-launch.1.in: + docs: minor gst-launch man page fix + Transmitter/receiver pipelines were mislabelled. Spotted by Majin. + +2011-01-25 16:09:18 +1000 Jan Schmidt + + * tests/check/elements/multiqueue.c: + multiqueue test: Remove workaround for pad_task hangs + Remove code that isn't needed any longer, which sets the multiqueue + to PLAYING and back before unreffing, in order to avoid a deadlock + waiting for gstpad tasks that were never started. The problem seems + to have been fixed long ago. + +2011-01-25 00:20:34 +0800 Cai Yuanqing + + * docs/design/part-MT-refcounting.txt: + design docs: fix 2 typos in part-MT-refcounting + +2011-01-24 17:46:15 +0800 Yang Xichuan + + * docs/design/part-gstbin.txt: + design docs: part-gstbin.txt fix typo + Signed-off-by: Yang Xichuan + +2011-01-19 15:48:26 +0000 Vincent Penquerc'h + + * docs/design/part-block.txt: + * docs/design/part-bufferlist.txt: + * docs/design/part-clocks.txt: + * docs/design/part-element-sink.txt: + * docs/design/part-overview.txt: + * docs/design/part-preroll.txt: + * docs/design/part-push-pull.txt: + * docs/design/part-scheduling.txt: + * docs/design/part-seeking.txt: + * docs/design/part-segments.txt: + * docs/design/part-states.txt: + * docs/design/part-streams.txt: + * docs/design/part-synchronisation.txt: + design docs: fix a few typos and a thinko + +2011-01-11 17:43:57 +0100 Sebastian Dröge + + * docs/gst/gstreamer-sections.txt: + * gst/gstclock.c: + * gst/gstclock.h: + * win32/common/libgstreamer.def: + clock: API: Add function to re-init periodic GstClockIDs + +2011-01-20 14:37:25 +0000 Vincent Penquerc'h + + * gst/gstpluginloader.c: + gstpluginloader: do not leak the description string + The description string was changed to an inlined string a while back. + (But: no need to intern the const strings here, we just use the interning + to avoid allocating duplicates and make memory management easier, + since the strings will be around for the life-time of the app anyway). + https://bugzilla.gnome.org/show_bug.cgi?id=640071 + +2011-01-22 15:33:58 +0100 Wim Taymans + + * gst/gstbuffer.c: + buffer: clarify docs + +2011-01-11 10:33:32 +0100 Wim Taymans + + * docs/design/part-buffering.txt: + design: update buffering doc + Add strategies to buffering doc + +2011-01-24 11:53:12 +0200 Mart Raudsepp + + * gst/gstclock.c: + * gst/gstclock.h: + docs: add missing "Since: 0.10.32" markers for GstClock + Since tags were missing for gst_clock_single_shot_id_reinit() + and GST_CLOCK_DONE. + +2011-01-24 10:56:21 +0200 Mart Raudsepp + + * plugins/elements/gstqueue2.c: + docs: Fix GstQueue2:ring-buffer-max-size property Since tag (0.10.31, not 0.10.30) + +2011-01-24 10:26:45 +0200 Mart Raudsepp + + * gst/gststructure.c: + docs: add missing "Since: 0.10.31" marker for gst_structure_get_date_time() + +2011-01-24 14:22:27 +0000 Tim-Philipp Müller + + * tests/check/pipelines/parse-launch.c: + tests: add unit test for read-beyond-end-of-string bug + https://bugzilla.gnome.org/show_bug.cgi?id=639674 + +2011-01-24 14:16:37 +0000 Miguel Angel Cabrera Moya + + * gst/parse/types.h: + parse-launch: don't read past end of string if last character is an escape char + When the last character of a property value is a backslash + the unescaping code reads one byte pass the end of the string. + https://bugzilla.gnome.org/show_bug.cgi?id=639674 + +2011-01-14 09:21:23 +0000 Tim-Philipp Müller + + * docs/manuals.mak: + docs: hack a charset=utf-8 into pwg/adm html versions + So the encoding of the original document is respected and + displays properly in browsers where the encoding autodetection + fails to recognise that it's utf-8. + https://bugzilla.gnome.org/show_bug.cgi?id=639448 + +2011-01-13 15:41:50 +0000 Tim-Philipp Müller + + * libs/gst/check/gstcheck.c: + check: don't leak xml file name if GST_CHECK_XML is set + Spotted by nvineeth@gmail.com + +2011-01-23 23:45:40 +0000 Tim-Philipp Müller + + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-coreelements.xml: + * docs/plugins/inspect/plugin-coreindexers.xml: + * win32/common/config.h: + * win32/common/gstversion.h: + Back to development + +=== release 0.10.32 === + +2011-01-21 10:25:32 +0000 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-coreelements.xml: + * docs/plugins/inspect/plugin-coreindexers.xml: + * gstreamer.doap: + * win32/common/config.h: + * win32/common/gstversion.h: + Release 0.10.32 2011-01-20 19:07:35 +0000 Tim-Philipp Müller diff --git a/NEWS b/NEWS index 1c40a3723f..2e58ea5379 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,160 @@ -This is GStreamer 0.10.32 "Take Me to the Bonus Level" +This is GStreamer 0.10.33 "Prior Spaceflight Experience is an Advantage" + +Changes since 0.10.32: + + * atomicqueue: add an atomic/lock-free queue structure based + * bufferlist: improve _add*() performance + * bus: in _add_watch() honour any per-thread default main context set via g_main_thread_push_thread_default() + * caps: new gst_caps_intersect_full() to intersect in different modes + * clock: add functions to re-init existing periodic GstClockIDs + * event: add QoS type (overflow, underflow, throttle) for QoS events + * ghostpad: The internally linked pad of the proxypad is the ghostpad + * gstpoll: retry reading the control socket to release properly all wakeups + * message: new progress message API for asynchronous operations + * pad: unlock before freeing the pad cache to avoid deadlock + * pad: better handling for when parent goes away during data/query/event flow + * parse-launch: allow element names to begin with digits + * pluginloader: call gst-plugin-scanner with the right arch on OSX, fixing hangs with firefox + * registry: fixes elements (features) disappearing if a plugin or plugin file is renamed + * structure: Add "(date)" as a type abbreviation of GDate + * structure: Don't allow invalid GDates in all structures and don't allow NULL GDates in taglists + * taglist: add a new "encoded-by" tag + * uri: add gst_filename_to_uri() that takes relative filenames + * utils: add gst_element_factory_can_{src|sink}_{any|all}_caps() to replace can_{sink,src}_caps() + * baseparse: new GstBaseParse class for parsers + * basesink: improve rate, duration, and average duration calculation + * basesink: use new QoS types and add add "throttle-time" property + * basesrc: Handle tag and custom downstream events the same + * basesrc: keep downstream caps order when fixating, to honour downstream preferences when negotiating + * basesrc: Return FALSE if we don't handle an event + * basesrc: Send synchronized custom downstream/both events downstream from the streaming thread + * basetransform: Be smarter with pad allocs + * basetransform: Check for pad alloc caps when suggestion is not fixed + * basetransform: Retain caps order when getting caps, to honour downstream preferences when negotiating + * funnel: new N-to-1 pipe fitting element imported from farsight + * fakesink: print buffer flags + * filesink: Fix escaping of URIs + * file{sink,src}: Check if non-URI characters are escaped, but only for the URI not the location property + * filesrc, filesink: fix URI creation regression for non-absolute locations + * filesrc: Fix escaping of file uris + * inputselector: Hold the selector lock while reading properties of the active pad + * inputselector: Make sure that EOS is always sent downstream for the active pad + * inputselector: Return GST_FLOW_OK until the selected pad pushed something downstream + * inputselector: Stop waiting for a pad switch when the pad is flushing + * multiqueue: fix some potential corner-case deadlocks and some leaks + * multiqueue: handle arbitrary sink + source pad naming + * queue2: don't read beyond the end of file upstream in pull mode; leak fixes + * plugins: make query and event functions more thread-safe, protect against parent-pad disappearing + * gst-launch: add GstIndex support + +Bugs fixed since 0.10.32: + + * 642356 : [Index] review api and add an example + * 402141 : gst_element_factory_can_{sink,src}_caps seems to be broken + * 518857 : [API] GstBaseParse: new base class for parsers + * 604094 : registry: do not remove features when removing a cached plugin that no longer is present + * 615357 : [macosx] Handle multi-arch plugin-scanner + * 617045 : [caps] New method for intersecting caps while retaining order + * 639674 : parse-launch: improve parsing resilience (for escapes at end of string) + * 639962 : design docs: Fix a few typos and a think + * 640071 : pluginloader: do not leak the description string of blacklisted plugin + * 640437 : design docs: fix 2 typos in part-MT-refcounting + * 640502 : fix a few typos + * 640622 : gst_element_link_pads_full function return wrong error information + * 640675 : high cpu-load with 0.10.32 release + * 640850 : GstElement: Fix warning with GCC 4.6 + * 641212 : gst-uninstalled: use $GST_PREFIX variable + * 641928 : gst_pad_push fast path races with pad deactivation + * 642071 : Incorrect comparing of number of source and sink links when parsing a launch string + * 642130 : [basetransform] Check for pad alloc caps when suggestion is not fixed + * 642271 : crash in gst_caps_structure_intersect, encoder_match_media_type + * 642373 : [basetransform] Avoid too may pad allocs + * 642393 : [filesrc] Fails setting the same uri it's setting in the uri queries. + * 642504 : [mingw/cygwin build] correctly export plugin description + * 642522 : gstvalue.c does not include a deserialize function for uchar + * 642869 : gst_index_new: documentation typo + * 643301 : Adding a buffer to a buffer list iterates the list + * 643455 : [regression] Lots of dropouts in Empathy voip calls + * 644935 : [inputselector] During switching of streams it can happen that all pads returned not-linked last + * 645022 : GstTask: typo in GST_TASK_BROADCAST - g_cond_breadcast should probably be g_cond_broadcast + * 645267 : build: fix build with -Werror with GCC 4.6.0 + * 645595 : bytereader, bytewriter: fix warnings when using inline functions with g++ + * 645746 : [gstpoll] Regression causes 100% cpu usage in multifdsink + * 645877 : commit 14d7db1 causes cpu spinning and other bus weirdness + * 645931 : [gstmultiqueue] fix arbitrary sink + source pad naming + * 646118 : [gstmultiqueue] if arbitrary sink number is specified by caller, use this as single queue id + * 646341 : [baseparse] Add a queued flow return so parsers can keep frames in a queue + * 646531 : GST_BOILERPLATE: don't use " type " as both a variable name and a macro argument + * 646566 : Protect against Pad-Parent disappearing + * 646569 : poll: don't call WSAWaitForMultipleEvents with no events + * 646624 : GstBin: regression: creating too many bins fails, exhausting allowed file descriptor limit + * 646811 : baseparse: deadlock in gst_base_parse_set_index + * 646971 : iterator: resync to avoid infinite loop + * 647005 : GstBus: Only create the socketpair for async message delivery if required + * 647131 : recent multiqueue changes break DVD playback (again) + * 647293 : Fix pad callbacks so they handle when parent goes away + * 647763 : [bus] Bus is leaked if a watch is installed in the default main context + * 647844 : baseparse: Remove unused but set variable + * 647922 : [introspection] Needs to call gst_init() before anything else + * 648199 : pad: potential deadlock / crash when freeing cache + * 648215 : basetransform: unref in wrong place + * 648220 : Regression: videoscale fails to negotiate for PAR transformation + * 648297 : [bus] regression: critical assertion failure + * 649195 : [miniobject] Fix dup_mini_object function to handle NULL gvalues + * 635718 : [basesrc] custom, non-OOB events aren't pushed downstream + * 625396 : gst_debug_remove_log_function doesn't remove default log handler + * 640771 : amarok doesn't start with new phonon gstreamer + * 646972 : queue2: Fixes memory leak on out_flushing error in gst_queue2_create_read + * 640665 : basesink: drops too many buffers when there's no duration + +API additions since 0.10.32: + + * gst_atomic_queue_length() + * gst_atomic_queue_new() + * gst_atomic_queue_peek() + * gst_atomic_queue_pop() + * gst_atomic_queue_push() + * gst_atomic_queue_ref() + * gst_atomic_queue_unref() + * gst_buffer_list_iterator_get_type() + * gst_caps_intersect_full() + * gst_caps_intersect_mode_get_type() + * gst_clock_periodic_id_reinit() + * gst_element_factory_can_sink_all_caps() + * gst_element_factory_can_sink_any_caps() + * gst_element_factory_can_src_all_caps() + * gst_element_factory_can_src_any_caps() + * gst_event_new_qos_full() + * gst_event_parse_qos_full() + * gst_filename_to_uri() + * gst_message_new_progress() + * gst_message_parse_progress() + * gst_parse_context_get_type() + * gst_progress_type_get_type() + * gst_qos_type_get_type() + * GST_TAG_ENCODED_BY + * gst_base_parse_add_index_entry() + * gst_base_parse_convert_default() + * gst_base_parse_frame_free() + * gst_base_parse_frame_get_type() + * gst_base_parse_frame_init() + * gst_base_parse_frame_new() + * gst_base_parse_get_type() + * gst_base_parse_push_frame() + * gst_base_parse_set_average_bitrate() + * gst_base_parse_set_duration() + * gst_base_parse_set_frame_rate() + * gst_base_parse_set_has_timing_info() + * gst_base_parse_set_min_frame_size() + * gst_base_parse_set_passthrough() + * gst_base_parse_set_syncable() + * gst_base_sink_get_throttle_time() + * gst_base_sink_set_throttle_time() + +API deprecated since 0.10.32: + + * gst_element_factory_can_src_caps() + * gst_element_factory_can_sink_caps() Changes since 0.10.31: diff --git a/RELEASE b/RELEASE index 3cfb820dde..41ca358f47 100644 --- a/RELEASE +++ b/RELEASE @@ -1,5 +1,5 @@ -Release notes for GStreamer 0.10.32 "Take Me to the Bonus Level" +Release notes for GStreamer 0.10.33 "Prior Spaceflight Experience is an Advantage" @@ -9,6 +9,12 @@ core of the GStreamer streaming media framework. The 0.10.x series is a stable series targeted at end users. +It is not API or ABI compatible with the stable 0.8.x series. +It is, however, parallel installable with the 0.8.x series. + + +The 0.10.x series has been reworked for threadsafety. It also features +various feature additions and enhancements. This module, gstreamer, only contains core functionality. @@ -31,64 +37,160 @@ contains a set of less supported plug-ins that haven't passed the Features of this release - * GLib requirement is now >= 2.22 - * New core element: valve (moved from -bad) - * New core element: input-selector (N.B. without "select-all" property, use fsfunnel instead) (moved from -bad) - * New core element: output-selector (with different negotiation behaviour by default, set pad-negotiation-mode=active for previous behaviour) (moved from -bad) - * Performance improvements for many heavily-used code paths: GstPad, GstPoll, GstClock, GstTask, basesink, basesrc, queue2, multiqueue - * gobject-introspection: add annotations for most core API - * clock: make sync clock wait lockfree - * fdsrc/fdsink: reenable on MSVC - * registry: fix GStatBuf definition for win32 when building against older glib (fixes unnecessary rescanning of plugins at start-up) - * element: add a more flexible way to get request pads from elements - * multiqueue: return upon input when already eos - * object: fix creation of default name (when creating more than 100000 elements) - * pluginloader: fix hangs on OSX - * poll: fixes for (p)select backend (used e.g. on OSX) - * poll: refactor and make more lockfree; fixes for win32 and OSX (pselect backend) - * registry: don't replace valid existing plugins by blacklisted ones - * tags: don't produce duplicated entries when merging same value twice - * basesink: preroll fixes for async=false case - * basesink: rework position reporting code - * basetransform: handle downstream giving a buffer with new caps but invalid size + * atomicqueue: add an atomic/lock-free queue structure based + * bufferlist: improve _add*() performance + * bus: in _add_watch() honour any per-thread default main context set via g_main_thread_push_thread_default() + * caps: new gst_caps_intersect_full() to intersect in different modes + * clock: add functions to re-init existing periodic GstClockIDs + * event: add QoS type (overflow, underflow, throttle) for QoS events + * ghostpad: The internally linked pad of the proxypad is the ghostpad + * gstpoll: retry reading the control socket to release properly all wakeups + * message: new progress message API for asynchronous operations + * pad: unlock before freeing the pad cache to avoid deadlock + * pad: better handling for when parent goes away during data/query/event flow + * parse-launch: allow element names to begin with digits + * pluginloader: call gst-plugin-scanner with the right arch on OSX, fixing hangs with firefox + * registry: fixes elements (features) disappearing if a plugin or plugin file is renamed + * structure: Add "(date)" as a type abbreviation of GDate + * structure: Don't allow invalid GDates in all structures and don't allow NULL GDates in taglists + * taglist: add a new "encoded-by" tag + * uri: add gst_filename_to_uri() that takes relative filenames + * utils: add gst_element_factory_can_{src|sink}_{any|all}_caps() to replace can_{sink,src}_caps() + * baseparse: new GstBaseParse class for parsers + * basesink: improve rate, duration, and average duration calculation + * basesink: use new QoS types and add add "throttle-time" property + * basesrc: Handle tag and custom downstream events the same + * basesrc: keep downstream caps order when fixating, to honour downstream preferences when negotiating + * basesrc: Return FALSE if we don't handle an event + * basesrc: Send synchronized custom downstream/both events downstream from the streaming thread + * basetransform: Be smarter with pad allocs + * basetransform: Check for pad alloc caps when suggestion is not fixed + * basetransform: Retain caps order when getting caps, to honour downstream preferences when negotiating + * funnel: new N-to-1 pipe fitting element imported from farsight + * fakesink: print buffer flags + * filesink: Fix escaping of URIs + * file{sink,src}: Check if non-URI characters are escaped, but only for the URI not the location property + * filesrc, filesink: fix URI creation regression for non-absolute locations + * filesrc: Fix escaping of file uris + * inputselector: Hold the selector lock while reading properties of the active pad + * inputselector: Make sure that EOS is always sent downstream for the active pad + * inputselector: Return GST_FLOW_OK until the selected pad pushed something downstream + * inputselector: Stop waiting for a pad switch when the pad is flushing + * multiqueue: fix some potential corner-case deadlocks and some leaks + * multiqueue: handle arbitrary sink + source pad naming + * queue2: don't read beyond the end of file upstream in pull mode; leak fixes + * plugins: make query and event functions more thread-safe, protect against parent-pad disappearing + * gst-launch: add GstIndex support Bugs fixed in this release - * 635785 : basesrc: fix deadlock - * 638599 : GST_PTR_FORMAT causes crashes if GLib-internal printf is used but system provides register_printf_specifier - * 503592 : gstpad.c does many ref/unref of peer pad in dataflow - * 564056 : Protect against umask(0177) - * 607513 : input-selector segfaults in g_object_notify() - * 632168 : [gsttask] MSVC thread names for task debugging - * 632447 : reduce static memory allocated by the registry - * 632557 : [macros] Define restrict keyword if not available - * 632778 : Optimisations to GstBaseSink - * 632779 : gstdataqueue: Only emit g_cond_signal when needed - * 632780 : queue: Remove useless checks from e406f7 - * 633918 : [fakesink] [PATCH] print sink-message events like a message and its structure - * 634965 : sinks render buffers in state PAUSED when async is FALSE - * 635001 : basesink: fix position reporting in PAUSED - * 636268 : configure test fails on FreeBSD - * 636455 : basesrc: Avoid taking object locks for just checking tag presence - * 637057 : [plugin-scanner] gstpoll fails with select backend - * 637300 : [API] request pad based on caps - * 637549 : build fails: ./.libs/libgstbase-0.10.so: undefined reference to `gst_clock_single_shot_id_reinit' - * 637776 : merging the same tag values again produces lists containing duplicates - * 638381 : {input,output}-selector: double-check API before release - * 638399 : a few typos in GStreamer - * 638900 : [GstPoll] Doesn't compile with MinGW - * 638941 : registry scan/loading race and inconsistency + * 642356 : [Index] review api and add an example + * 402141 : gst_element_factory_can_{sink,src}_caps seems to be broken + * 518857 : [API] GstBaseParse: new base class for parsers + * 604094 : registry: do not remove features when removing a cached plugin that no longer is present + * 615357 : [macosx] Handle multi-arch plugin-scanner + * 617045 : [caps] New method for intersecting caps while retaining order + * 639674 : parse-launch: improve parsing resilience (for escapes at end of string) + * 639962 : design docs: Fix a few typos and a think + * 640071 : pluginloader: do not leak the description string of blacklisted plugin + * 640437 : design docs: fix 2 typos in part-MT-refcounting + * 640502 : fix a few typos + * 640622 : gst_element_link_pads_full function return wrong error information + * 640675 : high cpu-load with 0.10.32 release + * 640850 : GstElement: Fix warning with GCC 4.6 + * 641212 : gst-uninstalled: use $GST_PREFIX variable + * 641928 : gst_pad_push fast path races with pad deactivation + * 642071 : Incorrect comparing of number of source and sink links when parsing a launch string + * 642130 : [basetransform] Check for pad alloc caps when suggestion is not fixed + * 642271 : crash in gst_caps_structure_intersect, encoder_match_media_type + * 642373 : [basetransform] Avoid too may pad allocs + * 642393 : [filesrc] Fails setting the same uri it's setting in the uri queries. + * 642504 : [mingw/cygwin build] correctly export plugin description + * 642522 : gstvalue.c does not include a deserialize function for uchar + * 642869 : gst_index_new: documentation typo + * 643301 : Adding a buffer to a buffer list iterates the list + * 643455 : [regression] Lots of dropouts in Empathy voip calls + * 644935 : [inputselector] During switching of streams it can happen that all pads returned not-linked last + * 645022 : GstTask: typo in GST_TASK_BROADCAST - g_cond_breadcast should probably be g_cond_broadcast + * 645267 : build: fix build with -Werror with GCC 4.6.0 + * 645595 : bytereader, bytewriter: fix warnings when using inline functions with g++ + * 645746 : [gstpoll] Regression causes 100% cpu usage in multifdsink + * 645877 : commit 14d7db1 causes cpu spinning and other bus weirdness + * 645931 : [gstmultiqueue] fix arbitrary sink + source pad naming + * 646118 : [gstmultiqueue] if arbitrary sink number is specified by caller, use this as single queue id + * 646341 : [baseparse] Add a queued flow return so parsers can keep frames in a queue + * 646531 : GST_BOILERPLATE: don't use " type " as both a variable name and a macro argument + * 646566 : Protect against Pad-Parent disappearing + * 646569 : poll: don't call WSAWaitForMultipleEvents with no events + * 646624 : GstBin: regression: creating too many bins fails, exhausting allowed file descriptor limit + * 646811 : baseparse: deadlock in gst_base_parse_set_index + * 646971 : iterator: resync to avoid infinite loop + * 647005 : GstBus: Only create the socketpair for async message delivery if required + * 647131 : recent multiqueue changes break DVD playback (again) + * 647293 : Fix pad callbacks so they handle when parent goes away + * 647763 : [bus] Bus is leaked if a watch is installed in the default main context + * 647844 : baseparse: Remove unused but set variable + * 647922 : [introspection] Needs to call gst_init() before anything else + * 648199 : pad: potential deadlock / crash when freeing cache + * 648215 : basetransform: unref in wrong place + * 648220 : Regression: videoscale fails to negotiate for PAR transformation + * 648297 : [bus] regression: critical assertion failure + * 649195 : [miniobject] Fix dup_mini_object function to handle NULL gvalues + * 635718 : [basesrc] custom, non-OOB events aren't pushed downstream + * 625396 : gst_debug_remove_log_function doesn't remove default log handler + * 640771 : amarok doesn't start with new phonon gstreamer + * 646972 : queue2: Fixes memory leak on out_flushing error in gst_queue2_create_read + * 640665 : basesink: drops too many buffers when there's no duration API changed in this release - API additions: - * gst_clock_single_shot_id_reinit() - * gst_element_request_pad() - * GstElementClass::request_new_pad_full() - * gst_poll_get_read_gpollfd() - * gst_value_list_merge() - * GST_CLOCK_DONE + * gst_atomic_queue_length() + * gst_atomic_queue_new() + * gst_atomic_queue_peek() + * gst_atomic_queue_pop() + * gst_atomic_queue_push() + * gst_atomic_queue_ref() + * gst_atomic_queue_unref() + * gst_buffer_list_iterator_get_type() + * gst_caps_intersect_full() + * gst_caps_intersect_mode_get_type() + * gst_clock_periodic_id_reinit() + * gst_element_factory_can_sink_all_caps() + * gst_element_factory_can_sink_any_caps() + * gst_element_factory_can_src_all_caps() + * gst_element_factory_can_src_any_caps() + * gst_event_new_qos_full() + * gst_event_parse_qos_full() + * gst_filename_to_uri() + * gst_message_new_progress() + * gst_message_parse_progress() + * gst_parse_context_get_type() + * gst_progress_type_get_type() + * gst_qos_type_get_type() + * GST_TAG_ENCODED_BY + * gst_base_parse_add_index_entry() + * gst_base_parse_convert_default() + * gst_base_parse_frame_free() + * gst_base_parse_frame_get_type() + * gst_base_parse_frame_init() + * gst_base_parse_frame_new() + * gst_base_parse_get_type() + * gst_base_parse_push_frame() + * gst_base_parse_set_average_bitrate() + * gst_base_parse_set_duration() + * gst_base_parse_set_frame_rate() + * gst_base_parse_set_has_timing_info() + * gst_base_parse_set_min_frame_size() + * gst_base_parse_set_passthrough() + * gst_base_parse_set_syncable() + * gst_base_sink_get_throttle_time() + * gst_base_sink_set_throttle_time() +- API deprecations: + + * gst_element_factory_can_src_caps() + * gst_element_factory_can_sink_caps() Download @@ -113,31 +215,58 @@ subscribe to the gstreamer-devel list. If there is sufficient interest we will create more lists as necessary. +Applications + +Applications ported to GStreamer 0.10 include Totem, RhythmBox, Sound-Juicer, +Gnome Media, Flumotion, Amarok, Jamboree, Pitivi, Istanbul, AnnoAmp, Elisa, and others. +Let us know if you want to be added to this list. + + Contributors to this release + * Alessandro Decina * Andoni Morales Alastruey - * Benjamin Gaignard - * Benjamin Otte - * David Hoyt + * Andreas Frisch + * Arun Raghavan + * Bastien Nocera + * Cai Yuanqing + * Chen Rui + * Daniel Macks * David Schleef * Edward Hervey + * Fraxinas * Havard Graff + * Idar Tollefsen * Jan Schmidt - * Kipp Cannon - * Koop Mast - * Lasse Laukkanen + * Janne Grunau + * Jason D. Clinton + * Jonas Holmberg + * Jonathan Matthew + * Josep Torra + * Joshua M. Doe + * Julien Moutte + * Luis de Bethencourt * Mark Nauwelaerts + * Mart Raudsepp * Michael Smith - * Olivier Crete + * Miguel Angel Cabrera Moya + * Ole André Vadla Ravnås * Olivier Crête - * Raimo Järvi + * Peter Collingbourne + * Philip Jägenstedt + * René Stadler + * Robert Swain * Sebastian Dröge + * Sreerenj Balachandran * Stefan Kost + * Stian Selnes * Thiago Santos + * Thijs Vermeir + * Thomas Kristensen * Tim-Philipp Müller - * Tommi Myöhänen + * Vincent Penquerc'h * Wim Taymans + * Yang Xichuan + * Zaheer Abbas Merali * Zhang Wanming - * Christian Schaller - * Sjoerd Simons -  +  \ No newline at end of file diff --git a/configure.ac b/configure.ac index 274505e55c..8e4277a08c 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ(2.60) dnl initialize autoconf dnl when going to/from release please set the nano (fourth number) right ! dnl releases only do Wall, git and prerelease does Werror too -AC_INIT(GStreamer, 0.10.32.4, +AC_INIT(GStreamer, 0.10.33, http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer, gstreamer) AG_GST_INIT @@ -48,7 +48,7 @@ dnl - interfaces added/removed/changed -> increment CURRENT, REVISION = 0 dnl - interfaces added -> increment AGE dnl - interfaces removed -> AGE = 0 dnl sets GST_LT_LDFLAGS -AS_LIBTOOL(GST, 28, 0, 28) +AS_LIBTOOL(GST, 29, 0, 29) dnl FIXME: this macro doesn't actually work; dnl the generated libtool script has no support for the listed tags. diff --git a/docs/plugins/inspect/plugin-coreelements.xml b/docs/plugins/inspect/plugin-coreelements.xml index b7ca01a07f..c28fd82299 100644 --- a/docs/plugins/inspect/plugin-coreelements.xml +++ b/docs/plugins/inspect/plugin-coreelements.xml @@ -3,10 +3,10 @@ standard GStreamer elements ../../plugins/elements/.libs/libgstcoreelements.so libgstcoreelements.so - 0.10.32.4 + 0.10.33 LGPL gstreamer - GStreamer prerelease + GStreamer source release Unknown package origin diff --git a/docs/plugins/inspect/plugin-coreindexers.xml b/docs/plugins/inspect/plugin-coreindexers.xml index 2ff2118770..7df1162a79 100644 --- a/docs/plugins/inspect/plugin-coreindexers.xml +++ b/docs/plugins/inspect/plugin-coreindexers.xml @@ -3,10 +3,10 @@ GStreamer core indexers ../../plugins/indexers/.libs/libgstcoreindexers.so libgstcoreindexers.so - 0.10.32.4 + 0.10.33 LGPL gstreamer - GStreamer prerelease + GStreamer source release Unknown package origin diff --git a/gstreamer.doap b/gstreamer.doap index 041e8f3bf7..e5663d6e73 100644 --- a/gstreamer.doap +++ b/gstreamer.doap @@ -38,6 +38,17 @@ hierarchy, and a set of media-agnostic core elements. + + + 0.10.33 + 0.10 + Prior Spaceflight Experience is an Advantage + 2011-05-10 + + + + + 0.10.32 diff --git a/po/af.po b/po/af.po index f33ca75da8..a181e82b61 100644 --- a/po/af.po +++ b/po/af.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.9.7\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2005-12-05 11:45+0200\n" "Last-Translator: Petri Jooste \n" "Language-Team: Afrikaans \n" diff --git a/po/az.po b/po/az.po index e5aa7ab14f..4ce2582aa7 100644 --- a/po/az.po +++ b/po/az.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer-0.8.0\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2004-03-19 18:40+0200\n" "Last-Translator: Metin Amiroff \n" "Language-Team: Azerbaijani \n" diff --git a/po/be.po b/po/be.po index 3653b71be1..dbd76abf8b 100644 --- a/po/be.po +++ b/po/be.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.9.7\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2006-01-18 22:26+0200\n" "Last-Translator: Ales Nyakhaychyk \n" "Language-Team: Belarusian \n" diff --git a/po/bg.po b/po/bg.po index 0d297fe236..4c9489d068 100644 --- a/po/bg.po +++ b/po/bg.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.32.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-27 11:27+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2011-04-26 22:40+0300\n" "Last-Translator: Alexander Shopov \n" "Language-Team: Bulgarian \n" diff --git a/po/ca.po b/po/ca.po index 0e7c9598b7..0edb1bfb95 100644 --- a/po/ca.po +++ b/po/ca.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.30.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2010-11-04 19:41+0100\n" "Last-Translator: Jordi Mallach \n" "Language-Team: Catalan \n" diff --git a/po/cs.po b/po/cs.po index c4767aecc6..4e42da628e 100644 --- a/po/cs.po +++ b/po/cs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.20.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2008-10-12 12:12+0200\n" "Last-Translator: Miloslav Trmac \n" "Language-Team: Czech \n" diff --git a/po/da.po b/po/da.po index 5fade0ed99..813661a6d9 100644 --- a/po/da.po +++ b/po/da.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.30.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2010-11-06 22:52+0100\n" "Last-Translator: Mogens Jaeger \n" "Language-Team: Danish \n" diff --git a/po/de.po b/po/de.po index daa837177b..cc8741a0c4 100644 --- a/po/de.po +++ b/po/de.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.32.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-30 15:35+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2011-04-27 23:44+0200\n" "Last-Translator: Christian Kirbach \n" "Language-Team: German \n" diff --git a/po/el.po b/po/el.po index 1aa662b7db..c4409ca7bf 100644 --- a/po/el.po +++ b/po/el.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer-0.10.30.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2010-11-29 11:14+0200\n" "Last-Translator: Michael Kotsarinis \n" "Language-Team: Greek \n" diff --git a/po/en_GB.po b/po/en_GB.po index ba81f68be4..f77ab29856 100644 --- a/po/en_GB.po +++ b/po/en_GB.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.8.1\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2004-04-26 10:36-0400\n" "Last-Translator: Gareth Owen \n" "Language-Team: English (British) \n" diff --git a/po/es.po b/po/es.po index 872b03fd64..c579819a88 100644 --- a/po/es.po +++ b/po/es.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.30.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2010-11-01 18:11+0100\n" "Last-Translator: Jorge González González \n" "Language-Team: Spanish \n" diff --git a/po/eu.po b/po/eu.po index 663b9d9c60..529077fb5d 100644 --- a/po/eu.po +++ b/po/eu.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer-0.10.26.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2010-03-25 13:10+0100\n" "Last-Translator: Mikel Olasagasti Uranga \n" "Language-Team: Basque \n" diff --git a/po/fi.po b/po/fi.po index 2ec7471fbf..1add3ba935 100644 --- a/po/fi.po +++ b/po/fi.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.30.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2010-11-17 23:10+0200\n" "Last-Translator: Tommi Vainikainen \n" "Language-Team: Finnish \n" diff --git a/po/fr.po b/po/fr.po index 4891afe858..9641e7779e 100644 --- a/po/fr.po +++ b/po/fr.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.32.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-30 15:35+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2011-04-28 09:34+0200\n" "Last-Translator: Claude Paroz \n" "Language-Team: French \n" diff --git a/po/gl.po b/po/gl.po index 6bae3e8bd9..a58aec8ac2 100644 --- a/po/gl.po +++ b/po/gl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.31.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2011-04-13 05:19+0000\n" "Last-Translator: Francisco Diéguez \n" "Language-Team: Galician \n" diff --git a/po/hu.po b/po/hu.po index 205af5993d..74b2fd76f1 100644 --- a/po/hu.po +++ b/po/hu.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.30.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2010-11-01 13:39+0100\n" "Last-Translator: Gabor Kelemen \n" "Language-Team: Hungarian \n" diff --git a/po/id.po b/po/id.po index 44da03de5d..ea40ed1338 100644 --- a/po/id.po +++ b/po/id.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.29.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2010-06-29 21:55+0700\n" "Last-Translator: Andhika Padmawan \n" "Language-Team: Indonesian \n" diff --git a/po/it.po b/po/it.po index c041ecfafb..c48f6706f9 100644 --- a/po/it.po +++ b/po/it.po @@ -106,7 +106,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.30.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2010-10-25 10:03+0200\n" "Last-Translator: Luca Ferretti \n" "Language-Team: Italian \n" diff --git a/po/ja.po b/po/ja.po index 33afbfa00d..dc0d8c55bd 100644 --- a/po/ja.po +++ b/po/ja.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.20.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2008-10-16 19:57+0900\n" "Last-Translator: Makoto Kato \n" "Language-Team: Japanese \n" diff --git a/po/lt.po b/po/lt.po index dcd575a701..119cf67ef2 100644 --- a/po/lt.po +++ b/po/lt.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.29.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2010-07-16 00:50+0300\n" "Last-Translator: Žygimantas Beručka \n" "Language-Team: Lithuanian \n" diff --git a/po/nb.po b/po/nb.po index af44e1cac6..0fd1f5bb31 100644 --- a/po/nb.po +++ b/po/nb.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.30.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2010-10-24 21:36+0200\n" "Last-Translator: Kjartan Maraas \n" "Language-Team: Norwegian Bokmaal \n" diff --git a/po/nl.po b/po/nl.po index beea5857d4..65965491ea 100644 --- a/po/nl.po +++ b/po/nl.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.32.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-27 11:27+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2011-04-26 23:10+0200\n" "Last-Translator: Freek de Kruijf \n" "Language-Team: Dutch \n" diff --git a/po/pl.po b/po/pl.po index 5f3860b1f5..aa1e2db30f 100644 --- a/po/pl.po +++ b/po/pl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.32.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-27 11:27+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2011-04-26 17:54+0200\n" "Last-Translator: Jakub Bogusz \n" "Language-Team: Polish \n" diff --git a/po/pt_BR.po b/po/pt_BR.po index f31bb9a0e5..d144759925 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer-0.10.31.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2011-01-08 01:36-0300\n" "Last-Translator: Fabrício Godoy \n" "Language-Team: Brazilian Portuguese \n" diff --git a/po/ro.po b/po/ro.po index a0c067791d..e7e7e3f966 100644 --- a/po/ro.po +++ b/po/ro.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.29.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2010-08-16 01:10+0300\n" "Last-Translator: Lucian Adrian Grijincu \n" "Language-Team: Romanian \n" diff --git a/po/ru.po b/po/ru.po index 1ad44b1697..2300900452 100644 --- a/po/ru.po +++ b/po/ru.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer-0.10.32.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-27 11:27+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2011-04-26 20:25+0400\n" "Last-Translator: Yuri Kozlov \n" "Language-Team: Russian \n" diff --git a/po/rw.po b/po/rw.po index 8818bc89dc..6200b2fcf5 100644 --- a/po/rw.po +++ b/po/rw.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.8.8\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2005-04-04 10:55-0700\n" "Last-Translator: Steven Michael Murphy \n" "Language-Team: Kinyarwanda \n" diff --git a/po/sk.po b/po/sk.po index cb9c00e319..7c266a1fbb 100644 --- a/po/sk.po +++ b/po/sk.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.30.3\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2010-11-08 16:13+0100\n" "Last-Translator: Peter Tuhársky \n" "Language-Team: Slovak \n" diff --git a/po/sl.po b/po/sl.po index ab5cfa6022..20996f530c 100644 --- a/po/sl.po +++ b/po/sl.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.29.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2010-09-18 20:21+0100\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenian \n" diff --git a/po/sq.po b/po/sq.po index dd89e544c2..2b35a23414 100644 --- a/po/sq.po +++ b/po/sq.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.8.4\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2004-08-07 23:46+0200\n" "Last-Translator: Laurent Dhima \n" "Language-Team: Albanian \n" diff --git a/po/sr.po b/po/sr.po index bc9d6ef2b5..272ed70bed 100644 --- a/po/sr.po +++ b/po/sr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.8.8\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2005-01-27 16:58+0100\n" "Last-Translator: Danilo Segan \n" "Language-Team: Serbian \n" diff --git a/po/sv.po b/po/sv.po index aaf92b04c5..adbde56217 100644 --- a/po/sv.po +++ b/po/sv.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.31.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2011-01-09 19:46+0100\n" "Last-Translator: Daniel Nylander \n" "Language-Team: Swedish \n" diff --git a/po/tr.po b/po/tr.po index 04c1941c09..a4c2a40c8f 100644 --- a/po/tr.po +++ b/po/tr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.8.0\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2004-04-03 03:14+0300\n" "Last-Translator: Baris Cicek \n" "Language-Team: Turkish \n" diff --git a/po/uk.po b/po/uk.po index d2369c6d6f..50b36d9c7d 100644 --- a/po/uk.po +++ b/po/uk.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.14\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2007-09-07 11:16+0300\n" "Last-Translator: Maxim V. Dziumanenko \n" "Language-Team: Ukrainian \n" diff --git a/po/vi.po b/po/vi.po index cda9a34a27..d95c7a04cc 100644 --- a/po/vi.po +++ b/po/vi.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.29.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2010-10-03 19:09+1030\n" "Last-Translator: Clytie Siddall \n" "Language-Team: Vietnamese \n" diff --git a/po/zh_CN.po b/po/zh_CN.po index 2c7a30e543..daaf2027bd 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.10.25.2\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2010-02-02 18:58+0800\n" "Last-Translator: Ji ZhengYu \n" "Language-Team: Chinese (simplified) \n" diff --git a/po/zh_TW.po b/po/zh_TW.po index 4dafa17ed8..4a83e21214 100644 --- a/po/zh_TW.po +++ b/po/zh_TW.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: gstreamer 0.8.8\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n" -"POT-Creation-Date: 2011-04-16 14:53+0100\n" +"POT-Creation-Date: 2011-05-10 08:32+0100\n" "PO-Revision-Date: 2005-04-27 14:55+0800\n" "Last-Translator: Abel Cheung \n" "Language-Team: Chinese (traditional) \n" diff --git a/win32/common/config.h b/win32/common/config.h index fad9156990..323f14f8a2 100644 --- a/win32/common/config.h +++ b/win32/common/config.h @@ -59,13 +59,13 @@ #define GST_MAJORMINOR "0.10" /* package name in plugins */ -#define GST_PACKAGE_NAME "GStreamer prerelease" +#define GST_PACKAGE_NAME "GStreamer source release" /* package origin */ #define GST_PACKAGE_ORIGIN "Unknown package origin" /* GStreamer package release date/time for plugins as YYYY-MM-DD */ -#define GST_PACKAGE_RELEASE_DATETIME "2011-04-30T14:22Z" +#define GST_PACKAGE_RELEASE_DATETIME "2011-05-10" /* location of the installed gst-plugin-scanner */ #define GST_PLUGIN_SCANNER_INSTALLED LIBDIR "\\gst-plugin-scanner" @@ -340,7 +340,7 @@ #define PACKAGE_NAME "GStreamer" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "GStreamer 0.10.32.4" +#define PACKAGE_STRING "GStreamer 0.10.33" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "gstreamer" @@ -349,7 +349,7 @@ #undef PACKAGE_URL /* Define to the version of this package. */ -#define PACKAGE_VERSION "0.10.32.4" +#define PACKAGE_VERSION "0.10.33" /* directory where plugins are located */ #ifdef _DEBUG @@ -380,7 +380,7 @@ #undef USE_POISONING /* Version number of package */ -#define VERSION "0.10.32.4" +#define VERSION "0.10.33" /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ diff --git a/win32/common/gstversion.h b/win32/common/gstversion.h index 8b749c484d..e5dc0bd921 100644 --- a/win32/common/gstversion.h +++ b/win32/common/gstversion.h @@ -57,14 +57,14 @@ G_BEGIN_DECLS * * The micro version of GStreamer at compile time: */ -#define GST_VERSION_MICRO (32) +#define GST_VERSION_MICRO (33) /** * GST_VERSION_NANO: * * The nano version of GStreamer at compile time: * Actual releases have 0, GIT versions have 1, prerelease versions have 2-... */ -#define GST_VERSION_NANO (4) +#define GST_VERSION_NANO (0) /** * GST_CHECK_VERSION: From 24888ecc704599f4d0f6e632869b73214482d599 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Tue, 10 May 2011 11:11:15 +0200 Subject: [PATCH 02/30] multiqueue: ensure thread safety when adding a pad This seems to be a regression, and was causing crashes. https://bugzilla.gnome.org/show_bug.cgi?id=649878 --- plugins/elements/gstmultiqueue.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/elements/gstmultiqueue.c b/plugins/elements/gstmultiqueue.c index 3988c56b84..b6b2d245ae 100644 --- a/plugins/elements/gstmultiqueue.c +++ b/plugins/elements/gstmultiqueue.c @@ -1755,8 +1755,6 @@ gst_single_queue_new (GstMultiQueue * mqueue, gint id) sq->extra_size.bytes = mqueue->extra_size.bytes; sq->extra_size.time = mqueue->extra_size.time; - GST_MULTI_QUEUE_MUTEX_UNLOCK (mqueue); - GST_DEBUG_OBJECT (mqueue, "Creating GstSingleQueue id:%d", sq->id); sq->mqueue = mqueue; @@ -1818,6 +1816,8 @@ gst_single_queue_new (GstMultiQueue * mqueue, gint id) gst_pad_set_element_private (sq->sinkpad, (gpointer) sq); gst_pad_set_element_private (sq->srcpad, (gpointer) sq); + GST_MULTI_QUEUE_MUTEX_UNLOCK (mqueue); + /* only activate the pads when we are not in the NULL state * and add the pad under the state_lock to prevend state changes * between activating and adding */ From 03050fd71ddede6980440ec205678b068f84a738 Mon Sep 17 00:00:00 2001 From: Vincent Penquerc'h Date: Wed, 4 May 2011 15:31:56 +0300 Subject: [PATCH 03/30] basesrc: do not set first buffer timestamp to 0 for live sources Doing so avoids a large timestamp gap between first and second buffer for live sources which take time to start up. The first buffer now has a "live" timestamp based on the running time, as other buffers do. https://bugzilla.gnome.org/show_bug.cgi?id=649369 --- libs/gst/base/gstbasesrc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/gst/base/gstbasesrc.c b/libs/gst/base/gstbasesrc.c index 2b59d48bcf..59319e2567 100644 --- a/libs/gst/base/gstbasesrc.c +++ b/libs/gst/base/gstbasesrc.c @@ -2160,7 +2160,7 @@ again: /* no timestamp set and we are at offset 0, we can timestamp with 0 */ if (offset == 0 && src->segment.time == 0 - && GST_BUFFER_TIMESTAMP (*buf) == -1) { + && GST_BUFFER_TIMESTAMP (*buf) == -1 && !src->is_live) { *buf = gst_buffer_make_metadata_writable (*buf); GST_BUFFER_TIMESTAMP (*buf) = 0; } From 3f80f6584f5ef245d3d9af32d593ed50e17668d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sat, 14 May 2011 01:00:23 +0100 Subject: [PATCH 04/30] Release 0.10.34 --- ChangeLog | 82 +++++++- NEWS | 13 +- RELEASE | 203 +------------------ configure.ac | 2 +- docs/plugins/inspect/plugin-coreelements.xml | 2 +- docs/plugins/inspect/plugin-coreindexers.xml | 2 +- gstreamer.doap | 11 + win32/common/config.h | 8 +- win32/common/gstversion.h | 2 +- 9 files changed, 117 insertions(+), 208 deletions(-) diff --git a/ChangeLog b/ChangeLog index bb746fab86..e9e08dce90 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,9 +1,85 @@ -=== release 0.10.33 === +=== release 0.10.34 === -2011-05-10 Tim-Philipp Müller +2011-05-14 Tim-Philipp Müller * configure.ac: - releasing 0.10.33, "Prior Spaceflight Experience is an Advantage" + releasing 0.10.34, "Misfits" + +2011-05-04 15:31:56 +0300 Vincent Penquerc'h + + * libs/gst/base/gstbasesrc.c: + basesrc: do not set first buffer timestamp to 0 for live sources + Doing so avoids a large timestamp gap between first and second buffer + for live sources which take time to start up. + The first buffer now has a "live" timestamp based on the running time, + as other buffers do. + https://bugzilla.gnome.org/show_bug.cgi?id=649369 + +2011-05-10 11:11:15 +0200 Mark Nauwelaerts + + * plugins/elements/gstmultiqueue.c: + multiqueue: ensure thread safety when adding a pad + This seems to be a regression, and was causing crashes. + https://bugzilla.gnome.org/show_bug.cgi?id=649878 + +=== release 0.10.33 === + +2011-05-10 08:55:10 +0100 Tim-Philipp Müller + + * ChangeLog: + * NEWS: + * RELEASE: + * configure.ac: + * docs/plugins/inspect/plugin-coreelements.xml: + * docs/plugins/inspect/plugin-coreindexers.xml: + * gstreamer.doap: + * po/af.po: + * po/az.po: + * po/be.po: + * po/bg.po: + * po/ca.po: + * po/cs.po: + * po/da.po: + * po/de.po: + * po/el.po: + * po/en_GB.po: + * po/es.po: + * po/eu.po: + * po/fi.po: + * po/fr.po: + * po/gl.po: + * po/hu.po: + * po/id.po: + * po/it.po: + * po/ja.po: + * po/lt.po: + * po/nb.po: + * po/nl.po: + * po/pl.po: + * po/pt_BR.po: + * po/ro.po: + * po/ru.po: + * po/rw.po: + * po/sk.po: + * po/sl.po: + * po/sq.po: + * po/sr.po: + * po/sv.po: + * po/tr.po: + * po/uk.po: + * po/vi.po: + * po/zh_CN.po: + * po/zh_TW.po: + * win32/common/config.h: + * win32/common/gstversion.h: + Release 0.10.33 + Highlights: + - new parser base class: GstBaseParse + - new core element: funnel + - OSX multi-arch fixes + - new QoS type for QoS events + - new progress message API to notify applications of asynchronous operations + - countless other fixes and improvements 2011-05-06 23:40:58 +0100 Tim-Philipp Müller diff --git a/NEWS b/NEWS index 2e58ea5379..283b60e5d0 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,15 @@ -This is GStreamer 0.10.33 "Prior Spaceflight Experience is an Advantage" +This is GStreamer 0.10.34 "Misfits" + +Changes since 0.10.33: + + * Fix multiqueue thread-safety regression + * Don't set artificial 0-timestamp on first packet for TIME-based live sources + * Otherwise identical to the previous release (0.10.33) + +Bugs fixed since 0.10.33: + + * 649369 : basesrc: do not set first buffer timestamp to 0 for live sources + * 649878 : multiqueue regression: gst_single_queue_new not MT-safe Changes since 0.10.32: diff --git a/RELEASE b/RELEASE index 41ca358f47..2cad94a3ba 100644 --- a/RELEASE +++ b/RELEASE @@ -1,5 +1,5 @@ -Release notes for GStreamer 0.10.33 "Prior Spaceflight Experience is an Advantage" +Release notes for GStreamer 0.10.34 "Misfits" @@ -37,160 +37,14 @@ contains a set of less supported plug-ins that haven't passed the Features of this release - * atomicqueue: add an atomic/lock-free queue structure based - * bufferlist: improve _add*() performance - * bus: in _add_watch() honour any per-thread default main context set via g_main_thread_push_thread_default() - * caps: new gst_caps_intersect_full() to intersect in different modes - * clock: add functions to re-init existing periodic GstClockIDs - * event: add QoS type (overflow, underflow, throttle) for QoS events - * ghostpad: The internally linked pad of the proxypad is the ghostpad - * gstpoll: retry reading the control socket to release properly all wakeups - * message: new progress message API for asynchronous operations - * pad: unlock before freeing the pad cache to avoid deadlock - * pad: better handling for when parent goes away during data/query/event flow - * parse-launch: allow element names to begin with digits - * pluginloader: call gst-plugin-scanner with the right arch on OSX, fixing hangs with firefox - * registry: fixes elements (features) disappearing if a plugin or plugin file is renamed - * structure: Add "(date)" as a type abbreviation of GDate - * structure: Don't allow invalid GDates in all structures and don't allow NULL GDates in taglists - * taglist: add a new "encoded-by" tag - * uri: add gst_filename_to_uri() that takes relative filenames - * utils: add gst_element_factory_can_{src|sink}_{any|all}_caps() to replace can_{sink,src}_caps() - * baseparse: new GstBaseParse class for parsers - * basesink: improve rate, duration, and average duration calculation - * basesink: use new QoS types and add add "throttle-time" property - * basesrc: Handle tag and custom downstream events the same - * basesrc: keep downstream caps order when fixating, to honour downstream preferences when negotiating - * basesrc: Return FALSE if we don't handle an event - * basesrc: Send synchronized custom downstream/both events downstream from the streaming thread - * basetransform: Be smarter with pad allocs - * basetransform: Check for pad alloc caps when suggestion is not fixed - * basetransform: Retain caps order when getting caps, to honour downstream preferences when negotiating - * funnel: new N-to-1 pipe fitting element imported from farsight - * fakesink: print buffer flags - * filesink: Fix escaping of URIs - * file{sink,src}: Check if non-URI characters are escaped, but only for the URI not the location property - * filesrc, filesink: fix URI creation regression for non-absolute locations - * filesrc: Fix escaping of file uris - * inputselector: Hold the selector lock while reading properties of the active pad - * inputselector: Make sure that EOS is always sent downstream for the active pad - * inputselector: Return GST_FLOW_OK until the selected pad pushed something downstream - * inputselector: Stop waiting for a pad switch when the pad is flushing - * multiqueue: fix some potential corner-case deadlocks and some leaks - * multiqueue: handle arbitrary sink + source pad naming - * queue2: don't read beyond the end of file upstream in pull mode; leak fixes - * plugins: make query and event functions more thread-safe, protect against parent-pad disappearing - * gst-launch: add GstIndex support + * Fix multiqueue thread-safety regression + * Don't set artificial 0-timestamp on first packet for TIME-based live sources + * Otherwise identical to the previous release (0.10.33) Bugs fixed in this release - * 642356 : [Index] review api and add an example - * 402141 : gst_element_factory_can_{sink,src}_caps seems to be broken - * 518857 : [API] GstBaseParse: new base class for parsers - * 604094 : registry: do not remove features when removing a cached plugin that no longer is present - * 615357 : [macosx] Handle multi-arch plugin-scanner - * 617045 : [caps] New method for intersecting caps while retaining order - * 639674 : parse-launch: improve parsing resilience (for escapes at end of string) - * 639962 : design docs: Fix a few typos and a think - * 640071 : pluginloader: do not leak the description string of blacklisted plugin - * 640437 : design docs: fix 2 typos in part-MT-refcounting - * 640502 : fix a few typos - * 640622 : gst_element_link_pads_full function return wrong error information - * 640675 : high cpu-load with 0.10.32 release - * 640850 : GstElement: Fix warning with GCC 4.6 - * 641212 : gst-uninstalled: use $GST_PREFIX variable - * 641928 : gst_pad_push fast path races with pad deactivation - * 642071 : Incorrect comparing of number of source and sink links when parsing a launch string - * 642130 : [basetransform] Check for pad alloc caps when suggestion is not fixed - * 642271 : crash in gst_caps_structure_intersect, encoder_match_media_type - * 642373 : [basetransform] Avoid too may pad allocs - * 642393 : [filesrc] Fails setting the same uri it's setting in the uri queries. - * 642504 : [mingw/cygwin build] correctly export plugin description - * 642522 : gstvalue.c does not include a deserialize function for uchar - * 642869 : gst_index_new: documentation typo - * 643301 : Adding a buffer to a buffer list iterates the list - * 643455 : [regression] Lots of dropouts in Empathy voip calls - * 644935 : [inputselector] During switching of streams it can happen that all pads returned not-linked last - * 645022 : GstTask: typo in GST_TASK_BROADCAST - g_cond_breadcast should probably be g_cond_broadcast - * 645267 : build: fix build with -Werror with GCC 4.6.0 - * 645595 : bytereader, bytewriter: fix warnings when using inline functions with g++ - * 645746 : [gstpoll] Regression causes 100% cpu usage in multifdsink - * 645877 : commit 14d7db1 causes cpu spinning and other bus weirdness - * 645931 : [gstmultiqueue] fix arbitrary sink + source pad naming - * 646118 : [gstmultiqueue] if arbitrary sink number is specified by caller, use this as single queue id - * 646341 : [baseparse] Add a queued flow return so parsers can keep frames in a queue - * 646531 : GST_BOILERPLATE: don't use " type " as both a variable name and a macro argument - * 646566 : Protect against Pad-Parent disappearing - * 646569 : poll: don't call WSAWaitForMultipleEvents with no events - * 646624 : GstBin: regression: creating too many bins fails, exhausting allowed file descriptor limit - * 646811 : baseparse: deadlock in gst_base_parse_set_index - * 646971 : iterator: resync to avoid infinite loop - * 647005 : GstBus: Only create the socketpair for async message delivery if required - * 647131 : recent multiqueue changes break DVD playback (again) - * 647293 : Fix pad callbacks so they handle when parent goes away - * 647763 : [bus] Bus is leaked if a watch is installed in the default main context - * 647844 : baseparse: Remove unused but set variable - * 647922 : [introspection] Needs to call gst_init() before anything else - * 648199 : pad: potential deadlock / crash when freeing cache - * 648215 : basetransform: unref in wrong place - * 648220 : Regression: videoscale fails to negotiate for PAR transformation - * 648297 : [bus] regression: critical assertion failure - * 649195 : [miniobject] Fix dup_mini_object function to handle NULL gvalues - * 635718 : [basesrc] custom, non-OOB events aren't pushed downstream - * 625396 : gst_debug_remove_log_function doesn't remove default log handler - * 640771 : amarok doesn't start with new phonon gstreamer - * 646972 : queue2: Fixes memory leak on out_flushing error in gst_queue2_create_read - * 640665 : basesink: drops too many buffers when there's no duration - -API changed in this release - -- API additions: - - * gst_atomic_queue_length() - * gst_atomic_queue_new() - * gst_atomic_queue_peek() - * gst_atomic_queue_pop() - * gst_atomic_queue_push() - * gst_atomic_queue_ref() - * gst_atomic_queue_unref() - * gst_buffer_list_iterator_get_type() - * gst_caps_intersect_full() - * gst_caps_intersect_mode_get_type() - * gst_clock_periodic_id_reinit() - * gst_element_factory_can_sink_all_caps() - * gst_element_factory_can_sink_any_caps() - * gst_element_factory_can_src_all_caps() - * gst_element_factory_can_src_any_caps() - * gst_event_new_qos_full() - * gst_event_parse_qos_full() - * gst_filename_to_uri() - * gst_message_new_progress() - * gst_message_parse_progress() - * gst_parse_context_get_type() - * gst_progress_type_get_type() - * gst_qos_type_get_type() - * GST_TAG_ENCODED_BY - * gst_base_parse_add_index_entry() - * gst_base_parse_convert_default() - * gst_base_parse_frame_free() - * gst_base_parse_frame_get_type() - * gst_base_parse_frame_init() - * gst_base_parse_frame_new() - * gst_base_parse_get_type() - * gst_base_parse_push_frame() - * gst_base_parse_set_average_bitrate() - * gst_base_parse_set_duration() - * gst_base_parse_set_frame_rate() - * gst_base_parse_set_has_timing_info() - * gst_base_parse_set_min_frame_size() - * gst_base_parse_set_passthrough() - * gst_base_parse_set_syncable() - * gst_base_sink_get_throttle_time() - * gst_base_sink_set_throttle_time() -- API deprecations: - - * gst_element_factory_can_src_caps() - * gst_element_factory_can_sink_caps() + * 649369 : basesrc: do not set first buffer timestamp to 0 for live sources + * 649878 : [multiqueue] regression: gst_single_queue_new not MT-safe Download @@ -224,49 +78,6 @@ Let us know if you want to be added to this list. Contributors to this release - * Alessandro Decina - * Andoni Morales Alastruey - * Andreas Frisch - * Arun Raghavan - * Bastien Nocera - * Cai Yuanqing - * Chen Rui - * Daniel Macks - * David Schleef - * Edward Hervey - * Fraxinas - * Havard Graff - * Idar Tollefsen - * Jan Schmidt - * Janne Grunau - * Jason D. Clinton - * Jonas Holmberg - * Jonathan Matthew - * Josep Torra - * Joshua M. Doe - * Julien Moutte - * Luis de Bethencourt * Mark Nauwelaerts - * Mart Raudsepp - * Michael Smith - * Miguel Angel Cabrera Moya - * Ole André Vadla Ravnås - * Olivier Crête - * Peter Collingbourne - * Philip Jägenstedt - * René Stadler - * Robert Swain - * Sebastian Dröge - * Sreerenj Balachandran - * Stefan Kost - * Stian Selnes - * Thiago Santos - * Thijs Vermeir - * Thomas Kristensen - * Tim-Philipp Müller * Vincent Penquerc'h - * Wim Taymans - * Yang Xichuan - * Zaheer Abbas Merali - * Zhang Wanming -  \ No newline at end of file +  diff --git a/configure.ac b/configure.ac index 8e4277a08c..4719acdd00 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ(2.60) dnl initialize autoconf dnl when going to/from release please set the nano (fourth number) right ! dnl releases only do Wall, git and prerelease does Werror too -AC_INIT(GStreamer, 0.10.33, +AC_INIT(GStreamer, 0.10.34, http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer, gstreamer) AG_GST_INIT diff --git a/docs/plugins/inspect/plugin-coreelements.xml b/docs/plugins/inspect/plugin-coreelements.xml index c28fd82299..9464b9588e 100644 --- a/docs/plugins/inspect/plugin-coreelements.xml +++ b/docs/plugins/inspect/plugin-coreelements.xml @@ -3,7 +3,7 @@ standard GStreamer elements ../../plugins/elements/.libs/libgstcoreelements.so libgstcoreelements.so - 0.10.33 + 0.10.34 LGPL gstreamer GStreamer source release diff --git a/docs/plugins/inspect/plugin-coreindexers.xml b/docs/plugins/inspect/plugin-coreindexers.xml index 7df1162a79..7ffd8be724 100644 --- a/docs/plugins/inspect/plugin-coreindexers.xml +++ b/docs/plugins/inspect/plugin-coreindexers.xml @@ -3,7 +3,7 @@ GStreamer core indexers ../../plugins/indexers/.libs/libgstcoreindexers.so libgstcoreindexers.so - 0.10.33 + 0.10.34 LGPL gstreamer GStreamer source release diff --git a/gstreamer.doap b/gstreamer.doap index e5663d6e73..807322b06e 100644 --- a/gstreamer.doap +++ b/gstreamer.doap @@ -38,6 +38,17 @@ hierarchy, and a set of media-agnostic core elements. + + + 0.10.34 + 0.10 + Misfits + 2011-05-13 + + + + + 0.10.33 diff --git a/win32/common/config.h b/win32/common/config.h index 323f14f8a2..e35e70273d 100644 --- a/win32/common/config.h +++ b/win32/common/config.h @@ -65,7 +65,7 @@ #define GST_PACKAGE_ORIGIN "Unknown package origin" /* GStreamer package release date/time for plugins as YYYY-MM-DD */ -#define GST_PACKAGE_RELEASE_DATETIME "2011-05-10" +#define GST_PACKAGE_RELEASE_DATETIME "2011-05-13" /* location of the installed gst-plugin-scanner */ #define GST_PLUGIN_SCANNER_INSTALLED LIBDIR "\\gst-plugin-scanner" @@ -340,7 +340,7 @@ #define PACKAGE_NAME "GStreamer" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "GStreamer 0.10.33" +#define PACKAGE_STRING "GStreamer 0.10.34" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "gstreamer" @@ -349,7 +349,7 @@ #undef PACKAGE_URL /* Define to the version of this package. */ -#define PACKAGE_VERSION "0.10.33" +#define PACKAGE_VERSION "0.10.34" /* directory where plugins are located */ #ifdef _DEBUG @@ -380,7 +380,7 @@ #undef USE_POISONING /* Version number of package */ -#define VERSION "0.10.33" +#define VERSION "0.10.34" /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ diff --git a/win32/common/gstversion.h b/win32/common/gstversion.h index e5dc0bd921..ba015672c9 100644 --- a/win32/common/gstversion.h +++ b/win32/common/gstversion.h @@ -57,7 +57,7 @@ G_BEGIN_DECLS * * The micro version of GStreamer at compile time: */ -#define GST_VERSION_MICRO (33) +#define GST_VERSION_MICRO (34) /** * GST_VERSION_NANO: * From 2fd64257fda45bba800cce92d5cf418c3b302931 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sat, 14 May 2011 09:31:33 +0100 Subject: [PATCH 05/30] Back to development --- configure.ac | 2 +- docs/plugins/inspect/plugin-coreelements.xml | 4 ++-- docs/plugins/inspect/plugin-coreindexers.xml | 4 ++-- win32/common/config.h | 10 +++++----- win32/common/gstversion.h | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/configure.ac b/configure.ac index 4719acdd00..6b29d6f90e 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ(2.60) dnl initialize autoconf dnl when going to/from release please set the nano (fourth number) right ! dnl releases only do Wall, git and prerelease does Werror too -AC_INIT(GStreamer, 0.10.34, +AC_INIT(GStreamer, 0.10.34.1, http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer, gstreamer) AG_GST_INIT diff --git a/docs/plugins/inspect/plugin-coreelements.xml b/docs/plugins/inspect/plugin-coreelements.xml index 9464b9588e..aef69a7148 100644 --- a/docs/plugins/inspect/plugin-coreelements.xml +++ b/docs/plugins/inspect/plugin-coreelements.xml @@ -3,10 +3,10 @@ standard GStreamer elements ../../plugins/elements/.libs/libgstcoreelements.so libgstcoreelements.so - 0.10.34 + 0.10.34.1 LGPL gstreamer - GStreamer source release + GStreamer git Unknown package origin diff --git a/docs/plugins/inspect/plugin-coreindexers.xml b/docs/plugins/inspect/plugin-coreindexers.xml index 7ffd8be724..e8d2401b20 100644 --- a/docs/plugins/inspect/plugin-coreindexers.xml +++ b/docs/plugins/inspect/plugin-coreindexers.xml @@ -3,10 +3,10 @@ GStreamer core indexers ../../plugins/indexers/.libs/libgstcoreindexers.so libgstcoreindexers.so - 0.10.34 + 0.10.34.1 LGPL gstreamer - GStreamer source release + GStreamer git Unknown package origin diff --git a/win32/common/config.h b/win32/common/config.h index e35e70273d..74e6fc42f9 100644 --- a/win32/common/config.h +++ b/win32/common/config.h @@ -59,13 +59,13 @@ #define GST_MAJORMINOR "0.10" /* package name in plugins */ -#define GST_PACKAGE_NAME "GStreamer source release" +#define GST_PACKAGE_NAME "GStreamer git" /* package origin */ #define GST_PACKAGE_ORIGIN "Unknown package origin" /* GStreamer package release date/time for plugins as YYYY-MM-DD */ -#define GST_PACKAGE_RELEASE_DATETIME "2011-05-13" +#define GST_PACKAGE_RELEASE_DATETIME "2011-05-14T08:26Z" /* location of the installed gst-plugin-scanner */ #define GST_PLUGIN_SCANNER_INSTALLED LIBDIR "\\gst-plugin-scanner" @@ -340,7 +340,7 @@ #define PACKAGE_NAME "GStreamer" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "GStreamer 0.10.34" +#define PACKAGE_STRING "GStreamer 0.10.34.1" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "gstreamer" @@ -349,7 +349,7 @@ #undef PACKAGE_URL /* Define to the version of this package. */ -#define PACKAGE_VERSION "0.10.34" +#define PACKAGE_VERSION "0.10.34.1" /* directory where plugins are located */ #ifdef _DEBUG @@ -380,7 +380,7 @@ #undef USE_POISONING /* Version number of package */ -#define VERSION "0.10.34" +#define VERSION "0.10.34.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/gstversion.h b/win32/common/gstversion.h index ba015672c9..be93d1ae33 100644 --- a/win32/common/gstversion.h +++ b/win32/common/gstversion.h @@ -64,7 +64,7 @@ G_BEGIN_DECLS * The nano version of GStreamer at compile time: * Actual releases have 0, GIT versions have 1, prerelease versions have 2-... */ -#define GST_VERSION_NANO (0) +#define GST_VERSION_NANO (1) /** * GST_CHECK_VERSION: From f3f1f7d69a84447aa6a5c55de271b42c1672f6ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Mon, 18 Apr 2011 09:49:04 +0200 Subject: [PATCH 06/30] bin: If activating one pad failed error out early instead of trying to activate the next pads If one pad fails to activate the complete activation process will fail anyway and trying to activate the other pads only wastes time. --- gst/gstbin.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/gst/gstbin.c b/gst/gstbin.c index 73758213e9..52777df2bc 100644 --- a/gst/gstbin.c +++ b/gst/gstbin.c @@ -2226,24 +2226,23 @@ unneeded: } /* gst_iterator_fold functions for pads_activate - * Note how we don't stop the iterator when we fail an activation. This is - * probably a FIXME since when one pad activation fails, we don't want to - * continue our state change. */ + * Stop the iterator if activating one pad failed. */ static gboolean activate_pads (GstPad * pad, GValue * ret, gboolean * active) { - if (!gst_pad_set_active (pad, *active)) + gboolean cont = TRUE; + + if (!(cont = gst_pad_set_active (pad, *active))) g_value_set_boolean (ret, FALSE); else if (!*active) gst_pad_set_caps (pad, NULL); /* unref the object that was reffed for us by _fold */ gst_object_unref (pad); - return TRUE; + return cont; } -/* returns false on error or early cutout (will never happen because the fold - * function always returns TRUE, see FIXME above) of the fold, true if all +/* returns false on error or early cutout of the fold, true if all * pads in @iter were (de)activated successfully. */ static gboolean iterator_activate_fold_with_resync (GstIterator * iter, gpointer user_data) From 2f947f3993fd756e247a8a76b0110954a014fa6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Mon, 18 Apr 2011 09:53:55 +0200 Subject: [PATCH 07/30] element: If activating one pad failed error out early instead of trying to activate the next pads If one pad fails to activate the complete activation process will fail anyway and trying to activate the other pads only wastes time. --- gst/gstelement.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/gst/gstelement.c b/gst/gstelement.c index 12fc6fac8a..c2a8eb3a95 100644 --- a/gst/gstelement.c +++ b/gst/gstelement.c @@ -2793,18 +2793,18 @@ invalid_return: } /* gst_iterator_fold functions for pads_activate - * Note how we don't stop the iterator when we fail an activation. This is - * probably a FIXME since when one pad activation fails, we don't want to - * continue our state change. */ + * Stop the iterator if activating one pad failed. */ static gboolean activate_pads (GstPad * pad, GValue * ret, gboolean * active) { - if (!gst_pad_set_active (pad, *active)) + gboolean cont = TRUE; + + if (!(cont = gst_pad_set_active (pad, *active))) g_value_set_boolean (ret, FALSE); /* unref the object that was reffed for us by _fold */ gst_object_unref (pad); - return TRUE; + return cont; } /* set the caps on the pad to NULL */ @@ -2816,8 +2816,7 @@ clear_caps (GstPad * pad, GValue * ret, gboolean * active) return TRUE; } -/* returns false on error or early cutout (will never happen because the fold - * function always returns TRUE, see FIXME above) of the fold, true if all +/* returns false on error or early cutout of the fold, true if all * pads in @iter were (de)activated successfully. */ static gboolean iterator_activate_fold_with_resync (GstIterator * iter, From f07b637d86ef502305a7b8ed0ba7dd3844ef92cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Mon, 18 Apr 2011 10:04:24 +0200 Subject: [PATCH 08/30] pad: Remove unnecessary FIXME Resetting the result is not necessary when resyncing because pads that previously got the event will be skipped and we need to consider the results of the previous pushes. --- gst/gstpad.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gst/gstpad.c b/gst/gstpad.c index a599d424e3..6685094977 100644 --- a/gst/gstpad.c +++ b/gst/gstpad.c @@ -3570,8 +3570,9 @@ gst_pad_event_default_dispatch (GstPad * pad, GstEvent * event) gst_object_unref (item); break; case GST_ITERATOR_RESYNC: - /* FIXME, if we want to reset the result value we need to remember which - * pads pushed with which result */ + /* We don't reset the result here because we don't push the event + * again on pads that got the event already and because we need + * to consider the result of the previous pushes */ gst_iterator_resync (iter); break; case GST_ITERATOR_ERROR: From f450817d7f3a1dc46d481f7a2285fa0fb451132f Mon Sep 17 00:00:00 2001 From: Miguel Angel Cabrera Moya Date: Wed, 20 Apr 2011 22:52:36 +0200 Subject: [PATCH 09/30] parse: don't unescape inside quotes Escaped characters inside quoted strings are supposed to be unescaped by deserialization functions, not by parsing functions. https://bugzilla.gnome.org/show_bug.cgi?id=648025 --- gst/parse/types.h | 9 ++++++++- tests/check/pipelines/parse-launch.c | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/gst/parse/types.h b/gst/parse/types.h index 7e8b994455..db1f585646 100644 --- a/gst/parse/types.h +++ b/gst/parse/types.h @@ -69,17 +69,24 @@ static inline void gst_parse_unescape (gchar *str) { gchar *walk; + gboolean in_quotes; g_return_if_fail (str != NULL); walk = str; + in_quotes = FALSE; while (*walk) { - if (*walk == '\\') { + if (*walk == '\\' && !in_quotes) { walk++; /* make sure we don't read beyond the end of the string */ if (*walk == '\0') break; + } else if (*walk == '"' && (!in_quotes || (in_quotes + && (*(walk - 1) != '\\')))) { + /* don't unescape inside quotes and don't switch + * state with escaped quoted inside quotes */ + in_quotes = !in_quotes; } *str = *walk; str++; diff --git a/tests/check/pipelines/parse-launch.c b/tests/check/pipelines/parse-launch.c index 3c7fdf9f65..072ef74952 100644 --- a/tests/check/pipelines/parse-launch.c +++ b/tests/check/pipelines/parse-launch.c @@ -145,6 +145,8 @@ GST_END_TEST; #define PIPELINE11 "fakesink silent=true name = sink identity silent=true name=id ( fakesrc num-buffers=\"4\" ! id. ) id. ! sink." #define PIPELINE12 "file:///tmp/test.file ! fakesink silent=true" #define PIPELINE13 "fakesrc ! file:///tmp/test.file" +#define PIPELINE14 "capsfilter caps=application/x-rtp,sprop-parameter-sets=(string)\"x\\,x\"" +#define PIPELINE15 "capsfilter caps=application/x-rtp,sprop-parameter-sets=(string)\"x\\\"x\\,x\"" GST_START_TEST (test_launch_lines2) { @@ -285,6 +287,19 @@ GST_START_TEST (test_launch_lines2) * This should warn, but ignore the error and carry on */ cur = setup_pipeline ("( filesrc blocksize=4 location=/dev/null @ )"); gst_object_unref (cur); + + /** + * Checks if characters inside quotes are not escaped. + */ + cur = setup_pipeline (PIPELINE14); + gst_object_unref (cur); + + /** + * Checks if escaped quotes inside quotes are not treated as end string quotes. + * This would make the rest of characters to be escaped incorrectly. + */ + cur = setup_pipeline (PIPELINE15); + gst_object_unref (cur); } GST_END_TEST; From b4bed6e09ee04d59e962dd4e9107769470d70153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 3 May 2011 17:26:53 +0200 Subject: [PATCH 10/30] basetransform: Prefer caps order given by the subclass of the template caps order --- libs/gst/base/gstbasetransform.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libs/gst/base/gstbasetransform.c b/libs/gst/base/gstbasetransform.c index ccf0802c24..850f2f6409 100644 --- a/libs/gst/base/gstbasetransform.c +++ b/libs/gst/base/gstbasetransform.c @@ -853,7 +853,9 @@ gst_base_transform_find_transform (GstBaseTransform * trans, GstPad * pad, GST_DEBUG_OBJECT (trans, "intersecting against padtemplate %" GST_PTR_FORMAT, templ_caps); - intersect = gst_caps_intersect (othercaps, templ_caps); + intersect = + gst_caps_intersect_full (othercaps, templ_caps, + GST_CAPS_INTERSECT_FIRST); gst_caps_unref (othercaps); othercaps = intersect; From f56c6e12255b37d75b1eb949e434fa8e3bb33f51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 4 May 2011 11:29:15 +0200 Subject: [PATCH 11/30] basetransform: In getcaps() prefer the caps order and caps of downstream if possible --- libs/gst/base/gstbasetransform.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/libs/gst/base/gstbasetransform.c b/libs/gst/base/gstbasetransform.c index 850f2f6409..34bd6563fb 100644 --- a/libs/gst/base/gstbasetransform.c +++ b/libs/gst/base/gstbasetransform.c @@ -654,26 +654,25 @@ gst_base_transform_getcaps (GstPad * pad) { GstBaseTransform *trans; GstPad *otherpad; - GstCaps *caps; + GstCaps *peercaps, *caps; trans = GST_BASE_TRANSFORM (gst_pad_get_parent (pad)); otherpad = (pad == trans->srcpad) ? trans->sinkpad : trans->srcpad; /* we can do what the peer can */ - caps = gst_pad_peer_get_caps_reffed (otherpad); - if (caps) { + peercaps = gst_pad_peer_get_caps_reffed (otherpad); + if (peercaps) { GstCaps *temp; const GstCaps *templ; - GST_DEBUG_OBJECT (pad, "peer caps %" GST_PTR_FORMAT, caps); + GST_DEBUG_OBJECT (pad, "peer caps %" GST_PTR_FORMAT, peercaps); /* filtered against our padtemplate on the other side */ templ = gst_pad_get_pad_template_caps (otherpad); GST_DEBUG_OBJECT (pad, "our template %" GST_PTR_FORMAT, templ); - temp = gst_caps_intersect (caps, templ); + temp = gst_caps_intersect_full (peercaps, templ, GST_CAPS_INTERSECT_FIRST); GST_DEBUG_OBJECT (pad, "intersected %" GST_PTR_FORMAT, temp); - gst_caps_unref (caps); /* then see what we can transform this to */ caps = gst_base_transform_transform_caps (trans, @@ -690,8 +689,16 @@ gst_base_transform_getcaps (GstPad * pad) temp = gst_caps_intersect_full (caps, templ, GST_CAPS_INTERSECT_FIRST); GST_DEBUG_OBJECT (pad, "intersected %" GST_PTR_FORMAT, temp); gst_caps_unref (caps); - /* this is what we can do */ caps = temp; + + /* Now try if we can put the untransformed downstream caps first */ + temp = gst_caps_intersect_full (peercaps, caps, GST_CAPS_INTERSECT_FIRST); + if (!gst_caps_is_empty (temp)) { + gst_caps_merge (temp, caps); + caps = temp; + } else { + gst_caps_unref (temp); + } } else { /* no peer or the peer can do anything, our padtemplate is enough then */ caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); @@ -700,6 +707,9 @@ gst_base_transform_getcaps (GstPad * pad) done: GST_DEBUG_OBJECT (trans, "returning %" GST_PTR_FORMAT, caps); + if (peercaps) + gst_caps_unref (peercaps); + gst_object_unref (trans); return caps; From 6e57ce32e5b2a27bae464c85f7414efbe44632a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 5 May 2011 11:28:38 +0200 Subject: [PATCH 12/30] caps: Merge structures when intersecting instead of appending them This prevents adding duplicates over and over again to the resulting caps if they already describe the new intersection result. While this changes intersection from O(n*m) to O(n^2*m), it results in smaller caps, which in the end will decrease further processing times. For example in an audioconvert ! audioconvert ! audioconvert pipeline, when forwarding the downstream caps preference in basetransform (see e26da72de25a91c3eaad9f7c8b2f53ba888a0394) this results in 16 instead of 191 caps structures. --- gst/gstcaps.c | 4 ++-- tests/check/gst/gstcaps.c | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/gst/gstcaps.c b/gst/gstcaps.c index 5d8912c4d3..84fce69a18 100644 --- a/gst/gstcaps.c +++ b/gst/gstcaps.c @@ -1476,7 +1476,7 @@ gst_caps_intersect_zig_zag (const GstCaps * caps1, const GstCaps * caps2) istruct = gst_caps_structure_intersect (struct1, struct2); - gst_caps_append_structure (dest, istruct); + gst_caps_merge_structure (dest, istruct); /* move down left */ k++; if (G_UNLIKELY (j == 0)) @@ -1535,7 +1535,7 @@ gst_caps_intersect_first (const GstCaps * caps1, const GstCaps * caps2) struct2 = gst_caps_get_structure_unchecked (caps2, j); istruct = gst_caps_structure_intersect (struct1, struct2); if (istruct) - gst_caps_append_structure (dest, istruct); + gst_caps_merge_structure (dest, istruct); } } diff --git a/tests/check/gst/gstcaps.c b/tests/check/gst/gstcaps.c index fa160d91dd..a22c15f0d2 100644 --- a/tests/check/gst/gstcaps.c +++ b/tests/check/gst/gstcaps.c @@ -811,6 +811,24 @@ GST_START_TEST (test_intersect_first2) GST_END_TEST; +GST_START_TEST (test_intersect_duplication) +{ + GstCaps *c1, *c2, *test; + + c1 = gst_caps_from_string + ("audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]"); + c2 = gst_caps_from_string + ("audio/x-raw-int, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }; audio/x-raw-int, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 11 ], endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }; audio/x-raw-int, width=(int)16, depth=(int)[ 1, 16 ], rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 11 ], endianness=(int){ 1234, 4321 }, signed=(boolean){ true, false }"); + + test = gst_caps_intersect_full (c1, c2, GST_CAPS_INTERSECT_FIRST); + fail_unless_equals_int (gst_caps_get_size (test), 1); + fail_unless (gst_caps_is_equal (c1, test)); + gst_caps_unref (c1); + gst_caps_unref (c2); + gst_caps_unref (test); +} + +GST_END_TEST; static gboolean _caps_is_fixed_foreach (GQuark field_id, const GValue * value, gpointer unused) @@ -921,6 +939,7 @@ gst_caps_suite (void) tcase_add_test (tc_chain, test_intersect_zigzag); tcase_add_test (tc_chain, test_intersect_first); tcase_add_test (tc_chain, test_intersect_first2); + tcase_add_test (tc_chain, test_intersect_duplication); tcase_add_test (tc_chain, test_normalize); tcase_add_test (tc_chain, test_broken); From e8688b62b2d0536509c3b35bb962fa4dfe0de7d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 5 May 2011 17:54:56 +0200 Subject: [PATCH 13/30] basetransform: When trying to fixate the sink suggestion prefer its structure order --- libs/gst/base/gstbasetransform.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/libs/gst/base/gstbasetransform.c b/libs/gst/base/gstbasetransform.c index 34bd6563fb..a46642ea24 100644 --- a/libs/gst/base/gstbasetransform.c +++ b/libs/gst/base/gstbasetransform.c @@ -1799,7 +1799,9 @@ gst_base_transform_buffer_alloc (GstPad * pad, guint64 offset, guint size, if (peercaps) { GstCaps *intersect; - intersect = gst_caps_intersect (peercaps, sink_suggest); + intersect = + gst_caps_intersect_full (sink_suggest, peercaps, + GST_CAPS_INTERSECT_FIRST); gst_caps_unref (peercaps); gst_caps_unref (sink_suggest); sink_suggest = intersect; @@ -1814,7 +1816,9 @@ gst_base_transform_buffer_alloc (GstPad * pad, guint64 offset, guint size, GST_DEBUG_OBJECT (trans, "Checking if the input caps is compatible " "with the non-fixed caps suggestion"); - intersect = gst_caps_intersect (sink_suggest, caps); + intersect = + gst_caps_intersect_full (sink_suggest, caps, + GST_CAPS_INTERSECT_FIRST); if (!gst_caps_is_empty (intersect)) { GST_DEBUG_OBJECT (trans, "It is, using it"); gst_caps_replace (&sink_suggest, caps); From a216426bb60fcbda83fc28a8e2073964c51bfd8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 6 May 2011 15:16:09 +0200 Subject: [PATCH 14/30] ghostpad: API: Expose gst_proxy_pad_get_internal() This allows to get the internal pad of ghostpads and proxypads without using gst_pad_iterate_internal_links() and is much more convenient. The internal pad of a ghostpad is the pad of the opposite direction that is used to link to the ghostpad target. --- docs/gst/gstreamer-sections.txt | 6 ++++++ gst/gstghostpad.c | 27 +++++++++++++++++++++------ gst/gstghostpad.h | 2 ++ tests/check/gst/gstghostpad.c | 10 +++++++++- win32/common/libgstreamer.def | 1 + 5 files changed, 39 insertions(+), 7 deletions(-) diff --git a/docs/gst/gstreamer-sections.txt b/docs/gst/gstreamer-sections.txt index e1eba92c66..6b4bcb4c9e 100644 --- a/docs/gst/gstreamer-sections.txt +++ b/docs/gst/gstreamer-sections.txt @@ -902,14 +902,20 @@ gst_format_get_type
gstghostpad GstGhostPad +GstProxyPad GstGhostPad + gst_ghost_pad_new gst_ghost_pad_new_no_target gst_ghost_pad_new_from_template gst_ghost_pad_new_no_target_from_template + gst_ghost_pad_set_target gst_ghost_pad_get_target + gst_ghost_pad_construct + +gst_proxy_pad_get_internal GstGhostPadClass GST_GHOST_PAD diff --git a/gst/gstghostpad.c b/gst/gstghostpad.c index 313759d5a4..0a62052deb 100644 --- a/gst/gstghostpad.c +++ b/gst/gstghostpad.c @@ -73,7 +73,6 @@ struct _GstProxyPadPrivate G_DEFINE_TYPE (GstProxyPad, gst_proxy_pad, GST_TYPE_PAD); static GstPad *gst_proxy_pad_get_target (GstPad * pad); -static GstPad *gst_proxy_pad_get_internal (GstPad * pad); static void gst_proxy_pad_dispose (GObject * object); static void gst_proxy_pad_finalize (GObject * object); @@ -108,7 +107,8 @@ static gboolean gst_proxy_pad_do_event (GstPad * pad, GstEvent * event) { gboolean res = FALSE; - GstPad *internal = gst_proxy_pad_get_internal (pad); + GstPad *internal = + GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD_CAST (pad))); if (internal) { res = gst_pad_push_event (internal, event); @@ -152,7 +152,8 @@ gst_proxy_pad_do_bufferalloc (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf) { GstFlowReturn result = GST_FLOW_WRONG_STATE; - GstPad *internal = gst_proxy_pad_get_internal (pad); + GstPad *internal = + GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD_CAST (pad))); if (internal) { result = gst_pad_alloc_buffer (internal, offset, size, caps, buf); @@ -364,18 +365,32 @@ gst_proxy_pad_get_target (GstPad * pad) return target; } -static GstPad * -gst_proxy_pad_get_internal (GstPad * pad) +/** + * gst_proxy_pad_get_internal: + * @pad: the #GstProxyPad + * + * Get the internal pad of @pad. Unref target pad after usage. + * + * The internal pad of a #GstGhostPad is the internally used + * pad of opposite direction, which is used to link to the target. + * + * Returns: (transfer full): the target #GstProxyPad, can be NULL. + * Unref target pad after usage. + */ +GstProxyPad * +gst_proxy_pad_get_internal (GstProxyPad * pad) { GstPad *internal; + g_return_val_if_fail (GST_IS_PROXY_PAD (pad), NULL); + GST_PROXY_LOCK (pad); internal = GST_PROXY_PAD_INTERNAL (pad); if (internal) gst_object_ref (internal); GST_PROXY_UNLOCK (pad); - return internal; + return GST_PROXY_PAD_CAST (internal); } static void diff --git a/gst/gstghostpad.h b/gst/gstghostpad.h index f492a74b59..b9ef0dcc96 100644 --- a/gst/gstghostpad.h +++ b/gst/gstghostpad.h @@ -59,6 +59,8 @@ struct _GstProxyPadClass GType gst_proxy_pad_get_type (void); +GstProxyPad* gst_proxy_pad_get_internal (GstProxyPad *pad); + #define GST_TYPE_GHOST_PAD (gst_ghost_pad_get_type ()) #define GST_IS_GHOST_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GHOST_PAD)) diff --git a/tests/check/gst/gstghostpad.c b/tests/check/gst/gstghostpad.c index b78538aaa4..332f6540a1 100644 --- a/tests/check/gst/gstghostpad.c +++ b/tests/check/gst/gstghostpad.c @@ -255,7 +255,7 @@ GST_END_TEST; GST_START_TEST (test_link) { GstElement *b1, *b2, *src, *sink; - GstPad *srcpad, *sinkpad, *gpad; + GstPad *srcpad, *sinkpad, *gpad, *ppad, *tmp; GstPadLinkReturn ret; b1 = gst_element_factory_make ("pipeline", NULL); @@ -278,6 +278,14 @@ GST_START_TEST (test_link) /* now setup a ghostpad */ gpad = gst_ghost_pad_new ("sink", sinkpad); + + /* Check if the internal pads are set correctly */ + ppad = GST_PAD (gst_proxy_pad_get_internal (GST_PROXY_PAD (gpad))); + fail_unless (ppad == GST_PAD_PEER (sinkpad)); + tmp = GST_PAD (gst_proxy_pad_get_internal (GST_PROXY_PAD (ppad))); + fail_unless (tmp == gpad); + gst_object_unref (tmp); + gst_object_unref (ppad); gst_object_unref (sinkpad); /* need to ref as _add_pad takes ownership */ gst_object_ref (gpad); diff --git a/win32/common/libgstreamer.def b/win32/common/libgstreamer.def index ca4154d989..e0e98e917c 100644 --- a/win32/common/libgstreamer.def +++ b/win32/common/libgstreamer.def @@ -832,6 +832,7 @@ EXPORTS gst_print_element_args gst_print_pad_caps gst_progress_type_get_type + gst_proxy_pad_get_internal gst_proxy_pad_get_type gst_qos_type_get_type gst_query_add_buffering_range From b36ce63f38f504e06e2c56168939b7c3ccdefdaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 6 May 2011 15:25:04 +0200 Subject: [PATCH 15/30] ghostpad: Only implement the iterate_internal_links function on proxypads ghostpads inherit it from their parent class. Also make it threadsafe. --- gst/gstghostpad.c | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/gst/gstghostpad.c b/gst/gstghostpad.c index 0a62052deb..b50d8afe30 100644 --- a/gst/gstghostpad.c +++ b/gst/gstghostpad.c @@ -136,12 +136,16 @@ static GstIterator * gst_proxy_pad_do_iterate_internal_links (GstPad * pad) { GstIterator *res = NULL; - GstPad *internal = GST_PROXY_PAD_INTERNAL (pad); + GstPad *internal; + + internal = + GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD_CAST (pad))); if (internal) { res = gst_iterator_new_single (GST_TYPE_PAD, internal, (GstCopyFunction) gst_object_ref, (GFreeFunc) gst_object_unref); + gst_object_unref (internal); } return res; @@ -816,21 +820,6 @@ gst_ghost_pad_do_setcaps (GstPad * pad, GstCaps * caps) return gst_proxy_pad_do_setcaps (pad, caps); } -static GstIterator * -gst_ghost_pad_do_iterate_internal_links (GstPad * pad) -{ - GstIterator *res = NULL; - GstPad *internal = GST_PROXY_PAD_INTERNAL (GST_GHOST_PAD_CAST (pad)); - - if (internal) { - res = - gst_iterator_new_single (GST_TYPE_PAD, internal, - (GstCopyFunction) gst_object_ref, (GFreeFunc) gst_object_unref); - } - - return res; -} - static void gst_ghost_pad_class_init (GstGhostPadClass * klass) { @@ -859,8 +848,6 @@ gst_ghost_pad_init (GstGhostPad * pad) gst_ghost_pad_do_activate_pull); gst_pad_set_activatepush_function (GST_PAD_CAST (pad), gst_ghost_pad_do_activate_push); - gst_pad_set_iterate_internal_links_function (GST_PAD_CAST (pad), - gst_ghost_pad_do_iterate_internal_links); } static void From 4c1e594ae58617eff3ee8662572abfd97fe4c30e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 6 May 2011 15:50:20 +0200 Subject: [PATCH 16/30] ghostpad: Make all the internal caps functions public This is useful if ghostpad/proxypads should be used but additional code should be executed, e.g. for tracking segments in the event function. --- gst/gstghostpad.c | 36 ++++++++++++++++++------------------ gst/gstghostpad.h | 20 ++++++++++++++++++++ 2 files changed, 38 insertions(+), 18 deletions(-) diff --git a/gst/gstghostpad.c b/gst/gstghostpad.c index b50d8afe30..bfdd3299e6 100644 --- a/gst/gstghostpad.c +++ b/gst/gstghostpad.c @@ -90,7 +90,7 @@ static void on_src_target_notify (GstPad * target, static GParamSpec *pspec_caps = NULL; -static const GstQueryType * +const GstQueryType * gst_proxy_pad_do_query_type (GstPad * pad) { GstPad *target = gst_proxy_pad_get_target (pad); @@ -103,7 +103,7 @@ gst_proxy_pad_do_query_type (GstPad * pad) return res; } -static gboolean +gboolean gst_proxy_pad_do_event (GstPad * pad, GstEvent * event) { gboolean res = FALSE; @@ -118,7 +118,7 @@ gst_proxy_pad_do_event (GstPad * pad, GstEvent * event) return res; } -static gboolean +gboolean gst_proxy_pad_do_query (GstPad * pad, GstQuery * query) { gboolean res = FALSE; @@ -132,7 +132,7 @@ gst_proxy_pad_do_query (GstPad * pad, GstQuery * query) return res; } -static GstIterator * +GstIterator * gst_proxy_pad_do_iterate_internal_links (GstPad * pad) { GstIterator *res = NULL; @@ -151,7 +151,7 @@ gst_proxy_pad_do_iterate_internal_links (GstPad * pad) return res; } -static GstFlowReturn +GstFlowReturn gst_proxy_pad_do_bufferalloc (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf) { @@ -167,7 +167,7 @@ gst_proxy_pad_do_bufferalloc (GstPad * pad, guint64 offset, guint size, return result; } -static GstFlowReturn +GstFlowReturn gst_proxy_pad_do_chain (GstPad * pad, GstBuffer * buffer) { GstFlowReturn res; @@ -178,7 +178,7 @@ gst_proxy_pad_do_chain (GstPad * pad, GstBuffer * buffer) return res; } -static GstFlowReturn +GstFlowReturn gst_proxy_pad_do_chain_list (GstPad * pad, GstBufferList * list) { GstFlowReturn res; @@ -189,7 +189,7 @@ gst_proxy_pad_do_chain_list (GstPad * pad, GstBufferList * list) return res; } -static GstFlowReturn +GstFlowReturn gst_proxy_pad_do_getrange (GstPad * pad, guint64 offset, guint size, GstBuffer ** buffer) { @@ -201,7 +201,7 @@ gst_proxy_pad_do_getrange (GstPad * pad, guint64 offset, guint size, return res; } -static gboolean +gboolean gst_proxy_pad_do_checkgetrange (GstPad * pad) { gboolean result; @@ -212,7 +212,7 @@ gst_proxy_pad_do_checkgetrange (GstPad * pad) return result; } -static GstCaps * +GstCaps * gst_proxy_pad_do_getcaps (GstPad * pad) { GstPad *target = gst_proxy_pad_get_target (pad); @@ -261,7 +261,7 @@ done: return res; } -static gboolean +gboolean gst_proxy_pad_do_acceptcaps (GstPad * pad, GstCaps * caps) { GstPad *target = gst_proxy_pad_get_target (pad); @@ -279,7 +279,7 @@ gst_proxy_pad_do_acceptcaps (GstPad * pad, GstCaps * caps) return res; } -static void +void gst_proxy_pad_do_fixatecaps (GstPad * pad, GstCaps * caps) { GstPad *target = gst_proxy_pad_get_target (pad); @@ -290,7 +290,7 @@ gst_proxy_pad_do_fixatecaps (GstPad * pad, GstCaps * caps) } } -static gboolean +gboolean gst_proxy_pad_do_setcaps (GstPad * pad, GstCaps * caps) { GstPad *target = gst_proxy_pad_get_target (pad); @@ -628,7 +628,7 @@ gst_ghost_pad_internal_do_activate_pull (GstPad * pad, gboolean active) return ret; } -static gboolean +gboolean gst_ghost_pad_do_activate_push (GstPad * pad, gboolean active) { gboolean ret; @@ -644,7 +644,7 @@ gst_ghost_pad_do_activate_push (GstPad * pad, gboolean active) return ret; } -static gboolean +gboolean gst_ghost_pad_do_activate_pull (GstPad * pad, gboolean active) { gboolean ret; @@ -675,7 +675,7 @@ gst_ghost_pad_do_activate_pull (GstPad * pad, gboolean active) return ret; } -static GstPadLinkReturn +GstPadLinkReturn gst_ghost_pad_do_link (GstPad * pad, GstPad * peer) { GstPadLinkReturn ret; @@ -714,7 +714,7 @@ link_failed: } } -static void +void gst_ghost_pad_do_unlink (GstPad * pad) { GstPad *internal; @@ -811,7 +811,7 @@ done: gst_caps_unref (caps); } -static gboolean +gboolean gst_ghost_pad_do_setcaps (GstPad * pad, GstCaps * caps) { if (GST_PAD_DIRECTION (pad) == GST_PAD_SRC) diff --git a/gst/gstghostpad.h b/gst/gstghostpad.h index b9ef0dcc96..9d1ce07103 100644 --- a/gst/gstghostpad.h +++ b/gst/gstghostpad.h @@ -62,6 +62,20 @@ GType gst_proxy_pad_get_type (void); GstProxyPad* gst_proxy_pad_get_internal (GstProxyPad *pad); +const GstQueryType* gst_proxy_pad_do_query_type (GstPad *pad); +gboolean gst_proxy_pad_do_event (GstPad *pad, GstEvent *event); +gboolean gst_proxy_pad_do_query (GstPad *pad, GstQuery *query); +GstIterator* gst_proxy_pad_do_iterate_internal_links (GstPad *pad); +GstFlowReturn gst_proxy_pad_do_bufferalloc (GstPad *pad, guint64 offset, guint size, GstCaps *caps, GstBuffer **buf); +GstFlowReturn gst_proxy_pad_do_chain (GstPad *pad, GstBuffer *buf); +GstFlowReturn gst_proxy_pad_do_chain_list (GstPad *pad, GstBufferList *list); +GstFlowReturn gst_proxy_pad_do_getrange (GstPad *pad, guint64 offset, guint size, GstBuffer **buffer); +gboolean gst_proxy_pad_do_checkgetrange (GstPad *pad); +GstCaps* gst_proxy_pad_do_getcaps (GstPad *pad); +gboolean gst_proxy_pad_do_acceptcaps (GstPad *pad, GstCaps *caps); +void gst_proxy_pad_do_fixatecaps (GstPad *pad, GstCaps *caps); +gboolean gst_proxy_pad_do_setcaps (GstPad *pad, GstCaps *caps); + #define GST_TYPE_GHOST_PAD (gst_ghost_pad_get_type ()) #define GST_IS_GHOST_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GHOST_PAD)) #define GST_IS_GHOST_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GHOST_PAD)) @@ -108,6 +122,12 @@ gboolean gst_ghost_pad_set_target (GstGhostPad *gpad, GstPad *newtarget); gboolean gst_ghost_pad_construct (GstGhostPad *gpad); +gboolean gst_ghost_pad_do_setcaps (GstPad * pad, GstCaps * caps); +void gst_ghost_pad_do_unlink (GstPad * pad); +GstPadLinkReturn gst_ghost_pad_do_link (GstPad * pad, GstPad * peer); +gboolean gst_ghost_pad_do_activate_pull (GstPad * pad, gboolean active); +gboolean gst_ghost_pad_do_activate_push (GstPad * pad, gboolean active); + G_END_DECLS #endif /* __GST_GHOST_PAD_H__ */ From 6807e536b02a39aa1b0a8a311709eeaac1f5bf15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 6 May 2011 16:00:22 +0200 Subject: [PATCH 17/30] ghostpad: Rename ghostpad/proxypad default functions API: gst_ghost_pad_activate_pull_default API: gst_ghost_pad_activate_push_default API: gst_ghost_pad_internal_activate_pull_default API: gst_ghost_pad_internal_activate_push_default API: gst_ghost_pad_link_default API: gst_ghost_pad_setcaps_default API: gst_ghost_pad_unlink_default API: gst_proxy_pad_acceptcaps_default API: gst_proxy_pad_bufferalloc_default API: gst_proxy_pad_chain_default API: gst_proxy_pad_chain_list_default API: gst_proxy_pad_checkgetrange_default API: gst_proxy_pad_event_default API: gst_proxy_pad_fixatecaps_default API: gst_proxy_pad_getcaps_default API: gst_proxy_pad_getrange_default API: gst_proxy_pad_iterate_internal_links_default API: gst_proxy_pad_query_default API: gst_proxy_pad_query_type_default API: gst_proxy_pad_setcaps_default --- gst/gstghostpad.c | 144 +++++++++++++++++----------------- gst/gstghostpad.h | 39 ++++----- win32/common/libgstreamer.def | 20 +++++ 3 files changed, 115 insertions(+), 88 deletions(-) diff --git a/gst/gstghostpad.c b/gst/gstghostpad.c index bfdd3299e6..7441b7b6da 100644 --- a/gst/gstghostpad.c +++ b/gst/gstghostpad.c @@ -91,7 +91,7 @@ static void on_src_target_notify (GstPad * target, static GParamSpec *pspec_caps = NULL; const GstQueryType * -gst_proxy_pad_do_query_type (GstPad * pad) +gst_proxy_pad_query_type_default (GstPad * pad) { GstPad *target = gst_proxy_pad_get_target (pad); const GstQueryType *res = NULL; @@ -104,7 +104,7 @@ gst_proxy_pad_do_query_type (GstPad * pad) } gboolean -gst_proxy_pad_do_event (GstPad * pad, GstEvent * event) +gst_proxy_pad_event_default (GstPad * pad, GstEvent * event) { gboolean res = FALSE; GstPad *internal = @@ -119,7 +119,7 @@ gst_proxy_pad_do_event (GstPad * pad, GstEvent * event) } gboolean -gst_proxy_pad_do_query (GstPad * pad, GstQuery * query) +gst_proxy_pad_query_default (GstPad * pad, GstQuery * query) { gboolean res = FALSE; GstPad *target = gst_proxy_pad_get_target (pad); @@ -133,7 +133,7 @@ gst_proxy_pad_do_query (GstPad * pad, GstQuery * query) } GstIterator * -gst_proxy_pad_do_iterate_internal_links (GstPad * pad) +gst_proxy_pad_iterate_internal_links_default (GstPad * pad) { GstIterator *res = NULL; GstPad *internal; @@ -152,7 +152,7 @@ gst_proxy_pad_do_iterate_internal_links (GstPad * pad) } GstFlowReturn -gst_proxy_pad_do_bufferalloc (GstPad * pad, guint64 offset, guint size, +gst_proxy_pad_bufferalloc_default (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf) { GstFlowReturn result = GST_FLOW_WRONG_STATE; @@ -168,7 +168,7 @@ gst_proxy_pad_do_bufferalloc (GstPad * pad, guint64 offset, guint size, } GstFlowReturn -gst_proxy_pad_do_chain (GstPad * pad, GstBuffer * buffer) +gst_proxy_pad_chain_default (GstPad * pad, GstBuffer * buffer) { GstFlowReturn res; GstPad *internal = GST_PROXY_PAD_INTERNAL (pad); @@ -179,7 +179,7 @@ gst_proxy_pad_do_chain (GstPad * pad, GstBuffer * buffer) } GstFlowReturn -gst_proxy_pad_do_chain_list (GstPad * pad, GstBufferList * list) +gst_proxy_pad_chain_list_default (GstPad * pad, GstBufferList * list) { GstFlowReturn res; GstPad *internal = GST_PROXY_PAD_INTERNAL (pad); @@ -190,7 +190,7 @@ gst_proxy_pad_do_chain_list (GstPad * pad, GstBufferList * list) } GstFlowReturn -gst_proxy_pad_do_getrange (GstPad * pad, guint64 offset, guint size, +gst_proxy_pad_getrange_default (GstPad * pad, guint64 offset, guint size, GstBuffer ** buffer) { GstFlowReturn res; @@ -202,7 +202,7 @@ gst_proxy_pad_do_getrange (GstPad * pad, guint64 offset, guint size, } gboolean -gst_proxy_pad_do_checkgetrange (GstPad * pad) +gst_proxy_pad_checkgetrange_default (GstPad * pad) { gboolean result; GstPad *internal = GST_PROXY_PAD_INTERNAL (pad); @@ -213,7 +213,7 @@ gst_proxy_pad_do_checkgetrange (GstPad * pad) } GstCaps * -gst_proxy_pad_do_getcaps (GstPad * pad) +gst_proxy_pad_getcaps_default (GstPad * pad) { GstPad *target = gst_proxy_pad_get_target (pad); GstCaps *res; @@ -262,7 +262,7 @@ done: } gboolean -gst_proxy_pad_do_acceptcaps (GstPad * pad, GstCaps * caps) +gst_proxy_pad_acceptcaps_default (GstPad * pad, GstCaps * caps) { GstPad *target = gst_proxy_pad_get_target (pad); gboolean res; @@ -280,7 +280,7 @@ gst_proxy_pad_do_acceptcaps (GstPad * pad, GstCaps * caps) } void -gst_proxy_pad_do_fixatecaps (GstPad * pad, GstCaps * caps) +gst_proxy_pad_fixatecaps_default (GstPad * pad, GstCaps * caps) { GstPad *target = gst_proxy_pad_get_target (pad); @@ -291,7 +291,7 @@ gst_proxy_pad_do_fixatecaps (GstPad * pad, GstCaps * caps) } gboolean -gst_proxy_pad_do_setcaps (GstPad * pad, GstCaps * caps) +gst_proxy_pad_setcaps_default (GstPad * pad, GstCaps * caps) { GstPad *target = gst_proxy_pad_get_target (pad); gboolean res; @@ -398,7 +398,7 @@ gst_proxy_pad_get_internal (GstProxyPad * pad) } static void -gst_proxy_pad_do_unlink (GstPad * pad) +gst_proxy_pad_unlink_default (GstPad * pad) { GstPad *internal; @@ -436,20 +436,20 @@ gst_proxy_pad_class_init (GstProxyPadClass * klass) } #endif /* Register common function pointer descriptions */ - GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_do_query_type); - GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_do_event); - GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_do_query); - GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_do_iterate_internal_links); - GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_do_getcaps); - GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_do_acceptcaps); - GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_do_fixatecaps); - GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_do_setcaps); - GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_do_unlink); - GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_do_bufferalloc); - GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_do_chain); - GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_do_chain_list); - GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_do_getrange); - GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_do_checkgetrange); + GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_query_type_default); + GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_event_default); + GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_query_default); + GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_iterate_internal_links_default); + GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_getcaps_default); + GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_acceptcaps_default); + GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_fixatecaps_default); + GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_setcaps_default); + GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_unlink_default); + GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_bufferalloc_default); + GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_chain_default); + GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_chain_list_default); + GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_getrange_default); + GST_DEBUG_REGISTER_FUNCPTR (gst_proxy_pad_checkgetrange_default); } static void @@ -490,17 +490,17 @@ gst_proxy_pad_init (GstProxyPad * ppad) GST_TYPE_PROXY_PAD, GstProxyPadPrivate); GST_PROXY_GET_LOCK (pad) = g_mutex_new (); - gst_pad_set_query_type_function (pad, gst_proxy_pad_do_query_type); - gst_pad_set_event_function (pad, gst_proxy_pad_do_event); - gst_pad_set_query_function (pad, gst_proxy_pad_do_query); + gst_pad_set_query_type_function (pad, gst_proxy_pad_query_type_default); + gst_pad_set_event_function (pad, gst_proxy_pad_event_default); + gst_pad_set_query_function (pad, gst_proxy_pad_query_default); gst_pad_set_iterate_internal_links_function (pad, - gst_proxy_pad_do_iterate_internal_links); + gst_proxy_pad_iterate_internal_links_default); - gst_pad_set_getcaps_function (pad, gst_proxy_pad_do_getcaps); - gst_pad_set_acceptcaps_function (pad, gst_proxy_pad_do_acceptcaps); - gst_pad_set_fixatecaps_function (pad, gst_proxy_pad_do_fixatecaps); - gst_pad_set_setcaps_function (pad, gst_proxy_pad_do_setcaps); - gst_pad_set_unlink_function (pad, gst_proxy_pad_do_unlink); + gst_pad_set_getcaps_function (pad, gst_proxy_pad_getcaps_default); + gst_pad_set_acceptcaps_function (pad, gst_proxy_pad_acceptcaps_default); + gst_pad_set_fixatecaps_function (pad, gst_proxy_pad_fixatecaps_default); + gst_pad_set_setcaps_function (pad, gst_proxy_pad_setcaps_default); + gst_pad_set_unlink_function (pad, gst_proxy_pad_unlink_default); } #if !defined(GST_DISABLE_LOADSAVE) && !defined(GST_REMOVE_DEPRECATED) @@ -578,8 +578,8 @@ G_DEFINE_TYPE (GstGhostPad, gst_ghost_pad, GST_TYPE_PROXY_PAD); static void gst_ghost_pad_dispose (GObject * object); /* see gstghostpad design docs */ -static gboolean -gst_ghost_pad_internal_do_activate_push (GstPad * pad, gboolean active) +gboolean +gst_ghost_pad_internal_activate_push_default (GstPad * pad, gboolean active) { gboolean ret; GstPad *other; @@ -595,8 +595,8 @@ gst_ghost_pad_internal_do_activate_push (GstPad * pad, gboolean active) return ret; } -static gboolean -gst_ghost_pad_internal_do_activate_pull (GstPad * pad, gboolean active) +gboolean +gst_ghost_pad_internal_activate_pull_default (GstPad * pad, gboolean active) { gboolean ret; GstPad *other; @@ -608,7 +608,7 @@ gst_ghost_pad_internal_do_activate_pull (GstPad * pad, gboolean active) /* we are activated in pull mode by our peer element, which is a sinkpad * that wants to operate in pull mode. This activation has to propagate * upstream throught the pipeline. We call the internal activation function, - * which will trigger gst_ghost_pad_do_activate_pull, which propagates even + * which will trigger gst_ghost_pad_activate_pull_default, which propagates even * further upstream */ GST_LOG_OBJECT (pad, "pad is src, activate internal"); other = GST_PROXY_PAD_INTERNAL (pad); @@ -629,7 +629,7 @@ gst_ghost_pad_internal_do_activate_pull (GstPad * pad, gboolean active) } gboolean -gst_ghost_pad_do_activate_push (GstPad * pad, gboolean active) +gst_ghost_pad_activate_push_default (GstPad * pad, gboolean active) { gboolean ret; GstPad *other; @@ -645,7 +645,7 @@ gst_ghost_pad_do_activate_push (GstPad * pad, gboolean active) } gboolean -gst_ghost_pad_do_activate_pull (GstPad * pad, gboolean active) +gst_ghost_pad_activate_pull_default (GstPad * pad, gboolean active) { gboolean ret; GstPad *other; @@ -676,7 +676,7 @@ gst_ghost_pad_do_activate_pull (GstPad * pad, gboolean active) } GstPadLinkReturn -gst_ghost_pad_do_link (GstPad * pad, GstPad * peer) +gst_ghost_pad_link_default (GstPad * pad, GstPad * peer) { GstPadLinkReturn ret; GstPad *internal; @@ -715,7 +715,7 @@ link_failed: } void -gst_ghost_pad_do_unlink (GstPad * pad) +gst_ghost_pad_unlink_default (GstPad * pad) { GstPad *internal; @@ -812,12 +812,12 @@ done: } gboolean -gst_ghost_pad_do_setcaps (GstPad * pad, GstCaps * caps) +gst_ghost_pad_setcaps_default (GstPad * pad, GstCaps * caps) { if (GST_PAD_DIRECTION (pad) == GST_PAD_SRC) return TRUE; - return gst_proxy_pad_do_setcaps (pad, caps); + return gst_proxy_pad_setcaps_default (pad, caps); } static void @@ -831,10 +831,10 @@ gst_ghost_pad_class_init (GstGhostPadClass * klass) gobject_class->dispose = gst_ghost_pad_dispose; - GST_DEBUG_REGISTER_FUNCPTR (gst_ghost_pad_do_setcaps); - GST_DEBUG_REGISTER_FUNCPTR (gst_ghost_pad_do_activate_pull); - GST_DEBUG_REGISTER_FUNCPTR (gst_ghost_pad_do_activate_push); - GST_DEBUG_REGISTER_FUNCPTR (gst_ghost_pad_do_link); + GST_DEBUG_REGISTER_FUNCPTR (gst_ghost_pad_setcaps_default); + GST_DEBUG_REGISTER_FUNCPTR (gst_ghost_pad_activate_pull_default); + GST_DEBUG_REGISTER_FUNCPTR (gst_ghost_pad_activate_push_default); + GST_DEBUG_REGISTER_FUNCPTR (gst_ghost_pad_link_default); } static void @@ -843,11 +843,12 @@ gst_ghost_pad_init (GstGhostPad * pad) GST_GHOST_PAD_PRIVATE (pad) = G_TYPE_INSTANCE_GET_PRIVATE (pad, GST_TYPE_GHOST_PAD, GstGhostPadPrivate); - gst_pad_set_setcaps_function (GST_PAD_CAST (pad), gst_ghost_pad_do_setcaps); + gst_pad_set_setcaps_function (GST_PAD_CAST (pad), + gst_ghost_pad_setcaps_default); gst_pad_set_activatepull_function (GST_PAD_CAST (pad), - gst_ghost_pad_do_activate_pull); + gst_ghost_pad_activate_pull_default); gst_pad_set_activatepush_function (GST_PAD_CAST (pad), - gst_ghost_pad_do_activate_push); + gst_ghost_pad_activate_push_default); } static void @@ -864,7 +865,7 @@ gst_ghost_pad_dispose (GObject * object) gst_ghost_pad_set_target (GST_GHOST_PAD (pad), NULL); /* Unlink here so that gst_pad_dispose doesn't. That would lead to a call to - * gst_ghost_pad_do_unlink when the ghost pad is in an inconsistent state */ + * gst_ghost_pad_unlink_default when the ghost pad is in an inconsistent state */ peer = gst_pad_get_peer (pad); if (peer) { if (GST_PAD_IS_SRC (pad)) @@ -928,17 +929,18 @@ gst_ghost_pad_construct (GstGhostPad * gpad) /* Set directional padfunctions for ghostpad */ if (dir == GST_PAD_SINK) { - gst_pad_set_bufferalloc_function (pad, gst_proxy_pad_do_bufferalloc); - gst_pad_set_chain_function (pad, gst_proxy_pad_do_chain); - gst_pad_set_chain_list_function (pad, gst_proxy_pad_do_chain_list); + gst_pad_set_bufferalloc_function (pad, gst_proxy_pad_bufferalloc_default); + gst_pad_set_chain_function (pad, gst_proxy_pad_chain_default); + gst_pad_set_chain_list_function (pad, gst_proxy_pad_chain_list_default); } else { - gst_pad_set_getrange_function (pad, gst_proxy_pad_do_getrange); - gst_pad_set_checkgetrange_function (pad, gst_proxy_pad_do_checkgetrange); + gst_pad_set_getrange_function (pad, gst_proxy_pad_getrange_default); + gst_pad_set_checkgetrange_function (pad, + gst_proxy_pad_checkgetrange_default); } /* link/unlink functions */ - gst_pad_set_link_function (pad, gst_ghost_pad_do_link); - gst_pad_set_unlink_function (pad, gst_ghost_pad_do_unlink); + gst_pad_set_link_function (pad, gst_ghost_pad_link_default); + gst_pad_set_unlink_function (pad, gst_ghost_pad_unlink_default); /* INTERNAL PAD, it always exists and is child of the ghostpad */ otherdir = (dir == GST_PAD_SRC) ? GST_PAD_SINK : GST_PAD_SRC; @@ -957,13 +959,15 @@ gst_ghost_pad_construct (GstGhostPad * gpad) /* Set directional padfunctions for internal pad */ if (dir == GST_PAD_SRC) { - gst_pad_set_bufferalloc_function (internal, gst_proxy_pad_do_bufferalloc); - gst_pad_set_chain_function (internal, gst_proxy_pad_do_chain); - gst_pad_set_chain_list_function (internal, gst_proxy_pad_do_chain_list); + gst_pad_set_bufferalloc_function (internal, + gst_proxy_pad_bufferalloc_default); + gst_pad_set_chain_function (internal, gst_proxy_pad_chain_default); + gst_pad_set_chain_list_function (internal, + gst_proxy_pad_chain_list_default); } else { - gst_pad_set_getrange_function (internal, gst_proxy_pad_do_getrange); + gst_pad_set_getrange_function (internal, gst_proxy_pad_getrange_default); gst_pad_set_checkgetrange_function (internal, - gst_proxy_pad_do_checkgetrange); + gst_proxy_pad_checkgetrange_default); } GST_PROXY_LOCK (pad); @@ -995,9 +999,9 @@ gst_ghost_pad_construct (GstGhostPad * gpad) /* special activation functions for the internal pad */ gst_pad_set_activatepull_function (internal, - gst_ghost_pad_internal_do_activate_pull); + gst_ghost_pad_internal_activate_pull_default); gst_pad_set_activatepush_function (internal, - gst_ghost_pad_internal_do_activate_push); + gst_ghost_pad_internal_activate_push_default); GST_PROXY_UNLOCK (pad); diff --git a/gst/gstghostpad.h b/gst/gstghostpad.h index 9d1ce07103..3575807315 100644 --- a/gst/gstghostpad.h +++ b/gst/gstghostpad.h @@ -62,19 +62,19 @@ GType gst_proxy_pad_get_type (void); GstProxyPad* gst_proxy_pad_get_internal (GstProxyPad *pad); -const GstQueryType* gst_proxy_pad_do_query_type (GstPad *pad); -gboolean gst_proxy_pad_do_event (GstPad *pad, GstEvent *event); -gboolean gst_proxy_pad_do_query (GstPad *pad, GstQuery *query); -GstIterator* gst_proxy_pad_do_iterate_internal_links (GstPad *pad); -GstFlowReturn gst_proxy_pad_do_bufferalloc (GstPad *pad, guint64 offset, guint size, GstCaps *caps, GstBuffer **buf); -GstFlowReturn gst_proxy_pad_do_chain (GstPad *pad, GstBuffer *buf); -GstFlowReturn gst_proxy_pad_do_chain_list (GstPad *pad, GstBufferList *list); -GstFlowReturn gst_proxy_pad_do_getrange (GstPad *pad, guint64 offset, guint size, GstBuffer **buffer); -gboolean gst_proxy_pad_do_checkgetrange (GstPad *pad); -GstCaps* gst_proxy_pad_do_getcaps (GstPad *pad); -gboolean gst_proxy_pad_do_acceptcaps (GstPad *pad, GstCaps *caps); -void gst_proxy_pad_do_fixatecaps (GstPad *pad, GstCaps *caps); -gboolean gst_proxy_pad_do_setcaps (GstPad *pad, GstCaps *caps); +const GstQueryType* gst_proxy_pad_query_type_default (GstPad *pad); +gboolean gst_proxy_pad_event_default (GstPad *pad, GstEvent *event); +gboolean gst_proxy_pad_query_default (GstPad *pad, GstQuery *query); +GstIterator* gst_proxy_pad_iterate_internal_links_default (GstPad *pad); +GstFlowReturn gst_proxy_pad_bufferalloc_default (GstPad *pad, guint64 offset, guint size, GstCaps *caps, GstBuffer **buf); +GstFlowReturn gst_proxy_pad_chain_default (GstPad *pad, GstBuffer *buf); +GstFlowReturn gst_proxy_pad_chain_list_default (GstPad *pad, GstBufferList *list); +GstFlowReturn gst_proxy_pad_getrange_default (GstPad *pad, guint64 offset, guint size, GstBuffer **buffer); +gboolean gst_proxy_pad_checkgetrange_default (GstPad *pad); +GstCaps* gst_proxy_pad_getcaps_default (GstPad *pad); +gboolean gst_proxy_pad_acceptcaps_default (GstPad *pad, GstCaps *caps); +void gst_proxy_pad_fixatecaps_default (GstPad *pad, GstCaps *caps); +gboolean gst_proxy_pad_setcaps_default (GstPad *pad, GstCaps *caps); #define GST_TYPE_GHOST_PAD (gst_ghost_pad_get_type ()) #define GST_IS_GHOST_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GHOST_PAD)) @@ -122,11 +122,14 @@ gboolean gst_ghost_pad_set_target (GstGhostPad *gpad, GstPad *newtarget); gboolean gst_ghost_pad_construct (GstGhostPad *gpad); -gboolean gst_ghost_pad_do_setcaps (GstPad * pad, GstCaps * caps); -void gst_ghost_pad_do_unlink (GstPad * pad); -GstPadLinkReturn gst_ghost_pad_do_link (GstPad * pad, GstPad * peer); -gboolean gst_ghost_pad_do_activate_pull (GstPad * pad, gboolean active); -gboolean gst_ghost_pad_do_activate_push (GstPad * pad, gboolean active); +gboolean gst_ghost_pad_setcaps_default (GstPad * pad, GstCaps * caps); +void gst_ghost_pad_unlink_default (GstPad * pad); +GstPadLinkReturn gst_ghost_pad_link_default (GstPad * pad, GstPad * peer); +gboolean gst_ghost_pad_activate_pull_default (GstPad * pad, gboolean active); +gboolean gst_ghost_pad_activate_push_default (GstPad * pad, gboolean active); + +gboolean gst_ghost_pad_internal_activate_push_default (GstPad * pad, gboolean active); +gboolean gst_ghost_pad_internal_activate_pull_default (GstPad * pad, gboolean active); G_END_DECLS diff --git a/win32/common/libgstreamer.def b/win32/common/libgstreamer.def index e0e98e917c..d041175c3a 100644 --- a/win32/common/libgstreamer.def +++ b/win32/common/libgstreamer.def @@ -444,14 +444,21 @@ EXPORTS gst_fraction_get_type gst_fraction_range_get_type gst_g_error_get_type + gst_ghost_pad_activate_pull_default + gst_ghost_pad_activate_push_default gst_ghost_pad_construct gst_ghost_pad_get_target gst_ghost_pad_get_type + gst_ghost_pad_internal_activate_pull_default + gst_ghost_pad_internal_activate_push_default + gst_ghost_pad_link_default gst_ghost_pad_new gst_ghost_pad_new_from_template gst_ghost_pad_new_no_target gst_ghost_pad_new_no_target_from_template gst_ghost_pad_set_target + gst_ghost_pad_setcaps_default + gst_ghost_pad_unlink_default gst_implements_interface_cast gst_implements_interface_check gst_implements_interface_get_type @@ -832,8 +839,21 @@ EXPORTS gst_print_element_args gst_print_pad_caps gst_progress_type_get_type + gst_proxy_pad_acceptcaps_default + gst_proxy_pad_bufferalloc_default + gst_proxy_pad_chain_default + gst_proxy_pad_chain_list_default + gst_proxy_pad_checkgetrange_default + gst_proxy_pad_event_default + gst_proxy_pad_fixatecaps_default gst_proxy_pad_get_internal gst_proxy_pad_get_type + gst_proxy_pad_getcaps_default + gst_proxy_pad_getrange_default + gst_proxy_pad_iterate_internal_links_default + gst_proxy_pad_query_default + gst_proxy_pad_query_type_default + gst_proxy_pad_setcaps_default gst_qos_type_get_type gst_query_add_buffering_range gst_query_get_n_buffering_ranges From 800b738715604f514c6f441286a625c83b28ea84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 6 May 2011 16:15:51 +0200 Subject: [PATCH 18/30] ghostpad: Add guards against invalid parameters to the new, public functions --- gst/gstghostpad.c | 96 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 81 insertions(+), 15 deletions(-) diff --git a/gst/gstghostpad.c b/gst/gstghostpad.c index 7441b7b6da..07374d53da 100644 --- a/gst/gstghostpad.c +++ b/gst/gstghostpad.c @@ -90,12 +90,16 @@ static void on_src_target_notify (GstPad * target, static GParamSpec *pspec_caps = NULL; + const GstQueryType * gst_proxy_pad_query_type_default (GstPad * pad) { - GstPad *target = gst_proxy_pad_get_target (pad); + GstPad *target; const GstQueryType *res = NULL; + g_return_val_if_fail (GST_IS_PROXY_PAD (pad), NULL); + + target = gst_proxy_pad_get_target (pad); if (target) { res = gst_pad_get_query_types (target); gst_object_unref (target); @@ -107,9 +111,13 @@ gboolean gst_proxy_pad_event_default (GstPad * pad, GstEvent * event) { gboolean res = FALSE; - GstPad *internal = - GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD_CAST (pad))); + GstPad *internal; + g_return_val_if_fail (GST_IS_PROXY_PAD (pad), FALSE); + g_return_val_if_fail (GST_IS_EVENT (event), FALSE); + + internal = + GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD_CAST (pad))); if (internal) { res = gst_pad_push_event (internal, event); gst_object_unref (internal); @@ -122,8 +130,12 @@ gboolean gst_proxy_pad_query_default (GstPad * pad, GstQuery * query) { gboolean res = FALSE; - GstPad *target = gst_proxy_pad_get_target (pad); + GstPad *target; + g_return_val_if_fail (GST_IS_PROXY_PAD (pad), FALSE); + g_return_val_if_fail (GST_IS_QUERY (query), FALSE); + + target = gst_proxy_pad_get_target (pad); if (target) { res = gst_pad_query (target, query); gst_object_unref (target); @@ -138,6 +150,8 @@ gst_proxy_pad_iterate_internal_links_default (GstPad * pad) GstIterator *res = NULL; GstPad *internal; + g_return_val_if_fail (GST_IS_PROXY_PAD (pad), NULL); + internal = GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD_CAST (pad))); @@ -156,9 +170,14 @@ gst_proxy_pad_bufferalloc_default (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf) { GstFlowReturn result = GST_FLOW_WRONG_STATE; - GstPad *internal = - GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD_CAST (pad))); + GstPad *internal; + g_return_val_if_fail (GST_IS_PROXY_PAD (pad), GST_FLOW_ERROR); + g_return_val_if_fail (caps == NULL || GST_IS_CAPS (caps), GST_FLOW_ERROR); + g_return_val_if_fail (buf != NULL, GST_FLOW_ERROR); + + internal = + GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD_CAST (pad))); if (internal) { result = gst_pad_alloc_buffer (internal, offset, size, caps, buf); gst_object_unref (internal); @@ -171,8 +190,12 @@ GstFlowReturn gst_proxy_pad_chain_default (GstPad * pad, GstBuffer * buffer) { GstFlowReturn res; - GstPad *internal = GST_PROXY_PAD_INTERNAL (pad); + GstPad *internal; + g_return_val_if_fail (GST_IS_PROXY_PAD (pad), GST_FLOW_ERROR); + g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR); + + internal = GST_PROXY_PAD_INTERNAL (pad); res = gst_pad_push (internal, buffer); return res; @@ -182,8 +205,12 @@ GstFlowReturn gst_proxy_pad_chain_list_default (GstPad * pad, GstBufferList * list) { GstFlowReturn res; - GstPad *internal = GST_PROXY_PAD_INTERNAL (pad); + GstPad *internal; + g_return_val_if_fail (GST_IS_PROXY_PAD (pad), GST_FLOW_ERROR); + g_return_val_if_fail (GST_IS_BUFFER_LIST (list), GST_FLOW_ERROR); + + internal = GST_PROXY_PAD_INTERNAL (pad); res = gst_pad_push_list (internal, list); return res; @@ -194,8 +221,12 @@ gst_proxy_pad_getrange_default (GstPad * pad, guint64 offset, guint size, GstBuffer ** buffer) { GstFlowReturn res; - GstPad *internal = GST_PROXY_PAD_INTERNAL (pad); + GstPad *internal; + g_return_val_if_fail (GST_IS_PROXY_PAD (pad), GST_FLOW_ERROR); + g_return_val_if_fail (buffer != NULL, GST_FLOW_ERROR); + + internal = GST_PROXY_PAD_INTERNAL (pad); res = gst_pad_pull_range (internal, offset, size, buffer); return res; @@ -205,8 +236,11 @@ gboolean gst_proxy_pad_checkgetrange_default (GstPad * pad) { gboolean result; - GstPad *internal = GST_PROXY_PAD_INTERNAL (pad); + GstPad *internal; + g_return_val_if_fail (GST_IS_PROXY_PAD (pad), FALSE); + + internal = GST_PROXY_PAD_INTERNAL (pad); result = gst_pad_check_pull_range (internal); return result; @@ -215,10 +249,14 @@ gst_proxy_pad_checkgetrange_default (GstPad * pad) GstCaps * gst_proxy_pad_getcaps_default (GstPad * pad) { - GstPad *target = gst_proxy_pad_get_target (pad); + GstPad *target; GstCaps *res; - GstPadTemplate *templ = GST_PAD_PAD_TEMPLATE (pad); + GstPadTemplate *templ; + g_return_val_if_fail (GST_IS_PROXY_PAD (pad), NULL); + + templ = GST_PAD_PAD_TEMPLATE (pad); + target = gst_proxy_pad_get_target (pad); if (target) { /* if we have a real target, proxy the call */ res = gst_pad_get_caps_reffed (target); @@ -264,9 +302,13 @@ done: gboolean gst_proxy_pad_acceptcaps_default (GstPad * pad, GstCaps * caps) { - GstPad *target = gst_proxy_pad_get_target (pad); + GstPad *target; gboolean res; + g_return_val_if_fail (GST_IS_PROXY_PAD (pad), FALSE); + g_return_val_if_fail (caps == NULL || GST_IS_CAPS (caps), FALSE); + + target = gst_proxy_pad_get_target (pad); if (target) { res = gst_pad_accept_caps (target, caps); gst_object_unref (target); @@ -282,8 +324,12 @@ gst_proxy_pad_acceptcaps_default (GstPad * pad, GstCaps * caps) void gst_proxy_pad_fixatecaps_default (GstPad * pad, GstCaps * caps) { - GstPad *target = gst_proxy_pad_get_target (pad); + GstPad *target; + g_return_if_fail (GST_IS_PROXY_PAD (pad)); + g_return_if_fail (GST_IS_CAPS (caps)); + + target = gst_proxy_pad_get_target (pad); if (target) { gst_pad_fixate_caps (target, caps); gst_object_unref (target); @@ -293,9 +339,13 @@ gst_proxy_pad_fixatecaps_default (GstPad * pad, GstCaps * caps) gboolean gst_proxy_pad_setcaps_default (GstPad * pad, GstCaps * caps) { - GstPad *target = gst_proxy_pad_get_target (pad); + GstPad *target; gboolean res; + g_return_val_if_fail (GST_IS_PROXY_PAD (pad), FALSE); + g_return_val_if_fail (caps == NULL || GST_IS_CAPS (caps), FALSE); + + target = gst_proxy_pad_get_target (pad); if (target) { res = gst_pad_set_caps (target, caps); gst_object_unref (target); @@ -584,6 +634,8 @@ gst_ghost_pad_internal_activate_push_default (GstPad * pad, gboolean active) gboolean ret; GstPad *other; + g_return_val_if_fail (GST_IS_PROXY_PAD (pad), FALSE); + GST_LOG_OBJECT (pad, "%sactivate push on %s:%s, we're ok", (active ? "" : "de"), GST_DEBUG_PAD_NAME (pad)); @@ -601,6 +653,8 @@ gst_ghost_pad_internal_activate_pull_default (GstPad * pad, gboolean active) gboolean ret; GstPad *other; + g_return_val_if_fail (GST_IS_PROXY_PAD (pad), FALSE); + GST_LOG_OBJECT (pad, "%sactivate pull on %s:%s", (active ? "" : "de"), GST_DEBUG_PAD_NAME (pad)); @@ -634,6 +688,8 @@ gst_ghost_pad_activate_push_default (GstPad * pad, gboolean active) gboolean ret; GstPad *other; + g_return_val_if_fail (GST_IS_GHOST_PAD (pad), FALSE); + GST_LOG_OBJECT (pad, "%sactivate push on %s:%s, proxy internal", (active ? "" : "de"), GST_DEBUG_PAD_NAME (pad)); @@ -650,6 +706,8 @@ gst_ghost_pad_activate_pull_default (GstPad * pad, gboolean active) gboolean ret; GstPad *other; + g_return_val_if_fail (GST_IS_GHOST_PAD (pad), FALSE); + GST_LOG_OBJECT (pad, "%sactivate pull on %s:%s", (active ? "" : "de"), GST_DEBUG_PAD_NAME (pad)); @@ -681,6 +739,9 @@ gst_ghost_pad_link_default (GstPad * pad, GstPad * peer) GstPadLinkReturn ret; GstPad *internal; + g_return_val_if_fail (GST_IS_GHOST_PAD (pad), GST_PAD_LINK_REFUSED); + g_return_val_if_fail (GST_IS_PAD (peer), GST_PAD_LINK_REFUSED); + GST_DEBUG_OBJECT (pad, "linking ghostpad"); internal = GST_PROXY_PAD_INTERNAL (pad); @@ -719,6 +780,8 @@ gst_ghost_pad_unlink_default (GstPad * pad) { GstPad *internal; + g_return_if_fail (GST_IS_GHOST_PAD (pad)); + internal = GST_PROXY_PAD_INTERNAL (pad); GST_DEBUG_OBJECT (pad, "unlinking ghostpad"); @@ -814,6 +877,9 @@ done: gboolean gst_ghost_pad_setcaps_default (GstPad * pad, GstCaps * caps) { + g_return_val_if_fail (GST_IS_GHOST_PAD (pad), FALSE); + g_return_val_if_fail (caps == NULL || GST_IS_CAPS (caps), FALSE); + if (GST_PAD_DIRECTION (pad) == GST_PAD_SRC) return TRUE; From 3c760a3ee5fef750e7310180ff6094082f58eea1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 6 May 2011 16:44:29 +0200 Subject: [PATCH 19/30] ghostpad: Add docs for all the new, public functions --- docs/gst/gstreamer-sections.txt | 24 ++++ gst/gstghostpad.c | 242 +++++++++++++++++++++++++++++++- gst/gstghostpad.h | 1 + win32/common/libgstreamer.def | 1 + 4 files changed, 265 insertions(+), 3 deletions(-) diff --git a/docs/gst/gstreamer-sections.txt b/docs/gst/gstreamer-sections.txt index 6b4bcb4c9e..7cf8a53738 100644 --- a/docs/gst/gstreamer-sections.txt +++ b/docs/gst/gstreamer-sections.txt @@ -915,7 +915,31 @@ gst_ghost_pad_get_target gst_ghost_pad_construct +gst_ghost_pad_setcaps_default +gst_ghost_pad_unlink_default +gst_ghost_pad_link_default +gst_ghost_pad_activate_pull_default +gst_ghost_pad_activate_push_default + +gst_ghost_pad_internal_activate_push_default +gst_ghost_pad_internal_activate_pull_default + gst_proxy_pad_get_internal + +gst_proxy_pad_query_type_default +gst_proxy_pad_event_default +gst_proxy_pad_query_default +gst_proxy_pad_iterate_internal_links_default +gst_proxy_pad_bufferalloc_default +gst_proxy_pad_chain_default +gst_proxy_pad_chain_list_default +gst_proxy_pad_getrange_default +gst_proxy_pad_checkgetrange_default +gst_proxy_pad_getcaps_default +gst_proxy_pad_acceptcaps_default +gst_proxy_pad_fixatecaps_default +gst_proxy_pad_setcaps_default +gst_proxy_pad_unlink_default GstGhostPadClass GST_GHOST_PAD diff --git a/gst/gstghostpad.c b/gst/gstghostpad.c index 07374d53da..4f40119f47 100644 --- a/gst/gstghostpad.c +++ b/gst/gstghostpad.c @@ -90,7 +90,17 @@ static void on_src_target_notify (GstPad * target, static GParamSpec *pspec_caps = NULL; - +/** + * gst_proxy_pad_query_type_default: + * @pad: a #GstPad. + * + * Invoke the default query type handler of the proxy pad. + * + * Returns: (transfer none) (array zero-terminated=1): a zero-terminated array + * of #GstQueryType. + * + * Since: 0.10.34 + */ const GstQueryType * gst_proxy_pad_query_type_default (GstPad * pad) { @@ -107,6 +117,17 @@ gst_proxy_pad_query_type_default (GstPad * pad) return res; } +/** + * gst_proxy_pad_event_default: + * @pad: a #GstPad to push the event to. + * @event: (transfer full): the #GstEvent to send to the pad. + * + * Invoke the default event of the proxy pad. + * + * Returns: TRUE if the event was handled. + * + * Since: 0.10.34 + */ gboolean gst_proxy_pad_event_default (GstPad * pad, GstEvent * event) { @@ -126,6 +147,17 @@ gst_proxy_pad_event_default (GstPad * pad, GstEvent * event) return res; } +/** + * gst_proxy_pad_query_default: + * @pad: a #GstPad to invoke the default query on. + * @query: (transfer none): the #GstQuery to perform. + * + * Invoke the default query function of the proxy pad. + * + * Returns: TRUE if the query could be performed. + * + * Since: 0.10.34 + */ gboolean gst_proxy_pad_query_default (GstPad * pad, GstQuery * query) { @@ -144,6 +176,17 @@ gst_proxy_pad_query_default (GstPad * pad, GstQuery * query) return res; } +/** + * gst_proyx_pad_iterate_internal_links_default: + * @pad: the #GstPad to get the internal links of. + * + * Invoke the default iterate internal links function of the proxy pad. + * + * Returns: a #GstIterator of #GstPad, or NULL if @pad has no parent. Unref each + * returned pad with gst_object_unref(). + * + * Since: 0.10.34 + */ GstIterator * gst_proxy_pad_iterate_internal_links_default (GstPad * pad) { @@ -165,6 +208,24 @@ gst_proxy_pad_iterate_internal_links_default (GstPad * pad) return res; } +/** + * gst_proxy_pad_bufferalloc_default: + * @pad: a source #GstPad + * @offset: the offset of the new buffer in the stream + * @size: the size of the new buffer + * @caps: the caps of the new buffer + * @buf: a newly allocated buffer + * + * Invoke the default bufferalloc function of the proxy pad. + * + * Returns: a result code indicating success of the operation. Any + * result code other than #GST_FLOW_OK is an error and @buf should + * not be used. + * An error can occur if the pad is not connected or when the downstream + * peer elements cannot provide an acceptable buffer. + * + * Since: 0.10.34 + */ GstFlowReturn gst_proxy_pad_bufferalloc_default (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf) @@ -186,6 +247,18 @@ gst_proxy_pad_bufferalloc_default (GstPad * pad, guint64 offset, guint size, return result; } +/** + * gst_proxy_pad_chain_default: + * @pad: a sink #GstPad, returns GST_FLOW_ERROR if not. + * @buffer: (transfer full): the #GstBuffer to send, return GST_FLOW_ERROR + * if not. + * + * Invoke the default chain function of the proxy pad. + * + * Returns: a #GstFlowReturn from the pad. + * + * Since: 0.10.34 + */ GstFlowReturn gst_proxy_pad_chain_default (GstPad * pad, GstBuffer * buffer) { @@ -201,6 +274,18 @@ gst_proxy_pad_chain_default (GstPad * pad, GstBuffer * buffer) return res; } +/** + * gst_proxy_pad_chain_list_default: + * @pad: a sink #GstPad, returns GST_FLOW_ERROR if not. + * @list: (transfer full): the #GstBufferList to send, return GST_FLOW_ERROR + * if not. + * + * Invoke the default chain list function of the proxy pad. + * + * Returns: a #GstFlowReturn from the pad. + * + * Since: 0.10.34 + */ GstFlowReturn gst_proxy_pad_chain_list_default (GstPad * pad, GstBufferList * list) { @@ -216,6 +301,20 @@ gst_proxy_pad_chain_list_default (GstPad * pad, GstBufferList * list) return res; } +/** + * gst_proxy_pad_get_range_default: + * @pad: a src #GstPad, returns #GST_FLOW_ERROR if not. + * @offset: The start offset of the buffer + * @size: The length of the buffer + * @buffer: (out callee-allocates): a pointer to hold the #GstBuffer, + * returns #GST_FLOW_ERROR if %NULL. + * + * Invoke the default getrange function of the proxy pad. + * + * Returns: a #GstFlowReturn from the pad. + * + * Since: 0.10.34 + */ GstFlowReturn gst_proxy_pad_getrange_default (GstPad * pad, guint64 offset, guint size, GstBuffer ** buffer) @@ -232,6 +331,16 @@ gst_proxy_pad_getrange_default (GstPad * pad, guint64 offset, guint size, return res; } +/** + * gst_proxy_pad_checkgetrange_default: + * @pad: a src #GstPad, returns #GST_FLOW_ERROR if not. + * + * Invoke the default checkgetrange function of the proxy pad. + * + * Returns: a #gboolean from the pad. + * + * Since: 0.10.34 + */ gboolean gst_proxy_pad_checkgetrange_default (GstPad * pad) { @@ -246,6 +355,16 @@ gst_proxy_pad_checkgetrange_default (GstPad * pad) return result; } +/** + * gst_proxy_pad_getcaps_default: + * @pad: a #GstPad to get the capabilities of. + * + * Invoke the default getcaps function of the proxy pad. + * + * Returns: (transfer full): the caps of the pad with incremented ref-count + * + * Since: 0.10.34 + */ GstCaps * gst_proxy_pad_getcaps_default (GstPad * pad) { @@ -299,6 +418,17 @@ done: return res; } +/** + * gst_proxy_pad_acceptcaps_default: + * @pad: a #GstPad to check + * @caps: a #GstCaps to check on the pad + * + * Invoke the default acceptcaps function of the proxy pad. + * + * Returns: TRUE if the pad can accept the caps. + * + * Since: 0.10.34 + */ gboolean gst_proxy_pad_acceptcaps_default (GstPad * pad, GstCaps * caps) { @@ -321,6 +451,15 @@ gst_proxy_pad_acceptcaps_default (GstPad * pad, GstCaps * caps) return res; } +/** + * gst_proxy_pad_fixatecaps_default: + * @pad: a #GstPad to fixate + * @caps: the #GstCaps to fixate + * + * Invoke the default fixatecaps function of the proxy pad. + * + * Since: 0.10.34 + */ void gst_proxy_pad_fixatecaps_default (GstPad * pad, GstCaps * caps) { @@ -336,6 +475,18 @@ gst_proxy_pad_fixatecaps_default (GstPad * pad, GstCaps * caps) } } +/** + * gst_proxy_pad_setcaps_default: + * @pad: a #GstPad to set the capabilities of. + * @caps: (transfer none): a #GstCaps to set. + * + * Invoke the default setcaps function of the proxy pad. + * + * Returns: TRUE if the caps could be set. FALSE if the caps were not fixed + * or bad parameters were provided to this function. + * + * Since: 0.10.34 + */ gboolean gst_proxy_pad_setcaps_default (GstPad * pad, GstCaps * caps) { @@ -430,6 +581,8 @@ gst_proxy_pad_get_target (GstPad * pad) * * Returns: (transfer full): the target #GstProxyPad, can be NULL. * Unref target pad after usage. + * + * Since: 0.10.34 */ GstProxyPad * gst_proxy_pad_get_internal (GstProxyPad * pad) @@ -447,7 +600,15 @@ gst_proxy_pad_get_internal (GstProxyPad * pad) return GST_PROXY_PAD_CAST (internal); } -static void +/** + * gst_proxy_pad_unlink_default: + * @pad: a #GstPad to unlink + * + * Invoke the default unlink function of the proxy pad. + * + * Since: 0.10.34 + */ +void gst_proxy_pad_unlink_default (GstPad * pad) { GstPad *internal; @@ -627,7 +788,18 @@ G_DEFINE_TYPE (GstGhostPad, gst_ghost_pad, GST_TYPE_PROXY_PAD); static void gst_ghost_pad_dispose (GObject * object); -/* see gstghostpad design docs */ +/** + * gst_ghost_pad_internal_activate_push_default: + * @pad: the #GstPad to activate or deactivate. + * @active: whether the pad should be active or not. + * + * Invoke the default activate push function of a proxy pad that is + * owned by a ghost pad. + * + * Returns: %TRUE if the operation was successful. + * + * Since: 0.10.34 + */ gboolean gst_ghost_pad_internal_activate_push_default (GstPad * pad, gboolean active) { @@ -647,6 +819,18 @@ gst_ghost_pad_internal_activate_push_default (GstPad * pad, gboolean active) return ret; } +/** + * gst_ghost_pad_internal_activate_pull_default: + * @pad: the #GstPad to activate or deactivate. + * @active: whether the pad should be active or not. + * + * Invoke the default activate pull function of a proxy pad that is + * owned by a ghost pad. + * + * Returns: %TRUE if the operation was successful. + * + * Since: 0.10.34 + */ gboolean gst_ghost_pad_internal_activate_pull_default (GstPad * pad, gboolean active) { @@ -682,6 +866,17 @@ gst_ghost_pad_internal_activate_pull_default (GstPad * pad, gboolean active) return ret; } +/** + * gst_ghost_pad_activate_push_default: + * @pad: the #GstPad to activate or deactivate. + * @active: whether the pad should be active or not. + * + * Invoke the default activate push function of a ghost pad. + * + * Returns: %TRUE if the operation was successful. + * + * Since: 0.10.34 + */ gboolean gst_ghost_pad_activate_push_default (GstPad * pad, gboolean active) { @@ -700,6 +895,17 @@ gst_ghost_pad_activate_push_default (GstPad * pad, gboolean active) return ret; } +/** + * gst_ghost_pad_activate_pull_default: + * @pad: the #GstPad to activate or deactivate. + * @active: whether the pad should be active or not. + * + * Invoke the default activate pull function of a ghost pad. + * + * Returns: %TRUE if the operation was successful. + * + * Since: 0.10.34 + */ gboolean gst_ghost_pad_activate_pull_default (GstPad * pad, gboolean active) { @@ -733,6 +939,17 @@ gst_ghost_pad_activate_pull_default (GstPad * pad, gboolean active) return ret; } +/** + * gst_ghost_pad_link_default: + * @pad: the #GstPad to link. + * @peer: the #GstPad peer + * + * Invoke the default link function of a ghost pad. + * + * Returns: #GstPadLinkReturn of the operation + * + * Since: 0.10.34 + */ GstPadLinkReturn gst_ghost_pad_link_default (GstPad * pad, GstPad * peer) { @@ -775,6 +992,14 @@ link_failed: } } +/** + * gst_ghost_pad_unlink_default: + * @pad: the #GstPad to link. + * + * Invoke the default unlink function of a ghost pad. + * + * Since: 0.10.34 + */ void gst_ghost_pad_unlink_default (GstPad * pad) { @@ -874,6 +1099,17 @@ done: gst_caps_unref (caps); } +/** + * gst_ghost_pad_setcaps_default: + * @pad: the #GstPad to link. + * @caps: (transfer none): the #GstCaps to set + * + * Invoke the default setcaps function of a ghost pad. + * + * Returns: %TRUE if the operation was successful + * + * Since: 0.10.34 + */ gboolean gst_ghost_pad_setcaps_default (GstPad * pad, GstCaps * caps) { diff --git a/gst/gstghostpad.h b/gst/gstghostpad.h index 3575807315..4184e9fb87 100644 --- a/gst/gstghostpad.h +++ b/gst/gstghostpad.h @@ -75,6 +75,7 @@ GstCaps* gst_proxy_pad_getcaps_default (GstPad *pad); gboolean gst_proxy_pad_acceptcaps_default (GstPad *pad, GstCaps *caps); void gst_proxy_pad_fixatecaps_default (GstPad *pad, GstCaps *caps); gboolean gst_proxy_pad_setcaps_default (GstPad *pad, GstCaps *caps); +void gst_proxy_pad_unlink_default (GstPad * pad); #define GST_TYPE_GHOST_PAD (gst_ghost_pad_get_type ()) #define GST_IS_GHOST_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GHOST_PAD)) diff --git a/win32/common/libgstreamer.def b/win32/common/libgstreamer.def index d041175c3a..07ed4276db 100644 --- a/win32/common/libgstreamer.def +++ b/win32/common/libgstreamer.def @@ -854,6 +854,7 @@ EXPORTS gst_proxy_pad_query_default gst_proxy_pad_query_type_default gst_proxy_pad_setcaps_default + gst_proxy_pad_unlink_default gst_qos_type_get_type gst_query_add_buffering_range gst_query_get_n_buffering_ranges From 3872b816d245831ec2764915d17299c20e0b3ab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 10 May 2011 16:37:44 +0200 Subject: [PATCH 20/30] element: Add GstElement::state_changed vfunc API: GstElement::state_changed This is always called when the state of an element has changed and before the corresponding state-changed message is posted on the bus. --- gst/gst_private.h | 7 +++++++ gst/gstbin.c | 18 ++++++++---------- gst/gstelement.c | 44 +++++++++++++++++++++++++++----------------- gst/gstelement.h | 6 +++++- 4 files changed, 47 insertions(+), 28 deletions(-) diff --git a/gst/gst_private.h b/gst/gst_private.h index 2cafbee611..a8f780c1db 100644 --- a/gst/gst_private.h +++ b/gst/gst_private.h @@ -51,6 +51,9 @@ extern const char g_log_domain_gstreamer[]; /* for the pad cache */ #include "gstpad.h" +/* for GstElement */ +#include "gstelement.h" + G_BEGIN_DECLS /* used by gstparse.c and grammar.y */ @@ -113,6 +116,10 @@ gboolean _gst_plugin_loader_client_run (void); void _priv_gst_pad_invalidate_cache (GstPad *pad); +/* Used in GstBin for manual state handling */ +void _priv_gst_element_state_changed (GstElement *element, GstState oldstate, + GstState newstate, GstState pending); + /* used in both gststructure.c and gstcaps.c; numbers are completely made up */ #define STRUCTURE_ESTIMATED_STRING_LEN(s) (16 + (s)->fields->len * 22) diff --git a/gst/gstbin.c b/gst/gstbin.c index 52777df2bc..e0a8d4cbb8 100644 --- a/gst/gstbin.c +++ b/gst/gstbin.c @@ -2828,9 +2828,8 @@ bin_handle_async_start (GstBin * bin, gboolean new_base_time) GST_OBJECT_UNLOCK (bin); /* post message */ - gst_element_post_message (GST_ELEMENT_CAST (bin), - gst_message_new_state_changed (GST_OBJECT_CAST (bin), - new_state, new_state, new_state)); + _priv_gst_element_state_changed (GST_ELEMENT_CAST (bin), new_state, new_state, + new_state); post_start: if (amessage) { @@ -2872,8 +2871,8 @@ bin_handle_async_done (GstBin * bin, GstStateChangeReturn ret, GstState current, pending, target; GstStateChangeReturn old_ret; GstState old_state, old_next; - gboolean toplevel; - GstMessage *smessage = NULL, *amessage = NULL; + gboolean toplevel, state_changed = FALSE; + GstMessage *amessage = NULL; BinContinueData *cont = NULL; if (GST_STATE_RETURN (bin) == GST_STATE_CHANGE_FAILURE) @@ -2952,15 +2951,14 @@ bin_handle_async_done (GstBin * bin, GstStateChangeReturn ret, if (old_next != GST_STATE_PLAYING) { if (old_state != old_next || old_ret == GST_STATE_CHANGE_ASYNC) { - smessage = gst_message_new_state_changed (GST_OBJECT_CAST (bin), - old_state, old_next, pending); + state_changed = TRUE; } } GST_OBJECT_UNLOCK (bin); - if (smessage) { - GST_DEBUG_OBJECT (bin, "posting state change message"); - gst_element_post_message (GST_ELEMENT_CAST (bin), smessage); + if (state_changed) { + _priv_gst_element_state_changed (GST_ELEMENT_CAST (bin), old_state, + old_next, pending); } if (amessage) { /* post our combined ASYNC_DONE when all is ASYNC_DONE. */ diff --git a/gst/gstelement.c b/gst/gstelement.c index c2a8eb3a95..ddbba3e409 100644 --- a/gst/gstelement.c +++ b/gst/gstelement.c @@ -2317,6 +2317,28 @@ nothing_aborted: } } +/* Not static because GstBin has manual state handling too */ +void +_priv_gst_element_state_changed (GstElement * element, GstState oldstate, + GstState newstate, GstState pending) +{ + GstElementClass *klass = GST_ELEMENT_GET_CLASS (element); + GstMessage *message; + + GST_CAT_INFO_OBJECT (GST_CAT_STATES, element, + "notifying about state-changed %s to %s (%s pending)", + gst_element_state_get_name (oldstate), + gst_element_state_get_name (newstate), + gst_element_state_get_name (pending)); + + if (klass->state_changed) + klass->state_changed (element, oldstate, newstate, pending); + + message = gst_message_new_state_changed (GST_OBJECT_CAST (element), + oldstate, newstate, pending); + gst_element_post_message (element, message); +} + /** * gst_element_continue_state: * @element: a #GstElement to continue the state change of. @@ -2344,7 +2366,6 @@ gst_element_continue_state (GstElement * element, GstStateChangeReturn ret) GstStateChangeReturn old_ret; GstState old_state, old_next; GstState current, next, pending; - GstMessage *message; GstStateChange transition; GST_OBJECT_LOCK (element); @@ -2380,9 +2401,7 @@ gst_element_continue_state (GstElement * element, GstStateChangeReturn ret) gst_element_state_get_name (old_next), gst_element_state_get_name (pending), gst_element_state_get_name (next)); - message = gst_message_new_state_changed (GST_OBJECT_CAST (element), - old_state, old_next, pending); - gst_element_post_message (element, message); + _priv_gst_element_state_changed (element, old_state, old_next, pending); GST_CAT_INFO_OBJECT (GST_CAT_STATES, element, "continue state change %s to %s, final %s", @@ -2414,16 +2433,9 @@ complete: * previous return value. * We do signal the cond though as a _get_state() might be blocking * on it. */ - if (old_state != old_next || old_ret == GST_STATE_CHANGE_ASYNC) { - GST_CAT_INFO_OBJECT (GST_CAT_STATES, element, - "posting state-changed %s to %s", - gst_element_state_get_name (old_state), - gst_element_state_get_name (old_next)); - message = - gst_message_new_state_changed (GST_OBJECT_CAST (element), old_state, - old_next, GST_STATE_VOID_PENDING); - gst_element_post_message (element, message); - } + if (old_state != old_next || old_ret == GST_STATE_CHANGE_ASYNC) + _priv_gst_element_state_changed (element, old_state, old_next, + GST_STATE_VOID_PENDING); GST_STATE_BROADCAST (element); @@ -2496,9 +2508,7 @@ gst_element_lost_state_full (GstElement * element, gboolean new_base_time) GST_ELEMENT_START_TIME (element) = 0; GST_OBJECT_UNLOCK (element); - message = gst_message_new_state_changed (GST_OBJECT_CAST (element), - new_state, new_state, new_state); - gst_element_post_message (element, message); + _priv_gst_element_state_changed (element, new_state, new_state, new_state); message = gst_message_new_async_start (GST_OBJECT_CAST (element), new_base_time); diff --git a/gst/gstelement.h b/gst/gstelement.h index 74f05dd812..f1195e04ea 100644 --- a/gst/gstelement.h +++ b/gst/gstelement.h @@ -602,6 +602,7 @@ struct _GstElement * @get_query_types: get the supported #GstQueryType of this element * @query: perform a #GstQuery on the element * @request_new_pad_full: called when a new pad is requested. Since: 0.10.32. + * @state_changed: called immediately after a new state was set. Since: 0.10.34. * * GStreamer element class. Override the vmethods to implement the element * functionality. @@ -669,8 +670,11 @@ struct _GstElementClass GstPad* (*request_new_pad_full) (GstElement *element, GstPadTemplate *templ, const gchar* name, const GstCaps *caps); + void (*state_changed) (GstElement *element, GstState oldstate, + GstState newstate, GstState pending); + /*< private >*/ - gpointer _gst_reserved[GST_PADDING-2]; + gpointer _gst_reserved[GST_PADDING-3]; }; /* element class pad templates */ From 4a836cae9fa9240d7ed3c6e5a9d7ea9afa484c0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Mon, 18 Apr 2011 14:26:33 +0200 Subject: [PATCH 21/30] bin: Only post EOS messages after reaching the PLAYING state Fixes bug #647756. --- gst/gstbin.c | 71 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 54 insertions(+), 17 deletions(-) diff --git a/gst/gstbin.c b/gst/gstbin.c index e0a8d4cbb8..947bd10792 100644 --- a/gst/gstbin.c +++ b/gst/gstbin.c @@ -220,6 +220,8 @@ struct _GstBinPrivate GstIndex *index; /* forward messages from our children */ gboolean message_forward; + + gboolean posted_eos; }; typedef struct @@ -238,12 +240,15 @@ static void gst_bin_get_property (GObject * object, guint prop_id, static GstStateChangeReturn gst_bin_change_state_func (GstElement * element, GstStateChange transition); +static void gst_bin_state_changed (GstElement * element, GstState oldstate, + GstState newstate, GstState pending); static GstStateChangeReturn gst_bin_get_state_func (GstElement * element, GstState * state, GstState * pending, GstClockTime timeout); static void bin_handle_async_done (GstBin * bin, GstStateChangeReturn ret, gboolean flag_pending); static void bin_handle_async_start (GstBin * bin, gboolean new_base_time); static void bin_push_state_continue (BinContinueData * data); +static void bin_do_eos (GstBin * bin); static gboolean gst_bin_add_func (GstBin * bin, GstElement * element); static gboolean gst_bin_remove_func (GstBin * bin, GstElement * element); @@ -502,6 +507,7 @@ gst_bin_class_init (GstBinClass * klass) gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_bin_change_state_func); + gstelement_class->state_changed = GST_DEBUG_FUNCPTR (gst_bin_state_changed); gstelement_class->get_state = GST_DEBUG_FUNCPTR (gst_bin_get_state_func); gstelement_class->get_index = GST_DEBUG_FUNCPTR (gst_bin_get_index_func); gstelement_class->set_index = GST_DEBUG_FUNCPTR (gst_bin_set_index_func); @@ -987,10 +993,10 @@ bin_remove_messages (GstBin * bin, GstObject * src, GstMessageType types) * * call with bin LOCK */ static gboolean -is_eos (GstBin * bin) +is_eos (GstBin * bin, guint32 * seqnum) { gboolean result; - GList *walk; + GList *walk, *msgs; result = TRUE; for (walk = bin->children; walk; walk = g_list_next (walk)) { @@ -999,8 +1005,10 @@ is_eos (GstBin * bin) element = GST_ELEMENT_CAST (walk->data); if (bin_element_is_sink (element, bin) == 0) { /* check if element posted EOS */ - if (find_message (bin, GST_OBJECT_CAST (element), GST_MESSAGE_EOS)) { + if ((msgs = + find_message (bin, GST_OBJECT_CAST (element), GST_MESSAGE_EOS))) { GST_DEBUG ("sink '%s' posted EOS", GST_ELEMENT_NAME (element)); + *seqnum = gst_message_get_seqnum (GST_MESSAGE_CAST (msgs->data)); } else { GST_DEBUG ("sink '%s' did not post EOS yet", GST_ELEMENT_NAME (element)); @@ -2387,6 +2395,19 @@ gst_bin_do_latency_func (GstBin * bin) return res; } +static void +gst_bin_state_changed (GstElement * element, GstState oldstate, + GstState newstate, GstState pending) +{ + GstElementClass *pklass = (GstElementClass *) parent_class; + + if (newstate == GST_STATE_PLAYING && pending == GST_STATE_VOID_PENDING) + bin_do_eos (GST_BIN_CAST (element)); + + if (pklass->state_changed) + pklass->state_changed (element, oldstate, newstate, pending); +} + static GstStateChangeReturn gst_bin_change_state_func (GstElement * element, GstStateChange transition) { @@ -2427,6 +2448,7 @@ gst_bin_change_state_func (GstElement * element, GstStateChange transition) GST_OBJECT_LOCK (bin); GST_DEBUG_OBJECT (element, "clearing EOS elements"); bin_remove_messages (bin, NULL, GST_MESSAGE_EOS); + bin->priv->posted_eos = FALSE; GST_OBJECT_UNLOCK (bin); if (current == GST_STATE_READY) if (!(gst_bin_src_pads_activate (bin, TRUE))) @@ -2734,6 +2756,7 @@ gst_bin_continue_func (BinContinueData * data) GST_STATE_UNLOCK (bin); GST_DEBUG_OBJECT (bin, "state continue done"); + gst_object_unref (bin); g_slice_free (BinContinueData, data); return; @@ -2998,6 +3021,33 @@ nothing_pending: } } +static void +bin_do_eos (GstBin * bin) +{ + guint32 seqnum = 0; + gboolean eos; + + GST_OBJECT_LOCK (bin); + /* If all sinks are EOS, we're in PLAYING and no state change is pending + * we forward the EOS message to the parent bin or application + */ + eos = GST_STATE (bin) == GST_STATE_PLAYING + && GST_STATE_PENDING (bin) == GST_STATE_VOID_PENDING + && is_eos (bin, &seqnum); + GST_OBJECT_UNLOCK (bin); + + if (eos + && g_atomic_int_compare_and_exchange (&bin->priv->posted_eos, FALSE, + TRUE)) { + GstMessage *tmessage; + tmessage = gst_message_new_eos (GST_OBJECT_CAST (bin)); + gst_message_set_seqnum (tmessage, seqnum); + GST_DEBUG_OBJECT (bin, + "all sinks posted EOS, posting seqnum #%" G_GUINT32_FORMAT, seqnum); + gst_element_post_message (GST_ELEMENT_CAST (bin), tmessage); + } +} + /* must be called with the object lock. This function releases the lock to post * the message. */ static void @@ -3106,28 +3156,15 @@ gst_bin_handle_message_func (GstBin * bin, GstMessage * message) } case GST_MESSAGE_EOS: { - gboolean eos; /* collect all eos messages from the children */ GST_OBJECT_LOCK (bin); bin_do_message_forward (bin, message); /* ref message for future use */ - gst_message_ref (message); bin_replace_message (bin, message, GST_MESSAGE_EOS); - eos = is_eos (bin); GST_OBJECT_UNLOCK (bin); - /* if we are completely EOS, we forward an EOS message */ - if (eos) { - seqnum = gst_message_get_seqnum (message); - tmessage = gst_message_new_eos (GST_OBJECT_CAST (bin)); - gst_message_set_seqnum (tmessage, seqnum); - - GST_DEBUG_OBJECT (bin, - "all sinks posted EOS, posting seqnum #%" G_GUINT32_FORMAT, seqnum); - gst_element_post_message (GST_ELEMENT_CAST (bin), tmessage); - } - gst_message_unref (message); + bin_do_eos (bin); break; } case GST_MESSAGE_STATE_DIRTY: From 9f831097062205a0382d553d7732e737a9a5dd3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 22 Mar 2011 13:19:47 +0100 Subject: [PATCH 22/30] multiqueue: Add mode to synchronize deactivated/not-linked streams by the running time Fixes bug #645107, #600648. --- plugins/elements/gstmultiqueue.c | 202 +++++++++++++++++++++++++++++-- plugins/elements/gstmultiqueue.h | 3 + 2 files changed, 196 insertions(+), 9 deletions(-) diff --git a/plugins/elements/gstmultiqueue.c b/plugins/elements/gstmultiqueue.c index b6b2d245ae..e1ddc81077 100644 --- a/plugins/elements/gstmultiqueue.c +++ b/plugins/elements/gstmultiqueue.c @@ -156,6 +156,8 @@ struct _GstSingleQueue guint32 nextid; /* ID of the next object waiting to be pushed */ guint32 oldid; /* ID of the last object pushed (last in a series) */ guint32 last_oldid; /* Previously observed old_id, reset to MAXUINT32 on flush */ + GstClockTime next_time; /* End running time of next buffer to be pushed */ + GstClockTime last_time; /* Start running time of last pushed buffer */ GCond *turn; /* SingleQueue turn waiting conditional */ }; @@ -179,6 +181,7 @@ static void gst_single_queue_free (GstSingleQueue * squeue); static void wake_up_next_non_linked (GstMultiQueue * mq); static void compute_high_id (GstMultiQueue * mq); +static void compute_high_time (GstMultiQueue * mq); static void single_queue_overrun_cb (GstDataQueue * dq, GstSingleQueue * sq); static void single_queue_underrun_cb (GstDataQueue * dq, GstSingleQueue * sq); @@ -224,6 +227,7 @@ enum #define DEFAULT_USE_BUFFERING FALSE #define DEFAULT_LOW_PERCENT 10 #define DEFAULT_HIGH_PERCENT 99 +#define DEFAULT_SYNC_BY_RUNNING_TIME FALSE enum { @@ -237,6 +241,7 @@ enum PROP_USE_BUFFERING, PROP_LOW_PERCENT, PROP_HIGH_PERCENT, + PROP_SYNC_BY_RUNNING_TIME, PROP_LAST }; @@ -396,6 +401,22 @@ gst_multi_queue_class_init (GstMultiQueueClass * klass) "High threshold for buffering to finish", 0, 100, DEFAULT_HIGH_PERCENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstMultiQueue:sync-by-running-time + * + * If enabled multiqueue will synchronize deactivated or not-linked streams + * to the activated and linked streams by taking the running time. + * Otherwise multiqueue will synchronize the deactivated or not-linked + * streams by keeping the order in which buffers and events arrived compared + * to active and linked streams. + * + * Since: 0.10.33 + */ + g_object_class_install_property (gobject_class, PROP_SYNC_BY_RUNNING_TIME, + g_param_spec_boolean ("sync-by-running-time", "Sync By Running Time", + "Synchronize deactivated or not-linked streams by running time", + DEFAULT_SYNC_BY_RUNNING_TIME, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gobject_class->finalize = gst_multi_queue_finalize; @@ -425,8 +446,11 @@ gst_multi_queue_init (GstMultiQueue * mqueue, GstMultiQueueClass * klass) mqueue->low_percent = DEFAULT_LOW_PERCENT; mqueue->high_percent = DEFAULT_HIGH_PERCENT; + mqueue->sync_by_running_time = DEFAULT_SYNC_BY_RUNNING_TIME; + mqueue->counter = 1; mqueue->highid = -1; + mqueue->high_time = GST_CLOCK_TIME_NONE; mqueue->qlock = g_mutex_new (); } @@ -499,6 +523,9 @@ gst_multi_queue_set_property (GObject * object, guint prop_id, case PROP_HIGH_PERCENT: mq->high_percent = g_value_get_int (value); break; + case PROP_SYNC_BY_RUNNING_TIME: + mq->sync_by_running_time = g_value_get_boolean (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -541,6 +568,9 @@ gst_multi_queue_get_property (GObject * object, guint prop_id, case PROP_HIGH_PERCENT: g_value_set_int (value, mq->high_percent); break; + case PROP_SYNC_BY_RUNNING_TIME: + g_value_set_boolean (value, mq->sync_by_running_time); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -740,8 +770,15 @@ gst_single_queue_flush (GstMultiQueue * mq, GstSingleQueue * sq, gboolean flush) sq->nextid = 0; sq->oldid = 0; sq->last_oldid = G_MAXUINT32; + sq->next_time = GST_CLOCK_TIME_NONE; + sq->last_time = GST_CLOCK_TIME_NONE; gst_data_queue_set_flushing (sq->queue, FALSE); + /* Reset high time to be recomputed next */ + GST_MULTI_QUEUE_MUTEX_LOCK (mq); + mq->high_time = GST_CLOCK_TIME_NONE; + GST_MULTI_QUEUE_MUTEX_UNLOCK (mq); + sq->flushing = FALSE; GST_LOG_OBJECT (mq, "SingleQueue %d : starting task", sq->id); @@ -946,6 +983,71 @@ apply_buffer (GstMultiQueue * mq, GstSingleQueue * sq, GstClockTime timestamp, GST_MULTI_QUEUE_MUTEX_UNLOCK (mq); } +static GstClockTime +get_running_time (GstSegment * segment, GstMiniObject * object, gboolean end) +{ + GstClockTime time = GST_CLOCK_TIME_NONE; + + if (GST_IS_BUFFER (object)) { + GstBuffer *buf = GST_BUFFER_CAST (object); + + if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { + time = GST_BUFFER_TIMESTAMP (buf); + if (end && GST_BUFFER_DURATION_IS_VALID (buf)) + time += GST_BUFFER_DURATION (buf); + if (time > segment->stop) + time = segment->stop; + time = gst_segment_to_running_time (segment, GST_FORMAT_TIME, time); + } + } else if (GST_IS_BUFFER_LIST (object)) { + GstBufferList *list = GST_BUFFER_LIST_CAST (object); + GstBufferListIterator *it = gst_buffer_list_iterate (list); + GstBuffer *buf; + + do { + while ((buf = gst_buffer_list_iterator_next (it))) { + if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { + time = GST_BUFFER_TIMESTAMP (buf); + if (end && GST_BUFFER_DURATION_IS_VALID (buf)) + time += GST_BUFFER_DURATION (buf); + if (time > segment->stop) + time = segment->stop; + time = gst_segment_to_running_time (segment, GST_FORMAT_TIME, time); + if (!end) + goto done; + } else if (!end) { + goto done; + } + } + } while (gst_buffer_list_iterator_next_group (it)); + } else if (GST_IS_EVENT (object)) { + GstEvent *event = GST_EVENT_CAST (object); + + /* For newsegment events return the running time of the start position */ + if (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT) { + GstSegment new_segment = *segment; + gboolean update; + gdouble rate, applied_rate; + GstFormat format; + gint64 start, stop, position; + + gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate, + &format, &start, &stop, &position); + if (format == GST_FORMAT_TIME) { + gst_segment_set_newsegment_full (&new_segment, update, rate, + applied_rate, format, start, stop, position); + + time = + gst_segment_to_running_time (&new_segment, GST_FORMAT_TIME, + new_segment.start); + } + } + } + +done: + return time; +} + static GstFlowReturn gst_single_queue_push_one (GstMultiQueue * mq, GstSingleQueue * sq, GstMiniObject * object) @@ -1078,6 +1180,7 @@ gst_multi_queue_loop (GstPad * pad) GstMiniObject *object = NULL; guint32 newid; GstFlowReturn result; + GstClockTime next_time; sq = (GstSingleQueue *) gst_pad_get_element_private (pad); mq = sq->mqueue; @@ -1099,6 +1202,9 @@ gst_multi_queue_loop (GstPad * pad) object = gst_multi_queue_item_steal_object (item); gst_multi_queue_item_destroy (item); + /* Get running time of the item. Events will have GST_CLOCK_TIME_NONE */ + next_time = get_running_time (&sq->src_segment, object, TRUE); + GST_LOG_OBJECT (mq, "SingleQueue %d : newid:%d , oldid:%d", sq->id, newid, sq->last_oldid); @@ -1107,9 +1213,9 @@ gst_multi_queue_loop (GstPad * pad) * or it's the first loop, or we just passed the previous highid, * we might need to wake some sleeping pad up, so there's extra work * there too */ - if (sq->srcresult == GST_FLOW_NOT_LINKED || - (sq->last_oldid == G_MAXUINT32) || (newid != (sq->last_oldid + 1)) || - sq->last_oldid > mq->highid) { + if (sq->srcresult == GST_FLOW_NOT_LINKED + || (sq->last_oldid == G_MAXUINT32) || (newid != (sq->last_oldid + 1)) + || sq->last_oldid > mq->highid) { GST_LOG_OBJECT (mq, "CHECKING sq->srcresult: %s", gst_flow_get_name (sq->srcresult)); @@ -1124,6 +1230,7 @@ gst_multi_queue_loop (GstPad * pad) /* Update the nextid so other threads know when to wake us up */ sq->nextid = newid; + sq->next_time = next_time; /* Update the oldid (the last ID we output) for highid tracking */ if (sq->last_oldid != G_MAXUINT32) @@ -1134,10 +1241,20 @@ gst_multi_queue_loop (GstPad * pad) /* Recompute the highid */ compute_high_id (mq); - while (newid > mq->highid && sq->srcresult == GST_FLOW_NOT_LINKED) { - GST_DEBUG_OBJECT (mq, "queue %d sleeping for not-linked wakeup with " - "newid %u and highid %u", sq->id, newid, mq->highid); + /* Recompute the high time */ + compute_high_time (mq); + while (((mq->sync_by_running_time && next_time != GST_CLOCK_TIME_NONE && + (mq->high_time == GST_CLOCK_TIME_NONE + || next_time >= mq->high_time)) + || (!mq->sync_by_running_time && newid > mq->highid)) + && sq->srcresult == GST_FLOW_NOT_LINKED) { + + GST_DEBUG_OBJECT (mq, + "queue %d sleeping for not-linked wakeup with " + "newid %u, highid %u, next_time %" GST_TIME_FORMAT + ", high_time %" GST_TIME_FORMAT, sq->id, newid, mq->highid, + GST_TIME_ARGS (next_time), GST_TIME_ARGS (mq->high_time)); /* Wake up all non-linked pads before we sleep */ wake_up_next_non_linked (mq); @@ -1151,8 +1268,13 @@ gst_multi_queue_loop (GstPad * pad) goto out_flushing; } + /* Recompute the high time */ + compute_high_time (mq); + GST_DEBUG_OBJECT (mq, "queue %d woken from sleeping for not-linked " - "wakeup with newid %u and highid %u", sq->id, newid, mq->highid); + "wakeup with newid %u, highid %u, next_time %" GST_TIME_FORMAT + ", high_time %" GST_TIME_FORMAT, sq->id, newid, mq->highid, + GST_TIME_ARGS (next_time), GST_TIME_ARGS (mq->high_time)); } /* Re-compute the high_id in case someone else pushed */ @@ -1162,8 +1284,9 @@ gst_multi_queue_loop (GstPad * pad) /* Wake up all non-linked pads */ wake_up_next_non_linked (mq); } - /* We're done waiting, we can clear the nextid */ + /* We're done waiting, we can clear the nextid and nexttime */ sq->nextid = 0; + sq->next_time = GST_CLOCK_TIME_NONE; GST_MULTI_QUEUE_MUTEX_UNLOCK (mq); } @@ -1174,6 +1297,18 @@ gst_multi_queue_loop (GstPad * pad) GST_LOG_OBJECT (mq, "BEFORE PUSHING sq->srcresult: %s", gst_flow_get_name (sq->srcresult)); + /* Update time stats */ + next_time = get_running_time (&sq->src_segment, object, FALSE); + if (next_time != GST_CLOCK_TIME_NONE) { + if (sq->last_time == GST_CLOCK_TIME_NONE || sq->last_time < next_time) + sq->last_time = next_time; + if (mq->high_time == GST_CLOCK_TIME_NONE || mq->high_time <= next_time) { + /* Wake up all non-linked pads now that we advanceed the high time */ + mq->high_time = next_time; + wake_up_next_non_linked (mq); + } + } + /* Try to push out the new object */ result = gst_single_queue_push_one (mq, sq, object); sq->srcresult = result; @@ -1187,6 +1322,7 @@ gst_multi_queue_loop (GstPad * pad) gst_flow_get_name (sq->srcresult)); sq->last_oldid = newid; + return; out_flushing: @@ -1516,7 +1652,10 @@ wake_up_next_non_linked (GstMultiQueue * mq) GstSingleQueue *sq = (GstSingleQueue *) tmp->data; if (sq->srcresult == GST_FLOW_NOT_LINKED) { - if (sq->nextid != 0 && sq->nextid <= mq->highid) { + if ((mq->sync_by_running_time && mq->high_time != GST_CLOCK_TIME_NONE + && sq->next_time != GST_CLOCK_TIME_NONE + && sq->next_time >= mq->high_time) + || (sq->nextid != 0 && sq->nextid <= mq->highid)) { GST_LOG_OBJECT (mq, "Waking up singlequeue %d", sq->id); g_cond_signal (sq->turn); } @@ -1567,6 +1706,49 @@ compute_high_id (GstMultiQueue * mq) lowest); } +/* WITH LOCK TAKEN */ +static void +compute_high_time (GstMultiQueue * mq) +{ + /* The high-id is either the highest id among the linked pads, or if all + * pads are not-linked, it's the lowest not-linked pad */ + GList *tmp; + GstClockTime highest = GST_CLOCK_TIME_NONE; + GstClockTime lowest = GST_CLOCK_TIME_NONE; + + for (tmp = mq->queues; tmp; tmp = g_list_next (tmp)) { + GstSingleQueue *sq = (GstSingleQueue *) tmp->data; + + GST_LOG_OBJECT (mq, + "inspecting sq:%d , next_time:%" GST_TIME_FORMAT ", last_time:%" + GST_TIME_FORMAT ", srcresult:%s", sq->id, GST_TIME_ARGS (sq->next_time), + GST_TIME_ARGS (sq->last_time), gst_flow_get_name (sq->srcresult)); + + if (sq->srcresult == GST_FLOW_NOT_LINKED) { + /* No need to consider queues which are not waiting */ + if (sq->next_time == GST_CLOCK_TIME_NONE) { + GST_LOG_OBJECT (mq, "sq:%d is not waiting - ignoring", sq->id); + continue; + } + + if (lowest == GST_CLOCK_TIME_NONE || sq->next_time < lowest) + lowest = sq->next_time; + } else if (sq->srcresult != GST_FLOW_UNEXPECTED) { + /* If we don't have a global highid, or the global highid is lower than + * this single queue's last outputted id, store the queue's one, + * unless the singlequeue is at EOS (srcresult = UNEXPECTED) */ + if (highest == GST_CLOCK_TIME_NONE || sq->last_time > highest) + highest = sq->last_time; + } + } + + mq->high_time = highest; + + GST_LOG_OBJECT (mq, + "High time is now : %" GST_TIME_FORMAT ", lowest non-linked %" + GST_TIME_FORMAT, GST_TIME_ARGS (mq->high_time), GST_TIME_ARGS (lowest)); +} + #define IS_FILLED(q, format, value) (((q)->max_size.format) != 0 && \ ((q)->max_size.format) <= (value)) @@ -1770,6 +1952,8 @@ gst_single_queue_new (GstMultiQueue * mqueue, gint id) sq->nextid = 0; sq->oldid = 0; + sq->next_time = GST_CLOCK_TIME_NONE; + sq->last_time = GST_CLOCK_TIME_NONE; sq->turn = g_cond_new (); sq->sinktime = GST_CLOCK_TIME_NONE; diff --git a/plugins/elements/gstmultiqueue.h b/plugins/elements/gstmultiqueue.h index b9c28cd442..bb3d840420 100644 --- a/plugins/elements/gstmultiqueue.h +++ b/plugins/elements/gstmultiqueue.h @@ -50,6 +50,8 @@ typedef struct _GstMultiQueueClass GstMultiQueueClass; struct _GstMultiQueue { GstElement element; + gboolean sync_by_running_time; + /* number of queues */ guint nbqueues; @@ -65,6 +67,7 @@ struct _GstMultiQueue { guint32 counter; /* incoming object counter, use atomic accesses */ guint32 highid; /* contains highest id of last outputted object */ + GstClockTime high_time; /* highest start running time */ GMutex * qlock; /* Global queue lock (vs object lock or individual */ /* queues lock). Protects nbqueues, queues, global */ From 5229a26a7608d66b013fbcca80f8e38f875f4670 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sat, 19 Mar 2011 10:28:49 +0100 Subject: [PATCH 23/30] inputselector: Add sync mode that syncs inactive pads to the running time of the active pad Fixes bug #645017. --- plugins/elements/gstinputselector.c | 152 +++++++++++++++++++++++++++- plugins/elements/gstinputselector.h | 1 + 2 files changed, 152 insertions(+), 1 deletion(-) diff --git a/plugins/elements/gstinputselector.c b/plugins/elements/gstinputselector.c index 32a4aa9a06..4e4075a50d 100644 --- a/plugins/elements/gstinputselector.c +++ b/plugins/elements/gstinputselector.c @@ -95,9 +95,12 @@ enum { PROP_0, PROP_N_PADS, - PROP_ACTIVE_PAD + PROP_ACTIVE_PAD, + PROP_SYNC_STREAMS }; +#define DEFAULT_SYNC_STREAMS FALSE + #define DEFAULT_PAD_ALWAYS_OK TRUE enum @@ -624,6 +627,105 @@ gst_input_selector_wait (GstInputSelector * self, GstSelectorPad * pad) return self->flushing; } +/* must be called with the SELECTOR_LOCK, will block until the running time + * of the active pad is after this pad or return TRUE when flushing */ +static gboolean +gst_input_selector_wait_running_time (GstInputSelector * sel, + GstSelectorPad * pad, GstBuffer * buf) +{ + GstPad *active_sinkpad; + GstSelectorPad *active_selpad; + GstSegment *seg, *active_seg; + GstClockTime running_time, active_running_time = -1; + + seg = &pad->segment; + + active_sinkpad = + gst_input_selector_activate_sinkpad (sel, GST_PAD_CAST (pad)); + active_selpad = GST_SELECTOR_PAD_CAST (active_sinkpad); + active_seg = &active_selpad->segment; + + /* We can only sync if the segments are in time format or + * if the active pad had no newsegment event yet */ + if (seg->format != GST_FORMAT_TIME || + (active_seg->format != GST_FORMAT_TIME + && active_seg->format != GST_FORMAT_UNDEFINED)) + return FALSE; + + /* If we have no valid timestamp we can't sync this buffer */ + if (!GST_BUFFER_TIMESTAMP_IS_VALID (buf)) + return FALSE; + + running_time = GST_BUFFER_TIMESTAMP (buf); + /* If possible try to get the running time at the end of the buffer */ + if (GST_BUFFER_DURATION_IS_VALID (buf)) + running_time += GST_BUFFER_DURATION (buf); + if (running_time > seg->stop) + running_time = seg->stop; + running_time = + gst_segment_to_running_time (seg, GST_FORMAT_TIME, running_time); + /* If this is outside the segment don't sync */ + if (running_time == -1) + return FALSE; + + /* Get active pad's running time, if no configured segment yet keep at -1 */ + if (active_seg->format == GST_FORMAT_TIME) + active_running_time = + gst_segment_to_running_time (active_seg, GST_FORMAT_TIME, + active_seg->last_stop); + + /* Wait until + * a) this is the active pad + * b) the pad or the selector is flushing + * c) the selector is not blocked + * d) the active pad has no running time or the active + * pad's running time is before this running time + * e) the active pad has a non-time segment + */ + while (pad != active_selpad && !sel->flushing && !pad->flushing && + (sel->blocked || active_running_time == -1 + || running_time >= active_running_time)) { + if (!sel->blocked) + GST_DEBUG_OBJECT (pad, + "Waiting for active streams to advance. %" GST_TIME_FORMAT " >= %" + GST_TIME_FORMAT, GST_TIME_ARGS (running_time), + GST_TIME_ARGS (active_running_time)); + + GST_INPUT_SELECTOR_WAIT (sel); + + /* Get new active pad, it might have changed */ + active_sinkpad = + gst_input_selector_activate_sinkpad (sel, GST_PAD_CAST (pad)); + active_selpad = GST_SELECTOR_PAD_CAST (active_sinkpad); + active_seg = &active_selpad->segment; + + /* If the active segment is configured but not to time format + * we can't do any syncing at all */ + if (active_seg->format != GST_FORMAT_TIME + && active_seg->format != GST_FORMAT_UNDEFINED) + break; + + /* Get the new active pad running time */ + if (active_seg->format == GST_FORMAT_TIME) + active_running_time = + gst_segment_to_running_time (active_seg, GST_FORMAT_TIME, + active_seg->last_stop); + else + active_running_time = -1; + + if (!sel->blocked) + GST_DEBUG_OBJECT (pad, + "Waited for active streams to advance. %" GST_TIME_FORMAT " >= %" + GST_TIME_FORMAT, GST_TIME_ARGS (running_time), + GST_TIME_ARGS (active_running_time)); + + } + + /* Return TRUE if the selector or the pad is flushing */ + return (sel->flushing || pad->flushing); +} + + static GstFlowReturn gst_selector_pad_chain (GstPad * pad, GstBuffer * buf) { @@ -651,6 +753,16 @@ gst_selector_pad_chain (GstPad * pad, GstBuffer * buf) prev_active_sinkpad = sel->active_sinkpad; active_sinkpad = gst_input_selector_activate_sinkpad (sel, pad); + /* In sync mode wait until the active pad has advanced + * after the running time of the current buffer */ + if (sel->sync_streams && active_sinkpad != pad) { + if (gst_input_selector_wait_running_time (sel, selpad, buf)) + goto flushing; + } + + /* Might have changed while waiting */ + active_sinkpad = gst_input_selector_activate_sinkpad (sel, pad); + /* update the segment on the srcpad */ start_time = GST_BUFFER_TIMESTAMP (buf); if (GST_CLOCK_TIME_IS_VALID (start_time)) { @@ -669,6 +781,10 @@ gst_selector_pad_chain (GstPad * pad, GstBuffer * buf) if (pad != active_sinkpad) goto ignore; + /* Tell all non-active pads that we advanced the running time */ + if (sel->sync_streams) + GST_INPUT_SELECTOR_BROADCAST (sel); + if (G_UNLIKELY (sel->pending_close)) { GstSegment *cseg = &sel->segment; @@ -899,6 +1015,21 @@ gst_input_selector_class_init (GstInputSelectorClass * klass) "The currently active sink pad", GST_TYPE_PAD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GstInputSelector:sync-streams + * + * If set to %TRUE all inactive streams will be synced to the + * running time of the active stream. This makes sure that no + * buffers are dropped by input-selector that might be needed + * when switching the active pad. + * + * Since: 0.10.33 + */ + g_object_class_install_property (gobject_class, PROP_SYNC_STREAMS, + g_param_spec_boolean ("sync-streams", "Sync Streams", + "Synchronize inactive streams to the running time of the active stream", + DEFAULT_SYNC_STREAMS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** * GstInputSelector::block: * @inputselector: the #GstInputSelector @@ -991,6 +1122,7 @@ gst_input_selector_init (GstInputSelector * sel, sel->active_sinkpad = NULL; sel->padcount = 0; gst_segment_init (&sel->segment, GST_FORMAT_UNDEFINED); + sel->sync_streams = DEFAULT_SYNC_STREAMS; sel->lock = g_mutex_new (); sel->cond = g_cond_new (); @@ -1105,6 +1237,12 @@ gst_input_selector_set_active_pad (GstInputSelector * self, active_pad_p = &self->active_sinkpad; gst_object_replace ((GstObject **) active_pad_p, GST_OBJECT_CAST (pad)); + + /* Wake up all non-active pads in sync mode, they might be + * the active pad now */ + if (self->sync_streams) + GST_INPUT_SELECTOR_BROADCAST (self); + GST_DEBUG_OBJECT (self, "New active pad is %" GST_PTR_FORMAT, self->active_sinkpad); @@ -1130,6 +1268,13 @@ gst_input_selector_set_property (GObject * object, guint prop_id, GST_INPUT_SELECTOR_UNLOCK (sel); break; } + case PROP_SYNC_STREAMS: + { + GST_INPUT_SELECTOR_LOCK (sel); + sel->sync_streams = g_value_get_boolean (value); + GST_INPUT_SELECTOR_UNLOCK (sel); + break; + } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1153,6 +1298,11 @@ gst_input_selector_get_property (GObject * object, guint prop_id, g_value_set_object (value, sel->active_sinkpad); GST_INPUT_SELECTOR_UNLOCK (object); break; + case PROP_SYNC_STREAMS: + GST_INPUT_SELECTOR_LOCK (object); + g_value_set_boolean (value, sel->sync_streams); + GST_INPUT_SELECTOR_UNLOCK (object); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; diff --git a/plugins/elements/gstinputselector.h b/plugins/elements/gstinputselector.h index 0ed7a4b3cb..f370999689 100644 --- a/plugins/elements/gstinputselector.h +++ b/plugins/elements/gstinputselector.h @@ -56,6 +56,7 @@ struct _GstInputSelector { GstPad *active_sinkpad; guint n_pads; guint padcount; + gboolean sync_streams; GstSegment segment; /* the output segment */ gboolean pending_close; /* if we should push a close first */ From cf671d7b0a89b24b14028a152cde8ff8e612d84e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Alburquerque?= Date: Wed, 11 May 2011 13:09:19 -0400 Subject: [PATCH 24/30] miniobject: Add weak referencing functionality API: gst_mini_object_weak_ref() API: gst_mini_object_weak_unref() Add weak referencing functionality to GstMiniObject, which allows to get notifications when an mini object is destroyed but doesn't increase the real refcount. This is mostly useful for bindings. Fixes bug #609473. --- gst/gstminiobject.c | 151 +++++++++++++++++++++++++++++++- gst/gstminiobject.h | 24 ++++- tests/check/gst/gstminiobject.c | 28 ++++++ 3 files changed, 198 insertions(+), 5 deletions(-) diff --git a/gst/gstminiobject.c b/gst/gstminiobject.c index 4b46d29297..0fe5a8c403 100644 --- a/gst/gstminiobject.c +++ b/gst/gstminiobject.c @@ -46,6 +46,24 @@ static GstAllocTrace *_gst_mini_object_trace; #define GST_MINI_OBJECT_GET_CLASS_UNCHECKED(obj) \ ((GstMiniObjectClass *) (((GTypeInstance*)(obj))->g_class)) +/* Structure used for storing weak references */ +typedef struct +{ + GstMiniObject *object; + guint n_weak_refs; + struct + { + GstMiniObjectWeakNotify notify; + gpointer data; + } weak_refs[1]; /* flexible array */ +} WeakRefStack; + +/* Structure for storing a mini object's private data */ +struct _GstMiniObjectPrivateData +{ + WeakRefStack *wstack; +}; + #if 0 static void gst_mini_object_base_init (gpointer g_class); static void gst_mini_object_base_finalize (gpointer g_class); @@ -55,6 +73,7 @@ static void gst_mini_object_init (GTypeInstance * instance, gpointer klass); static void gst_value_mini_object_init (GValue * value); static void gst_value_mini_object_free (GValue * value); +static void weak_refs_notify (WeakRefStack * data); static void gst_value_mini_object_copy (const GValue * src_value, GValue * dest_value); static gpointer gst_value_mini_object_peek_pointer (const GValue * value); @@ -66,6 +85,9 @@ static gchar *gst_value_mini_object_lcopy (const GValue * value, static GstMiniObject *gst_mini_object_copy_default (const GstMiniObject * obj); static void gst_mini_object_finalize (GstMiniObject * obj); +/* Mutex used for weak referencing */ +G_LOCK_DEFINE_STATIC (weak_refs_mutex); + GType gst_mini_object_get_type (void) { @@ -138,6 +160,9 @@ gst_mini_object_class_init (gpointer g_class, gpointer class_data) mo_class->copy = gst_mini_object_copy_default; mo_class->finalize = gst_mini_object_finalize; + + /* Set the instance data type */ + g_type_class_add_private (g_class, sizeof (GstMiniObjectPrivateData)); } static void @@ -146,6 +171,14 @@ gst_mini_object_init (GTypeInstance * instance, gpointer klass) GstMiniObject *mini_object = GST_MINI_OBJECT_CAST (instance); mini_object->refcount = 1; + + /* Initialize the mini object's private data */ + + mini_object->priv = (GstMiniObjectPrivateData *) + G_TYPE_INSTANCE_GET_PRIVATE (instance, GST_TYPE_MINI_OBJECT, + GstMiniObjectPrivateData); + + mini_object->priv->wstack = NULL; } static GstMiniObject * @@ -320,6 +353,16 @@ gst_mini_object_ref (GstMiniObject * mini_object) return mini_object; } +static void +weak_refs_notify (WeakRefStack * wstack) +{ + guint i; + + for (i = 0; i < wstack->n_weak_refs; i++) + wstack->weak_refs[i].notify (wstack->weak_refs[i].data, wstack->object); + g_free (wstack); +} + static void gst_mini_object_free (GstMiniObject * mini_object) { @@ -340,6 +383,10 @@ gst_mini_object_free (GstMiniObject * mini_object) /* decrement the refcount again, if the subclass recycled the object we don't * want to free the instance anymore */ if (G_LIKELY (g_atomic_int_dec_and_test (&mini_object->refcount))) { + /* The weak reference stack is freed in the notification function */ + if (mini_object->priv->wstack) + weak_refs_notify (mini_object->priv->wstack); + #ifndef GST_DISABLE_TRACE gst_alloc_trace_free (_gst_mini_object_trace, mini_object); #endif @@ -370,6 +417,102 @@ gst_mini_object_unref (GstMiniObject * mini_object) } } +/** + * gst_mini_object_weak_ref: (skip) + * @mini_object: #GstMiniObject to reference weakly + * @notify: callback to invoke before the mini object is freed + * @data: extra data to pass to notify + * + * Adds a weak reference callback to a mini object. Weak references are + * used for notification when a mini object is finalized. They are called + * "weak references" because they allow you to safely hold a pointer + * to the mini object without calling gst_mini_object_ref() + * (gst_mini_object_ref() adds a strong reference, that is, forces the object + * to stay alive). + * + * Since: 0.10.34 + */ +void +gst_mini_object_weak_ref (GstMiniObject * object, + GstMiniObjectWeakNotify notify, gpointer data) +{ + guint i; + + g_return_if_fail (GST_IS_MINI_OBJECT (object)); + g_return_if_fail (notify != NULL); + g_return_if_fail (GST_MINI_OBJECT_REFCOUNT_VALUE (object) >= 1); + + G_LOCK (weak_refs_mutex); + + if (object->priv->wstack) { + /* Don't add the weak reference if it already exists. */ + for (i = 0; i < object->priv->wstack->n_weak_refs; i++) { + if (object->priv->wstack->weak_refs[i].notify == notify && + object->priv->wstack->weak_refs[i].data == data) { + g_warning ("%s: Attempt to re-add existing weak ref %p(%p) failed.", + G_STRFUNC, notify, data); + goto found; + } + } + + i = object->priv->wstack->n_weak_refs++; + object->priv->wstack = + g_realloc (object->priv->wstack, sizeof (*(object->priv->wstack)) + + sizeof (object->priv->wstack->weak_refs[0]) * i); + } else { + object->priv->wstack = g_renew (WeakRefStack, NULL, 1); + object->priv->wstack->object = object; + object->priv->wstack->n_weak_refs = 1; + i = 0; + } + object->priv->wstack->weak_refs[i].notify = notify; + object->priv->wstack->weak_refs[i].data = data; +found: + G_UNLOCK (weak_refs_mutex); +} + +/** + * gst_mini_object_weak_unref: (skip) + * @mini_object: #GstMiniObject to remove a weak reference from + * @notify: callback to search for + * @data: data to search for + * + * Removes a weak reference callback to a mini object. + * + * Since: 0.10.34 + */ +void +gst_mini_object_weak_unref (GstMiniObject * object, + GstMiniObjectWeakNotify notify, gpointer data) +{ + gboolean found_one = FALSE; + + g_return_if_fail (GST_IS_MINI_OBJECT (object)); + g_return_if_fail (notify != NULL); + + G_LOCK (weak_refs_mutex); + + if (object->priv->wstack) { + guint i; + + for (i = 0; i < object->priv->wstack->n_weak_refs; i++) + if (object->priv->wstack->weak_refs[i].notify == notify && + object->priv->wstack->weak_refs[i].data == data) { + found_one = TRUE; + object->priv->wstack->n_weak_refs -= 1; + if (i != object->priv->wstack->n_weak_refs) + object->priv->wstack->weak_refs[i] = + object->priv->wstack->weak_refs[object->priv->wstack-> + n_weak_refs]; + + break; + } + } + G_UNLOCK (weak_refs_mutex); + if (!found_one) + g_warning ("%s: couldn't find weak ref %p(%p)", G_STRFUNC, notify, data); +} + /** * gst_mini_object_replace: * @olddata: (inout) (transfer full): pointer to a pointer to a mini-object to @@ -427,8 +570,8 @@ gst_value_mini_object_copy (const GValue * src_value, GValue * dest_value) { if (src_value->data[0].v_pointer) { dest_value->data[0].v_pointer = - gst_mini_object_ref (GST_MINI_OBJECT_CAST (src_value-> - data[0].v_pointer)); + gst_mini_object_ref (GST_MINI_OBJECT_CAST (src_value->data[0]. + v_pointer)); } else { dest_value->data[0].v_pointer = NULL; } @@ -556,8 +699,8 @@ gst_value_dup_mini_object (const GValue * value) { g_return_val_if_fail (GST_VALUE_HOLDS_MINI_OBJECT (value), NULL); - return value->data[0].v_pointer ? gst_mini_object_ref (value->data[0]. - v_pointer) : NULL; + return value->data[0].v_pointer ? gst_mini_object_ref (value-> + data[0].v_pointer) : NULL; } diff --git a/gst/gstminiobject.h b/gst/gstminiobject.h index 1005dc5442..fbc7801ac4 100644 --- a/gst/gstminiobject.h +++ b/gst/gstminiobject.h @@ -135,6 +135,22 @@ typedef enum */ #define GST_MINI_OBJECT_REFCOUNT_VALUE(obj) (g_atomic_int_get (&(GST_MINI_OBJECT_CAST(obj))->refcount)) +/** + * GstMiniObjectWeakNotify: + * @data: data that was provided when the weak reference was established + * @where_the_mini_object_was: the mini object being finalized + * + * A #GstMiniObjectWeakNotify function can be added to a mini object as a + * callback that gets triggered when the mini object is finalized. Since the + * mini object is already being finalized when the #GstMiniObjectWeakNotify is + * called, there's not much you could do with the object, apart from e.g. using + * its adress as hash-index or the like. + */ +typedef void (*GstMiniObjectWeakNotify) (gpointer data, + GstMiniObject * where_the_mini_object_was); + +typedef struct _GstMiniObjectPrivateData GstMiniObjectPrivateData; + /** * GstMiniObject: * @instance: type instance @@ -154,7 +170,7 @@ struct _GstMiniObject { guint flags; /*< private >*/ - gpointer _gst_reserved; + GstMiniObjectPrivateData *priv; }; struct _GstMiniObjectClass { @@ -177,6 +193,12 @@ GstMiniObject* gst_mini_object_make_writable (GstMiniObject *mini_object); /* refcounting */ GstMiniObject* gst_mini_object_ref (GstMiniObject *mini_object); void gst_mini_object_unref (GstMiniObject *mini_object); +void gst_mini_object_weak_ref (GstMiniObject *object, + GstMiniObjectWeakNotify notify, + gpointer data); +void gst_mini_object_weak_unref (GstMiniObject *object, + GstMiniObjectWeakNotify notify, + gpointer data); void gst_mini_object_replace (GstMiniObject **olddata, GstMiniObject *newdata); /* GParamSpec */ diff --git a/tests/check/gst/gstminiobject.c b/tests/check/gst/gstminiobject.c index 9b9c1cde9c..0a7a7313b2 100644 --- a/tests/check/gst/gstminiobject.c +++ b/tests/check/gst/gstminiobject.c @@ -175,6 +175,33 @@ GST_START_TEST (test_unref_threaded) GST_END_TEST; +/* ======== weak ref test ======== */ + +static gboolean weak_ref_notify_succeeded = FALSE; + +static void +on_weak_ref_notify (gpointer data, GstMiniObject * where_object_was) +{ + weak_ref_notify_succeeded = TRUE; +} + +GST_START_TEST (test_weak_ref) +{ + GstBuffer *buffer; + + buffer = gst_buffer_new_and_alloc (4); + + gst_mini_object_weak_ref (GST_MINI_OBJECT (buffer), on_weak_ref_notify, + &buffer); + + gst_buffer_unref (buffer); + + fail_unless (weak_ref_notify_succeeded, + "No weak reference notification took place."); +} + +GST_END_TEST; + /* ======== recycle test ======== */ static gint recycle_buffer_count = 10; @@ -479,6 +506,7 @@ gst_mini_object_suite (void) tcase_add_test (tc_chain, test_make_writable); tcase_add_test (tc_chain, test_ref_threaded); tcase_add_test (tc_chain, test_unref_threaded); + tcase_add_test (tc_chain, test_weak_ref); tcase_add_test (tc_chain, test_recycle_threaded); tcase_add_test (tc_chain, test_value_collection); tcase_add_test (tc_chain, test_dup_null_mini_object); From 116972d6eb3d7fa757017df5bcbc71cffb296681 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 12 May 2011 09:55:45 +0200 Subject: [PATCH 25/30] miniobject: Minor cleanup of last commit --- gst/gstminiobject.c | 8 ++++---- gst/gstminiobject.h | 7 +++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/gst/gstminiobject.c b/gst/gstminiobject.c index 0fe5a8c403..e0d361e70e 100644 --- a/gst/gstminiobject.c +++ b/gst/gstminiobject.c @@ -59,7 +59,7 @@ typedef struct } WeakRefStack; /* Structure for storing a mini object's private data */ -struct _GstMiniObjectPrivateData +struct _GstMiniObjectPrivate { WeakRefStack *wstack; }; @@ -162,7 +162,7 @@ gst_mini_object_class_init (gpointer g_class, gpointer class_data) mo_class->finalize = gst_mini_object_finalize; /* Set the instance data type */ - g_type_class_add_private (g_class, sizeof (GstMiniObjectPrivateData)); + g_type_class_add_private (g_class, sizeof (GstMiniObjectPrivate)); } static void @@ -174,9 +174,9 @@ gst_mini_object_init (GTypeInstance * instance, gpointer klass) /* Initialize the mini object's private data */ - mini_object->priv = (GstMiniObjectPrivateData *) + mini_object->priv = (GstMiniObjectPrivate *) G_TYPE_INSTANCE_GET_PRIVATE (instance, GST_TYPE_MINI_OBJECT, - GstMiniObjectPrivateData); + GstMiniObjectPrivate); mini_object->priv->wstack = NULL; } diff --git a/gst/gstminiobject.h b/gst/gstminiobject.h index fbc7801ac4..64232cb110 100644 --- a/gst/gstminiobject.h +++ b/gst/gstminiobject.h @@ -145,11 +145,14 @@ typedef enum * mini object is already being finalized when the #GstMiniObjectWeakNotify is * called, there's not much you could do with the object, apart from e.g. using * its adress as hash-index or the like. + * + * Since: 0.10.34 + * */ typedef void (*GstMiniObjectWeakNotify) (gpointer data, GstMiniObject * where_the_mini_object_was); -typedef struct _GstMiniObjectPrivateData GstMiniObjectPrivateData; +typedef struct _GstMiniObjectPrivate GstMiniObjectPrivate; /** * GstMiniObject: @@ -170,7 +173,7 @@ struct _GstMiniObject { guint flags; /*< private >*/ - GstMiniObjectPrivateData *priv; + GstMiniObjectPrivate *priv; }; struct _GstMiniObjectClass { From 9149043e95ce57b1ca2b8b6037e4e71f5289fad4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 12 May 2011 09:59:20 +0200 Subject: [PATCH 26/30] miniobject: Add new miniobject weak ref/unref functions to the docs --- docs/gst/gstreamer-sections.txt | 4 ++++ win32/common/libgstreamer.def | 2 ++ 2 files changed, 6 insertions(+) diff --git a/docs/gst/gstreamer-sections.txt b/docs/gst/gstreamer-sections.txt index 7cf8a53738..47e8d7f4cd 100644 --- a/docs/gst/gstreamer-sections.txt +++ b/docs/gst/gstreamer-sections.txt @@ -1343,6 +1343,7 @@ GstMiniObject GstMiniObjectFlags GstMiniObjectCopyFunction GstMiniObjectFinalizeFunction +GstMiniObjectWeakNotify GST_MINI_OBJECT_FLAGS GST_MINI_OBJECT_FLAG_IS_SET @@ -1360,6 +1361,9 @@ gst_mini_object_ref gst_mini_object_unref gst_mini_object_replace +gst_mini_object_weak_ref +gst_mini_object_weak_unref + GstParamSpecMiniObject gst_param_spec_mini_object diff --git a/win32/common/libgstreamer.def b/win32/common/libgstreamer.def index 07ed4276db..021e92aa6d 100644 --- a/win32/common/libgstreamer.def +++ b/win32/common/libgstreamer.def @@ -608,6 +608,8 @@ EXPORTS gst_mini_object_ref gst_mini_object_replace gst_mini_object_unref + gst_mini_object_weak_ref + gst_mini_object_weak_unref gst_object_check_uniqueness gst_object_default_deep_notify gst_object_default_error From cdffc1d5d561ae069a9ea430f6c414b3f88882cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 12 May 2011 15:51:22 +0200 Subject: [PATCH 27/30] systemclock: Only retry writing to the socket for EAGAIN, EWOULDBLOCK and EINTR Fixes infinite loop in some cases, bug #650002. --- gst/gstsystemclock.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/gst/gstsystemclock.c b/gst/gstsystemclock.c index 10ad4ed58b..daea19081d 100644 --- a/gst/gstsystemclock.c +++ b/gst/gstsystemclock.c @@ -326,9 +326,16 @@ gst_system_clock_add_wakeup (GstSystemClock * sysclock) if (sysclock->priv->wakeup_count == 0) { GST_CAT_DEBUG (GST_CAT_CLOCK, "writing control"); while (!gst_poll_write_control (sysclock->priv->timer)) { - g_warning - ("gstsystemclock: write control failed in wakeup_async, trying again : %d:%s\n", - errno, g_strerror (errno)); + if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) { + g_warning + ("gstsystemclock: write control failed in wakeup_async, trying again: %d:%s\n", + errno, g_strerror (errno)); + } else { + g_critical + ("gstsystemclock: write control failed in wakeup_async: %d:%s\n", + errno, g_strerror (errno)); + return; + } } } sysclock->priv->wakeup_count++; From 7316a88387e3e5a36d792f4a6e95cbb9f05e9513 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 12 May 2011 16:48:41 +0200 Subject: [PATCH 28/30] bin: Don't interprete pipelines without sink elements as always being in EOS state Some tests (e.g. elements/capsfilter) have pipelines with dangling sinkpads and without a sink element. These pipelines can never post an EOS message (because this is only valid by a sink) and as such should never get an EOS message posted by the bin. --- gst/gstbin.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/gst/gstbin.c b/gst/gstbin.c index 947bd10792..89ad34e721 100644 --- a/gst/gstbin.c +++ b/gst/gstbin.c @@ -996,6 +996,7 @@ static gboolean is_eos (GstBin * bin, guint32 * seqnum) { gboolean result; + gint n_eos = 0; GList *walk, *msgs; result = TRUE; @@ -1009,6 +1010,7 @@ is_eos (GstBin * bin, guint32 * seqnum) find_message (bin, GST_OBJECT_CAST (element), GST_MESSAGE_EOS))) { GST_DEBUG ("sink '%s' posted EOS", GST_ELEMENT_NAME (element)); *seqnum = gst_message_get_seqnum (GST_MESSAGE_CAST (msgs->data)); + n_eos++; } else { GST_DEBUG ("sink '%s' did not post EOS yet", GST_ELEMENT_NAME (element)); @@ -1017,7 +1019,13 @@ is_eos (GstBin * bin, guint32 * seqnum) } } } - return result; + /* FIXME: Some tests (e.g. elements/capsfilter) use + * pipelines with a dangling sinkpad but no sink element. + * These tests assume that no EOS message is ever + * posted on the bus so let's keep that behaviour. + * In valid pipelines this doesn't make a difference. + */ + return result && n_eos > 0; } static void From 76ccd2a1e9a7adc3b3bb3cc09b4a4b8ed521e1f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sat, 14 May 2011 14:02:06 +0100 Subject: [PATCH 29/30] docs: fix up some Since markers and update for new multiqueue args --- docs/plugins/gstreamer-plugins.args | 20 +++++++++++++ gst/gstelement.h | 2 +- gst/gstghostpad.c | 44 ++++++++++++++--------------- gst/gstminiobject.c | 4 +-- gst/gstminiobject.h | 2 +- plugins/elements/gstinputselector.c | 2 +- plugins/elements/gstmultiqueue.c | 2 +- 7 files changed, 48 insertions(+), 28 deletions(-) diff --git a/docs/plugins/gstreamer-plugins.args b/docs/plugins/gstreamer-plugins.args index 75548b2bcd..93a9fd0393 100644 --- a/docs/plugins/gstreamer-plugins.args +++ b/docs/plugins/gstreamer-plugins.args @@ -848,6 +848,16 @@ FALSE + +GstMultiQueue::sync-by-running-time +gboolean + +rw +Sync By Running Time +Synchronize deactivated or not-linked streams by running time. +FALSE + + GstBin::async-handling gboolean @@ -1068,3 +1078,13 @@ FALSE + +GstInputSelector::sync-streams +gboolean + +rw +Sync Streams +Synchronize inactive streams to the running time of the active stream. +FALSE + + diff --git a/gst/gstelement.h b/gst/gstelement.h index f1195e04ea..d391907b78 100644 --- a/gst/gstelement.h +++ b/gst/gstelement.h @@ -602,7 +602,7 @@ struct _GstElement * @get_query_types: get the supported #GstQueryType of this element * @query: perform a #GstQuery on the element * @request_new_pad_full: called when a new pad is requested. Since: 0.10.32. - * @state_changed: called immediately after a new state was set. Since: 0.10.34. + * @state_changed: called immediately after a new state was set. Since: 0.10.35. * * GStreamer element class. Override the vmethods to implement the element * functionality. diff --git a/gst/gstghostpad.c b/gst/gstghostpad.c index 4f40119f47..4a024a26ef 100644 --- a/gst/gstghostpad.c +++ b/gst/gstghostpad.c @@ -99,7 +99,7 @@ static GParamSpec *pspec_caps = NULL; * Returns: (transfer none) (array zero-terminated=1): a zero-terminated array * of #GstQueryType. * - * Since: 0.10.34 + * Since: 0.10.35 */ const GstQueryType * gst_proxy_pad_query_type_default (GstPad * pad) @@ -126,7 +126,7 @@ gst_proxy_pad_query_type_default (GstPad * pad) * * Returns: TRUE if the event was handled. * - * Since: 0.10.34 + * Since: 0.10.35 */ gboolean gst_proxy_pad_event_default (GstPad * pad, GstEvent * event) @@ -156,7 +156,7 @@ gst_proxy_pad_event_default (GstPad * pad, GstEvent * event) * * Returns: TRUE if the query could be performed. * - * Since: 0.10.34 + * Since: 0.10.35 */ gboolean gst_proxy_pad_query_default (GstPad * pad, GstQuery * query) @@ -185,7 +185,7 @@ gst_proxy_pad_query_default (GstPad * pad, GstQuery * query) * Returns: a #GstIterator of #GstPad, or NULL if @pad has no parent. Unref each * returned pad with gst_object_unref(). * - * Since: 0.10.34 + * Since: 0.10.35 */ GstIterator * gst_proxy_pad_iterate_internal_links_default (GstPad * pad) @@ -224,7 +224,7 @@ gst_proxy_pad_iterate_internal_links_default (GstPad * pad) * An error can occur if the pad is not connected or when the downstream * peer elements cannot provide an acceptable buffer. * - * Since: 0.10.34 + * Since: 0.10.35 */ GstFlowReturn gst_proxy_pad_bufferalloc_default (GstPad * pad, guint64 offset, guint size, @@ -257,7 +257,7 @@ gst_proxy_pad_bufferalloc_default (GstPad * pad, guint64 offset, guint size, * * Returns: a #GstFlowReturn from the pad. * - * Since: 0.10.34 + * Since: 0.10.35 */ GstFlowReturn gst_proxy_pad_chain_default (GstPad * pad, GstBuffer * buffer) @@ -284,7 +284,7 @@ gst_proxy_pad_chain_default (GstPad * pad, GstBuffer * buffer) * * Returns: a #GstFlowReturn from the pad. * - * Since: 0.10.34 + * Since: 0.10.35 */ GstFlowReturn gst_proxy_pad_chain_list_default (GstPad * pad, GstBufferList * list) @@ -313,7 +313,7 @@ gst_proxy_pad_chain_list_default (GstPad * pad, GstBufferList * list) * * Returns: a #GstFlowReturn from the pad. * - * Since: 0.10.34 + * Since: 0.10.35 */ GstFlowReturn gst_proxy_pad_getrange_default (GstPad * pad, guint64 offset, guint size, @@ -339,7 +339,7 @@ gst_proxy_pad_getrange_default (GstPad * pad, guint64 offset, guint size, * * Returns: a #gboolean from the pad. * - * Since: 0.10.34 + * Since: 0.10.35 */ gboolean gst_proxy_pad_checkgetrange_default (GstPad * pad) @@ -363,7 +363,7 @@ gst_proxy_pad_checkgetrange_default (GstPad * pad) * * Returns: (transfer full): the caps of the pad with incremented ref-count * - * Since: 0.10.34 + * Since: 0.10.35 */ GstCaps * gst_proxy_pad_getcaps_default (GstPad * pad) @@ -427,7 +427,7 @@ done: * * Returns: TRUE if the pad can accept the caps. * - * Since: 0.10.34 + * Since: 0.10.35 */ gboolean gst_proxy_pad_acceptcaps_default (GstPad * pad, GstCaps * caps) @@ -458,7 +458,7 @@ gst_proxy_pad_acceptcaps_default (GstPad * pad, GstCaps * caps) * * Invoke the default fixatecaps function of the proxy pad. * - * Since: 0.10.34 + * Since: 0.10.35 */ void gst_proxy_pad_fixatecaps_default (GstPad * pad, GstCaps * caps) @@ -485,7 +485,7 @@ gst_proxy_pad_fixatecaps_default (GstPad * pad, GstCaps * caps) * Returns: TRUE if the caps could be set. FALSE if the caps were not fixed * or bad parameters were provided to this function. * - * Since: 0.10.34 + * Since: 0.10.35 */ gboolean gst_proxy_pad_setcaps_default (GstPad * pad, GstCaps * caps) @@ -582,7 +582,7 @@ gst_proxy_pad_get_target (GstPad * pad) * Returns: (transfer full): the target #GstProxyPad, can be NULL. * Unref target pad after usage. * - * Since: 0.10.34 + * Since: 0.10.35 */ GstProxyPad * gst_proxy_pad_get_internal (GstProxyPad * pad) @@ -606,7 +606,7 @@ gst_proxy_pad_get_internal (GstProxyPad * pad) * * Invoke the default unlink function of the proxy pad. * - * Since: 0.10.34 + * Since: 0.10.35 */ void gst_proxy_pad_unlink_default (GstPad * pad) @@ -798,7 +798,7 @@ static void gst_ghost_pad_dispose (GObject * object); * * Returns: %TRUE if the operation was successful. * - * Since: 0.10.34 + * Since: 0.10.35 */ gboolean gst_ghost_pad_internal_activate_push_default (GstPad * pad, gboolean active) @@ -829,7 +829,7 @@ gst_ghost_pad_internal_activate_push_default (GstPad * pad, gboolean active) * * Returns: %TRUE if the operation was successful. * - * Since: 0.10.34 + * Since: 0.10.35 */ gboolean gst_ghost_pad_internal_activate_pull_default (GstPad * pad, gboolean active) @@ -875,7 +875,7 @@ gst_ghost_pad_internal_activate_pull_default (GstPad * pad, gboolean active) * * Returns: %TRUE if the operation was successful. * - * Since: 0.10.34 + * Since: 0.10.35 */ gboolean gst_ghost_pad_activate_push_default (GstPad * pad, gboolean active) @@ -904,7 +904,7 @@ gst_ghost_pad_activate_push_default (GstPad * pad, gboolean active) * * Returns: %TRUE if the operation was successful. * - * Since: 0.10.34 + * Since: 0.10.35 */ gboolean gst_ghost_pad_activate_pull_default (GstPad * pad, gboolean active) @@ -948,7 +948,7 @@ gst_ghost_pad_activate_pull_default (GstPad * pad, gboolean active) * * Returns: #GstPadLinkReturn of the operation * - * Since: 0.10.34 + * Since: 0.10.35 */ GstPadLinkReturn gst_ghost_pad_link_default (GstPad * pad, GstPad * peer) @@ -998,7 +998,7 @@ link_failed: * * Invoke the default unlink function of a ghost pad. * - * Since: 0.10.34 + * Since: 0.10.35 */ void gst_ghost_pad_unlink_default (GstPad * pad) @@ -1108,7 +1108,7 @@ done: * * Returns: %TRUE if the operation was successful * - * Since: 0.10.34 + * Since: 0.10.35 */ gboolean gst_ghost_pad_setcaps_default (GstPad * pad, GstCaps * caps) diff --git a/gst/gstminiobject.c b/gst/gstminiobject.c index e0d361e70e..be521aaa26 100644 --- a/gst/gstminiobject.c +++ b/gst/gstminiobject.c @@ -430,7 +430,7 @@ gst_mini_object_unref (GstMiniObject * mini_object) * (gst_mini_object_ref() adds a strong reference, that is, forces the object * to stay alive). * - * Since: 0.10.34 + * Since: 0.10.35 */ void gst_mini_object_weak_ref (GstMiniObject * object, @@ -479,7 +479,7 @@ found: * * Removes a weak reference callback to a mini object. * - * Since: 0.10.34 + * Since: 0.10.35 */ void gst_mini_object_weak_unref (GstMiniObject * object, diff --git a/gst/gstminiobject.h b/gst/gstminiobject.h index 64232cb110..024d1e2111 100644 --- a/gst/gstminiobject.h +++ b/gst/gstminiobject.h @@ -146,7 +146,7 @@ typedef enum * called, there's not much you could do with the object, apart from e.g. using * its adress as hash-index or the like. * - * Since: 0.10.34 + * Since: 0.10.35 * */ typedef void (*GstMiniObjectWeakNotify) (gpointer data, diff --git a/plugins/elements/gstinputselector.c b/plugins/elements/gstinputselector.c index 4e4075a50d..f62a488c66 100644 --- a/plugins/elements/gstinputselector.c +++ b/plugins/elements/gstinputselector.c @@ -1023,7 +1023,7 @@ gst_input_selector_class_init (GstInputSelectorClass * klass) * buffers are dropped by input-selector that might be needed * when switching the active pad. * - * Since: 0.10.33 + * Since: 0.10.35 */ g_object_class_install_property (gobject_class, PROP_SYNC_STREAMS, g_param_spec_boolean ("sync-streams", "Sync Streams", diff --git a/plugins/elements/gstmultiqueue.c b/plugins/elements/gstmultiqueue.c index e1ddc81077..38e8bd1fdb 100644 --- a/plugins/elements/gstmultiqueue.c +++ b/plugins/elements/gstmultiqueue.c @@ -410,7 +410,7 @@ gst_multi_queue_class_init (GstMultiQueueClass * klass) * streams by keeping the order in which buffers and events arrived compared * to active and linked streams. * - * Since: 0.10.33 + * Since: 0.10.35 */ g_object_class_install_property (gobject_class, PROP_SYNC_BY_RUNNING_TIME, g_param_spec_boolean ("sync-by-running-time", "Sync By Running Time", From fe1dcbe6fa1625ae83980f4da813f0f3764e7d51 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Tue, 19 Apr 2011 20:05:07 +0200 Subject: [PATCH 30/30] queue2: adjust input data rate estimation ... being aware of possible initial higher burst rate. --- plugins/elements/gstqueue2.c | 18 ++++++++++++++---- plugins/elements/gstqueue2.h | 1 + 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/plugins/elements/gstqueue2.c b/plugins/elements/gstqueue2.c index 436323c0b0..f1dce4b0c7 100644 --- a/plugins/elements/gstqueue2.c +++ b/plugins/elements/gstqueue2.c @@ -898,6 +898,7 @@ reset_rate_timer (GstQueue2 * queue) queue->bytes_in = 0; queue->bytes_out = 0; queue->byte_in_rate = 0.0; + queue->byte_in_period = 0; queue->byte_out_rate = 0.0; queue->last_in_elapsed = 0.0; queue->last_out_elapsed = 0.0; @@ -910,8 +911,11 @@ reset_rate_timer (GstQueue2 * queue) /* Tuning for rate estimation. We use a large window for the input rate because * it should be stable when connected to a network. The output rate is less * stable (the elements preroll, queues behind a demuxer fill, ...) and should - * therefore adapt more quickly. */ -#define AVG_IN(avg,val) ((avg) * 15.0 + (val)) / 16.0 + * therefore adapt more quickly. + * However, initial input rate may be subject to a burst, and should therefore + * initially also adapt more quickly to changes, and only later on give higher + * weight to previous values. */ +#define AVG_IN(avg,val,w1,w2) ((avg) * (w1) + (val) * (w2)) / ((w1) + (w2)) #define AVG_OUT(avg,val) ((avg) * 3.0 + (val)) / 4.0 static void @@ -933,14 +937,20 @@ update_in_rates (GstQueue2 * queue) period = elapsed - queue->last_in_elapsed; GST_DEBUG_OBJECT (queue, - "rates: period %f, in %" G_GUINT64_FORMAT, period, queue->bytes_in); + "rates: period %f, in %" G_GUINT64_FORMAT ", global period %f", + period, queue->bytes_in, queue->byte_in_period); byte_in_rate = queue->bytes_in / period; if (queue->byte_in_rate == 0.0) queue->byte_in_rate = byte_in_rate; else - queue->byte_in_rate = AVG_IN (queue->byte_in_rate, byte_in_rate); + queue->byte_in_rate = AVG_IN (queue->byte_in_rate, byte_in_rate, + (double) queue->byte_in_period, period); + + /* another data point, cap at 16 for long time running average */ + if (queue->byte_in_period < 16 * RATE_INTERVAL) + queue->byte_in_period += period; /* reset the values to calculate rate over the next interval */ queue->last_in_elapsed = elapsed; diff --git a/plugins/elements/gstqueue2.h b/plugins/elements/gstqueue2.h index 358b43a47a..ccbead6a17 100644 --- a/plugins/elements/gstqueue2.h +++ b/plugins/elements/gstqueue2.h @@ -116,6 +116,7 @@ struct _GstQueue2 gdouble last_in_elapsed; guint64 bytes_in; gdouble byte_in_rate; + gdouble byte_in_period; GTimer *out_timer; gboolean out_timer_started;