--- /dev/null
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/autogen.sh gstreamer-0.10.23/autogen.sh
+--- gstreamer-0.10.23.orig/autogen.sh 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/autogen.sh 2009-06-11 14:19:59.000000000 +0200
+@@ -80,9 +80,9 @@
+
+ # aclocal
+ if test -f acinclude.m4; then rm acinclude.m4; fi
+-tool_run "$aclocal" "-I common/m4 $ACLOCAL_FLAGS"
+
+ tool_run "$libtoolize" "--copy --force"
++tool_run "$aclocal" "-I common/m4 $ACLOCAL_FLAGS"
+ tool_run "$autoheader"
+
+ # touch the stamp-h.in build stamp so we don't re-run autoheader in maintainer mode -- wingo
+@@ -90,7 +90,7 @@
+
+ tool_run "$autoconf"
+ debug "automake: $automake"
+-tool_run "$automake" "--add-missing --copy -Wno-portability"
++tool_run "$automake" "--add-missing --copy"
+
+ test -n "$NOCONFIGURE" && {
+ echo "skipping configure stage for package $package, as requested."
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/configure.ac gstreamer-0.10.23/configure.ac
+--- gstreamer-0.10.23.orig/configure.ac 2009-05-10 22:23:21.000000000 +0200
++++ gstreamer-0.10.23/configure.ac 2009-06-11 14:19:59.000000000 +0200
+@@ -2,20 +2,20 @@
+
+ dnl initialize autoconf
+ dnl when going to/from release please set the nano (fourth number) right !
+-dnl releases only do Wall, cvs and prerelease does Werror too
+-AC_INIT(GStreamer, 0.10.23,
++dnl releases only do Wall, git and prerelease does Werror too
++AC_INIT(GStreamer, 0.10.23.1,
+ http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer,
+ gstreamer)
+ AG_GST_INIT
+
+-dnl initialize automake
+-AM_INIT_AUTOMAKE
++dnl initialize automake (we require GNU make)
++AM_INIT_AUTOMAKE([-Wno-portability])
+
+ dnl define PACKAGE_VERSION_* variables
+ AS_VERSION
+
+ dnl check if this is a release version
+-AS_NANO(GST_CVS="no", GST_CVS="yes")
++AS_NANO(GST_GIT="no", GST_GIT="yes")
+
+ dnl can autoconf find the source ?
+ AC_CONFIG_SRCDIR([gst/gst.c])
+@@ -174,26 +174,6 @@
+ [Define if we should poison deallocated memory])
+ fi
+
+-dnl Use binary registry
+-AC_ARG_ENABLE(binary-registry,
+- AC_HELP_STRING([--disable-binary-registry],
+- [disable binary registry]),
+- [
+- case "${enableval}" in
+- yes) USE_BINARY_REGISTRY=yes ;;
+- no) USE_BINARY_REGISTRY=no ;;
+- *) AC_MSG_ERROR(bad value ${enableval} for --disable-binary-registry) ;;
+- esac
+- ],
+- [USE_BINARY_REGISTRY=yes]) dnl Default value
+-
+-if test "x$USE_BINARY_REGISTRY" = xyes; then
+- dnl for config.h:
+- AC_DEFINE(USE_BINARY_REGISTRY, 1,
+- [Define if we should use binary registry instead xml registry])
+-fi
+-AM_CONDITIONAL(USE_BINARY_REGISTRY, test "x$USE_BINARY_REGISTRY" = "xyes")
+-
+ dnl *** checks for platform ***
+
+ dnl * hardware/architecture *
+@@ -325,6 +305,10 @@
+ dnl Check for stdio_ext.f for __fbufsize
+ AC_CHECK_HEADERS([stdio_ext.h])
+
++dnl check for pthreads
++AC_CHECK_HEADERS([pthread.h], HAVE_PTHREAD_H=yes)
++AM_CONDITIONAL(HAVE_PTHREAD_H, test "x$HAVE_PTHREAD_H" = "xyes")
++
+ dnl Check for valgrind.h
+ dnl separate from HAVE_VALGRIND because you can have the program, but not
+ dnl the dev package
+@@ -344,9 +328,6 @@
+
+ dnl *** checks for compiler characteristics ***
+
+-dnl make sure we can use "inline" from C code
+-AC_C_INLINE
+-
+ OPT_CFLAGS=
+ dnl Check for some compiler flags that optimize our code.
+ if test "x$GCC" = xyes; then
+@@ -451,20 +432,21 @@
+ dnl Check for a way to display the function name in debug output
+ AG_GST_CHECK_FUNCTION
+
+-dnl test for register_printf_function
+-AC_CHECK_FUNC(register_printf_function,
+- [
+- GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE="#define GST_PTR_FORMAT \"P\""
+- GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE="#define GST_SEGMENT_FORMAT \"Q\""
+- GST_USING_PRINTF_EXTENSION_DEFINE="#define GST_USING_PRINTF_EXTENSION"
+- AC_DEFINE(HAVE_PRINTF_EXTENSION, 1,
+- [Defined if we have register_printf_function ()])
+- ], [
++dnl test for register_printf_specifier or register_printf_function
++AC_CHECK_FUNCS([register_printf_specifier register_printf_function],
++ [HAVE_PRINTF_EXTENSION=yes])
++
++if test "$HAVE_PRINTF_EXTENSION" = yes; then
++ GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE="#define GST_PTR_FORMAT \"P\""
++ GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE="#define GST_SEGMENT_FORMAT \"Q\""
++ GST_USING_PRINTF_EXTENSION_DEFINE="#define GST_USING_PRINTF_EXTENSION"
++ AC_DEFINE(HAVE_PRINTF_EXTENSION, 1,
++ [Defined if we have printf specifier extensions available])
++else
+ GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE="#define GST_PTR_FORMAT \"p\""
+ GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE="#define GST_SEGMENT_FORMAT \"p\""
+ GST_USING_PRINTF_EXTENSION_DEFINE="#undef GST_USING_PRINTF_EXTENSION"
+- ]
+-)
++fi
+ AC_SUBST(GST_PRINTF_EXTENSION_POINTER_FORMAT_DEFINE)
+ AC_SUBST(GST_PRINTF_EXTENSION_SEGMENT_FORMAT_DEFINE)
+ AC_SUBST(GST_USING_PRINTF_EXTENSION_DEFINE)
+@@ -494,7 +476,7 @@
+ dnl *** checks for dependency libraries ***
+
+ dnl GLib
+-GLIB_REQ=2.14
++GLIB_REQ=2.16
+
+ AG_GST_GLIB_CHECK([$GLIB_REQ])
+
+@@ -510,9 +492,7 @@
+ AC_SUBST(GLIB_PREFIX)
+
+ dnl libxml 2 is optional in some cases
+-if test "x$GST_DISABLE_LOADSAVE" = "xyes" && \
+- ( test "x$GST_DISABLE_REGISTRY" = "xyes" || \
+- test "x$USE_BINARY_REGISTRY" = "xyes" )
++if test "x$GST_DISABLE_LOADSAVE" = "xyes" -a "x$GST_DISABLE_REGISTRY" = "xyes"
+ then
+ AC_MSG_NOTICE([XML registry and load/save are disabled, not checking for libxml2])
+ GST_DISABLE_XML_DEFINE="#define GST_DISABLE_XML 1"
+@@ -561,10 +541,10 @@
+ AC_SUBST(GST_PKG_DEPS)
+
+ dnl define an ERROR_CFLAGS Makefile variable
+-AG_GST_SET_ERROR_CFLAGS($GST_CVS)
++AG_GST_SET_ERROR_CFLAGS($GST_GIT)
+
+ dnl define correct level for debugging messages
+-AG_GST_SET_LEVEL_DEFAULT($GST_CVS)
++AG_GST_SET_LEVEL_DEFAULT($GST_GIT)
+
+ dnl *** finalize CFLAGS, LDFLAGS, LIBS
+
+@@ -587,7 +567,7 @@
+ # functionality from the API that gstreamer uses
+ # GST_REMOVE_DEPRECATED: don't compile deprecated functionality (breaks ABI)
+ if test "x$PACKAGE_VERSION_NANO" = "x1"; then
+- dnl Define _only_ during CVS (not pre-releases or releases)
++ dnl Define _only_ when compiling from git (not for pre-releases or releases)
+ DEPRECATED_CFLAGS="-DGST_DISABLE_DEPRECATED"
+ else
+ DEPRECATED_CFLAGS=""
+@@ -675,11 +655,13 @@
+ tests/examples/Makefile
+ tests/examples/adapter/Makefile
+ tests/examples/controller/Makefile
++tests/examples/stepping/Makefile
+ tests/examples/helloworld/Makefile
+ tests/examples/launch/Makefile
+ tests/examples/manual/Makefile
+ tests/examples/metadata/Makefile
+ tests/examples/queue/Makefile
++tests/examples/streams/Makefile
+ tests/examples/typefind/Makefile
+ tests/examples/xml/Makefile
+ tools/Makefile
+@@ -747,7 +729,6 @@
+ -e 's/.* PACKAGE_TARNAME$/#define PACKAGE_TARNAME "'$PACKAGE_TARNAME'"/' \
+ -e 's/.* PACKAGE_VERSION$/#define PACKAGE_VERSION "'$PACKAGE_VERSION'"/' \
+ -e 's/.* PLUGINDIR$/#ifdef _DEBUG\n# define PLUGINDIR PREFIX "\\\\debug\\\\lib\\\\gstreamer-0.10"\n#else\n# define PLUGINDIR PREFIX "\\\\lib\\\\gstreamer-0.10"\n#endif/' \
+- -e 's/.* USE_BINARY_REGISTRY$/#define USE_BINARY_REGISTRY/' \
+ -e 's/.* VERSION$/#define VERSION "'$VERSION'"/' \
+ config.h.in >win32/common/config.h-new
+
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/code-reviews/gstbin.c-1.41 gstreamer-0.10.23/docs/code-reviews/gstbin.c-1.41
+--- gstreamer-0.10.23.orig/docs/code-reviews/gstbin.c-1.41 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/code-reviews/gstbin.c-1.41 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,182 @@
++Code Review
++===========
++File: gst/gstbin.c
++Revision: 1.41
++Date: Dec 16, 2000
++Reviewer: Erik Walthinsen <omega@cse.ogi.edu>
++
++
++
++-----
++Line 20:
++#define GST_DEBUG_ENABLED
++
++Shouldn't be here, DEBUG should be enabled globally. May leave until
++scheduling changes are done.
++
++
++-----
++Lines 24-25:
++#include "gstsrc.h"
++#include "gstconnection.h"
++
++These may go away entirely with scheduling changes complete.
++Differentiation is based on element's pads.
++
++
++-----
++Lines 52-54:
++/* Bin signals and args */
++enum {
++ OBJECT_ADDED,
++
++Bin needs a lot more signals, there are a lot of events that may need to
++be trapped.
++
++
++-----
++Line 117: (gst_bin_class_init)
++ gstelement_class->elementfactory = gst_elementfactory_find("bin");
++
++Not sure this is such a great idea. I thought the GstElement code did
++this kind of stuff?
++
++
++-----
++Lines 127-128: (gst_bin_init)
++// FIXME temporary testing measure
++// bin->use_cothreads = TRUE;
++
++Need to work out how the cothreads force stuff works. need_cothreads is
++the private state that create_plan figures out, use_cothreads is the
++argument that the user sets. Since create_plan works out if cothreads are
++needed, and scheduling can't be done without them if they are really
++needed, perhaps we should rename use_cothreads to force_cothreads. If
++FALSE, create_plan decides. If TRUE, cothreads are forced on. Then
++again, there may be some random case where create_plan says to use
++cothreads when they're not strictly required. Not sure if we want to
++enable the user to force cothreads *off*. I suppose the user may know
++better, given specific plugins. Maybe a second argument
++force_cothreads_disable.
++
++
++-----
++Lines 131-145: (gst_bin_new)
++. . .
++
++It seems to make sense to keep this function, since it's part of the main
++API and not a plugin, but if we come up with some better way of creating
++plugins and such, this may go away. It stays for now.
++
++
++-----
++Lines 164-166: (gst_bin_add)
++ // must be NULL or PAUSED state in order to modify bin
++ g_return_if_fail ((GST_STATE (bin) == GST_STATE_NULL) ||
++ (GST_STATE (bin) == GST_STATE_PAUSED));
++
++Live pipeline modification needs some serious thought, along with the rest
++of the potential state-transition cases. This check looks sane in the
++sense that you really shouldn't be in running state and change the bin
++contents, since create_plan won't be run. But we don't actually re-run
++create_plan (or maybe it should be update_plan, and we keep a log of the
++changes since last plan to optimize the update?), so if someone messes
++with the bin during PAUSED state, we're looking forward to major disaster.
++
++
++-----
++Line 168: (gst_bin_add)
++ bin->children = g_list_append (bin->children, element);
++
++Should we be appending or prepending? Append is slow, but it's a matter
++of whether you want to spend the time at setup or later, with setup being
++preferable. We'll walk the child list quite often during runtime, so the
++time spent putting the element in the right place up front is done only
++once. Then again, does the order of the elements in the child list really
++matter?
++
++
++-----
++Lines 172-174: (gst_bin_add)
++ /* we know we have at least one child, we just added one... */
++// if (GST_STATE(element) < GST_STATE_READY)
++// gst_bin_change_state_norecurse(bin,GST_STATE_READY);
++
++This is another part of the state management issue. The behavior of Bins
++seems to be leaning away from this style, which is why it's commented out,
++but it's something to keep in mind when working on the state system.
++
++
++-----
++Lines 204-206: (gst_bin_remove)
++ /* if we're down to zero children, force state to NULL */
++ if (bin->numchildren == 0)
++ gst_element_set_state (GST_ELEMENT (bin), GST_STATE_NULL);
++
++Also suspect from the state management perspective, except this one isn't
++commented out.
++
++
++-----
++Line 226: (gst_bin_change_state)
++// g_return_val_if_fail(bin->numchildren != 0, GST_STATE_FAILURE);
++
++Should this be uncommented? It makes sense that a bin can't change state unless it's got children,
++though we probably should check to see what state change is actually occuring before blindly failing.
++
++
++-----
++Lines 241-243 (gst_bin_change_state)
++ case GST_STATE_ASYNC:
++ g_print("gstbin: child '%s' is changing state asynchronously\n", gst_element_get_name (child));
++ break;
++
++Obviously some work needs to be done on async state management. Probably need to have the Bin attach to
++one of the element's signals. This assumes that the element will get to run at some point in the
++future, or is capable of doing things in a separate context.
++
++
++-----
++Lines 250-257: (gst_bin_change_state)
++ if (GST_STATE_PENDING (element) == GST_STATE_READY) {
++ GstObject *parent;
++
++ parent = gst_object_get_parent (GST_OBJECT (element));
++
++ if (!parent || !GST_IS_BIN (parent))
++ gst_bin_create_plan (bin);
++ }
++
++First of all, this code is run even if there is a failed or async reply from one of the child elements.
++Second problem is that it will call create_plan only in the NULL->READY and PLAYING->READY cases. If
++PAUSED is going to be a time for allowing changes to the pipeline, we need to update the plan somehow on
++PAUSED->PLAYING state. And calling create_plan in the PLAYING->READY case isn't actually that useful...
++
++
++-----
++Line 263-271: (gst_bin_change_state_norecurse)
++. . .
++
++Is this really necessary? Are any users going to want to call this function? If not, then we can move
++the body of this function into gst_bin_change_state.
++
++
++-----
++Line 273-305: (gst_bin_set_state_type)
++. . .
++
++Is this function ever going to be used by anything? I tend to think not...
++
++
++-----
++Line 356-393: (gst_bin_get_by_name)
++. . .
++
++Should this be renamed to gst_bin_get_child_by_name() ?
++
++
++-----
++Line 464-471: (gst_bin_use_cothreads)
++. . .
++
++This should be removed in favor of an argument or two? I think so.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/code-reviews/README gstreamer-0.10.23/docs/code-reviews/README
+--- gstreamer-0.10.23.orig/docs/code-reviews/README 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/code-reviews/README 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,38 @@
++Code reviews:
++=============
++
++Files are to be named by file or subsystem, and CVS revision number or date:
++
++gstbin.c-1.41
++editor-20001216
++
++A file should look something like the following:
++
++----------------------------------------------------------------------
++Code Review
++===========
++File: gst/gstbin.c
++Revision: 1.41
++Date: Dec 16, 2000
++Reviewer: Erik Walthinsen <omega@cse.ogi.edu>
++
++
++-----
++Line 20:
++#define GST_DEBUG_ENABLED
++
++Shouldn't be here, DEBUG should be enabled globally. May leave until
++scheduling changes are done.
++
++
++-----
++Line 117: (gst_bin_class_init)
++ gstelement_class->elementfactory = gst_elementfactory_find("bin");
++
++Not sure this is such a great idea. I thought the GstElement code did this
++kind of stuff?
++
++----------------------------------------------------------------------
++
++The format will evolve as we do more stuff, such as putting in fields for
++recommended actions, comments regarding any later changes made and when, etc.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/design/draft-framestep.txt gstreamer-0.10.23/docs/design/draft-framestep.txt
+--- gstreamer-0.10.23.orig/docs/design/draft-framestep.txt 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/docs/design/draft-framestep.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -114,15 +114,6 @@
+ rates here, use a seek with a negative rate first to reverse the playback
+ direction.
+
+- "intermediate", G_TYPE_BOOLEAN
+- Signal that this step operation is an intermediate step, part of a series
+- of step operations. It is mostly interesting for stepping in the PAUSED state
+- because the sink will only perform a preroll after a non-intermediate step
+- operation completes. Intermediate steps are usefull to flush out data from
+- other sinks in order to not cause excessive queueing. In the PLAYING state
+- the intermediate flag has no visual effect. In all states, the intermediate
+- flag is passed to the corresponding GST_MESSAGE_STEP_DONE.
+-
+ "flush", G_TYPE_BOOLEAN
+ when flushing is TRUE, the step is performed immediatly:
+
+@@ -132,9 +123,11 @@
+ When the pipeline was stepping while the event is sent, the current step
+ operation is updated with the new amount and format. The sink will do a
+ best effort to comply with the new amount.
+- - In the PLAYING state, the requested amount of data is skipped (not
+- rendered) from the previous STEP request or from the position of the
+- last PAUSED if no previous STEP operation was performed.
++ - In the PLAYING state, the pipeline loses the PLAYING state, the
++ requested amount of data is skipped (not rendered) from the previous STEP
++ request or from the position of the last PAUSED if no previous STEP
++ operation was performed. The pipeline goes back to the PLAYING state
++ when a non-intermediate step completes.
+
+ When flushing is FALSE, the step will be performed later.
+
+@@ -143,7 +136,16 @@
+ - In the PLAYING state the step operation will be performed after the
+ current step operation completes. If there was no previous step
+ operation, the step operation will be performed from the position of the
+- last PAUSED state.
++ last PAUSED state.
++
++ "intermediate", G_TYPE_BOOLEAN
++ Signal that this step operation is an intermediate step, part of a series
++ of step operations. It is mostly interesting for stepping in the PAUSED state
++ because the sink will only perform a preroll after a non-intermediate step
++ operation completes. Intermediate steps are usefull to flush out data from
++ other sinks in order to not cause excessive queueing. In the PLAYING state
++ the intermediate flag has no visual effect. In all states, the intermediate
++ flag is passed to the corresponding GST_MESSAGE_STEP_DONE.
+
+
+ The application will create a STEP event to start or stop the stepping
+@@ -180,13 +182,19 @@
+ "rate", G_TYPE_DOUBLE
+ The rate and direction at which the frames were stepped.
+
++ "flush", G_TYPE_BOOLEAN
++ If the stepped frames were flushed.
++
+ "intermediate", G_TYPE_BOOLEAN
+ If this is an intermediate step operation that completed.
+
+ "duration", G_TYPE_UINT64
+ The total duration of the stepped units in GST_FORMAT_TIME.
+
+- The message is emited by the element that performs the step operation.
++ The message is emited by the element that performs the step operation. The
++ purpose is to return the duration in GST_FORMAT_TIME of the stepped media. This
++ especially interesting to align other stream in case of stepping frames on the
++ video sink element.
+
+
+ Direction switch
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/design/draft-klass.txt gstreamer-0.10.23/docs/design/draft-klass.txt
+--- gstreamer-0.10.23.orig/docs/design/draft-klass.txt 2009-01-21 11:11:03.000000000 +0100
++++ gstreamer-0.10.23/docs/design/draft-klass.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -86,6 +86,9 @@
+
+ * Audio : operates on audio data
+ * Video : operates on video data
++ * Image : operates on image data. Usually this media type can also
++ be used to make a video stream in which case it is added
++ together with the Video media type.
+ * Text : operates on text data
+ * Metadata : operates on metadata
+ * ...
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/design/Makefile.am gstreamer-0.10.23/docs/design/Makefile.am
+--- gstreamer-0.10.23.orig/docs/design/Makefile.am 2009-01-21 11:11:03.000000000 +0100
++++ gstreamer-0.10.23/docs/design/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -1,15 +1,13 @@
+
+ EXTRA_DIST = \
+ draft-framestep.txt \
+- draft-ghostpads.txt \
+ draft-klass.txt \
+- draft-latency.txt \
+- draft-missing-plugins.txt \
+ draft-push-pull.txt \
+ draft-tagreading.txt \
+ part-activation.txt \
+ part-block.txt \
+ part-buffering.txt \
++ part-bufferlist.txt \
+ part-caps.txt \
+ part-clocks.txt \
+ part-conventions.txt \
+@@ -24,8 +22,10 @@
+ part-gstghostpad.txt \
+ part-gstobject.txt \
+ part-gstpipeline.txt \
++ part-latency.txt \
+ part-live-source.txt \
+ part-messages.txt \
++ part-missing-plugins.txt \
+ part-MT-refcounting.txt \
+ part-negotiation.txt \
+ part-overview.txt \
+@@ -40,6 +40,7 @@
+ part-sparsestreams.txt \
+ part-standards.txt \
+ part-states.txt \
++ part-stream-status.txt \
+ part-streams.txt \
+ part-synchronisation.txt \
+ part-TODO.txt \
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/design/part-bufferlist.txt gstreamer-0.10.23/docs/design/part-bufferlist.txt
+--- gstreamer-0.10.23.orig/docs/design/part-bufferlist.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/design/part-bufferlist.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,94 @@
++Buffer Lists
++------------
++
++GstBuffer provides a datastructure to manage:
++
++ - a continuous region of memory
++ - functions to copy/free the memory
++ - metadata associated with that memory such as timestamps and caps.
++
++It is the primary means of transfering data between pads and elements.
++
++GstBufferList expands on GstBuffer to allow multiple GstBuffers (conceptually
++organized in a list) to be treated as a multiple groups of GstBuffers. This allows
++for the following extra functionality:
++
++ - A logical GstBuffer (called a group) can consist of disjoint memory each with
++ their own copy/free and metadata. Logicallty the group should be treated as
++ one single GstBuffer.
++ - Multiple groups can be put into one bufferlist. This allows for a single
++ method call to pass multiple (logical) buffers downstream.
++
++
++Use cases
++---------
++
++A typical use case for multimedia pipelines is to append or remove 'headers'
++from packets of data.
++
++* Generating RTP packets from h264 video
++
++ We receive as input a GstBuffer with an encoded h264 image and we need to
++ create RTP packets containing this h264 data as the payload. We typically need
++ to fragment the h264 data into multiple packets, each with their own RTP and
++ payload specific header.
++
++ +-------+-------+---------------------------+--------+
++ input H264 buffer: | NALU1 | NALU2 | ..... | NALUx |
++ +-------+-------+---------------------------+--------+
++ |
++ V
++ +-+ +-------+ +-+ +-------+ +-+ +-------+
++ output bufferlist: | | | NALU1 | | | | NALU2 | .... | | | NALUx |
++ +-+ +-------+ +-+ +-------+ +-+ +-------+
++
++ \-----------/ \-----------/
++ group 1 group 2
++
++ The output bufferlist consists of x groups consisting of an RTP payload header
++ and a subbuffer of the original input H264 buffer. Since the rtp headers and
++ the h264 data don't need to be contiguous in memory, we can avoid to memcpy the
++ h264 data into the rtp packets.
++
++ Since we can generate a bufferlist with multiple groups, we can push all the
++ RTP packets for the input data to the next element in one operation.
++
++ A typical udpsink will then use something like sendmsg to send the groups on
++ the network inside one UDP packet. This will further avoid having to memcpy
++ data into contiguous memory.
++
++
++API
++---
++
++The GstBufferList is an opaque data structure and is operated on using an
++iterator. It derives from GstMiniObject so that it has basic refcounting and
++copy/free functions.
++
++The bufferlist is writable when its refcount is 1 and it's not marked as
++readonly. A writable bufferlist means that elements can be added and removed
++form the list but it does not mean that the actual buffers in the list are
++writable.
++
++To modify the data in the buffers of the bufferlist, both the list and the
++buffer must be writable.
++
++Methods exist for navigating the groups in the list and the buffers inside a
++group.
++
++
++Metadata
++--------
++
++Each of the buffers inside the bufferlist can have metadata assiociated with it.
++
++The metadata of the bufferlist is always the metadata of the first buffer of the
++first group in the bufferlist. This means that:
++
++ - Before pushing the list to a pad, negotiation happens with (only) the caps of
++ the first buffer in the list. Caps of other buffers is ignore.
++
++ - synchronisation happens on the timestamp of the first buffer in the list.
++
++This allows for efficient (re)timestamping and re-typing (caps) of a group of
++buffers without having to modify each of the buffer's metadata.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/design/part-latency.txt gstreamer-0.10.23/docs/design/part-latency.txt
+--- gstreamer-0.10.23.orig/docs/design/part-latency.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/design/part-latency.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,328 @@
++Latency
++-------
++
++The latency is the time it takes for a sample captured at timestamp 0 to reach the
++sink. This time is measured against the clock in the pipeline. For pipelines
++where the only elements that synchronize against the clock are the sinks, the
++latency is always 0 since no other element is delaying the buffer.
++
++For pipelines with live sources, a latency is introduced, mostly because of the
++way a live source works. Consider an audio source, it will start capturing the
++first sample at time 0. If the source pushes buffers with 44100 samples at a
++time at 44100Hz it will have collected the buffer at second 1.
++Since the timestamp of the buffer is 0 and the time of the clock is now >= 1
++second, the sink will drop this buffer because it is too late.
++Without any latency compensation in the sink, all buffers will be dropped.
++
++The situation becomes more complex in the presence of:
++
++ - 2 live sources connected to 2 live sinks with different latencies
++ * audio/video capture with synchronized live preview.
++ * added latencies due to effects (delays, resamplers...)
++ - 1 live source connected to 2 live sinks
++ * firewire DV
++ * RTP, with added latencies because of jitter buffers.
++ - mixed live source and non-live source scenarios.
++ * synchronized audio capture with non-live playback. (overdubs,..)
++ - clock slaving in the sinks due to the live sources providing their own
++ clocks.
++
++To perform the needed latency corrections in the above scenarios, we must
++develop an algorithm to calculate a global latency for the pipeline. The
++algorithm must be extensible so that it can optimize the latency at runtime.
++It must also be possible to disable or tune the algorithm based on specific
++application needs (required minimal latency).
++
++
++Pipelines without latency compensation
++--------------------------------------
++
++We show some examples to demonstrate the problem of latency in typical
++capture pipelines.
++
++- Example 1
++
++ An audio capture/playback pipeline.
++
++ asrc: audio source, provides a clock
++ asink audio sink, provides a clock
++
++ .--------------------------.
++ | pipeline |
++ | .------. .-------. |
++ | | asrc | | asink | |
++ | | src -> sink | |
++ | '------' '-------' |
++ '--------------------------'
++
++ NULL->READY:
++ asink: NULL->READY: probes device, returns SUCCESS
++ asrc: NULL->READY: probes device, returns SUCCESS
++
++ READY->PAUSED:
++ asink: READY:->PAUSED open device, returns ASYNC
++ asrc: READY->PAUSED: open device, returns NO_PREROLL
++
++ * Since the source is a live source, it will only produce data in the
++ PLAYING state. To note this fact, it returns NO_PREROLL from the state change
++ function.
++ * This sink returns ASYNC because it can only complete the state change to
++ PAUSED when it receives the first buffer.
++
++ At this point the pipeline is not processing data and the clock is not
++ running. Unless a new action is performed on the pipeline, this situation will
++ never change.
++
++ PAUSED->PLAYING:
++ asrc clock selected because it is the most upstream clock provider. asink can
++ only provide a clock when it received the first buffer and configured the
++ device with the samplerate in the caps.
++
++ asink: PAUSED:->PLAYING, sets pending state to PLAYING, returns ASYNC becaus
++ it is not prerolled. The sink will commit state to
++ PLAYING when it prerolls.
++ asrc: PAUSED->PLAYING: starts pushing buffers.
++
++ * since the sink is still performing a state change from READY -> PAUSED, it
++ remains ASYNC. The pending state will be set to PLAYING.
++ * The clock starts running as soon as all the elements have been set to
++ PLAYING.
++ * the source is a live source with a latency. Since it is synchronized with
++ the clock, it will produce a buffer with timestamp 0 and duration D after
++ time D, ie. it will only be able to produce the last sample of the buffer
++ (with timestamp D) at time D. This latency depends on the size of the
++ buffer.
++ * the sink will receive the buffer with timestamp 0 at time >= D. At this
++ point the buffer is too late already and might be dropped. This state of
++ constantly dropping data will not change unless a constant latency
++ correction is added to the incomming buffer timestamps.
++
++ The problem is due to the fact that the sink is set to (pending) PLAYING
++ without being prerolled, which only happens in live pipelines.
++
++- Example 2
++
++ An audio/video capture/playback pipeline. We capture both audio and video and
++ have them played back synchronized again.
++
++ asrc: audio source, provides a clock
++ asink audio sink, provides a clock
++ vsrc: video source
++ vsink video sink
++
++ .--------------------------.
++ | pipeline |
++ | .------. .-------. |
++ | | asrc | | asink | |
++ | | src -> sink | |
++ | '------' '-------' |
++ | .------. .-------. |
++ | | vsrc | | vsink | |
++ | | src -> sink | |
++ | '------' '-------' |
++ '--------------------------'
++
++ The state changes happen in the same way as example 1. Both sinks end up with
++ pending state of PLAYING and a return value of ASYNC until they receive the
++ first buffer.
++
++ For audio and video to be played in sync, both sinks must compensate for the
++ latency of its source but must also use exactly the same latency correction.
++
++ Suppose asrc has a latency of 20ms and vsrc a latency of 33ms, the total
++ latency in the pipeline has to be at least 33ms. This also means that the
++ pipeline must have at least a 33 - 20 = 13ms buffering on the audio stream or
++ else the audio src will underrun while the audiosink waits for the previous
++ sample to play.
++
++- Example 3
++
++ An example of the combination of a non-live (file) and a live source (vsrc)
++ connected to live sinks (vsink, sink).
++
++ .--------------------------.
++ | pipeline |
++ | .------. .-------. |
++ | | file | | sink | |
++ | | src -> sink | |
++ | '------' '-------' |
++ | .------. .-------. |
++ | | vsrc | | vsink | |
++ | | src -> sink | |
++ | '------' '-------' |
++ '--------------------------'
++
++ The state changes happen in the same way as example 1. Except sink will be
++ able to preroll (commit its state to PAUSED).
++
++ In this case sink will have no latency but vsink will. The total latency
++ should be that of vsink.
++
++ Note that because of the presence of a live source (vsrc), the pipeline can be
++ set to playing before sink is able to preroll. Without compensation for the
++ live source, this might lead to synchronisation problems because the latency
++ should be configured in the element before it can go to PLAYING.
++
++
++- Example 4
++
++ An example of the combination of a non-live and a live source. The non-live
++ source is connected to a live sink and the live source to a non-live sink.
++
++ .--------------------------.
++ | pipeline |
++ | .------. .-------. |
++ | | file | | sink | |
++ | | src -> sink | |
++ | '------' '-------' |
++ | .------. .-------. |
++ | | vsrc | | files | |
++ | | src -> sink | |
++ | '------' '-------' |
++ '--------------------------'
++
++ The state changes happen in the same way as example 3. Sink will be
++ able to preroll (commit its state to PAUSED). files will not be able to
++ preroll.
++
++ sink will have no latency since it is not connected to a live source. files
++ does not do synchronisation so it does not care about latency.
++
++ The total latency in the pipeline is 0. The vsrc captures in sync with the
++ playback in sink.
++
++ As in example 3, sink can only be set to PLAYING after it successfully
++ prerolled.
++
++
++State Changes revised
++---------------------
++
++As a first step in a generic solution we propose to modify the state changes so
++that no sink is set to PLAYING before it is prerolled.
++
++In order to do this, the pipeline (at the GstBin level) keeps track of all
++elements that require preroll (the ones that return ASYNC from the state
++change). These elements posted a ASYNC_START message without a matching
++ASYNC_DONE message.
++
++The pipeline will not change the state of the elements that are still doing an
++ASYNC state change.
++
++When an ASYNC element prerolls, it commits its state to PAUSED and posts an
++ASYNC_DONE message. The pipeline notices this ASYNC_DONE message and matches it
++with the ASYNC_START message it cached for the corresponding element.
++
++When all ASYNC_START messages are matched with an ASYNC_DONE message, the
++pipeline proceeds with setting the elements to the final state again.
++
++The base time of the element was already set by the pipeline when it changed the
++NO_PREROLL element to PLAYING. This operation has to be performed in the
++separate async state change thread (like the one currently used for going from
++PAUSED->PLAYING in a non-live pipeline).
++
++implications:
++
++ - the current async_play vmethod in basesink can be deprecated since we now
++ always call the state change function when going from PAUSED->PLAYING. We
++ keep this method however to remain backward compatible.
++
++
++Latency compensation
++--------------------
++
++As an extension to the revised state changes we can perform latency calculation
++and compensation before we proceed to the PLAYING state.
++
++When the pipeline collected all ASYNC_DONE messages it can calculate the global
++latency as follows:
++
++ - perform a latency query on all sinks.
++ - latency = MAX (all min latencies)
++ - if MIN (all max latencies) < latency we have an impossible situation and we
++ must generate an error indicating that this pipeline cannot be played. This
++ usually means that there is not enough buffering in some chain of the
++ pipeline. A queue can be added to those chains.
++
++The sinks gather this information with a LATENCY query upstream. Intermediate
++elements pass the query upstream and add the amount of latency they add to the
++result.
++
++ex1:
++ sink1: [20 - 20]
++ sink2: [33 - 40]
++
++ MAX (20, 33) = 33
++ MIN (20, 40) = 20 < 33 -> impossible
++
++ex2:
++ sink1: [20 - 50]
++ sink2: [33 - 40]
++
++ MAX (20, 33) = 33
++ MIN (50, 40) = 40 >= 33 -> latency = 33
++
++The latency is set on the pipeline by sending a LATENCY event to the sinks
++in the pipeline. This event configures the total latency on the sinks. The
++sink forwards this LATENCY event upstream so that intermediate elements can
++configure themselves as well.
++
++After this step, the pipeline continues setting the pending state on its
++elements.
++
++A sink adds the latency value, received in the LATENCY event, to
++the times used for synchronizing against the clock. This will effectively
++delay the rendering of the buffer with the required latency. Since this delay is
++the same for all sinks, all sinks will render data relatively synchronised.
++
++
++Flushing a playing pipeline
++---------------------------
++
++Using the new state change mechanism we can implement resynchronisation after an
++uncontrolled FLUSH in (part of) a pipeline. Indeed, when a flush is performed on
++a PLAYING live element, a new base time must be distributed to this element.
++
++A flush in a pipeline can happen in the following cases:
++
++ - flushing seek in the pipeline
++ - performed by the application on the pipeline
++ - performed by the application on an element
++ - flush preformed by an element
++ - after receiving a navigation event (DVD, ...)
++
++When a playing sink is flushed by a FLUSH_START event, an ASYNC_START message is
++posted by the element. As part of the message, the fact that the element got
++flushed is included. The element also goes to a pending PAUSED state and has to
++be set to the PLAYING state again later.
++
++The ASYNC_START message is kept by the parent bin. When the element prerolls,
++it posts an ASYNC_DONE message.
++
++When all ASYNC_START messages are matched with an ASYNC_DONE message, the bin
++will capture a new base_time from the clock and will bring all the sinks back to
++PLAYING after setting the new base time on them. It's also possible
++to perform additional latency calculations and adjustments before doing this.
++
++
++Dynamically adjusting latency
++-----------------------------
++
++An element that want to change the latency in the pipeline can do this by
++posting a LATENCY message on the bus. This message instructs the pipeline to:
++
++ - query the latency in the pipeline (which might now have changed) with a
++ LATENCY query.
++ - redistribute a new global latency to all elements with a LATENCY event.
++
++A use case where the latency in a pipeline can change could be a network element
++that observes an increased inter packet arrival jitter or excessive packet loss
++and decides to increase its internal buffering (and thus the latency). The
++element must post a LATENCY message and perform the additional latency
++adjustments when it receives the LATENCY event from the downstream peer element.
++
++In a similar way can the latency be decreased when network conditions are
++improving again.
++
++Latency adjustments will introduce glitches in playback in the sinks and must
++only be performed in special conditions.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/design/part-missing-plugins.txt gstreamer-0.10.23/docs/design/part-missing-plugins.txt
+--- gstreamer-0.10.23.orig/docs/design/part-missing-plugins.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/design/part-missing-plugins.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,262 @@
++What to do when a plugin is missing
++===================================
++
++The mechanism and API described in this document requires GStreamer core and
++gst-plugins-base versions >= 0.10.12. Further information on some aspects of
++this document can be found in the libgstbaseutils API reference.
++
++We only discuss playback pipelines for now.
++
++A three step process:
++
++1) GStreamer level
++
++ - elements will use a "missing-plugin" element message to report missing
++ plugins, with the following fields set:
++
++ - type: (string) { "urisource", "urisink", "decoder", "encoder", "element" }
++ (we do not distinguish between demuxer/decoders/parsers etc.)
++ - detail: (string) or (caps) depending on the type { ANY }
++ ex: "mms, "mmsh", "audio/x-mp3,rate=48000,..."
++ - name: (string) { ANY }
++ ex: "MMS protocol handler",..
++
++ - missing uri handler
++
++ ex. mms://foo.bar/file.asf
++
++ When no protocol handler is installed for mms://, the application will not be
++ able to instantiate an element for that uri (gst_element_make_from_uri()
++ returns NULL).
++
++ Playbin will post a "missing-plugin" element message with the type set to
++ "urisource", detail set to "mms". Optionally the friendly name can be filled
++ in as well.
++
++ - missing typefind function
++
++ We don't recognize the type of the file, this should normally not happen
++ because all the typefinders are in the basic GStreamer installation.
++ There is not much useful information we can give about how to resolve this
++ issue. It is possible to use the first N bytes of the data to determine the
++ type (and needed plugin) on the server. We don't explore this option in this
++ document yet, but the proposal is flexible enough to accomodate this in the
++ future should the need arise.
++
++ - missing demuxer
++
++ Typically after running typefind on the data we determine the type of the
++ file. If there is no plugin found for the type, a "missing-plugin" element
++ message is posted by decodebin with the following fields: Type set to
++ "decoder", detail set to the caps for witch no plugin was found. Optionally
++ the friendly name can be filled in as well.
++
++ - missing decoder
++
++ The demuxer will dynamically create new pads with specific caps while it
++ figures out the contents of the container format. Decodebin tries to find the
++ decoders for these formats in the registry. If there is no decoder found, a
++ "missing-plugin" element message is posted by decodebin with the following
++ fields: Type set to "decoder", detail set to the caps for which no plugin
++ was found. Optionally the friendly name can be filled in as well. There is
++ no distinction made between the missing demuxer and decoder at the
++ application level.
++
++ - missing element
++
++ Decodebin and playbin will create a set of helper elements when they set up
++ their decoding pipeline. These elements are typically colorspace, sample rate,
++ audio sinks,... Their presence on the system is required for the functionality
++ of decodebin. It is typically a package dependency error if they are not
++ present but in case of a corrupted system the following "missing-plugin"
++ element message will be emitted: type set to "element", detail set to the
++ element factory name and the friendly name optionally set to a description
++ of the element's functionality in the decoding pipeline.
++
++ Except for reporting the missing plugins, no further policy is enforced at the
++ GStreamer level. It is up to the application to decide whether a missing
++ plugin constitutes a problem or not.
++
++
++2) application level
++
++ The application's job is to listen for the "missing-plugin" element messages
++ and to decide on a policy to handle them. Following cases exist:
++
++ - partially missing plugins
++
++ The application will be able to complete a state change to PAUSED but there
++ will be a "missing-plugin" element message on the GstBus.
++
++ This means that it will be possible to play back part of the media file but not
++ all of it.
++
++ For example: suppose we have an .avi file with mp3 audio and divx video. If we
++ have the mp3 audio decoder but not the divx video decoder, it will be possible
++ to play only the audio part but not the video part. For an audio playback
++ application, this is not a problem but a video player might want to decide on:
++
++ - require the use to install the additionally required plugins.
++ - inform the user that only the audio will be played back
++ - ask the user if it should download the additional codec or only play the
++ audio part.
++ - ...
++
++ - completely unplayable stream
++
++ The application will receive an ERROR message from GStreamer informing it that
++ playback stopped (before it could reach PAUSED). This happens because none of
++ the streams is connected to a decoder. The error code and domain should be one
++ of the following in this case:
++ - GST_CORE_ERROR_MISSING_PLUGIN (domain: GST_CORE_ERROR)
++ - GST_STREAM_ERROR_CODEC_NOT_FOUND (domain: GST_STREAM_ERROR)
++
++ The application can then see that there are a set of "missing-plugin" element
++ messages on the GstBus and can decide to trigger the download procedure. It
++ does that as described in the following section.
++
++ "missing-plugin" element messages can be identified using the function
++ gst_is_missing_plugin_message().
++
++
++3) Plugin download stage
++
++ At this point the application has
++ - collected one or more "missing-plugin" element messages
++ - made a decision that additional plugins should be installed
++
++ It will call a GStreamer utility function to convert each "missing-plugin"
++ message into an identifier string describing the missing capability. This is
++ done using the function gst_missing_plugin_message_get_installer_detail().
++
++ The application will then pass these strings to gst_install_plugins_async()
++ or gst_install_plugins_sync() to initiate the download. See the API
++ documentation there (libgstbaseutils, part of gst-plugins-base) for more
++ details.
++
++ When new plugins have been installed, the application will have to initiate
++ a re-scan of the GStreamer plugin registry using gst_update_registry().
++
++
++4) Format of the (UTF-8) string ID passed to the external installer system
++
++ The string is made up of several fields, separated by '|' characters.
++ The fields are:
++
++ - plugin system identifier, ie. "gstreamer"
++ This identifier determines the format of the rest of the detail string.
++ Automatic plugin installers should not process detail strings with
++ unknown identifiers. This allows other plugin-based libraries to use
++ the same mechanism for their automatic plugin installation needs, or
++ for the format to be changed should it turn out to be insufficient.
++
++ - plugin system version, e.g. "0.10"
++ This is required so that when there is a GStreamer-0.12 or GStreamer-1.0
++ at somem point in future, the different major versions can still co-exist
++ and use the same plugin install mechanism in the same way.
++
++ - application identifier, e.g. "totem"
++ This may also be in the form of "pid/12345" if the program name can't
++ be obtained for some reason.
++
++ - human-readable localised description of the required component,
++ e.g. "Vorbis audio decoder"
++
++ - identifier string for the required component, e.g.
++
++ - urisource-$(PROTOCOL_REQUIRED)
++ e.g. urisource-http or urisource-mms
++
++ - element-$(ELEMENT_REQUIRED),
++ e.g. element-ffmpegcolorspace
++
++ - decoder-$(CAPS_REQUIRED)
++ e.g. decoder-audio/x-vorbis or
++ decoder-application/ogg or
++ decoder-audio/mpeg, mpegversion=(int)4 or
++ decoder-video/mpeg, systemstream=(boolean)true, mpegversion=(int)2
++
++ - encoder-$(CAPS_REQUIRED)
++ e.g. encoder-audio/x-vorbis
++
++ - optional further fields not yet specified
++
++
++ An entire ID string might then look like this, for example:
++
++ gstreamer|0.10|totem|Vorbis audio decoder|decoder-audio/x-vorbis
++
++ Plugin installers parsing this ID string should expect further fields also
++ separated by '|' symbols and either ignore them, warn the user, or error
++ out when encountering them.
++
++ The human-readable description string is provided by the libgstbaseutils
++ library that can be found in gst-plugins-base versions >= 0.10.12 and can
++ also be used by demuxers to find out the codec names for taglists from given
++ caps in a unified and consistent way.
++
++ Applications can create these detail strings using the function
++ gst_missing_plugin_message_get_installer_detail() on a given missing-plugin
++ message.
++
++
++5) Using missing-plugin messages for error reporting:
++
++ Missing-plugin messages are also useful for error reporting purposes, either
++ in the case where the application does not support libgimme-codec, or the
++ external installer is not available or not able to install the required
++ plugins.
++
++ When creating error messages, applications may use the function
++ gst_missing_plugin_message_get_description() to obtain a possibly translated
++ description from each missing-plugin message (e.g. "Matroska demuxer" or
++ "Theora video depayloader"). This can be used to report to the user exactly
++ what it is that is missing.
++
++
++6) Notes for packagers
++
++ - An easy way to introspect plugin .so files is:
++
++ $ gst-inspect --print-plugin-auto-install-info /path/to/libgstfoo.so
++
++ The output will be something like:
++
++ decoder-audio/x-vorbis
++ element-vorbisdec
++ element-vorbisenc
++ element-vorbisparse
++ element-vorbistag
++ encoder-audio/x-vorbis
++
++ BUT could also be like this (from the faad element in this case):
++
++ decoder-audio/mpeg, mpegversion=(int){ 2, 4 }
++
++ NOTE that this does not exactly match the caps string that the installer
++ will get from the application. The application will always ever ask for
++ one of
++
++ decoder-audio/mpeg, mpegversion=(int)2
++ decoder-audio/mpeg, mpegversion=(int)4
++
++
++ - when introspecting, keep in mind that there are GStreamer plugins that
++ in turn load external plugins. Examples of these are pitfdll, ladspa, or
++ the GStreamer libvisual plugin. Those plugins will only announce elements
++ for the currently installed external plugins at the time of introspection!
++ With the exception of pitfdll, this is not really relevant to the playback
++ case, but may become an issue in future when applications like buzztard,
++ jokosher or pitivi start requestion elements by name, for example ladspa
++ effect elements or so.
++
++ This case could be handled if those wrapper plugins would also provide a
++ gst-install-xxx-plugins-helper, where xxx={ladspa|visual|...}. Thus if the
++ distro specific gst-install-plugins-helper can't resolve a request for e.g.
++ element-bml-sonicverb it can forward the request to
++ gst-install-bml-plugins-helper (bml is the buzz machine loader).
++
++
++7) Further references:
++
++http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gstreamer-base-utils.html
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/design/part-stream-status.txt gstreamer-0.10.23/docs/design/part-stream-status.txt
+--- gstreamer-0.10.23.orig/docs/design/part-stream-status.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/design/part-stream-status.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,109 @@
++Stream Status
++-------------
++
++This document describes the design and use cases for the stream status
++messages.
++
++STREAM_STATUS messages are posted on the bus when the state of a streaming
++thread changes. The purpose of this message is to allow the application to
++interact with the streaming thread properties, such as the thread priority or
++the threadpool to use.
++
++We accomodate for the following requirements:
++
++ - Application is informed when a streaming thread is about to be created. It
++ should be possible for the application to suggest a custom GstTask.
++ - Application is informed when the status of a streaming thread is changed.
++ This can be interesting for GUI application that want to visualize the status
++ of the streaming threads (playing/paused/stopped)
++ - Application is informed when a streaming thread is destroyed.
++
++We allow for the following scenarios:
++
++ - Elements require a specific (internal) streaming thread to operate or the
++ application can create/specify a thread for the element.
++ - Elements allow the application to configure a priority on the threads.
++
++
++Use cases
++---------
++
++ * boost the priority of the udp receiver streaming thread
++
++ .--------. .-------. .------. .-------.
++ | udpsrc | | depay | | adec | | asink |
++ | src->sink src->sink src->sink |
++ '--------' '-------' '------' '-------'
++
++ - when going from READY to PAUSED state, udpsrc will require a streaming
++ thread for pushing data into the depayloader. It will post a STREAM_STATUS
++ message indicating its requirement for a streaming thread.
++
++ - The application will usually react to the STREAM_STATUS messages with a sync
++ bus handler.
++
++ - The application can create and configure a custom GstTask to manage the
++ streaming thread or it can ignore the message which will make the element
++ use its default GstTask.
++
++ - The application can react to the ENTER/LEAVE stream status message to
++ configure the thread right before it is started/stopped. This can be used to
++ configure the thread priority.
++
++ - Before the GstTask is changed state (start/pause/stop) a STREAM_STATUS
++ message is posted that can be used by the application to keep track of
++ the running streaming threads.
++
++
++Messages
++--------
++
++ The existing STREAM_STATUS message will be further defined and implemented in
++ (selected) elements. The following fields will be contained in the message:
++
++ - "type", GST_TYPE_STREAM_STATUS_TYPE
++
++ - a set of types to control the lifecycle of the thread:
++ GST_STREAM_STATUS_TYPE_CREATE: a new streaming thread is going to be
++ created. The application has the chance to configure a custom thread.
++ GST_STREAM_STATUS_TYPE_ENTER: the streaming thread is about to enter its
++ loop function for the first time.
++ GST_STREAM_STATUS_TYPE_LEAVE: the streaming thread is about to leave its
++ loop.
++ GST_STREAM_STATUS_TYPE_DESTROY: a streaming thread is destroyed
++
++ - A set of types to control the state of the threads:
++ GST_STREAM_STATUS_TYPE_START: a streaming thread is started
++ GST_STREAM_STATUS_TYPE_PAUSE: a streaming thread is paused
++ GST_STREAM_STATUS_TYPE_STOP: a streaming thread is stopped
++
++ - "owner", GST_TYPE_ELEMENT
++ The owner element of the thread. The message source will contain the pad
++ (or one of the pads) that will produce data by this thread. If this thread
++ does not produce data on a pad, the message source will contain the owner
++ as well. The idea is that the application should be able to see from the
++ element/pad what function this thread has in the context of the
++ application and configure the thread appropriatly.
++
++ - "object", G_TYPE, GstTask/GThread
++ A GstTask/GThread controlling this streaming thread. This can be NULL when
++ the object controlling the streaming thread is not yet created.
++
++ - "flow-return", GstFlowReturn
++ A status code for why the thread state changed. when threads are created
++ and started, this is usually GST_FLOW_OK but when they are stopping it
++ contains the reason code why it stopped.
++
++ - "reason", G_TYPE_STRING
++ A string describing the reason why the thread started/stopped/paused.
++ Can be NULL if no reason is given.
++
++
++
++Events
++------
++
++
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/design/part-TODO.txt gstreamer-0.10.23/docs/design/part-TODO.txt
+--- gstreamer-0.10.23.orig/docs/design/part-TODO.txt 2009-01-21 11:11:03.000000000 +0100
++++ gstreamer-0.10.23/docs/design/part-TODO.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -36,13 +36,6 @@
+ incrementaly when needed. We can do this with a gst_pad_iterate_caps() call.
+ We also need to incrementally return intersections etc, for this.
+
+-- When an element goes to PAUSED there is no way to figure out the running time
+- when this happened. One could think that we can store this time in the
+- base_time field of the element but that causes problems when the element is
+- still using the base_time before really PAUSING. We seem to need a new element
+- field for this. The running time when an element is paused can be usefull to
+- clip late buffers instead of prerolling on them.
+-
+ - Elements in a bin have no clue about the final state of the parent element
+ since the bin sets the target state on its children in small steps. This
+ causes problems for elements that like to know the final state (rtspsrc going
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/design/part-trickmodes.txt gstreamer-0.10.23/docs/design/part-trickmodes.txt
+--- gstreamer-0.10.23.orig/docs/design/part-trickmodes.txt 2009-01-21 11:11:03.000000000 +0100
++++ gstreamer-0.10.23/docs/design/part-trickmodes.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -44,6 +44,7 @@
+ - how accurate the seek should be (ACCURATE)
+ - how to perform the seek (FLUSH)
+ - what to do when the stop position is reached (SEGMENT).
++ - extra playback options (SKIP)
+ - a format to seek in, this can be time, bytes, units (frames, samples), ...
+ - a playback rate, 1.0 is normal playback speed, positive values bigger than 1.0
+ mean fast playback. negative values mean reverse playback. A playback speed of
+@@ -135,7 +136,8 @@
+ The seek happens as stated above. a NEW_SEGMENT event is sent downstream with a rate
+ different from 1.0. Plugins receiving the NEW_SEGMENT can decide to perform the
+ rate conversion of the media data (retimestamp video frames, resample audio, ...).
+-A plugin can also decide to drop frames in the case of fast playback or use a more
++A plugin should not drop frames unless the SKIP flag is set. When the SKIP flag is
++set, a plugin can decide to drop frames in the case of fast playback or use a more
+ efficient decoding algorithm (skip B frames, ...). If a plugin decides to resample
+ or retimestamp, it should modify the NEW_SEGMENT with a rate of 1.0 and update the
+ applied rate so that downstream elements don't resample again but are aware that the
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/gst/gstreamer-docs.sgml gstreamer-0.10.23/docs/gst/gstreamer-docs.sgml
+--- gstreamer-0.10.23.orig/docs/gst/gstreamer-docs.sgml 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/docs/gst/gstreamer-docs.sgml 2009-06-11 14:19:59.000000000 +0200
+@@ -50,6 +50,7 @@
+ <xi:include href="xml/gst.xml" />
+ <xi:include href="xml/gstbin.xml" />
+ <xi:include href="xml/gstbuffer.xml" />
++ <xi:include href="xml/gstbufferlist.xml" />
+ <xi:include href="xml/gstbus.xml" />
+ <xi:include href="xml/gstcaps.xml" />
+ <xi:include href="xml/gstchildproxy.xml" />
+@@ -86,6 +87,7 @@
+ <xi:include href="xml/gsttaglist.xml" />
+ <xi:include href="xml/gsttagsetter.xml" />
+ <xi:include href="xml/gsttask.xml" />
++ <xi:include href="xml/gsttaskpool.xml" />
+ <xi:include href="xml/gsttypefind.xml" />
+ <xi:include href="xml/gsttypefindfactory.xml" />
+ <xi:include href="xml/gsturihandler.xml" />
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/gst/gstreamer-sections.txt gstreamer-0.10.23/docs/gst/gstreamer-sections.txt
+--- gstreamer-0.10.23.orig/docs/gst/gstreamer-sections.txt 2009-05-10 23:30:44.000000000 +0200
++++ gstreamer-0.10.23/docs/gst/gstreamer-sections.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -134,6 +134,7 @@
+ GstBusPrivate
+ </SECTION>
+
++
+ <SECTION>
+ <FILE>gstbuffer</FILE>
+ <TITLE>GstBuffer</TITLE>
+@@ -208,6 +209,45 @@
+ gst_buffer_copy_flags_get_type
+ </SECTION>
+
++<SECTION>
++<FILE>gstbufferlist</FILE>
++<TITLE>GstBufferList</TITLE>
++GstBufferList
++GstBufferListIterator
++GstBufferListDoFunction
++GstBufferListDoDataFunction
++gst_buffer_list_new
++gst_buffer_list_ref
++gst_buffer_list_unref
++gst_buffer_list_copy
++gst_buffer_list_is_writable
++gst_buffer_list_make_writable
++gst_buffer_list_n_groups
++gst_buffer_list_iterate
++gst_buffer_list_iterator_free
++gst_buffer_list_iterator_n_buffers
++gst_buffer_list_iterator_add
++gst_buffer_list_iterator_add_group
++gst_buffer_list_iterator_next
++gst_buffer_list_iterator_next_group
++gst_buffer_list_iterator_remove
++gst_buffer_list_iterator_steal
++gst_buffer_list_iterator_take
++gst_buffer_list_iterator_do
++gst_buffer_list_iterator_do_data
++gst_buffer_list_iterator_merge_group
++<SUBSECTION Standard>
++GstBufferListClass
++GST_BUFFER_LIST
++GST_BUFFER_LIST_CLASS
++GST_BUFFER_LIST_GET_CLASS
++GST_IS_BUFFER_LIST
++GST_IS_BUFFER_LIST_CLASS
++GST_TYPE_BUFFER_LIST
++GST_BUFFER_LIST_CAST
++<SUBSECTION Private>
++gst_buffer_list_get_type
++</SECTION>
+
+ <SECTION>
+ <FILE>gstcaps</FILE>
+@@ -374,6 +414,7 @@
+ GST_TYPE_CLOCK_RETURN
+ GST_TYPE_CLOCK_TIME
+ <SUBSECTION Private>
++GstClockPrivate
+ GST_CLOCK_SLAVE_LOCK
+ GST_CLOCK_SLAVE_UNLOCK
+ gst_clock_get_type
+@@ -441,6 +482,7 @@
+ GST_ELEMENT_BUS
+ GST_ELEMENT_CLOCK
+ GST_ELEMENT_PADS
++GST_ELEMENT_START_TIME
+ GST_ELEMENT_ERROR
+ GST_ELEMENT_WARNING
+ GST_ELEMENT_INFO
+@@ -482,6 +524,8 @@
+ <SUBSECTION element-properties>
+ gst_element_set_base_time
+ gst_element_get_base_time
++gst_element_set_start_time
++gst_element_get_start_time
+ gst_element_set_bus
+ gst_element_get_bus
+ gst_element_get_factory
+@@ -508,6 +552,7 @@
+ gst_element_abort_state
+ gst_element_continue_state
+ gst_element_lost_state
++gst_element_lost_state_full
+ gst_element_state_get_name
+ gst_element_state_change_return_get_name
+ gst_element_sync_state_with_parent
+@@ -698,6 +743,9 @@
+
+ gst_event_new_latency
+ gst_event_parse_latency
++
++gst_event_new_step
++gst_event_parse_step
+ <SUBSECTION Standard>
+ GstEventClass
+ GST_EVENT
+@@ -1043,8 +1091,8 @@
+ <TITLE>GstMessage</TITLE>
+ GstMessage
+ GstMessageType
+-GstStructureChangeType
+ GST_MESSAGE_SRC
++GST_MESSAGE_SRC_NAME
+ GST_MESSAGE_TIMESTAMP
+ GST_MESSAGE_TYPE
+ GST_MESSAGE_TYPE_NAME
+@@ -1067,7 +1115,9 @@
+ gst_message_new_info
+ gst_message_parse_info
+ gst_message_new_tag
++gst_message_new_tag_full
+ gst_message_parse_tag
++gst_message_parse_tag_full
+ gst_message_new_buffering
+ gst_message_parse_buffering
+ gst_message_set_buffering_stats
+@@ -1075,6 +1125,8 @@
+ gst_message_new_state_changed
+ gst_message_parse_state_changed
+ gst_message_new_state_dirty
++gst_message_new_step_done
++gst_message_parse_step_done
+ gst_message_new_clock_provide
+ gst_message_parse_clock_provide
+ gst_message_new_clock_lost
+@@ -1094,10 +1146,19 @@
+ gst_message_new_async_start
+ gst_message_parse_async_start
+ gst_message_new_async_done
++
++GstStructureChangeType
+ gst_message_new_structure_change
+ gst_message_parse_structure_change
+ gst_message_new_request_state
+ gst_message_parse_request_state
++
++GstStreamStatusType
++gst_message_new_stream_status
++gst_message_parse_stream_status
++gst_message_set_stream_status_object
++gst_message_get_stream_status_object
++
+ <SUBSECTION Standard>
+ GstMessageClass
+ GST_MESSAGE
+@@ -1109,10 +1170,12 @@
+ GST_MESSAGE_GET_CLASS
+ GST_TYPE_MESSAGE_TYPE
+ GST_TYPE_STRUCTURE_CHANGE_TYPE
++GST_TYPE_STREAM_STATUS_TYPE
+ <SUBSECTION Private>
+ gst_message_get_type
+ gst_message_type_get_type
+ gst_structure_change_type_get_type
++gst_stream_status_type_get_type
+ GST_MESSAGE_COND
+ GST_MESSAGE_GET_LOCK
+ GST_MESSAGE_LOCK
+@@ -1214,6 +1277,7 @@
+ gst_object_restore_thyself
+ gst_object_ref
+ gst_object_unref
++gst_object_ref_sink
+ gst_object_sink
+ gst_object_replace
+ gst_object_get_path_string
+@@ -1304,6 +1368,9 @@
+ gst_pad_set_chain_function
+ GstPadChainFunction
+
++gst_pad_set_chain_list_function
++GstPadChainListFunction
++
+ gst_pad_set_checkgetrange_function
+ GstPadCheckGetRangeFunction
+
+@@ -1348,6 +1415,7 @@
+
+ gst_pad_push
+ gst_pad_push_event
++gst_pad_push_list
+ gst_pad_check_pull_range
+ gst_pad_pull_range
+ gst_pad_activate_pull
+@@ -1391,6 +1459,7 @@
+
+ <SUBSECTION Core>
+ gst_pad_chain
++gst_pad_chain_list
+
+ gst_pad_start_task
+ gst_pad_pause_task
+@@ -1412,6 +1481,7 @@
+
+ <SUBSECTION Standard>
+ GstPadClass
++GstPadPrivate
+ GST_PAD
+ GST_IS_PAD
+ GST_PAD_CLASS
+@@ -1632,6 +1702,7 @@
+ GstPlugin
+ GstPluginDesc
+ GstPluginInitFunc
++GstPluginInitFullFunc
+ GST_PLUGIN_DEFINE
+ GST_PLUGIN_DEFINE_STATIC
+ GST_LICENSE_UNKNOWN
+@@ -1646,12 +1717,15 @@
+ gst_plugin_get_version
+ gst_plugin_get_module
+ gst_plugin_is_loaded
++gst_plugin_get_cache_data
++gst_plugin_set_cache_data
+ gst_plugin_name_filter
+ gst_plugin_load_file
+ gst_plugin_load
+ gst_plugin_load_by_name
+ gst_plugin_list_free
+ gst_plugin_register_static
++gst_plugin_register_static_full
+ <SUBSECTION>
+ GstPluginDependencyFlags
+ gst_plugin_add_dependency
+@@ -1912,6 +1986,8 @@
+ gst_segment_set_seek
+ gst_segment_to_running_time
+ gst_segment_to_stream_time
++gst_segment_to_position
++gst_segment_set_running_time
+ <SUBSECTION Standard>
+ GST_TYPE_SEGMENT
+ gst_segment_get_type
+@@ -1929,14 +2005,19 @@
+ gst_structure_id_empty_new
+ gst_structure_new
+ gst_structure_new_valist
++gst_structure_id_new
+ gst_structure_copy
+ gst_structure_free
+ gst_structure_get_name
+ gst_structure_has_name
+ gst_structure_set_name
+ gst_structure_get_name_id
++gst_structure_id_get
++gst_structure_id_get_valist
+ gst_structure_id_get_value
+ gst_structure_id_set_value
++gst_structure_get
++gst_structure_get_valist
+ gst_structure_get_value
+ gst_structure_set_value
+ gst_structure_set
+@@ -2041,6 +2122,7 @@
+ GST_TAG_VIDEO_CODEC
+ GST_TAG_AUDIO_CODEC
+ GST_TAG_SUBTITLE_CODEC
++GST_TAG_CONTAINER_FORMAT
+ GST_TAG_BITRATE
+ GST_TAG_NOMINAL_BITRATE
+ GST_TAG_MINIMUM_BITRATE
+@@ -2082,6 +2164,7 @@
+ gst_tag_list_free
+ gst_tag_list_get_tag_size
+ gst_tag_list_add
++gst_tag_list_add_value
+ gst_tag_list_add_values
+ gst_tag_list_add_valist
+ gst_tag_list_add_valist_values
+@@ -2142,6 +2225,7 @@
+ gst_tag_setter_reset_tags
+ gst_tag_setter_merge_tags
+ gst_tag_setter_add_tags
++gst_tag_setter_add_tag_value
+ gst_tag_setter_add_tag_values
+ gst_tag_setter_add_tag_valist
+ gst_tag_setter_add_tag_valist_values
+@@ -2157,6 +2241,29 @@
+ gst_tag_setter_get_type
+ </SECTION>
+
++<SECTION>
++<FILE>gsttaskpool</FILE>
++<TITLE>GstTaskPool</TITLE>
++GstTaskPool
++GstTaskPoolClass
++GstTaskPoolFunction
++gst_task_pool_new
++gst_task_pool_prepare
++gst_task_pool_push
++gst_task_pool_join
++gst_task_pool_cleanup
++<SUBSECTION Standard>
++GST_IS_TASK_POOL
++GST_IS_TASK_POOL_CLASS
++GST_TASK_POOL
++GST_TASK_POOL_CAST
++GST_TASK_POOL_CLASS
++GST_TASK_POOL_GET_CLASS
++GST_TYPE_TASK_POOL
++<SUBSECTION Private>
++gst_task_pool_get_type
++</SECTION>
++
+
+ <SECTION>
+ <FILE>gsttask</FILE>
+@@ -2172,17 +2279,28 @@
+ GST_TASK_STATE
+ GST_TASK_WAIT
+
+-gst_task_cleanup_all
+ gst_task_create
++gst_task_set_lock
++gst_task_set_priority
++
++gst_task_set_pool
++gst_task_get_pool
++
++GstTaskThreadCallbacks
++gst_task_set_thread_callbacks
++
+ gst_task_get_state
+-gst_task_join
++gst_task_set_state
+ gst_task_pause
+-gst_task_set_lock
+ gst_task_start
+ gst_task_stop
++gst_task_join
++
++gst_task_cleanup_all
+
+ <SUBSECTION Standard>
+ GstTaskClass
++GstTaskPrivate
+ GST_TASK
+ GST_IS_TASK
+ GST_TYPE_TASK
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/images/gdp-header.svg gstreamer-0.10.23/docs/images/gdp-header.svg
+--- gstreamer-0.10.23.orig/docs/images/gdp-header.svg 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/images/gdp-header.svg 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,906 @@
++<?xml version="1.0" encoding="UTF-8" standalone="no"?>
++<!-- Created with Inkscape (http://www.inkscape.org/) -->
++<svg
++ xmlns:dc="http://purl.org/dc/elements/1.1/"
++ xmlns:cc="http://web.resource.org/cc/"
++ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
++ xmlns:svg="http://www.w3.org/2000/svg"
++ xmlns="http://www.w3.org/2000/svg"
++ xmlns:xlink="http://www.w3.org/1999/xlink"
++ xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
++ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
++ width="640px"
++ height="480px"
++ id="svg1307"
++ sodipodi:version="0.32"
++ inkscape:version="0.43"
++ sodipodi:docbase="/home/thomas"
++ sodipodi:docname="gdp.svg">
++ <defs
++ id="defs1309" />
++ <sodipodi:namedview
++ id="base"
++ pagecolor="#ffffff"
++ bordercolor="#666666"
++ borderopacity="1.0"
++ inkscape:pageopacity="0.0"
++ inkscape:pageshadow="2"
++ inkscape:zoom="1"
++ inkscape:cx="262.80469"
++ inkscape:cy="202.78641"
++ inkscape:current-layer="layer1"
++ inkscape:document-units="px"
++ showgrid="true"
++ showguides="false"
++ inkscape:grid-points="true"
++ fill="#eeeeec"
++ inkscape:window-width="1024"
++ inkscape:window-height="697"
++ inkscape:window-x="0"
++ inkscape:window-y="25" />
++ <metadata
++ id="metadata1312">
++ <rdf:RDF>
++ <cc:Work
++ rdf:about="">
++ <dc:format>image/svg+xml</dc:format>
++ <dc:type
++ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
++ </cc:Work>
++ </rdf:RDF>
++ </metadata>
++ <g
++ id="layer1"
++ inkscape:label="Layer 1"
++ inkscape:groupmode="layer">
++ <g
++ id="g4859">
++ <rect
++ ry="2.1094244e-15"
++ rx="2.1094246e-15"
++ y="1"
++ x="1"
++ height="58.000019"
++ width="158"
++ id="rect3104"
++ style="opacity:1;color:#000000;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <rect
++ ry="2.1094244e-15"
++ rx="2.1094246e-15"
++ y="0"
++ x="10"
++ height="20"
++ width="80"
++ id="rect3979"
++ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <text
++ sodipodi:linespacing="100%"
++ id="text4855"
++ y="14.473633"
++ x="8.8222656"
++ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"><tspan
++ y="14.473633"
++ x="8.8222656"
++ id="tspan4857"
++ sodipodi:role="line">Version</tspan></text>
++ </g>
++ <g
++ id="g4865"
++ transform="translate(160,0)">
++ <rect
++ style="opacity:1;color:#000000;fill:#edd400;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.00000048;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect4867"
++ width="78.000015"
++ height="58.000019"
++ x="1"
++ y="1"
++ rx="2.109425e-15"
++ ry="2.1094244e-15" />
++ <rect
++ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect4869"
++ width="80"
++ height="20"
++ x="10"
++ y="0"
++ rx="2.1094246e-15"
++ ry="2.1094244e-15" />
++ <text
++ xml:space="preserve"
++ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="8.8222656"
++ y="14.473633"
++ id="text4871"
++ sodipodi:linespacing="100%"><tspan
++ sodipodi:role="line"
++ id="tspan4873"
++ x="8.8222656"
++ y="14.473633">Flags</tspan></text>
++ </g>
++ <g
++ transform="translate(240,0)"
++ id="g4885">
++ <rect
++ ry="2.1094244e-15"
++ rx="2.109425e-15"
++ y="1"
++ x="1"
++ height="58.000019"
++ width="78.000015"
++ id="rect4887"
++ style="opacity:1;color:#000000;fill:#888a85;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.00000048;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <rect
++ ry="2.1094244e-15"
++ rx="2.1094246e-15"
++ y="0"
++ x="10"
++ height="20"
++ width="80"
++ id="rect4889"
++ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ </g>
++ <g
++ id="g4905"
++ transform="translate(320,0)">
++ <rect
++ style="opacity:1;color:#000000;fill:#c4a000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect4907"
++ width="158"
++ height="58.000019"
++ x="1"
++ y="1"
++ rx="2.1094246e-15"
++ ry="2.1094244e-15" />
++ <rect
++ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect4909"
++ width="80"
++ height="20"
++ x="10"
++ y="0"
++ rx="2.1094246e-15"
++ ry="2.1094244e-15" />
++ <text
++ xml:space="preserve"
++ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="8.8222656"
++ y="14.473633"
++ id="text4911"
++ sodipodi:linespacing="100%"><tspan
++ sodipodi:role="line"
++ id="tspan4913"
++ x="8.8222656"
++ y="14.473633">Payload type</tspan></text>
++ </g>
++ <g
++ id="g4915"
++ transform="translate(480,0)">
++ <rect
++ style="opacity:1;color:#000000;fill:#cee14b;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect4917"
++ width="158"
++ height="58.000019"
++ x="1"
++ y="1"
++ rx="2.1094246e-15"
++ ry="2.1094244e-15" />
++ <rect
++ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect4919"
++ width="80"
++ height="20"
++ x="10"
++ y="0"
++ rx="2.1094246e-15"
++ ry="2.1094244e-15" />
++ <text
++ xml:space="preserve"
++ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="8.8222656"
++ y="14.473633"
++ id="text4921"
++ sodipodi:linespacing="100%"><tspan
++ sodipodi:role="line"
++ id="tspan4923"
++ x="8.8222656"
++ y="14.473633">Payload length</tspan></text>
++ <rect
++ ry="2.1094244e-15"
++ rx="2.1094246e-15"
++ y="421"
++ x="1"
++ height="58.000019"
++ width="158"
++ id="rect5196"
++ style="opacity:1;color:#000000;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ </g>
++ <g
++ id="g4942"
++ transform="translate(0,60)">
++ <rect
++ ry="2.1094244e-15"
++ rx="2.1094246e-15"
++ y="1"
++ x="1"
++ height="58.000019"
++ width="158"
++ id="rect4944"
++ style="opacity:1;color:#000000;fill:#cee14b;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <rect
++ ry="2.1094244e-15"
++ rx="2.1094246e-15"
++ y="0"
++ x="10"
++ height="20"
++ width="80"
++ id="rect4946"
++ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ </g>
++ <g
++ transform="translate(160,60)"
++ id="g4952">
++ <rect
++ style="opacity:1;color:#000000;fill:#9db029;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.00000048;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect4954"
++ width="478.00006"
++ height="58.000019"
++ x="1"
++ y="1"
++ rx="2.1094246e-15"
++ ry="2.1094244e-15" />
++ <rect
++ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect4956"
++ width="80"
++ height="20"
++ x="10"
++ y="0"
++ rx="2.1094246e-15"
++ ry="2.1094244e-15" />
++ <text
++ xml:space="preserve"
++ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="8.8222656"
++ y="14.473633"
++ id="text4958"
++ sodipodi:linespacing="100%"><tspan
++ sodipodi:role="line"
++ id="tspan4960"
++ x="8.8222656"
++ y="14.473633">Timestamp</tspan></text>
++ </g>
++ <g
++ transform="translate(160,120)"
++ id="g4962">
++ <rect
++ ry="2.1094244e-15"
++ rx="2.1094244e-15"
++ y="1"
++ x="1"
++ height="58.000019"
++ width="477.99994"
++ id="rect4964"
++ style="opacity:1;color:#000000;fill:#fcaf3e;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <rect
++ ry="2.1094244e-15"
++ rx="2.1094246e-15"
++ y="0"
++ x="10"
++ height="20"
++ width="80"
++ id="rect4966"
++ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <text
++ sodipodi:linespacing="100%"
++ id="text4968"
++ y="14.473633"
++ x="8.8222656"
++ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"><tspan
++ y="14.473633"
++ x="8.8222656"
++ id="tspan4970"
++ sodipodi:role="line">Duration</tspan></text>
++ </g>
++ <g
++ id="g4972"
++ transform="translate(0,180)">
++ <rect
++ style="opacity:1;color:#000000;fill:#fcaf3e;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect4974"
++ width="158"
++ height="58.000019"
++ x="1"
++ y="1"
++ rx="2.1094246e-15"
++ ry="2.1094244e-15" />
++ <rect
++ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect4976"
++ width="80"
++ height="20"
++ x="10"
++ y="0"
++ rx="2.1094246e-15"
++ ry="2.1094244e-15" />
++ </g>
++ <g
++ id="g4982"
++ transform="translate(160,180)">
++ <rect
++ ry="2.1094244e-15"
++ rx="2.1094246e-15"
++ y="1"
++ x="1"
++ height="58.000019"
++ width="478.00006"
++ id="rect4984"
++ style="opacity:1;color:#000000;fill:#f57900;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.00000048;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <rect
++ ry="2.1094244e-15"
++ rx="2.1094246e-15"
++ y="0"
++ x="10"
++ height="20"
++ width="80"
++ id="rect4986"
++ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <text
++ sodipodi:linespacing="100%"
++ id="text4988"
++ y="14.473633"
++ x="8.8222656"
++ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"><tspan
++ y="14.473633"
++ x="8.8222656"
++ id="tspan4990"
++ sodipodi:role="line">Offset</tspan></text>
++ </g>
++ <g
++ id="g4992"
++ transform="translate(160,240)">
++ <rect
++ style="opacity:1;color:#000000;fill:#ce5c00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect4994"
++ width="477.99994"
++ height="58.000019"
++ x="1"
++ y="1"
++ rx="2.1094244e-15"
++ ry="2.1094244e-15" />
++ <rect
++ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect4996"
++ width="80"
++ height="20"
++ x="10"
++ y="0"
++ rx="2.1094246e-15"
++ ry="2.1094244e-15" />
++ <text
++ xml:space="preserve"
++ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="8.8222656"
++ y="14.473633"
++ id="text4998"
++ sodipodi:linespacing="100%"><tspan
++ sodipodi:role="line"
++ id="tspan5000"
++ x="8.8222656"
++ y="14.473633">Offset end</tspan></text>
++ </g>
++ <g
++ id="g5002"
++ transform="matrix(0.333333,0,0,1,0,120)">
++ <rect
++ ry="2.1094244e-15"
++ rx="6.3282746e-15"
++ y="1"
++ x="1"
++ height="58.000019"
++ width="478.00006"
++ id="rect5004"
++ style="opacity:1;color:#000000;fill:#9db029;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3.46410275;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <rect
++ ry="2.1094244e-15"
++ rx="6.3282746e-15"
++ y="0"
++ x="10"
++ height="20"
++ width="80"
++ id="rect5006"
++ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ </g>
++ <g
++ transform="matrix(0.333333,0,0,1,0,240)"
++ id="g5012">
++ <rect
++ style="opacity:1;color:#000000;fill:#f57900;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3.46410275;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect5014"
++ width="478.00006"
++ height="58.000019"
++ x="1"
++ y="1"
++ rx="6.3282746e-15"
++ ry="2.1094244e-15" />
++ <rect
++ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect5016"
++ width="80"
++ height="20"
++ x="10"
++ y="0"
++ rx="6.3282746e-15"
++ ry="2.1094244e-15" />
++ </g>
++ <g
++ transform="matrix(0.333333,0,0,1,0,300)"
++ id="g5022">
++ <rect
++ ry="2.1094244e-15"
++ rx="6.3282725e-15"
++ y="1"
++ x="1"
++ height="58.000019"
++ width="477.99994"
++ id="rect5024"
++ style="opacity:1;color:#000000;fill:#ce5c00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3.46410179;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <rect
++ ry="2.1094244e-15"
++ rx="6.3282729e-15"
++ y="0"
++ x="10"
++ height="20"
++ width="80"
++ id="rect5026"
++ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ </g>
++ <g
++ transform="translate(160,300)"
++ id="g5032">
++ <rect
++ ry="2.1094244e-15"
++ rx="2.1094246e-15"
++ y="1"
++ x="1"
++ height="58.000019"
++ width="158"
++ id="rect5034"
++ style="opacity:1;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <rect
++ ry="2.1094244e-15"
++ rx="2.1094246e-15"
++ y="0"
++ x="10"
++ height="20"
++ width="80"
++ id="rect5036"
++ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <text
++ sodipodi:linespacing="100%"
++ id="text5038"
++ y="14.473633"
++ x="8.8222656"
++ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"><tspan
++ y="14.473633"
++ x="8.8222656"
++ id="tspan5040"
++ sodipodi:role="line">Buffer flags</tspan></text>
++ </g>
++ <g
++ id="g5048"
++ transform="translate(320,300)">
++ <rect
++ style="opacity:1;color:#000000;fill:#888a85;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect5050"
++ width="317.99997"
++ height="58.000019"
++ x="1"
++ y="1"
++ rx="2.1094244e-15"
++ ry="2.1094244e-15" />
++ <rect
++ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect5052"
++ width="80"
++ height="20"
++ x="10"
++ y="0"
++ rx="2.1094246e-15"
++ ry="2.1094244e-15" />
++ <text
++ xml:space="preserve"
++ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="8.8222656"
++ y="14.473633"
++ id="text5054"
++ sodipodi:linespacing="100%"><tspan
++ sodipodi:role="line"
++ id="tspan5056"
++ x="8.8222656"
++ y="14.473633">ABI</tspan></text>
++ </g>
++ <g
++ transform="translate(0,360)"
++ id="g5058">
++ <rect
++ ry="2.1094244e-15"
++ rx="2.109424e-15"
++ y="1"
++ x="1"
++ height="58.000019"
++ width="637.99982"
++ id="rect5060"
++ style="opacity:1;color:#000000;fill:#888a85;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <rect
++ ry="2.1094244e-15"
++ rx="2.1094246e-15"
++ y="0"
++ x="10"
++ height="20"
++ width="80"
++ id="rect5062"
++ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <text
++ sodipodi:linespacing="100%"
++ id="text5064"
++ y="14.473633"
++ x="8.8222656"
++ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"><tspan
++ y="14.473633"
++ x="8.8222656"
++ id="tspan5066"
++ sodipodi:role="line">ABI</tspan></text>
++ </g>
++ <g
++ transform="translate(0,420)"
++ id="g5068">
++ <rect
++ ry="2.1094244e-15"
++ rx="2.1094227e-15"
++ y="1"
++ x="1"
++ height="58.000019"
++ width="157.99988"
++ id="rect5070"
++ style="opacity:1;color:#000000;fill:#888a85;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.99999952;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <rect
++ ry="2.1094244e-15"
++ rx="2.1094246e-15"
++ y="0"
++ x="10"
++ height="20"
++ width="80"
++ id="rect5072"
++ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <text
++ sodipodi:linespacing="100%"
++ id="text5074"
++ y="14.473633"
++ x="8.8222656"
++ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"><tspan
++ y="14.473633"
++ x="8.8222656"
++ id="tspan5076"
++ sodipodi:role="line">ABI</tspan></text>
++ </g>
++ <g
++ id="g5080"
++ transform="translate(160,420)">
++ <rect
++ style="opacity:1;color:#000000;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect5082"
++ width="158"
++ height="58.000019"
++ x="1"
++ y="1"
++ rx="2.1094246e-15"
++ ry="2.1094244e-15" />
++ <rect
++ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect5084"
++ width="80"
++ height="20"
++ x="10"
++ y="0"
++ rx="2.1094246e-15"
++ ry="2.1094244e-15" />
++ <text
++ xml:space="preserve"
++ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="8.8222656"
++ y="14.473633"
++ id="text5086"
++ sodipodi:linespacing="100%"><tspan
++ sodipodi:role="line"
++ id="tspan5088"
++ x="8.8222656"
++ y="14.473633">CRC header</tspan></text>
++ </g>
++ <g
++ transform="translate(320,420)"
++ id="g5090">
++ <rect
++ ry="2.1094244e-15"
++ rx="2.1094246e-15"
++ y="1"
++ x="1"
++ height="58.000019"
++ width="158"
++ id="rect5092"
++ style="opacity:1;color:#000000;fill:#204a87;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <rect
++ ry="2.1094244e-15"
++ rx="2.1094246e-15"
++ y="0"
++ x="10"
++ height="20"
++ width="80"
++ id="rect5094"
++ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <text
++ sodipodi:linespacing="100%"
++ id="text5096"
++ y="14.473633"
++ x="8.8222656"
++ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"><tspan
++ y="14.473633"
++ x="8.8222656"
++ id="tspan5098"
++ sodipodi:role="line">CRC payload</tspan></text>
++ </g>
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 81,0.5 L 81,479.5"
++ id="path5104" />
++ <use
++ x="0"
++ y="0"
++ xlink:href="#path5104"
++ id="use5106"
++ transform="translate(-0.5,0)"
++ width="640"
++ height="480" />
++ <use
++ x="0"
++ y="0"
++ xlink:href="#use5106"
++ id="use5108"
++ transform="translate(80,0)"
++ width="640"
++ height="480" />
++ <use
++ x="0"
++ y="0"
++ xlink:href="#use5106"
++ id="use5112" />
++ <use
++ x="0"
++ y="0"
++ xlink:href="#use5112"
++ id="use5114"
++ transform="translate(400,0)"
++ width="640"
++ height="480" />
++ <use
++ x="0"
++ y="0"
++ xlink:href="#use5114"
++ id="use5116"
++ width="640"
++ height="480"
++ transform="translate(-80,0)" />
++ <use
++ x="0"
++ y="0"
++ xlink:href="#use5116"
++ id="use5118"
++ width="640"
++ height="480"
++ transform="translate(-80,0)" />
++ <use
++ x="0"
++ y="0"
++ xlink:href="#use5118"
++ id="use5120"
++ width="640"
++ height="480"
++ transform="translate(-80,0)" />
++ <use
++ id="use5126"
++ xlink:href="#use5106"
++ y="0"
++ x="0"
++ transform="matrix(1,0,0,0.87474,480,6.248e-2)"
++ width="640"
++ height="480" />
++ <g
++ id="g5145">
++ <path
++ id="path5128"
++ d="M 170.5,42.5 L 170.5,59.5"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
++ <use
++ transform="translate(10,0)"
++ height="480"
++ width="640"
++ id="use5130"
++ xlink:href="#path5128"
++ y="0"
++ x="0" />
++ <use
++ height="480"
++ width="640"
++ transform="translate(10,0)"
++ id="use5132"
++ xlink:href="#use5130"
++ y="0"
++ x="0" />
++ <use
++ height="480"
++ width="640"
++ transform="translate(10,0)"
++ id="use5134"
++ xlink:href="#use5132"
++ y="0"
++ x="0" />
++ <use
++ height="480"
++ width="640"
++ transform="translate(10,0)"
++ id="use5136"
++ xlink:href="#use5134"
++ y="0"
++ x="0" />
++ <use
++ height="480"
++ width="640"
++ transform="translate(10,0)"
++ id="use5138"
++ xlink:href="#use5136"
++ y="0"
++ x="0" />
++ <use
++ height="480"
++ width="640"
++ transform="translate(10,0)"
++ id="use5140"
++ xlink:href="#use5138"
++ y="0"
++ x="0" />
++ </g>
++ <g
++ id="g5154"
++ transform="translate(0,300)">
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 170.5,42.5 L 170.5,59.5"
++ id="path5156" />
++ <use
++ x="0"
++ y="0"
++ xlink:href="#path5128"
++ id="use5158"
++ width="640"
++ height="480"
++ transform="translate(10,0)" />
++ <use
++ x="0"
++ y="0"
++ xlink:href="#use5130"
++ id="use5160"
++ transform="translate(10,0)"
++ width="640"
++ height="480" />
++ <use
++ x="0"
++ y="0"
++ xlink:href="#use5132"
++ id="use5162"
++ transform="translate(10,0)"
++ width="640"
++ height="480" />
++ <use
++ x="0"
++ y="0"
++ xlink:href="#use5134"
++ id="use5164"
++ transform="translate(10,0)"
++ width="640"
++ height="480" />
++ <use
++ x="0"
++ y="0"
++ xlink:href="#use5136"
++ id="use5166"
++ transform="translate(10,0)"
++ width="640"
++ height="480" />
++ <use
++ x="0"
++ y="0"
++ xlink:href="#use5138"
++ id="use5168"
++ transform="translate(10,0)"
++ width="640"
++ height="480" />
++ </g>
++ <g
++ transform="translate(80,300)"
++ id="g5170">
++ <path
++ id="path5172"
++ d="M 170.5,42.5 L 170.5,59.5"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
++ <use
++ transform="translate(10,0)"
++ height="480"
++ width="640"
++ id="use5174"
++ xlink:href="#path5128"
++ y="0"
++ x="0" />
++ <use
++ height="480"
++ width="640"
++ transform="translate(10,0)"
++ id="use5176"
++ xlink:href="#use5130"
++ y="0"
++ x="0" />
++ <use
++ height="480"
++ width="640"
++ transform="translate(10,0)"
++ id="use5178"
++ xlink:href="#use5132"
++ y="0"
++ x="0" />
++ <use
++ height="480"
++ width="640"
++ transform="translate(10,0)"
++ id="use5180"
++ xlink:href="#use5134"
++ y="0"
++ x="0" />
++ <use
++ height="480"
++ width="640"
++ transform="translate(10,0)"
++ id="use5182"
++ xlink:href="#use5136"
++ y="0"
++ x="0" />
++ <use
++ height="480"
++ width="640"
++ transform="translate(10,0)"
++ id="use5184"
++ xlink:href="#use5138"
++ y="0"
++ x="0" />
++ </g>
++ <text
++ xml:space="preserve"
++ style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="501"
++ y="451"
++ id="text5186"
++ sodipodi:linespacing="100%"><tspan
++ sodipodi:role="line"
++ id="tspan5188"
++ x="501"
++ y="451">GStreamer</tspan><tspan
++ sodipodi:role="line"
++ x="501"
++ y="471"
++ id="tspan5192">Data Protocol</tspan></text>
++ </g>
++</svg>
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/libs/gstreamer-libs-sections.txt gstreamer-0.10.23/docs/libs/gstreamer-libs-sections.txt
+--- gstreamer-0.10.23.orig/docs/libs/gstreamer-libs-sections.txt 2009-05-10 23:30:44.000000000 +0200
++++ gstreamer-0.10.23/docs/libs/gstreamer-libs-sections.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -205,8 +205,11 @@
+ gst_adapter_available_fast
+ gst_adapter_take
+ gst_adapter_take_buffer
++gst_adapter_prev_timestamp
++gst_adapter_masked_scan_uint32
+ <SUBSECTION Standard>
+ GstAdapterClass
++GstAdapterPrivate
+ GST_ADAPTER
+ GST_IS_ADAPTER
+ GST_TYPE_ADAPTER
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/manual/diagrams-clocks.svg gstreamer-0.10.23/docs/manual/diagrams-clocks.svg
+--- gstreamer-0.10.23.orig/docs/manual/diagrams-clocks.svg 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/manual/diagrams-clocks.svg 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,1565 @@
++<?xml version="1.0" encoding="UTF-8" standalone="no"?>
++<!-- Created with Inkscape (http://www.inkscape.org/) -->
++<svg
++ xmlns:dc="http://purl.org/dc/elements/1.1/"
++ xmlns:cc="http://creativecommons.org/ns#"
++ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
++ xmlns:svg="http://www.w3.org/2000/svg"
++ xmlns="http://www.w3.org/2000/svg"
++ xmlns:xlink="http://www.w3.org/1999/xlink"
++ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
++ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
++ width="744.09448819"
++ height="1052.3622047"
++ id="svg4311"
++ sodipodi:version="0.32"
++ inkscape:version="0.46"
++ sodipodi:docname="diagrams-clocks.svg"
++ inkscape:output_extension="org.inkscape.output.svg.inkscape">
++ <sodipodi:namedview
++ id="base"
++ pagecolor="#ffffff"
++ bordercolor="#ffffff"
++ borderopacity="0.0"
++ inkscape:pageopacity="1"
++ inkscape:pageshadow="0"
++ inkscape:zoom="1.1768717"
++ inkscape:cx="-1253.8328"
++ inkscape:cy="1724.8867"
++ inkscape:document-units="px"
++ inkscape:current-layer="layer1"
++ showgrid="true"
++ inkscape:snap-global="true"
++ inkscape:object-nodes="true"
++ inkscape:object-paths="true"
++ inkscape:snap-bbox="true"
++ inkscape:window-width="1398"
++ inkscape:window-height="982"
++ inkscape:window-x="0"
++ inkscape:window-y="24"
++ inkscape:snap-guide="true"
++ gridtolerance="8"
++ showguides="true"
++ inkscape:guide-bbox="true"
++ inkscape:snap-nodes="true">
++ <inkscape:grid
++ empspacing="10"
++ empopacity="0.14901961"
++ empcolor="#0000ff"
++ opacity="0.05882353"
++ color="#0000ff"
++ dotted="false"
++ enabled="true"
++ visible="true"
++ id="grid4334"
++ type="xygrid" />
++ </sodipodi:namedview>
++ <defs
++ id="defs4313">
++ <marker
++ style="overflow:visible;"
++ id="Arrow2Lend"
++ refX="0.0"
++ refY="0.0"
++ orient="auto"
++ inkscape:stockid="Arrow2Lend">
++ <path
++ transform="scale(1.1) rotate(180) translate(1,0)"
++ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
++ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
++ id="path3314" />
++ </marker>
++ <marker
++ inkscape:stockid="Arrow1Lend"
++ orient="auto"
++ refY="0.0"
++ refX="0.0"
++ id="Arrow1Lend"
++ style="overflow:visible;">
++ <path
++ id="path3296"
++ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
++ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
++ transform="scale(0.8) rotate(180) translate(12.5,0)" />
++ </marker>
++ <inkscape:perspective
++ id="perspective4319"
++ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
++ inkscape:vp_z="744.09448 : 526.18109 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 526.18109 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <inkscape:perspective
++ id="perspective2506"
++ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
++ inkscape:vp_z="744.09448 : 526.18109 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 526.18109 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <marker
++ inkscape:stockid="Arrow1Lendo"
++ orient="auto"
++ refY="0.0"
++ refX="0.0"
++ id="Arrow1Lendo"
++ style="overflow:visible;">
++ <path
++ id="path4078"
++ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
++ style="marker-start:none;stroke:#204a87;stroke-width:1.0pt;fill:#204a87;fill-rule:evenodd"
++ transform="scale(0.8) rotate(180) translate(12.5,0)" />
++ </marker>
++ <use
++ xlink:href="#gpPt11"
++ id="gpPt12"
++ style="fill:currentColor; stroke:none" />
++ <use
++ xlink:href="#gpPt3"
++ id="gpPt11"
++ transform="rotate(45)" />
++ <use
++ xlink:href="#gpPt9"
++ id="gpPt10"
++ style="fill:currentColor; stroke:none" />
++ <use
++ xlink:href="#gpPt7"
++ id="gpPt9"
++ transform="rotate(180)" />
++ <use
++ xlink:href="#gpPt7"
++ id="gpPt8"
++ style="fill:currentColor; stroke:none" />
++ <path
++ id="gpPt7"
++ style="stroke-width:0.222"
++ d="M0,-1.33 L-1.33,0.67 L1.33,0.67 z" />
++ <use
++ xlink:href="#gpPt5"
++ id="gpPt6"
++ style="fill:currentColor; stroke:none" />
++ <circle
++ id="gpPt5"
++ style="stroke-width:0.222"
++ cx="0"
++ cy="0"
++ r="1" />
++ <use
++ xlink:href="#gpPt3"
++ id="gpPt4"
++ style="fill:currentColor; stroke:none" />
++ <rect
++ id="gpPt3"
++ style="stroke-width:0.222"
++ x="-1"
++ y="-1"
++ width="2"
++ height="2" />
++ <path
++ id="gpPt2"
++ style="stroke-width:0.222"
++ d="M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1" />
++ <path
++ id="gpPt1"
++ style="stroke-width:0.222"
++ d="M-1,-1 L1,1 M1,-1 L-1,1" />
++ <path
++ id="gpPt0"
++ style="stroke-width:0.222"
++ d="M-1,0 h2 M0,-1 v2" />
++ <circle
++ id="gpDot"
++ r="1" />
++ <inkscape:perspective
++ sodipodi:type="inkscape:persp3d"
++ inkscape:vp_x="0 : 240 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_z="600 : 240 : 1"
++ inkscape:persp3d-origin="300 : 160 : 1"
++ id="perspective149" />
++ <marker
++ style="overflow:visible;"
++ id="Arrow2LendH"
++ refX="0.0"
++ refY="0.0"
++ orient="auto"
++ inkscape:stockid="Arrow2LendH">
++ <path
++ transform="scale(1.1) rotate(180) translate(1,0)"
++ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
++ style="stroke-linejoin:round;font-size:12.0;fill-rule:evenodd;stroke:#204a87;stroke-width:0.62500000;fill:#204a87"
++ id="path6291" />
++ </marker>
++ <marker
++ style="overflow:visible;"
++ id="Arrow2LendO"
++ refX="0.0"
++ refY="0.0"
++ orient="auto"
++ inkscape:stockid="Arrow2LendO">
++ <path
++ transform="scale(1.1) rotate(180) translate(1,0)"
++ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
++ style="stroke-linejoin:round;font-size:12.0;fill-rule:evenodd;stroke:#204a87;stroke-width:0.62500000;fill:#204a87"
++ id="path6294" />
++ </marker>
++ <marker
++ style="overflow:visible;"
++ id="Arrow2Lend1"
++ refX="0.0"
++ refY="0.0"
++ orient="auto"
++ inkscape:stockid="Arrow2Lend1">
++ <path
++ transform="scale(1.1) rotate(180) translate(1,0)"
++ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
++ style="stroke-linejoin:round;font-size:12.0;fill-rule:evenodd;stroke:#204a87;stroke-width:0.62500000;fill:#204a87"
++ id="path6297" />
++ </marker>
++ </defs>
++ <metadata
++ id="metadata4316">
++ <rdf:RDF>
++ <cc:Work
++ rdf:about="">
++ <dc:format>image/svg+xml</dc:format>
++ <dc:type
++ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
++ </cc:Work>
++ </rdf:RDF>
++ </metadata>
++ <g
++ id="layer1"
++ inkscape:groupmode="layer"
++ inkscape:label="Layer 1">
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2.00000023999999987;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect2512"
++ width="599.5"
++ height="219.55901"
++ x="-1480.5"
++ y="-806.63782"
++ rx="0"
++ ry="0"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ style="stroke-linejoin:miter;marker-end:url(#Arrow2Lend1);stroke-opacity:1;fill-rule:evenodd;fill-opacity:0.75000000000000000;stroke:#204a87;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-width:1.90775669000000003;fill:none"
++ d="M -1679.0461,-587.63782 L -720.85489,-587.63782 L -720.85489,-587.63782"
++ id="path3288"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text4129"
++ y="-587.92102"
++ x="-1791.123"
++ style="font-size:20px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-587.92102"
++ x="-1791.123"
++ id="tspan4131"
++ sodipodi:role="line">Clock time</tspan></text>
++ <text
++ id="text4137"
++ y="-627.63782"
++ x="-1640"
++ style="font-size:20px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-627.63782"
++ x="-1640"
++ id="tspan4139"
++ sodipodi:role="line">Running time</tspan></text>
++ <path
++ style="stroke-linejoin:miter;marker-end:url(#Arrow2LendH);stroke-opacity:1;fill-rule:evenodd;fill-opacity:0.75000000000000000;stroke:#204a87;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-width:1.93535388000000008;fill:none"
++ d="M -1498.9936,-628.63782 L -840.96768,-628.63782 L -840.96768,-628.63782"
++ id="path4145"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ style="stroke-linejoin:miter;marker-end:url(#Arrow2LendO);stroke-opacity:1;fill-rule:evenodd;fill-opacity:0.75000000000000000;stroke:#204a87;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-width:1.93550634000000010;fill:none"
++ d="M -1499.0323,-667.63782 L -840.96778,-667.63782 L -840.96778,-667.63782"
++ id="path4147"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text4151"
++ y="-667.92102"
++ x="-1631.3184"
++ style="font-size:20px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-667.92102"
++ x="-1631.3184"
++ id="tspan4153"
++ sodipodi:role="line">Stream time</tspan></text>
++ <path
++ transform="translate(-15.505538,0.4760742)"
++ d="M -1450,-572.63782 A 15,15 0 1 1 -1480,-572.63782 A 15,15 0 1 1 -1450,-572.63782 z"
++ sodipodi:ry="15"
++ sodipodi:rx="15"
++ sodipodi:cy="-572.63782"
++ sodipodi:cx="-1465"
++ id="path4159"
++ style="opacity:1;fill:#729fcf;fill-opacity:0.19607843;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ sodipodi:type="arc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text4161"
++ y="-537.63782"
++ x="-1518"
++ style="font-size:20px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ style="font-size:16px;fill:#204a87"
++ y="-537.63782"
++ x="-1518"
++ id="tspan4163"
++ sodipodi:role="line">base time</tspan></text>
++ <text
++ id="text4165"
++ y="-607.63782"
++ x="-1450"
++ style="font-size:14;font-style:normal;font-weight:normal;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ style="font-size:14;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#eeeeec;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ y="-607.63782"
++ x="-1450"
++ id="tspan4167"
++ sodipodi:role="line">10</tspan></text>
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4175"
++ d="M -1440,-627.63782 L -1440,-623.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4177"
++ d="M -1400,-627.63782 L -1400,-623.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4179"
++ d="M -1360,-627.63782 L -1360,-623.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4181"
++ d="M -1320,-627.63782 L -1320,-623.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4183"
++ d="M -1280,-627.63782 L -1280,-623.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4185"
++ d="M -1240,-627.63782 L -1240,-623.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4187"
++ d="M -1200,-627.63782 L -1200,-623.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4189"
++ d="M -1160,-627.63782 L -1160,-623.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4191"
++ d="M -1120,-627.63782 L -1120,-623.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4193"
++ d="M -1080,-627.63782 L -1080,-623.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4195"
++ d="M -1040,-627.63782 L -1040,-623.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4197"
++ d="M -1000,-627.63782 L -1000,-623.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4199"
++ d="M -960,-627.63782 L -960,-623.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4201"
++ d="M -920,-627.63782 L -920,-623.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ xml:space="preserve"
++ style="font-size:14;font-style:normal;font-weight:normal;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="-1410"
++ y="-607.63782"
++ id="text4209"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ sodipodi:role="line"
++ id="tspan4211"
++ x="-1410"
++ y="-607.63782"
++ style="font-size:14;fill:#eeeeec">20</tspan></text>
++ <text
++ sodipodi:linespacing="125%"
++ id="text4213"
++ y="-606.534"
++ x="-1362.9087"
++ style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;opacity:1;fill:#204a87;fill-opacity:0.19607843;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"><tspan
++ y="-606.534"
++ x="-1362.9087"
++ id="tspan4215"
++ sodipodi:role="line" /></text>
++ <text
++ id="text4217"
++ y="-607.86438"
++ x="-1371.2188"
++ style="font-size:14;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-607.86438"
++ x="-1371.2188"
++ id="tspan4219"
++ sodipodi:role="line">30</tspan></text>
++ <text
++ id="text4221"
++ y="-607.63782"
++ x="-1330"
++ style="font-size:14;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-607.63782"
++ x="-1330"
++ id="tspan4223"
++ sodipodi:role="line">40</tspan></text>
++ <text
++ id="text4225"
++ y="-607.63782"
++ x="-1290"
++ style="font-size:14;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-607.63782"
++ x="-1290"
++ id="tspan4227"
++ sodipodi:role="line">50</tspan></text>
++ <text
++ id="text4229"
++ y="-607.63782"
++ x="-1250"
++ style="font-size:14;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-607.63782"
++ x="-1250"
++ id="tspan4231"
++ sodipodi:role="line">60</tspan></text>
++ <text
++ id="text4233"
++ y="-607.86438"
++ x="-1209.3047"
++ style="font-size:14;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-607.86438"
++ x="-1209.3047"
++ id="tspan4235"
++ sodipodi:role="line">70</tspan></text>
++ <text
++ id="text4237"
++ y="-607.86438"
++ x="-1169.3047"
++ style="font-size:14;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-607.86438"
++ x="-1169.3047"
++ id="tspan4239"
++ sodipodi:role="line">80</tspan></text>
++ <text
++ id="text4241"
++ y="-607.86438"
++ x="-1129.3047"
++ style="font-size:14;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-607.86438"
++ x="-1129.3047"
++ id="tspan4243"
++ sodipodi:role="line">90</tspan></text>
++ <text
++ id="text4245"
++ y="-607.63782"
++ x="-1090"
++ style="font-size:14;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-607.63782"
++ x="-1090"
++ id="tspan4247"
++ sodipodi:role="line">100</tspan></text>
++ <text
++ id="text4249"
++ y="-607.86438"
++ x="-1049.4922"
++ style="font-size:14;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-607.86438"
++ x="-1049.4922"
++ id="tspan4251"
++ sodipodi:role="line">110</tspan></text>
++ <text
++ id="text4253"
++ y="-607.63782"
++ x="-1010"
++ style="font-size:14;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-607.63782"
++ x="-1010"
++ id="tspan4255"
++ sodipodi:role="line">120</tspan></text>
++ <text
++ id="text4257"
++ y="-607.63782"
++ x="-970"
++ style="font-size:14;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-607.63782"
++ x="-970"
++ id="tspan4259"
++ sodipodi:role="line">130</tspan></text>
++ <text
++ id="text4261"
++ y="-607.63782"
++ x="-930"
++ style="font-size:14;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-607.63782"
++ x="-930"
++ id="tspan4263"
++ sodipodi:role="line">140</tspan></text>
++ <text
++ id="text4269"
++ y="-566.63776"
++ x="-1650.5381"
++ style="font-size:14px;font-style:normal;font-weight:normal;fill:#3465a4;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ style="font-size:12;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#3465a4;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ y="-566.63776"
++ x="-1650.5381"
++ id="tspan4271"
++ sodipodi:role="line">10</tspan></text>
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4273"
++ d="M -1640.538,-586.63782 L -1640.538,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4275"
++ d="M -1600.538,-586.63782 L -1600.538,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4277"
++ d="M -1560.538,-586.63782 L -1560.538,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4279"
++ d="M -1520.538,-586.63782 L -1520.538,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4283"
++ d="M -1440.538,-586.63782 L -1440.538,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4285"
++ d="M -1400.538,-586.63782 L -1400.538,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4287"
++ d="M -1360.538,-586.63782 L -1360.538,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4289"
++ d="M -1320.538,-586.63782 L -1320.538,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4291"
++ d="M -1280.538,-586.63782 L -1280.538,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4293"
++ d="M -1240.538,-586.63782 L -1240.538,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4295"
++ d="M -1200.538,-586.63782 L -1200.538,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4297"
++ d="M -1160.538,-586.63782 L -1160.538,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4299"
++ d="M -1120.538,-586.63782 L -1120.538,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4301"
++ d="M -1080.538,-586.63782 L -1080.538,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;fill:#3465a4;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="-1610.5381"
++ y="-566.63776"
++ id="text4303"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ sodipodi:role="line"
++ id="tspan4305"
++ x="-1610.5381"
++ y="-566.63776"
++ style="font-size:12;fill:#3465a4">20</tspan></text>
++ <text
++ id="text4307"
++ y="-566.86432"
++ x="-1571.7568"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-566.86432"
++ x="-1571.7568"
++ id="tspan4309"
++ sodipodi:role="line"
++ style="font-size:12">30</tspan></text>
++ <text
++ id="text4311"
++ y="-566.63776"
++ x="-1530.5381"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-566.63776"
++ x="-1530.5381"
++ id="tspan4313"
++ sodipodi:role="line"
++ style="font-size:12">40</tspan></text>
++ <text
++ id="text4315"
++ y="-567.63782"
++ x="-1489.2766"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#204a87;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-567.63782"
++ x="-1489.2766"
++ id="tspan4317"
++ sodipodi:role="line">50</tspan></text>
++ <text
++ id="text4319"
++ y="-566.63776"
++ x="-1450.5381"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-566.63776"
++ x="-1450.5381"
++ id="tspan4321"
++ sodipodi:role="line"
++ style="-inkscape-font-specification:DejaVu Sans;font-weight:normal;text-anchor:start;text-align:start;fill:#3465a4;fill-opacity:1;font-size:12">60</tspan></text>
++ <text
++ id="text4323"
++ y="-566.86432"
++ x="-1409.8428"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-566.86432"
++ x="-1409.8428"
++ id="tspan4325"
++ sodipodi:role="line"
++ style="font-size:12">70</tspan></text>
++ <text
++ id="text4327"
++ y="-566.86432"
++ x="-1369.8428"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-566.86432"
++ x="-1369.8428"
++ id="tspan4329"
++ sodipodi:role="line"
++ style="font-size:12">80</tspan></text>
++ <text
++ id="text4331"
++ y="-566.86432"
++ x="-1329.8428"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-566.86432"
++ x="-1329.8428"
++ id="tspan4333"
++ sodipodi:role="line"
++ style="font-size:12">90</tspan></text>
++ <text
++ id="text4335"
++ y="-566.63776"
++ x="-1290.5381"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-566.63776"
++ x="-1290.5381"
++ id="tspan4337"
++ sodipodi:role="line"
++ style="font-size:12">100</tspan></text>
++ <text
++ id="text4339"
++ y="-566.86432"
++ x="-1250.0303"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-566.86432"
++ x="-1250.0303"
++ id="tspan4341"
++ sodipodi:role="line"
++ style="font-size:12">110</tspan></text>
++ <text
++ id="text4343"
++ y="-566.63776"
++ x="-1210.5381"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-566.63776"
++ x="-1210.5381"
++ id="tspan4345"
++ sodipodi:role="line"
++ style="font-size:12">120</tspan></text>
++ <text
++ id="text4347"
++ y="-566.63776"
++ x="-1170.5381"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-566.63776"
++ x="-1170.5381"
++ id="tspan4349"
++ sodipodi:role="line"
++ style="font-size:12">130</tspan></text>
++ <text
++ id="text4351"
++ y="-566.63776"
++ x="-1130.5381"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-566.63776"
++ x="-1130.5381"
++ id="tspan4353"
++ sodipodi:role="line"
++ style="font-size:12">140</tspan></text>
++ <text
++ id="text4355"
++ y="-566.63776"
++ x="-1090.5381"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-566.63776"
++ x="-1090.5381"
++ id="tspan4357"
++ sodipodi:role="line"
++ style="font-size:12">150</tspan></text>
++ <text
++ id="text4359"
++ y="-567.86438"
++ x="-1049.4922"
++ style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-567.86438"
++ x="-1049.4922"
++ id="tspan4361"
++ sodipodi:role="line"
++ style="font-size:12;fill:#3465a4;fill-opacity:1">160</tspan></text>
++ <text
++ id="text4363"
++ y="-567.63782"
++ x="-1010"
++ style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-567.63782"
++ x="-1010"
++ id="tspan4365"
++ sodipodi:role="line"
++ style="font-size:12;fill:#3465a4;fill-opacity:1">170</tspan></text>
++ <text
++ id="text4367"
++ y="-567.63782"
++ x="-970"
++ style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-567.63782"
++ x="-970"
++ id="tspan4369"
++ sodipodi:role="line"
++ style="font-size:12;fill:#3465a4;fill-opacity:1">180</tspan></text>
++ <text
++ id="text4371"
++ y="-567.63782"
++ x="-930"
++ style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-567.63782"
++ x="-930"
++ id="tspan4373"
++ sodipodi:role="line"
++ style="font-size:12;fill:#3465a4;fill-opacity:1">190</tspan></text>
++ <text
++ id="text4375"
++ y="-567.86438"
++ x="-889.49219"
++ style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-567.86438"
++ x="-889.49219"
++ id="tspan4377"
++ sodipodi:role="line"
++ style="font-size:12;fill:#3465a4;fill-opacity:1">200</tspan></text>
++ <text
++ id="text4379"
++ y="-567.86438"
++ x="-849.49219"
++ style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-567.86438"
++ x="-849.49219"
++ id="tspan4381"
++ sodipodi:role="line"
++ style="font-size:12;fill:#3465a4;fill-opacity:1">210</tspan></text>
++ <text
++ id="text4383"
++ y="-567.63782"
++ x="-810"
++ style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-567.63782"
++ x="-810"
++ id="tspan4385"
++ sodipodi:role="line"
++ style="font-size:12;fill:#3465a4;fill-opacity:1">220</tspan></text>
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4387"
++ d="M -1041,-586.63782 L -1041,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4389"
++ d="M -1001,-586.63782 L -1001,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4391"
++ d="M -961,-586.63782 L -961,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4393"
++ d="M -921,-586.63782 L -921,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4395"
++ d="M -881,-586.63782 L -881,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4397"
++ d="M -841,-586.63782 L -841,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4399"
++ d="M -801,-586.63782 L -801,-582.47115"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text4403"
++ y="-646.47015"
++ x="-1450.3341"
++ style="font-size:14px;font-style:normal;font-weight:normal;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#eeeeec;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ y="-646.47015"
++ x="-1450.3341"
++ id="tspan4405"
++ sodipodi:role="line">10</tspan></text>
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4407"
++ d="M -1440.3341,-666.47016 L -1440.3341,-662.30349"
++ style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#eeeeec;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4409"
++ d="M -1400.3341,-666.47016 L -1400.3341,-662.30349"
++ style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#eeeeec;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4411"
++ d="M -1360.3341,-666.47016 L -1360.3341,-662.30349"
++ style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#eeeeec;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4413"
++ d="M -1320.3341,-666.47016 L -1320.3341,-662.30349"
++ style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#eeeeec;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4415"
++ d="M -1280.3341,-666.47016 L -1280.3341,-662.30349"
++ style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#eeeeec;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4417"
++ d="M -1240.3341,-666.47016 L -1240.3341,-662.30349"
++ style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#eeeeec;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4419"
++ d="M -1200.3341,-666.47016 L -1200.3341,-662.30349"
++ style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#eeeeec;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4421"
++ d="M -1160.3341,-666.47016 L -1160.3341,-662.30349"
++ style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#eeeeec;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4423"
++ d="M -1120.3341,-666.47016 L -1120.3341,-662.30349"
++ style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#eeeeec;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4425"
++ d="M -1080.3341,-666.47016 L -1080.3341,-662.30349"
++ style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#eeeeec;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4427"
++ d="M -1040.3341,-666.47016 L -1040.3341,-662.30349"
++ style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#fce94f;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4429"
++ d="M -1000.3341,-666.47016 L -1000.3341,-662.30349"
++ style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#fce94f;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4431"
++ d="M -960.33408,-666.47016 L -960.33408,-662.30349"
++ style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#fce94f;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path4433"
++ d="M -920.33408,-666.47016 L -920.33408,-662.30349"
++ style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#fce94f;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="-1410.3341"
++ y="-646.47015"
++ id="text4437"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ sodipodi:role="line"
++ id="tspan4439"
++ x="-1410.3341"
++ y="-646.47015"
++ style="font-size:14px;fill:#eeeeec">20</tspan></text>
++ <text
++ id="text4441"
++ y="-646.69672"
++ x="-1371.5529"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-646.69672"
++ x="-1371.5529"
++ id="tspan4443"
++ sodipodi:role="line">30</tspan></text>
++ <text
++ id="text4445"
++ y="-646.47015"
++ x="-1330.3341"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-646.47015"
++ x="-1330.3341"
++ id="tspan4447"
++ sodipodi:role="line">40</tspan></text>
++ <text
++ id="text4449"
++ y="-646.47015"
++ x="-1290.3341"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-646.47015"
++ x="-1290.3341"
++ id="tspan4451"
++ sodipodi:role="line">50</tspan></text>
++ <text
++ id="text4453"
++ y="-646.47015"
++ x="-1250.3341"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-646.47015"
++ x="-1250.3341"
++ id="tspan4455"
++ sodipodi:role="line">60</tspan></text>
++ <text
++ id="text4457"
++ y="-646.69672"
++ x="-1209.6388"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-646.69672"
++ x="-1209.6388"
++ id="tspan4459"
++ sodipodi:role="line">70</tspan></text>
++ <text
++ id="text4461"
++ y="-646.69672"
++ x="-1169.6388"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-646.69672"
++ x="-1169.6388"
++ id="tspan4463"
++ sodipodi:role="line">80</tspan></text>
++ <text
++ id="text4465"
++ y="-646.69672"
++ x="-1129.6388"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-646.69672"
++ x="-1129.6388"
++ id="tspan4467"
++ sodipodi:role="line">90</tspan></text>
++ <text
++ id="text4469"
++ y="-646.47015"
++ x="-1090.3341"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-646.47015"
++ x="-1090.3341"
++ id="tspan4471"
++ sodipodi:role="line">100</tspan></text>
++ <text
++ id="text4473"
++ y="-646.69672"
++ x="-1049.8263"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-646.69672"
++ x="-1049.8263"
++ id="tspan4475"
++ sodipodi:role="line">60</tspan></text>
++ <text
++ id="text4477"
++ y="-646.47015"
++ x="-1010.3341"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-646.47015"
++ x="-1010.3341"
++ id="tspan4479"
++ sodipodi:role="line">70</tspan></text>
++ <text
++ id="text4481"
++ y="-646.47015"
++ x="-970.33411"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-646.47015"
++ x="-970.33411"
++ id="tspan4483"
++ sodipodi:role="line">80</tspan></text>
++ <text
++ id="text4485"
++ y="-646.47015"
++ x="-930.33411"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-646.47015"
++ x="-930.33411"
++ id="tspan4487"
++ sodipodi:role="line">90</tspan></text>
++ <g
++ transform="matrix(1,0,0,0.8805277,-1737.9408,-1108.7794)"
++ id="g22"
++ style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" />
++ <g
++ transform="matrix(1,0,0,0.8805277,-1737.9408,-1108.7794)"
++ id="g130"
++ style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" />
++ <g
++ transform="matrix(1,0,0,0.8805277,-1752.9408,-1086.7661)"
++ id="g138"
++ style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" />
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#eeeeec;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M -1278.3125,-745.03125 C -1278.3125,-745.03125 -1279.7082,-745.03509 -1280.3125,-745.03125 C -1280.9167,-745.0274 -1281.7395,-745.00774 -1282.3438,-745 C -1282.9479,-744.9923 -1283.7396,-744.97646 -1284.3438,-744.96875 C -1284.9479,-744.96103 -1285.7707,-744.96878 -1286.375,-744.96875 C -1286.9793,-744.96875 -1287.7707,-744.95331 -1288.375,-744.96875 C -1288.9793,-744.98418 -1289.796,-745.02792 -1290.4062,-745.0625 C -1291.0166,-745.09711 -1291.8275,-745.17246 -1292.4375,-745.21875 C -1293.0475,-745.26506 -1293.8645,-745.33256 -1294.4688,-745.375 C -1295.0729,-745.41743 -1295.8639,-745.48077 -1296.4688,-745.5 C -1297.0736,-745.51927 -1297.8948,-745.52314 -1298.5,-745.5 C -1299.1052,-745.47689 -1299.8945,-745.41689 -1300.5,-745.34375 C -1301.1056,-745.27059 -1301.9264,-745.11954 -1302.5312,-745 C -1303.1362,-744.88051 -1303.9271,-744.67016 -1304.5312,-744.53125 C -1305.1354,-744.39232 -1305.9261,-744.20936 -1306.5312,-744.09375 C -1307.1364,-743.97817 -1307.9544,-743.82724 -1308.5625,-743.78125 C -1309.1707,-743.73524 -1309.952,-743.72392 -1310.5625,-743.78125 C -1311.1729,-743.83856 -1311.9842,-743.98755 -1312.5938,-744.15625 C -1313.2033,-744.32492 -1313.9818,-744.64833 -1314.5938,-744.90625 C -1315.2057,-745.16414 -1316.0463,-745.58176 -1316.6562,-745.875 C -1317.2662,-746.16827 -1318.0471,-746.60572 -1318.6562,-746.84375 C -1319.2656,-747.08181 -1320.0711,-747.36638 -1320.6875,-747.46875 C -1321.3038,-747.57111 -1322.0618,-747.64469 -1322.6875,-747.5625 C -1323.3132,-747.48031 -1324.098,-747.19555 -1324.7188,-746.90625 C -1325.3396,-746.6169 -1326.1103,-746.04431 -1326.7188,-745.59375 C -1327.3273,-745.14319 -1328.1458,-744.41174 -1328.75,-743.90625 C -1329.3542,-743.40076 -1330.1386,-742.64551 -1330.75,-742.21875 C -1331.3615,-741.792 -1332.112,-741.23966 -1332.75,-741.03125 C -1333.3879,-740.82284 -1334.1253,-740.6954 -1334.7812,-740.78125 C -1335.4371,-740.8671 -1336.1426,-741.24344 -1336.7812,-741.65625 C -1337.4199,-742.06906 -1338.1943,-742.91617 -1338.8125,-743.59375 C -1339.4306,-744.27136 -1340.2338,-745.40418 -1340.8438,-746.1875 C -1341.4538,-746.97083 -1342.2623,-748.12709 -1342.875,-748.8125 C -1343.4876,-749.49793 -1344.2173,-750.40027 -1344.875,-750.78125 C -1345.5327,-751.16226 -1346.1938,-751.48021 -1346.9062,-751.4375 C -1347.6188,-751.39484 -1348.2402,-750.95695 -1348.9062,-750.4375 C -1349.5722,-749.91805 -1350.3181,-748.80292 -1350.9375,-747.875 C -1351.5569,-746.94709 -1352.3331,-745.34161 -1352.9375,-744.21875 C -1353.542,-743.0959 -1354.3573,-741.43178 -1354.9688,-740.40625 C -1355.5801,-739.38071 -1356.3034,-738.04307 -1356.9688,-737.40625 C -1357.6341,-736.76947 -1358.1811,-736.13838 -1358.9688,-736.09375 C -1359.7564,-736.04914 -1360.2788,-736.41084 -1361,-737 C -1361.7211,-737.5892 -1362.3737,-738.96631 -1363,-740.15625 C -1363.6262,-741.34617 -1364.4203,-743.464 -1365.0312,-744.96875 C -1365.6422,-746.47353 -1366.4799,-748.74086 -1367.0938,-750.1875 C -1367.7076,-751.63412 -1368.495,-753.56511 -1369.0938,-754.59375 C -1369.4868,-755.26888 -1370.6148,-756.58357 -1371.5167,-756.61069 C -1372.4714,-756.63941 -1373.8257,-754.75924 -1374.2188,-754.03125 C -1374.7843,-752.98402 -1375.6049,-751.07162 -1376.2188,-749.625 C -1376.8325,-748.17838 -1377.6703,-745.87978 -1378.2812,-744.375 C -1378.8922,-742.87021 -1379.6863,-740.78367 -1380.3125,-739.59375 C -1380.9388,-738.40383 -1381.5914,-737.0267 -1382.3125,-736.4375 C -1383.0337,-735.8483 -1383.5248,-735.45539 -1384.3125,-735.5 C -1385.1002,-735.54459 -1385.6784,-736.17572 -1386.3438,-736.8125 C -1387.009,-737.44928 -1387.7324,-738.81821 -1388.3438,-739.84375 C -1388.9552,-740.8693 -1389.7705,-742.5334 -1390.375,-743.65625 C -1390.9794,-744.77906 -1391.7556,-746.38459 -1392.375,-747.3125 C -1392.9944,-748.24038 -1393.7403,-749.35555 -1394.4062,-749.875 C -1395.0723,-750.39447 -1395.6937,-750.83234 -1396.4062,-750.875 C -1397.1186,-750.91766 -1397.7798,-750.56851 -1398.4375,-750.1875 C -1399.0952,-749.80654 -1399.8249,-748.93543 -1400.4375,-748.25 C -1401.0502,-747.56454 -1401.8275,-746.40833 -1402.4375,-745.625 C -1403.0475,-744.8417 -1403.8819,-743.70886 -1404.5,-743.03125 C -1405.1182,-742.35363 -1405.8926,-741.50656 -1406.5312,-741.09375 C -1407.1698,-740.68095 -1407.8754,-740.3046 -1408.5312,-740.21875 C -1409.1872,-740.13292 -1409.8934,-740.26034 -1410.5312,-740.46875 C -1411.1693,-740.67717 -1411.951,-741.2295 -1412.5625,-741.65625 C -1413.1739,-742.08296 -1413.9583,-742.83826 -1414.5625,-743.34375 C -1415.1667,-743.84926 -1415.9852,-744.58069 -1416.5938,-745.03125 C -1417.2022,-745.48177 -1417.9729,-746.0544 -1418.5938,-746.34375 C -1419.2145,-746.63307 -1419.9993,-746.88656 -1420.625,-746.96875 C -1421.2507,-747.0509 -1422.0087,-747.00861 -1422.625,-746.90625 C -1423.2414,-746.8039 -1424.0469,-746.51931 -1424.6562,-746.28125 C -1425.2654,-746.04317 -1426.0463,-745.60577 -1426.6562,-745.3125 C -1427.2662,-745.01922 -1428.1068,-744.60164 -1428.7188,-744.34375 C -1429.3307,-744.08585 -1430.1092,-743.76242 -1430.7188,-743.59375 C -1431.3283,-743.42507 -1432.1396,-743.24481 -1432.75,-743.1875 C -1433.3605,-743.13019 -1434.1418,-743.14149 -1434.75,-743.1875 C -1435.3581,-743.23351 -1436.1761,-743.38442 -1436.7812,-743.5 C -1437.3864,-743.61557 -1438.1771,-743.82982 -1438.7812,-743.96875 C -1439.3854,-744.10768 -1440.1763,-744.31801 -1440.7812,-744.4375 C -1441.3861,-744.557 -1442.2069,-744.70809 -1442.8125,-744.78125 C -1443.418,-744.8544 -1444.2073,-744.91439 -1444.8125,-744.9375 C -1445.4177,-744.9606 -1446.2389,-744.95677 -1446.8438,-744.9375 C -1447.4486,-744.91823 -1448.2396,-744.85493 -1448.8438,-744.8125 C -1449.4479,-744.77008 -1450.265,-744.70256 -1450.875,-744.65625 C -1451.4851,-744.60998 -1452.2959,-744.53461 -1452.9062,-744.5 C -1453.5165,-744.46537 -1454.3332,-744.42168 -1454.9375,-744.40625 C -1455.5418,-744.39083 -1456.3332,-744.375 -1456.9375,-744.375 C -1457.5418,-744.37499 -1458.3646,-744.39853 -1458.9688,-744.40625 C -1459.5729,-744.41398 -1460.3646,-744.4298 -1460.9688,-744.4375 C -1461.573,-744.4452 -1462.3958,-744.4649 -1463,-744.46875 C -1463.6043,-744.47261 -1479.4312,-744.36303 -1479.4312,-744.36303"
++ id="path140"
++ sodipodi:nodetypes="cssssssssssssssssssssssssssssssssssssssssssssszsssssssssssssssssssssssssssssssssssssssssssssc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="czzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#eeeeec;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ id="path4676"
++ d="M -1279,-743.4629 C -1279,-743.4629 -1277.6073,-762.81976 -1276.9861,-769.52196 C -1276.3648,-776.22416 -1275.7328,-784.32171 -1274.9721,-788.14657 C -1274.2115,-791.97145 -1274.0658,-795.18257 -1272.9582,-795.06651 C -1272.0336,-794.96962 -1271.719,-792.48049 -1270.9443,-789.04695 C -1270.1695,-785.6134 -1269.5499,-778.15095 -1268.9303,-772.12015 C -1268.3108,-766.08936 -1267.5264,-755.86989 -1266.9164,-748.83935 C -1266.3064,-741.80881 -1265.4835,-731.50843 -1264.8637,-725.24987 C -1264.244,-718.99128 -1263.5442,-711.10044 -1262.8498,-707.114 C -1262.1554,-703.12756 -1262.3351,-698.767 -1260.8359,-698.65059 C -1259.3265,-698.5334 -1259.7917,-699.20116 -1258.8219,-701.55747 C -1257.8522,-703.91379 -1257.4371,-709.69359 -1256.808,-714.57414 C -1256.1789,-719.4547 -1255.399,-728.03327 -1254.7941,-734.09913 C -1254.1892,-740.16498 -1253.3902,-749.30253 -1252.7802,-755.01326 C -1252.1701,-760.724 -1251.427,-768.19919 -1250.7662,-772.1716 C -1250.1054,-776.14398 -1250.8055,-780.62812 -1248.7523,-781.50963 C -1246.6991,-782.39115 -1248.3774,-782.37959 -1246.7384,-781.12377 C -1245.0993,-779.86792 -1245.3682,-775.36642 -1244.7244,-771.52847 C -1244.0806,-767.69054 -1243.3226,-760.65591 -1242.7105,-755.52775 C -1242.0984,-750.39961 -1241.2704,-742.4377 -1240.6578,-737.34043 C -1240.0452,-732.24319 -1239.2848,-725.36041 -1238.6439,-721.54552 C -1238.0029,-717.73063 -1237.7545,-713.49085 -1236.63,-711.89877 C -1235.5054,-710.30671 -1236.5267,-710.08028 -1234.616,-710.43247 C -1232.7054,-710.78468 -1233.2705,-714.1812 -1232.6021,-717.09516 C -1231.9337,-720.00911 -1231.1976,-725.65132 -1230.5882,-729.88029 C -1229.9788,-734.10926 -1229.1794,-740.85188 -1228.5742,-745.28935 C -1227.969,-749.72682 -1227.1883,-755.91069 -1226.5603,-759.46363 C -1225.9323,-763.01655 -1225.3811,-767.16359 -1224.5464,-768.98174 C -1223.7116,-770.79988 -1224.2294,-771.81829 -1222.5324,-771.73427 C -1220.8354,-771.65026 -1221.2281,-769.58251 -1220.5185,-767.464 C -1219.8089,-765.34546 -1219.1235,-760.95913 -1218.5046,-757.56 C -1217.8857,-754.16088 -1217.0619,-748.57053 -1216.4519,-744.80059 C -1215.8419,-741.03064 -1215.0577,-735.62524 -1214.438,-732.42704 C -1213.8182,-729.22884 -1213.1519,-725.34374 -1212.424,-723.47487 C -1211.6961,-721.60599 -1211.887,-719.97377 -1210.4101,-719.89915 C -1208.9332,-719.82452 -1209.1776,-720.8452 -1208.3962,-722.29153 C -1207.6148,-723.73784 -1207.0026,-727.02441 -1206.3822,-729.6745 C -1205.7619,-732.32459 -1204.9725,-736.84653 -1204.3683,-739.96436 C -1203.7641,-743.08218 -1202.9682,-747.66677 -1202.3544,-750.46001 C -1201.7406,-753.25324 -1201.0204,-756.78538 -1200.3404,-758.58899 C -1199.6605,-760.3926 -1199.5727,-762.25756 -1198.3265,-762.52486 C -1197.0804,-762.79216 -1197.2186,-762.45303 -1196.3126,-761.57304 C -1195.4065,-760.69304 -1194.928,-758.27473 -1194.2986,-756.27378 C -1193.6693,-754.27281 -1192.8952,-750.72621 -1192.2847,-748.22195 C -1191.6742,-745.7177 -1190.8472,-741.93968 -1190.2321,-739.57848 C -1189.6169,-737.21728 -1188.8724,-734.12575 -1188.2181,-732.47848 C -1187.5639,-730.83121 -1187.1954,-729.05833 -1186.2042,-728.56834 C -1185.213,-728.07835 -1185.1634,-728.08562 -1184.1903,-728.51688 C -1183.217,-728.94817 -1182.8177,-730.67097 -1182.1763,-732.11834 C -1181.5349,-733.56572 -1180.7689,-736.24472 -1180.1624,-738.18936 C -1179.5559,-740.13398 -1178.7558,-743.15827 -1178.1485,-745.08355 C -1177.5411,-747.00882 -1176.7709,-749.58968 -1176.1345,-751.02594 C -1175.4981,-752.46221 -1174.9415,-754.08729 -1174.1206,-754.67883 C -1173.2997,-755.27039 -1172.9912,-755.47946 -1172.1067,-755.29624 C -1171.2222,-755.113 -1170.75,-754.02477 -1170.0927,-753.03247 C -1169.4355,-752.04016 -1168.6926,-750.08017 -1168.0788,-748.63355 C -1167.465,-747.18692 -1166.6371,-744.89051 -1166.0261,-743.38573 C -1165.4152,-741.88095 -1164.6384,-739.79086 -1164.0122,-738.60094 C -1163.3859,-737.41103 -1162.7194,-736.02601 -1161.9983,-735.43681 C -1161.2771,-734.84763 -1160.772,-734.46612 -1159.9843,-734.51073 C -1159.1966,-734.55533 -1158.6357,-735.1859 -1157.9704,-735.82268 C -1157.3051,-736.45947 -1156.5678,-737.80692 -1155.9565,-738.83246 C -1155.3451,-739.85801 -1154.547,-741.54259 -1153.9425,-742.66544 C -1153.3381,-743.78828 -1152.548,-745.39043 -1151.9286,-746.31834 C -1151.3092,-747.24624 -1150.5807,-748.34562 -1149.9147,-748.86507 C -1149.2486,-749.38452 -1148.6132,-749.82567 -1147.9007,-749.86833 C -1147.1883,-749.91101 -1146.5445,-749.5805 -1145.8868,-749.19949 C -1145.2291,-748.8185 -1144.4855,-747.92985 -1143.8729,-747.24442 C -1143.2602,-746.55899 -1142.4689,-745.40383 -1141.8589,-744.6205 C -1141.2489,-743.83718 -1140.4244,-742.69993 -1139.8063,-742.02232 C -1139.1881,-741.34472 -1138.431,-740.50579 -1137.7923,-740.09298 C -1137.1537,-739.68016 -1136.4343,-739.30419 -1135.7784,-739.21834 C -1135.1225,-739.13249 -1134.4024,-739.26717 -1133.7645,-739.47558 C -1133.1265,-739.68401 -1132.362,-740.23217 -1131.7505,-740.65892 C -1131.1391,-741.08565 -1130.3408,-741.82553 -1129.7366,-742.33102 C -1129.1324,-742.8365 -1128.3312,-743.57829 -1127.7227,-744.02885 C -1127.1142,-744.47939 -1126.3295,-745.05146 -1125.7087,-745.34081 C -1125.088,-745.63014 -1124.3205,-745.90173 -1123.6948,-745.98392 C -1123.0691,-746.0661 -1122.2972,-746.00911 -1121.6809,-745.90675 C -1121.0645,-745.80439 -1120.2762,-745.52741 -1119.6669,-745.28935 C -1119.0577,-745.05129 -1118.263,-744.60508 -1117.653,-744.31181 C -1117.043,-744.01855 -1116.2123,-743.59217 -1115.6003,-743.33428 C -1114.9884,-743.07639 -1114.1959,-742.75694 -1113.5864,-742.58827 C -1112.9769,-742.41958 -1112.1829,-742.25971 -1111.5725,-742.2024 C -1110.962,-742.14508 -1110.1667,-742.15639 -1109.5585,-742.2024 C -1108.9504,-742.2484 -1108.1498,-742.3955 -1107.5446,-742.51108 C -1106.9394,-742.62668 -1106.1349,-742.83521 -1105.5307,-742.97414 C -1104.9265,-743.11305 -1104.1216,-743.31768 -1103.5167,-743.43717 C -1102.9119,-743.55669 -1102.1084,-743.69844 -1101.5028,-743.7716 C -1100.8973,-743.84476 -1100.0941,-743.90284 -1099.4889,-743.92595 C -1098.8837,-743.94906 -1098.0798,-743.94522 -1097.475,-743.92595 C -1096.8701,-743.90669 -1096.0652,-743.83976 -1095.461,-743.79733 C -1094.8568,-743.75488 -1094.0571,-743.68928 -1093.4471,-743.64297 C -1092.8371,-743.59667 -1092.0047,-743.52323 -1091.3944,-743.48862 C -1090.7842,-743.45402 -1089.9848,-743.42688 -1089.3805,-743.41145 C -1088.7762,-743.39602 -1087.9709,-743.38573 -1087.3666,-743.38573 C -1086.7623,-743.38573 -1085.9568,-743.40373 -1085.3526,-743.41145 C -1084.7484,-743.41917 -1083.9429,-743.42947 -1083.3387,-743.43717 C -1082.7345,-743.44489 -1081.929,-743.45905 -1081.3248,-743.4629 C -1080.7205,-743.46675 -1079.3108,-743.4629 -1079.3108,-743.4629"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="czzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
++ style="fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#fce94f;stroke-width:2.00000023999999987;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ id="path4678"
++ d="M -1079,-743.4629 C -1079,-743.4629 -1077.6073,-762.81976 -1076.9861,-769.52196 C -1076.3648,-776.22416 -1075.7328,-784.32171 -1074.9721,-788.14657 C -1074.2115,-791.97145 -1074.0658,-795.18257 -1072.9582,-795.06651 C -1072.0336,-794.96962 -1071.719,-792.48049 -1070.9443,-789.04695 C -1070.1695,-785.6134 -1069.5499,-778.15095 -1068.9303,-772.12015 C -1068.3108,-766.08936 -1067.5264,-755.86989 -1066.9164,-748.83935 C -1066.3064,-741.80881 -1065.4835,-731.50843 -1064.8637,-725.24987 C -1064.244,-718.99128 -1063.5442,-711.10044 -1062.8498,-707.114 C -1062.1554,-703.12756 -1062.3351,-698.767 -1060.8359,-698.65059 C -1059.3265,-698.5334 -1059.7917,-699.20116 -1058.8219,-701.55747 C -1057.8522,-703.91379 -1057.4371,-709.69359 -1056.808,-714.57414 C -1056.1789,-719.4547 -1055.399,-728.03327 -1054.7941,-734.09913 C -1054.1892,-740.16498 -1053.3902,-749.30253 -1052.7802,-755.01326 C -1052.1701,-760.724 -1051.427,-768.19919 -1050.7662,-772.1716 C -1050.1054,-776.14398 -1050.8055,-780.62812 -1048.7523,-781.50963 C -1046.6991,-782.39115 -1048.3774,-782.37959 -1046.7384,-781.12377 C -1045.0993,-779.86792 -1045.3682,-775.36642 -1044.7244,-771.52847 C -1044.0806,-767.69054 -1043.3226,-760.65591 -1042.7105,-755.52775 C -1042.0984,-750.39961 -1041.2704,-742.4377 -1040.6578,-737.34043 C -1040.0452,-732.24319 -1039.2848,-725.36041 -1038.6439,-721.54552 C -1038.0029,-717.73063 -1037.7545,-713.49085 -1036.63,-711.89877 C -1035.5054,-710.30671 -1036.5267,-710.08028 -1034.616,-710.43247 C -1032.7054,-710.78468 -1033.2705,-714.1812 -1032.6021,-717.09516 C -1031.9337,-720.00911 -1031.1976,-725.65132 -1030.5882,-729.88029 C -1029.9788,-734.10926 -1029.1794,-740.85188 -1028.5742,-745.28935 C -1027.969,-749.72682 -1027.1883,-755.91069 -1026.5603,-759.46363 C -1025.9323,-763.01655 -1025.3811,-767.16359 -1024.5464,-768.98174 C -1023.7116,-770.79988 -1024.2294,-771.81829 -1022.5324,-771.73427 C -1020.8354,-771.65026 -1021.2281,-769.58251 -1020.5185,-767.464 C -1019.8089,-765.34546 -1019.1235,-760.95913 -1018.5046,-757.56 C -1017.8857,-754.16088 -1017.0619,-748.57053 -1016.4519,-744.80059 C -1015.8419,-741.03064 -1015.0577,-735.62524 -1014.438,-732.42704 C -1013.8182,-729.22884 -1013.1519,-725.34374 -1012.424,-723.47487 C -1011.6961,-721.60599 -1011.887,-719.97377 -1010.4101,-719.89915 C -1008.9332,-719.82452 -1009.1776,-720.8452 -1008.3962,-722.29153 C -1007.6148,-723.73784 -1007.0026,-727.02441 -1006.3822,-729.6745 C -1005.7619,-732.32459 -1004.9725,-736.84653 -1004.3683,-739.96436 C -1003.7641,-743.08218 -1002.9682,-747.66677 -1002.3544,-750.46001 C -1001.7406,-753.25324 -1001.0204,-756.78538 -1000.3404,-758.58899 C -999.6605,-760.3926 -999.5727,-762.25756 -998.3265,-762.52486 C -997.0804,-762.79216 -997.2186,-762.45303 -996.3126,-761.57304 C -995.4065,-760.69304 -994.928,-758.27473 -994.2986,-756.27378 C -993.6693,-754.27281 -992.8952,-750.72621 -992.2847,-748.22195 C -991.6742,-745.7177 -990.8472,-741.93968 -990.2321,-739.57848 C -989.6169,-737.21728 -988.8724,-734.12575 -988.2181,-732.47848 C -987.5639,-730.83121 -987.1954,-729.05833 -986.2042,-728.56834 C -985.213,-728.07835 -985.1634,-728.08562 -984.1903,-728.51688 C -983.217,-728.94817 -982.8177,-730.67097 -982.1763,-732.11834 C -981.5349,-733.56572 -980.7689,-736.24472 -980.1624,-738.18936 C -979.5559,-740.13398 -978.7558,-743.15827 -978.1485,-745.08355 C -977.5411,-747.00882 -976.7709,-749.58968 -976.1345,-751.02594 C -975.4981,-752.46221 -974.9415,-754.08729 -974.1206,-754.67883 C -973.2997,-755.27039 -972.9912,-755.47946 -972.1067,-755.29624 C -971.2222,-755.113 -970.75,-754.02477 -970.0927,-753.03247 C -969.4355,-752.04016 -968.6926,-750.08017 -968.0788,-748.63355 C -967.465,-747.18692 -966.6371,-744.89051 -966.0261,-743.38573 C -965.4152,-741.88095 -964.6384,-739.79086 -964.0122,-738.60094 C -963.3859,-737.41103 -962.7194,-736.02601 -961.9983,-735.43681 C -961.2771,-734.84763 -960.772,-734.46612 -959.9843,-734.51073 C -959.1966,-734.55533 -958.6357,-735.1859 -957.9704,-735.82268 C -957.3051,-736.45947 -956.5678,-737.80692 -955.9565,-738.83246 C -955.3451,-739.85801 -954.547,-741.54259 -953.9425,-742.66544 C -953.3381,-743.78828 -952.548,-745.39043 -951.9286,-746.31834 C -951.3092,-747.24624 -950.5807,-748.34562 -949.9147,-748.86507 C -949.2486,-749.38452 -948.6132,-749.82567 -947.9007,-749.86833 C -947.1883,-749.91101 -946.5445,-749.5805 -945.8868,-749.19949 C -945.2291,-748.8185 -944.4855,-747.92985 -943.8729,-747.24442 C -943.2602,-746.55899 -942.4689,-745.40383 -941.8589,-744.6205 C -941.2489,-743.83718 -940.4244,-742.69993 -939.8063,-742.02232 C -939.1881,-741.34472 -938.431,-740.50579 -937.7923,-740.09298 C -937.1537,-739.68016 -936.4343,-739.30419 -935.7784,-739.21834 C -935.1225,-739.13249 -934.4024,-739.26717 -933.7645,-739.47558 C -933.1265,-739.68401 -932.362,-740.23217 -931.7505,-740.65892 C -931.1391,-741.08565 -930.3408,-741.82553 -929.7366,-742.33102 C -929.1324,-742.8365 -928.3312,-743.57829 -927.7227,-744.02885 C -927.1142,-744.47939 -926.3295,-745.05146 -925.7087,-745.34081 C -925.088,-745.63014 -924.3205,-745.90173 -923.6948,-745.98392 C -923.0691,-746.0661 -922.2972,-746.00911 -921.6809,-745.90675 C -921.0645,-745.80439 -920.2762,-745.52741 -919.6669,-745.28935 C -919.0577,-745.05129 -918.263,-744.60508 -917.653,-744.31181 C -917.043,-744.01855 -916.2123,-743.59217 -915.6003,-743.33428 C -914.9884,-743.07639 -914.1959,-742.75694 -913.5864,-742.58827 C -912.9769,-742.41958 -912.1829,-742.25971 -911.5725,-742.2024 C -910.962,-742.14508 -910.1667,-742.15639 -909.5585,-742.2024 C -908.9504,-742.2484 -908.1498,-742.3955 -907.5446,-742.51108 C -906.9394,-742.62668 -906.1349,-742.83521 -905.5307,-742.97414 C -904.9265,-743.11305 -904.1216,-743.31768 -903.5167,-743.43717 C -902.9119,-743.55669 -902.1084,-743.69844 -901.5028,-743.7716 C -900.8973,-743.84476 -900.0941,-743.90284 -899.4889,-743.92595 C -898.8837,-743.94906 -898.0798,-743.94522 -897.475,-743.92595 C -896.8701,-743.90669 -896.0652,-743.83976 -895.461,-743.79733 C -894.8568,-743.75488 -894.0571,-743.68928 -893.4471,-743.64297 C -892.8371,-743.59667 -892.0047,-743.52323 -891.3944,-743.48862 C -890.7842,-743.45402 -889.9848,-743.42688 -889.3805,-743.41145 C -888.7762,-743.39602 -887.9709,-743.38573 -887.3666,-743.38573 C -886.7623,-743.38573 -885.9568,-743.40373 -885.3526,-743.41145 C -884.7484,-743.41917 -883.9429,-743.42947 -883.3387,-743.43717 C -882.7345,-743.44489 -881.929,-743.45905 -881.3248,-743.4629 C -880.7205,-743.46675 -879.3108,-743.4629 -879.3108,-743.4629"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#eeeeec;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.00000036, 3.00000036;stroke-dashoffset:0;stroke-opacity:1"
++ d="M -1280.4435,-803.8446 L -1280,-674.86212"
++ id="path6743"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#eeeeec;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3.00000042, 3.00000042;stroke-dashoffset:0;stroke-opacity:1"
++ d="M -1080.4435,-804.52837 L -1080,-672.56128"
++ id="path6745"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ xml:space="preserve"
++ style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#fce94f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ x="-971.45312"
++ y="-780.96594"
++ id="text6769"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ sodipodi:role="line"
++ id="tspan6771"
++ x="-971.45312"
++ y="-780.96594">replay</tspan></text>
++ <g
++ id="g6856"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <path
++ transform="translate(-3,-27)"
++ d="M -720,-737.63782 A 40,40 0 1 1 -800,-737.63782 A 40,40 0 1 1 -720,-737.63782 z"
++ sodipodi:ry="40"
++ sodipodi:rx="40"
++ sodipodi:cy="-737.63782"
++ sodipodi:cx="-760"
++ id="path6779"
++ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:6;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="ccc"
++ id="path6781"
++ d="M -776.34074,-774.94083 L -763,-764.63782 L -735,-780.63782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
++ <g
++ transform="translate(328.3863,114.30939)"
++ id="g6821">
++ <path
++ style="font-size:14px;fill:#cc0000"
++ id="path6803"
++ d="M -1087.4832,-867.42741 C -1090.0376,-867.42741 -1093.7749,-869.50861 -1097.4174,-869.50861 C -1101.0599,-869.50861 -1103.2355,-867.42741 -1103.6143,-867.14359 C -1103.9925,-866.85977 -1104.2296,-865.77217 -1103.0938,-866.10322 C -1101.9581,-866.43427 -1101.0126,-866.43427 -1099.2148,-866.43427 C -1097.4169,-866.43427 -1093.1124,-863.97433 -1088.7601,-863.97433 C -1084.4079,-863.97433 -1080.7659,-867.33248 -1079.9617,-868.51546 C -1079.1574,-869.69845 -1079.9144,-870.07673 -1080.5293,-869.79243 C -1081.1447,-869.50861 -1085.1177,-867.42741 -1087.4832,-867.42741 z" />
++ <path
++ style="font-size:14px;fill:#73d216"
++ id="path6805"
++ d="M -1076.3863,-860.94721 C -1079.0701,-860.94721 -1082.9963,-863.02794 -1086.823,-863.02794 C -1090.6496,-863.02794 -1092.9358,-860.94721 -1093.3334,-860.66292 C -1093.731,-860.37862 -1093.9799,-859.2915 -1092.787,-859.62255 C -1091.5941,-859.9536 -1090.6005,-859.9536 -1088.712,-859.9536 C -1086.8234,-859.9536 -1082.3007,-857.49365 -1077.7289,-857.49365 C -1073.157,-857.49365 -1069.3299,-860.85182 -1068.4851,-862.03433 C -1067.6402,-863.21731 -1068.4355,-863.59605 -1069.0815,-863.31176 C -1069.7276,-863.02747 -1073.9013,-860.94721 -1076.3863,-860.94721 z" />
++ <path
++ style="font-size:14px;fill:#204a87"
++ id="path6807"
++ d="M -1091.8302,-853.79642 C -1094.6132,-853.79642 -1098.6849,-856.04479 -1102.6532,-856.04479 C -1106.6215,-856.04479 -1108.9927,-853.79642 -1109.405,-853.48993 C -1109.8172,-853.18344 -1110.0751,-852.00849 -1108.8383,-852.36645 C -1107.601,-852.72394 -1106.5705,-852.72394 -1104.6121,-852.72394 C -1102.6537,-852.72394 -1097.9633,-850.06707 -1093.2215,-850.06707 C -1088.4801,-850.06707 -1084.5118,-853.69442 -1083.6353,-854.97184 C -1082.7588,-856.24928 -1083.5838,-856.65777 -1084.2539,-856.35129 C -1084.9241,-856.04479 -1089.2532,-853.79642 -1091.8302,-853.79642 z" />
++ </g>
++ </g>
++ <g
++ id="g6836"
++ transform="translate(11,0.7493286)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <g
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ transform="matrix(0.5209012,0,0,0.5209012,-780.25169,-372.16062)"
++ id="g6765">
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:3.83949971;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M -1734.3184,-760.78564 C -1734.3184,-760.78564 -1735.7141,-760.78948 -1736.3184,-760.78564 C -1736.9226,-760.78179 -1737.7454,-760.76213 -1738.3497,-760.75439 C -1738.9538,-760.74669 -1739.7455,-760.73085 -1740.3497,-760.72314 C -1740.9538,-760.71542 -1741.7766,-760.72317 -1742.3809,-760.72314 C -1742.9852,-760.72314 -1743.7766,-760.7077 -1744.3809,-760.72314 C -1744.9852,-760.73857 -1745.8019,-760.78231 -1746.4121,-760.81689 C -1747.0225,-760.8515 -1747.8334,-760.92685 -1748.4434,-760.97314 C -1749.0534,-761.01945 -1749.8704,-761.08695 -1750.4747,-761.12939 C -1751.0788,-761.17182 -1751.8698,-761.23516 -1752.4747,-761.25439 C -1753.0795,-761.27366 -1753.9007,-761.27753 -1754.5059,-761.25439 C -1755.1111,-761.23128 -1755.9004,-761.17128 -1756.5059,-761.09814 C -1757.1115,-761.02498 -1757.9323,-760.87393 -1758.5371,-760.75439 C -1759.1421,-760.6349 -1759.933,-760.42455 -1760.5371,-760.28564 C -1761.1413,-760.14671 -1761.932,-759.96375 -1762.5371,-759.84814 C -1763.1423,-759.73256 -1763.9603,-759.58163 -1764.5684,-759.53564 C -1765.1766,-759.48963 -1765.9579,-759.47831 -1766.5684,-759.53564 C -1767.1788,-759.59295 -1767.9901,-759.74194 -1768.5997,-759.91064 C -1769.2092,-760.07931 -1769.9877,-760.40272 -1770.5997,-760.66064 C -1771.2116,-760.91853 -1772.0522,-761.33615 -1772.6621,-761.62939 C -1773.2721,-761.92266 -1774.053,-762.36011 -1774.6621,-762.59814 C -1775.2715,-762.8362 -1776.077,-763.12077 -1776.6934,-763.22314 C -1777.3097,-763.3255 -1778.0677,-763.39908 -1778.6934,-763.31689 C -1779.3191,-763.2347 -1780.1039,-762.94994 -1780.7247,-762.66064 C -1781.3455,-762.37129 -1782.1162,-761.7987 -1782.7247,-761.34814 C -1783.3332,-760.89758 -1784.1517,-760.16613 -1784.7559,-759.66064 C -1785.3601,-759.15515 -1786.1445,-758.3999 -1786.7559,-757.97314 C -1787.3674,-757.54639 -1788.1179,-756.99405 -1788.7559,-756.78564 C -1789.3938,-756.57723 -1790.1312,-756.44979 -1790.7871,-756.53564 C -1791.443,-756.62149 -1792.1485,-756.99783 -1792.7871,-757.41064 C -1793.4258,-757.82345 -1794.2002,-758.67056 -1794.8184,-759.34814 C -1795.4365,-760.02575 -1796.2397,-761.15857 -1796.8497,-761.94189 C -1797.4597,-762.72522 -1798.2682,-763.88148 -1798.8809,-764.56689 C -1799.4935,-765.25232 -1800.2232,-766.15466 -1800.8809,-766.53564 C -1801.5386,-766.91665 -1802.1997,-767.2346 -1802.9121,-767.19189 C -1803.6247,-767.14923 -1804.2461,-766.71134 -1804.9121,-766.19189 C -1805.5781,-765.67244 -1806.324,-764.55731 -1806.9434,-763.62939 C -1807.5628,-762.70148 -1808.339,-761.096 -1808.9434,-759.97314 C -1809.5479,-758.85029 -1810.3632,-757.18617 -1810.9747,-756.16064 C -1811.586,-755.1351 -1812.3093,-753.79746 -1812.9747,-753.16064 C -1813.64,-752.52386 -1814.187,-751.89277 -1814.9747,-751.84814 C -1815.7623,-751.80353 -1816.2847,-752.16523 -1817.0059,-752.75439 C -1817.727,-753.34359 -1818.3796,-754.7207 -1819.0059,-755.91064 C -1819.6321,-757.10056 -1820.4262,-759.21839 -1821.0371,-760.72314 C -1821.6481,-762.22792 -1822.4858,-764.49525 -1823.0997,-765.94189 C -1823.7135,-767.38851 -1824.5009,-769.3195 -1825.0997,-770.34814 C -1825.4927,-771.02327 -1826.6207,-772.33796 -1827.5226,-772.36508 C -1828.4773,-772.3938 -1829.8316,-770.51363 -1830.2247,-769.78564 C -1830.7902,-768.73841 -1831.6108,-766.82601 -1832.2247,-765.37939 C -1832.8384,-763.93277 -1833.6762,-761.63417 -1834.2871,-760.12939 C -1834.8981,-758.6246 -1835.6922,-756.53806 -1836.3184,-755.34814 C -1836.9447,-754.15822 -1837.5973,-752.78109 -1838.3184,-752.19189 C -1839.0396,-751.60269 -1839.5307,-751.20978 -1840.3184,-751.25439 C -1841.1061,-751.29898 -1841.6843,-751.93011 -1842.3497,-752.56689 C -1843.0149,-753.20367 -1843.7383,-754.5726 -1844.3497,-755.59814 C -1844.9611,-756.62369 -1845.7764,-758.28779 -1846.3809,-759.41064 C -1846.9853,-760.53345 -1847.7615,-762.13898 -1848.3809,-763.06689 C -1849.0003,-763.99477 -1849.7462,-765.10994 -1850.4121,-765.62939 C -1851.0782,-766.14886 -1851.6996,-766.58673 -1852.4121,-766.62939 C -1853.1245,-766.67205 -1853.7857,-766.3229 -1854.4434,-765.94189 C -1855.1011,-765.56093 -1855.8308,-764.68982 -1856.4434,-764.00439 C -1857.0561,-763.31893 -1857.8334,-762.16272 -1858.4434,-761.37939 C -1859.0534,-760.59609 -1859.8878,-759.46325 -1860.5059,-758.78564 C -1861.1241,-758.10802 -1861.8985,-757.26095 -1862.5371,-756.84814 C -1863.1757,-756.43534 -1863.8813,-756.05899 -1864.5371,-755.97314 C -1865.1931,-755.88731 -1865.8993,-756.01473 -1866.5371,-756.22314 C -1867.1752,-756.43156 -1867.9569,-756.98389 -1868.5684,-757.41064 C -1869.1798,-757.83735 -1869.9642,-758.59265 -1870.5684,-759.09814 C -1871.1726,-759.60365 -1871.9911,-760.33508 -1872.5997,-760.78564 C -1873.2081,-761.23616 -1873.9788,-761.80879 -1874.5997,-762.09814 C -1875.2204,-762.38746 -1876.0052,-762.64095 -1876.6309,-762.72314 C -1877.2566,-762.80529 -1878.0146,-762.763 -1878.6309,-762.66064 C -1879.2473,-762.55829 -1880.0528,-762.2737 -1880.6621,-762.03564 C -1881.2713,-761.79756 -1882.0522,-761.36016 -1882.6621,-761.06689 C -1883.2721,-760.77361 -1884.1127,-760.35603 -1884.7247,-760.09814 C -1885.3366,-759.84024 -1886.1151,-759.51681 -1886.7247,-759.34814 C -1887.3342,-759.17946 -1888.1455,-758.9992 -1888.7559,-758.94189 C -1889.3664,-758.88458 -1890.1477,-758.89588 -1890.7559,-758.94189 C -1891.364,-758.9879 -1892.182,-759.13881 -1892.7871,-759.25439 C -1893.3923,-759.36996 -1894.183,-759.58421 -1894.7871,-759.72314 C -1895.3913,-759.86207 -1896.1822,-760.0724 -1896.7871,-760.19189 C -1897.392,-760.31139 -1898.2128,-760.46248 -1898.8184,-760.53564 C -1899.4239,-760.60879 -1900.2132,-760.66878 -1900.8184,-760.69189 C -1901.4236,-760.71499 -1902.2448,-760.71116 -1902.8497,-760.69189 C -1903.4545,-760.67262 -1904.2455,-760.60932 -1904.8497,-760.56689 C -1905.4538,-760.52447 -1906.2709,-760.45695 -1906.8809,-760.41064 C -1907.491,-760.36437 -1908.3018,-760.289 -1908.9121,-760.25439 C -1909.5224,-760.21976 -1910.3391,-760.17607 -1910.9434,-760.16064 C -1911.5477,-760.14522 -1912.3391,-760.12939 -1912.9434,-760.12939 C -1913.5477,-760.12938 -1914.3705,-760.15292 -1914.9747,-760.16064 C -1915.5788,-760.16837 -1916.3705,-760.18419 -1916.9747,-760.19189 C -1917.5789,-760.19959 -1918.4017,-760.21929 -1919.0059,-760.22314 C -1919.6102,-760.227 -1935.4371,-760.11742 -1935.4371,-760.11742"
++ id="path6761"
++ sodipodi:nodetypes="cssssssssssssssssssssssssssssssssssssssssssssszsssssssssssssssssssssssssssssssssssssssssssssc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="czzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:3.83949971;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ id="path6763"
++ d="M -1735.0059,-759.21729 C -1735.0059,-759.21729 -1733.6132,-778.57415 -1732.992,-785.27635 C -1732.3707,-791.97855 -1731.7387,-800.0761 -1730.978,-803.90096 C -1730.2174,-807.72584 -1730.0717,-810.93696 -1728.9641,-810.8209 C -1728.0395,-810.72401 -1727.7249,-808.23488 -1726.9502,-804.80134 C -1726.1754,-801.36779 -1725.5558,-793.90534 -1724.9362,-787.87454 C -1724.3167,-781.84375 -1723.5323,-771.62428 -1722.9223,-764.59374 C -1722.3123,-757.5632 -1721.4894,-747.26282 -1720.8696,-741.00426 C -1720.2499,-734.74567 -1719.5501,-726.85483 -1718.8557,-722.86839 C -1718.1613,-718.88195 -1718.341,-714.52139 -1716.8418,-714.40498 C -1715.3324,-714.28779 -1715.7976,-714.95555 -1714.8278,-717.31186 C -1713.8581,-719.66818 -1713.443,-725.44798 -1712.8139,-730.32853 C -1712.1848,-735.20909 -1711.4049,-743.78766 -1710.8,-749.85352 C -1710.1951,-755.91937 -1709.3961,-765.05692 -1708.7861,-770.76765 C -1708.176,-776.47839 -1707.4329,-783.95358 -1706.7721,-787.92599 C -1706.1113,-791.89837 -1706.8114,-796.38251 -1704.7582,-797.26402 C -1702.705,-798.14554 -1704.3833,-798.13398 -1702.7443,-796.87816 C -1701.1052,-795.62231 -1701.3741,-791.12081 -1700.7303,-787.28286 C -1700.0865,-783.44493 -1699.3285,-776.4103 -1698.7164,-771.28214 C -1698.1043,-766.154 -1697.2763,-758.19209 -1696.6637,-753.09482 C -1696.0511,-747.99758 -1695.2907,-741.1148 -1694.6498,-737.29991 C -1694.0088,-733.48502 -1693.7604,-729.24524 -1692.6359,-727.65316 C -1691.5113,-726.0611 -1692.5326,-725.83467 -1690.6219,-726.18686 C -1688.7113,-726.53907 -1689.2764,-729.93559 -1688.608,-732.84955 C -1687.9396,-735.7635 -1687.2035,-741.40571 -1686.5941,-745.63468 C -1685.9847,-749.86365 -1685.1853,-756.60627 -1684.5801,-761.04374 C -1683.9749,-765.48121 -1683.1942,-771.66508 -1682.5662,-775.21802 C -1681.9382,-778.77094 -1681.387,-782.91798 -1680.5523,-784.73613 C -1679.7175,-786.55427 -1680.2353,-787.57268 -1678.5383,-787.48866 C -1676.8413,-787.40465 -1677.234,-785.3369 -1676.5244,-783.21839 C -1675.8148,-781.09985 -1675.1294,-776.71352 -1674.5105,-773.31439 C -1673.8916,-769.91527 -1673.0678,-764.32492 -1672.4578,-760.55498 C -1671.8478,-756.78503 -1671.0636,-751.37963 -1670.4439,-748.18143 C -1669.8241,-744.98323 -1669.1578,-741.09813 -1668.4299,-739.22926 C -1667.702,-737.36038 -1667.8929,-735.72816 -1666.416,-735.65354 C -1664.9391,-735.57891 -1665.1835,-736.59959 -1664.4021,-738.04592 C -1663.6207,-739.49223 -1663.0085,-742.7788 -1662.3881,-745.42889 C -1661.7678,-748.07898 -1660.9784,-752.60092 -1660.3742,-755.71875 C -1659.77,-758.83657 -1658.9741,-763.42116 -1658.3603,-766.2144 C -1657.7465,-769.00763 -1657.0263,-772.53977 -1656.3463,-774.34338 C -1655.6664,-776.14699 -1655.5786,-778.01195 -1654.3324,-778.27925 C -1653.0863,-778.54655 -1653.2245,-778.20742 -1652.3185,-777.32743 C -1651.4124,-776.44743 -1650.9339,-774.02912 -1650.3045,-772.02817 C -1649.6752,-770.0272 -1648.9011,-766.4806 -1648.2906,-763.97634 C -1647.6801,-761.47209 -1646.8531,-757.69407 -1646.238,-755.33287 C -1645.6228,-752.97167 -1644.8783,-749.88014 -1644.224,-748.23287 C -1643.5698,-746.5856 -1643.2013,-744.81272 -1642.2101,-744.32273 C -1641.2189,-743.83274 -1641.1693,-743.84001 -1640.1962,-744.27127 C -1639.2229,-744.70256 -1638.8236,-746.42536 -1638.1822,-747.87273 C -1637.5408,-749.32011 -1636.7748,-751.99911 -1636.1683,-753.94375 C -1635.5618,-755.88837 -1634.7617,-758.91266 -1634.1544,-760.83794 C -1633.547,-762.76321 -1632.7768,-765.34407 -1632.1404,-766.78033 C -1631.504,-768.2166 -1630.9474,-769.84168 -1630.1265,-770.43322 C -1629.3056,-771.02478 -1628.9971,-771.23385 -1628.1126,-771.05063 C -1627.2281,-770.86739 -1626.7559,-769.77916 -1626.0986,-768.78686 C -1625.4414,-767.79455 -1624.6985,-765.83456 -1624.0847,-764.38794 C -1623.4709,-762.94131 -1622.643,-760.6449 -1622.032,-759.14012 C -1621.4211,-757.63534 -1620.6443,-755.54525 -1620.0181,-754.35533 C -1619.3918,-753.16542 -1618.7253,-751.7804 -1618.0042,-751.1912 C -1617.283,-750.60202 -1616.7779,-750.22051 -1615.9902,-750.26512 C -1615.2025,-750.30972 -1614.6416,-750.94029 -1613.9763,-751.57707 C -1613.311,-752.21386 -1612.5737,-753.56131 -1611.9624,-754.58685 C -1611.351,-755.6124 -1610.5529,-757.29698 -1609.9484,-758.41983 C -1609.344,-759.54267 -1608.5539,-761.14482 -1607.9345,-762.07273 C -1607.3151,-763.00063 -1606.5866,-764.10001 -1605.9206,-764.61946 C -1605.2545,-765.13891 -1604.6191,-765.58006 -1603.9066,-765.62272 C -1603.1942,-765.6654 -1602.5504,-765.33489 -1601.8927,-764.95388 C -1601.235,-764.57289 -1600.4914,-763.68424 -1599.8788,-762.99881 C -1599.2661,-762.31338 -1598.4748,-761.15822 -1597.8648,-760.37489 C -1597.2548,-759.59157 -1596.4303,-758.45432 -1595.8122,-757.77671 C -1595.194,-757.09911 -1594.4369,-756.26018 -1593.7982,-755.84737 C -1593.1596,-755.43455 -1592.4402,-755.05858 -1591.7843,-754.97273 C -1591.1284,-754.88688 -1590.4083,-755.02156 -1589.7704,-755.22997 C -1589.1324,-755.4384 -1588.3679,-755.98656 -1587.7564,-756.41331 C -1587.145,-756.84004 -1586.3467,-757.57992 -1585.7425,-758.08541 C -1585.1383,-758.59089 -1584.3371,-759.33268 -1583.7286,-759.78324 C -1583.1201,-760.23378 -1582.3354,-760.80585 -1581.7146,-761.0952 C -1581.0939,-761.38453 -1580.3264,-761.65612 -1579.7007,-761.73831 C -1579.075,-761.82049 -1578.3031,-761.7635 -1577.6868,-761.66114 C -1577.0704,-761.55878 -1576.2821,-761.2818 -1575.6728,-761.04374 C -1575.0636,-760.80568 -1574.2689,-760.35947 -1573.6589,-760.0662 C -1573.0489,-759.77294 -1572.2182,-759.34656 -1571.6062,-759.08867 C -1570.9943,-758.83078 -1570.2018,-758.51133 -1569.5923,-758.34266 C -1568.9828,-758.17397 -1568.1888,-758.0141 -1567.5784,-757.95679 C -1566.9679,-757.89947 -1566.1726,-757.91078 -1565.5644,-757.95679 C -1564.9563,-758.00279 -1564.1557,-758.14989 -1563.5505,-758.26547 C -1562.9453,-758.38107 -1562.1408,-758.5896 -1561.5366,-758.72853 C -1560.9324,-758.86744 -1560.1275,-759.07207 -1559.5226,-759.19156 C -1558.9178,-759.31108 -1558.1143,-759.45283 -1557.5087,-759.52599 C -1556.9032,-759.59915 -1556.1,-759.65723 -1555.4948,-759.68034 C -1554.8896,-759.70345 -1554.0857,-759.69961 -1553.4809,-759.68034 C -1552.876,-759.66108 -1552.0711,-759.59415 -1551.4669,-759.55172 C -1550.8627,-759.50927 -1550.063,-759.44367 -1549.453,-759.39736 C -1548.843,-759.35106 -1548.0106,-759.27762 -1547.4003,-759.24301 C -1546.7901,-759.20841 -1545.9907,-759.18127 -1545.3864,-759.16584 C -1544.7821,-759.15041 -1543.9768,-759.14012 -1543.3725,-759.14012 C -1542.7682,-759.14012 -1541.9627,-759.15812 -1541.3585,-759.16584 C -1540.7543,-759.17356 -1539.9488,-759.18386 -1539.3446,-759.19156 C -1538.7404,-759.19928 -1537.9349,-759.21344 -1537.3307,-759.21729 C -1536.7264,-759.22114 -1535.3167,-759.21729 -1535.3167,-759.21729"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ </g>
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/clocks.png"
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#204a87;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
++ x="-1790"
++ y="-787.63782"
++ id="text6775"><tspan
++ style="font-size:12px"
++ sodipodi:role="line"
++ id="tspan6777"
++ x="-1790"
++ y="-787.63782">100 ms stream</tspan></text>
++ <rect
++ y="-807.38715"
++ x="-1800"
++ height="69.547119"
++ width="230"
++ id="rect6834"
++ style="opacity:1;fill:#3465a4;fill-opacity:0;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
++ </g>
++ </g>
++</svg>
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/manual/diagrams-general.svg gstreamer-0.10.23/docs/manual/diagrams-general.svg
+--- gstreamer-0.10.23.orig/docs/manual/diagrams-general.svg 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/manual/diagrams-general.svg 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,14211 @@
++<?xml version="1.0" encoding="UTF-8" standalone="no"?>
++<!-- Created with Inkscape (http://www.inkscape.org/) -->
++<svg
++ xmlns:dc="http://purl.org/dc/elements/1.1/"
++ xmlns:cc="http://creativecommons.org/ns#"
++ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
++ xmlns:svg="http://www.w3.org/2000/svg"
++ xmlns="http://www.w3.org/2000/svg"
++ xmlns:xlink="http://www.w3.org/1999/xlink"
++ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
++ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
++ width="744.09448819"
++ height="1052.3622047"
++ id="svg2"
++ sodipodi:version="0.32"
++ inkscape:version="0.46"
++ sodipodi:docname="template.svg"
++ inkscape:output_extension="org.inkscape.output.svg.inkscape">
++ <sodipodi:namedview
++ id="base"
++ pagecolor="#ffffff"
++ bordercolor="#000000"
++ borderopacity="0.61568627"
++ gridtolerance="10000"
++ guidetolerance="10"
++ objecttolerance="10"
++ inkscape:pageopacity="1"
++ inkscape:pageshadow="2"
++ inkscape:zoom="0.31474975"
++ inkscape:cx="757.68549"
++ inkscape:cy="1480.7341"
++ inkscape:document-units="px"
++ inkscape:current-layer="layer1"
++ showgrid="true"
++ showguides="true"
++ inkscape:guide-bbox="true"
++ inkscape:window-width="1398"
++ inkscape:window-height="982"
++ inkscape:window-x="0"
++ inkscape:window-y="24"
++ showborder="false"
++ inkscape:showpageshadow="false"
++ borderlayer="false"
++ inkscape:snap-global="true">
++ <inkscape:grid
++ type="xygrid"
++ id="grid5665"
++ visible="false"
++ enabled="true"
++ color="#0000ff"
++ opacity="0.04705882"
++ empcolor="#0000ff"
++ empopacity="0.14901961" />
++ <sodipodi:guide
++ orientation="1,0"
++ position="160.44492,2126.2924"
++ id="guide6187" />
++ <sodipodi:guide
++ orientation="1,0"
++ position="741.8592,2137.4123"
++ id="guide6189" />
++ </sodipodi:namedview>
++ <defs
++ id="defs4">
++ <linearGradient
++ id="linearGradient3690">
++ <stop
++ style="stop-color:white;stop-opacity:1;"
++ offset="0"
++ id="stop3692" />
++ <stop
++ style="stop-color:white;stop-opacity:0.25098041;"
++ offset="1"
++ id="stop7595" />
++ </linearGradient>
++ <marker
++ style="overflow:visible;"
++ id="Arrow2Mend"
++ refX="0.0"
++ refY="0.0"
++ orient="auto"
++ inkscape:stockid="Arrow2Mend">
++ <path
++ transform="scale(0.6) rotate(180) translate(0,0)"
++ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
++ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
++ id="path3513" />
++ </marker>
++ <marker
++ style="overflow:visible;"
++ id="Arrow2Lend"
++ refX="0.0"
++ refY="0.0"
++ orient="auto"
++ inkscape:stockid="Arrow2Lend">
++ <path
++ transform="scale(1.1) rotate(180) translate(1,0)"
++ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
++ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
++ id="path3507" />
++ </marker>
++ <inkscape:perspective
++ id="perspective10"
++ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
++ inkscape:vp_z="744.09448 : 526.18109 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 526.18109 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <marker
++ style="overflow:visible;"
++ id="Arrow2Mendq"
++ refX="0.0"
++ refY="0.0"
++ orient="auto"
++ inkscape:stockid="Arrow2Mendq">
++ <path
++ transform="scale(0.6) rotate(180) translate(0,0)"
++ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
++ style="stroke-linejoin:round;font-size:12.0;fill-rule:evenodd;stroke:#204a87;stroke-width:0.62500000;fill:#204a87"
++ id="path5832" />
++ </marker>
++ <radialGradient
++ r="17.576654"
++ fy="35.373093"
++ fx="22.930462"
++ cy="35.373093"
++ cx="22.930462"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.333333,2.658463e-16,23.58206)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2252"
++ xlink:href="#linearGradient4946"
++ inkscape:collect="always" />
++ <linearGradient
++ id="linearGradient4182">
++ <stop
++ style="stop-color:#a36d18;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop4184" />
++ <stop
++ style="stop-color:#d79020;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop4186" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4192">
++ <stop
++ style="stop-color:#e9b96e;stop-opacity:1;"
++ offset="0"
++ id="stop4194" />
++ <stop
++ style="stop-color:#f1d19e;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop4196" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4210">
++ <stop
++ style="stop-color:#eaba6f;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop4212" />
++ <stop
++ style="stop-color:#b97a1b;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop4214" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4222">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop4224" />
++ <stop
++ style="stop-color:#ffffff;stop-opacity:0.68639052;"
++ offset="1.0000000"
++ id="stop4226" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient4946">
++ <stop
++ style="stop-color:#000000;stop-opacity:1;"
++ offset="0"
++ id="stop4948" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0;"
++ offset="1"
++ id="stop4950" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4979">
++ <stop
++ style="stop-color:#fbf0e0;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop4981" />
++ <stop
++ style="stop-color:#f0ce99;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop4983" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient4987">
++ <stop
++ style="stop-color:#a0670c;stop-opacity:1;"
++ offset="0"
++ id="stop4989" />
++ <stop
++ style="stop-color:#a0670c;stop-opacity:0;"
++ offset="1"
++ id="stop4991" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4995">
++ <stop
++ style="stop-color:#de9523;stop-opacity:1;"
++ offset="0"
++ id="stop4997" />
++ <stop
++ style="stop-color:#a36d18;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop4999" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2869">
++ <stop
++ id="stop2871"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop2873"
++ offset="1.0000000"
++ style="stop-color:#cccccc;stop-opacity:1.0000000;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2884"
++ inkscape:collect="always">
++ <stop
++ id="stop2886"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop2888"
++ offset="1"
++ style="stop-color:#000000;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient5048">
++ <stop
++ id="stop5050"
++ offset="0"
++ style="stop-color:black;stop-opacity:0;" />
++ <stop
++ style="stop-color:black;stop-opacity:1;"
++ offset="0.5"
++ id="stop5056" />
++ <stop
++ id="stop5052"
++ offset="1"
++ style="stop-color:black;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient5060"
++ inkscape:collect="always">
++ <stop
++ id="stop5062"
++ offset="0"
++ style="stop-color:black;stop-opacity:1;" />
++ <stop
++ id="stop5064"
++ offset="1"
++ style="stop-color:black;stop-opacity:0;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective3711"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <linearGradient
++ y2="39.684914"
++ x2="34.534348"
++ y1="12.284524"
++ x1="14.462892"
++ gradientTransform="matrix(1.241935,0,0,1.241935,-5.027508,-7.208988)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3760"
++ xlink:href="#linearGradient3264"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="matrix(0.200685,0.000000,0.000000,0.200685,-0.585758,-1.050787)"
++ y2="248.6311"
++ x2="153.0005"
++ y1="15.4238"
++ x1="99.7773"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient53551"
++ xlink:href="#aigrd1"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="248.6311"
++ x2="153.0005"
++ y1="15.4238"
++ x1="99.7773"
++ gradientUnits="userSpaceOnUse"
++ id="aigrd1">
++ <stop
++ id="stop53300"
++ style="stop-color:#184375"
++ offset="0" />
++ <stop
++ id="stop53302"
++ style="stop-color:#C8BDDC"
++ offset="1" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2300">
++ <stop
++ style="stop-color:#000000;stop-opacity:0.32673267;"
++ offset="0.0000000"
++ id="stop2302" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0;"
++ offset="1"
++ id="stop2304" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3264">
++ <stop
++ id="stop3266"
++ offset="0"
++ style="stop-color:#c9c9c9;stop-opacity:1;" />
++ <stop
++ style="stop-color:#f8f8f8;stop-opacity:1;"
++ offset="0.25"
++ id="stop3276" />
++ <stop
++ style="stop-color:#e2e2e2;stop-opacity:1;"
++ offset="0.5"
++ id="stop3272" />
++ <stop
++ id="stop3274"
++ offset="0.75"
++ style="stop-color:#b0b0b0;stop-opacity:1;" />
++ <stop
++ id="stop3268"
++ offset="1"
++ style="stop-color:#c9c9c9;stop-opacity:1;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective3815"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <linearGradient
++ id="linearGradient2315"
++ inkscape:collect="always">
++ <stop
++ id="stop2317"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop2319"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2072"
++ inkscape:collect="always">
++ <stop
++ id="stop2074"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop2076"
++ offset="1"
++ style="stop-color:#000000;stop-opacity:0;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective3911"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <linearGradient
++ id="linearGradient7054"
++ inkscape:collect="always">
++ <stop
++ id="stop7056"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop7058"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <radialGradient
++ gradientUnits="userSpaceOnUse"
++ fy="22.6138"
++ fx="9.3418"
++ r="14.1515"
++ cy="22.6138"
++ cx="9.3418"
++ id="aigrd4">
++ <stop
++ id="stop6452"
++ style="stop-color:#767676"
++ offset="0" />
++ <stop
++ id="stop6454"
++ style="stop-color:#484848"
++ offset="1" />
++ </radialGradient>
++ <linearGradient
++ id="linearGradient7069"
++ inkscape:collect="always">
++ <stop
++ id="stop7071"
++ offset="0"
++ style="stop-color:#888a85;stop-opacity:1;" />
++ <stop
++ id="stop7073"
++ offset="1"
++ style="stop-color:#888a85;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7079"
++ inkscape:collect="always">
++ <stop
++ id="stop7081"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop7083"
++ offset="1"
++ style="stop-color:#000000;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7087">
++ <stop
++ id="stop7089"
++ offset="0"
++ style="stop-color:#888a85;stop-opacity:1;" />
++ <stop
++ id="stop7091"
++ offset="1"
++ style="stop-color:#b8b9b6;stop-opacity:1;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7138"
++ inkscape:collect="always">
++ <stop
++ id="stop7140"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop7142"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective3968"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <linearGradient
++ id="linearGradient2245">
++ <stop
++ id="stop2247"
++ offset="0.0000000"
++ style="stop-color:#dde1d9;stop-opacity:1.0000000;" />
++ <stop
++ id="stop2249"
++ offset="1.0000000"
++ style="stop-color:#cacdc6;stop-opacity:1.0000000;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2253">
++ <stop
++ id="stop2255"
++ offset="0.0000000"
++ style="stop-color:#8f8f8f;stop-opacity:1.0000000;" />
++ <stop
++ id="stop2257"
++ offset="1.0000000"
++ style="stop-color:#494949;stop-opacity:1.0000000;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2415"
++ inkscape:collect="always">
++ <stop
++ id="stop2417"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop2419"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2454"
++ inkscape:collect="always">
++ <stop
++ id="stop2456"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop2458"
++ offset="1"
++ style="stop-color:#000000;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2667">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop2669" />
++ <stop
++ style="stop-color:#fcfcff;stop-opacity:0.0000000;"
++ offset="1.0000000"
++ id="stop2671" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2675">
++ <stop
++ style="stop-color:#5b5b97;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop2677" />
++ <stop
++ style="stop-color:#1b1b43;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop2679" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient2683">
++ <stop
++ style="stop-color:#000000;stop-opacity:1;"
++ offset="0"
++ id="stop2685" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0;"
++ offset="1"
++ id="stop2687" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2701">
++ <stop
++ style="stop-color:#585956;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop2703" />
++ <stop
++ style="stop-color:#bbbeb8;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop2705" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2711">
++ <stop
++ style="stop-color:#909090;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop2713" />
++ <stop
++ style="stop-color:#bebebe;stop-opacity:0.0000000;"
++ offset="1.0000000"
++ id="stop2715" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient2321">
++ <stop
++ style="stop-color:#7b7f7a;stop-opacity:1;"
++ offset="0"
++ id="stop2323" />
++ <stop
++ style="stop-color:#7b7f7a;stop-opacity:0;"
++ offset="1"
++ id="stop2325" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2329">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop2331" />
++ <stop
++ style="stop-color:#ffffff;stop-opacity:0.0000000;"
++ offset="1.0000000"
++ id="stop2333" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective4076"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <linearGradient
++ id="linearGradient19149">
++ <stop
++ id="stop19151"
++ offset="0.0000000"
++ style="stop-color:#adadad;stop-opacity:1.0000000;" />
++ <stop
++ id="stop19153"
++ offset="1.0000000"
++ style="stop-color:#747474;stop-opacity:1.0000000;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient19270">
++ <stop
++ style="stop-color:#aaaaaa;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop19272" />
++ <stop
++ style="stop-color:#505050;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop19274" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient19474">
++ <stop
++ id="stop19476"
++ offset="0.0000000"
++ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
++ <stop
++ id="stop19478"
++ offset="1.0000000"
++ style="stop-color:#939393;stop-opacity:1.0000000;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2497">
++ <stop
++ id="stop2499"
++ offset="0.0000000"
++ style="stop-color:#ffffff;stop-opacity:0.60824740;" />
++ <stop
++ id="stop2501"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective4196"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <linearGradient
++ id="linearGradient3340">
++ <stop
++ id="stop3342"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop3344"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0.62886596;" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient2691">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1"
++ offset="0"
++ id="stop2693" />
++ <stop
++ style="stop-color:#d3d7cf"
++ offset="1"
++ id="stop2695" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient5075">
++ <stop
++ id="stop5077"
++ offset="0"
++ style="stop-color:#adb0a8;stop-opacity:1;" />
++ <stop
++ id="stop5079"
++ offset="1"
++ style="stop-color:#464744;stop-opacity:1" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2584">
++ <stop
++ id="stop2586"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop2588"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2684">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop2686" />
++ <stop
++ style="stop-color:#000000;stop-opacity:1;"
++ offset="1"
++ id="stop2688" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective4294"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,186.6949)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2831"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(-4e-4,-26.09426)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2825"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-145.0004,-97.0943)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2806"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(133,70.99999)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2797"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-12,0)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2795"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-12,0)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2793"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2791"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(133,70.99999)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2753"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-12,0)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2751"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2749"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1,0,0,0.536723,-1.44832e-12,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2747"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1,0,0,0.536723,4.579205e-13,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2745"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(133,70.99999)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4441"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-12,0)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2731"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2729"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1,0,0,0.536723,-1.432388e-12,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2727"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1,0,0,0.536723,4.526469e-13,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2725"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,-1.416456e-12,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2139"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,4.473733e-13,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2137"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(133.0000,70.99999)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2124"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-12.00000,0.000000)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2122"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2112"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <linearGradient
++ id="linearGradient8662"
++ inkscape:collect="always">
++ <stop
++ id="stop8664"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop8666"
++ offset="1"
++ style="stop-color:#000000;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3081"
++ inkscape:collect="always">
++ <stop
++ id="stop3083"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop3085"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient2679">
++ <stop
++ style="stop-color:#f7f7f7;stop-opacity:1"
++ offset="0"
++ id="stop2681" />
++ <stop
++ style="stop-color:#ccd0c7;stop-opacity:1"
++ offset="1"
++ id="stop2683" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2697">
++ <stop
++ style="stop-color:#babdb6"
++ offset="0"
++ id="stop2699" />
++ <stop
++ style="stop-color:#555753"
++ offset="1"
++ id="stop2701" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4414">
++ <stop
++ id="stop4416"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop4418"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2817">
++ <stop
++ id="stop2819"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop2821"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0.48453608;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective4408"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="matrix(3.000198,0,0,1,-67.006,-9.426e-2)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3421"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(-4e-4,-9.426e-2)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4655"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="matrix(1,0,0,1.004384,-145.0004,-71.4625)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4653"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,212.6949)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4651"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="105.49083"
++ x2="174.74524"
++ y1="84.263489"
++ x1="174.83363"
++ gradientTransform="matrix(1.103262,0,0,1.054917,-163.1228,-76.31138)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4649"
++ xlink:href="#linearGradient2817"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,186.6949)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4647"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(-4e-4,-26.09426)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4645"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="105.49083"
++ x2="174.74524"
++ y1="84.263489"
++ x1="174.83363"
++ gradientTransform="matrix(1.103262,0,0,1.054917,-163.1228,-76.31138)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4643"
++ xlink:href="#linearGradient2817"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,212.6949)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4641"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-145.0004,-97.0943)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4639"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="matrix(1,0,0,1.004384,-145.0004,-71.4625)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4637"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(-4e-4,-9.426e-2)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4635"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(133,70.99999)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4633"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-12,0)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4631"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-12,0)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4629"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4627"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(133,70.99999)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4625"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-12,0)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4623"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4621"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1,0,0,0.536723,-1.44832e-12,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4619"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1,0,0,0.536723,4.579205e-13,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4617"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(133,70.99999)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4615"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-12,0)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4613"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4611"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1,0,0,0.536723,-1.432388e-12,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4609"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1,0,0,0.536723,4.526469e-13,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4607"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1,0,0,0.536723,-1.416456e-12,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4605"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1,0,0,0.536723,4.473733e-13,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4603"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(133,70.99999)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4601"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-12,0)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4599"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4597"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <linearGradient
++ id="linearGradient4573">
++ <stop
++ style="stop-color:#babdb6"
++ offset="0"
++ id="stop4575" />
++ <stop
++ style="stop-color:#555753"
++ offset="1"
++ id="stop4577" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4567">
++ <stop
++ id="stop4569"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop4571"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4561">
++ <stop
++ id="stop4563"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop4565"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0.48453608;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective4558"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <radialGradient
++ r="21.333334"
++ fy="38.807304"
++ fx="26.137741"
++ cy="38.807304"
++ cx="26.137741"
++ gradientTransform="matrix(0.769501,-1.2425,0.6703,0.415141,-21.77857,41.36563)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient23380"
++ xlink:href="#linearGradient3406"
++ inkscape:collect="always" />
++ <radialGradient
++ r="21.333334"
++ fy="23.914305"
++ fx="133.84108"
++ cy="23.914305"
++ cx="133.84108"
++ gradientTransform="matrix(-5.04822e-2,1.387847e-2,-0.12844,-0.467196,35.41257,39.44172)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient23365"
++ xlink:href="#linearGradient3435"
++ inkscape:collect="always" />
++ <radialGradient
++ r="21.333334"
++ fy="21.618015"
++ fx="35.511295"
++ cy="21.618015"
++ cx="35.511295"
++ gradientTransform="matrix(0.105916,-1.91424e-2,0.104789,0.579807,17.13693,7.115158)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient23363"
++ xlink:href="#linearGradient3435"
++ inkscape:collect="always" />
++ <radialGradient
++ r="21.333334"
++ fy="33.377594"
++ fx="16.885271"
++ cy="33.377594"
++ cx="16.885271"
++ gradientTransform="matrix(5.184267e-3,-0.12286,0.544548,2.297824e-2,0.957234,26.30756)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient23361"
++ xlink:href="#linearGradient3435"
++ inkscape:collect="always" />
++ <radialGradient
++ r="21.333334"
++ fy="48.238270"
++ fx="53.556889"
++ cy="48.238270"
++ cx="53.556889"
++ gradientTransform="matrix(0.15845,-0.158988,0.432907,0.431441,-2.723645,15.00107)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient23359"
++ xlink:href="#linearGradient3421"
++ inkscape:collect="always" />
++ <radialGradient
++ r="21.333334"
++ fy="38.807304"
++ fx="26.137741"
++ cy="38.807304"
++ cx="26.137741"
++ gradientTransform="matrix(0.769501,-1.2425,0.6703,0.415141,-21.77857,41.36563)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient23357"
++ xlink:href="#linearGradient3406"
++ inkscape:collect="always" />
++ <radialGradient
++ r="21.333334"
++ fy="27.569166"
++ fx="37.751469"
++ cy="27.569166"
++ cx="37.751469"
++ gradientTransform="matrix(0.848684,0.95802,-0.782119,0.692834,18.69147,-20.52578)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient23355"
++ xlink:href="#linearGradient3394"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="54.698483"
++ x2="48.798885"
++ y1="3.6100161"
++ x1="10.501720"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient23351"
++ xlink:href="#linearGradient6036"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="28.000000"
++ x2="29.000000"
++ y1="14.625000"
++ x1="21.125000"
++ gradientTransform="matrix(1.25,0,0,1.25,-5.652995,-2.604165)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient23349"
++ xlink:href="#linearGradient4236"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="28.000000"
++ x2="29.000000"
++ y1="14.625000"
++ x1="21.125000"
++ gradientTransform="matrix(1.25,0,0,1.25,-5.652995,-2.604165)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient23347"
++ xlink:href="#linearGradient4236"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="14.2033"
++ x2="35.3912"
++ y1="32.4165"
++ x1="12.2744"
++ gradientTransform="matrix(1.190476,0,0,1.190476,-4.224424,-2.500001)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient23345"
++ xlink:href="#aigrd2"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="34.3075"
++ x2="32.511"
++ y1="11.1885"
++ x1="14.9966"
++ gradientTransform="matrix(1.190476,0,0,1.190476,-4.224424,-2.5)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient23343"
++ xlink:href="#aigrd1"
++ inkscape:collect="always" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3406"
++ id="radialGradient3449"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.769501,-1.242500,0.670300,0.415141,-21.77857,41.36563)"
++ cx="26.137741"
++ cy="38.807304"
++ fx="26.137741"
++ fy="38.807304"
++ r="21.333334" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3435"
++ id="radialGradient3447"
++ gradientUnits="userSpaceOnUse"
++ cx="133.84108"
++ cy="23.914305"
++ fx="133.84108"
++ fy="23.914305"
++ r="21.333334"
++ gradientTransform="matrix(-5.048220e-2,1.387847e-2,-0.128440,-0.467196,35.41257,39.44172)" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3435"
++ id="radialGradient3443"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.105916,-1.914240e-2,0.104789,0.579807,17.13693,7.115158)"
++ cx="35.511295"
++ cy="21.618015"
++ fx="35.511295"
++ fy="21.618015"
++ r="21.333334" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3435"
++ id="radialGradient3433"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(5.184267e-3,-0.122860,0.544548,2.297824e-2,0.957234,26.30756)"
++ cx="16.885271"
++ cy="33.377594"
++ fx="16.885271"
++ fy="33.377594"
++ r="21.333334" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3421"
++ id="radialGradient3429"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.158450,-0.158988,0.432907,0.431441,-2.723645,15.00107)"
++ cx="53.556889"
++ cy="48.238270"
++ fx="53.556889"
++ fy="48.238270"
++ r="21.333334" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3394"
++ id="radialGradient3392"
++ cx="37.751469"
++ cy="27.569166"
++ fx="37.751469"
++ fy="27.569166"
++ r="21.333334"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.848684,0.958020,-0.782119,0.692834,18.69147,-20.52578)" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="54.698483"
++ x2="48.798885"
++ y1="3.6100161"
++ x1="10.501720"
++ id="linearGradient6042"
++ xlink:href="#linearGradient6036"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="18.366575"
++ x2="17.742729"
++ y1="31.494707"
++ x1="28.702885"
++ id="linearGradient6034"
++ xlink:href="#linearGradient6028"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="matrix(1.250000,0.000000,0.000000,1.250000,-5.652995,-2.604165)"
++ gradientUnits="userSpaceOnUse"
++ y2="28.000000"
++ x2="29.000000"
++ y1="14.625000"
++ x1="21.125000"
++ id="linearGradient4224"
++ xlink:href="#linearGradient4236"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="matrix(1.250000,0.000000,0.000000,1.250000,-5.652995,-2.604165)"
++ gradientUnits="userSpaceOnUse"
++ y2="28.000000"
++ x2="29.000000"
++ y1="14.625000"
++ x1="21.125000"
++ id="linearGradient4804"
++ xlink:href="#linearGradient4236"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="matrix(1.190476,0.000000,0.000000,1.190476,-4.224424,-2.500000)"
++ y2="34.3075"
++ x2="32.511"
++ y1="11.1885"
++ x1="14.9966"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3912"
++ xlink:href="#aigrd1"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="34.3075"
++ x2="32.511"
++ y1="11.1885"
++ x1="14.9966"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4798">
++ <stop
++ id="stop3034"
++ style="stop-color:#EBEBEB"
++ offset="0" />
++ <stop
++ id="stop3036"
++ style="stop-color:#FFFFFF"
++ offset="0.5" />
++ <stop
++ id="stop3038"
++ style="stop-color:#EBEBEB"
++ offset="1" />
++ </linearGradient>
++ <linearGradient
++ y2="14.2033"
++ x2="35.3912"
++ y1="32.4165"
++ x1="12.2744"
++ gradientUnits="userSpaceOnUse"
++ id="aigrd2">
++ <stop
++ id="stop3043"
++ style="stop-color:#FBFBFB"
++ offset="0" />
++ <stop
++ id="stop3045"
++ style="stop-color:#B6B6B6"
++ offset="0.5" />
++ <stop
++ id="stop3047"
++ style="stop-color:#E4E4E4"
++ offset="1" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4236">
++ <stop
++ id="stop4238"
++ offset="0.0000000"
++ style="stop-color:#ffffff;stop-opacity:0.32673267;" />
++ <stop
++ id="stop4240"
++ offset="1.0000000"
++ style="stop-color:#ffffff;stop-opacity:0.60396039;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient6028"
++ inkscape:collect="always">
++ <stop
++ id="stop6030"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop6032"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient6036"
++ inkscape:collect="always">
++ <stop
++ id="stop6038"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop6040"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3394"
++ gradientUnits="userSpaceOnUse"
++ x1="12.2744"
++ y1="32.4165"
++ x2="35.3912"
++ y2="14.2033">
++ <stop
++ offset="0.0000000"
++ style="stop-color:#fff307;stop-opacity:1.0000000;"
++ id="stop3396" />
++ <stop
++ offset="0.50000000"
++ style="stop-color:#166eff;stop-opacity:1.0000000;"
++ id="stop3398" />
++ <stop
++ offset="1.0000000"
++ style="stop-color:#ffffff;stop-opacity:0.0000000;"
++ id="stop3400" />
++ </linearGradient>
++ <linearGradient
++ y2="14.2033"
++ x2="35.3912"
++ y1="32.4165"
++ x1="12.2744"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3406">
++ <stop
++ id="stop3408"
++ style="stop-color:#b307ff;stop-opacity:0.82178217;"
++ offset="0.0000000" />
++ <stop
++ id="stop3410"
++ style="stop-color:#f0ff8b;stop-opacity:0.64356434;"
++ offset="1.0000000" />
++ <stop
++ id="stop3412"
++ style="stop-color:#ffffff;stop-opacity:0.0000000;"
++ offset="1.0000000" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4773"
++ gradientUnits="userSpaceOnUse"
++ x1="12.2744"
++ y1="32.4165"
++ x2="35.3912"
++ y2="14.2033">
++ <stop
++ offset="0.0000000"
++ style="stop-color:#ffffff;stop-opacity:1.0000000;"
++ id="stop3423" />
++ <stop
++ offset="1.0000000"
++ style="stop-color:#b8c04c;stop-opacity:0.0000000;"
++ id="stop3427" />
++ </linearGradient>
++ <linearGradient
++ y2="14.2033"
++ x2="35.3912"
++ y1="32.4165"
++ x1="12.2744"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3435">
++ <stop
++ id="stop3437"
++ style="stop-color:#ffffc8;stop-opacity:1.0000000;"
++ offset="0.0000000" />
++ <stop
++ id="stop3439"
++ style="stop-color:#9a91ef;stop-opacity:0.0000000;"
++ offset="1.0000000" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient23419"
++ inkscape:collect="always">
++ <stop
++ id="stop23421"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop23423"
++ offset="1"
++ style="stop-color:#000000;stop-opacity:0;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective4764"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4768"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4706"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4644"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4582"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4520"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-138.39033"
++ x2="249.82786"
++ y1="-138.39033"
++ x1="247.10906"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4458"
++ xlink:href="#linearGradient4227"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-211.44472"
++ x2="-454.32587"
++ y1="-207.90897"
++ x1="-450.47763"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4456"
++ xlink:href="#linearGradient3066"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-138.39033"
++ x2="249.82786"
++ y1="-138.39033"
++ x1="247.10906"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4454"
++ xlink:href="#linearGradient4227"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-209.19533"
++ x2="-450.64621"
++ y1="-212.70671"
++ x1="-454.62939"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4450"
++ xlink:href="#linearGradient3056"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(-17.08724,-55.72628)"
++ y2="-80.599586"
++ x2="-284.24194"
++ y1="-77.512611"
++ x1="-284.96951"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4448"
++ xlink:href="#linearGradient4275"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(-17.01418,-55.70393)"
++ y2="-192.71288"
++ x2="189.64017"
++ y1="-188.64658"
++ x1="191.13173"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4446"
++ xlink:href="#linearGradient4267"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-244.87511"
++ x2="-451.31165"
++ y1="-244.17062"
++ x1="-456.22388"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4444"
++ xlink:href="#linearGradient4141"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-197.33253"
++ x2="-452.35226"
++ y1="-206.95709"
++ x1="-458.00912"
++ gradientTransform="matrix(0.797456,0.000000,0.000000,0.742875,609.5472,-38.75752)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4442"
++ xlink:href="#linearGradient19198"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-204.17659"
++ x2="-443.46924"
++ y1="-216.85661"
++ x1="-462.03079"
++ gradientTransform="matrix(0.799360,0.000000,0.000000,0.747188,610.4265,-37.86474)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4440"
++ xlink:href="#linearGradient19198"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,3.345547e-14,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4438"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="matrix(0.859423,0.000000,0.000000,0.632454,35.00386,-46.28636)"
++ gradientUnits="userSpaceOnUse"
++ y2="-125.99247"
++ x2="248.41544"
++ y1="-124.22470"
++ x1="248.41544"
++ id="linearGradient4313"
++ xlink:href="#linearGradient4307"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="-80.599586"
++ x2="-284.24194"
++ y1="-77.512611"
++ x1="-284.96951"
++ id="linearGradient4281"
++ xlink:href="#linearGradient4275"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="-192.71288"
++ x2="189.64017"
++ y1="-188.64658"
++ x1="191.13173"
++ id="linearGradient4273"
++ xlink:href="#linearGradient4267"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="matrix(0.858948,0.000000,0.000000,0.586269,35.05258,-52.07290)"
++ gradientUnits="userSpaceOnUse"
++ y2="-128.60747"
++ x2="248.86223"
++ y1="-124.09965"
++ x1="248.84767"
++ id="linearGradient4249"
++ xlink:href="#linearGradient4243"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="-138.39033"
++ x2="249.82786"
++ y1="-138.39033"
++ x1="247.10906"
++ id="linearGradient4233"
++ xlink:href="#linearGradient4227"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-204.17659"
++ x2="-443.46924"
++ y1="-216.85661"
++ x1="-462.03079"
++ gradientTransform="matrix(0.799360,0.000000,0.000000,0.747188,610.4265,19.13255)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4197"
++ xlink:href="#linearGradient19198"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="-244.87511"
++ x2="-451.31165"
++ y1="-244.17062"
++ x1="-456.22388"
++ id="linearGradient4147"
++ xlink:href="#linearGradient4141"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-211.44472"
++ x2="-454.32587"
++ y1="-207.90897"
++ x1="-450.47763"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4023"
++ xlink:href="#linearGradient3066"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-209.19533"
++ x2="-450.64621"
++ y1="-212.70671"
++ x1="-454.62939"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4021"
++ xlink:href="#linearGradient3056"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-197.33253"
++ x2="-452.35226"
++ y1="-206.95709"
++ x1="-458.00912"
++ gradientTransform="matrix(0.797456,0.000000,0.000000,0.742875,609.5472,18.23977)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3959"
++ xlink:href="#linearGradient19198"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.761407e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3883"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.933907e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3811"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(0.999362,0.000000,0.000000,1.000477,114.0171,-227.0066)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3743"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.534089e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3741"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.910037e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3668"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="65.832352"
++ x2="-20.240932"
++ y1="75.510872"
++ x1="-13.656000"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3613"
++ xlink:href="#linearGradient8929"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(0.832553,0.000000,0.000000,0.998481,60.42500,-226.9769)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3611"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.803027e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3609"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(0.832553,0.000000,0.000000,0.998481,60.43196,-170.0018)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3555"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4254"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4192"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4130"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4068"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4006"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4004"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-12.425205"
++ x2="203.62500"
++ y1="-52.362705"
++ x1="181.02138"
++ gradientTransform="translate(55.95575,-56.98763)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4002"
++ xlink:href="#linearGradient3554"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-5.760179e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4000"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(-4.428612e-2,-56.98763)"
++ y2="-12.425205"
++ x2="203.62500"
++ y1="-52.362705"
++ x1="181.02138"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3998"
++ xlink:href="#linearGradient3554"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-5.166383e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3996"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3994"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(1.387332,0.000000,0.000000,1.024650,103.3564,-114.0644)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3992"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.931222e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3990"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3988"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(1.387332,0.000000,0.000000,1.024650,47.34591,-114.0767)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3986"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.287676e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3984"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3708"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3704"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(56.00000,5.450779e-7)"
++ y2="-12.425205"
++ x2="203.62500"
++ y1="-52.362705"
++ x1="181.02138"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3632"
++ xlink:href="#linearGradient3554"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.971920e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3630"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="-12.425205"
++ x2="203.62500"
++ y1="-52.362705"
++ x1="181.02138"
++ id="linearGradient3560"
++ xlink:href="#linearGradient3554"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.534909e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2808"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2791"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(1.387332,0.000000,0.000000,1.024650,103.4007,-57.07667)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2789"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.400433e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2787"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient5738"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2971"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2950"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2904"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2902"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient5732"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-5.153249e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient10291"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient10289"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient10287"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(1.211805,0.000000,0.000000,0.895257,49.69408,-224.5271)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient10285"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient10283"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient10281"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-9.0610695"
++ x2="-295.32266"
++ y1="-53.248569"
++ x1="-321.33310"
++ gradientTransform="matrix(0.789519,0.000000,0.000000,0.818328,492.2076,-177.7888)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient10279"
++ xlink:href="#linearGradient13288"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-9.0610695"
++ x2="-295.32266"
++ y1="-53.248569"
++ x1="-321.33310"
++ gradientTransform="matrix(0.789519,0.000000,0.000000,0.818328,434.9184,-176.8611)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient10277"
++ xlink:href="#linearGradient13288"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(1.211805,0.000000,0.000000,0.895257,108.0729,-224.5881)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient10275"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-5.216754e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient10273"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.047104e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient10271"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-3.136389e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient10269"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-5.095240e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9967"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9965"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9963"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(1.211805,0.000000,0.000000,0.895257,49.69405,-167.9586)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9961"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9959"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9957"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-9.0610695"
++ x2="-295.32266"
++ y1="-53.248569"
++ x1="-321.33310"
++ gradientTransform="matrix(0.789519,0.000000,0.000000,0.818328,492.2075,-121.2203)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9955"
++ xlink:href="#linearGradient13288"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-9.0610695"
++ x2="-295.32266"
++ y1="-53.248569"
++ x1="-321.33310"
++ gradientTransform="matrix(0.789519,0.000000,0.000000,0.818328,434.9183,-120.2926)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9953"
++ xlink:href="#linearGradient13288"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(1.211805,0.000000,0.000000,0.895257,108.0728,-168.0196)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9951"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-5.255944e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9949"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.010258e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9947"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-3.407561e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9945"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9319"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,457.0698,-40.47841)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9317"
++ xlink:href="#linearGradient7774"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9315"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,422.1275,-16.07031)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9313"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9311"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.323062e-12,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9309"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9307"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,289.0697,-40.47841)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9305"
++ xlink:href="#linearGradient7145"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9303"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,254.1274,-16.07031)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9301"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9299"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.071482e-12,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9297"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9295"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,233.0697,-40.47841)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9293"
++ xlink:href="#linearGradient7744"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9291"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,198.1274,-16.07031)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9289"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9287"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.001522e-12,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9285"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9283"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,345.0108,-40.47841)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9281"
++ xlink:href="#linearGradient7754"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9279"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,310.0685,-16.07031)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9277"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9275"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.170967e-12,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9273"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9271"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,401.0697,-40.47841)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9269"
++ xlink:href="#linearGradient7764"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9267"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,366.1274,-16.07031)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9265"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9263"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.242582e-12,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9261"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8609"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8547"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8423"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8284"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8272"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8264"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8254"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8240"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8182"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,457.0350,71.55046)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8180"
++ xlink:href="#linearGradient7774"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8178"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,422.0927,95.95860)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8176"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.178954e-12,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8174"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8172"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,177.0485,15.55046)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8170"
++ xlink:href="#linearGradient7145"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8168"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,142.1062,39.95860)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8166"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.043081e-12,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8164"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8162"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,177.0606,15.55050)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8160"
++ xlink:href="#linearGradient7744"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8158"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,142.1183,39.95864)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8156"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-9.635224e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8154"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8142"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,401.0349,71.55046)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8140"
++ xlink:href="#linearGradient7764"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8138"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,366.0926,95.95860)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8136"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.113686e-12,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8134"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7741"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,457.0696,15.53428)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7739"
++ xlink:href="#linearGradient7774"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7737"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,422.1273,39.94242)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7735"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-9.211314e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient7733"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7660"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,289.0695,15.53428)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7658"
++ xlink:href="#linearGradient7145"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7656"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,254.1272,39.94242)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7654"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-8.872973e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient7652"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7580"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,233.0695,15.53428)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7578"
++ xlink:href="#linearGradient7744"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7576"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,198.1272,39.94242)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7574"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-8.809240e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient7572"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7496"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,345.0106,15.53428)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7494"
++ xlink:href="#linearGradient7754"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7492"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,310.0683,39.94242)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7490"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-8.561348e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient7488"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7396"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-8.900868e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient7095"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,401.0695,15.53428)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7067"
++ xlink:href="#linearGradient7764"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(1.387332,0.000000,0.000000,1.024650,47.39016,-57.08899)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7055"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.102685e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient7053"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7035"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,1.830093e-14,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient7013"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,366.1272,39.94242)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7003"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="65.832352"
++ x2="-20.240932"
++ y1="75.510872"
++ x1="-13.656000"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient6973"
++ xlink:href="#linearGradient8929"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.661058e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient6961"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient5125"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient5069"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient5013"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="47.416740"
++ x2="41.189976"
++ y1="20.934155"
++ x1="22.125528"
++ id="linearGradient4120"
++ xlink:href="#linearGradient4114"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4104"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4064"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4013"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3973"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3907"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-2.861537e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3905"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3837"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3585"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3569"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3553"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3537"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3521"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3244"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(1.708228,0.000000,0.000000,1.262004,-416.4526,-251.8586)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3242"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-3.691986e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3238"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3043"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3037"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3384"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-9.0610695"
++ x2="-295.32266"
++ y1="-53.248569"
++ x1="-321.33310"
++ gradientTransform="matrix(1.112950,0.000000,0.000000,1.153561,34.16656,-110.5454)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3379"
++ xlink:href="#linearGradient13288"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-3.588875e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3377"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="118.12593"
++ x2="-252.29054"
++ y1="115.78169"
++ x1="-252.16348"
++ gradientTransform="translate(520.1691,-142.8933)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3098"
++ xlink:href="#linearGradient3088"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(-5.539766,-1.997629)"
++ gradientUnits="userSpaceOnUse"
++ y2="117.83466"
++ x2="-251.20390"
++ y1="115.17856"
++ x1="-252.81038"
++ id="linearGradient3094"
++ xlink:href="#linearGradient3088"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="-211.44472"
++ x2="-454.32587"
++ y1="-207.90897"
++ x1="-450.47763"
++ id="linearGradient3072"
++ xlink:href="#linearGradient3066"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="-209.19533"
++ x2="-450.64621"
++ y1="-212.70671"
++ x1="-454.62939"
++ id="linearGradient3062"
++ xlink:href="#linearGradient3056"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(-8.005056e-2,9.090695)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25468"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(-8.007488e-2,5.926971)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25466"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(9.437144e-6,2.923441)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25464"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25462"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(-8.005056e-2,9.090695)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25460"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(-8.007488e-2,5.926971)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25458"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(9.437144e-6,2.923441)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25456"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25454"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(-8.005056e-2,9.090695)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25442"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(-8.007488e-2,5.926971)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25440"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(9.437144e-6,2.923441)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25438"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25436"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(-8.005056e-2,9.090695)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25414"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(-8.007488e-2,5.926971)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25410"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(9.437144e-6,2.923441)"
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25406"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ id="linearGradient25402"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(18.38478,-0.707107)"
++ gradientUnits="userSpaceOnUse"
++ y2="61.900581"
++ x2="-285.35447"
++ y1="61.900581"
++ x1="-295.45397"
++ id="linearGradient25376"
++ xlink:href="#linearGradient25370"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25364"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25360"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25356"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25352"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ id="linearGradient25348"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(18.38478,-0.707107)"
++ gradientUnits="userSpaceOnUse"
++ y2="49.294865"
++ x2="-281.19888"
++ y1="32.677853"
++ x1="-300.04407"
++ id="linearGradient24585"
++ xlink:href="#linearGradient24579"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient23851"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient23841"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-2.243418e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient22201"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="-243.47842"
++ x2="-452.14810"
++ y1="-246.35371"
++ x1="-454.64041"
++ id="linearGradient20001"
++ xlink:href="#linearGradient19995"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(180.6394,255.6313)"
++ gradientUnits="userSpaceOnUse"
++ y2="-197.33253"
++ x2="-452.35226"
++ y1="-206.95709"
++ x1="-458.00912"
++ id="linearGradient19206"
++ xlink:href="#linearGradient19198"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(180.6394,255.6313)"
++ gradientUnits="userSpaceOnUse"
++ y2="-204.17659"
++ x2="-443.46924"
++ y1="-216.85661"
++ x1="-462.03079"
++ id="linearGradient19204"
++ xlink:href="#linearGradient19198"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.098049e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient16071"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-9.0610695"
++ x2="-295.32266"
++ y1="-53.248569"
++ x1="-321.33310"
++ gradientTransform="matrix(1.112950,0.000000,0.000000,1.153561,33.12280,-184.0356)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient15909"
++ xlink:href="#linearGradient13288"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-3.076646e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient15907"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-3.676858e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient15487"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-3.068595e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient15483"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="matrix(1.112950,0.000000,0.000000,1.153561,13.71255,-110.5632)"
++ gradientUnits="userSpaceOnUse"
++ y2="-9.0610695"
++ x2="-295.32266"
++ y1="-53.248569"
++ x1="-321.33310"
++ id="linearGradient13294"
++ xlink:href="#linearGradient13288"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.991819e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient12537"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient12535"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.775165,0.000000,0.000000,0.779522,-208.4779,-67.34494)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient12361"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.752486,0.000000,0.000000,0.764968,-173.9653,-91.86330)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient12359"
++ xlink:href="#linearGradient5453"
++ inkscape:collect="always" />
++ <radialGradient
++ r="3.2040777"
++ fy="8.7893066"
++ fx="-215.24026"
++ cy="8.7893066"
++ cx="-215.24026"
++ gradientTransform="matrix(1.087839,0.843258,-0.612654,0.790351,24.29137,183.3457)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient12357"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <radialGradient
++ r="12.687500"
++ fy="-19.562500"
++ fx="-164.31250"
++ cy="-19.562500"
++ cx="-164.31250"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.339901,3.245406e-14,-12.91318)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient12355"
++ xlink:href="#linearGradient8734"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.775165,0.000000,0.000000,0.779522,-117.5223,-65.96566)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient11535"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.752486,0.000000,0.000000,0.764968,-83.00982,-90.48401)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient11533"
++ xlink:href="#linearGradient5453"
++ inkscape:collect="always" />
++ <radialGradient
++ r="3.2040777"
++ fy="8.7893066"
++ fx="-215.24026"
++ cy="8.7893066"
++ cx="-215.24026"
++ gradientTransform="matrix(1.087839,0.843258,-0.612654,0.790351,24.29137,183.3457)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient11531"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <radialGradient
++ r="12.687500"
++ fy="-19.562500"
++ fx="-164.31250"
++ cy="-19.562500"
++ cx="-164.31250"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.339901,1.451487e-14,-12.91318)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient11529"
++ xlink:href="#linearGradient8734"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.775165,0.000000,0.000000,0.779522,-69.84306,-65.69002)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient11435"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.752486,0.000000,0.000000,0.764968,-35.33052,-90.20845)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient11433"
++ xlink:href="#linearGradient5453"
++ inkscape:collect="always" />
++ <radialGradient
++ r="3.2040777"
++ fy="8.7893066"
++ fx="-215.24026"
++ cy="8.7893066"
++ cx="-215.24026"
++ gradientTransform="matrix(1.087839,0.843258,-0.612654,0.790351,24.29137,183.3457)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient11431"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <radialGradient
++ r="12.687500"
++ fy="-19.562500"
++ fx="-164.31250"
++ cy="-19.562500"
++ cx="-164.31250"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.339901,3.266919e-14,-12.91318)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient11429"
++ xlink:href="#linearGradient8734"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.764215,0.000000,0.000000,0.779522,-255.4007,-67.36425)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient11335"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.748646,0.000000,0.000000,0.764968,-219.9909,-91.99309)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient11333"
++ xlink:href="#linearGradient5453"
++ inkscape:collect="always" />
++ <radialGradient
++ r="12.687500"
++ fy="-19.562500"
++ fx="-164.31250"
++ cy="-19.562500"
++ cx="-164.31250"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.339901,1.952605e-14,-12.91318)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient11329"
++ xlink:href="#linearGradient8734"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient11327"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.775165,0.000000,0.000000,0.779522,-164.2093,-66.79265)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient11235"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.752486,0.000000,0.000000,0.764968,-129.6967,-91.31101)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient11233"
++ xlink:href="#linearGradient5453"
++ inkscape:collect="always" />
++ <radialGradient
++ r="3.2040777"
++ fy="8.7893066"
++ fx="-215.24026"
++ cy="8.7893066"
++ cx="-215.24026"
++ gradientTransform="matrix(1.087839,0.843258,-0.612654,0.790351,24.29137,183.3457)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient11231"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <radialGradient
++ r="12.687500"
++ fy="-19.562500"
++ fx="-164.31250"
++ cy="-19.562500"
++ cx="-164.31250"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.339901,4.030109e-14,-12.91318)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient11229"
++ xlink:href="#linearGradient8734"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.382391e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2170"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2166"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="68.130447"
++ x2="-14.875132"
++ y1="68.130447"
++ x1="-22.822500"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9778"
++ xlink:href="#linearGradient8943"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="65.832352"
++ x2="-20.240932"
++ y1="75.510872"
++ x1="-13.656000"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9776"
++ xlink:href="#linearGradient8929"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(0.783486,0.000000,0.000000,1.000000,-36.97870,52.75248)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9751"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="68.130447"
++ x2="-14.875132"
++ y1="68.130447"
++ x1="-22.822500"
++ id="linearGradient8949"
++ xlink:href="#linearGradient8943"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="65.832352"
++ x2="-20.240932"
++ y1="75.510872"
++ x1="-13.656000"
++ id="linearGradient8937"
++ xlink:href="#linearGradient8929"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(0.783486,0.000000,0.000000,1.000000,-36.97870,52.75248)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7335"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(1.708228,0.000000,0.000000,1.262004,-416.3836,-178.7204)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7271"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <linearGradient
++ id="linearGradient2392">
++ <stop
++ id="stop2394"
++ offset="0.0000000"
++ style="stop-color:#715b26;stop-opacity:1.0000000;" />
++ <stop
++ id="stop2396"
++ offset="1.0000000"
++ style="stop-color:#312710;stop-opacity:1.0000000;" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient12129">
++ <stop
++ style="stop-color:#000000;stop-opacity:1;"
++ offset="0"
++ id="stop12131" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0;"
++ offset="1"
++ id="stop12133" />
++ </linearGradient>
++ <linearGradient
++ style="stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
++ y2="36.0328"
++ x2="31.0813"
++ y1="3.7319"
++ x1="12.4873"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient5510">
++ <stop
++ id="stop16177"
++ style="stop-color:#D2D2D2;stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
++ offset="0" />
++ <stop
++ id="stop16179"
++ style="stop-color:#EDEDED;stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
++ offset="1" />
++ </linearGradient>
++ <linearGradient
++ style="stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
++ y2="22.5769"
++ x2="21.9168"
++ y1="30.3413"
++ x1="21.877"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient5506">
++ <stop
++ id="stop16184"
++ style="stop-color:#5e4f07;stop-opacity:1.0000000;"
++ offset="0.0000000" />
++ <stop
++ id="stop16186"
++ style="stop-color:#348a31;stop-opacity:1.0000000;"
++ offset="1.0000000" />
++ </linearGradient>
++ <linearGradient
++ style="stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
++ y2="7.1091"
++ x2="21.9326"
++ y1="24.6274"
++ x1="21.9326"
++ gradientUnits="userSpaceOnUse"
++ id="aigrd3">
++ <stop
++ id="stop16199"
++ style="stop-color:#D0D6E5;stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
++ offset="0" />
++ <stop
++ id="stop16201"
++ style="stop-color:#093A80;stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
++ offset="1" />
++ </linearGradient>
++ <linearGradient
++ gradientTransform="matrix(1.098989,0.000000,0.000000,1.106697,2.774881e-2,1.968146)"
++ inkscape:collect="always"
++ xlink:href="#aigrd3"
++ id="linearGradient16270"
++ gradientUnits="userSpaceOnUse"
++ x1="21.9326"
++ y1="24.6274"
++ x2="21.9326"
++ y2="7.1091" />
++ <linearGradient
++ gradientTransform="matrix(1.110455,0.000000,0.000000,1.118244,-0.223961,1.617860)"
++ inkscape:collect="always"
++ xlink:href="#aigrd2"
++ id="linearGradient16277"
++ gradientUnits="userSpaceOnUse"
++ x1="21.877"
++ y1="30.3413"
++ x2="21.9168"
++ y2="22.5769" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#aigrd1"
++ id="linearGradient16280"
++ gradientUnits="userSpaceOnUse"
++ x1="12.4873"
++ y1="3.7319"
++ x2="31.0813"
++ y2="36.0328"
++ gradientTransform="matrix(1.211383,0.000000,0.000000,1.211383,-2.021434,0.172946)" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient12129"
++ id="radialGradient12135"
++ cx="24.218407"
++ cy="41.636040"
++ fx="24.218407"
++ fy="41.636040"
++ r="22.097088"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.184000,0.000000,33.97501)"
++ gradientUnits="userSpaceOnUse" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="27.352215"
++ x2="27.238144"
++ y1="20.227215"
++ x1="27.308506"
++ id="linearGradient2398"
++ xlink:href="#linearGradient2392"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,3.921342e-15,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2939"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(-403.4554,13.05442)"
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient12304"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.715328,-1.262878e-15,11.95620)"
++ r="8.5625000"
++ fy="42.000000"
++ fx="25.812500"
++ cy="42.000000"
++ cx="25.812500"
++ id="radialGradient4232"
++ xlink:href="#linearGradient4226"
++ inkscape:collect="always" />
++ <linearGradient
++ id="linearGradient4226"
++ inkscape:collect="always">
++ <stop
++ id="stop4228"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop4230"
++ offset="1"
++ style="stop-color:#000000;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2248">
++ <stop
++ id="stop2250"
++ offset="0"
++ style="stop-color:#c0c0c0;stop-opacity:1;" />
++ <stop
++ id="stop2252"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:1.0000000" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient6962">
++ <stop
++ id="stop6964"
++ offset="0"
++ style="stop-color:#717171;stop-opacity:1.0000000" />
++ <stop
++ id="stop6966"
++ offset="1"
++ style="stop-color:#838383;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient9203">
++ <stop
++ id="stop9205"
++ offset="0"
++ style="stop-color:#f9f9f9;stop-opacity:1;" />
++ <stop
++ id="stop9207"
++ offset="1.0000000"
++ style="stop-color:#f2f2f2;stop-opacity:1.0000000;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient5919"
++ inkscape:collect="always">
++ <stop
++ id="stop5921"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop5923"
++ offset="1"
++ style="stop-color:#000000;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2924"
++ inkscape:collect="always">
++ <stop
++ id="stop2926"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop2928"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient8929"
++ inkscape:collect="always">
++ <stop
++ id="stop8931"
++ offset="0"
++ style="stop-color:#d9dadc;stop-opacity:1;" />
++ <stop
++ id="stop8933"
++ offset="1"
++ style="stop-color:#d9dadc;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient8943"
++ inkscape:collect="always">
++ <stop
++ id="stop8945"
++ offset="0"
++ style="stop-color:#bebebe;stop-opacity:1;" />
++ <stop
++ id="stop8947"
++ offset="1"
++ style="stop-color:#bebebe;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient5453">
++ <stop
++ id="stop5455"
++ offset="0.0000000"
++ style="stop-color:#0a0000;stop-opacity:0.58762884;" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0.0000000;"
++ offset="0.10000000"
++ id="stop5461" />
++ <stop
++ id="stop5465"
++ offset="0.88000000"
++ style="stop-color:#000000;stop-opacity:0.0000000;" />
++ <stop
++ id="stop5457"
++ offset="1.0000000"
++ style="stop-color:#0a0000;stop-opacity:0.58823532;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient5485"
++ inkscape:collect="always">
++ <stop
++ id="stop5487"
++ offset="0"
++ style="stop-color:#dddddd;stop-opacity:1;" />
++ <stop
++ id="stop5489"
++ offset="1"
++ style="stop-color:#dddddd;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient8734"
++ inkscape:collect="always">
++ <stop
++ id="stop8736"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop8738"
++ offset="1"
++ style="stop-color:#000000;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient10924"
++ inkscape:collect="always">
++ <stop
++ id="stop10926"
++ offset="0"
++ style="stop-color:#efefef;stop-opacity:1;" />
++ <stop
++ id="stop10928"
++ offset="1"
++ style="stop-color:#efefef;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient10936">
++ <stop
++ id="stop10938"
++ offset="0"
++ style="stop-color:#2d589b;stop-opacity:1;" />
++ <stop
++ id="stop10940"
++ offset="1.0000000"
++ style="stop-color:#e3ebf7;stop-opacity:1.0000000;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient13288"
++ inkscape:collect="always">
++ <stop
++ id="stop13290"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop13292"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient19198"
++ inkscape:collect="always">
++ <stop
++ id="stop19200"
++ offset="0"
++ style="stop-color:#d6d6d4;stop-opacity:1;" />
++ <stop
++ id="stop19202"
++ offset="1"
++ style="stop-color:#d6d6d4;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient19995"
++ inkscape:collect="always">
++ <stop
++ id="stop19997"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop19999"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient24579"
++ inkscape:collect="always">
++ <stop
++ id="stop24581"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop24583"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient25370"
++ inkscape:collect="always">
++ <stop
++ id="stop25372"
++ offset="0"
++ style="stop-color:#929292;stop-opacity:1;" />
++ <stop
++ id="stop25374"
++ offset="1"
++ style="stop-color:#929292;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient25396"
++ inkscape:collect="always">
++ <stop
++ id="stop25398"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop25400"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3056"
++ inkscape:collect="always">
++ <stop
++ id="stop3058"
++ offset="0"
++ style="stop-color:#8d8d8d;stop-opacity:1;" />
++ <stop
++ id="stop3060"
++ offset="1"
++ style="stop-color:#8d8d8d;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3066"
++ inkscape:collect="always">
++ <stop
++ id="stop3068"
++ offset="0"
++ style="stop-color:#8d8d8d;stop-opacity:1;" />
++ <stop
++ id="stop3070"
++ offset="1"
++ style="stop-color:#8d8d8d;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3088"
++ inkscape:collect="always">
++ <stop
++ id="stop3090"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop3092"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4114"
++ inkscape:collect="always">
++ <stop
++ id="stop4116"
++ offset="0"
++ style="stop-color:#aaaaaa;stop-opacity:1;" />
++ <stop
++ id="stop4118"
++ offset="1"
++ style="stop-color:#aaaaaa;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7145">
++ <stop
++ style="stop-color:#8f5902;stop-opacity:1.0000000"
++ offset="0.0000000"
++ id="stop7147" />
++ <stop
++ id="stop7149"
++ offset="0.10000000"
++ style="stop-color:#000000;stop-opacity:0.0000000;" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0.0000000;"
++ offset="0.88000000"
++ id="stop7151" />
++ <stop
++ style="stop-color:#8f5902;stop-opacity:1.0000000"
++ offset="1.0000000"
++ id="stop7153" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7155">
++ <stop
++ style="stop-color:#204a87;stop-opacity:1.0000000"
++ offset="0.0000000"
++ id="stop7157" />
++ <stop
++ id="stop7159"
++ offset="0.10000000"
++ style="stop-color:#000000;stop-opacity:0.0000000;" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0.0000000;"
++ offset="0.88000000"
++ id="stop7161" />
++ <stop
++ style="stop-color:#204a87;stop-opacity:1.0000000"
++ offset="1.0000000"
++ id="stop7163" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7165">
++ <stop
++ style="stop-color:#a40000;stop-opacity:1.0000000"
++ offset="0.0000000"
++ id="stop7167" />
++ <stop
++ id="stop7169"
++ offset="0.10000000"
++ style="stop-color:#000000;stop-opacity:0.0000000;" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0.0000000;"
++ offset="0.88000000"
++ id="stop7171" />
++ <stop
++ style="stop-color:#a40000;stop-opacity:1.0000000"
++ offset="1.0000000"
++ id="stop7173" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7175">
++ <stop
++ style="stop-color:#727e0a;stop-opacity:1.0000000"
++ offset="0.0000000"
++ id="stop7177" />
++ <stop
++ id="stop7179"
++ offset="0.10000000"
++ style="stop-color:#000000;stop-opacity:0.0000000;" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0.0000000;"
++ offset="0.88000000"
++ id="stop7181" />
++ <stop
++ style="stop-color:#727e0a;stop-opacity:1.0000000"
++ offset="1.0000000"
++ id="stop7183" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7744">
++ <stop
++ id="stop7746"
++ offset="0.0000000"
++ style="stop-color:#555753;stop-opacity:1.0000000" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0.0000000;"
++ offset="0.10000000"
++ id="stop7748" />
++ <stop
++ id="stop7750"
++ offset="0.88000000"
++ style="stop-color:#000000;stop-opacity:0.0000000;" />
++ <stop
++ id="stop7752"
++ offset="1.0000000"
++ style="stop-color:#555753;stop-opacity:1.0000000" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7754">
++ <stop
++ id="stop7756"
++ offset="0.0000000"
++ style="stop-color:#204a87;stop-opacity:1.0000000" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0.0000000;"
++ offset="0.10000000"
++ id="stop7758" />
++ <stop
++ id="stop7760"
++ offset="0.88000000"
++ style="stop-color:#000000;stop-opacity:0.0000000;" />
++ <stop
++ id="stop7762"
++ offset="1.0000000"
++ style="stop-color:#204a87;stop-opacity:1.0000000" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7764">
++ <stop
++ id="stop7766"
++ offset="0.0000000"
++ style="stop-color:#a40000;stop-opacity:1.0000000" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0.0000000;"
++ offset="0.10000000"
++ id="stop7768" />
++ <stop
++ id="stop7770"
++ offset="0.88000000"
++ style="stop-color:#000000;stop-opacity:0.0000000;" />
++ <stop
++ id="stop7772"
++ offset="1.0000000"
++ style="stop-color:#a40000;stop-opacity:1.0000000" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7774">
++ <stop
++ id="stop7776"
++ offset="0.0000000"
++ style="stop-color:#727e0a;stop-opacity:1.0000000" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0.0000000;"
++ offset="0.10000000"
++ id="stop7778" />
++ <stop
++ id="stop7780"
++ offset="0.88000000"
++ style="stop-color:#000000;stop-opacity:0.0000000;" />
++ <stop
++ id="stop7782"
++ offset="1.0000000"
++ style="stop-color:#727e0a;stop-opacity:1.0000000" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3554"
++ inkscape:collect="always">
++ <stop
++ id="stop3556"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop3558"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4141"
++ inkscape:collect="always">
++ <stop
++ id="stop4143"
++ offset="0"
++ style="stop-color:#636363;stop-opacity:1;" />
++ <stop
++ id="stop4145"
++ offset="1"
++ style="stop-color:#636363;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4227"
++ inkscape:collect="always">
++ <stop
++ id="stop4229"
++ offset="0"
++ style="stop-color:#2e3436;stop-opacity:1;" />
++ <stop
++ id="stop4231"
++ offset="1"
++ style="stop-color:#2e3436;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4243"
++ inkscape:collect="always">
++ <stop
++ id="stop4245"
++ offset="0"
++ style="stop-color:#888a85;stop-opacity:1;" />
++ <stop
++ id="stop4247"
++ offset="1"
++ style="stop-color:#888a85;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4267"
++ inkscape:collect="always">
++ <stop
++ id="stop4269"
++ offset="0"
++ style="stop-color:#9db029;stop-opacity:1;" />
++ <stop
++ id="stop4271"
++ offset="1"
++ style="stop-color:#9db029;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4275"
++ inkscape:collect="always">
++ <stop
++ id="stop4277"
++ offset="0"
++ style="stop-color:#cc0000;stop-opacity:1;" />
++ <stop
++ id="stop4279"
++ offset="1"
++ style="stop-color:#cc0000;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4307"
++ inkscape:collect="always">
++ <stop
++ id="stop4309"
++ offset="0"
++ style="stop-color:#888a85;stop-opacity:1;" />
++ <stop
++ id="stop4311"
++ offset="1"
++ style="stop-color:#888a85;stop-opacity:0;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective5360"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4264"
++ id="radialGradient4270"
++ cx="23.201941"
++ cy="27.096155"
++ fx="23.201941"
++ fy="27.096155"
++ r="23.555494"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.651032,0.000000,9.455693)"
++ gradientUnits="userSpaceOnUse" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4236"
++ id="linearGradient6005"
++ x1="12.277412"
++ y1="37.205811"
++ x2="12.221823"
++ y2="33.758667"
++ gradientUnits="userSpaceOnUse" />
++ <linearGradient
++ id="linearGradient4184">
++ <stop
++ style="stop-color:#838383;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop6000" />
++ <stop
++ style="stop-color:#bbbbbb;stop-opacity:0.0000000;"
++ offset="1.0000000"
++ id="stop4188" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4228">
++ <stop
++ style="stop-color:#bbbbbb;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop5996" />
++ <stop
++ style="stop-color:#9f9f9f;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop4232" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4244">
++ <stop
++ style="stop-color:#e4e4e4;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop4246" />
++ <stop
++ style="stop-color:#d3d3d3;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop4248" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient4254">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop4256" />
++ <stop
++ style="stop-color:#ffffff;stop-opacity:0;"
++ offset="1"
++ id="stop4258" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient4264">
++ <stop
++ style="stop-color:#000000;stop-opacity:1;"
++ offset="0"
++ id="stop4266" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0;"
++ offset="1"
++ id="stop4268" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4274">
++ <stop
++ id="stop4276"
++ offset="0.0000000"
++ style="stop-color:#ffffff;stop-opacity:0.25490198;" />
++ <stop
++ id="stop4278"
++ offset="1.0000000"
++ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2555">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop2557" />
++ <stop
++ id="stop2561"
++ offset="0.50000000"
++ style="stop-color:#e6e6e6;stop-opacity:1.0000000;" />
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1.0000000;"
++ offset="0.75000000"
++ id="stop2563" />
++ <stop
++ id="stop2565"
++ offset="0.84166664"
++ style="stop-color:#e1e1e1;stop-opacity:1.0000000;" />
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop2559" />
++ </linearGradient>
++ <linearGradient
++ y2="609.50507"
++ x2="302.85715"
++ y1="366.64789"
++ x1="302.85715"
++ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient5969"
++ xlink:href="#linearGradient5048"
++ inkscape:collect="always" />
++ <linearGradient
++ id="linearGradient5961">
++ <stop
++ id="stop5963"
++ offset="0"
++ style="stop-color:black;stop-opacity:0;" />
++ <stop
++ style="stop-color:black;stop-opacity:1;"
++ offset="0.5"
++ id="stop5965" />
++ <stop
++ id="stop5967"
++ offset="1"
++ style="stop-color:black;stop-opacity:0;" />
++ </linearGradient>
++ <radialGradient
++ r="117.14286"
++ fy="486.64789"
++ fx="605.71429"
++ cy="486.64789"
++ cx="605.71429"
++ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient5959"
++ xlink:href="#linearGradient5060"
++ inkscape:collect="always" />
++ <radialGradient
++ r="117.14286"
++ fy="486.64789"
++ fx="605.71429"
++ cy="486.64789"
++ cx="605.71429"
++ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient5951"
++ xlink:href="#linearGradient5060"
++ inkscape:collect="always" />
++ <inkscape:perspective
++ id="perspective5948"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient12810"
++ id="linearGradient12941"
++ gradientUnits="userSpaceOnUse"
++ x1="65.623963"
++ y1="21.459777"
++ x2="87.528968"
++ y2="21.459777"
++ gradientTransform="matrix(0.755725,0,0,0.755725,-25.19847,17.09924)" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient12836"
++ id="linearGradient12934"
++ gradientUnits="userSpaceOnUse"
++ x1="88.750000"
++ y1="31.656250"
++ x2="92.062500"
++ y2="36.656250"
++ gradientTransform="matrix(0.755725,0,0,0.755725,-24.84491,17.27602)" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient12828"
++ id="radialGradient12931"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.732463,0.172296,-0.147115,0.625415,-17.70794,5.185566)"
++ cx="88.593018"
++ cy="33.398670"
++ fx="88.593018"
++ fy="33.398670"
++ r="7.0056136" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient12810"
++ id="linearGradient12927"
++ gradientUnits="userSpaceOnUse"
++ x1="84.998962"
++ y1="25.209778"
++ x2="62.591469"
++ y2="12.022278"
++ gradientTransform="matrix(0.755725,0,0,0.755725,-25.19847,17.09924)" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient11625"
++ id="linearGradient12924"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.985000,0.000000,0.000000,1.022813,-1.675625,-6.638771)"
++ x1="21.500000"
++ y1="30.000000"
++ x2="21.500000"
++ y2="27.375000" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient11625"
++ id="linearGradient12921"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.985000,0.000000,0.000000,1.000000,0.315001,-6.000012)"
++ x1="21.500000"
++ y1="30.000000"
++ x2="21.500000"
++ y2="27.375000" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient11625"
++ id="linearGradient12918"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.016250,0.000000,0.000000,1.000000,1.658750,-6.000012)"
++ x1="21.500000"
++ y1="30.000000"
++ x2="21.500000"
++ y2="27.375000" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient11615"
++ id="radialGradient12909"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(3.070491,2.727143e-15,-3.444813e-15,3.878514,-55.26225,-82.65742)"
++ cx="25.000000"
++ cy="27.749998"
++ fx="25.000000"
++ fy="27.749998"
++ r="4.7500000" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient11602"
++ id="linearGradient11608"
++ x1="24.445671"
++ y1="12.947163"
++ x2="24.445671"
++ y2="39.447163"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.837825,-2.875000,0.164729)" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient11594"
++ id="linearGradient11600"
++ x1="20.092352"
++ y1="8.9471626"
++ x2="31.799011"
++ y2="38.947163"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.061966,0.000000,0.000000,0.837825,-4.389811,0.164729)" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient11508"
++ id="radialGradient11532"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.338462,-4.933466e-14,29.48178)"
++ cx="30.203562"
++ cy="44.565483"
++ fx="30.203562"
++ fy="44.565483"
++ r="6.5659914" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient11520"
++ id="radialGradient11526"
++ cx="24.445690"
++ cy="35.878170"
++ fx="24.445690"
++ fy="35.878170"
++ r="20.530962"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.995058,-1.383691e-32,0.000000,1.671510,-27.19988,-29.02822)" />
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient11508">
++ <stop
++ style="stop-color:#000000;stop-opacity:1;"
++ offset="0"
++ id="stop11510" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0;"
++ offset="1"
++ id="stop11512" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient11520">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop11522" />
++ <stop
++ style="stop-color:#dcdcdc;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop11524" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient11594">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop11596" />
++ <stop
++ style="stop-color:#d1d1d1;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop11598" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient11602">
++ <stop
++ style="stop-color:#f6f6f6;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop11604" />
++ <stop
++ style="stop-color:#e0e0e0;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop11606" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient11615">
++ <stop
++ style="stop-color:#636363;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop11617" />
++ <stop
++ style="stop-color:#000000;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop11619" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient11625">
++ <stop
++ style="stop-color:#fce94f;stop-opacity:1;"
++ offset="0"
++ id="stop11627" />
++ <stop
++ style="stop-color:#fce94f;stop-opacity:0;"
++ offset="1"
++ id="stop11629" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient12810">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop12812" />
++ <stop
++ style="stop-color:#e5e5e5;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop12814" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient12828">
++ <stop
++ style="stop-color:#cccccd;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop12830" />
++ <stop
++ id="stop12862"
++ offset="0.0000000"
++ style="stop-color:#adadae;stop-opacity:1.0000000;" />
++ <stop
++ style="stop-color:#8f8f90;stop-opacity:0.0000000;"
++ offset="1.0000000"
++ id="stop12832" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient12836">
++ <stop
++ style="stop-color:#515152;stop-opacity:1;"
++ offset="0"
++ id="stop12838" />
++ <stop
++ style="stop-color:#515152;stop-opacity:0;"
++ offset="1"
++ id="stop12840" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective6114"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <linearGradient
++ gradientTransform="translate(-64.70027,0)"
++ gradientUnits="userSpaceOnUse"
++ y2="11.030003"
++ x2="10.4375"
++ y1="11.030003"
++ x1="8.0536165"
++ id="linearGradient3794"
++ xlink:href="#linearGradient3788"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(-64.70027,0)"
++ y2="18.984955"
++ x2="10.4375"
++ y1="8.2899637"
++ x1="10.4375"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3668"
++ xlink:href="#linearGradient3657"
++ inkscape:collect="always" />
++ <linearGradient
++ id="linearGradient4608">
++ <stop
++ id="stop4610"
++ offset="0"
++ style="stop-color:#eeeeec" />
++ <stop
++ id="stop4612"
++ offset="1"
++ style="stop-color:#8a8c87;stop-opacity:1;" />
++ </linearGradient>
++ <linearGradient
++ gradientTransform="matrix(0.997993,0,0,1,-97.71685,-9.352993)"
++ spreadMethod="reflect"
++ gradientUnits="userSpaceOnUse"
++ y2="40.9986"
++ x2="57.954308"
++ y1="35.01503"
++ x1="58.015995"
++ id="linearGradient4641"
++ xlink:href="#linearGradient4608"
++ inkscape:collect="always" />
++ <linearGradient
++ id="linearGradient3609"
++ inkscape:collect="always">
++ <stop
++ id="stop3611"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop3613"
++ offset="1"
++ style="stop-color:#000000;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3657">
++ <stop
++ id="stop3659"
++ offset="0"
++ style="stop-color:#fafafa;stop-opacity:1;" />
++ <stop
++ id="stop3661"
++ offset="1"
++ style="stop-color:#bfbfbf;stop-opacity:1;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3674">
++ <stop
++ id="stop3676"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ <stop
++ id="stop3678"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3788">
++ <stop
++ id="stop3790"
++ offset="0"
++ style="stop-color:#cccdcb;stop-opacity:1;" />
++ <stop
++ id="stop3792"
++ offset="1"
++ style="stop-color:#888a85;stop-opacity:1;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3676"
++ inkscape:collect="always">
++ <stop
++ id="stop4022"
++ offset="0"
++ style="stop-color:#eeeeec" />
++ <stop
++ id="stop3680"
++ offset="1"
++ style="stop-color:#555753" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient1557">
++ <stop
++ style="stop-color:#2e3436;stop-opacity:1;"
++ offset="0"
++ id="stop1559" />
++ <stop
++ style="stop-color:#888a85"
++ offset="1"
++ id="stop1561" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3730">
++ <stop
++ style="stop-color:#eeeeec"
++ offset="0"
++ id="stop3732" />
++ <stop
++ style="stop-color:#888a85"
++ offset="1"
++ id="stop3734" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3628"
++ inkscape:collect="always">
++ <stop
++ id="stop3630"
++ offset="0"
++ style="stop-color:#d3d7cf" />
++ <stop
++ id="stop3632"
++ offset="1"
++ style="stop-color:#555753" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3692"
++ inkscape:collect="always">
++ <stop
++ id="stop3694"
++ offset="0"
++ style="stop-color:#2e3436;stop-opacity:1;" />
++ <stop
++ id="stop3696"
++ offset="1"
++ style="stop-color:#babdb6" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4068">
++ <stop
++ id="stop4070"
++ offset="0"
++ style="stop-color:#eaeae9;stop-opacity:1;" />
++ <stop
++ id="stop4072"
++ offset="1"
++ style="stop-color:#a5a7a2;stop-opacity:1;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4099"
++ inkscape:collect="always">
++ <stop
++ id="stop4101"
++ offset="0"
++ style="stop-color:#6f726f;stop-opacity:1;" />
++ <stop
++ id="stop4103"
++ offset="1"
++ style="stop-color:#6f726f;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3498"
++ inkscape:collect="always">
++ <stop
++ id="stop3500"
++ offset="0"
++ style="stop-color:#3465a4;stop-opacity:1;" />
++ <stop
++ id="stop3502"
++ offset="1"
++ style="stop-color:#3465a4;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3510"
++ inkscape:collect="always">
++ <stop
++ id="stop3512"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop3514"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective6409"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="22.637957"
++ x2="7.378232"
++ y1="22.107626"
++ x1="9.485774"
++ id="linearGradient6730"
++ xlink:href="#linearGradient3510"
++ inkscape:collect="always" />
++ <radialGradient
++ r="1.2404949"
++ fy="24.427671"
++ fx="36.82843"
++ cy="24.427677"
++ cx="36.82843"
++ gradientTransform="matrix(13.39869,-4.118282e-6,6.831725e-6,22.22678,-456.6246,-518.5208)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient6728"
++ xlink:href="#linearGradient3498"
++ inkscape:collect="always" />
++ <radialGradient
++ r="1.2404949"
++ fy="24.427683"
++ fx="36.82843"
++ cy="24.427683"
++ cx="36.82843"
++ gradientTransform="matrix(21.09444,2.34445e-15,1.470518e-12,22.22672,-740.0468,-518.5196)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient6726"
++ xlink:href="#linearGradient3498"
++ inkscape:collect="always" />
++ <radialGradient
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(13.39869,-4.118282e-6,6.831725e-6,22.22678,-456.6246,-518.5208)"
++ r="1.2404949"
++ fy="24.427671"
++ fx="36.82843"
++ cy="24.427677"
++ cx="36.82843"
++ id="radialGradient6724"
++ xlink:href="#linearGradient3498"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="24.317278"
++ x2="8.3712559"
++ y1="24.665476"
++ x1="4.6831215"
++ id="linearGradient6722"
++ xlink:href="#linearGradient3281"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="matrix(1.296181,0,0,1.296181,-4.978245,-7.324566)"
++ gradientUnits="userSpaceOnUse"
++ y2="25.736509"
++ x2="9.346509"
++ y1="25.559732"
++ x1="11.125889"
++ id="linearGradient6720"
++ xlink:href="#linearGradient4099"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="27.345011"
++ x2="7.3215322"
++ y1="20.301662"
++ x1="7.5763841"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient6718"
++ xlink:href="#linearGradient4068"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="27.345011"
++ x2="7.3215322"
++ y1="20.301662"
++ x1="7.5763841"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient6716"
++ xlink:href="#linearGradient4068"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(-64.70027,0)"
++ gradientUnits="userSpaceOnUse"
++ y2="11.030003"
++ x2="10.4375"
++ y1="11.030003"
++ x1="8.0536165"
++ id="linearGradient6714"
++ xlink:href="#linearGradient3788"
++ inkscape:collect="always" />
++ <radialGradient
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.525791,4.898427e-16,-1.480441e-8,1.768964,-8.162983e-2,6.066255)"
++ r="2.9831069"
++ fy="12.516305"
++ fx="5.0822492"
++ cy="12.516305"
++ cx="5.0822492"
++ id="radialGradient6712"
++ xlink:href="#linearGradient3674"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(-64.70027,0)"
++ y2="18.984955"
++ x2="10.4375"
++ y1="8.2899637"
++ x1="10.4375"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient6710"
++ xlink:href="#linearGradient3657"
++ inkscape:collect="always" />
++ <radialGradient
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.416,2.706926e-15,10.16382)"
++ r="5.524272"
++ fy="17.403807"
++ fx="6.4081554"
++ cy="17.403807"
++ cx="6.4081554"
++ id="radialGradient6708"
++ xlink:href="#linearGradient3609"
++ inkscape:collect="always" />
++ <linearGradient
++ id="linearGradient6702">
++ <stop
++ id="stop6704"
++ offset="0"
++ style="stop-color:#eeeeec" />
++ <stop
++ id="stop6706"
++ offset="1"
++ style="stop-color:#8a8c87;stop-opacity:1;" />
++ </linearGradient>
++ <linearGradient
++ gradientTransform="matrix(0.997993,0,0,1,-97.71685,-9.352993)"
++ spreadMethod="reflect"
++ gradientUnits="userSpaceOnUse"
++ y2="40.9986"
++ x2="57.954308"
++ y1="35.01503"
++ x1="58.015995"
++ id="linearGradient6700"
++ xlink:href="#linearGradient4608"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6796741"
++ x2="56.609135"
++ y1="4.9369388"
++ x1="56.302975"
++ gradientTransform="matrix(1.769913,0,0,1.769913,-88.34438,10.67235)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient6698"
++ xlink:href="#linearGradient4608"
++ inkscape:collect="always" />
++ <linearGradient
++ id="linearGradient6686">
++ <stop
++ id="stop6688"
++ offset="0"
++ style="stop-color:#fafafa;stop-opacity:1;" />
++ <stop
++ id="stop6690"
++ offset="1"
++ style="stop-color:#bfbfbf;stop-opacity:1;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient6680">
++ <stop
++ id="stop6682"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ <stop
++ id="stop6684"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient6674">
++ <stop
++ id="stop6676"
++ offset="0"
++ style="stop-color:#cccdcb;stop-opacity:1;" />
++ <stop
++ id="stop6678"
++ offset="1"
++ style="stop-color:#888a85;stop-opacity:1;" />
++ </linearGradient>
++ <radialGradient
++ r="9.9205227"
++ fy="0.99004257"
++ fx="-1.0016617"
++ cy="0.99004257"
++ cx="-1.0016617"
++ gradientTransform="matrix(-0.127582,1.416065,-1.630141,-0.146854,17.48751,15.56121)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient6672"
++ xlink:href="#linearGradient3676"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="5.375"
++ x2="20.3125"
++ y1="34.950001"
++ x1="17.0625"
++ id="linearGradient6664"
++ xlink:href="#linearGradient1557"
++ inkscape:collect="always" />
++ <radialGradient
++ r="9.9205227"
++ fy="0.99004257"
++ fx="-1.0016617"
++ cy="0.99004257"
++ cx="-1.0016617"
++ gradientTransform="matrix(-0.310032,2.110862,-2.082775,-0.305867,17.75288,16.41459)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient6656"
++ xlink:href="#linearGradient3730"
++ inkscape:collect="always" />
++ <radialGradient
++ gradientTransform="matrix(6.370852e-2,-1.424475,1.547293,6.92112e-2,-9.530629,30.98681)"
++ gradientUnits="userSpaceOnUse"
++ r="9.375"
++ fy="13.847466"
++ fx="12.704856"
++ cy="13.847466"
++ cx="12.704856"
++ id="radialGradient6648"
++ xlink:href="#linearGradient3628"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="19.269905"
++ x2="-0.51990569"
++ y1="-0.51990569"
++ x1="-0.51990569"
++ id="linearGradient6640"
++ xlink:href="#linearGradient3692"
++ inkscape:collect="always" />
++ <radialGradient
++ gradientTransform="matrix(1.240749,9.690094e-9,-9.043116e-9,1.157631,-1.713645,-1.134736)"
++ gradientUnits="userSpaceOnUse"
++ r="9.375"
++ fy="7.1986876"
++ fx="6.8797626"
++ cy="7.1986876"
++ cx="6.8797626"
++ id="radialGradient6632"
++ xlink:href="#linearGradient3670"
++ inkscape:collect="always" />
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3670">
++ <stop
++ style="stop-color:#d3d7cf"
++ offset="0"
++ id="stop3672" />
++ <stop
++ style="stop-color:#555753"
++ offset="1"
++ id="stop3674" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient6623">
++ <stop
++ id="stop6625"
++ offset="0"
++ style="stop-color:#eaeae9;stop-opacity:1;" />
++ <stop
++ id="stop6627"
++ offset="1"
++ style="stop-color:#a5a7a2;stop-opacity:1;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3281"
++ inkscape:collect="always">
++ <stop
++ id="stop3283"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop3285"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective6599"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient23419"
++ id="radialGradient8917"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.25,0,31.22703)"
++ cx="23.334524"
++ cy="41.63604"
++ fx="23.334524"
++ fy="41.63604"
++ r="22.627417" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#aigrd1"
++ id="linearGradient8919"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.190476,0,0,1.190476,-4.224424,-2.5)"
++ x1="14.9966"
++ y1="11.1885"
++ x2="32.511"
++ y2="34.3075" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#aigrd2"
++ id="linearGradient8921"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.190476,0,0,1.190476,-4.224424,-2.500001)"
++ x1="12.2744"
++ y1="32.4165"
++ x2="35.3912"
++ y2="14.2033" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4236"
++ id="linearGradient8923"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.25,0,0,1.25,-5.652995,-2.604165)"
++ x1="21.125000"
++ y1="14.625000"
++ x2="29.000000"
++ y2="28.000000" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4236"
++ id="linearGradient8925"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.25,0,0,1.25,-5.652995,-2.604165)"
++ x1="21.125000"
++ y1="14.625000"
++ x2="29.000000"
++ y2="28.000000" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient6036"
++ id="linearGradient8927"
++ gradientUnits="userSpaceOnUse"
++ x1="10.501720"
++ y1="3.6100161"
++ x2="48.798885"
++ y2="54.698483" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient6028"
++ id="linearGradient8930"
++ gradientUnits="userSpaceOnUse"
++ x1="28.702885"
++ y1="31.494707"
++ x2="17.742729"
++ y2="18.366575" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3394"
++ id="radialGradient8932"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.848684,0.95802,-0.782119,0.692834,18.69147,-20.52578)"
++ cx="37.751469"
++ cy="27.569166"
++ fx="37.751469"
++ fy="27.569166"
++ r="21.333334" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3406"
++ id="radialGradient8934"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.769501,-1.2425,0.6703,0.415141,-21.77857,41.36563)"
++ cx="26.137741"
++ cy="38.807304"
++ fx="26.137741"
++ fy="38.807304"
++ r="21.333334" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3081"
++ id="radialGradient8936"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.15845,-0.158988,0.432907,0.431441,-2.723645,15.00107)"
++ cx="53.556889"
++ cy="48.238270"
++ fx="53.556889"
++ fy="48.238270"
++ r="21.333334" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3435"
++ id="radialGradient8938"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(5.184267e-3,-0.12286,0.544548,2.297824e-2,0.957234,26.30756)"
++ cx="16.885271"
++ cy="33.377594"
++ fx="16.885271"
++ fy="33.377594"
++ r="21.333334" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3435"
++ id="radialGradient8940"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.105916,-1.91424e-2,0.104789,0.579807,17.13693,7.115158)"
++ cx="35.511295"
++ cy="21.618015"
++ fx="35.511295"
++ fy="21.618015"
++ r="21.333334" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3435"
++ id="radialGradient8942"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(-5.04822e-2,1.387847e-2,-0.12844,-0.467196,35.41257,39.44172)"
++ cx="133.84108"
++ cy="23.914305"
++ fx="133.84108"
++ fy="23.914305"
++ r="21.333334" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5919"
++ id="radialGradient8944"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.201878,0,36.03783)"
++ cx="30.428225"
++ cy="45.153286"
++ fx="30.428225"
++ fy="45.153286"
++ r="13.474453" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2924"
++ id="radialGradient8946"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ cx="10.268794"
++ cy="37.354755"
++ fx="10.268794"
++ fy="37.354755"
++ r="2.1875000" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient10924"
++ id="linearGradient8948"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.743403,0,0,0.776658,142.1177,39.94241)"
++ x1="-171.66670"
++ y1="-46.437500"
++ x2="-132.63971"
++ y2="31.094299" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5485"
++ id="linearGradient8950"
++ gradientUnits="userSpaceOnUse"
++ x1="-210.71640"
++ y1="16.861975"
++ x2="-215.08304"
++ y2="8.6301003" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient7754"
++ id="linearGradient8952"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.730619,0,0,0.767032,177.06,15.53427)"
++ spreadMethod="pad"
++ x1="-223.18059"
++ y1="9.7278442"
++ x2="-194.25365"
++ y2="9.7278442" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5485"
++ id="linearGradient8954"
++ gradientUnits="userSpaceOnUse"
++ x1="-210.71640"
++ y1="16.861975"
++ x2="-215.08304"
++ y2="8.6301003" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5048"
++ id="linearGradient8956"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
++ x1="302.85715"
++ y1="366.64789"
++ x2="302.85715"
++ y2="609.50507" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5060"
++ id="radialGradient8958"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
++ cx="605.71429"
++ cy="486.64789"
++ fx="605.71429"
++ fy="486.64789"
++ r="117.14286" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5060"
++ id="radialGradient8960"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
++ cx="605.71429"
++ cy="486.64789"
++ fx="605.71429"
++ fy="486.64789"
++ r="117.14286" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4228"
++ id="linearGradient8962"
++ gradientUnits="userSpaceOnUse"
++ x1="7.6046205"
++ y1="28.481176"
++ x2="36.183067"
++ y2="40.943935" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4244"
++ id="radialGradient8964"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.286242,0.781698,-0.710782,1.169552,-2.354348,-4.876862)"
++ cx="15.571491"
++ cy="2.9585190"
++ fx="15.571491"
++ fy="2.9585190"
++ r="20.935817" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4184"
++ id="linearGradient8966"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(0.795493,-1.325821)"
++ x1="7.0625000"
++ y1="35.281250"
++ x2="24.687500"
++ y2="35.281250" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#aigrd2"
++ id="linearGradient8968"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.190476,0,0,1.190476,-4.224424,-2.500001)"
++ x1="12.2744"
++ y1="32.4165"
++ x2="35.3912"
++ y2="14.2033" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4274"
++ id="linearGradient8970"
++ gradientUnits="userSpaceOnUse"
++ x1="23.688078"
++ y1="11.318835"
++ x2="23.688078"
++ y2="26.357183" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4254"
++ id="linearGradient8972"
++ gradientUnits="userSpaceOnUse"
++ x1="12.378357"
++ y1="4.4331360"
++ x2="44.096100"
++ y2="47.620636" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2555"
++ id="linearGradient8974"
++ gradientUnits="userSpaceOnUse"
++ x1="33.431175"
++ y1="31.964777"
++ x2="21.747974"
++ y2="11.780679" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient11508"
++ id="radialGradient8976"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.338462,0,29.48178)"
++ cx="30.203562"
++ cy="44.565483"
++ fx="30.203562"
++ fy="44.565483"
++ r="6.5659914" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient12810"
++ id="linearGradient8978"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.37407,0,0,1.37407,-85.1015,-12.38821)"
++ x1="65.623963"
++ y1="21.459777"
++ x2="87.528968"
++ y2="21.459777" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient12836"
++ id="linearGradient8980"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.37407,0,0,1.37407,-84.45865,-12.06679)"
++ x1="88.750000"
++ y1="31.656250"
++ x2="92.062500"
++ y2="36.656250" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient12828"
++ id="radialGradient8982"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.889444,0.209222,-0.178645,0.759454,-34.9767,-11.86445)"
++ cx="88.593018"
++ cy="33.398670"
++ fx="88.593018"
++ fy="33.398670"
++ r="7.0056136" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient12810"
++ id="linearGradient8984"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.37407,0,0,1.37407,-85.1015,-12.38821)"
++ x1="84.998962"
++ y1="25.209778"
++ x2="62.591469"
++ y2="12.022278" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5048"
++ id="linearGradient9016"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
++ x1="302.85715"
++ y1="366.64789"
++ x2="302.85715"
++ y2="609.50507" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5060"
++ id="radialGradient9018"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
++ cx="605.71429"
++ cy="486.64789"
++ fx="605.71429"
++ fy="486.64789"
++ r="117.14286" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5060"
++ id="radialGradient9020"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
++ cx="605.71429"
++ cy="486.64789"
++ fx="605.71429"
++ fy="486.64789"
++ r="117.14286" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4210"
++ id="linearGradient9022"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(1028.0257,-231.1927)"
++ x1="24.990499"
++ y1="34.004856"
++ x2="24.990499"
++ y2="22.585211" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4222"
++ id="linearGradient9024"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(1028.0257,-231.1927)"
++ x1="18.706615"
++ y1="19.912336"
++ x2="30.014812"
++ y2="47.388485" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4182"
++ id="linearGradient9026"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,1.039184,1028.0257,-231.23327)"
++ x1="16.148972"
++ y1="12.636667"
++ x2="34.193642"
++ y2="12.636667" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4987"
++ id="linearGradient9028"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(1028.0257,-231.1927)"
++ x1="21.906841"
++ y1="9.7577486"
++ x2="22.071806"
++ y2="16.020695" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4192"
++ id="linearGradient9030"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.986355,1028.0257,-230.87606)"
++ x1="25.381256"
++ y1="24.720648"
++ x2="24.119167"
++ y2="16.170370" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4995"
++ id="linearGradient9032"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(1028.0257,-231.1927)"
++ x1="36.288929"
++ y1="14.661557"
++ x2="47.065835"
++ y2="15.267649" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2884"
++ id="radialGradient9034"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.353283,0,0,0.635968,-8.45889,3.41347)"
++ cx="23.943670"
++ cy="20.800287"
++ fx="23.943670"
++ fy="20.800287"
++ r="6.4286140" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2869"
++ id="radialGradient9036"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.74942,0,0,0.394055,6.226925,10.09253)"
++ cx="21.578989"
++ cy="9.0255041"
++ fx="21.578989"
++ fy="9.0255041"
++ r="9.5862970" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2884"
++ id="radialGradient9038"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.353283,0,0,0.635968,-8.45889,3.41347)"
++ cx="23.943670"
++ cy="20.800287"
++ fx="23.943670"
++ fy="20.800287"
++ r="6.4286140" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2869"
++ id="radialGradient9040"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.74942,0,0,0.394055,6.226925,10.09253)"
++ cx="21.578989"
++ cy="9.8105707"
++ fx="21.578989"
++ fy="9.8105707"
++ r="9.5862970" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4979"
++ id="linearGradient9042"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(1028.0257,-231.1927)"
++ x1="30.062469"
++ y1="13.444801"
++ x2="17.696169"
++ y2="12.333632" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3690"
++ id="linearGradient9044"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.9609338,0,0,1.8379278,-1111.6001,-1207.6336)"
++ x1="1114.5305"
++ y1="5.378334"
++ x2="1214.5341"
++ y2="5.378334" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3690"
++ id="linearGradient9046"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.4630654,0,0,0.3674593,710.18113,7.2716162)"
++ x1="1114.5305"
++ y1="5.378334"
++ x2="1214.5341"
++ y2="5.378334" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5048"
++ id="linearGradient9048"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
++ x1="302.85715"
++ y1="366.64789"
++ x2="302.85715"
++ y2="609.50507" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5060"
++ id="radialGradient9050"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
++ cx="605.71429"
++ cy="486.64789"
++ fx="605.71429"
++ fy="486.64789"
++ r="117.14286" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5060"
++ id="radialGradient9052"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
++ cx="605.71429"
++ cy="486.64789"
++ fx="605.71429"
++ fy="486.64789"
++ r="117.14286" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4210"
++ id="linearGradient9054"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(1028.0257,-231.1927)"
++ x1="24.990499"
++ y1="34.004856"
++ x2="24.990499"
++ y2="22.585211" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4222"
++ id="linearGradient9056"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(1028.0257,-231.1927)"
++ x1="18.706615"
++ y1="19.912336"
++ x2="30.014812"
++ y2="47.388485" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4182"
++ id="linearGradient9058"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,1.039184,1028.0257,-231.23327)"
++ x1="16.148972"
++ y1="12.636667"
++ x2="34.193642"
++ y2="12.636667" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4987"
++ id="linearGradient9060"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(1028.0257,-231.1927)"
++ x1="21.906841"
++ y1="9.7577486"
++ x2="22.071806"
++ y2="16.020695" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4192"
++ id="linearGradient9062"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.986355,1028.0257,-230.87606)"
++ x1="25.381256"
++ y1="24.720648"
++ x2="24.119167"
++ y2="16.170370" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4995"
++ id="linearGradient9064"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(1028.0257,-231.1927)"
++ x1="36.288929"
++ y1="14.661557"
++ x2="47.065835"
++ y2="15.267649" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2884"
++ id="radialGradient9066"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.353283,0,0,0.635968,-8.45889,3.41347)"
++ cx="23.943670"
++ cy="20.800287"
++ fx="23.943670"
++ fy="20.800287"
++ r="6.4286140" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2869"
++ id="radialGradient9068"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.74942,0,0,0.394055,6.226925,10.09253)"
++ cx="21.578989"
++ cy="9.0255041"
++ fx="21.578989"
++ fy="9.0255041"
++ r="9.5862970" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2884"
++ id="radialGradient9070"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.353283,0,0,0.635968,-8.45889,3.41347)"
++ cx="23.943670"
++ cy="20.800287"
++ fx="23.943670"
++ fy="20.800287"
++ r="6.4286140" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2869"
++ id="radialGradient9072"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.74942,0,0,0.394055,6.226925,10.09253)"
++ cx="21.578989"
++ cy="9.8105707"
++ fx="21.578989"
++ fy="9.8105707"
++ r="9.5862970" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4979"
++ id="linearGradient9074"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(1028.0257,-231.1927)"
++ x1="30.062469"
++ y1="13.444801"
++ x2="17.696169"
++ y2="12.333632" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2300"
++ id="radialGradient9076"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.399258,-2.234445e-7,8.196178e-8,0.513264,4.365074,4.839285)"
++ cx="14.287618"
++ cy="68.872971"
++ fx="14.287618"
++ fy="72.568001"
++ r="11.689870" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#aigrd1"
++ id="linearGradient9078"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.200685,0,0,0.200685,-54.33576,-1.050787)"
++ x1="99.7773"
++ y1="15.4238"
++ x2="153.0005"
++ y2="248.6311" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2072"
++ id="radialGradient9080"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.398649,0,21.2728)"
++ cx="23.250000"
++ cy="35.375000"
++ fx="23.250000"
++ fy="35.375000"
++ r="18.500000" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2315"
++ id="radialGradient9082"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.509804,0,16.05392)"
++ cx="4.3920336"
++ cy="32.307854"
++ fx="4.3920336"
++ fy="32.307854"
++ r="6.3750000" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2315"
++ id="radialGradient9084"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.509804,0,16.05392)"
++ cx="4.3920336"
++ cy="32.307854"
++ fx="4.3920336"
++ fy="32.307854"
++ r="6.3750000" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient7079"
++ id="radialGradient9086"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.663934,0,9.061528)"
++ cx="23.157747"
++ cy="26.963573"
++ fx="23.157747"
++ fy="26.963573"
++ r="21.566757" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#aigrd4"
++ id="radialGradient9088"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.8013773,0,0,0.8013773,1475.9034,-149.67743)"
++ cx="20.655508"
++ cy="24.735121"
++ fx="20.655508"
++ fy="24.735121"
++ r="14.1515" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient7087"
++ id="linearGradient9090"
++ gradientUnits="userSpaceOnUse"
++ x1="23.816254"
++ y1="12.75"
++ x2="29.049412"
++ y2="25.772396" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient7054"
++ id="linearGradient9092"
++ gradientUnits="userSpaceOnUse"
++ x1="21.03167"
++ y1="31.867859"
++ x2="21.107563"
++ y2="-4.5986342" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient7069"
++ id="linearGradient9094"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.7091211,0,0,0.7091211,1478.5851,-152.30353)"
++ x1="46.54464"
++ y1="35.24506"
++ x2="40.820396"
++ y2="34.140205" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient7138"
++ id="linearGradient9096"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.8013773,0,0,0.8013773,1474.3233,-155.46349)"
++ x1="43.6875"
++ y1="32.133045"
++ x2="26.625"
++ y2="32.133045" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2454"
++ id="radialGradient9098"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="scale(1.925808,0.519262)"
++ cx="12.575710"
++ cy="67.501709"
++ fx="12.575710"
++ fy="67.501709"
++ r="8.7662794" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2321"
++ id="linearGradient9100"
++ gradientUnits="userSpaceOnUse"
++ x1="-35.658386"
++ y1="33.416473"
++ x2="-35.658386"
++ y2="28.205938" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2329"
++ id="linearGradient9102"
++ gradientUnits="userSpaceOnUse"
++ x1="-35.122688"
++ y1="34.242237"
++ x2="-35.074745"
++ y2="30.962345" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2701"
++ id="linearGradient9104"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.816345,0,0,1.278927,1688.6456,-199.39317)"
++ x1="12.206709"
++ y1="53.535141"
++ x2="12.127711"
++ y2="64.892525" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2245"
++ id="linearGradient9106"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.129863,0,0,0.885063,1689.0206,-157.57746)"
++ x1="8.6116238"
++ y1="7.2293582"
++ x2="34.784473"
++ y2="33.339787" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2253"
++ id="linearGradient9108"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.104397,0,0,0.905471,1690.6456,-156.27309)"
++ x1="10.390738"
++ y1="5.3817744"
++ x2="32.536823"
++ y2="31.246054" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2675"
++ id="linearGradient9110"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.174139,0,0,0.945431,1691.3674,-157.60461)"
++ x1="19.150396"
++ y1="32.622238"
++ x2="16.315819"
++ y2="8.8666229" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2683"
++ id="linearGradient9112"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(5.705159,0,0,0.17528,1691.6456,-156.95246)"
++ x1="3.7069976"
++ y1="171.29134"
++ x2="3.7069974"
++ y2="162.45061" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2415"
++ id="linearGradient9114"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.108069,0,0,0.902471,1691.6456,-155.27309)"
++ x1="17.698339"
++ y1="13.004725"
++ x2="34.974548"
++ y2="55.200756" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2667"
++ id="linearGradient9116"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.238977,0,0,0.895955,1691.2362,-157.60461)"
++ x1="11.492236"
++ y1="1.6537577"
++ x2="17.199417"
++ y2="26.729263" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2711"
++ id="linearGradient9118"
++ gradientUnits="userSpaceOnUse"
++ x1="34.300991"
++ y1="3.9384086"
++ x2="35.520542"
++ y2="3.8451097" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2711"
++ id="linearGradient9120"
++ gradientUnits="userSpaceOnUse"
++ x1="34.300991"
++ y1="3.9384086"
++ x2="35.520542"
++ y2="3.8451097" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2711"
++ id="linearGradient9122"
++ gradientUnits="userSpaceOnUse"
++ x1="34.300991"
++ y1="3.9384086"
++ x2="35.520542"
++ y2="3.8451097" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2711"
++ id="linearGradient9124"
++ gradientUnits="userSpaceOnUse"
++ x1="34.300991"
++ y1="3.9384086"
++ x2="35.520542"
++ y2="3.8451097" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2711"
++ id="linearGradient9126"
++ gradientUnits="userSpaceOnUse"
++ x1="34.300991"
++ y1="3.9384086"
++ x2="35.520542"
++ y2="3.8451097" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2684"
++ id="linearGradient9128"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.128181,0,0,1.128181,-53.99314,-83.36009)"
++ x1="70.913956"
++ y1="101.74152"
++ x2="70.951942"
++ y2="88.923729" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2691"
++ id="radialGradient9130"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(5.324342e-2,-0.836238,2.019473,0.128568,-151.9195,108.0768)"
++ cx="107.5884"
++ cy="83.990814"
++ fx="107.5884"
++ fy="83.990814"
++ r="12.551644" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5075"
++ id="linearGradient9132"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(-45.00042,-71.09425)"
++ x1="71.288956"
++ y1="124.11652"
++ x2="70.826942"
++ y2="95" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2817"
++ id="linearGradient9134"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.103262,0,0,1.054917,-163.1228,-76.31138)"
++ x1="174.83363"
++ y1="84.263489"
++ x2="174.74524"
++ y2="105.49083" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2679"
++ id="radialGradient9136"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,212.6949)"
++ cx="169.77171"
++ cy="100.20107"
++ fx="169.77171"
++ fy="100.20107"
++ r="11" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2697"
++ id="linearGradient9138"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,1.004384,-145.0004,-71.4625)"
++ x1="169"
++ y1="110.33805"
++ x2="169"
++ y2="93.204849" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3081"
++ id="linearGradient9140"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(-4e-4,-9.426e-2)"
++ x1="15.089521"
++ y1="15.291994"
++ x2="14"
++ y2="52.510574" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2817"
++ id="linearGradient9142"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.103262,0,0,1.054917,-163.1228,-76.31138)"
++ x1="174.83363"
++ y1="84.263489"
++ x2="174.74524"
++ y2="105.49083" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2679"
++ id="radialGradient9144"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,212.6949)"
++ cx="169.77171"
++ cy="100.20107"
++ fx="169.77171"
++ fy="100.20107"
++ r="11" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2697"
++ id="linearGradient9146"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,1.004384,-145.0004,-71.4625)"
++ x1="169"
++ y1="110.33805"
++ x2="169"
++ y2="93.204849" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3081"
++ id="linearGradient9148"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(-4e-4,-9.426e-2)"
++ x1="15.089521"
++ y1="15.291994"
++ x2="14"
++ y2="52.510574" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3609"
++ id="radialGradient9158"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.416,0,10.16382)"
++ cx="6.4081554"
++ cy="17.403807"
++ fx="6.4081554"
++ fy="17.403807"
++ r="5.524272" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4068"
++ id="linearGradient9160"
++ gradientUnits="userSpaceOnUse"
++ x1="7.5763841"
++ y1="20.301662"
++ x2="7.3215322"
++ y2="27.345011" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4068"
++ id="linearGradient9162"
++ gradientUnits="userSpaceOnUse"
++ x1="7.5763841"
++ y1="20.301662"
++ x2="7.3215322"
++ y2="27.345011" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3264"
++ id="linearGradient9164"
++ gradientUnits="userSpaceOnUse"
++ x1="4.6831215"
++ y1="24.665476"
++ x2="8.3712559"
++ y2="24.317278" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4608"
++ id="linearGradient9166"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.769913,0,0,1.769913,-88.34438,10.67235)"
++ x1="56.302975"
++ y1="4.9369388"
++ x2="56.609135"
++ y2="8.6796741" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4099"
++ id="linearGradient9168"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.296181,0,0,1.296181,-4.978245,-7.324566)"
++ x1="11.125889"
++ y1="25.559732"
++ x2="9.346509"
++ y2="25.736509" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3510"
++ id="linearGradient9170"
++ gradientUnits="userSpaceOnUse"
++ x1="9.485774"
++ y1="22.107626"
++ x2="7.378232"
++ y2="22.637957" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3674"
++ id="radialGradient9172"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.525791,0,-1.480441e-8,1.768964,-8.162983e-2,6.066255)"
++ cx="5.0822492"
++ cy="12.516305"
++ fx="5.0822492"
++ fy="12.516305"
++ r="2.9831069" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3676"
++ id="radialGradient9174"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(-0.127582,1.416065,-1.630141,-0.146854,17.48751,15.56121)"
++ cx="-1.0016617"
++ cy="0.99004257"
++ fx="-1.0016617"
++ fy="0.99004257"
++ r="9.9205227" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient1557"
++ id="linearGradient9176"
++ gradientUnits="userSpaceOnUse"
++ x1="17.0625"
++ y1="34.950001"
++ x2="20.3125"
++ y2="5.375" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3730"
++ id="radialGradient9178"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(-0.310032,2.110862,-2.082775,-0.305867,17.75288,16.41459)"
++ cx="-1.0016617"
++ cy="0.99004257"
++ fx="-1.0016617"
++ fy="0.99004257"
++ r="9.9205227" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3628"
++ id="radialGradient9180"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(6.370852e-2,-1.424475,1.547293,6.92112e-2,-9.530629,30.98681)"
++ cx="12.704856"
++ cy="13.847466"
++ fx="12.704856"
++ fy="13.847466"
++ r="9.375" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3692"
++ id="linearGradient9182"
++ gradientUnits="userSpaceOnUse"
++ x1="-0.51990569"
++ y1="-0.51990569"
++ x2="-0.51990569"
++ y2="19.269905" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient9203"
++ id="radialGradient9184"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.240749,0,0,1.157631,-1.713645,-1.134736)"
++ cx="6.8797626"
++ cy="7.1986876"
++ fx="6.8797626"
++ fy="7.1986876"
++ r="9.375" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3498"
++ id="radialGradient9186"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(13.39869,-4.118282e-6,6.831725e-6,22.22678,-456.6246,-518.5208)"
++ cx="36.82843"
++ cy="24.427677"
++ fx="36.82843"
++ fy="24.427671"
++ r="1.2404949" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3498"
++ id="radialGradient9188"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(13.39869,-4.118282e-6,6.831725e-6,22.22678,-456.6246,-518.5208)"
++ cx="36.82843"
++ cy="24.427677"
++ fx="36.82843"
++ fy="24.427671"
++ r="1.2404949" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3498"
++ id="radialGradient9190"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(21.09444,0,0,22.22672,-740.0468,-518.5196)"
++ cx="36.82843"
++ cy="24.427683"
++ fx="36.82843"
++ fy="24.427683"
++ r="1.2404949" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3081"
++ id="linearGradient9250"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(3.000198,0,0,1,94.59141,-143.04229)"
++ x1="15.089521"
++ y1="15.291994"
++ x2="14"
++ y2="52.510574" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2697"
++ id="linearGradient9253"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(2.498884,0,0,1.004384,-252.46439,-214.45876)"
++ x1="169"
++ y1="110.33805"
++ x2="169"
++ y2="93.204849" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2679"
++ id="radialGradient9256"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(8.905772e-6,-1.07205,4.98026,-1.250658e-6,-329.18179,69.74687)"
++ cx="169.77171"
++ cy="100.20107"
++ fx="169.77171"
++ fy="100.20107"
++ r="11" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2817"
++ id="linearGradient9259"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(2.624525,0,0,1.054917,-274.50449,-219.25939)"
++ x1="174.83363"
++ y1="84.263489"
++ x2="174.74524"
++ y2="105.49083" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient7079"
++ id="radialGradient9686"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.663934,0,9.061528)"
++ cx="23.157747"
++ cy="26.963573"
++ fx="23.157747"
++ fy="26.963573"
++ r="21.566757" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#aigrd4"
++ id="radialGradient9688"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.8013773,0,0,0.8013773,1475.9034,-149.67743)"
++ cx="20.655508"
++ cy="24.735121"
++ fx="20.655508"
++ fy="24.735121"
++ r="14.1515" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient7087"
++ id="linearGradient9690"
++ gradientUnits="userSpaceOnUse"
++ x1="23.816254"
++ y1="12.75"
++ x2="29.049412"
++ y2="25.772396" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient7054"
++ id="linearGradient9692"
++ gradientUnits="userSpaceOnUse"
++ x1="21.03167"
++ y1="31.867859"
++ x2="21.107563"
++ y2="-4.5986342" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient7069"
++ id="linearGradient9694"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.7091211,0,0,0.7091211,1478.5851,-152.30353)"
++ x1="46.54464"
++ y1="35.24506"
++ x2="40.820396"
++ y2="34.140205" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient7138"
++ id="linearGradient9696"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.8013773,0,0,0.8013773,1474.3233,-155.46349)"
++ x1="43.6875"
++ y1="32.133045"
++ x2="26.625"
++ y2="32.133045" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3690"
++ id="linearGradient9804"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.9609338,0,0,1.8379278,-1673.2125,192.64678)"
++ x1="1114.5305"
++ y1="5.378334"
++ x2="1214.5341"
++ y2="5.378334" />
++ </defs>
++ <metadata
++ id="metadata7">
++ <rdf:RDF>
++ <cc:Work
++ rdf:about="">
++ <dc:format>image/svg+xml</dc:format>
++ <dc:type
++ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
++ <dc:title>gstreamer diagrams</dc:title>
++ <dc:creator>
++ <cc:Agent>
++ <dc:title>Luc Pionchon</dc:title>
++ </cc:Agent>
++ </dc:creator>
++ <dc:date>June 2008</dc:date>
++ <dc:description>This diagram uses icons from the Tango Desktop Project. http://tango.freedesktop.org</dc:description>
++ <cc:license
++ rdf:resource="http://creativecommons.org/licenses/by-nc-sa/3.0/" />
++ </cc:Work>
++ <cc:License
++ rdf:about="http://creativecommons.org/licenses/by-nc-sa/3.0/">
++ <cc:permits
++ rdf:resource="http://creativecommons.org/ns#Reproduction" />
++ <cc:permits
++ rdf:resource="http://creativecommons.org/ns#Distribution" />
++ <cc:requires
++ rdf:resource="http://creativecommons.org/ns#Notice" />
++ <cc:requires
++ rdf:resource="http://creativecommons.org/ns#Attribution" />
++ <cc:prohibits
++ rdf:resource="http://creativecommons.org/ns#CommercialUse" />
++ <cc:permits
++ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
++ <cc:requires
++ rdf:resource="http://creativecommons.org/ns#ShareAlike" />
++ </cc:License>
++ </rdf:RDF>
++ </metadata>
++ <g
++ id="layer1"
++ inkscape:groupmode="layer"
++ inkscape:label="Layer 1">
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.83576286;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect5471"
++ width="78.164238"
++ height="78.164238"
++ x="550.91791"
++ y="-492.71994"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.83576286;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect5485"
++ width="78.164238"
++ height="78.164238"
++ x="645.91791"
++ y="-492.71994"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <g
++ id="g5487"
++ transform="matrix(1,0,0,-1,458.77161,-1225.6546)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003">
++ <path
++ transform="translate(-7.529188,12.389655)"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ sodipodi:ry="5.8746634"
++ sodipodi:rx="5.8746634"
++ sodipodi:cy="-724.04565"
++ sodipodi:cx="234.08273"
++ id="path5489"
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path5491"
++ d="M 226.55355,-704.02579 L 226.55355,-695.13782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path5493"
++ d="M 226.55323,-731.67826 L 226.55323,-722.63782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:open="true"
++ sodipodi:end="6.2831853"
++ sodipodi:start="3.1415927"
++ transform="translate(3.8344747,12.462043)"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ sodipodi:ry="9.2349148"
++ sodipodi:rx="9.2349148"
++ sodipodi:cy="-724.11804"
++ sodipodi:cx="222.71907"
++ id="path5495"
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ </g>
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.83576286;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect10266"
++ width="78.164238"
++ height="78.164238"
++ x="172.91788"
++ y="-493.71994"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2.02259612;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect10274"
++ width="185.4816"
++ height="144.85741"
++ x="787.07178"
++ y="-678.30359"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:0.6;fill:#fcaf3e;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect10254"
++ width="106.05405"
++ height="58.375156"
++ x="282.68732"
++ y="-773.89111"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:0.6;fill:#fcaf3e;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect10256"
++ width="106.05405"
++ height="58.375156"
++ x="402.10828"
++ y="-773.89111"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:0.6;fill:#fcaf3e;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect10258"
++ width="106.05405"
++ height="58.375156"
++ x="521.52924"
++ y="-773.89111"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:0.6;fill:#fcaf3e;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect10260"
++ width="106.05405"
++ height="58.375156"
++ x="640.9502"
++ y="-773.89111"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:0.6;fill:#fcaf3e;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect10252"
++ width="106.05405"
++ height="58.375156"
++ x="163.26636"
++ y="-773.89111"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <g
++ id="layer4"
++ inkscape:label="contorno"
++ style="display:inline"
++ transform="translate(1071.1328,-335.93253)" />
++ <flowRoot
++ xml:space="preserve"
++ id="flowRoot6177"
++ style="fill:black;fill-opacity:1;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;font-family:Bitstream Vera Sans;font-style:normal;font-weight:normal;font-size:10"><flowRegion
++ id="flowRegion6179"><rect
++ id="rect6181"
++ width="28.08502"
++ height="36.345318"
++ x="738.47083"
++ y="-251.93916" /></flowRegion><flowPara
++ id="flowPara6183" /></flowRoot> <rect
++ ry="5"
++ rx="5"
++ y="414.31732"
++ x="65.707336"
++ height="178.42247"
++ width="950.7605"
++ id="rect4780"
++ style="fill:#eeeeec;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <rect
++ ry="5"
++ rx="5"
++ y="-23.059189"
++ x="-484.37994"
++ height="99.162369"
++ width="153.2551"
++ id="rect2385"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
++ <text
++ id="text3163"
++ y="-7.783432"
++ x="-478.60358"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"><tspan
++ y="-7.783432"
++ x="-478.60358"
++ id="tspan3165"
++ sodipodi:role="line"
++ style="font-size:12px"><Element name></tspan></text>
++ <g
++ id="g3234"
++ transform="translate(-682.21996,-497.61921)">
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect2387"
++ width="49.561798"
++ height="33.867229"
++ x="197.83418"
++ y="519.57288" />
++ <text
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="209.81161"
++ y="540.6366"
++ id="text3167"><tspan
++ sodipodi:role="line"
++ id="tspan3169"
++ x="209.81161"
++ y="540.6366">sink</tspan></text>
++ </g>
++ <g
++ id="g3229"
++ transform="translate(-682.21996,-497.61921)">
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3179"
++ width="49.561798"
++ height="33.867229"
++ x="301.50095"
++ y="519.57288" />
++ <text
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="320.49963"
++ y="540.6366"
++ id="text3171"><tspan
++ sodipodi:role="line"
++ id="tspan3173"
++ x="320.49963"
++ y="540.6366">src</tspan></text>
++ </g>
++ <rect
++ ry="5"
++ rx="5"
++ y="97.25148"
++ x="-484.23145"
++ height="135.21065"
++ width="152.95805"
++ id="rect3187"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:2.08029437;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
++ <text
++ id="text3191"
++ y="112.37874"
++ x="-478.60358"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"><tspan
++ y="112.37874"
++ x="-478.60358"
++ id="tspan3193"
++ sodipodi:role="line"
++ style="font-size:12px"><Element name></tspan></text>
++ <g
++ transform="translate(-682.21998,-497.18103)"
++ id="g3205">
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3189"
++ width="49.561798"
++ height="33.867229"
++ x="197.8342"
++ y="639.73505" />
++ <text
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="209.81163"
++ y="660.79877"
++ id="text3195"><tspan
++ sodipodi:role="line"
++ id="tspan3197"
++ x="209.81163"
++ y="660.79877">sink</tspan></text>
++ </g>
++ <rect
++ ry="5"
++ rx="5"
++ y="255.19386"
++ x="-483.9447"
++ height="183.60526"
++ width="152.61688"
++ id="rect3239"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:2.42145824;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
++ <text
++ id="text3241"
++ y="270.15054"
++ x="-478.48743"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"><tspan
++ y="270.15054"
++ x="-478.48743"
++ id="tspan3243"
++ sodipodi:role="line"
++ style="font-size:12px"><Element name></tspan></text>
++ <g
++ transform="translate(-682.10382,-339.02141)"
++ id="g3245">
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3247"
++ width="49.561798"
++ height="33.867229"
++ x="197.8342"
++ y="639.73505" />
++ <text
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="209.81163"
++ y="660.79877"
++ id="text3249"><tspan
++ sodipodi:role="line"
++ id="tspan3251"
++ x="209.81163"
++ y="660.79877">sink</tspan></text>
++ </g>
++ <g
++ transform="translate(-682.1038,-339.84744)"
++ id="g3253">
++ <g
++ id="g3255">
++ <rect
++ y="639.73505"
++ x="301.50095"
++ height="33.867229"
++ width="49.561798"
++ id="rect3257"
++ style="opacity:1;fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
++ </g>
++ <text
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="310.49963"
++ y="660.79877"
++ id="text3259"><tspan
++ sodipodi:role="line"
++ id="tspan3261"
++ x="310.49963"
++ y="660.79877">src_01</tspan></text>
++ </g>
++ <g
++ transform="translate(-682.1038,-296.86872)"
++ id="g3263">
++ <g
++ id="g3265">
++ <rect
++ y="639.73505"
++ x="301.50095"
++ height="33.867229"
++ width="49.561798"
++ id="rect3267"
++ style="opacity:1;fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
++ </g>
++ <text
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="311.29715"
++ y="660.79877"
++ id="text3269"><tspan
++ sodipodi:role="line"
++ id="tspan3271"
++ x="311.29715"
++ y="660.79877">src_02</tspan></text>
++ </g>
++ <g
++ id="g3323"
++ transform="translate(-682.21996,-497.61921)">
++ <g
++ id="g3275"
++ transform="translate(-4.1e-6,244.53004)">
++ <rect
++ y="639.73505"
++ x="301.50095"
++ height="33.867229"
++ width="49.561798"
++ id="rect3277"
++ style="opacity:1;fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
++ </g>
++ <text
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="310.49963"
++ y="905.3288"
++ id="text3279"><tspan
++ sodipodi:role="line"
++ id="tspan3281"
++ x="310.49963"
++ y="905.3288">src_03</tspan></text>
++ </g>
++ <g
++ id="g3285"
++ transform="translate(-682.21996,-497.18103)">
++ <g
++ id="g3287">
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3289"
++ width="49.561798"
++ height="33.867229"
++ x="301.50095"
++ y="639.73505" />
++ </g>
++ <text
++ id="text3291"
++ y="660.79877"
++ x="310.49963"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"><tspan
++ y="660.79877"
++ x="310.49963"
++ id="tspan3293"
++ sodipodi:role="line">src_01</tspan></text>
++ </g>
++ <g
++ id="g3295"
++ transform="translate(-682.21997,-454.20231)">
++ <g
++ id="g3297">
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3299"
++ width="49.561798"
++ height="33.867229"
++ x="301.50095"
++ y="639.73505" />
++ </g>
++ <text
++ id="text3301"
++ y="660.79877"
++ x="311.29715"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"><tspan
++ y="660.79877"
++ x="311.29715"
++ id="tspan3303"
++ sodipodi:role="line">src_02</tspan></text>
++ </g>
++ <rect
++ ry="5"
++ rx="5"
++ y="483.18698"
++ x="74.986877"
++ height="99.162369"
++ width="153.2551"
++ id="rect3369"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3371"
++ y="498.46274"
++ x="80.763252"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="498.46274"
++ x="80.763252"
++ id="tspan3373"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">file-source</tspan></text>
++ <rect
++ y="528.19983"
++ x="178.64783"
++ height="33.867229"
++ width="49.561798"
++ id="rect3385"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3387"
++ y="547.86298"
++ x="197.64655"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="547.86298"
++ x="197.64655"
++ id="tspan3389"
++ sodipodi:role="line">src</tspan></text>
++ <rect
++ ry="5"
++ rx="5"
++ y="483.18698"
++ x="269.104"
++ height="99.162369"
++ width="153.2551"
++ id="rect3391"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3393"
++ y="498.46274"
++ x="274.88037"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="498.46274"
++ x="274.88037"
++ id="tspan3395"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">ogg-demuxer</tspan></text>
++ <rect
++ y="528.19983"
++ x="269.09814"
++ height="33.867229"
++ width="49.561798"
++ id="rect3399"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3401"
++ y="548.86151"
++ x="281.07556"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="548.86151"
++ x="281.07556"
++ id="tspan3403"
++ sodipodi:role="line">sink</tspan></text>
++ <rect
++ y="528.19983"
++ x="372.76489"
++ height="33.867229"
++ width="49.561798"
++ id="rect3407"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3409"
++ y="547.66522"
++ x="383.76355"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="547.66522"
++ x="383.76355"
++ id="tspan3411"
++ sodipodi:role="line">src_01</tspan></text>
++ <rect
++ ry="5"
++ rx="5"
++ y="483.18698"
++ x="463.22095"
++ height="99.162369"
++ width="153.2551"
++ id="rect3413"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3415"
++ y="498.46274"
++ x="468.99744"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="498.46274"
++ x="468.99744"
++ id="tspan3417"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">vorbis-decoder</tspan></text>
++ <rect
++ y="528.19983"
++ x="463.21509"
++ height="33.867229"
++ width="49.561798"
++ id="rect3421"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3423"
++ y="548.86151"
++ x="475.1925"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="548.86151"
++ x="475.1925"
++ id="tspan3425"
++ sodipodi:role="line">sink</tspan></text>
++ <rect
++ y="528.19983"
++ x="566.88184"
++ height="33.867229"
++ width="49.561798"
++ id="rect3429"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3431"
++ y="547.86298"
++ x="585.88062"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="547.86298"
++ x="585.88062"
++ id="tspan3433"
++ sodipodi:role="line">src</tspan></text>
++ <rect
++ ry="5"
++ rx="5"
++ y="483.18698"
++ x="658.03381"
++ height="99.162369"
++ width="153.2551"
++ id="rect3435"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3437"
++ y="498.46274"
++ x="663.8103"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="498.46274"
++ x="663.8103"
++ id="tspan3439"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">converter</tspan></text>
++ <rect
++ y="528.19983"
++ x="658.02808"
++ height="33.867229"
++ width="49.561798"
++ id="rect3443"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3445"
++ y="548.86151"
++ x="670.00562"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="548.86151"
++ x="670.00562"
++ id="tspan3447"
++ sodipodi:role="line">sink</tspan></text>
++ <rect
++ y="528.19983"
++ x="761.69495"
++ height="33.867229"
++ width="49.561798"
++ id="rect3451"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3453"
++ y="547.86298"
++ x="780.6936"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="547.86298"
++ x="780.6936"
++ id="tspan3455"
++ sodipodi:role="line">src</tspan></text>
++ <rect
++ ry="5"
++ rx="5"
++ y="483.18698"
++ x="851.8031"
++ height="99.162369"
++ width="153.2551"
++ id="rect3457"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3459"
++ y="498.46274"
++ x="857.57947"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="498.46274"
++ x="857.57947"
++ id="tspan3461"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">alsa-output</tspan></text>
++ <rect
++ y="528.19983"
++ x="851.79724"
++ height="33.867229"
++ width="49.561798"
++ id="rect3465"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3467"
++ y="548.86151"
++ x="863.77466"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="548.86151"
++ x="863.77466"
++ id="tspan3469"
++ sodipodi:role="line">sink</tspan></text>
++ <path
++ sodipodi:nodetypes="cc"
++ id="path3481"
++ d="M 228.019,545.15372 L 265.01904,545.15372"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text4782"
++ y="435.7399"
++ x="77.004333"
++ style="font-size:18px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="435.7399"
++ x="77.004333"
++ id="tspan4784"
++ sodipodi:role="line"
++ style="font-size:18px;font-weight:bold;fill:#204a87;-inkscape-font-specification:Bitstream Vera Sans Bold">pipeline</tspan></text>
++ <path
++ sodipodi:nodetypes="cc"
++ id="path6087"
++ d="M 422.08244,545.15372 L 459.08244,545.15372"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path6089"
++ d="M 616.91234,545.15372 L 653.91234,545.15372"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path6091"
++ d="M 810.63044,545.15372 L 847.63044,545.15372"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <g
++ inkscape:label="Layer 1"
++ id="g4840"
++ transform="translate(61.772614,-51.56596)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <path
++ transform="matrix(1,0,0,1.066291,1,-2.885106)"
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ d="M 45.961941,41.63604 A 22.627417,5.6568542 0 1 1 0.70710754,41.63604 A 22.627417,5.6568542 0 1 1 45.961941,41.63604 z"
++ sodipodi:ry="5.6568542"
++ sodipodi:rx="22.627417"
++ sodipodi:cy="41.63604"
++ sodipodi:cx="23.334524"
++ id="path23417"
++ style="opacity:0.55;fill:url(#radialGradient8917);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ style="fill:url(#linearGradient8919);fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
++ d="M 24.347006,4.1666669 C 12.799386,4.1666669 3.5136719,13.452381 3.5136719,25 C 3.5136719,36.54762 12.799386,45.833335 24.347006,45.833335 C 35.894626,45.833335 45.180341,36.54762 45.180341,25 C 45.180341,13.452381 35.894626,4.1666669 24.347006,4.1666669 L 24.347006,4.1666669 z M 24.347006,30.000001 C 21.608911,30.000001 19.347006,27.738096 19.347006,25 C 19.347006,22.261905 21.608911,20 24.347006,20 C 27.085101,20 29.347006,22.261905 29.347006,25 C 29.347006,27.738096 27.085101,30.000001 24.347006,30.000001 z"
++ id="path3040"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="fill:url(#linearGradient8921);fill-rule:nonzero;stroke:#808080;stroke-miterlimit:4;stroke-opacity:1"
++ d="M 24.347006,4.1666665 C 12.799386,4.1666665 3.513672,13.452381 3.513672,25 C 3.513672,36.54762 12.799386,45.833335 24.347006,45.833335 C 35.894626,45.833335 45.180341,36.54762 45.180341,25 C 45.180341,13.452381 35.894626,4.1666665 24.347006,4.1666665 L 24.347006,4.1666665 z M 24.347006,30.000001 C 21.608911,30.000001 19.347006,27.738096 19.347006,25 C 19.347006,22.261905 21.608911,20 24.347006,20 C 27.085101,20 29.347006,22.261905 29.347006,25 C 29.347006,27.738096 27.085101,30.000001 24.347006,30.000001 z"
++ id="path3049"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="opacity:0.10999995;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
++ d="M 24.347006,14.895835 C 18.70442,14.895835 14.24284,19.488638 14.24284,25 C 14.24284,30.642588 18.835644,35.104166 24.347006,35.104166 C 29.989592,35.104166 34.451172,30.511364 34.451172,25 C 34.451172,19.357414 29.858368,14.895835 24.347006,14.895835 L 24.347006,14.895835 z M 24.347006,30.511364 C 21.328879,30.511364 18.835644,28.018129 18.835644,25 C 18.835644,21.981873 21.328879,19.488638 24.347006,19.488638 C 27.365133,19.488638 29.858368,21.981873 29.858368,25 C 29.858368,28.018129 27.365133,30.511364 24.347006,30.511364 z"
++ id="path3051"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ id="path3916"
++ d="M 29.922111,5.6692337 L 26.325518,19.663896 C 27.450222,19.963413 28.349661,20.659366 28.960646,21.622438 L 41.352866,14.073153 C 38.817618,9.9434382 34.748656,6.9050853 29.922111,5.6692337 z"
++ style="fill:url(#linearGradient8923);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4;stroke-opacity:1"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="fill:url(#linearGradient8925);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4;stroke-opacity:1"
++ d="M 17.307824,43.766057 L 22.043079,30.114558 C 20.946815,29.723566 20.107654,28.956005 19.577936,27.945951 L 6.6068752,34.450599 C 8.7939325,38.774811 12.599255,42.137482 17.307824,43.766057 z"
++ id="path4214"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ sodipodi:nodetypes="cccccc"
++ id="path5264"
++ d="M 24.347002,5.2023655 C 13.373458,5.2023655 4.5493711,14.026454 4.5493711,24.999997 C 4.5493711,35.973541 13.373458,44.797628 24.347002,44.797628 C 35.320546,44.797628 44.144633,35.973541 44.144633,24.999997 C 44.144633,14.026454 35.320546,5.2023655 24.347002,5.2023655 L 24.347002,5.2023655 z"
++ style="opacity:0.54644811;fill:none;fill-rule:nonzero;stroke:url(#linearGradient8927);stroke-miterlimit:4;stroke-opacity:1"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ transform="translate(8.838835e-2,8.838865e-2)"
++ d="M 30.405591,24.930641 A 6.0987959,6.0987959 0 1 1 18.207999,24.930641 A 6.0987959,6.0987959 0 1 1 30.405591,24.930641 z"
++ sodipodi:ry="6.0987959"
++ sodipodi:rx="6.0987959"
++ sodipodi:cy="24.930641"
++ sodipodi:cx="24.306795"
++ id="path6026"
++ style="opacity:0.67213111;fill:none;fill-opacity:0.31638417;fill-rule:nonzero;stroke:url(#linearGradient8930);stroke-width:0.93053865;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ id="path3390"
++ d="M 24.347006,4.1666665 C 12.799386,4.1666665 3.513672,13.452381 3.513672,25 C 3.513672,36.54762 12.799386,45.833335 24.347006,45.833335 C 35.894626,45.833335 45.180341,36.54762 45.180341,25 C 45.180341,13.452381 35.894626,4.1666665 24.347006,4.1666665 L 24.347006,4.1666665 z M 24.347006,30.000001 C 21.608911,30.000001 19.347006,27.738096 19.347006,25 C 19.347006,22.261905 21.608911,20 24.347006,20 C 27.085101,20 29.347006,22.261905 29.347006,25 C 29.347006,27.738096 27.085101,30.000001 24.347006,30.000001 z"
++ style="opacity:0.1142857;fill:url(#radialGradient8932);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4;stroke-opacity:1"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="opacity:0.09714284;fill:url(#radialGradient8934);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4;stroke-opacity:1"
++ d="M 24.347006,4.1666665 C 12.799386,4.1666665 3.513672,13.452381 3.513672,25 C 3.513672,36.54762 12.799386,45.833335 24.347006,45.833335 C 35.894626,45.833335 45.180341,36.54762 45.180341,25 C 45.180341,13.452381 35.894626,4.1666665 24.347006,4.1666665 L 24.347006,4.1666665 z M 24.347006,30.000001 C 21.608911,30.000001 19.347006,27.738096 19.347006,25 C 19.347006,22.261905 21.608911,20 24.347006,20 C 27.085101,20 29.347006,22.261905 29.347006,25 C 29.347006,27.738096 27.085101,30.000001 24.347006,30.000001 z"
++ id="path3404"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ id="path3419"
++ d="M 24.347006,4.1666665 C 12.799386,4.1666665 3.513672,13.452381 3.513672,25 C 3.513672,36.54762 12.799386,45.833335 24.347006,45.833335 C 35.894626,45.833335 45.180341,36.54762 45.180341,25 C 45.180341,13.452381 35.894626,4.1666665 24.347006,4.1666665 L 24.347006,4.1666665 z M 24.347006,30.000001 C 21.608911,30.000001 19.347006,27.738096 19.347006,25 C 19.347006,22.261905 21.608911,20 24.347006,20 C 27.085101,20 29.347006,22.261905 29.347006,25 C 29.347006,27.738096 27.085101,30.000001 24.347006,30.000001 z"
++ style="opacity:0.71428576;fill:url(#radialGradient8936);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4;stroke-opacity:1"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="opacity:0.62285713;fill:url(#radialGradient8938);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4;stroke-opacity:1"
++ d="M 24.347006,4.1666665 C 12.799386,4.1666665 3.513672,13.452381 3.513672,25 C 3.513672,36.54762 12.799386,45.833335 24.347006,45.833335 C 35.894626,45.833335 45.180341,36.54762 45.180341,25 C 45.180341,13.452381 35.894626,4.1666665 24.347006,4.1666665 L 24.347006,4.1666665 z M 24.347006,30.000001 C 21.608911,30.000001 19.347006,27.738096 19.347006,25 C 19.347006,22.261905 21.608911,20 24.347006,20 C 27.085101,20 29.347006,22.261905 29.347006,25 C 29.347006,27.738096 27.085101,30.000001 24.347006,30.000001 z"
++ id="path3431"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ id="path3441"
++ d="M 24.347006,4.1666665 C 12.799386,4.1666665 3.513672,13.452381 3.513672,25 C 3.513672,36.54762 12.799386,45.833335 24.347006,45.833335 C 35.894626,45.833335 45.180341,36.54762 45.180341,25 C 45.180341,13.452381 35.894626,4.1666665 24.347006,4.1666665 L 24.347006,4.1666665 z M 24.347006,30.000001 C 21.608911,30.000001 19.347006,27.738096 19.347006,25 C 19.347006,22.261905 21.608911,20 24.347006,20 C 27.085101,20 29.347006,22.261905 29.347006,25 C 29.347006,27.738096 27.085101,30.000001 24.347006,30.000001 z"
++ style="opacity:0.37142861;fill:url(#radialGradient8940);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4;stroke-opacity:1"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="opacity:0.23428572;fill:url(#radialGradient8942);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4;stroke-opacity:1"
++ d="M 24.347006,4.1666665 C 12.799386,4.1666665 3.513672,13.452381 3.513672,25 C 3.513672,36.54762 12.799386,45.833335 24.347006,45.833335 C 35.894626,45.833335 45.180341,36.54762 45.180341,25 C 45.180341,13.452381 35.894626,4.1666665 24.347006,4.1666665 L 24.347006,4.1666665 z M 24.347006,30.000001 C 21.608911,30.000001 19.347006,27.738096 19.347006,25 C 19.347006,22.261905 21.608911,20 24.347006,20 C 27.085101,20 29.347006,22.261905 29.347006,25 C 29.347006,27.738096 27.085101,30.000001 24.347006,30.000001 z"
++ id="path3445"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ </g>
++ <g
++ id="g5800"
++ transform="translate(61.114563,-104.9855)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <g
++ style="display:inline"
++ inkscape:label="Layer 1"
++ id="g5802">
++ <g
++ transform="matrix(1.315757,0,0,1.315757,-7.347598,-8.553446)"
++ id="g6589"
++ style="fill:#a2a6a7;fill-opacity:1;display:inline" />
++ <path
++ transform="matrix(0.853467,0,0,2.021914,-1.469485,-49.7834)"
++ d="M 43.902678,45.153286 A 13.474453,2.7201946 0 1 1 16.953772,45.153286 A 13.474453,2.7201946 0 1 1 43.902678,45.153286 z"
++ sodipodi:ry="2.7201946"
++ sodipodi:rx="13.474453"
++ sodipodi:cy="45.153286"
++ sodipodi:cx="30.428225"
++ id="path7856"
++ style="opacity:0.44999994;fill:url(#radialGradient8944);fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ sodipodi:type="arc" />
++ <g
++ transform="translate(-55.90238,-56.01615)"
++ id="g8425"
++ style="display:inline">
++ <rect
++ style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:#c2c2c2;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ id="rect8427"
++ width="13.589136"
++ height="3.1126587"
++ x="-0.94968754"
++ y="112.90335"
++ rx="1.5137454"
++ ry="1.3993458"
++ transform="matrix(0.85333,-0.521371,0.54466,0.838657,0,0)" />
++ <g
++ id="g8429">
++ <rect
++ transform="matrix(0.844299,-0.535873,0.577335,0.816508,0,0)"
++ ry="1.2146336"
++ rx="1.1134398"
++ y="113.35451"
++ x="-5.2611275"
++ height="2.5390387"
++ width="9.5848627"
++ id="rect8431"
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#c2c2c2;stroke-width:0.55335927;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ transform="matrix(1.086779,0,0,1.086779,52.58125,47.69086)"
++ d="M 18.788321,41.231144 A 5.0608273,5.0608273 0 1 1 8.666667,41.231144 A 5.0608273,5.0608273 0 1 1 18.788321,41.231144 z"
++ sodipodi:ry="5.0608273"
++ sodipodi:rx="5.0608273"
++ sodipodi:cy="41.231144"
++ sodipodi:cx="13.727494"
++ id="path8433"
++ style="opacity:1;fill:#c2c2c2;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ sodipodi:type="arc" />
++ <path
++ transform="matrix(0.934525,0,0,0.934525,54.59161,53.99504)"
++ d="M 18.788321,41.231144 A 5.0608273,5.0608273 0 1 1 8.666667,41.231144 A 5.0608273,5.0608273 0 1 1 18.788321,41.231144 z"
++ sodipodi:ry="5.0608273"
++ sodipodi:rx="5.0608273"
++ sodipodi:cy="41.231144"
++ sodipodi:cx="13.727494"
++ id="path8435"
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ sodipodi:type="arc" />
++ <g
++ transform="matrix(1.003468,0,0,0.969091,-0.221812,2.72854)"
++ id="g8437">
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#8d8d8d;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ id="path8439"
++ sodipodi:cx="13.727494"
++ sodipodi:cy="41.231144"
++ sodipodi:rx="5.0608273"
++ sodipodi:ry="5.0608273"
++ d="M 18.788321,41.231144 A 5.0608273,5.0608273 0 1 1 8.666667,41.231144 A 5.0608273,5.0608273 0 1 1 18.788321,41.231144 z"
++ transform="matrix(0.787521,0,0,0.787521,57.14101,59.79048)" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.46703294;fill:url(#radialGradient8946);fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ id="path8441"
++ sodipodi:cx="10.812501"
++ sodipodi:cy="38.25"
++ sodipodi:rx="2.1875"
++ sodipodi:ry="2.1875"
++ d="M 13.000001,38.25 A 2.1875,2.1875 0 1 1 8.625001,38.25 A 2.1875,2.1875 0 1 1 13.000001,38.25 z"
++ transform="matrix(1.756842,0,0,1.756842,49.13326,25.12495)" />
++ </g>
++ </g>
++ </g>
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:1;stroke:#204a87;stroke-width:1.0000006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7858"
++ width="22.029099"
++ height="40.991642"
++ x="13.520132"
++ y="2.5000002"
++ rx="2.8624377"
++ ry="0.38756484" />
++ <rect
++ style="opacity:0.60439561;fill:none;fill-opacity:1;stroke:url(#linearGradient8948);stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7860"
++ width="20.040964"
++ height="38.97797"
++ x="14.499929"
++ y="3.512543"
++ rx="6.75"
++ ry="0.10631458" />
++ <path
++ transform="matrix(0.865538,0,0,0.865538,209.9203,22.3855)"
++ d="M -211.24815,9.3521948 A 3.2040777,3.2040777 0 1 1 -217.6563,9.3521948 A 3.2040777,3.2040777 0 1 1 -211.24815,9.3521948 z"
++ sodipodi:ry="3.2040777"
++ sodipodi:rx="3.2040777"
++ sodipodi:cy="9.3521948"
++ sodipodi:cx="-214.45222"
++ id="path7862"
++ style="opacity:0.83516487;fill:url(#linearGradient8950);fill-opacity:1;stroke:#c2c2c2;stroke-width:0.27324447;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ sodipodi:type="arc" />
++ <path
++ transform="matrix(0.800287,0,0,0.800287,191.3329,15.25978)"
++ d="M -197.81312,19.03072 A 10.628699,10.628699 0 1 1 -219.07052,19.03072 A 10.628699,10.628699 0 1 1 -197.81312,19.03072 z"
++ sodipodi:ry="10.628699"
++ sodipodi:rx="10.628699"
++ sodipodi:cy="19.03072"
++ sodipodi:cx="-208.44182"
++ id="path7864"
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.27187183;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ sodipodi:type="arc" />
++ <text
++ transform="scale(1.077754,0.927855)"
++ sodipodi:linespacing="125%"
++ id="text7866"
++ y="25.876835"
++ x="20.276695"
++ style="font-size:1.47469485px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#a2a6a7;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;font-family:Bitstream Vera Sans"
++ xml:space="preserve"><tspan
++ y="25.876835"
++ x="20.276695"
++ id="tspan7868"
++ sodipodi:role="line">MENU</tspan></text>
++ <g
++ transform="translate(607.0203,108.9958)"
++ id="g7870"
++ style="display:inline">
++ <path
++ sodipodi:type="star"
++ style="opacity:1;fill:#a2a6a7;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path7872"
++ sodipodi:sides="3"
++ sodipodi:cx="16.875"
++ sodipodi:cy="5.75"
++ sodipodi:r1="0.6502704"
++ sodipodi:r2="0.3251352"
++ sodipodi:arg1="0.95613337"
++ sodipodi:arg2="2.0033309"
++ inkscape:flatsided="false"
++ inkscape:rounded="0"
++ inkscape:randomized="0"
++ d="M 17.25,6.28125 L 16.738712,6.0451923 L 16.227424,5.8091345 L 16.6875,5.484375 L 17.147576,5.1596154 L 17.198788,5.7204327 L 17.25,6.28125 z"
++ transform="matrix(-0.593231,-0.723251,-0.841753,0.511835,-574.4794,-69.23682)" />
++ <path
++ sodipodi:type="star"
++ style="opacity:1;fill:#a2a6a7;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path7874"
++ sodipodi:sides="3"
++ sodipodi:cx="16.875"
++ sodipodi:cy="5.75"
++ sodipodi:r1="0.6502704"
++ sodipodi:r2="0.3251352"
++ sodipodi:arg1="0.95613337"
++ sodipodi:arg2="2.0033309"
++ inkscape:flatsided="false"
++ inkscape:rounded="0"
++ inkscape:randomized="0"
++ d="M 17.25,6.28125 L 16.738712,6.0451923 L 16.227424,5.8091345 L 16.6875,5.484375 L 17.147576,5.1596154 L 17.198788,5.7204327 L 17.25,6.28125 z"
++ transform="matrix(-0.59323,-0.726082,-0.841753,0.513838,-573.4796,-69.20067)" />
++ <rect
++ style="opacity:1;fill:#a2a6a7;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ id="rect7876"
++ width="0.18422361"
++ height="0.99286842"
++ x="590"
++ y="-78.992867"
++ ry="0"
++ transform="scale(-1,1)" />
++ </g>
++ <g
++ transform="translate(585.0392,109.0102)"
++ id="g7878"
++ style="display:inline">
++ <rect
++ style="opacity:1;fill:#eaeef9;fill-opacity:1;stroke:#69818f;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7880"
++ width="16.01894"
++ height="11.985675"
++ x="-568.51892"
++ y="-103.5"
++ rx="0.52014631"
++ ry="0.56434131" />
++ <rect
++ style="opacity:0.83516487;fill:#3e4b8f;fill-opacity:1;stroke:none;stroke-width:0.213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7882"
++ width="13"
++ height="1.96875"
++ x="-567"
++ y="-100.96875" />
++ <rect
++ style="opacity:0.83516487;fill:#3e4b8f;fill-opacity:1;stroke:none;stroke-width:0.213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7884"
++ width="4"
++ height="1.0042467"
++ x="-567"
++ y="-98" />
++ <rect
++ style="opacity:0.83516487;fill:#3e4b8f;fill-opacity:1;stroke:none;stroke-width:0.213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7886"
++ width="2"
++ height="0.99836552"
++ x="-567"
++ y="-95.998367" />
++ <rect
++ style="opacity:0.83516487;fill:#3e4b8f;fill-opacity:1;stroke:none;stroke-width:0.213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7888"
++ width="1.0028907"
++ height="0.97435272"
++ x="-555.00287"
++ y="-97.97435" />
++ <rect
++ style="opacity:0.83516487;fill:#3e4b8f;fill-opacity:1;stroke:none;stroke-width:0.213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7890"
++ width="0.99314684"
++ height="0.99644983"
++ x="-555"
++ y="-95.996452" />
++ <rect
++ style="opacity:0.83516487;fill:#3e4b8f;fill-opacity:1;stroke:none;stroke-width:0.213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7892"
++ width="2"
++ height="1.0185469"
++ x="-556"
++ y="-103" />
++ <rect
++ style="opacity:0.83516487;fill:#3e4b8f;fill-opacity:1;stroke:none;stroke-width:0.213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7894"
++ width="7"
++ height="1.0061938"
++ x="-565"
++ y="-103" />
++ <path
++ style="opacity:0.70329674;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;display:inline"
++ d="M -567.99243,-102.97657 C -567.99243,-102.97657 -553.81313,-102.99806 -553,-103 C -553,-103 -557.06089,-99.266087 -559.33679,-98.015165 C -562.46041,-96.298319 -566.42641,-97.090677 -567.96895,-92.00287 C -568.03,-91.80152 -567.97998,-102.24738 -567.99243,-102.97657 z"
++ id="path7896"
++ sodipodi:nodetypes="ccssc" />
++ <rect
++ style="opacity:0.83516487;fill:#3e4b8f;fill-opacity:1;stroke:none;stroke-width:0.213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7898"
++ width="5"
++ height="1.0042467"
++ x="-567"
++ y="-94" />
++ <rect
++ style="opacity:0.83516487;fill:#3e4b8f;fill-opacity:1;stroke:none;stroke-width:0.213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7900"
++ width="0.99314684"
++ height="0.99644983"
++ x="-555"
++ y="-94" />
++ </g>
++ <rect
++ ry="0.23288508"
++ rx="2.8624377"
++ y="2.9958498"
++ x="13.999929"
++ height="40"
++ width="21.020203"
++ id="rect7902"
++ style="opacity:0.33516481;fill:url(#linearGradient8952);fill-opacity:1;stroke:none;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
++ <g
++ transform="matrix(-1,0,0,1,-557.9747,108.994)"
++ id="g7904"
++ style="display:inline">
++ <path
++ sodipodi:type="star"
++ style="opacity:1;fill:#a2a6a7;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path7906"
++ sodipodi:sides="3"
++ sodipodi:cx="16.875"
++ sodipodi:cy="5.75"
++ sodipodi:r1="0.6502704"
++ sodipodi:r2="0.3251352"
++ sodipodi:arg1="0.95613337"
++ sodipodi:arg2="2.0033309"
++ inkscape:flatsided="false"
++ inkscape:rounded="0"
++ inkscape:randomized="0"
++ d="M 17.25,6.28125 L 16.738712,6.0451923 L 16.227424,5.8091345 L 16.6875,5.484375 L 17.147576,5.1596154 L 17.198788,5.7204327 L 17.25,6.28125 z"
++ transform="matrix(-0.593231,-0.723251,-0.841753,0.511835,-574.4794,-69.23682)" />
++ <path
++ sodipodi:type="star"
++ style="opacity:1;fill:#a2a6a7;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path7908"
++ sodipodi:sides="3"
++ sodipodi:cx="16.875"
++ sodipodi:cy="5.75"
++ sodipodi:r1="0.6502704"
++ sodipodi:r2="0.3251352"
++ sodipodi:arg1="0.95613337"
++ sodipodi:arg2="2.0033309"
++ inkscape:flatsided="false"
++ inkscape:rounded="0"
++ inkscape:randomized="0"
++ d="M 17.25,6.28125 L 16.738712,6.0451923 L 16.227424,5.8091345 L 16.6875,5.484375 L 17.147576,5.1596154 L 17.198788,5.7204327 L 17.25,6.28125 z"
++ transform="matrix(-0.59323,-0.726082,-0.841753,0.513838,-573.4796,-69.20067)" />
++ <rect
++ style="opacity:1;fill:#a2a6a7;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ id="rect7910"
++ width="0.18422361"
++ height="0.99286842"
++ x="590"
++ y="-78.992867"
++ ry="0"
++ transform="scale(-1,1)" />
++ </g>
++ <path
++ transform="matrix(1.055159,0,0,1.055159,250.7822,20.64369)"
++ d="M -211.24815,9.3521948 A 3.2040777,3.2040777 0 1 1 -217.6563,9.3521948 A 3.2040777,3.2040777 0 1 1 -211.24815,9.3521948 z"
++ sodipodi:ry="3.2040777"
++ sodipodi:rx="3.2040777"
++ sodipodi:cy="9.3521948"
++ sodipodi:cx="-214.45222"
++ id="path7912"
++ style="opacity:0.83516487;fill:url(#linearGradient8954);fill-opacity:1;stroke:#c2c2c2;stroke-width:0.22414021;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ sodipodi:type="arc" />
++ <g
++ transform="translate(1.584276e-5,8.00313e-3)"
++ id="g7914"
++ style="display:inline">
++ <rect
++ transform="matrix(1.315757,0,0,1.315757,-7.347598,-8.553446)"
++ ry="0"
++ y="34.624207"
++ x="24.584782"
++ height="0.75728565"
++ width="0.23366779"
++ id="rect7916"
++ style="opacity:1;fill:#a2a6a7;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
++ <g
++ id="g7918">
++ <path
++ sodipodi:type="star"
++ style="opacity:1;fill:#a2a6a7;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path7920"
++ sodipodi:sides="3"
++ sodipodi:cx="16.875"
++ sodipodi:cy="5.75"
++ sodipodi:r1="0.6502704"
++ sodipodi:r2="0.3251352"
++ sodipodi:arg1="0.95613337"
++ sodipodi:arg2="2.0033309"
++ inkscape:flatsided="false"
++ inkscape:rounded="0"
++ inkscape:randomized="0"
++ d="M 17.25,6.28125 L 16.738712,6.0451923 L 16.227424,5.8091345 L 16.6875,5.484375 L 17.147576,5.1596154 L 17.198788,5.7204327 L 17.25,6.28125 z"
++ transform="matrix(0.591247,-0.728125,0.83894,0.515285,9.532946,46.82691)" />
++ <rect
++ style="opacity:1;fill:#a2a6a7;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7922"
++ width="0.30745003"
++ height="0.99640387"
++ x="25.692551"
++ y="37.003597"
++ ry="0" />
++ </g>
++ </g>
++ <g
++ transform="translate(-55.90238,-56.01615)"
++ id="g8443"
++ style="display:inline">
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#c2c2c2;stroke-width:1.91250193;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ d="M 97.88267,96.940154 C 104.58992,95.384481 92.027568,94.625463 91.340359,94.70701"
++ id="path8445"
++ sodipodi:nodetypes="cs" />
++ <path
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.78483576;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ d="M 97.875398,96.899543 C 104.58265,95.34387 92.020297,94.584853 91.333078,94.666399"
++ id="path8447"
++ sodipodi:nodetypes="cs" />
++ <g
++ style="fill:#c2c2c2;fill-opacity:1;display:inline"
++ id="g8449"
++ transform="matrix(1.148447,0,0,1.148447,52.4095,48.70484)">
++ <path
++ transform="matrix(1.044369,0,0,1.044369,-1.649051,-1.715604)"
++ d="M 35.40625,41.484375 A 4.578125,4.578125 0 1 1 26.25,41.484375 A 4.578125,4.578125 0 1 1 35.40625,41.484375 z"
++ sodipodi:ry="4.578125"
++ sodipodi:rx="4.578125"
++ sodipodi:cy="41.484375"
++ sodipodi:cx="30.828125"
++ id="path8451"
++ style="opacity:1;fill:#c2c2c2;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ sodipodi:type="arc" />
++ <path
++ transform="translate(0.25,0.34375)"
++ d="M 35.40625,41.484375 A 4.578125,4.578125 0 1 1 26.25,41.484375 A 4.578125,4.578125 0 1 1 35.40625,41.484375 z"
++ sodipodi:ry="4.578125"
++ sodipodi:rx="4.578125"
++ sodipodi:cy="41.484375"
++ sodipodi:cx="30.828125"
++ id="path8453"
++ style="opacity:1;fill:#c2c2c2;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ sodipodi:type="arc" />
++ </g>
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path8455"
++ sodipodi:cx="30.828125"
++ sodipodi:cy="41.484375"
++ sodipodi:rx="4.578125"
++ sodipodi:ry="4.578125"
++ d="M 35.40625,41.484375 A 4.578125,4.578125 0 1 1 26.25,41.484375 A 4.578125,4.578125 0 1 1 35.40625,41.484375 z"
++ transform="matrix(1.02821,0,0,1.02821,55.83221,53.73015)" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path8457"
++ sodipodi:cx="30.828125"
++ sodipodi:cy="41.484375"
++ sodipodi:rx="4.578125"
++ sodipodi:ry="4.578125"
++ d="M 35.40625,41.484375 A 4.578125,4.578125 0 1 1 26.25,41.484375 A 4.578125,4.578125 0 1 1 35.40625,41.484375 z"
++ transform="matrix(0.984529,0,0,0.984529,57.7018,55.75757)" />
++ <g
++ style="display:inline"
++ id="g8459"
++ transform="matrix(1.007793,0,0,1.004691,56.19417,54.3161)">
++ <rect
++ transform="matrix(0.985898,-0.167348,0.194419,0.980919,0,0)"
++ ry="1.5439408"
++ rx="1.6140188"
++ y="47.136684"
++ x="20.703314"
++ height="3.0878816"
++ width="13.480978"
++ id="rect8461"
++ style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:#c2c2c2;stroke-width:0.49689928;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <rect
++ transform="matrix(0.984635,-0.174627,0.177401,0.984139,0,0)"
++ ry="1.4996823"
++ rx="1.3586608"
++ y="47.28104"
++ x="21.659946"
++ height="3.0802486"
++ width="9.4694977"
++ id="rect8463"
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#c2c2c2;stroke-width:0.5495854;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ </g>
++ <g
++ style="display:inline"
++ id="g8465"
++ transform="matrix(1.211847,0,0,1.211847,52.90119,45.21661)">
++ <path
++ transform="translate(-0.34375,-9.375e-2)"
++ d="M 30.03125,39.921875 A 0.765625,0.765625 0 1 1 28.5,39.921875 A 0.765625,0.765625 0 1 1 30.03125,39.921875 z"
++ sodipodi:ry="0.765625"
++ sodipodi:rx="0.765625"
++ sodipodi:cy="39.921875"
++ sodipodi:cx="29.265625"
++ id="path8467"
++ style="opacity:1;fill:#cacaca;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ sodipodi:type="arc" />
++ <text
++ transform="matrix(0,-1,1,0,0,0)"
++ sodipodi:linespacing="125%"
++ id="text8469"
++ y="29.42164"
++ x="-40.349224"
++ style="font-size:1.31750739px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"><tspan
++ y="29.42164"
++ x="-40.349224"
++ id="tspan8471"
++ sodipodi:role="line">R</tspan></text>
++ </g>
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#8d8d8d;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path8473"
++ sodipodi:cx="31.406248"
++ sodipodi:cy="38.90625"
++ sodipodi:rx="0.46874997"
++ sodipodi:ry="0.46874997"
++ d="M 31.874998,38.90625 A 0.46874997,0.46874997 0 1 1 30.937498,38.90625 A 0.46874997,0.46874997 0 1 1 31.874998,38.90625 z"
++ transform="matrix(4.648302e-8,-0.525081,0.525081,4.648302e-8,63.94198,112.1245)" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#8d8d8d;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path8475"
++ sodipodi:cx="31.406248"
++ sodipodi:cy="38.90625"
++ sodipodi:rx="0.46874997"
++ sodipodi:ry="0.46874997"
++ d="M 31.874998,38.90625 A 0.46874997,0.46874997 0 1 1 30.937498,38.90625 A 0.46874997,0.46874997 0 1 1 31.874998,38.90625 z"
++ transform="matrix(4.648302e-8,-0.525081,0.525081,4.648302e-8,64.44962,111.0811)" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#8d8d8d;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path8477"
++ sodipodi:cx="31.406248"
++ sodipodi:cy="38.90625"
++ sodipodi:rx="0.46874997"
++ sodipodi:ry="0.46874997"
++ d="M 31.874998,38.90625 A 0.46874997,0.46874997 0 1 1 30.937498,38.90625 A 0.46874997,0.46874997 0 1 1 31.874998,38.90625 z"
++ transform="matrix(4.648302e-8,-0.525081,0.525081,4.648302e-8,65.15726,110.3156)" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#8d8d8d;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path8479"
++ sodipodi:cx="31.406248"
++ sodipodi:cy="38.90625"
++ sodipodi:rx="0.46874997"
++ sodipodi:ry="0.46874997"
++ d="M 31.874998,38.90625 A 0.46874997,0.46874997 0 1 1 30.937498,38.90625 A 0.46874997,0.46874997 0 1 1 31.874998,38.90625 z"
++ transform="matrix(4.648302e-8,-0.525081,0.525081,4.648302e-8,63.85072,113.2347)" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#8d8d8d;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path8481"
++ sodipodi:cx="31.406248"
++ sodipodi:cy="38.90625"
++ sodipodi:rx="0.46874997"
++ sodipodi:ry="0.46874997"
++ d="M 31.874998,38.90625 A 0.46874997,0.46874997 0 1 1 30.937498,38.90625 A 0.46874997,0.46874997 0 1 1 31.874998,38.90625 z"
++ transform="matrix(4.648302e-8,-0.525081,0.525081,4.648302e-8,64.12085,114.3221)" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#8d8d8d;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path8483"
++ sodipodi:cx="31.406248"
++ sodipodi:cy="38.90625"
++ sodipodi:rx="0.46874997"
++ sodipodi:ry="0.46874997"
++ d="M 31.874998,38.90625 A 0.46874997,0.46874997 0 1 1 30.937498,38.90625 A 0.46874997,0.46874997 0 1 1 31.874998,38.90625 z"
++ transform="matrix(4.648302e-8,-0.525081,0.525081,4.648302e-8,64.65661,115.3336)" />
++ </g>
++ </g>
++ <g
++ inkscape:label="Picture"
++ id="g5869" />
++ </g>
++ <g
++ id="g6012"
++ inkscape:label="pix"
++ transform="translate(62.23214,50.66364)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <g
++ id="g6014"
++ transform="matrix(2.45274e-2,0,0,2.086758e-2,45.69054,36.1536)">
++ <rect
++ y="-150.69685"
++ x="-1559.2523"
++ height="478.35718"
++ width="1339.6335"
++ id="rect6016"
++ style="opacity:0.40206185;fill:url(#linearGradient8956);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ sodipodi:nodetypes="cccc"
++ id="path6018"
++ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z"
++ style="opacity:0.40206185;fill:url(#radialGradient8958);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ style="opacity:0.40206185;fill:url(#radialGradient8960);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z"
++ id="path6020"
++ sodipodi:nodetypes="cccc" />
++ </g>
++ <path
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#535353;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 11.28569,7.9626278 C 10.66069,7.9626278 10.254441,8.252808 10.004442,8.8063808 C 10.004441,8.8063808 3.5356915,25.909938 3.5356915,25.909938 C 3.5356915,25.909938 3.2856915,26.581497 3.2856915,27.691188 C 3.2856915,27.691188 3.2856915,37.341156 3.2856915,37.341156 C 3.2856915,38.423769 3.943477,38.966158 4.9419415,38.966156 L 43.50444,38.966156 C 44.489293,38.966156 45.09819,38.247976 45.09819,37.122406 L 45.09819,27.472438 C 45.09819,27.472438 45.204153,26.702015 45.00444,26.159938 L 38.28569,8.9626314 C 38.101165,8.4507246 37.648785,7.9745331 37.16069,7.9626278 L 11.28569,7.9626278 z"
++ id="path4196"
++ sodipodi:nodetypes="cccsccccccccc" />
++ <path
++ style="fill:url(#linearGradient8962);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.02044296px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 3.2735915,26.996812 L 4.0381936,26.304597 L 41.647883,26.367097 L 45.11029,26.684395 L 45.11029,37.122927 C 45.11029,38.248496 44.503272,38.966258 43.518419,38.966258 L 4.9354314,38.966258 C 3.9369667,38.966258 3.2735915,38.424207 3.2735915,37.341594 L 3.2735915,26.996812 z"
++ id="path4170"
++ sodipodi:nodetypes="ccccccccc" />
++ <path
++ style="fill:url(#radialGradient8964);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 3.5490842,25.914404 C 2.8347985,27.37869 3.5484686,28.307261 4.5847985,28.307261 C 4.5847985,28.307261 43.584797,28.307261 43.584797,28.307261 C 44.703844,28.283451 45.430035,27.295356 45.013368,26.164403 L 38.299082,8.9537044 C 38.114558,8.4417976 37.64432,7.9656058 37.156225,7.9537008 L 11.299083,7.9537008 C 10.674083,7.9537008 10.263369,8.257274 10.01337,8.8108468 C 10.01337,8.8108468 3.5490842,25.914404 3.5490842,25.914404 z"
++ id="path3093"
++ sodipodi:nodetypes="csccccccs" />
++ <rect
++ style="opacity:1;fill:url(#linearGradient8966);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.40899992;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect4174"
++ width="17.625"
++ height="5.5625"
++ x="7.857996"
++ y="31.174183" />
++ <path
++ style="opacity:0.81142853;fill:url(#linearGradient8968);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 7.8579947,36.73668 C 7.8579947,36.73668 7.8579947,32.725195 7.8579947,32.725195 C 9.6935221,35.904421 16.154485,36.73668 20.795492,36.73668 C 20.795492,36.73668 7.8579947,36.73668 7.8579947,36.73668 z"
++ id="path4194"
++ sodipodi:nodetypes="cscc" />
++ <path
++ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 44.796162,25.628688 C 44.859684,26.878662 44.382159,27.944528 43.474046,27.972438 C 43.474046,27.972438 5.3553296,27.972437 5.3553297,27.972438 C 4.0660978,27.972438 3.4875937,27.647491 3.271279,27.104382 C 3.3630404,28.048714 4.0970964,28.753688 5.3553297,28.753688 C 5.3553296,28.753687 43.474046,28.753688 43.474046,28.753688 C 44.550053,28.720617 45.226851,27.329664 44.82621,25.758897 L 44.796162,25.628688 z"
++ id="path4201"
++ sodipodi:nodetypes="cccccccc" />
++ <path
++ style="opacity:0.69142857;fill:url(#linearGradient8970);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 10.96875,10.15625 C 10.922675,10.356571 10.78125,10.543047 10.78125,10.75 C 10.78125,11.698605 11.37223,12.539474 12.125,13.34375 C 12.365268,13.189675 12.490117,12.989342 12.75,12.84375 C 11.809691,12.027746 11.196604,11.127168 10.96875,10.15625 z M 37.625,10.15625 C 37.396273,11.125866 36.782988,12.028676 35.84375,12.84375 C 36.117894,12.997332 36.247738,13.21199 36.5,13.375 C 37.257262,12.568344 37.8125,11.701956 37.8125,10.75 C 37.8125,10.543047 37.670906,10.356571 37.625,10.15625 z M 39.8125,18.59375 C 39.198709,22.633861 32.513887,25.84375 24.28125,25.84375 C 16.068996,25.843751 9.4211001,22.650964 8.78125,18.625 C 8.7488928,18.822132 8.65625,19.016882 8.65625,19.21875 C 8.6562503,23.536697 15.645354,27.062501 24.28125,27.0625 C 32.917146,27.0625 39.937499,23.536698 39.9375,19.21875 C 39.9375,19.005826 39.848449,18.801394 39.8125,18.59375 z"
++ id="path4211" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#ffffff;fill-opacity:0.45762706;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path4224"
++ sodipodi:cx="7.2036505"
++ sodipodi:cy="25.593554"
++ sodipodi:rx="1.3700194"
++ sodipodi:ry="1.016466"
++ d="M 8.5736699,25.593554 A 1.3700194,1.016466 0 1 1 5.833631,25.593554 A 1.3700194,1.016466 0 1 1 8.5736699,25.593554 z"
++ transform="translate(8.838843e-2,0.176776)" />
++ <path
++ transform="translate(33.96705,8.838804e-2)"
++ d="M 8.5736699,25.593554 A 1.3700194,1.016466 0 1 1 5.833631,25.593554 A 1.3700194,1.016466 0 1 1 8.5736699,25.593554 z"
++ sodipodi:ry="1.016466"
++ sodipodi:rx="1.3700194"
++ sodipodi:cy="25.593554"
++ sodipodi:cx="7.2036505"
++ id="path4226"
++ style="opacity:1;fill:#ffffff;fill-opacity:0.45762706;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="cccsccccccccc"
++ id="path4252"
++ d="M 11.642515,8.4157227 C 11.040823,8.4157227 10.649724,8.6950813 10.409049,9.22801 C 10.409048,9.22801 3.9940341,25.818732 3.9940341,25.818732 C 3.9940341,25.818732 3.7533573,26.465247 3.7533573,27.533555 C 3.7533573,27.533555 3.7533573,36.823651 3.7533573,36.823651 C 3.7533573,38.178391 4.1974134,38.45055 5.3478414,38.45055 L 43.034746,38.45055 C 44.357872,38.45055 44.569062,38.134153 44.569062,36.613058 L 44.569062,27.322962 C 44.569062,27.322962 44.671072,26.581271 44.478807,26.059409 L 37.885616,9.2534336 C 37.707973,8.7606171 37.334964,8.427184 36.865071,8.4157227 L 11.642515,8.4157227 z"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8972);stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ id="path4282"
++ d="M 40.5,31.429166 L 40.5,36.450101"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372885" />
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372885"
++ d="M 38.5,31.488943 L 38.5,36.509878"
++ id="path4284" />
++ <path
++ id="path4286"
++ d="M 36.5,31.488943 L 36.5,36.509878"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372885" />
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372885"
++ d="M 34.5,31.488943 L 34.5,36.509878"
++ id="path4288" />
++ <path
++ id="path4290"
++ d="M 32.5,31.488943 L 32.5,36.509878"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372885" />
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372885"
++ d="M 30.5,31.488943 L 30.5,36.509878"
++ id="path4292" />
++ <path
++ style="opacity:0.09714284;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 39.5,31.479065 L 39.5,36.5"
++ id="path4294" />
++ <path
++ id="path4296"
++ d="M 37.5,31.538842 L 37.5,36.559777"
++ style="opacity:0.09714284;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1" />
++ <path
++ style="opacity:0.09714284;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 35.5,31.538842 L 35.5,36.559777"
++ id="path4298" />
++ <path
++ id="path4300"
++ d="M 33.5,31.538842 L 33.5,36.559777"
++ style="opacity:0.09714284;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1" />
++ <path
++ style="opacity:0.09714284;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 31.5,31.538842 L 31.5,36.559777"
++ id="path4302" />
++ <path
++ style="opacity:0.43999999;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 7.875,31.1875 L 7.875,36.71875 L 20.4375,36.71875 L 8.21875,36.375 L 7.875,31.1875 z"
++ id="path4572" />
++ <path
++ transform="matrix(1.037815,0,0,1.060747,-1.632878,-2.094626)"
++ d="M 39.875,19.5625 A 14.875,6.6875 0 1 1 10.125,19.5625 A 14.875,6.6875 0 1 1 39.875,19.5625 z"
++ sodipodi:ry="6.6875"
++ sodipodi:rx="14.875"
++ sodipodi:cy="19.5625"
++ sodipodi:cx="25"
++ id="path2545"
++ style="opacity:0.20571427;fill:url(#linearGradient8974);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.93365198;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.42372879;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ </g>
++ <g
++ inkscape:label="Layer 1"
++ id="g6162"
++ transform="translate(60.588806,-0.1776)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <path
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ sodipodi:type="arc"
++ style="opacity:0.40641713;fill:url(#radialGradient8976);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.81415844;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path12960"
++ sodipodi:cx="30.203562"
++ sodipodi:cy="44.565483"
++ sodipodi:rx="6.5659914"
++ sodipodi:ry="2.2223356"
++ d="M 36.769553,44.565483 A 6.5659914,2.2223356 0 1 1 23.63757,44.565483 A 6.5659914,2.2223356 0 1 1 36.769553,44.565483 z"
++ transform="matrix(2.752736,1.43844,-2.455422,4.679605,48.40044,-223.0412)" />
++ <path
++ style="fill:#484848;fill-opacity:1;fill-rule:evenodd;stroke:#4d4d4d;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 12.80097,5.8182116 L 5.1577075,12.516803 L 5.4153448,18.657177 L 23.407072,34.845436 L 35.000785,24.110515 L 35.258424,17.411926 L 12.80097,5.8182116 z"
++ id="path12803"
++ sodipodi:nodetypes="ccccccc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="fill:#a6a6a6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 5.0704024,12.658182 L 5.3171158,18.579297 L 23.57389,34.615652 L 23.327178,28.201111 L 5.0704024,12.658182 z"
++ id="path12787"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="fill:#7f7f7f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 23.327178,28.201111 L 23.327178,34.739009 L 34.922696,24.006986 L 35.169408,17.345732 L 23.327178,28.201111 z"
++ id="path12789"
++ sodipodi:nodetypes="ccccc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="fill:url(#linearGradient8978);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 5.0704024,12.669106 L 23.57389,28.447823 L 35.169408,17.592444 L 12.71851,5.7502141 L 5.0704024,12.669106 z"
++ id="path12791"
++ sodipodi:nodetypes="ccccc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="fill:#ffc11a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 6.2664926,11.644777 L 9.1411708,13.645034 C 9.1411708,13.645034 9.8196319,13.891747 10.128023,13.645034 C 10.436414,13.398322 10.374736,12.658182 10.374736,12.658182 L 7.5000581,10.400285 L 6.2664926,11.644777 z"
++ id="path12793"
++ sodipodi:nodetypes="ccsccc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ id="path12795"
++ d="M 8.4010304,9.6710707 L 11.361588,11.671328 C 11.361588,11.671328 12.040051,11.918041 12.348442,11.671328 C 12.656831,11.424616 12.595154,10.684476 12.595154,10.684476 L 9.7204774,8.4265796 L 8.4010304,9.6710707 z"
++ style="fill:#ffc11a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:nodetypes="ccsccc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="fill:#ffc11a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 10.583973,7.7348437 L 13.458651,9.8209807 C 13.458651,9.8209807 14.137112,10.067694 14.445505,9.8209807 C 14.753896,9.5742672 14.692216,8.8341268 14.692216,8.8341268 L 11.731658,6.4903526 L 10.583973,7.7348437 z"
++ id="path12797"
++ sodipodi:nodetypes="ccsccc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ sodipodi:nodetypes="ccccccc"
++ id="path12820"
++ d="M 12.829749,6.3689141 L 5.7478543,13.004915 L 5.9865695,18.350786 L 23.25803,33.865361 L 34.343751,23.57536 L 34.582465,17.96991 L 12.829749,6.3689141 z"
++ style="opacity:0.34224596;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8980);stroke-width:5;stroke-linecap:round;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 31.564353,28.210626 C 31.564353,28.210626 37.404149,30.529369 40.495806,35.252734 C 43.587462,39.976098 45.305051,46.846447 45.305051,46.846447"
++ id="path12822"
++ sodipodi:nodetypes="csc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ sodipodi:nodetypes="cscscscscc"
++ style="fill:url(#radialGradient8982);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 32.200708,26.732644 C 31.367882,26.833528 30.70943,27.486206 30.601215,28.318112 C 30.492999,29.150018 30.962562,29.949431 31.741863,30.260022 C 31.741863,30.260022 36.625199,32.925232 38.260739,35.423974 C 40.0495,38.156803 41.243238,42.622122 41.243238,42.622122 C 41.496652,43.6041 42.498135,44.194717 43.480113,43.941304 C 44.462091,43.687889 45.052708,42.686407 44.799295,41.704429 C 44.799295,41.704429 43.698802,36.992826 41.35795,33.416522 C 38.863875,29.606131 33.118401,26.876032 33.118401,26.876032 C 32.829855,26.750352 32.51384,26.700975 32.200708,26.732644 z"
++ id="path12824"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ id="path12801"
++ d="M 15.925782,15.865453 L 30.975286,27.214258 C 32.702277,28.324466 34.36759,27.029223 35.416121,25.733979 C 36.464653,24.438734 36.279618,22.896778 35.169408,22.03328 L 19.133053,13.39832 L 15.925782,15.865453 z"
++ style="fill:#a0a0a1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:nodetypes="cczccc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="fill:url(#linearGradient8984);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 15.309,15.865453 L 30.728571,25.240552 C 31.592068,25.857335 33.442415,25.117197 34.182556,24.253702 C 34.922696,23.390204 34.305913,22.156639 33.689131,21.786569 L 19.009696,13.02825 L 15.309,15.865453 z"
++ id="path12799"
++ sodipodi:nodetypes="cczccc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ </g>
++ <g
++ id="g7625"
++ transform="translate(-933.23991,212.5635)">
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect7152"
++ width="153.2551"
++ height="99.162369"
++ x="1121.116"
++ y="-42.146938"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="1126.8923"
++ y="-26.871181"
++ id="text7154"><tspan
++ style="font-size:14px;font-weight:bold;fill:#ffffff;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ sodipodi:role="line"
++ id="tspan7156"
++ x="1126.8923"
++ y="-26.871181">file-source</tspan></text>
++ <g
++ transform="translate(118.50928,215.35846)"
++ id="g7164">
++ <g
++ style="display:inline"
++ transform="matrix(2.105461e-2,0,0,2.086758e-2,1070.6274,-195.7891)"
++ id="g7166">
++ <rect
++ style="opacity:0.40206185;fill:url(#linearGradient9016);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect7168"
++ width="1339.6335"
++ height="478.35718"
++ x="-1559.2523"
++ y="-150.69685" />
++ <path
++ style="opacity:0.40206185;fill:url(#radialGradient9018);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z"
++ id="path7170"
++ sodipodi:nodetypes="cccc" />
++ <path
++ sodipodi:nodetypes="cccc"
++ id="path7172"
++ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z"
++ style="opacity:0.40206185;fill:url(#radialGradient9020);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ </g>
++ <rect
++ ry="2.394444"
++ rx="2.4241352"
++ y="-215.91727"
++ x="1035.488"
++ height="23.112879"
++ width="31.978371"
++ id="rect7174"
++ style="fill:url(#linearGradient9022);fill-opacity:1;fill-rule:nonzero;stroke:#a0670c;stroke-width:1.00000072;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible" />
++ <rect
++ style="opacity:0.48101268;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient9024);stroke-width:1.00000107;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
++ id="rect7176"
++ width="29.804138"
++ height="21.075352"
++ x="1036.5247"
++ y="-214.94901"
++ rx="1.2846882"
++ ry="1.2846882" />
++ <path
++ sodipodi:nodetypes="ccccc"
++ id="path7178"
++ d="M 1036.7955,-214.64552 L 1041.8454,-221.45636 L 1060.641,-221.55737 L 1065.861,-214.78376 L 1036.7955,-214.64552 z"
++ style="fill:url(#linearGradient9026);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9028);stroke-width:1.00000083;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:nodetypes="ccccc"
++ id="path7180"
++ d="M 1066.302,-214.867 L 1071.495,-207.67234 L 1031.9866,-207.67234 L 1036.6507,-214.87194 L 1066.302,-214.867 z"
++ style="fill:url(#linearGradient9030);fill-opacity:1;fill-rule:nonzero;stroke:#a0670c;stroke-width:1.00000048;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible" />
++ <path
++ sodipodi:nodetypes="ccccc"
++ id="path7182"
++ d="M 1060.875,-221.5786 L 1065.5579,-214.65633 L 1074.5915,-210.2715 L 1066.477,-219.18416 L 1060.875,-221.5786 z"
++ style="fill:url(#linearGradient9032);fill-opacity:1;fill-rule:nonzero;stroke:#a0670c;stroke-width:1.00000048;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible" />
++ <path
++ sodipodi:nodetypes="ccccc"
++ style="fill:#f8e8cf;fill-opacity:1;fill-rule:nonzero;stroke:#a0670c;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
++ d="M 1041.6434,-221.47758 L 1037.6676,-214.75734 L 1028.533,-210.37252 L 1036.6475,-219.28517 L 1041.6434,-221.47758 z"
++ id="path7184" />
++ <path
++ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#f4e3ca;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
++ d="M 1065.0507,-214.75665 L 1069.5046,-208.69969 L 1033.674,-208.69969 L 1037.815,-214.88001 L 1065.0507,-214.75665 z"
++ id="path7186"
++ sodipodi:nodetypes="ccccc" />
++ <g
++ id="g7188"
++ transform="matrix(0.676538,0,0,1,1032.0206,-231.1927)">
++ <path
++ style="opacity:1;fill:url(#radialGradient9034);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 23.926073,12.101621 C 18.588065,12.101621 14.282569,14.129809 14.282569,16.641813 L 33.604773,16.641813 C 33.604773,14.129809 29.264081,12.101621 23.926073,12.101621 z"
++ id="path7190" />
++ <path
++ id="path7192"
++ d="M 23.931961,12.861168 C 20.379986,12.861168 17.515057,14.210748 17.515057,15.882266 L 30.372285,15.882266 C 30.372285,14.210748 27.483936,12.861168 23.931961,12.861168 z"
++ style="opacity:1;fill:url(#radialGradient9036);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ </g>
++ <g
++ transform="matrix(0.676538,0,0,1,1038.5206,-231.1927)"
++ id="g7194">
++ <path
++ id="path7196"
++ d="M 23.926073,12.101621 C 18.588065,12.101621 14.282569,14.129809 14.282569,16.641813 L 33.604773,16.641813 C 33.604773,14.129809 29.264081,12.101621 23.926073,12.101621 z"
++ style="opacity:1;fill:url(#radialGradient9038);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ style="opacity:1;fill:url(#radialGradient9040);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 23.931961,12.861168 C 20.379986,12.861168 17.515057,14.210748 17.515057,15.882266 L 30.372285,15.882266 C 30.372285,14.210748 27.483936,12.861168 23.931961,12.861168 z"
++ id="path7198" />
++ </g>
++ <path
++ style="opacity:0.87974686;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9042);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 1037.678,-214.8209 L 1041.0623,-220.59968 L 1061.5405,-220.6749 L 1065.3825,-214.82282 L 1037.678,-214.8209 z"
++ id="path7200"
++ sodipodi:nodetypes="ccccc" />
++ </g>
++ <rect
++ transform="matrix(0,1,-1,0,0,0)"
++ ry="2.9648066"
++ rx="2.9648066"
++ y="-1272.3579"
++ x="-40.129608"
++ height="149.21901"
++ width="95.13578"
++ id="rect7601"
++ style="opacity:0.64876033;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient9044);stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1" />
++ <rect
++ style="fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect7158"
++ width="49.884918"
++ height="33.861797"
++ x="1224.4877"
++ y="-7.6716423" />
++ <text
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="1241.1472"
++ y="12.805272"
++ id="text7160"><tspan
++ style="font-weight:bold;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ sodipodi:role="line"
++ id="tspan7162"
++ x="1241.1472"
++ y="12.805272">src</tspan></text>
++ <rect
++ ry="0"
++ rx="0"
++ y="-5.6688371"
++ x="1226.5129"
++ height="29.833549"
++ width="45.845081"
++ id="rect7611"
++ style="opacity:0.47520662;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient9046);stroke-width:2.00374508;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1" />
++ </g>
++ <rect
++ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2.01112818999999998;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069000000014;stroke-opacity:1"
++ id="rect4673"
++ width="790.17462"
++ height="290.7514"
++ x="164.58557"
++ y="-171.33693"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <rect
++ ry="5"
++ rx="5"
++ y="-59.909706"
++ x="185.83698"
++ height="99.162369"
++ width="153.2551"
++ id="rect3530"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3532"
++ y="-42.633949"
++ x="191.6134"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-42.633949"
++ x="191.6134"
++ id="tspan3534"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">file-source</tspan></text>
++ <rect
++ y="-27.26214"
++ x="289.49799"
++ height="33.867229"
++ width="49.561798"
++ id="rect3538"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3540"
++ y="-7.5990381"
++ x="308.49664"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-7.5990381"
++ x="308.49664"
++ id="tspan3542"
++ sodipodi:role="line">src</tspan></text>
++ <rect
++ ry="5"
++ rx="5"
++ y="-59.909706"
++ x="379.95404"
++ height="99.162369"
++ width="153.2551"
++ id="rect3544"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3546"
++ y="-42.633949"
++ x="385.73041"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-42.633949"
++ x="385.73041"
++ id="tspan3548"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">ogg-demuxer</tspan></text>
++ <rect
++ y="-27.26214"
++ x="379.94818"
++ height="33.867229"
++ width="49.561798"
++ id="rect3552"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3554"
++ y="-6.600503"
++ x="391.9256"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-6.600503"
++ x="391.9256"
++ id="tspan3556"
++ sodipodi:role="line">sink</tspan></text>
++ <rect
++ y="-48.764091"
++ x="483.61493"
++ height="33.867229"
++ width="49.561798"
++ id="rect3560"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3562"
++ y="-27.700373"
++ x="492.61359"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-27.700373"
++ x="492.61359"
++ id="tspan3564"
++ sodipodi:role="line">src_01</tspan></text>
++ <rect
++ ry="5"
++ rx="5"
++ y="-122.78056"
++ x="586.65533"
++ height="99.162369"
++ width="153.2551"
++ id="rect3566"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3568"
++ y="-105.5048"
++ x="592.43182"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-105.5048"
++ x="592.43182"
++ id="tspan3570"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">vorbis-decoder</tspan></text>
++ <rect
++ y="-90.132973"
++ x="586.64948"
++ height="33.867229"
++ width="49.561798"
++ id="rect3574"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3576"
++ y="-69.471352"
++ x="598.62689"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-69.471352"
++ x="598.62689"
++ id="tspan3578"
++ sodipodi:role="line">sink</tspan></text>
++ <rect
++ y="-90.132973"
++ x="690.31622"
++ height="33.867229"
++ width="49.561798"
++ id="rect3582"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3584"
++ y="-70.469887"
++ x="709.31488"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-70.469887"
++ x="709.31488"
++ id="tspan3586"
++ sodipodi:role="line">src</tspan></text>
++ <rect
++ ry="5"
++ rx="5"
++ y="-122.78056"
++ x="780.29425"
++ height="99.162369"
++ width="153.2551"
++ id="rect3610"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3612"
++ y="-105.5048"
++ x="786.07062"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-105.5048"
++ x="786.07062"
++ id="tspan3614"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">audio-sink</tspan></text>
++ <rect
++ y="-90.132973"
++ x="780.28839"
++ height="33.867229"
++ width="49.561798"
++ id="rect3618"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3620"
++ y="-69.471352"
++ x="792.26581"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-69.471352"
++ x="792.26581"
++ id="tspan3622"
++ sodipodi:role="line">sink</tspan></text>
++ <path
++ sodipodi:nodetypes="cc"
++ id="path3624"
++ d="M 338.86911,-10.30825 L 375.86911,-10.30825"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3626"
++ y="-148.00755"
++ x="173.85449"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="-148.00755"
++ x="173.85449"
++ id="tspan3628"
++ sodipodi:role="line"
++ style="font-size:18px;font-weight:bold;fill:#204a87;-inkscape-font-specification:Bitstream Vera Sans Bold">pipeline</tspan></text>
++ <path
++ sodipodi:nodetypes="cc"
++ id="path3632"
++ d="M 741.29421,-73.1791 L 778.29421,-73.1791"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path3634"
++ d="M 740.57991,51.61323 L 777.57991,51.61323"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <g
++ id="g7012"
++ transform="translate(-816.76968,195.18659)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <g
++ id="g6707"
++ transform="matrix(2.105461e-2,0,0,2.086758e-2,1070.6274,-195.7891)"
++ style="display:inline">
++ <rect
++ y="-150.69685"
++ x="-1559.2523"
++ height="478.35718"
++ width="1339.6335"
++ id="rect6709"
++ style="opacity:0.40206185;fill:url(#linearGradient9048);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ sodipodi:nodetypes="cccc"
++ id="path6711"
++ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z"
++ style="opacity:0.40206185;fill:url(#radialGradient9050);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ style="opacity:0.40206185;fill:url(#radialGradient9052);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z"
++ id="path6713"
++ sodipodi:nodetypes="cccc" />
++ </g>
++ <rect
++ style="fill:url(#linearGradient9054);fill-opacity:1;fill-rule:nonzero;stroke:#a0670c;stroke-width:1.00000072;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
++ id="rect3115"
++ width="31.978371"
++ height="23.112879"
++ x="1035.488"
++ y="-215.91727"
++ rx="2.4241352"
++ ry="2.394444" />
++ <rect
++ ry="1.2846882"
++ rx="1.2846882"
++ y="-214.94901"
++ x="1036.5247"
++ height="21.075352"
++ width="29.804138"
++ id="rect4220"
++ style="opacity:0.48101268;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient9056);stroke-width:1.00000107;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible" />
++ <path
++ style="fill:url(#linearGradient9058);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9060);stroke-width:1.00000083;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 1036.7955,-214.64552 L 1041.8454,-221.45636 L 1060.641,-221.55737 L 1065.861,-214.78376 L 1036.7955,-214.64552 z"
++ id="path4162"
++ sodipodi:nodetypes="ccccc" />
++ <path
++ style="fill:url(#linearGradient9062);fill-opacity:1;fill-rule:nonzero;stroke:#a0670c;stroke-width:1.00000048;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
++ d="M 1066.302,-214.867 L 1071.495,-207.67234 L 1031.9866,-207.67234 L 1036.6507,-214.87194 L 1066.302,-214.867 z"
++ id="path4164"
++ sodipodi:nodetypes="ccccc" />
++ <path
++ style="fill:url(#linearGradient9064);fill-opacity:1;fill-rule:nonzero;stroke:#a0670c;stroke-width:1.00000048;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
++ d="M 1060.875,-221.5786 L 1065.5579,-214.65633 L 1074.5915,-210.2715 L 1066.477,-219.18416 L 1060.875,-221.5786 z"
++ id="path4178"
++ sodipodi:nodetypes="ccccc" />
++ <path
++ id="path4180"
++ d="M 1041.6434,-221.47758 L 1037.6676,-214.75734 L 1028.533,-210.37252 L 1036.6475,-219.28517 L 1041.6434,-221.47758 z"
++ style="fill:#f8e8cf;fill-opacity:1;fill-rule:nonzero;stroke:#a0670c;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
++ sodipodi:nodetypes="ccccc" />
++ <path
++ sodipodi:nodetypes="ccccc"
++ id="path4954"
++ d="M 1065.0507,-214.75665 L 1069.5046,-208.69969 L 1033.674,-208.69969 L 1037.815,-214.88001 L 1065.0507,-214.75665 z"
++ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#f4e3ca;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible" />
++ <g
++ transform="matrix(0.676538,0,0,1,1032.0206,-231.1927)"
++ id="g2892">
++ <path
++ id="path2882"
++ d="M 23.926073,12.101621 C 18.588065,12.101621 14.282569,14.129809 14.282569,16.641813 L 33.604773,16.641813 C 33.604773,14.129809 29.264081,12.101621 23.926073,12.101621 z"
++ style="opacity:1;fill:url(#radialGradient9066);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ style="opacity:1;fill:url(#radialGradient9068);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 23.931961,12.861168 C 20.379986,12.861168 17.515057,14.210748 17.515057,15.882266 L 30.372285,15.882266 C 30.372285,14.210748 27.483936,12.861168 23.931961,12.861168 z"
++ id="path2141" />
++ </g>
++ <g
++ id="g2900"
++ transform="matrix(0.676538,0,0,1,1038.5206,-231.1927)">
++ <path
++ style="opacity:1;fill:url(#radialGradient9070);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 23.926073,12.101621 C 18.588065,12.101621 14.282569,14.129809 14.282569,16.641813 L 33.604773,16.641813 C 33.604773,14.129809 29.264081,12.101621 23.926073,12.101621 z"
++ id="path2902" />
++ <path
++ id="path2904"
++ d="M 23.931961,12.861168 C 20.379986,12.861168 17.515057,14.210748 17.515057,15.882266 L 30.372285,15.882266 C 30.372285,14.210748 27.483936,12.861168 23.931961,12.861168 z"
++ style="opacity:1;fill:url(#radialGradient9072);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ </g>
++ <path
++ sodipodi:nodetypes="ccccc"
++ id="path4966"
++ d="M 1037.678,-214.8209 L 1041.0623,-220.59968 L 1061.5405,-220.6749 L 1065.3825,-214.82282 L 1037.678,-214.8209 z"
++ style="opacity:0.87974686;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9074);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ </g>
++ <g
++ id="g7032"
++ transform="translate(-830.81219,194.07975)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <g
++ transform="matrix(0.8882175,0,0,0.8882175,1264.3555,-226.72473)"
++ id="layer2"
++ inkscape:label="shadow">
++ <path
++ sodipodi:type="arc"
++ style="fill:url(#radialGradient9076);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.50000042;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path1538"
++ sodipodi:cx="24.357143"
++ sodipodi:cy="38.714287"
++ sodipodi:rx="19.928572"
++ sodipodi:ry="9.837245"
++ d="M 44.285715,38.714287 A 19.928572,9.837245 0 1 1 4.4285717,38.714287 A 19.928572,9.837245 0 1 1 44.285715,38.714287 z"
++ transform="matrix(1.18638,0,0,1.18638,-4.539687,-7.794678)" />
++ </g>
++ <g
++ transform="matrix(0.8882175,0,0,0.8882175,1264.3555,-226.72473)"
++ inkscape:label="Layer 1"
++ id="g3839">
++ <path
++ id="path3243"
++ d="M 22.699525,0.94746963 C 22.22635,0.97984519 21.766437,1.0531317 21.301673,1.1063165 L 21.269903,1.1063165 L 20.157975,7.1742671 C 18.345621,7.5870046 16.640562,8.2874574 15.106644,9.2392765 L 10.118853,5.6493371 C 8.770521,6.6961412 7.543552,7.9170049 6.465374,9.2392765 L 9.928236,14.290607 C 8.876814,15.89739 8.086153,17.732094 7.640841,19.659632 C 7.640765,19.668743 7.640779,19.689813 7.640841,19.691401 L 1.60466,20.644482 C 1.494303,21.545851 1.445813,22.477386 1.445813,23.408418 C 1.445813,24.170171 1.466846,24.921747 1.541121,25.664043 L 7.577303,26.744202 C 8.0066,28.840363 8.822112,30.797987 9.960006,32.526228 L 6.370066,37.450482 C 7.398201,38.726866 8.585171,39.888962 9.864698,40.913343 L 14.947798,37.418712 C 16.724273,38.551956 18.707343,39.346604 20.856901,39.737877 L 21.809983,45.742288 C 22.487237,45.803935 23.181758,45.805827 23.874992,45.805827 C 24.853677,45.805826 25.788512,45.768738 26.734236,45.64698 L 27.877933,39.515491 C 29.91886,39.007587 31.836112,38.126493 33.501113,36.942172 L 38.393596,40.500342 C 39.662366,39.420897 40.822583,38.180154 41.824689,36.846863 L 38.266519,31.700225 C 39.230125,30.036028 39.897817,28.199859 40.23622,26.235892 L 46.240632,25.282811 C 46.29329,24.656221 46.30417,24.048546 46.30417,23.408418 C 46.30417,22.296018 46.174875,21.205317 46.018246,20.136172 L 39.918526,19.024244 C 39.440518,17.259164 38.656214,15.612364 37.662901,14.13176 L 41.25284,9.2075071 C 40.140075,7.8466524 38.870718,6.5895264 37.472284,5.5222596 L 32.293876,9.0804296 C 30.805549,8.200202 29.203897,7.5248159 27.464931,7.1424978 L 26.51185,1.1063165 C 25.644369,1.0042729 24.769749,0.94746963 23.874992,0.94746963 C 23.633166,0.94746964 23.384286,0.93986063 23.144296,0.94746963 C 23.027301,0.95117908 22.911525,0.94066346 22.794833,0.94746963 C 22.763228,0.94931296 22.73107,0.94531125 22.699525,0.94746963 z M 23.525529,16.387386 C 23.641592,16.381497 23.757473,16.387386 23.874992,16.387386 C 27.635598,16.387386 30.705408,19.457196 30.705408,23.217802 C 30.705409,26.978407 27.635597,30.016448 23.874992,30.016448 C 20.114387,30.016449 17.076346,26.978407 17.076346,23.217802 C 17.076347,19.574716 19.927558,16.569963 23.525529,16.387386 z"
++ style="opacity:1;fill:url(#linearGradient9078);fill-opacity:1;fill-rule:nonzero;stroke:#3f4561;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ transform="matrix(0.616598,0,0,0.616598,9.38202,8.539674)"
++ d="M 36.239223,23.781593 A 12.727922,12.727922 0 1 1 10.783379,23.781593 A 12.727922,12.727922 0 1 1 36.239223,23.781593 z"
++ sodipodi:ry="12.727922"
++ sodipodi:rx="12.727922"
++ sodipodi:cy="23.781593"
++ sodipodi:cx="23.511301"
++ id="path3283"
++ style="opacity:0.64772728;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.62180054;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ sodipodi:nodetypes="ccccccccccccccccccccccccccccccccc"
++ style="opacity:0.34659089;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.99999923;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 21.995808,2.1484671 L 21.103024,8.0235243 C 19.404254,8.4103946 16.279442,9.5936035 14.841657,10.485771 L 10.091975,6.9406268 C 8.828145,7.9218257 8.741474,7.9883656 7.730867,9.2277688 L 11.165063,14.320988 C 10.179537,15.827071 8.995796,18.510982 8.570778,20.42893 C 8.570778,20.42893 2.552988,21.443355 2.552988,21.443355 C 2.449547,22.288234 2.49926,24.096528 2.56888,24.792303 L 8.317097,25.82782 C 8.71949,27.79261 10.225324,30.955232 11.291904,32.575161 L 7.656902,37.377719 C 8.620601,38.57411 8.813474,38.683589 10.01281,39.64377 L 14.873441,36.082733 C 16.538581,37.144954 19.84373,38.437109 21.858571,38.80386 L 22.656299,44.604952 C 23.291109,44.662736 25.044829,44.824827 25.931283,44.710701 L 26.824066,38.671821 C 28.737084,38.195749 32.042539,36.838896 33.603191,35.728798 L 38.458624,39.236958 C 39.647878,38.225166 39.658533,38.072709 40.597835,36.822978 L 36.999815,31.708667 C 37.90303,30.148767 39.070902,27.098068 39.388097,25.257187 L 45.279046,24.279744 C 45.328399,23.692424 45.330802,22.054578 45.18399,21.052439 L 39.182092,20.016922 C 38.73404,18.362463 37.196418,15.381153 36.265359,13.993342 L 40.080075,9.1907857 C 39.037052,7.915218 38.64924,7.7402002 37.338448,6.7398212 L 32.313994,10.337839 C 30.918941,9.5127782 28.137095,8.2550417 26.507114,7.8966842 L 25.619528,2.1484671 C 24.806414,2.0528187 22.460488,2.0952921 21.995808,2.1484671 z"
++ id="path3285"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ sodipodi:nodetypes="cccccccccsccccccccccccccccccccsccccc"
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ id="path3767"
++ d="M 10.102903,6.2970655 C 8.7545689,7.3438694 8.1656464,7.9719226 7.0874684,9.2941942 L 10.489927,14.259153 C 9.4385072,15.857755 8.3316275,18.426114 8.1423859,19.987706 C 8.1423859,19.987706 2.0798859,21.0319 2.0798859,21.0319 C 2.0109129,21.595256 1.90625,22.884803 1.90625,22.884803 L 2.0830267,24.447303 C 2.5107567,24.535638 2.9231817,24.617818 3.3642767,24.666053 L 3.8642767,23.134803 C 4.2083177,23.163279 4.5439297,23.197303 4.8955267,23.197303 C 5.2467347,23.197303 5.6139847,23.163473 5.9580267,23.134803 L 6.4267767,24.666053 C 6.8680647,24.617818 7.3115487,24.535638 7.7392767,24.447303 L 7.7392767,22.884803 C 8.4250337,22.72518 9.0712777,22.497045 9.7080267,22.228553 L 10.645527,23.509803 C 11.047878,23.327709 11.421123,23.133984 11.801777,22.916053 L 11.301777,21.416053 C 11.89901,21.053803 12.463529,20.620706 12.989277,20.166053 L 14.270527,21.103553 C 14.596162,20.806973 14.91164,20.491691 15.208027,20.166053 L 14.270527,18.916053 C 14.725373,18.390305 15.127027,17.826171 15.489277,17.228553 L 16.989277,17.697303 C 17.207208,17.316456 17.432571,16.943209 17.614277,16.541053 L 16.333027,15.603553 C 16.601517,14.966804 16.798016,14.320561 16.958027,13.634803 L 18.551777,13.634803 C 18.640112,13.207076 18.691236,12.763591 18.739277,12.322303 L 17.239277,11.853553 C 17.268139,11.509705 17.301777,11.142456 17.301777,10.791053 C 17.301776,10.43965 17.267753,10.104039 17.239277,9.7598034 L 18.739277,9.2910534 C 18.69373,8.8711662 18.633686,8.4490548 18.551777,8.0410534 C 17.404349,8.4403544 15.999117,9.1941729 14.983265,9.8245243 L 10.102903,6.2970655 z"
++ style="opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ id="path3770"
++ d="M 37.236641,17.217754 C 36.85286,17.39913 36.490003,17.603509 36.123236,17.813295 L 36.692886,19.548136 C 35.995792,19.970436 35.338156,20.467825 34.725008,20.998151 L 33.249099,19.910639 C 32.869013,20.256538 32.507327,20.618223 32.161588,20.998151 L 33.249099,22.474059 C 32.718773,23.087371 32.221547,23.745002 31.799084,24.441937 L 31.255328,24.260685 C 31.207646,24.960968 31.018949,25.62217 30.737466,26.228563 L 30.841038,26.306242 C 30.527881,27.048922 30.27649,27.83664 30.090137,28.636624 L 28.614229,28.636624 C 28.477946,28.722076 28.343676,28.821684 28.199938,28.895555 C 28.121568,29.310822 28.065026,29.712881 28.018687,30.138426 L 29.77942,30.708074 C 29.746033,31.10935 29.727633,31.515269 29.727633,31.925052 C 29.727631,32.334993 29.746034,32.740753 29.77942,33.142029 L 28.018687,33.711677 C 28.074705,34.226432 28.148678,34.740347 28.251725,35.239372 L 30.090137,35.213479 C 30.218255,35.763466 30.393202,36.320918 30.582107,36.844746 C 31.327023,36.557466 32.05594,36.214561 32.731236,35.809021 C 32.319649,34.59298 32.083908,33.279913 32.083908,31.925052 C 32.083909,26.727119 35.376289,22.288397 39.981313,20.583861 L 38.893802,20.402608 C 38.671014,19.579946 38.382478,18.774017 38.013435,18.020441 C 38.002581,17.998277 37.99851,17.96486 37.987542,17.942761 L 37.935756,17.890975 L 37.236641,17.217754 z"
++ style="opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ </g>
++ </g>
++ <rect
++ y="-5.2878809"
++ x="483.42755"
++ height="33.867229"
++ width="49.561798"
++ id="rect3848"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3850"
++ y="15.77584"
++ x="492.42621"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="15.77584"
++ x="492.42621"
++ id="tspan3852"
++ sodipodi:role="line">src_02</tspan></text>
++ <path
++ sodipodi:nodetypes="cc"
++ id="path3854"
++ d="M 532.61231,15.70274 L 583.15071,50.6503"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <rect
++ ry="5"
++ rx="5"
++ y="2.011771"
++ x="586.65533"
++ height="99.162369"
++ width="153.2551"
++ id="rect3856"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3858"
++ y="19.287527"
++ x="592.43182"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="19.287527"
++ x="592.43182"
++ id="tspan3860"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">theora-decoder</tspan></text>
++ <rect
++ y="34.65934"
++ x="586.64948"
++ height="33.867229"
++ width="49.561798"
++ id="rect3864"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3866"
++ y="55.320976"
++ x="598.62689"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="55.320976"
++ x="598.62689"
++ id="tspan3868"
++ sodipodi:role="line">sink</tspan></text>
++ <rect
++ y="34.65934"
++ x="690.31622"
++ height="33.867229"
++ width="49.561798"
++ id="rect3872"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3874"
++ y="54.322441"
++ x="709.31488"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="54.322441"
++ x="709.31488"
++ id="tspan3876"
++ sodipodi:role="line">src</tspan></text>
++ <rect
++ ry="5"
++ rx="5"
++ y="2.011771"
++ x="780.29999"
++ height="99.162369"
++ width="153.2551"
++ id="rect3878"
++ style="fill:#729fcf;fill-opacity:0.11764706000000000;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748000000006;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3880"
++ y="19.287542"
++ x="786.07635"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="19.287542"
++ x="786.07635"
++ id="tspan3882"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">video-sink</tspan></text>
++ <rect
++ y="34.65934"
++ x="780.29413"
++ height="33.867229"
++ width="49.561798"
++ id="rect3886"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text3888"
++ y="55.320976"
++ x="792.27167"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="55.320976"
++ x="792.27167"
++ id="tspan3890"
++ sodipodi:role="line">sink</tspan></text>
++ <g
++ id="g7053"
++ transform="translate(-830.81219,185.30822)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <path
++ transform="matrix(0.9587652,0,0,0.9587652,1470.52,-281.13949)"
++ d="M 41.75,35.375 A 18.5,7.375 0 1 1 4.75,35.375 A 18.5,7.375 0 1 1 41.75,35.375 z"
++ sodipodi:ry="7.375"
++ sodipodi:rx="18.5"
++ sodipodi:cy="35.375"
++ sodipodi:cx="23.25"
++ id="path1344"
++ style="opacity:0.3;fill:url(#radialGradient9080);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ style="fill:#9db029;fill-opacity:1;fill-rule:nonzero;stroke:#596616;stroke-width:0.95876521;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block"
++ d="M 1510.4286,-276.38353 C 1510.4286,-276.38353 1488.3171,-273.66577 1488.3171,-273.66577 L 1488.3171,-252.78267 C 1486.739,-253.31732 1484.5474,-253.45709 1482.145,-252.96243 C 1477.9683,-252.10245 1474.9755,-249.799 1475.4337,-247.83903 C 1475.8918,-245.87906 1479.6462,-244.97163 1483.8229,-245.83162 C 1487.7698,-246.64429 1491.1901,-248.74416 1491.112,-250.62544 L 1491.2618,-268.87194 C 1491.2618,-268.87194 1507.4941,-271.64786 1507.4941,-271.64786 L 1507.4941,-255.07598 C 1497.6668,-256.51412 1494.75,-252.30204 1495.2082,-250.34207 C 1495.6664,-248.3821 1499.4207,-247.47468 1503.5974,-248.33466 C 1507.3034,-249.09772 1509.9563,-250.98393 1510.2189,-252.76895 L 1510.4286,-276.38353 z"
++ id="path7042"
++ sodipodi:nodetypes="cccccccccccccc" />
++ <path
++ sodipodi:nodetypes="ccccccccccc"
++ id="path2311"
++ d="M 1509.5696,-275.32842 C 1509.5696,-275.32842 1489.2612,-272.61066 1489.2612,-272.61066 L 1489.2612,-251.67282 C 1482.0079,-253.49957 1476.0944,-249.91406 1476.5301,-248.05018 C 1477.2055,-244.86801 1490.3156,-246.9934 1490.2413,-251.05952 L 1490.3838,-269.72971 C 1490.3838,-269.72971 1508.4568,-272.50278 1508.4568,-272.50278 L 1508.4568,-253.8671 C 1501.2026,-255.7143 1495.7383,-252.54747 1496.174,-250.6836 C 1496.7296,-247.62127 1508.0418,-248.65738 1509.3701,-253.23118 L 1509.5696,-275.32842 z"
++ style="opacity:0.51176471;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.95876521;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block" />
++ <path
++ transform="matrix(0.7042284,-0.1070413,0.1070413,0.7042284,1474.2624,-272.13586)"
++ d="M 12.25,32.75 A 6.375,3.25 0 1 1 -0.5,32.75 A 6.375,3.25 0 1 1 12.25,32.75 z"
++ sodipodi:ry="3.25"
++ sodipodi:rx="6.375"
++ sodipodi:cy="32.75"
++ sodipodi:cx="5.875"
++ id="path2313"
++ style="opacity:0.51176471;fill:url(#radialGradient9082);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.51176471;fill:url(#radialGradient9084);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
++ id="path2323"
++ sodipodi:cx="5.875"
++ sodipodi:cy="32.75"
++ sodipodi:rx="6.375"
++ sodipodi:ry="3.25"
++ d="M 12.25,32.75 A 6.375,3.25 0 1 1 -0.5,32.75 A 6.375,3.25 0 1 1 12.25,32.75 z"
++ transform="matrix(0.7042284,-0.1070413,0.1070413,0.7042284,1493.2867,-274.85362)" />
++ </g>
++ <g
++ id="g7042"
++ transform="translate(-830.81219,188.92104)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <path
++ transform="matrix(0.8013773,0,0,0.8013773,1475.315,-156.45514)"
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ d="M 44.724504,26.963573 A 21.566757,14.318913 0 1 1 1.5909901,26.963573 A 21.566757,14.318913 0 1 1 44.724504,26.963573 z"
++ sodipodi:ry="14.318913"
++ sodipodi:rx="21.566757"
++ sodipodi:cy="26.963573"
++ sodipodi:cx="23.157747"
++ id="path7077"
++ style="opacity:0.70329674;fill:url(#radialGradient9086);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:type="arc"
++ style="fill:#a1a39f;fill-opacity:1;fill-rule:evenodd;stroke:#6d6f6a;stroke-width:0.7190817;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path7028"
++ sodipodi:cx="25.75"
++ sodipodi:cy="21"
++ sodipodi:rx="14.75"
++ sodipodi:ry="8.25"
++ d="M 40.5,21 A 14.75,8.25 0 1 1 11,21 A 14.75,8.25 0 1 1 40.5,21 z"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ transform="matrix(1.0051171,0,0,1.2356645,1466.4725,-162.09851)" />
++ <path
++ transform="matrix(0.6122611,0,0,0.802831,1476.1749,-155.02827)"
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ d="M 40.5,21 A 14.75,8.25 0 1 1 11,21 A 14.75,8.25 0 1 1 40.5,21 z"
++ sodipodi:ry="8.25"
++ sodipodi:rx="14.75"
++ sodipodi:cy="21"
++ sodipodi:cx="25.75"
++ id="path3999"
++ style="fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.11522388;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="czccc"
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ id="path6456"
++ d="M 1511.2073,-124.02847 C 1511.2073,-124.02847 1504.5368,-127.02323 1500.2637,-126.64635 C 1495.7095,-126.24466 1488.1014,-125.97524 1485.1192,-130.68476 C 1497.7795,-126.86662 1503.6206,-133.20569 1512.1892,-129.63534 C 1512.1892,-129.63534 1511.2073,-124.02847 1511.2073,-124.02847 z"
++ style="fill:url(#radialGradient9088);fill-rule:nonzero;stroke:#3b3d39;stroke-width:0.8013773;stroke-miterlimit:4;stroke-opacity:1" />
++ <path
++ sodipodi:type="arc"
++ style="fill:url(#linearGradient9090);fill-opacity:1;fill-rule:evenodd;stroke:#757972;stroke-width:1.23408842;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path7026"
++ sodipodi:cx="25.75"
++ sodipodi:cy="21"
++ sodipodi:rx="14.75"
++ sodipodi:ry="8.25"
++ d="M 40.5,21 A 14.75,8.25 0 1 1 11,21 A 14.75,8.25 0 1 1 40.5,21 z"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ transform="matrix(0.6098233,0,0,0.7906893,1476.6513,-156.59802)" />
++ <path
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ id="path7012"
++ d="M 1491.2274,-150.88061 C 1483.5682,-150.45935 1477.5288,-145.74008 1477.5288,-140.03697 C 1477.5288,-134.05786 1484.1706,-129.19333 1492.3543,-129.19334 C 1500.538,-129.19334 1507.1798,-134.05786 1507.1798,-140.03697 C 1507.1798,-146.01609 1500.538,-150.88061 1492.3543,-150.88061 C 1492.3223,-150.88061 1492.286,-150.88076 1492.2541,-150.88061 C 1492.0633,-150.87973 1491.8671,-150.88673 1491.6781,-150.88061 C 1491.5858,-150.87762 1491.4945,-150.88483 1491.4027,-150.88061 C 1491.3421,-150.87783 1491.2877,-150.88393 1491.2274,-150.88061 z M 1490.1255,-149.1276 C 1490.1761,-149.13169 1490.2245,-149.12482 1490.2757,-149.1276 C 1490.3832,-149.13343 1490.4917,-149.1276 1490.6013,-149.1276 C 1492.9384,-149.1276 1494.8336,-147.76349 1494.8336,-146.09739 C 1494.8336,-144.43129 1492.9384,-143.09222 1490.6013,-143.09222 C 1488.2641,-143.09222 1486.369,-144.43129 1486.369,-146.09739 C 1486.369,-147.64817 1488.0134,-148.95707 1490.1255,-149.1276 z M 1499.3413,-145.44627 C 1499.3947,-145.45105 1499.4376,-145.44286 1499.4916,-145.44627 C 1499.5851,-145.45218 1499.672,-145.44455 1499.767,-145.44627 C 1499.8057,-145.44697 1499.8283,-145.44627 1499.8672,-145.44627 C 1502.3542,-145.44627 1504.3749,-143.99241 1504.3749,-142.21572 C 1504.3749,-140.43903 1502.3542,-139.01021 1499.8672,-139.01021 C 1497.3802,-139.01021 1495.3595,-140.43903 1495.3595,-142.21572 C 1495.3595,-143.85694 1497.1159,-145.24717 1499.3413,-145.44627 z M 1483.9398,-142.91692 C 1484.1144,-142.9312 1484.3109,-142.91692 1484.4908,-142.91692 C 1487.0491,-142.91692 1489.1237,-141.44051 1489.1237,-139.61124 C 1489.1237,-137.78198 1487.0491,-136.30556 1484.4908,-136.30556 C 1481.9325,-136.30556 1479.8578,-137.78198 1479.8578,-139.61124 C 1479.8578,-141.31189 1481.6317,-142.72807 1483.9398,-142.91692 z M 1493.1807,-138.80986 C 1493.1999,-138.8121 1493.2115,-138.80779 1493.2308,-138.80986 C 1493.233,-138.80996 1493.2538,-138.80989 1493.2558,-138.80986 C 1493.2579,-138.80983 1493.2787,-138.80978 1493.2809,-138.80986 C 1493.2859,-138.80978 1493.3034,-138.80977 1493.3059,-138.80986 C 1493.3269,-138.80972 1493.36,-138.81017 1493.3811,-138.80986 C 1493.3836,-138.80993 1493.4011,-138.80993 1493.4061,-138.80986 C 1493.5992,-138.82571 1493.7831,-138.80986 1493.9821,-138.80986 C 1496.8123,-138.80986 1499.1159,-137.18342 1499.1159,-135.15358 C 1499.1159,-133.12374 1496.8123,-131.47225 1493.9821,-131.47225 C 1491.1519,-131.47225 1488.8483,-133.12374 1488.8483,-135.15358 C 1488.8483,-136.9823 1490.7407,-138.52634 1493.1807,-138.80986 z"
++ style="fill:#d3d7cf;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:0.8013773;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ transform="matrix(0.7617356,0,0,0.7512912,1475.4861,-154.40517)"
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ d="M 40.65864,19.008621 A 18.473166,13.435029 0 1 1 3.7123089,19.008621 A 18.473166,13.435029 0 1 1 40.65864,19.008621 z"
++ sodipodi:ry="13.435029"
++ sodipodi:rx="18.473166"
++ sodipodi:cy="19.008621"
++ sodipodi:cx="22.185474"
++ id="path7044"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9092);stroke-width:1.05932879;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="ccccc"
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ id="path7067"
++ d="M 1511.8879,-129.42361 L 1511.0211,-124.57528 C 1508.9303,-125.27684 1507.6697,-125.83197 1505.3544,-126.38388 L 1505.6204,-130.32076 C 1507.1418,-130.48208 1509.5177,-130.20718 1511.8879,-129.42361 z"
++ style="fill:url(#linearGradient9094);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ sodipodi:nodetypes="cccc"
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ id="path7136"
++ d="M 1511.8879,-129.56898 L 1511.7376,-128.86778 C 1505.2425,-131.29506 1499.2633,-129.04946 1493.0054,-128.86778 C 1501.5089,-129.57506 1504.297,-131.84542 1511.8879,-129.56898 z"
++ style="opacity:0.70329674;fill:url(#linearGradient9096);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ </g>
++ <g
++ id="g7082"
++ transform="translate(-826.81219,187.77171)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <path
++ transform="matrix(1.050251,0,0,1.867888,1685.2,-187.2542)"
++ d="M 41.10058,35.051105 A 16.882174,4.552 0 1 1 7.3362331,35.051105 A 16.882174,4.552 0 1 1 41.10058,35.051105 z"
++ sodipodi:ry="4.552"
++ sodipodi:rx="16.882174"
++ sodipodi:cy="35.051105"
++ sodipodi:cx="24.218407"
++ id="path2452"
++ style="opacity:0.50857143;fill:url(#radialGradient9098);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:0.70063692;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ transform="translate(1746.179,-151.06966)"
++ d="M -26.263968,29.716238 A 9.3944187,3.939595 0 1 1 -45.052805,29.716238 A 9.3944187,3.939595 0 1 1 -26.263968,29.716238 z"
++ sodipodi:ry="3.939595"
++ sodipodi:rx="9.3944187"
++ sodipodi:cy="29.716238"
++ sodipodi:cx="-35.658386"
++ id="path2407"
++ style="fill:#adb0aa;fill-opacity:1;fill-rule:evenodd;stroke:#4b4d4a;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:type="arc"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9100);stroke-width:1.15713382;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path1825"
++ sodipodi:cx="-35.658386"
++ sodipodi:cy="29.716238"
++ sodipodi:rx="9.3944187"
++ sodipodi:ry="3.939595"
++ d="M -26.263968,29.716238 A 9.3944187,3.939595 0 1 1 -45.052805,29.716238 A 9.3944187,3.939595 0 1 1 -26.263968,29.716238 z"
++ transform="matrix(0.902373,0,0,0.82765,1742.6978,-146.28017)" />
++ <path
++ transform="matrix(0.837548,0,0,0.852655,1740.3237,-148.14194)"
++ d="M -26.263968,29.716238 A 9.3944187,3.939595 0 1 1 -45.052805,29.716238 A 9.3944187,3.939595 0 1 1 -26.263968,29.716238 z"
++ sodipodi:ry="3.939595"
++ sodipodi:rx="9.3944187"
++ sodipodi:cy="29.716238"
++ sodipodi:cx="-35.658386"
++ id="path2983"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9102);stroke-width:1.18333709;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <rect
++ style="fill:url(#linearGradient9104);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.60872948;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect2699"
++ width="9.0396729"
++ height="6.3650389"
++ x="1706.118"
++ y="-128.06947" />
++ <path
++ sodipodi:nodetypes="cssssssss"
++ id="rect2404"
++ d="M 1693.7265,-154.57747 L 1727.3147,-154.57747 C 1728.226,-154.57747 1728.9388,-153.99399 1728.9814,-153.17588 L 1730.3135,-127.59777 C 1730.3717,-126.48003 1729.4124,-125.57746 1728.2932,-125.57746 L 1692.748,-125.57746 C 1691.6288,-125.57746 1690.6695,-126.48003 1690.7277,-127.59777 L 1692.0598,-153.17588 C 1692.1,-153.94942 1692.6073,-154.57747 1693.7265,-154.57747 z"
++ style="fill:url(#linearGradient9106);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9108);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ style="fill:url(#linearGradient9110);fill-opacity:1;fill-rule:evenodd;stroke:#000079;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 1695.0561,-151.96726 L 1693.8139,-129.92195 L 1725.4643,-129.92195 L 1724.1293,-151.87383 L 1695.0561,-151.96726 z"
++ id="path2377"
++ sodipodi:nodetypes="ccccc" />
++ <path
++ id="path2393"
++ d="M 1692.823,-127.5373 L 1728.2515,-127.5373"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:url(#linearGradient9112);stroke-width:0.99618119;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.24840764"
++ sodipodi:nodetypes="cc" />
++ <path
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9114);stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:0.70063692;visibility:visible;display:inline;overflow:visible"
++ d="M 1693.5602,-153.56675 L 1727.4057,-153.60455 C 1727.6894,-153.60487 1727.965,-153.3673 1727.9878,-152.95201 L 1729.3497,-128.14876 C 1729.4077,-127.09173 1728.8099,-126.36289 1727.7513,-126.36289 L 1693.2274,-126.36289 C 1692.1687,-126.36289 1691.6343,-127.09168 1691.6915,-128.14876 L 1693.0156,-152.64293 C 1693.0543,-153.35876 1693.182,-153.56633 1693.5602,-153.56675 z"
++ id="path2397"
++ sodipodi:nodetypes="cssssssss" />
++ <path
++ id="path2443"
++ d="M 1695.3571,-151.52673 L 1694.5546,-133.6564 C 1705.5992,-136.05703 1709.9761,-144.1486 1723.7086,-146.80315 L 1723.5472,-151.46066 L 1695.3571,-151.52673 z"
++ style="opacity:0.53142856;fill:url(#linearGradient9116);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
++ sodipodi:nodetypes="ccccc" />
++ <path
++ sodipodi:type="arc"
++ style="fill:url(#linearGradient9118);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path2709"
++ sodipodi:cx="34.780815"
++ sodipodi:cy="3.9384086"
++ sodipodi:rx="0.83968931"
++ sodipodi:ry="0.83968931"
++ d="M 35.620504,3.9384086 A 0.83968931,0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931,0.83968931 0 1 1 35.620504,3.9384086 z"
++ transform="matrix(1.331237,0,0,0.658449,1680.2263,-153.41922)" />
++ <path
++ transform="matrix(1.331237,0,0,0.658449,1680.3399,-151.31344)"
++ d="M 35.620504,3.9384086 A 0.83968931,0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931,0.83968931 0 1 1 35.620504,3.9384086 z"
++ sodipodi:ry="0.83968931"
++ sodipodi:rx="0.83968931"
++ sodipodi:cy="3.9384086"
++ sodipodi:cx="34.780815"
++ id="path2719"
++ style="fill:url(#linearGradient9120);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:type="arc"
++ style="fill:url(#linearGradient9122);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path2723"
++ sodipodi:cx="34.780815"
++ sodipodi:cy="3.9384086"
++ sodipodi:rx="0.83968931"
++ sodipodi:ry="0.83968931"
++ d="M 35.620504,3.9384086 A 0.83968931,0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931,0.83968931 0 1 1 35.620504,3.9384086 z"
++ transform="matrix(1.331237,0,0,0.658449,1680.4535,-149.31344)" />
++ <path
++ transform="matrix(1.331237,0,0,0.658449,1680.5671,-147.31344)"
++ d="M 35.620504,3.9384086 A 0.83968931,0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931,0.83968931 0 1 1 35.620504,3.9384086 z"
++ sodipodi:ry="0.83968931"
++ sodipodi:rx="0.83968931"
++ sodipodi:cy="3.9384086"
++ sodipodi:cx="34.780815"
++ id="path2727"
++ style="fill:url(#linearGradient9124);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:type="arc"
++ style="fill:url(#linearGradient9126);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path2731"
++ sodipodi:cx="34.780815"
++ sodipodi:cy="3.9384086"
++ sodipodi:rx="0.83968931"
++ sodipodi:ry="0.83968931"
++ d="M 35.620504,3.9384086 A 0.83968931,0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931,0.83968931 0 1 1 35.620504,3.9384086 z"
++ transform="matrix(1.331237,0,0,0.658449,1680.6807,-145.31344)" />
++ <path
++ style="font-size:0.9029026px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;writing-mode:lr-tb;text-anchor:start;fill:#4a4a4a;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ d="M 1708.6456,-128.95542 L 1708.9273,-128.95542 C 1709.0111,-128.95542 1709.0753,-128.93676 1709.12,-128.89943 C 1709.1649,-128.8624 1709.1874,-128.8095 1709.1874,-128.74072 C 1709.1874,-128.67165 1709.1649,-128.61845 1709.12,-128.58112 C 1709.0753,-128.54409 1709.0111,-128.52558 1708.9273,-128.52558 L 1708.8153,-128.52558 L 1708.8153,-128.2972 L 1708.6456,-128.2972 L 1708.6456,-128.95542 M 1708.8153,-128.83242 L 1708.8153,-128.64858 L 1708.9092,-128.64858 C 1708.9422,-128.64858 1708.9676,-128.65651 1708.9855,-128.67238 C 1709.0034,-128.68855 1709.0124,-128.71133 1709.0124,-128.74072 C 1709.0124,-128.77011 1709.0034,-128.79274 1708.9855,-128.80861 C 1708.9676,-128.82448 1708.9422,-128.83242 1708.9092,-128.83242 L 1708.8153,-128.83242 M 1709.6076,-128.84432 C 1709.5558,-128.84432 1709.5157,-128.82522 1709.4872,-128.78701 C 1709.4587,-128.7488 1709.4445,-128.69502 1709.4445,-128.62565 C 1709.4445,-128.55658 1709.4587,-128.50294 1709.4872,-128.46473 C 1709.5157,-128.42653 1709.5558,-128.40742 1709.6076,-128.40742 C 1709.6596,-128.40742 1709.6999,-128.42653 1709.7284,-128.46473 C 1709.7569,-128.50294 1709.7711,-128.55658 1709.7711,-128.62565 C 1709.7711,-128.69502 1709.7569,-128.7488 1709.7284,-128.78701 C 1709.6999,-128.82522 1709.6596,-128.84432 1709.6076,-128.84432 M 1709.6076,-128.96733 C 1709.7134,-128.96733 1709.7963,-128.93705 1709.8562,-128.87651 C 1709.9162,-128.81596 1709.9462,-128.73234 1709.9462,-128.62565 C 1709.9462,-128.51926 1709.9162,-128.43579 1709.8562,-128.37524 C 1709.7963,-128.31469 1709.7134,-128.28442 1709.6076,-128.28442 C 1709.5021,-128.28442 1709.4192,-128.31469 1709.3589,-128.37524 C 1709.299,-128.43579 1709.269,-128.51926 1709.269,-128.62565 C 1709.269,-128.73234 1709.299,-128.81596 1709.3589,-128.87651 C 1709.4192,-128.93705 1709.5021,-128.96733 1709.6076,-128.96733 M 1710.074,-128.95542 L 1710.2636,-128.95542 L 1710.503,-128.50397 L 1710.503,-128.95542 L 1710.6639,-128.95542 L 1710.6639,-128.2972 L 1710.4743,-128.2972 L 1710.2349,-128.74866 L 1710.2349,-128.2972 L 1710.074,-128.2972 L 1710.074,-128.95542 M 1710.7371,-128.95542 L 1710.9227,-128.95542 L 1711.0726,-128.72088 L 1711.2225,-128.95542 L 1711.4085,-128.95542 L 1711.1577,-128.57451 L 1711.1577,-128.2972 L 1710.9879,-128.2972 L 1710.9879,-128.57451 L 1710.7371,-128.95542"
++ id="text2735" />
++ </g>
++ <g
++ id="g4318"
++ inkscape:label="Layer 1"
++ style="display:inline"
++ transform="translate(226.32061,-143.29228)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <path
++ sodipodi:nodetypes="cccc"
++ id="path2682"
++ d="M 12,39.5 L 12,9 L 38.06998,23.817079 L 12,39.5 z"
++ style="opacity:0.15;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9128);stroke-width:1.99999833;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ style="fill:url(#radialGradient9130);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000036;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 12.49946,37.81149 L 12.49946,10.000005 L 36.602747,23.905748 L 12.49946,37.81149 z"
++ id="path3375"
++ sodipodi:nodetypes="cccc" />
++ <path
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9132);stroke-width:1.00000036;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 12.49946,37.81149 L 12.49946,10.000005 L 36.602747,23.905748 L 12.49946,37.81149 z"
++ id="path2479"
++ sodipodi:nodetypes="cccc" />
++ <path
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 12.99946,10.87449 L 12.99946,36.93699 L 35.59321,23.90574 L 12.99946,10.87449 z M 13.99946,12.62449 L 33.56196,23.90574 L 13.99946,35.18699 L 13.99946,12.62449 z"
++ id="path2481"
++ sodipodi:nodetypes="cccccccc" />
++ <path
++ style="opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
++ d="M 13.9375,12.5625 L 13.9375,24.25 C 18.206698,24.205215 23.101656,23.904436 31,22.375 L 13.9375,12.5625 z"
++ id="path2339"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ sodipodi:nodetypes="cccc" />
++ </g>
++ <g
++ id="g2837"
++ transform="translate(193.47491,-142.94801)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <path
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ id="path2815"
++ d="M 26.086565,12.829103 L 26.086565,34.982359 L 34.912658,34.982359 L 34.912658,12.829103 L 26.086565,12.829103 z"
++ style="opacity:0.15;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9134);stroke-width:1.99999952;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ id="path2827"
++ d="M 26.4996,13.40575 L 26.4996,34.40575 L 34.4996,34.40575 L 34.4996,13.40575 L 26.4996,13.40575 z"
++ style="fill:url(#radialGradient9136);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9138);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 26.4996,13.407946 L 26.4996,34.50001 L 34.4996,34.50001 L 34.4996,13.407946 L 26.4996,13.407946 z"
++ id="path2762"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ id="path2811"
++ d="M 27.4996,14.40575 L 27.4996,33.40575 L 33.4996,33.40575 L 33.4996,14.40575 L 27.4996,14.40575 z"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9140);stroke-width:0.9999997;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ sodipodi:nodetypes="ccccc"
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ id="path4470"
++ d="M 28.019106,14.942758 L 28.019106,23.328389 L 33.013048,22.70967 L 33.013048,14.85437 L 28.019106,14.942758 z"
++ style="opacity:0.5;fill:#f7f7f7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible" />
++ </g>
++ <g
++ id="use2844"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ transform="translate(180.50261,-142.94801)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <path
++ style="opacity:0.15;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9142);stroke-width:1.99999952;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 26.086565,12.829103 L 26.086565,34.982359 L 34.912658,34.982359 L 34.912658,12.829103 L 26.086565,12.829103 z"
++ id="path2848"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="fill:url(#radialGradient9144);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 26.4996,13.40575 L 26.4996,34.40575 L 34.4996,34.40575 L 34.4996,13.40575 L 26.4996,13.40575 z"
++ id="path2850"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ id="path2852"
++ d="M 26.4996,13.407946 L 26.4996,34.50001 L 34.4996,34.50001 L 34.4996,13.407946 L 26.4996,13.407946 z"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9146);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9148);stroke-width:0.9999997;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 27.4996,14.40575 L 27.4996,33.40575 L 33.4996,33.40575 L 33.4996,14.40575 L 27.4996,14.40575 z"
++ id="path2854"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="opacity:0.5;fill:#f7f7f7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
++ d="M 28.019106,14.942758 L 28.019106,25.007768 L 33.013048,24.389049 L 33.013048,14.85437 L 28.019106,14.942758 z"
++ id="path2856"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ sodipodi:nodetypes="ccccc" />
++ </g>
++ <path
++ style="opacity:0.15;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9259);stroke-width:1.99999952;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 175.60121,-130.11891 L 175.60121,-107.96565 L 196.59741,-107.96565 L 196.59741,-130.11891 L 175.60121,-130.11891 z"
++ id="path4663"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ style="fill:url(#radialGradient9256);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 176.09741,-129.54228 L 176.09741,-108.54228 L 196.09741,-108.54228 L 196.09741,-129.54228 L 176.09741,-129.54228 z"
++ id="path4665"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ id="path4667"
++ d="M 176.09411,-129.58831 L 176.09411,-108.49625 L 196.08521,-108.49625 L 196.08521,-129.58831 L 176.09411,-129.58831 z"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9253);stroke-width:0.99999952;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9250);stroke-width:0.99999976;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 177.09681,-128.54228 L 177.09681,-109.54228 L 195.09801,-109.54228 L 195.09801,-128.54228 L 177.09681,-128.54228 z"
++ id="path4669"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <path
++ style="opacity:0.5;fill:#f7f7f7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
++ d="M 177.59741,-124.27671 L 177.59741,-113.71947 L 194.59741,-116.5098 L 194.59741,-124.3651 L 177.59741,-124.27671 z"
++ id="path4671"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ sodipodi:nodetypes="ccccc"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <g
++ inkscape:label="Layer 1"
++ id="g6482"
++ transform="translate(866.48891,-98.34908)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <path
++ transform="matrix(2.901907,0,0,3.804948,-4.8525,-32.31157)"
++ d="M 11.932427,17.403807 A 5.524272,2.2980971 0 1 1 0.88388348,17.403807 A 5.524272,2.2980971 0 1 1 11.932427,17.403807 z"
++ sodipodi:ry="2.2980971"
++ sodipodi:rx="5.524272"
++ sodipodi:cy="17.403807"
++ sodipodi:cx="6.4081554"
++ id="path3607"
++ style="opacity:0.42857145;fill:url(#radialGradient9158);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <g
++ transform="matrix(1.296182,0,0,1.296182,-4.176277,-7.324567)"
++ id="g4090">
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:url(#linearGradient9160);fill-opacity:1;fill-rule:nonzero;stroke:#5d615f;stroke-width:0.57792485;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path4076"
++ sodipodi:cx="8.7504463"
++ sodipodi:cy="24.665476"
++ sodipodi:rx="3.6239223"
++ sodipodi:ry="6.3639612"
++ d="M 12.374369,24.665476 A 3.6239223,6.3639612 0 1 1 5.126524,24.665476 A 3.6239223,6.3639612 0 1 1 12.374369,24.665476 z"
++ transform="matrix(1.415965,0,0,1.258558,-2.667614,-6.200669)" />
++ <path
++ transform="matrix(1.154526,0,0,1.154526,-0.379902,-3.63468)"
++ d="M 12.374369,24.665476 A 3.6239223,6.3639612 0 1 1 5.126524,24.665476 A 3.6239223,6.3639612 0 1 1 12.374369,24.665476 z"
++ sodipodi:ry="6.3639612"
++ sodipodi:rx="3.6239223"
++ sodipodi:cy="24.665476"
++ sodipodi:cx="8.7504463"
++ id="path4060"
++ style="opacity:1;fill:url(#linearGradient9162);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.86615634;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#93958f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.86615634;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path4058"
++ sodipodi:cx="8.7504463"
++ sodipodi:cy="24.665476"
++ sodipodi:rx="3.6239223"
++ sodipodi:ry="6.3639612"
++ d="M 12.374369,24.665476 A 3.6239223,6.3639612 0 1 1 5.126524,24.665476 A 3.6239223,6.3639612 0 1 1 12.374369,24.665476 z"
++ transform="matrix(1.081355,0,0,1.081355,1.232653,-1.829889)" />
++ <path
++ transform="matrix(1.1807,0,0,1.076971,-0.608944,-1.721744)"
++ d="M 12.374369,24.665476 A 3.6239223,6.3639612 0 1 1 5.126524,24.665476 A 3.6239223,6.3639612 0 1 1 12.374369,24.665476 z"
++ sodipodi:ry="6.3639612"
++ sodipodi:rx="3.6239223"
++ sodipodi:cy="24.665476"
++ sodipodi:cx="8.7504463"
++ id="path3279"
++ style="opacity:0.39560439;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient9164);stroke-width:0.68416733;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ </g>
++ <path
++ sodipodi:nodetypes="ccccc"
++ id="path4542"
++ d="M 9.4806798,18.24261 L 16.570367,12.118401 L 16.341232,37.201244 L 9.1369775,31.676187 C 6.6164956,29.613972 6.1582259,20.41939 9.4806798,18.24261 z"
++ style="fill:url(#linearGradient9166);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9168);stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ sodipodi:nodetypes="ccccc"
++ id="path4544"
++ d="M 7.5383505,21.987453 L 11.593316,18.948432 L 11.341702,22.484506 L 7.3782322,23.145502 L 7.5383505,21.987453 z"
++ style="fill:url(#linearGradient9170);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ sodipodi:nodetypes="ccccc"
++ id="path3672"
++ d="M 8.203516,30.371178 L 12.644321,33.939519 L 12.087496,31.511626 L 7.6110912,29.008887 L 8.203516,30.371178 z"
++ style="opacity:0.7692308;fill:url(#radialGradient9172);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <g
++ transform="matrix(1.096894,0,0,1.509271,-4.216951,-12.11812)"
++ id="g4006"
++ style="display:inline">
++ <path
++ style="opacity:1;fill:url(#radialGradient9174);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9176);stroke-width:1.47668338;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 23.75,14 C 21.81001,14.049168 20.013366,14.683436 18.5,15.6875 C 18.13319,15.264088 17.60375,15 17,15 C 16.9655,15 16.912662,15.000854 16.875,15 C 16.847007,14.9998 16.806453,14.997438 16.78125,15 C 15.773145,15.102481 15,15.965001 15,17 C 15,17.60375 15.264088,18.13319 15.6875,18.5 C 14.639107,20.080181 14,21.962011 14,24 C 14,26.033681 14.611921,27.921829 15.65625,29.5 C 15.243427,29.869532 15,30.401641 15,31 C 15,32.104 15.896,33.000001 17,33 C 17.60375,33 18.13319,32.735911 18.5,32.3125 C 20.080181,33.360893 21.962011,34 24,34 C 26.03799,34 27.919819,33.360893 29.5,32.3125 C 29.86681,32.735912 30.396251,33.000001 31,33 C 32.103999,33 33,32.104001 33,31 C 33,30.39625 32.735912,29.86681 32.3125,29.5 C 33.360893,27.919819 34,26.03799 34,24 C 34,21.962011 33.360893,20.080181 32.3125,18.5 C 32.735912,18.13319 33,17.60375 33,17 C 33,15.896 32.103999,15 31,15 C 30.9655,15 30.912662,15.000854 30.875,15 C 30.847007,14.9998 30.806453,14.997438 30.78125,15 C 30.277198,15.05124 29.819299,15.298435 29.5,15.65625 C 29.493313,15.651825 29.475448,15.660659 29.46875,15.65625 C 27.894622,14.620029 26.025064,14 24,14 C 23.913827,14 23.835651,13.997829 23.75,14 z"
++ id="path3726"
++ sodipodi:nodetypes="ccsssscscsscscsscscsssssssc" />
++ <path
++ style="opacity:1;fill:url(#radialGradient9178);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.09104455;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 23.75,14 C 21.81001,14.049168 20.013366,14.683436 18.5,15.6875 C 18.13319,15.264088 17.60375,15 17,15 C 16.9655,15 16.912662,15.000854 16.875,15 C 16.847007,14.9998 16.806453,14.997438 16.78125,15 C 15.773145,15.102481 15,15.965001 15,17 C 15,17.60375 15.264088,18.13319 15.6875,18.5 C 14.639107,20.080181 14,21.962011 14,24 C 14,26.033681 14.611921,27.921829 15.65625,29.5 C 15.243427,29.869532 15,30.401641 15,31 C 15,32.104 15.896,33.000001 17,33 C 17.60375,33 18.13319,32.735911 18.5,32.3125 C 20.080181,33.360893 21.962011,34 24,34 C 26.03799,34 27.919819,33.360893 29.5,32.3125 C 29.86681,32.735912 30.396251,33.000001 31,33 C 32.103999,33 33,32.104001 33,31 C 33,30.39625 32.735912,29.86681 32.3125,29.5 C 33.360893,27.919819 34,26.03799 34,24 C 34,21.962011 33.360893,20.080181 32.3125,18.5 C 32.735912,18.13319 33,17.60375 33,17 C 33,15.896 32.103999,15 31,15 C 30.9655,15 30.912662,15.000854 30.875,15 C 30.847007,14.9998 30.806453,14.997438 30.78125,15 C 30.277198,15.05124 29.819299,15.298435 29.5,15.65625 C 29.493313,15.651825 29.475448,15.660659 29.46875,15.65625 C 27.894622,14.620029 26.025064,14 24,14 C 23.913827,14 23.835651,13.997829 23.75,14 z"
++ id="path6495"
++ sodipodi:nodetypes="ccsssscscsscscsscscsssssssc" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:url(#radialGradient9180);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9182);stroke-width:0.8383193;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path3636"
++ sodipodi:cx="9.375"
++ sodipodi:cy="9.375"
++ sodipodi:rx="9.375"
++ sodipodi:ry="9.375"
++ d="M 18.75,9.375 A 9.375,9.375 0 1 1 0,9.375 A 9.375,9.375 0 1 1 18.75,9.375 z"
++ transform="matrix(0.846982,0,0,0.911415,16.71027,15.44956)" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:url(#radialGradient9184);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6.57905483;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path3519"
++ sodipodi:cx="9.375"
++ sodipodi:cy="9.375"
++ sodipodi:rx="9.375"
++ sodipodi:ry="9.375"
++ d="M 18.75,9.375 A 9.375,9.375 0 1 1 0,9.375 A 9.375,9.375 0 1 1 18.75,9.375 z"
++ transform="matrix(0.367272,0,0,0.32,18.56254,21.125)" />
++ <path
++ transform="matrix(1.3125,0,0,1.3125,-4.657679,-5.09375)"
++ sodipodi:type="arc"
++ style="opacity:1;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path3718"
++ sodipodi:cx="16.5"
++ sodipodi:cy="16.5"
++ sodipodi:rx="0.5"
++ sodipodi:ry="0.5"
++ d="M 17,16.5 A 0.5,0.5 0 1 1 16,16.5 A 0.5,0.5 0 1 1 17,16.5 z" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path3720"
++ sodipodi:cx="16.5"
++ sodipodi:cy="16.5"
++ sodipodi:rx="0.5"
++ sodipodi:ry="0.5"
++ d="M 17,16.5 A 0.5,0.5 0 1 1 16,16.5 A 0.5,0.5 0 1 1 17,16.5 z"
++ transform="translate(15.22159,0.25)" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path3722"
++ sodipodi:cx="16.5"
++ sodipodi:cy="16.5"
++ sodipodi:rx="0.5"
++ sodipodi:ry="0.5"
++ d="M 17,16.5 A 0.5,0.5 0 1 1 16,16.5 A 0.5,0.5 0 1 1 17,16.5 z"
++ transform="translate(15.22159,14.96875)" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path3724"
++ sodipodi:cx="16.5"
++ sodipodi:cy="16.5"
++ sodipodi:rx="0.5"
++ sodipodi:ry="0.5"
++ d="M 17,16.5 A 0.5,0.5 0 1 1 16,16.5 A 0.5,0.5 0 1 1 17,16.5 z"
++ transform="matrix(1.375,0,0,1.375,-5.688929,8.8125)" />
++ </g>
++ <path
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient9186);stroke-width:0.99999982;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 36.087935,32.865672 C 37.005198,30.700908 37.568925,27.707589 37.568925,24.427683 C 37.568925,21.147777 37.005198,18.154458 36.087935,15.989694"
++ id="path3488"
++ sodipodi:nodetypes="csc" />
++ <path
++ sodipodi:nodetypes="csc"
++ id="path3494"
++ d="M 39.838951,35.702755 C 41.064624,32.810137 41.817892,28.81038 41.817892,24.427678 C 41.817892,20.044976 41.064624,16.045219 39.838951,13.152601"
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient9188);stroke-width:0.99999982;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient9190);stroke-width:0.99999982;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 43.487454,39.708054 C 45.148528,35.787876 46.169383,30.367266 46.169383,24.427674 C 46.169383,18.488083 45.148528,13.067472 43.487454,9.1472948"
++ id="path3496"
++ sodipodi:nodetypes="csc" />
++ </g>
++ <text
++ xml:space="preserve"
++ style="font-size:10px;font-style:italic;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
++ x="170.37872"
++ y="111.17413"
++ id="text6835"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ sodipodi:role="line"
++ id="tspan6837"
++ x="170.37872"
++ y="111.17413"
++ style="font-size:14px;font-weight:normal;-inkscape-font-specification:Bitstream Vera Sans">Gstreamer pipeline for a basic ogg player</tspan></text>
++ <path
++ sodipodi:nodetypes="cc"
++ id="path7621"
++ d="M 532.93871,-33.63525 L 583.47711,-68.58281"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <g
++ id="g9665"
++ transform="translate(0,-1.2932313)">
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect8054"
++ width="153.2551"
++ height="99.162369"
++ x="389.42743"
++ y="171.70979"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="395.20392"
++ y="186.98555"
++ id="text8056"><tspan
++ style="font-size:14px;font-weight:bold;fill:#ffffff;fill-opacity:1;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ sodipodi:role="line"
++ id="tspan8058"
++ x="395.20392"
++ y="186.98555">theora-decoder</tspan></text>
++ <rect
++ style="fill:#c5d8ec;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect8060"
++ width="49.561798"
++ height="33.867229"
++ x="389.42157"
++ y="204.35736" />
++ <text
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="402.26154"
++ y="225.019"
++ id="text8062"><tspan
++ sodipodi:role="line"
++ id="tspan8064"
++ x="402.26154"
++ y="225.019">sink</tspan></text>
++ <rect
++ style="fill:#c5d8ec;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect8066"
++ width="49.561798"
++ height="33.867229"
++ x="493.08832"
++ y="204.35736" />
++ <text
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="509.5318"
++ y="224.02046"
++ id="text8068"><tspan
++ sodipodi:role="line"
++ id="tspan8070"
++ x="509.5318"
++ y="224.02046">src</tspan></text>
++ <g
++ transform="translate(-1028.0402,358.61906)"
++ id="g8072">
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.70329674;fill:url(#radialGradient9686);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path8074"
++ sodipodi:cx="23.157747"
++ sodipodi:cy="26.963573"
++ sodipodi:rx="21.566757"
++ sodipodi:ry="14.318913"
++ d="M 44.724504,26.963573 A 21.566757,14.318913 0 1 1 1.5909901,26.963573 A 21.566757,14.318913 0 1 1 44.724504,26.963573 z"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ transform="matrix(0.8013773,0,0,0.8013773,1475.315,-156.45514)" />
++ <path
++ transform="matrix(1.0051171,0,0,1.2356645,1466.4725,-162.09851)"
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ d="M 40.5,21 A 14.75,8.25 0 1 1 11,21 A 14.75,8.25 0 1 1 40.5,21 z"
++ sodipodi:ry="8.25"
++ sodipodi:rx="14.75"
++ sodipodi:cy="21"
++ sodipodi:cx="25.75"
++ id="path8076"
++ style="fill:#a1a39f;fill-opacity:1;fill-rule:evenodd;stroke:#6d6f6a;stroke-width:0.7190817;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:type="arc"
++ style="fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.11522388;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path8078"
++ sodipodi:cx="25.75"
++ sodipodi:cy="21"
++ sodipodi:rx="14.75"
++ sodipodi:ry="8.25"
++ d="M 40.5,21 A 14.75,8.25 0 1 1 11,21 A 14.75,8.25 0 1 1 40.5,21 z"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ transform="matrix(0.6122611,0,0,0.802831,1476.1749,-155.02827)" />
++ <path
++ style="fill:url(#radialGradient9688);fill-rule:nonzero;stroke:#3b3d39;stroke-width:0.8013773;stroke-miterlimit:4;stroke-opacity:1"
++ d="M 1511.2073,-124.02847 C 1511.2073,-124.02847 1504.5368,-127.02323 1500.2637,-126.64635 C 1495.7095,-126.24466 1488.1014,-125.97524 1485.1192,-130.68476 C 1497.7795,-126.86662 1503.6206,-133.20569 1512.1892,-129.63534 C 1512.1892,-129.63534 1511.2073,-124.02847 1511.2073,-124.02847 z"
++ id="path8080"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ sodipodi:nodetypes="czccc" />
++ <path
++ transform="matrix(0.6098233,0,0,0.7906893,1476.6513,-156.59802)"
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ d="M 40.5,21 A 14.75,8.25 0 1 1 11,21 A 14.75,8.25 0 1 1 40.5,21 z"
++ sodipodi:ry="8.25"
++ sodipodi:rx="14.75"
++ sodipodi:cy="21"
++ sodipodi:cx="25.75"
++ id="path8082"
++ style="fill:url(#linearGradient9690);fill-opacity:1;fill-rule:evenodd;stroke:#757972;stroke-width:1.23408842;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ style="fill:#d3d7cf;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:0.8013773;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 1491.2274,-150.88061 C 1483.5682,-150.45935 1477.5288,-145.74008 1477.5288,-140.03697 C 1477.5288,-134.05786 1484.1706,-129.19333 1492.3543,-129.19334 C 1500.538,-129.19334 1507.1798,-134.05786 1507.1798,-140.03697 C 1507.1798,-146.01609 1500.538,-150.88061 1492.3543,-150.88061 C 1492.3223,-150.88061 1492.286,-150.88076 1492.2541,-150.88061 C 1492.0633,-150.87973 1491.8671,-150.88673 1491.6781,-150.88061 C 1491.5858,-150.87762 1491.4945,-150.88483 1491.4027,-150.88061 C 1491.3421,-150.87783 1491.2877,-150.88393 1491.2274,-150.88061 z M 1490.1255,-149.1276 C 1490.1761,-149.13169 1490.2245,-149.12482 1490.2757,-149.1276 C 1490.3832,-149.13343 1490.4917,-149.1276 1490.6013,-149.1276 C 1492.9384,-149.1276 1494.8336,-147.76349 1494.8336,-146.09739 C 1494.8336,-144.43129 1492.9384,-143.09222 1490.6013,-143.09222 C 1488.2641,-143.09222 1486.369,-144.43129 1486.369,-146.09739 C 1486.369,-147.64817 1488.0134,-148.95707 1490.1255,-149.1276 z M 1499.3413,-145.44627 C 1499.3947,-145.45105 1499.4376,-145.44286 1499.4916,-145.44627 C 1499.5851,-145.45218 1499.672,-145.44455 1499.767,-145.44627 C 1499.8057,-145.44697 1499.8283,-145.44627 1499.8672,-145.44627 C 1502.3542,-145.44627 1504.3749,-143.99241 1504.3749,-142.21572 C 1504.3749,-140.43903 1502.3542,-139.01021 1499.8672,-139.01021 C 1497.3802,-139.01021 1495.3595,-140.43903 1495.3595,-142.21572 C 1495.3595,-143.85694 1497.1159,-145.24717 1499.3413,-145.44627 z M 1483.9398,-142.91692 C 1484.1144,-142.9312 1484.3109,-142.91692 1484.4908,-142.91692 C 1487.0491,-142.91692 1489.1237,-141.44051 1489.1237,-139.61124 C 1489.1237,-137.78198 1487.0491,-136.30556 1484.4908,-136.30556 C 1481.9325,-136.30556 1479.8578,-137.78198 1479.8578,-139.61124 C 1479.8578,-141.31189 1481.6317,-142.72807 1483.9398,-142.91692 z M 1493.1807,-138.80986 C 1493.1999,-138.8121 1493.2115,-138.80779 1493.2308,-138.80986 C 1493.233,-138.80996 1493.2538,-138.80989 1493.2558,-138.80986 C 1493.2579,-138.80983 1493.2787,-138.80978 1493.2809,-138.80986 C 1493.2859,-138.80978 1493.3034,-138.80977 1493.3059,-138.80986 C 1493.3269,-138.80972 1493.36,-138.81017 1493.3811,-138.80986 C 1493.3836,-138.80993 1493.4011,-138.80993 1493.4061,-138.80986 C 1493.5992,-138.82571 1493.7831,-138.80986 1493.9821,-138.80986 C 1496.8123,-138.80986 1499.1159,-137.18342 1499.1159,-135.15358 C 1499.1159,-133.12374 1496.8123,-131.47225 1493.9821,-131.47225 C 1491.1519,-131.47225 1488.8483,-133.12374 1488.8483,-135.15358 C 1488.8483,-136.9823 1490.7407,-138.52634 1493.1807,-138.80986 z"
++ id="path8084"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ sodipodi:type="arc"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9692);stroke-width:1.05932879;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path8086"
++ sodipodi:cx="22.185474"
++ sodipodi:cy="19.008621"
++ sodipodi:rx="18.473166"
++ sodipodi:ry="13.435029"
++ d="M 40.65864,19.008621 A 18.473166,13.435029 0 1 1 3.7123089,19.008621 A 18.473166,13.435029 0 1 1 40.65864,19.008621 z"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ transform="matrix(0.7617356,0,0,0.7512912,1475.4861,-154.40517)" />
++ <path
++ style="fill:url(#linearGradient9694);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 1511.8879,-129.42361 L 1511.0211,-124.57528 C 1508.9303,-125.27684 1507.6697,-125.83197 1505.3544,-126.38388 L 1505.6204,-130.32076 C 1507.1418,-130.48208 1509.5177,-130.20718 1511.8879,-129.42361 z"
++ id="path8088"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ sodipodi:nodetypes="ccccc" />
++ <path
++ style="opacity:0.70329674;fill:url(#linearGradient9696);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 1511.8879,-129.56898 L 1511.7376,-128.86778 C 1505.2425,-131.29506 1499.2633,-129.04946 1493.0054,-128.86778 C 1501.5089,-129.57506 1504.297,-131.84542 1511.8879,-129.56898 z"
++ id="path8090"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ sodipodi:nodetypes="cccc" />
++ </g>
++ </g>
++ <text
++ xml:space="preserve"
++ style="font-size:10px;font-style:italic;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
++ x="719.18652"
++ y="432.28882"
++ id="text9661"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ sodipodi:role="line"
++ id="tspan9663"
++ x="719.18652"
++ y="432.28882"
++ style="font-size:14px;font-weight:normal;-inkscape-font-specification:Bitstream Vera Sans">Gstreamer "hello world" pipeline diagram</tspan></text>
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.58331978;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect9698"
++ width="584.3609"
++ height="145.29628"
++ x="165.11099"
++ y="-677.41626"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <g
++ id="g10276"
++ transform="translate(-243.07076,1.8484469)">
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9710"
++ width="153.2551"
++ height="99.162369"
++ x="-279.2139"
++ y="-603.7594"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="-270.83246"
++ y="-584.65027"
++ id="text9712"><tspan
++ style="font-size:14px;font-weight:bold;fill:#ffffff;fill-opacity:1;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ sodipodi:role="line"
++ id="tspan9714"
++ x="-270.83246"
++ y="-584.65027">file-source</tspan></text>
++ <rect
++ transform="matrix(0,1,-1,0,0,0)"
++ ry="2.9648066"
++ rx="2.9648066"
++ y="127.92242"
++ x="-601.74207"
++ height="149.21901"
++ width="95.13578"
++ id="rect9754"
++ style="opacity:0.64876033;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient9804);stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1" />
++ </g>
++ <g
++ id="g12322"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"
++ transform="matrix(1.0922594,0,0,1.0922594,-60.796755,-214.22628)">
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path9974"
++ d="M 898.12621,-471.2939 C 897.89934,-475.93582 899.91669,-486.74453 904.5586,-485.72567 C 906.53722,-485.29096 905.99722,-482.56382 905.35059,-479.61253 C 904.47981,-475.63899 902.97326,-471.30069 902.97326,-471.30069 C 902.97326,-471.30069 908.63403,-471.07451 908.52059,-471.30069 C 909.08639,-478.43269 910.5848,-486.19503 914.74716,-485.61291 C 918.19837,-485.13066 913.76838,-471.30069 913.76838,-471.30069 C 913.76838,-471.30069 918.0272,-471.30069 918.92175,-471.30069 C 918.73701,-473.64611 920.00175,-479.10854 920.71155,-483.05898 C 921.42135,-487.00943 919.90937,-488.73741 916.73121,-488.76798 C 913.55307,-488.79854 910.4048,-486.02114 910.4048,-486.02114 C 910.52842,-488.39712 907.39645,-488.77206 907.39645,-488.77206 C 904.04781,-488.98465 900.83841,-486.73095 900.83841,-486.73095 L 901.13591,-488.47658 L 896.09258,-488.47658 C 896.09258,-488.47658 895.84465,-485.69986 894.82443,-480.63207 C 893.80422,-475.56427 892.44032,-471.30069 892.44032,-471.30069 L 898.12621,-471.2939 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path9976"
++ d="M 932.65662,-488.90315 C 925.75082,-488.90315 922.67183,-484.02757 922.67183,-479.04673 C 922.67183,-474.06588 925.61429,-470.78244 931.61467,-470.78244 C 934.43351,-470.78244 936.02972,-473.38663 936.02972,-473.38663 C 936.02972,-473.38663 936.12074,-474.09916 935.58822,-473.80233 C 935.05569,-473.50551 933.60484,-472.88401 931.70977,-472.88401 C 929.81469,-472.88401 927.76611,-474.68669 927.76611,-479.15947 C 927.76611,-479.15947 938.74667,-479.15947 938.63391,-479.15947 C 939.19972,-480.97101 939.56244,-488.90315 932.65662,-488.90315 z M 933.66394,-481.17546 L 928.39305,-481.17546 C 928.39305,-484.81753 931.30698,-487.56845 933.29104,-486.5917 C 935.0978,-485.75284 933.66394,-481.17546 933.66394,-481.17546 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path9978"
++ d="M 867.78941,-488.90315 C 860.88361,-488.90315 857.80462,-484.02757 857.80462,-479.04673 C 857.80462,-474.06588 860.74708,-470.78244 866.74746,-470.78244 C 869.5663,-470.78244 871.16251,-473.38663 871.16251,-473.38663 C 871.16251,-473.38663 871.25353,-474.09916 870.72101,-473.80233 C 870.18848,-473.50551 868.73763,-472.88401 866.84256,-472.88401 C 864.94748,-472.88401 862.8989,-474.68669 862.8989,-479.15947 C 862.8989,-479.15947 873.87946,-479.15947 873.7667,-479.15947 C 874.33251,-480.97101 874.69523,-488.90315 867.78941,-488.90315 z M 868.79673,-481.17546 L 863.52584,-481.17546 C 863.52584,-484.81753 865.98536,-487.17721 867.96941,-486.19978 C 869.77618,-485.3616 868.79673,-481.17546 868.79673,-481.17546 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path9980"
++ d="M 945.11181,-471.0195 L 939.54342,-471.0195 C 939.54342,-471.0195 942.79425,-482.69695 943.07749,-488.42224 C 943.02859,-488.37334 947.90688,-488.42224 947.90688,-488.42224 C 947.90688,-488.42224 947.48778,-487.13169 947.30574,-486.00484 C 948.68528,-487.53244 949.1526,-488.90655 952.89723,-488.90655 C 952.94613,-488.90655 952.89723,-484.07784 952.89723,-484.07784 C 952.89723,-484.07784 949.39916,-484.94386 948.14257,-483.68796 C 946.88597,-482.43205 945.53905,-481.42406 945.11181,-471.0195 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path9982"
++ d="M 848.99966,-471.0195 L 843.43127,-471.0195 C 843.43127,-471.0195 846.6821,-482.69695 846.96535,-488.42224 C 846.91644,-488.37334 851.79472,-488.42224 851.79472,-488.42224 C 851.79472,-488.42224 851.37563,-487.13169 851.1936,-486.00484 C 852.57313,-487.53244 853.04044,-488.90655 856.78508,-488.90655 C 856.83399,-488.90655 856.78508,-484.07784 856.78508,-484.07784 C 856.78508,-484.07784 853.28701,-484.94386 852.03041,-483.68796 C 850.77383,-482.43205 849.4269,-481.42406 848.99966,-471.0195 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path9984"
++ d="M 842.20864,-494.42263 L 837.65435,-492.84341 L 836.60764,-488.60224 L 833.70526,-488.60224 L 833.70526,-485.81397 L 835.99701,-485.81397 C 835.99701,-485.81397 833.55311,-477.06878 834.01092,-474.39462 C 834.4694,-471.49224 837.29571,-470.88161 838.97614,-470.95769 C 840.65658,-471.03376 841.11507,-472.25571 841.03831,-472.71419 C 840.96156,-473.17267 838.66981,-472.27677 838.44091,-474.33961 C 838.28807,-475.56156 840.35092,-485.81397 840.35092,-485.81397 L 843.9407,-485.81397 L 843.9407,-488.60224 L 841.11439,-488.60224 L 842.20864,-494.42263 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path9986"
++ d="M 889.67174,-471.28915 C 890.3469,-471.8468 889.89589,-472.96212 889.31174,-473.0966 C 888.65288,-474.46255 890.68584,-482.44495 890.68584,-484.63006 C 890.68584,-486.81517 887.01999,-491.19897 879.45804,-487.07463 C 878.72514,-486.60868 878.9948,-485.84658 879.17548,-485.59186 C 879.35615,-485.33715 879.69577,-485.16734 879.85471,-485.33715 C 880.56588,-486.11216 883.65981,-486.92181 885.10998,-485.3942 C 886.10303,-484.47724 886.0582,-482.70578 885.37013,-482.01839 C 884.53059,-481.94231 876.25,-482.18549 875.25695,-476.91528 C 873.54391,-467.55742 884.03271,-472.48529 884.57542,-472.86702 C 885.11812,-473.24875 885.05496,-471.76258 885.93593,-471.13632 C 888.32753,-470.92779 889.20035,-470.89994 889.67174,-471.28915 z M 884.43617,-475.19884 C 883.58713,-472.96279 880.43479,-473.30445 880.248,-474.88708 C 879.56876,-480.17969 885.03051,-479.7837 885.03051,-479.7837 C 885.03051,-479.7837 885.28522,-477.4349 884.43617,-475.19884 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path9988"
++ d="M 829.33368,-483.44682 L 830.91767,-486.12235 C 830.91767,-486.12235 829.62711,-488.86986 825.81591,-488.86986 C 822.00471,-488.86986 819.80602,-486.12167 819.80602,-482.85997 C 819.80602,-479.59826 827.06164,-477.14283 825.30309,-473.91848 C 822.3715,-470.91353 819.27689,-475.81491 819.33802,-476.13688 C 819.11659,-475.81763 817.59917,-473.72626 817.67253,-473.72626 C 818.03932,-472.99336 819.37062,-470.66968 823.61722,-470.62078 C 827.13499,-470.58003 829.26101,-473.18559 829.33437,-476.40993 C 829.40773,-480.73395 823.10439,-482.93332 823.03104,-484.91195 C 822.95768,-486.89057 827.20903,-489.16397 829.33368,-483.44682 z" />
++ <path
++ id="path9990"
++ d="M 821.0266,-489.81537 C 820.34737,-490.45249 819.83794,-489.60276 818.30965,-488.96632 C 816.78137,-488.32986 816.27194,-488.4141 814.74365,-488.6267 C 812.23863,-489.17891 807.83581,-489.01386 806.67771,-488.45689 C 798.9439,-485.35141 803.09065,-479.60574 804.35335,-478.45918 C 804.34249,-478.45918 802.46983,-477.47225 802.1961,-475.92223 C 801.84425,-473.93002 802.76054,-472.85208 802.78907,-472.82422 C 800.26231,-472.69313 798.63757,-470.1521 799.02881,-468.0716 C 799.44994,-465.8308 802.12137,-464.04304 805.94616,-464.0281 C 814.03181,-463.85218 814.45091,-469.02253 814.45091,-469.02253 C 815.55738,-475.31091 810.22469,-475.60096 806.42435,-475.30548 C 805.04889,-476.53422 806.12209,-477.6801 806.06368,-477.6801 C 818.90399,-477.37716 815.67149,-485.94099 815.67149,-485.94099 C 817.83962,-486.46876 822.08757,-488.7965 821.0266,-489.81537 z M 803.82831,-471.79994 C 808.85806,-470.89247 810.88219,-472.04582 811.22656,-469.4817 C 811.37532,-466.97939 809.25133,-466.26415 806.78095,-466.11064 C 804.31056,-465.95713 802.51058,-467.20557 802.41142,-468.81061 C 802.31292,-470.41565 803.71487,-470.24991 803.82831,-471.79994 z M 811.59811,-482.73839 C 811.13351,-480.68165 809.70846,-479.24982 808.41452,-479.54189 C 807.12057,-479.83464 806.4488,-481.73854 806.91272,-483.79596 C 807.37733,-485.85337 808.80236,-487.2852 810.09631,-486.99313 C 811.39026,-486.70038 812.0627,-484.7958 811.59811,-482.73839 z"
++ style="font-size:14px;fill:#2e3436" />
++ <path
++ style="font-size:14px;fill:#cc0000"
++ id="path9992"
++ d="M 794.60358,-507.62294 C 790.92958,-507.62294 785.55409,-510.61634 780.31513,-510.61634 C 775.07616,-510.61634 771.94691,-507.62294 771.40216,-507.21472 C 770.8581,-506.8065 770.51711,-505.24221 772.15069,-505.71836 C 773.78425,-506.19451 775.14409,-506.19451 777.72994,-506.19451 C 780.3158,-506.19451 786.50706,-502.65636 792.76692,-502.65636 C 799.02677,-502.65636 804.26505,-507.48641 805.42179,-509.1879 C 806.57854,-510.88939 805.48972,-511.43347 804.60535,-511.02456 C 803.7203,-510.61634 798.00588,-507.62294 794.60358,-507.62294 z" />
++ <path
++ style="font-size:14px;fill:#73d216"
++ id="path9994"
++ d="M 810.56431,-498.30244 C 806.7042,-498.30244 801.05701,-501.29516 795.55315,-501.29516 C 790.04929,-501.29516 786.7611,-498.30244 786.18918,-497.89354 C 785.61726,-497.48464 785.2593,-495.92103 786.97506,-496.39718 C 788.69081,-496.87332 790.11992,-496.87332 792.8362,-496.87332 C 795.55247,-496.87332 802.05754,-493.33517 808.63323,-493.33517 C 815.20893,-493.33517 820.71347,-498.16524 821.92863,-499.86605 C 823.14379,-501.56754 821.99996,-502.11228 821.07076,-501.70338 C 820.14156,-501.29449 814.13845,-498.30244 810.56431,-498.30244 z" />
++ <path
++ style="font-size:14px;fill:#204a87"
++ id="path9996"
++ d="M 788.35119,-488.01742 C 784.34844,-488.01742 778.49206,-491.25127 772.78442,-491.25127 C 767.07678,-491.25127 763.66633,-488.01742 763.07335,-487.57659 C 762.48037,-487.13577 762.10951,-485.44583 763.88844,-485.96069 C 765.66804,-486.47487 767.15013,-486.47487 769.96694,-486.47487 C 772.78374,-486.47487 779.52993,-482.65348 786.35015,-482.65348 C 793.16971,-482.65348 798.87734,-487.87071 800.13801,-489.70804 C 801.39867,-491.54538 800.21204,-492.13292 799.24821,-491.6921 C 798.28436,-491.25127 792.05779,-488.01742 788.35119,-488.01742 z" />
++ </g>
++ <text
++ xml:space="preserve"
++ style="font-size:18px;font-style:normal;font-weight:bold;opacity:0.6;fill:#f57900;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="502.08981"
++ y="-791.21509"
++ id="text9998"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="502.08981"
++ y="-791.21509"
++ id="tspan10058">Multimedia applications</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
++ x="215.66447"
++ y="-740.84125"
++ id="text10006"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan10008"
++ x="215.66447"
++ y="-740.84125">media player</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
++ x="335.5127"
++ y="-748.84125"
++ id="text10010"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="337.74121"
++ y="-748.84125"
++ id="tspan12570">VoIP & video </tspan><tspan
++ sodipodi:role="line"
++ x="337.74121"
++ y="-731.34125"
++ id="tspan12572">conferencing </tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
++ x="455.39166"
++ y="-748.23431"
++ id="text10014"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="455.39166"
++ y="-748.23431"
++ id="tspan10124">streaming</tspan><tspan
++ sodipodi:role="line"
++ x="455.39166"
++ y="-730.73431"
++ id="tspan10292">server</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
++ x="574.35461"
++ y="-739.48431"
++ id="text10022"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan10024"
++ x="574.35461"
++ y="-739.48431">video editor</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:18px;font-style:normal;font-weight:bold;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="170.62811"
++ y="-627.43823"
++ id="text10034"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan10036"
++ x="170.62811"
++ y="-627.43823"
++ style="font-size:14">pipeline architecture</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="792.44446"
++ y="-654.41718"
++ id="text10054"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan10056"
++ x="792.44446"
++ y="-654.41718"
++ style="font-size:18px">gstreamer tools</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:18px;font-style:normal;font-weight:bold;text-align:end;text-anchor:end;opacity:0.6;fill:#f57900;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="933.3949"
++ y="-390.03003"
++ id="text10060"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="933.3949"
++ y="-390.03003"
++ id="tspan10172">3rd party plugins</tspan></text>
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 216.29339,-687.06015 L 216.29339,-678.17218"
++ id="path10066"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="path10064"
++ sodipodi:cx="234.08273"
++ sodipodi:cy="-724.04565"
++ sodipodi:rx="5.8746634"
++ sodipodi:ry="5.8746634"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ transform="translate(-17.789353,29.355293)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="opacity:0.6;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 216.29307,-714.71262 L 216.29307,-705.67218"
++ id="path10068"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.6;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="path10070"
++ sodipodi:cx="222.71907"
++ sodipodi:cy="-724.11804"
++ sodipodi:rx="9.2349148"
++ sodipodi:ry="9.2349148"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ transform="translate(-6.4256897,29.427681)"
++ sodipodi:start="3.1415927"
++ sodipodi:end="6.2831853"
++ sodipodi:open="true"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:bold;text-align:center;text-anchor:middle;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="693.98065"
++ y="-740.31488"
++ id="text10120"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan10122"
++ x="693.98065"
++ y="-740.31488">(...)</tspan></text>
++ <g
++ id="g10128"
++ transform="matrix(1,0,0,-1,-13.78846,-1226.2938)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003">
++ <path
++ transform="translate(-7.529188,12.389655)"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ sodipodi:ry="5.8746634"
++ sodipodi:rx="5.8746634"
++ sodipodi:cy="-724.04565"
++ sodipodi:cx="234.08273"
++ id="path10130"
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path10132"
++ d="M 226.55355,-704.02579 L 226.55355,-695.13782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path10134"
++ d="M 226.55323,-731.67826 L 226.55323,-722.63782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:open="true"
++ sodipodi:end="6.2831853"
++ sodipodi:start="3.1415927"
++ transform="translate(3.8344747,12.462043)"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ sodipodi:ry="9.2349148"
++ sodipodi:rx="9.2349148"
++ sodipodi:cy="-724.11804"
++ sodipodi:cx="222.71907"
++ id="path10136"
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ </g>
++ <g
++ id="g10140"
++ transform="matrix(1,0,0,-1,78.731729,-1226.0597)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003">
++ <path
++ transform="translate(-7.529188,12.389655)"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ sodipodi:ry="5.8746634"
++ sodipodi:rx="5.8746634"
++ sodipodi:cy="-724.04565"
++ sodipodi:cx="234.08273"
++ id="path10142"
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path10144"
++ d="M 226.55355,-704.02579 L 226.55355,-695.13782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path10146"
++ d="M 226.55323,-731.67826 L 226.55323,-722.63782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:open="true"
++ sodipodi:end="6.2831853"
++ sodipodi:start="3.1415927"
++ transform="translate(3.8344747,12.462043)"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ sodipodi:ry="9.2349148"
++ sodipodi:rx="9.2349148"
++ sodipodi:cy="-724.11804"
++ sodipodi:cx="222.71907"
++ id="path10148"
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ </g>
++ <g
++ id="g10150"
++ transform="matrix(1,0,0,-1,178.17356,-1226.0597)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003">
++ <path
++ transform="translate(-7.529188,12.389655)"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ sodipodi:ry="5.8746634"
++ sodipodi:rx="5.8746634"
++ sodipodi:cy="-724.04565"
++ sodipodi:cx="234.08273"
++ id="path10152"
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path10154"
++ d="M 226.55355,-704.02579 L 226.55355,-695.13782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path10156"
++ d="M 226.55323,-731.67826 L 226.55323,-722.63782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:open="true"
++ sodipodi:end="6.2831853"
++ sodipodi:start="3.1415927"
++ transform="translate(3.8344747,12.462043)"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ sodipodi:ry="9.2349148"
++ sodipodi:rx="9.2349148"
++ sodipodi:cy="-724.11804"
++ sodipodi:cx="222.71907"
++ id="path10158"
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ </g>
++ <g
++ id="g10160"
++ transform="matrix(1,0,0,-1,271.32726,-1226.0597)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003">
++ <path
++ transform="translate(-7.529188,12.389655)"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ sodipodi:ry="5.8746634"
++ sodipodi:rx="5.8746634"
++ sodipodi:cy="-724.04565"
++ sodipodi:cx="234.08273"
++ id="path10162"
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path10164"
++ d="M 226.55355,-704.02579 L 226.55355,-695.13782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path10166"
++ d="M 226.55323,-731.67826 L 226.55323,-722.63782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:open="true"
++ sodipodi:end="6.2831853"
++ sodipodi:start="3.1415927"
++ transform="translate(3.8344747,12.462043)"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ sodipodi:ry="9.2349148"
++ sodipodi:rx="9.2349148"
++ sodipodi:cy="-724.11804"
++ sodipodi:cx="222.71907"
++ id="path10168"
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ </g>
++ <path
++ sodipodi:type="arc"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="path10210"
++ sodipodi:cx="234.08273"
++ sodipodi:cy="-724.04565"
++ sodipodi:rx="5.8746634"
++ sodipodi:ry="5.8746634"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ transform="translate(101.6316,29.355296)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 335.71434,-687.06015 L 335.71434,-678.17218"
++ id="path10212"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="opacity:0.6;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 335.71402,-714.71262 L 335.71402,-705.67218"
++ id="path10214"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.6;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="path10216"
++ sodipodi:cx="222.71907"
++ sodipodi:cy="-724.11804"
++ sodipodi:rx="9.2349148"
++ sodipodi:ry="9.2349148"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ transform="translate(112.99527,29.427684)"
++ sodipodi:start="3.1415927"
++ sodipodi:end="6.2831853"
++ sodipodi:open="true"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="path10220"
++ sodipodi:cx="234.08273"
++ sodipodi:cy="-724.04565"
++ sodipodi:rx="5.8746634"
++ sodipodi:ry="5.8746634"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ transform="translate(221.05256,29.355296)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 455.1353,-687.06015 L 455.1353,-678.17218"
++ id="path10222"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="opacity:0.6;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 455.13498,-714.71262 L 455.13498,-705.67218"
++ id="path10224"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.6;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="path10226"
++ sodipodi:cx="222.71907"
++ sodipodi:cy="-724.11804"
++ sodipodi:rx="9.2349148"
++ sodipodi:ry="9.2349148"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ transform="translate(232.41622,29.427684)"
++ sodipodi:start="3.1415927"
++ sodipodi:end="6.2831853"
++ sodipodi:open="true"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="path10230"
++ sodipodi:cx="234.08273"
++ sodipodi:cy="-724.04565"
++ sodipodi:rx="5.8746634"
++ sodipodi:ry="5.8746634"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ transform="translate(340.47352,28.551936)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 574.55626,-687.86351 L 574.55626,-678.97554"
++ id="path10232"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="opacity:0.6;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 574.55594,-715.51598 L 574.55594,-706.47554"
++ id="path10234"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.6;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="path10236"
++ sodipodi:cx="222.71907"
++ sodipodi:cy="-724.11804"
++ sodipodi:rx="9.2349148"
++ sodipodi:ry="9.2349148"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ transform="translate(351.83719,28.624324)"
++ sodipodi:start="3.1415927"
++ sodipodi:end="6.2831853"
++ sodipodi:open="true"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="path10240"
++ sodipodi:cx="234.08273"
++ sodipodi:cy="-724.04565"
++ sodipodi:rx="5.8746634"
++ sodipodi:ry="5.8746634"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ transform="translate(459.89449,28.551936)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 693.97722,-687.86351 L 693.97722,-678.97554"
++ id="path10242"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="opacity:0.6;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 693.9769,-715.51598 L 693.9769,-706.47554"
++ id="path10244"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.6;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="path10246"
++ sodipodi:cx="222.71907"
++ sodipodi:cy="-724.11804"
++ sodipodi:rx="9.2349148"
++ sodipodi:ry="9.2349148"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ transform="translate(471.25815,28.624324)"
++ sodipodi:start="3.1415927"
++ sodipodi:end="6.2831853"
++ sodipodi:open="true"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="793.2309"
++ y="-629.50519"
++ id="text10282"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan10284"
++ x="793.2309"
++ y="-629.50519">gst-inspect</tspan><tspan
++ sodipodi:role="line"
++ x="793.2309"
++ y="-612.00519"
++ id="tspan10286">gst-launch</tspan><tspan
++ sodipodi:role="line"
++ x="793.2309"
++ y="-594.50519"
++ id="tspan10288">gst-editor</tspan><tspan
++ sodipodi:role="line"
++ x="793.2309"
++ y="-577.00519"
++ id="tspan12116">...</tspan></text>
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.83576286;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect10308"
++ width="78.164238"
++ height="78.164238"
++ x="265.91788"
++ y="-493.71994"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.83576286;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect10310"
++ width="78.164238"
++ height="78.164238"
++ x="365.91788"
++ y="-493.71994"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.83576286;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect10312"
++ width="78.164238"
++ height="78.164238"
++ x="457.91788"
++ y="-492.71994"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <flowRoot
++ xml:space="preserve"
++ id="flowRoot10316"
++ style="fill:black;fill-opacity:1;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;font-family:Bitstream Vera Sans;font-style:normal;font-weight:normal;font-size:14"><flowRegion
++ id="flowRegion10318"><rect
++ id="rect10320"
++ width="598.89526"
++ height="138.11003"
++ x="128.06566"
++ y="-862.34497" /></flowRegion><flowPara
++ id="flowPara10322" /></flowRoot> <g
++ id="g12033"
++ transform="matrix(0.2661835,0,0,0.2661835,-49.85864,-345.77017)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003">
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11925"
++ xlink:href="#rect4673"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11927"
++ xlink:href="#rect3530"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11929"
++ xlink:href="#text3532"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11931"
++ xlink:href="#rect3538"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11933"
++ xlink:href="#text3540"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11935"
++ xlink:href="#rect3544"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11937"
++ xlink:href="#text3546"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11939"
++ xlink:href="#rect3552"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11941"
++ xlink:href="#text3554"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11943"
++ xlink:href="#rect3560"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11945"
++ xlink:href="#text3562"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11947"
++ xlink:href="#rect3566"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11949"
++ xlink:href="#text3568"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11951"
++ xlink:href="#rect3574"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11953"
++ xlink:href="#text3576"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11955"
++ xlink:href="#rect3582"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11957"
++ xlink:href="#text3584"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11959"
++ xlink:href="#rect3610"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11961"
++ xlink:href="#text3612"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11963"
++ xlink:href="#rect3618"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11965"
++ xlink:href="#text3620"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11967"
++ xlink:href="#path3624"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11969"
++ xlink:href="#text3626"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11971"
++ xlink:href="#path3632"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11973"
++ xlink:href="#path3634"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11975"
++ xlink:href="#g7012"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11977"
++ xlink:href="#g7032"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11979"
++ xlink:href="#rect3848"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11981"
++ xlink:href="#text3850"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11983"
++ xlink:href="#path3854"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11985"
++ xlink:href="#rect3856"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11987"
++ xlink:href="#text3858"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11989"
++ xlink:href="#rect3864"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11991"
++ xlink:href="#text3866"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11993"
++ xlink:href="#rect3872"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11995"
++ xlink:href="#text3874"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11997"
++ xlink:href="#rect3878"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use11999"
++ xlink:href="#text3880"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use12001"
++ xlink:href="#rect3886"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use12003"
++ xlink:href="#text3888"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use12005"
++ xlink:href="#g7053"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use12007"
++ xlink:href="#g7042"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use12009"
++ xlink:href="#g7082"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use12011"
++ xlink:href="#g4318"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use12013"
++ xlink:href="#g2837"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use12015"
++ xlink:href="#use2844"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use12017"
++ xlink:href="#path4663"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use12019"
++ xlink:href="#path4665"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use12021"
++ xlink:href="#path4667"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use12023"
++ xlink:href="#path4669"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use12025"
++ xlink:href="#path4671"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use12027"
++ xlink:href="#g6482"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use12031"
++ xlink:href="#path7621"
++ y="0"
++ x="0" />
++ </g>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="170.63666"
++ y="-656.06134"
++ id="text12191"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan12193"
++ x="170.63666"
++ y="-656.06134"
++ style="font-size:18px">gstreamer core framework</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="176.68259"
++ y="-464.5477"
++ id="text12199"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="176.68259"
++ y="-464.5477"
++ id="tspan12219"
++ style="font-size:12px">- file:</tspan><tspan
++ sodipodi:role="line"
++ x="176.68259"
++ y="-449.5477"
++ id="tspan12249"
++ style="font-size:12px">- http:</tspan><tspan
++ sodipodi:role="line"
++ x="176.68259"
++ y="-434.5477"
++ id="tspan12223"
++ style="font-size:12px">- rtsp:</tspan><tspan
++ sodipodi:role="line"
++ x="176.68259"
++ y="-419.5477"
++ style="font-size:12px"
++ id="tspan4611">- ...</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="272.05746"
++ y="-464.5477"
++ id="text12205"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="272.05746"
++ y="-464.5477"
++ id="tspan12209"
++ style="font-size:12px">- alsa</tspan><tspan
++ sodipodi:role="line"
++ x="272.05746"
++ y="-449.5477"
++ id="tspan12243"
++ style="font-size:12px">- v4l2</tspan><tspan
++ sodipodi:role="line"
++ x="272.05746"
++ y="-434.5477"
++ style="font-size:12px"
++ id="tspan4613">- ...</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
++ x="179.66054"
++ y="-477.5694"
++ id="text12231"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan12233"
++ x="179.66054"
++ y="-477.5694">protocols</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
++ x="278.33115"
++ y="-477.5694"
++ id="text12245"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan12247"
++ x="278.33115"
++ y="-477.5694">sources</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="377.89603"
++ y="-477.5694"
++ id="text12255"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="377.89603"
++ y="-477.5694"
++ id="tspan12259">formats</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
++ x="473.44916"
++ y="-477.5694"
++ id="text12261"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan12263"
++ x="473.44916"
++ y="-477.5694">codecs</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="571.01495"
++ y="-477.5694"
++ id="text12275"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan12277"
++ x="571.01495"
++ y="-477.5694">filters</tspan></text>
++ <g
++ id="g12336"
++ transform="matrix(0,-1,-1,0,54.265564,-413.86986)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003">
++ <path
++ transform="translate(-7.529188,12.389655)"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ sodipodi:ry="5.8746634"
++ sodipodi:rx="5.8746634"
++ sodipodi:cy="-724.04565"
++ sodipodi:cx="234.08273"
++ id="path12338"
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path12340"
++ d="M 226.55355,-704.02579 L 226.55355,-695.13782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path12342"
++ d="M 226.55323,-731.67826 L 226.55323,-722.63782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:open="true"
++ sodipodi:end="6.2831853"
++ sodipodi:start="3.1415927"
++ transform="translate(3.8344747,12.462043)"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ sodipodi:ry="9.2349148"
++ sodipodi:rx="9.2349148"
++ sodipodi:cy="-724.11804"
++ sodipodi:cx="222.71907"
++ id="path12344"
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ </g>
++ <g
++ id="g12348"
++ transform="matrix(0,-1,-1,0,54.265564,-379.88653)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003">
++ <path
++ transform="translate(-7.529188,12.389655)"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ sodipodi:ry="5.8746634"
++ sodipodi:rx="5.8746634"
++ sodipodi:cy="-724.04565"
++ sodipodi:cx="234.08273"
++ id="path12350"
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path12352"
++ d="M 226.55355,-704.02579 L 226.55355,-695.13782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path12354"
++ d="M 226.55323,-731.67826 L 226.55323,-722.63782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:open="true"
++ sodipodi:end="6.2831853"
++ sodipodi:start="3.1415927"
++ transform="translate(3.8344747,12.462043)"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ sodipodi:ry="9.2349148"
++ sodipodi:rx="9.2349148"
++ sodipodi:cy="-724.11804"
++ sodipodi:cx="222.71907"
++ id="path12356"
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ </g>
++ <g
++ id="g12358"
++ transform="matrix(0,-1,-1,0,54.265564,-345.90325)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003">
++ <path
++ transform="translate(-7.529188,12.389655)"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ sodipodi:ry="5.8746634"
++ sodipodi:rx="5.8746634"
++ sodipodi:cy="-724.04565"
++ sodipodi:cx="234.08273"
++ id="path12360"
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path12362"
++ d="M 226.55355,-704.02579 L 226.55355,-695.13782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path12364"
++ d="M 226.55323,-731.67826 L 226.55323,-722.63782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:open="true"
++ sodipodi:end="6.2831853"
++ sodipodi:start="3.1415927"
++ transform="translate(3.8344747,12.462043)"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ sodipodi:ry="9.2349148"
++ sodipodi:rx="9.2349148"
++ sodipodi:cy="-724.11804"
++ sodipodi:cx="222.71907"
++ id="path12366"
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ </g>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:justify;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="572.29089"
++ y="-652.47449"
++ id="text12580"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan12582"
++ x="572.29089"
++ y="-652.47449"
++ style="text-align:start;text-anchor:start">media agnostic</tspan><tspan
++ sodipodi:role="line"
++ x="572.29089"
++ y="-634.97449"
++ id="tspan5501"
++ style="text-align:start;text-anchor:start">base classes</tspan><tspan
++ sodipodi:role="line"
++ x="572.29089"
++ y="-617.47449"
++ id="tspan5675"
++ style="text-align:start;text-anchor:start">message bus</tspan><tspan
++ sodipodi:role="line"
++ x="572.29089"
++ y="-599.97449"
++ id="tspan4595"
++ style="text-align:start;text-anchor:start">media type negotiation</tspan><tspan
++ sodipodi:role="line"
++ x="572.29089"
++ y="-582.47449"
++ id="tspan4597"
++ style="text-align:start;text-anchor:start">plugin system</tspan><tspan
++ sodipodi:role="line"
++ x="572.29089"
++ y="-564.97449"
++ style="text-align:start;text-anchor:start"
++ id="tspan5685">utility libraries</tspan><tspan
++ sodipodi:role="line"
++ x="572.29089"
++ y="-547.47449"
++ id="tspan4601"
++ style="text-align:start;text-anchor:start">language bindings</tspan></text>
++ <g
++ id="g5667"
++ transform="translate(7,0)">
++ <text
++ inkscape:export-ydpi="91.230003"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ id="text10038"
++ y="-473.46512"
++ x="937.65387"
++ style="font-size:18px;font-style:normal;font-weight:bold;text-align:end;text-anchor:end;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"><tspan
++ id="tspan10170"
++ y="-473.46512"
++ x="937.65387"
++ sodipodi:role="line">gstreamer plugins</tspan></text>
++ <text
++ inkscape:export-ydpi="91.230003"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ id="text4102"
++ y="-454.21878"
++ x="751.36243"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"><tspan
++ id="tspan4108"
++ y="-454.21878"
++ x="751.36243"
++ sodipodi:role="line">gstreamer includes over 150 plugins</tspan></text>
++ </g>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="667.54492"
++ y="-477.5694"
++ id="text4607"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan4609"
++ x="667.54492"
++ y="-477.5694">sinks</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="367.60016"
++ y="-464.5477"
++ id="text4615"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="367.60016"
++ y="-464.5477"
++ style="font-size:12px"
++ id="tspan4621">- avi</tspan><tspan
++ sodipodi:role="line"
++ x="367.60016"
++ y="-449.5477"
++ style="font-size:12px"
++ id="tspan4651">- mp4</tspan><tspan
++ sodipodi:role="line"
++ x="367.60016"
++ y="-434.5477"
++ style="font-size:12px"
++ id="tspan4653">- ogg</tspan><tspan
++ sodipodi:role="line"
++ x="367.60016"
++ y="-419.5477"
++ style="font-size:12px"
++ id="tspan4655">- ...</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="465.44891"
++ y="-464.57175"
++ id="text4623"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="465.44891"
++ y="-464.57175"
++ id="tspan4625"
++ style="font-size:12px">- mp3</tspan><tspan
++ sodipodi:role="line"
++ x="465.44891"
++ y="-449.57175"
++ id="tspan4627"
++ style="font-size:12px">- mpeg4</tspan><tspan
++ sodipodi:role="line"
++ x="465.44891"
++ y="-434.57175"
++ style="font-size:12px"
++ id="tspan4657">- vorbis</tspan><tspan
++ sodipodi:role="line"
++ x="465.44891"
++ y="-419.57175"
++ style="font-size:12px"
++ id="tspan4629">- ...</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="554.7406"
++ y="-464.5477"
++ id="text4631"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="554.7406"
++ y="-464.5477"
++ id="tspan4633"
++ style="font-size:12px">- converters</tspan><tspan
++ sodipodi:role="line"
++ x="554.7406"
++ y="-449.5477"
++ id="tspan4635"
++ style="font-size:12px">- mixers</tspan><tspan
++ sodipodi:role="line"
++ x="554.7406"
++ y="-434.5477"
++ style="font-size:12px"
++ id="tspan4659">- effetcs</tspan><tspan
++ sodipodi:role="line"
++ x="554.7406"
++ y="-419.5477"
++ style="font-size:12px"
++ id="tspan4637">- ...</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="651.1012"
++ y="-464.5477"
++ id="text4639"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="651.1012"
++ y="-464.5477"
++ id="tspan4641"
++ style="font-size:12px">- alsa</tspan><tspan
++ sodipodi:role="line"
++ x="651.1012"
++ y="-449.5477"
++ id="tspan4643"
++ style="font-size:12px">- xvideo</tspan><tspan
++ sodipodi:role="line"
++ x="651.1012"
++ y="-434.5477"
++ style="font-size:12px"
++ id="tspan4645">- ...</tspan></text>
++ <rect
++ style="opacity:0.6;fill:#fcaf3e;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2.12232995;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect4667"
++ width="77.87767"
++ height="37.87767"
++ x="173.06117"
++ y="-413.57666"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <g
++ id="g5473"
++ transform="matrix(1,0,0,-1,364.21039,-1225.3218)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003">
++ <path
++ transform="translate(-7.529188,12.389655)"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ sodipodi:ry="5.8746634"
++ sodipodi:rx="5.8746634"
++ sodipodi:cy="-724.04565"
++ sodipodi:cx="234.08273"
++ id="path5475"
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path5477"
++ d="M 226.55355,-704.02579 L 226.55355,-695.13782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path5479"
++ d="M 226.55323,-731.67826 L 226.55323,-722.63782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:open="true"
++ sodipodi:end="6.2831853"
++ sodipodi:start="3.1415927"
++ transform="translate(3.8344747,12.462043)"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ sodipodi:ry="9.2349148"
++ sodipodi:rx="9.2349148"
++ sodipodi:cy="-724.11804"
++ sodipodi:cx="222.71907"
++ id="path5481"
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ </g>
++ <rect
++ style="opacity:0.6;fill:#fcaf3e;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2.12232995;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect5657"
++ width="77.87767"
++ height="37.87767"
++ x="315"
++ y="-407.63782"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:0.6;fill:#fcaf3e;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2.12232995;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect5659"
++ width="77.87767"
++ height="37.87767"
++ x="458.06116"
++ y="-412.57666"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:0.6;fill:#fcaf3e;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2.12232995;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect5661"
++ width="77.87767"
++ height="37.87767"
++ x="551.06116"
++ y="-412.57666"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:0.6;fill:#fcaf3e;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2.12232995;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect5663"
++ width="77.87767"
++ height="37.87767"
++ x="646.06116"
++ y="-412.57666"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 354.12534,-522.26802 L 354.12534,-531.15599"
++ id="path5677"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="path5679"
++ sodipodi:cx="234.08273"
++ sodipodi:cy="-724.04565"
++ sodipodi:rx="5.8746634"
++ sodipodi:ry="5.8746634"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ transform="matrix(1,0,0,-1,120.0426,-1238.6835)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="opacity:0.6;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#f57900;stroke-width:1.78131342;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 354,-407.92529 L 354,-503.92529"
++ id="path5681"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.6;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="path5683"
++ sodipodi:cx="222.71907"
++ sodipodi:cy="-724.11804"
++ sodipodi:rx="9.2349148"
++ sodipodi:ry="9.2349148"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ transform="matrix(1,0,0,-1,131.40626,-1238.7559)"
++ sodipodi:start="3.1415927"
++ sodipodi:end="6.2831853"
++ sodipodi:open="true"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2.07903409;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect5687"
++ width="78.152527"
++ height="84.476593"
++ x="496.26672"
++ y="-1068.5056"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2.07903409;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect5689"
++ width="78.152527"
++ height="84.476593"
++ x="579.91064"
++ y="-1068.5056"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <g
++ id="g5691"
++ transform="matrix(1,0,0,-1,392.46241,-1802.0774)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003">
++ <path
++ transform="translate(-7.529188,12.389655)"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ sodipodi:ry="5.8746634"
++ sodipodi:rx="5.8746634"
++ sodipodi:cy="-724.04565"
++ sodipodi:cx="234.08273"
++ id="path5693"
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path5695"
++ d="M 226.55355,-704.02579 L 226.55355,-695.13782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path5697"
++ d="M 226.55323,-731.67826 L 226.55323,-722.63782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:open="true"
++ sodipodi:end="6.2831853"
++ sodipodi:start="3.1415927"
++ transform="translate(3.8344747,12.462043)"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ sodipodi:ry="9.2349148"
++ sodipodi:rx="9.2349148"
++ sodipodi:cy="-724.11804"
++ sodipodi:cx="222.71907"
++ id="path5699"
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ </g>
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2.07903409;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect5701"
++ width="78.152527"
++ height="84.476593"
++ x="161.69099"
++ y="-1069.5864"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069000000014;stroke-opacity:1"
++ id="rect5703"
++ width="97.885414"
++ height="59.05331"
++ x="162.17255"
++ y="-1350.6531"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:0.5;fill:#fcaf3e;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069000000014;stroke-opacity:1"
++ id="rect5705"
++ width="106.05405"
++ height="58.375156"
++ x="379.3735"
++ y="-1350.3138"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:0.5;fill:#fcaf3e;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069000000014;stroke-opacity:1"
++ id="rect5707"
++ width="89.809647"
++ height="58.532215"
++ x="492.2431"
++ y="-1350.3925"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:0.5;fill:#fcaf3e;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069000000014;stroke-opacity:1"
++ id="rect5709"
++ width="89.815567"
++ height="58.532154"
++ x="588.78973"
++ y="-1350.3923"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:0.5;fill:#fcaf3e;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069000000014;stroke-opacity:1"
++ id="rect5711"
++ width="56.332069"
++ height="58.923706"
++ x="685.14661"
++ y="-1350.5883"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:0.5;fill:#fcaf3e;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069000000014;stroke-opacity:1"
++ id="rect5713"
++ width="106.05405"
++ height="58.375156"
++ x="266.42538"
++ y="-1350.3138"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069000000014;stroke-opacity:1"
++ id="rect5715"
++ width="580.00708"
++ height="145.3037"
++ x="161.84093"
++ y="-1253.8427"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <g
++ id="g5717"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"
++ transform="matrix(0,-1.6161303,1.6161303,0,622.49018,231.45347)">
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path5719"
++ d="M 898.12621,-471.2939 C 897.89934,-475.93582 899.91669,-486.74453 904.5586,-485.72567 C 906.53722,-485.29096 905.99722,-482.56382 905.35059,-479.61253 C 904.47981,-475.63899 902.97326,-471.30069 902.97326,-471.30069 C 902.97326,-471.30069 908.63403,-471.07451 908.52059,-471.30069 C 909.08639,-478.43269 910.5848,-486.19503 914.74716,-485.61291 C 918.19837,-485.13066 913.76838,-471.30069 913.76838,-471.30069 C 913.76838,-471.30069 918.0272,-471.30069 918.92175,-471.30069 C 918.73701,-473.64611 920.00175,-479.10854 920.71155,-483.05898 C 921.42135,-487.00943 919.90937,-488.73741 916.73121,-488.76798 C 913.55307,-488.79854 910.4048,-486.02114 910.4048,-486.02114 C 910.52842,-488.39712 907.39645,-488.77206 907.39645,-488.77206 C 904.04781,-488.98465 900.83841,-486.73095 900.83841,-486.73095 L 901.13591,-488.47658 L 896.09258,-488.47658 C 896.09258,-488.47658 895.84465,-485.69986 894.82443,-480.63207 C 893.80422,-475.56427 892.44032,-471.30069 892.44032,-471.30069 L 898.12621,-471.2939 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path5721"
++ d="M 932.65662,-488.90315 C 925.75082,-488.90315 922.67183,-484.02757 922.67183,-479.04673 C 922.67183,-474.06588 925.61429,-470.78244 931.61467,-470.78244 C 934.43351,-470.78244 936.02972,-473.38663 936.02972,-473.38663 C 936.02972,-473.38663 936.12074,-474.09916 935.58822,-473.80233 C 935.05569,-473.50551 933.60484,-472.88401 931.70977,-472.88401 C 929.81469,-472.88401 927.76611,-474.68669 927.76611,-479.15947 C 927.76611,-479.15947 938.74667,-479.15947 938.63391,-479.15947 C 939.19972,-480.97101 939.56244,-488.90315 932.65662,-488.90315 z M 933.66394,-481.17546 L 928.39305,-481.17546 C 928.39305,-484.81753 931.30698,-487.56845 933.29104,-486.5917 C 935.0978,-485.75284 933.66394,-481.17546 933.66394,-481.17546 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path5723"
++ d="M 867.78941,-488.90315 C 860.88361,-488.90315 857.80462,-484.02757 857.80462,-479.04673 C 857.80462,-474.06588 860.74708,-470.78244 866.74746,-470.78244 C 869.5663,-470.78244 871.16251,-473.38663 871.16251,-473.38663 C 871.16251,-473.38663 871.25353,-474.09916 870.72101,-473.80233 C 870.18848,-473.50551 868.73763,-472.88401 866.84256,-472.88401 C 864.94748,-472.88401 862.8989,-474.68669 862.8989,-479.15947 C 862.8989,-479.15947 873.87946,-479.15947 873.7667,-479.15947 C 874.33251,-480.97101 874.69523,-488.90315 867.78941,-488.90315 z M 868.79673,-481.17546 L 863.52584,-481.17546 C 863.52584,-484.81753 865.98536,-487.17721 867.96941,-486.19978 C 869.77618,-485.3616 868.79673,-481.17546 868.79673,-481.17546 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path5725"
++ d="M 945.11181,-471.0195 L 939.54342,-471.0195 C 939.54342,-471.0195 942.79425,-482.69695 943.07749,-488.42224 C 943.02859,-488.37334 947.90688,-488.42224 947.90688,-488.42224 C 947.90688,-488.42224 947.48778,-487.13169 947.30574,-486.00484 C 948.68528,-487.53244 949.1526,-488.90655 952.89723,-488.90655 C 952.94613,-488.90655 952.89723,-484.07784 952.89723,-484.07784 C 952.89723,-484.07784 949.39916,-484.94386 948.14257,-483.68796 C 946.88597,-482.43205 945.53905,-481.42406 945.11181,-471.0195 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path5727"
++ d="M 848.99966,-471.0195 L 843.43127,-471.0195 C 843.43127,-471.0195 846.6821,-482.69695 846.96535,-488.42224 C 846.91644,-488.37334 851.79472,-488.42224 851.79472,-488.42224 C 851.79472,-488.42224 851.37563,-487.13169 851.1936,-486.00484 C 852.57313,-487.53244 853.04044,-488.90655 856.78508,-488.90655 C 856.83399,-488.90655 856.78508,-484.07784 856.78508,-484.07784 C 856.78508,-484.07784 853.28701,-484.94386 852.03041,-483.68796 C 850.77383,-482.43205 849.4269,-481.42406 848.99966,-471.0195 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path5729"
++ d="M 842.20864,-494.42263 L 837.65435,-492.84341 L 836.60764,-488.60224 L 833.70526,-488.60224 L 833.70526,-485.81397 L 835.99701,-485.81397 C 835.99701,-485.81397 833.55311,-477.06878 834.01092,-474.39462 C 834.4694,-471.49224 837.29571,-470.88161 838.97614,-470.95769 C 840.65658,-471.03376 841.11507,-472.25571 841.03831,-472.71419 C 840.96156,-473.17267 838.66981,-472.27677 838.44091,-474.33961 C 838.28807,-475.56156 840.35092,-485.81397 840.35092,-485.81397 L 843.9407,-485.81397 L 843.9407,-488.60224 L 841.11439,-488.60224 L 842.20864,-494.42263 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path5731"
++ d="M 889.67174,-471.28915 C 890.3469,-471.8468 889.89589,-472.96212 889.31174,-473.0966 C 888.65288,-474.46255 890.68584,-482.44495 890.68584,-484.63006 C 890.68584,-486.81517 887.01999,-491.19897 879.45804,-487.07463 C 878.72514,-486.60868 878.9948,-485.84658 879.17548,-485.59186 C 879.35615,-485.33715 879.69577,-485.16734 879.85471,-485.33715 C 880.56588,-486.11216 883.65981,-486.92181 885.10998,-485.3942 C 886.10303,-484.47724 886.0582,-482.70578 885.37013,-482.01839 C 884.53059,-481.94231 876.25,-482.18549 875.25695,-476.91528 C 873.54391,-467.55742 884.03271,-472.48529 884.57542,-472.86702 C 885.11812,-473.24875 885.05496,-471.76258 885.93593,-471.13632 C 888.32753,-470.92779 889.20035,-470.89994 889.67174,-471.28915 z M 884.43617,-475.19884 C 883.58713,-472.96279 880.43479,-473.30445 880.248,-474.88708 C 879.56876,-480.17969 885.03051,-479.7837 885.03051,-479.7837 C 885.03051,-479.7837 885.28522,-477.4349 884.43617,-475.19884 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path5733"
++ d="M 829.33368,-483.44682 L 830.91767,-486.12235 C 830.91767,-486.12235 829.62711,-488.86986 825.81591,-488.86986 C 822.00471,-488.86986 819.80602,-486.12167 819.80602,-482.85997 C 819.80602,-479.59826 827.06164,-477.14283 825.30309,-473.91848 C 822.3715,-470.91353 819.27689,-475.81491 819.33802,-476.13688 C 819.11659,-475.81763 817.59917,-473.72626 817.67253,-473.72626 C 818.03932,-472.99336 819.37062,-470.66968 823.61722,-470.62078 C 827.13499,-470.58003 829.26101,-473.18559 829.33437,-476.40993 C 829.40773,-480.73395 823.10439,-482.93332 823.03104,-484.91195 C 822.95768,-486.89057 827.20903,-489.16397 829.33368,-483.44682 z" />
++ <path
++ id="path5735"
++ d="M 821.0266,-489.81537 C 820.34737,-490.45249 819.83794,-489.60276 818.30965,-488.96632 C 816.78137,-488.32986 816.27194,-488.4141 814.74365,-488.6267 C 812.23863,-489.17891 807.83581,-489.01386 806.67771,-488.45689 C 798.9439,-485.35141 803.09065,-479.60574 804.35335,-478.45918 C 804.34249,-478.45918 802.46983,-477.47225 802.1961,-475.92223 C 801.84425,-473.93002 802.76054,-472.85208 802.78907,-472.82422 C 800.26231,-472.69313 798.63757,-470.1521 799.02881,-468.0716 C 799.44994,-465.8308 802.12137,-464.04304 805.94616,-464.0281 C 814.03181,-463.85218 814.45091,-469.02253 814.45091,-469.02253 C 815.55738,-475.31091 810.22469,-475.60096 806.42435,-475.30548 C 805.04889,-476.53422 806.12209,-477.6801 806.06368,-477.6801 C 818.90399,-477.37716 815.67149,-485.94099 815.67149,-485.94099 C 817.83962,-486.46876 822.08757,-488.7965 821.0266,-489.81537 z M 803.82831,-471.79994 C 808.85806,-470.89247 810.88219,-472.04582 811.22656,-469.4817 C 811.37532,-466.97939 809.25133,-466.26415 806.78095,-466.11064 C 804.31056,-465.95713 802.51058,-467.20557 802.41142,-468.81061 C 802.31292,-470.41565 803.71487,-470.24991 803.82831,-471.79994 z M 811.59811,-482.73839 C 811.13351,-480.68165 809.70846,-479.24982 808.41452,-479.54189 C 807.12057,-479.83464 806.4488,-481.73854 806.91272,-483.79596 C 807.37733,-485.85337 808.80236,-487.2852 810.09631,-486.99313 C 811.39026,-486.70038 812.0627,-484.7958 811.59811,-482.73839 z"
++ style="font-size:14px;fill:#2e3436" />
++ <path
++ style="font-size:14px;fill:#cc0000"
++ id="path5737"
++ d="M 794.60358,-507.62294 C 790.92958,-507.62294 785.55409,-510.61634 780.31513,-510.61634 C 775.07616,-510.61634 771.94691,-507.62294 771.40216,-507.21472 C 770.8581,-506.8065 770.51711,-505.24221 772.15069,-505.71836 C 773.78425,-506.19451 775.14409,-506.19451 777.72994,-506.19451 C 780.3158,-506.19451 786.50706,-502.65636 792.76692,-502.65636 C 799.02677,-502.65636 804.26505,-507.48641 805.42179,-509.1879 C 806.57854,-510.88939 805.48972,-511.43347 804.60535,-511.02456 C 803.7203,-510.61634 798.00588,-507.62294 794.60358,-507.62294 z" />
++ <path
++ style="font-size:14px;fill:#73d216"
++ id="path5739"
++ d="M 810.56431,-498.30244 C 806.7042,-498.30244 801.05701,-501.29516 795.55315,-501.29516 C 790.04929,-501.29516 786.7611,-498.30244 786.18918,-497.89354 C 785.61726,-497.48464 785.2593,-495.92103 786.97506,-496.39718 C 788.69081,-496.87332 790.11992,-496.87332 792.8362,-496.87332 C 795.55247,-496.87332 802.05754,-493.33517 808.63323,-493.33517 C 815.20893,-493.33517 820.71347,-498.16524 821.92863,-499.86605 C 823.14379,-501.56754 821.99996,-502.11228 821.07076,-501.70338 C 820.14156,-501.29449 814.13845,-498.30244 810.56431,-498.30244 z" />
++ <path
++ style="font-size:14px;fill:#204a87"
++ id="path5741"
++ d="M 788.35119,-488.01742 C 784.34844,-488.01742 778.49206,-491.25127 772.78442,-491.25127 C 767.07678,-491.25127 763.66633,-488.01742 763.07335,-487.57659 C 762.48037,-487.13577 762.10951,-485.44583 763.88844,-485.96069 C 765.66804,-486.47487 767.15013,-486.47487 769.96694,-486.47487 C 772.78374,-486.47487 779.52993,-482.65348 786.35015,-482.65348 C 793.16971,-482.65348 798.87734,-487.87071 800.13801,-489.70804 C 801.39867,-491.54538 800.21204,-492.13292 799.24821,-491.6921 C 798.28436,-491.25127 792.05779,-488.01742 788.35119,-488.01742 z" />
++ </g>
++ <text
++ xml:space="preserve"
++ style="font-size:18px;font-style:normal;font-weight:bold;opacity:0.5;fill:#f57900;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="497.82346"
++ y="-1368.0675"
++ id="text5743"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="497.82346"
++ y="-1368.0675"
++ id="tspan5745">multimedia applications</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
++ x="318.82349"
++ y="-1317.264"
++ id="text5747"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan5749"
++ x="318.82349"
++ y="-1317.264">media player</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
++ x="432.01428"
++ y="-1326.014"
++ id="text5751"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="434.2428"
++ y="-1326.014"
++ id="tspan5753">VoIP & video </tspan><tspan
++ sodipodi:role="line"
++ x="434.2428"
++ y="-1308.514"
++ id="tspan5755">conferencing </tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
++ x="537.4043"
++ y="-1324.6571"
++ id="text5757"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="537.4043"
++ y="-1324.6571"
++ id="tspan5759">streaming</tspan><tspan
++ sodipodi:role="line"
++ x="537.4043"
++ y="-1307.1571"
++ id="tspan5761">server</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
++ x="633.49585"
++ y="-1315.9071"
++ id="text5763"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan5765"
++ x="633.49585"
++ y="-1315.9071">video editor</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:18px;font-style:normal;font-weight:bold;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="168.36176"
++ y="-1203.861"
++ id="text5767"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan5769"
++ x="168.36176"
++ y="-1203.861"
++ style="font-size:14px">pipeline architecture</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="162"
++ y="-1368.1378"
++ id="text5771"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan5773"
++ x="162"
++ y="-1368.1378"
++ style="font-size:18px;fill:#204a87">gstreamer tools</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:18px;font-style:normal;font-weight:bold;text-align:end;text-anchor:end;opacity:0.5;fill:#f57900;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="742.71094"
++ y="-956.63782"
++ id="text5775"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="742.71094"
++ y="-956.63782"
++ id="tspan5777">3rd party </tspan><tspan
++ sodipodi:role="line"
++ x="742.71094"
++ y="-956.63782"
++ id="tspan6195">plugins</tspan></text>
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 319.45241,-1263.4829 L 319.45241,-1254.5949"
++ id="path5779"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="path5781"
++ sodipodi:cx="234.08273"
++ sodipodi:cy="-724.04565"
++ sodipodi:rx="5.8746634"
++ sodipodi:ry="5.8746634"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ transform="translate(85.369675,-547.0675)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="opacity:0.5;fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 319.45241,-1291.1354 L 319.45241,-1282.0949"
++ id="path5783"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.5;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069000000014;stroke-opacity:1"
++ id="path5785"
++ sodipodi:cx="222.71907"
++ sodipodi:cy="-724.11804"
++ sodipodi:rx="9.2349148"
++ sodipodi:ry="9.2349148"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ transform="translate(96.733337,-546.99511)"
++ sodipodi:start="3.1415927"
++ sodipodi:end="6.2831853"
++ sodipodi:open="true"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:bold;text-align:center;text-anchor:middle;opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="714.90118"
++ y="-1316.7377"
++ id="text5787"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan5789"
++ x="714.90118"
++ y="-1316.7377">(...)</tspan></text>
++ <g
++ id="g5791"
++ transform="matrix(1,0,0,-1,-25.819906,-1802.7166)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003">
++ <path
++ transform="translate(-7.529188,12.389655)"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ sodipodi:ry="5.8746634"
++ sodipodi:rx="5.8746634"
++ sodipodi:cy="-724.04565"
++ sodipodi:cx="234.08273"
++ id="path5793"
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path5795"
++ d="M 226.55355,-704.02579 L 226.55355,-695.13782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path5797"
++ d="M 226.55323,-731.67826 L 226.55323,-722.63782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:open="true"
++ sodipodi:end="6.2831853"
++ sodipodi:start="3.1415927"
++ transform="translate(3.8344747,12.462043)"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ sodipodi:ry="9.2349148"
++ sodipodi:rx="9.2349148"
++ sodipodi:cy="-724.11804"
++ sodipodi:cx="222.71907"
++ id="path5799"
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ </g>
++ <g
++ id="g5801"
++ transform="matrix(1,0,0,-1,57.836573,-1802.4825)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003">
++ <path
++ transform="translate(-7.529188,12.389655)"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ sodipodi:ry="5.8746634"
++ sodipodi:rx="5.8746634"
++ sodipodi:cy="-724.04565"
++ sodipodi:cx="234.08273"
++ id="path5803"
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path5805"
++ d="M 226.55355,-704.02579 L 226.55355,-695.13782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path5807"
++ d="M 226.55323,-731.67826 L 226.55323,-722.63782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:open="true"
++ sodipodi:end="6.2831853"
++ sodipodi:start="3.1415927"
++ transform="translate(3.8344747,12.462043)"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ sodipodi:ry="9.2349148"
++ sodipodi:rx="9.2349148"
++ sodipodi:cy="-724.11804"
++ sodipodi:cx="222.71907"
++ id="path5809"
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ </g>
++ <g
++ id="g5811"
++ transform="matrix(1,0,0,-1,141.49302,-1802.4825)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003">
++ <path
++ transform="translate(-7.529188,12.389655)"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ sodipodi:ry="5.8746634"
++ sodipodi:rx="5.8746634"
++ sodipodi:cy="-724.04565"
++ sodipodi:cx="234.08273"
++ id="path5813"
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path5815"
++ d="M 226.55355,-704.02579 L 226.55355,-695.13782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path5817"
++ d="M 226.55323,-731.67826 L 226.55323,-722.63782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:open="true"
++ sodipodi:end="6.2831853"
++ sodipodi:start="3.1415927"
++ transform="translate(3.8344747,12.462043)"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ sodipodi:ry="9.2349148"
++ sodipodi:rx="9.2349148"
++ sodipodi:cy="-724.11804"
++ sodipodi:cx="222.71907"
++ id="path5819"
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ </g>
++ <g
++ id="g5821"
++ transform="matrix(1,0,0,-1,225.14948,-1802.4825)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003">
++ <path
++ transform="translate(-7.529188,12.389655)"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ sodipodi:ry="5.8746634"
++ sodipodi:rx="5.8746634"
++ sodipodi:cy="-724.04565"
++ sodipodi:cx="234.08273"
++ id="path5823"
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path5825"
++ d="M 226.55355,-704.02579 L 226.55355,-695.13782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path5827"
++ d="M 226.55323,-731.67826 L 226.55323,-722.63782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:open="true"
++ sodipodi:end="6.2831853"
++ sodipodi:start="3.1415927"
++ transform="translate(3.8344747,12.462043)"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ sodipodi:ry="9.2349148"
++ sodipodi:rx="9.2349148"
++ sodipodi:cy="-724.11804"
++ sodipodi:cx="222.71907"
++ id="path5829"
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ </g>
++ <path
++ sodipodi:type="arc"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="path5831"
++ sodipodi:cx="234.08273"
++ sodipodi:cy="-724.04565"
++ sodipodi:rx="5.8746634"
++ sodipodi:ry="5.8746634"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ transform="translate(198.31779,-547.06749)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 432.40053,-1263.4829 L 432.40053,-1254.5949"
++ id="path5833"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="opacity:0.5;fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 432.40053,-1291.1354 L 432.40053,-1282.0949"
++ id="path5835"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.5;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069000000014;stroke-opacity:1"
++ id="path5837"
++ sodipodi:cx="222.71907"
++ sodipodi:cy="-724.11804"
++ sodipodi:rx="9.2349148"
++ sodipodi:ry="9.2349148"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ transform="translate(209.68146,-546.99511)"
++ sodipodi:start="3.1415927"
++ sodipodi:end="6.2831853"
++ sodipodi:open="true"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="path5839"
++ sodipodi:cx="234.08273"
++ sodipodi:cy="-724.04565"
++ sodipodi:rx="5.8746634"
++ sodipodi:ry="5.8746634"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ transform="translate(303.06519,-547.06749)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 537.14793,-1263.4829 L 537.14793,-1254.5949"
++ id="path5841"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="opacity:0.5;fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 537.14793,-1291.1354 L 537.14793,-1282.0949"
++ id="path5843"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.5;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069000000014;stroke-opacity:1"
++ id="path5845"
++ sodipodi:cx="222.71907"
++ sodipodi:cy="-724.11804"
++ sodipodi:rx="9.2349148"
++ sodipodi:ry="9.2349148"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ transform="translate(314.42886,-546.99511)"
++ sodipodi:start="3.1415927"
++ sodipodi:end="6.2831853"
++ sodipodi:open="true"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="path5847"
++ sodipodi:cx="234.08273"
++ sodipodi:cy="-724.04565"
++ sodipodi:rx="5.8746634"
++ sodipodi:ry="5.8746634"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ transform="translate(399.61478,-547.87085)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 633.69752,-1264.2863 L 633.69752,-1255.3983"
++ id="path5849"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="opacity:0.5;fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 633.69752,-1291.9387 L 633.69752,-1282.8983"
++ id="path5851"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.5;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069000000014;stroke-opacity:1"
++ id="path5853"
++ sodipodi:cx="222.71907"
++ sodipodi:cy="-724.11804"
++ sodipodi:rx="9.2349148"
++ sodipodi:ry="9.2349148"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ transform="translate(410.97845,-547.79847)"
++ sodipodi:start="3.1415927"
++ sodipodi:end="6.2831853"
++ sodipodi:open="true"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="path5855"
++ sodipodi:cx="234.08273"
++ sodipodi:cy="-724.04565"
++ sodipodi:rx="5.8746634"
++ sodipodi:ry="5.8746634"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ transform="translate(480.81846,-547.87085)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 714.90119,-1264.2863 L 714.90119,-1255.3983"
++ id="path5857"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="opacity:0.5;fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 714.90119,-1291.9387 L 714.90119,-1282.8983"
++ id="path5859"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.5;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069000000014;stroke-opacity:1"
++ id="path5861"
++ sodipodi:cx="222.71907"
++ sodipodi:cy="-724.11804"
++ sodipodi:rx="9.2349148"
++ sodipodi:ry="9.2349148"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ transform="translate(492.18212,-547.79847)"
++ sodipodi:start="3.1415927"
++ sodipodi:end="6.2831853"
++ sodipodi:open="true"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="169.93443"
++ y="-1334.764"
++ id="text5863"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan5865"
++ x="169.93443"
++ y="-1334.764">gst-inspect</tspan><tspan
++ sodipodi:role="line"
++ x="169.93443"
++ y="-1317.264"
++ id="tspan5867">gst-launch</tspan><tspan
++ sodipodi:role="line"
++ x="169.93443"
++ y="-1299.764"
++ id="tspan5871">gst-editor</tspan></text>
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2.07903409;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect5873"
++ width="78.152527"
++ height="84.476593"
++ x="245.33493"
++ y="-1069.5864"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2.07903409;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect5875"
++ width="78.152527"
++ height="84.476593"
++ x="328.97882"
++ y="-1069.5864"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2.07903409;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="rect5877"
++ width="78.152527"
++ height="84.476593"
++ x="412.62274"
++ y="-1068.5056"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <g
++ id="g5879"
++ transform="matrix(0.2661835,0,0,0.2661835,-53.124993,-922.19296)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003">
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5881"
++ xlink:href="#rect4673"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5883"
++ xlink:href="#rect3530"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5885"
++ xlink:href="#text3532"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5887"
++ xlink:href="#rect3538"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5889"
++ xlink:href="#text3540"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5891"
++ xlink:href="#rect3544"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5893"
++ xlink:href="#text3546"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5895"
++ xlink:href="#rect3552"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5897"
++ xlink:href="#text3554"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5899"
++ xlink:href="#rect3560"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5901"
++ xlink:href="#text3562"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5903"
++ xlink:href="#rect3566"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5905"
++ xlink:href="#text3568"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5907"
++ xlink:href="#rect3574"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5909"
++ xlink:href="#text3576"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5911"
++ xlink:href="#rect3582"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5913"
++ xlink:href="#text3584"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5915"
++ xlink:href="#rect3610"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5917"
++ xlink:href="#text3612"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5919"
++ xlink:href="#rect3618"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5921"
++ xlink:href="#text3620"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5923"
++ xlink:href="#path3624"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5925"
++ xlink:href="#text3626"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5927"
++ xlink:href="#path3632"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5929"
++ xlink:href="#path3634"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5931"
++ xlink:href="#g7012"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5933"
++ xlink:href="#g7032"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5935"
++ xlink:href="#rect3848"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5937"
++ xlink:href="#text3850"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5939"
++ xlink:href="#path3854"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5941"
++ xlink:href="#rect3856"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5943"
++ xlink:href="#text3858"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5945"
++ xlink:href="#rect3864"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5947"
++ xlink:href="#text3866"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5949"
++ xlink:href="#rect3872"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5951"
++ xlink:href="#text3874"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5953"
++ xlink:href="#rect3878"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5955"
++ xlink:href="#text3880"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5957"
++ xlink:href="#rect3886"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5959"
++ xlink:href="#text3888"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5961"
++ xlink:href="#g7053"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5963"
++ xlink:href="#g7042"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5965"
++ xlink:href="#g7082"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5967"
++ xlink:href="#g4318"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5969"
++ xlink:href="#g2837"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5971"
++ xlink:href="#use2844"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5973"
++ xlink:href="#path4663"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5975"
++ xlink:href="#path4665"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5977"
++ xlink:href="#path4667"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5979"
++ xlink:href="#path4669"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5981"
++ xlink:href="#path4671"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5983"
++ xlink:href="#g6482"
++ y="0"
++ x="0" />
++ <use
++ height="1052.3622"
++ width="744.09448"
++ transform="translate(669.40487,-864.72194)"
++ id="use5985"
++ xlink:href="#path7621"
++ y="0"
++ x="0" />
++ </g>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="167.3703"
++ y="-1232.4841"
++ id="text5987"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan5989"
++ x="167.3703"
++ y="-1232.4841"
++ style="font-size:18px">gstreamer core framework</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="166.41623"
++ y="-1034.9705"
++ id="text5991"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="166.41623"
++ y="-1034.9705"
++ id="tspan5993"
++ style="font-size:12px">- file:</tspan><tspan
++ sodipodi:role="line"
++ x="166.41623"
++ y="-1019.9705"
++ id="tspan5995"
++ style="font-size:12px">- http:</tspan><tspan
++ sodipodi:role="line"
++ x="166.41623"
++ y="-1004.9705"
++ id="tspan5997"
++ style="font-size:12px">- rtsp:</tspan><tspan
++ sodipodi:role="line"
++ x="166.41623"
++ y="-989.97046"
++ style="font-size:12px"
++ id="tspan5999">- ...</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="250.79111"
++ y="-1034.9705"
++ id="text6001"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="250.79111"
++ y="-1034.9705"
++ id="tspan6003"
++ style="font-size:12px">- alsa</tspan><tspan
++ sodipodi:role="line"
++ x="250.79111"
++ y="-1019.9705"
++ id="tspan6005"
++ style="font-size:12px">- v4l2</tspan><tspan
++ sodipodi:role="line"
++ x="250.79111"
++ y="-1004.9705"
++ style="font-size:12px"
++ id="tspan6167">- tcp/udp</tspan><tspan
++ sodipodi:role="line"
++ x="250.79111"
++ y="-989.97046"
++ style="font-size:12px"
++ id="tspan6007">- ...</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
++ x="168.23218"
++ y="-1053.9922"
++ id="text6009"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan6011"
++ x="168.23218"
++ y="-1053.9922">protocols</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
++ x="257.436"
++ y="-1053.9922"
++ id="text6013"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan6015"
++ x="257.436"
++ y="-1053.9922">sources</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="341.21552"
++ y="-1053.9922"
++ id="text6017"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="341.21552"
++ y="-1053.9922"
++ id="tspan6019">formats</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
++ x="427.27139"
++ y="-1053.9922"
++ id="text6021"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan6023"
++ x="427.27139"
++ y="-1053.9922">codecs</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="515.61047"
++ y="-1053.9922"
++ id="text6025"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan6027"
++ x="515.61047"
++ y="-1053.9922">filters</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:justify;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="569.02454"
++ y="-1228.8972"
++ id="text6059"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan6061"
++ x="569.02454"
++ y="-1228.8972"
++ style="text-align:start;text-anchor:start">media agnostic</tspan><tspan
++ sodipodi:role="line"
++ x="569.02454"
++ y="-1211.3972"
++ id="tspan6063"
++ style="text-align:start;text-anchor:start">base classes</tspan><tspan
++ sodipodi:role="line"
++ x="569.02454"
++ y="-1193.8972"
++ id="tspan6065"
++ style="text-align:start;text-anchor:start">message bus</tspan><tspan
++ sodipodi:role="line"
++ x="569.02454"
++ y="-1176.3972"
++ id="tspan6067"
++ style="text-align:start;text-anchor:start">media type negotiation</tspan><tspan
++ sodipodi:role="line"
++ x="569.02454"
++ y="-1158.8972"
++ id="tspan6069"
++ style="text-align:start;text-anchor:start">plugin system</tspan><tspan
++ sodipodi:role="line"
++ x="569.02454"
++ y="-1141.3972"
++ style="text-align:start;text-anchor:start"
++ id="tspan6071">utility libraries</tspan><tspan
++ sodipodi:role="line"
++ x="569.02454"
++ y="-1123.8972"
++ id="tspan6073"
++ style="text-align:start;text-anchor:start">language bindings</tspan></text>
++ <g
++ id="g6181"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"
++ transform="translate(0,11)">
++ <text
++ inkscape:export-ydpi="91.230003"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ id="text6077"
++ y="-967.63782"
++ x="346.1875"
++ style="font-size:18px;font-style:normal;font-weight:bold;text-align:end;text-anchor:end;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"><tspan
++ id="tspan6079"
++ y="-967.63782"
++ x="346.1875"
++ sodipodi:role="line">gstreamer plugins</tspan></text>
++ <text
++ inkscape:export-ydpi="91.230003"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ id="text6081"
++ y="-948.39148"
++ x="159.89606"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"><tspan
++ id="tspan6083"
++ y="-948.39148"
++ x="159.89606"
++ sodipodi:role="line">gstreamer includes over 150 plugins</tspan></text>
++ </g>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="601.23566"
++ y="-1053.9922"
++ id="text6085"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ id="tspan6087"
++ x="601.23566"
++ y="-1053.9922">sinks</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="333.3338"
++ y="-1034.9705"
++ id="text6089"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="333.3338"
++ y="-1034.9705"
++ style="font-size:12px"
++ id="tspan6091">- avi</tspan><tspan
++ sodipodi:role="line"
++ x="333.3338"
++ y="-1019.9705"
++ style="font-size:12px"
++ id="tspan6093">- mp4</tspan><tspan
++ sodipodi:role="line"
++ x="333.3338"
++ y="-1004.9705"
++ style="font-size:12px"
++ id="tspan6095">- ogg</tspan><tspan
++ sodipodi:role="line"
++ x="333.3338"
++ y="-989.97046"
++ style="font-size:12px"
++ id="tspan6097">- ...</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="417.18256"
++ y="-1035.1814"
++ id="text6099"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="417.18256"
++ y="-1035.1814"
++ id="tspan6101"
++ style="font-size:12px">- mp3</tspan><tspan
++ sodipodi:role="line"
++ x="417.18256"
++ y="-1020.1814"
++ id="tspan6103"
++ style="font-size:12px">- mpeg4</tspan><tspan
++ sodipodi:role="line"
++ x="417.18256"
++ y="-1005.1814"
++ style="font-size:12px"
++ id="tspan6105">- vorbis</tspan><tspan
++ sodipodi:role="line"
++ x="417.18256"
++ y="-990.1814"
++ style="font-size:12px"
++ id="tspan6107">- ...</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="499.47424"
++ y="-1035.6619"
++ id="text6109"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="499.47424"
++ y="-1035.6619"
++ id="tspan6111"
++ style="font-size:12px">- converters</tspan><tspan
++ sodipodi:role="line"
++ x="499.47424"
++ y="-1020.6619"
++ id="tspan6113"
++ style="font-size:12px">- mixers</tspan><tspan
++ sodipodi:role="line"
++ x="499.47424"
++ y="-1005.6619"
++ style="font-size:12px"
++ id="tspan6115">- effetcs</tspan><tspan
++ sodipodi:role="line"
++ x="499.47424"
++ y="-990.66187"
++ style="font-size:12px"
++ id="tspan6117">- ...</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:14px;font-style:normal;font-weight:normal;text-align:start;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="583.83484"
++ y="-1034.9705"
++ id="text6119"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"><tspan
++ sodipodi:role="line"
++ x="583.83484"
++ y="-1034.9705"
++ id="tspan6121"
++ style="font-size:12px">- alsa</tspan><tspan
++ sodipodi:role="line"
++ x="583.83484"
++ y="-1019.9705"
++ id="tspan6123"
++ style="font-size:12px">- xvideo</tspan><tspan
++ sodipodi:role="line"
++ x="583.83484"
++ y="-1004.9705"
++ style="font-size:12px"
++ id="tspan6169">- tcp/udp</tspan><tspan
++ sodipodi:role="line"
++ x="583.83484"
++ y="-989.97046"
++ style="font-size:12px"
++ id="tspan6125">- ...</tspan></text>
++ <g
++ id="g6129"
++ transform="matrix(1,0,0,-1,308.80595,-1801.7446)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003">
++ <path
++ transform="translate(-7.529188,12.389655)"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ sodipodi:ry="5.8746634"
++ sodipodi:rx="5.8746634"
++ sodipodi:cy="-724.04565"
++ sodipodi:cx="234.08273"
++ id="path6131"
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path6133"
++ d="M 226.55355,-704.02579 L 226.55355,-695.13782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path6135"
++ d="M 226.55323,-731.67826 L 226.55323,-722.63782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:open="true"
++ sodipodi:end="6.2831853"
++ sodipodi:start="3.1415927"
++ transform="translate(3.8344747,12.462043)"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ sodipodi:ry="9.2349148"
++ sodipodi:rx="9.2349148"
++ sodipodi:cy="-724.11804"
++ sodipodi:cx="222.71907"
++ id="path6137"
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ </g>
++ <rect
++ style="opacity:0.5;fill:#fcaf3e;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2.09387493000000013;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069000000014;stroke-opacity:1"
++ id="rect6139"
++ width="76.924461"
++ height="84.462128"
++ x="664.19647"
++ y="-1068.1346"
++ rx="5"
++ ry="5"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 702.6725,-1098.6908 L 702.6725,-1107.5787"
++ id="path6147"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ id="path6149"
++ sodipodi:cx="234.08273"
++ sodipodi:cy="-724.04565"
++ sodipodi:rx="5.8746634"
++ sodipodi:ry="5.8746634"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ transform="matrix(1,0,0,-1,468.58975,-1815.1063)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ style="opacity:0.5;fill:none;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#f57900;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 702.54716,-1068.4106 L 702.54716,-1081.1207"
++ id="path6151"
++ sodipodi:nodetypes="cc"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.5;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#f57900;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069000000014;stroke-opacity:1"
++ id="path6153"
++ sodipodi:cx="222.71907"
++ sodipodi:cy="-724.11804"
++ sodipodi:rx="9.2349148"
++ sodipodi:ry="9.2349148"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ transform="matrix(1,0,0,-1,479.95341,-1815.1787)"
++ sodipodi:start="3.1415927"
++ sodipodi:end="6.2831853"
++ sodipodi:open="true"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003" />
++ <g
++ id="g6155"
++ transform="translate(-14.644014,-559)"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview3.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003">
++ <path
++ transform="translate(-7.529188,12.389655)"
++ d="M 239.9574,-724.04565 A 5.8746634,5.8746634 0 1 1 228.20807,-724.04565 A 5.8746634,5.8746634 0 1 1 239.9574,-724.04565 z"
++ sodipodi:ry="5.8746634"
++ sodipodi:rx="5.8746634"
++ sodipodi:cy="-724.04565"
++ sodipodi:cx="234.08273"
++ id="path6157"
++ style="opacity:1;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path6159"
++ d="M 226.55355,-704.02579 L 226.55355,-695.13782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:nodetypes="cc"
++ id="path6161"
++ d="M 226.55323,-731.67826 L 226.55323,-722.63782"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:open="true"
++ sodipodi:end="6.2831853"
++ sodipodi:start="3.1415927"
++ transform="translate(3.8344747,12.462043)"
++ d="M 213.48416,-724.11804 A 9.2349148,9.2349148 0 0 1 231.95399,-724.11804"
++ sodipodi:ry="9.2349148"
++ sodipodi:rx="9.2349148"
++ sodipodi:cy="-724.11804"
++ sodipodi:cx="222.71907"
++ id="path6163"
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ sodipodi:type="arc" />
++ </g>
++ <g
++ id="g12872"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"
++ transform="matrix(1.6161303,0,0,1.6161303,-1783.2868,660.51777)">
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path12874"
++ d="M 898.12621,-471.2939 C 897.89934,-475.93582 899.91669,-486.74453 904.5586,-485.72567 C 906.53722,-485.29096 905.99722,-482.56382 905.35059,-479.61253 C 904.47981,-475.63899 902.97326,-471.30069 902.97326,-471.30069 C 902.97326,-471.30069 908.63403,-471.07451 908.52059,-471.30069 C 909.08639,-478.43269 910.5848,-486.19503 914.74716,-485.61291 C 918.19837,-485.13066 913.76838,-471.30069 913.76838,-471.30069 C 913.76838,-471.30069 918.0272,-471.30069 918.92175,-471.30069 C 918.73701,-473.64611 920.00175,-479.10854 920.71155,-483.05898 C 921.42135,-487.00943 919.90937,-488.73741 916.73121,-488.76798 C 913.55307,-488.79854 910.4048,-486.02114 910.4048,-486.02114 C 910.52842,-488.39712 907.39645,-488.77206 907.39645,-488.77206 C 904.04781,-488.98465 900.83841,-486.73095 900.83841,-486.73095 L 901.13591,-488.47658 L 896.09258,-488.47658 C 896.09258,-488.47658 895.84465,-485.69986 894.82443,-480.63207 C 893.80422,-475.56427 892.44032,-471.30069 892.44032,-471.30069 L 898.12621,-471.2939 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path12876"
++ d="M 932.65662,-488.90315 C 925.75082,-488.90315 922.67183,-484.02757 922.67183,-479.04673 C 922.67183,-474.06588 925.61429,-470.78244 931.61467,-470.78244 C 934.43351,-470.78244 936.02972,-473.38663 936.02972,-473.38663 C 936.02972,-473.38663 936.12074,-474.09916 935.58822,-473.80233 C 935.05569,-473.50551 933.60484,-472.88401 931.70977,-472.88401 C 929.81469,-472.88401 927.76611,-474.68669 927.76611,-479.15947 C 927.76611,-479.15947 938.74667,-479.15947 938.63391,-479.15947 C 939.19972,-480.97101 939.56244,-488.90315 932.65662,-488.90315 z M 933.66394,-481.17546 L 928.39305,-481.17546 C 928.39305,-484.81753 931.30698,-487.56845 933.29104,-486.5917 C 935.0978,-485.75284 933.66394,-481.17546 933.66394,-481.17546 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path12878"
++ d="M 867.78941,-488.90315 C 860.88361,-488.90315 857.80462,-484.02757 857.80462,-479.04673 C 857.80462,-474.06588 860.74708,-470.78244 866.74746,-470.78244 C 869.5663,-470.78244 871.16251,-473.38663 871.16251,-473.38663 C 871.16251,-473.38663 871.25353,-474.09916 870.72101,-473.80233 C 870.18848,-473.50551 868.73763,-472.88401 866.84256,-472.88401 C 864.94748,-472.88401 862.8989,-474.68669 862.8989,-479.15947 C 862.8989,-479.15947 873.87946,-479.15947 873.7667,-479.15947 C 874.33251,-480.97101 874.69523,-488.90315 867.78941,-488.90315 z M 868.79673,-481.17546 L 863.52584,-481.17546 C 863.52584,-484.81753 865.98536,-487.17721 867.96941,-486.19978 C 869.77618,-485.3616 868.79673,-481.17546 868.79673,-481.17546 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path12880"
++ d="M 945.11181,-471.0195 L 939.54342,-471.0195 C 939.54342,-471.0195 942.79425,-482.69695 943.07749,-488.42224 C 943.02859,-488.37334 947.90688,-488.42224 947.90688,-488.42224 C 947.90688,-488.42224 947.48778,-487.13169 947.30574,-486.00484 C 948.68528,-487.53244 949.1526,-488.90655 952.89723,-488.90655 C 952.94613,-488.90655 952.89723,-484.07784 952.89723,-484.07784 C 952.89723,-484.07784 949.39916,-484.94386 948.14257,-483.68796 C 946.88597,-482.43205 945.53905,-481.42406 945.11181,-471.0195 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path12882"
++ d="M 848.99966,-471.0195 L 843.43127,-471.0195 C 843.43127,-471.0195 846.6821,-482.69695 846.96535,-488.42224 C 846.91644,-488.37334 851.79472,-488.42224 851.79472,-488.42224 C 851.79472,-488.42224 851.37563,-487.13169 851.1936,-486.00484 C 852.57313,-487.53244 853.04044,-488.90655 856.78508,-488.90655 C 856.83399,-488.90655 856.78508,-484.07784 856.78508,-484.07784 C 856.78508,-484.07784 853.28701,-484.94386 852.03041,-483.68796 C 850.77383,-482.43205 849.4269,-481.42406 848.99966,-471.0195 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path12884"
++ d="M 842.20864,-494.42263 L 837.65435,-492.84341 L 836.60764,-488.60224 L 833.70526,-488.60224 L 833.70526,-485.81397 L 835.99701,-485.81397 C 835.99701,-485.81397 833.55311,-477.06878 834.01092,-474.39462 C 834.4694,-471.49224 837.29571,-470.88161 838.97614,-470.95769 C 840.65658,-471.03376 841.11507,-472.25571 841.03831,-472.71419 C 840.96156,-473.17267 838.66981,-472.27677 838.44091,-474.33961 C 838.28807,-475.56156 840.35092,-485.81397 840.35092,-485.81397 L 843.9407,-485.81397 L 843.9407,-488.60224 L 841.11439,-488.60224 L 842.20864,-494.42263 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path12886"
++ d="M 889.67174,-471.28915 C 890.3469,-471.8468 889.89589,-472.96212 889.31174,-473.0966 C 888.65288,-474.46255 890.68584,-482.44495 890.68584,-484.63006 C 890.68584,-486.81517 887.01999,-491.19897 879.45804,-487.07463 C 878.72514,-486.60868 878.9948,-485.84658 879.17548,-485.59186 C 879.35615,-485.33715 879.69577,-485.16734 879.85471,-485.33715 C 880.56588,-486.11216 883.65981,-486.92181 885.10998,-485.3942 C 886.10303,-484.47724 886.0582,-482.70578 885.37013,-482.01839 C 884.53059,-481.94231 876.25,-482.18549 875.25695,-476.91528 C 873.54391,-467.55742 884.03271,-472.48529 884.57542,-472.86702 C 885.11812,-473.24875 885.05496,-471.76258 885.93593,-471.13632 C 888.32753,-470.92779 889.20035,-470.89994 889.67174,-471.28915 z M 884.43617,-475.19884 C 883.58713,-472.96279 880.43479,-473.30445 880.248,-474.88708 C 879.56876,-480.17969 885.03051,-479.7837 885.03051,-479.7837 C 885.03051,-479.7837 885.28522,-477.4349 884.43617,-475.19884 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path12888"
++ d="M 829.33368,-483.44682 L 830.91767,-486.12235 C 830.91767,-486.12235 829.62711,-488.86986 825.81591,-488.86986 C 822.00471,-488.86986 819.80602,-486.12167 819.80602,-482.85997 C 819.80602,-479.59826 827.06164,-477.14283 825.30309,-473.91848 C 822.3715,-470.91353 819.27689,-475.81491 819.33802,-476.13688 C 819.11659,-475.81763 817.59917,-473.72626 817.67253,-473.72626 C 818.03932,-472.99336 819.37062,-470.66968 823.61722,-470.62078 C 827.13499,-470.58003 829.26101,-473.18559 829.33437,-476.40993 C 829.40773,-480.73395 823.10439,-482.93332 823.03104,-484.91195 C 822.95768,-486.89057 827.20903,-489.16397 829.33368,-483.44682 z" />
++ <path
++ id="path12890"
++ d="M 821.0266,-489.81537 C 820.34737,-490.45249 819.83794,-489.60276 818.30965,-488.96632 C 816.78137,-488.32986 816.27194,-488.4141 814.74365,-488.6267 C 812.23863,-489.17891 807.83581,-489.01386 806.67771,-488.45689 C 798.9439,-485.35141 803.09065,-479.60574 804.35335,-478.45918 C 804.34249,-478.45918 802.46983,-477.47225 802.1961,-475.92223 C 801.84425,-473.93002 802.76054,-472.85208 802.78907,-472.82422 C 800.26231,-472.69313 798.63757,-470.1521 799.02881,-468.0716 C 799.44994,-465.8308 802.12137,-464.04304 805.94616,-464.0281 C 814.03181,-463.85218 814.45091,-469.02253 814.45091,-469.02253 C 815.55738,-475.31091 810.22469,-475.60096 806.42435,-475.30548 C 805.04889,-476.53422 806.12209,-477.6801 806.06368,-477.6801 C 818.90399,-477.37716 815.67149,-485.94099 815.67149,-485.94099 C 817.83962,-486.46876 822.08757,-488.7965 821.0266,-489.81537 z M 803.82831,-471.79994 C 808.85806,-470.89247 810.88219,-472.04582 811.22656,-469.4817 C 811.37532,-466.97939 809.25133,-466.26415 806.78095,-466.11064 C 804.31056,-465.95713 802.51058,-467.20557 802.41142,-468.81061 C 802.31292,-470.41565 803.71487,-470.24991 803.82831,-471.79994 z M 811.59811,-482.73839 C 811.13351,-480.68165 809.70846,-479.24982 808.41452,-479.54189 C 807.12057,-479.83464 806.4488,-481.73854 806.91272,-483.79596 C 807.37733,-485.85337 808.80236,-487.2852 810.09631,-486.99313 C 811.39026,-486.70038 812.0627,-484.7958 811.59811,-482.73839 z"
++ style="font-size:14px;fill:#2e3436" />
++ <path
++ style="font-size:14px;fill:#cc0000"
++ id="path12892"
++ d="M 794.60358,-507.62294 C 790.92958,-507.62294 785.55409,-510.61634 780.31513,-510.61634 C 775.07616,-510.61634 771.94691,-507.62294 771.40216,-507.21472 C 770.8581,-506.8065 770.51711,-505.24221 772.15069,-505.71836 C 773.78425,-506.19451 775.14409,-506.19451 777.72994,-506.19451 C 780.3158,-506.19451 786.50706,-502.65636 792.76692,-502.65636 C 799.02677,-502.65636 804.26505,-507.48641 805.42179,-509.1879 C 806.57854,-510.88939 805.48972,-511.43347 804.60535,-511.02456 C 803.7203,-510.61634 798.00588,-507.62294 794.60358,-507.62294 z" />
++ <path
++ style="font-size:14px;fill:#73d216"
++ id="path12894"
++ d="M 810.56431,-498.30244 C 806.7042,-498.30244 801.05701,-501.29516 795.55315,-501.29516 C 790.04929,-501.29516 786.7611,-498.30244 786.18918,-497.89354 C 785.61726,-497.48464 785.2593,-495.92103 786.97506,-496.39718 C 788.69081,-496.87332 790.11992,-496.87332 792.8362,-496.87332 C 795.55247,-496.87332 802.05754,-493.33517 808.63323,-493.33517 C 815.20893,-493.33517 820.71347,-498.16524 821.92863,-499.86605 C 823.14379,-501.56754 821.99996,-502.11228 821.07076,-501.70338 C 820.14156,-501.29449 814.13845,-498.30244 810.56431,-498.30244 z" />
++ <path
++ style="font-size:14px;fill:#204a87"
++ id="path12896"
++ d="M 788.35119,-488.01742 C 784.34844,-488.01742 778.49206,-491.25127 772.78442,-491.25127 C 767.07678,-491.25127 763.66633,-488.01742 763.07335,-487.57659 C 762.48037,-487.13577 762.10951,-485.44583 763.88844,-485.96069 C 765.66804,-486.47487 767.15013,-486.47487 769.96694,-486.47487 C 772.78374,-486.47487 779.52993,-482.65348 786.35015,-482.65348 C 793.16971,-482.65348 798.87734,-487.87071 800.13801,-489.70804 C 801.39867,-491.54538 800.21204,-492.13292 799.24821,-491.6921 C 798.28436,-491.25127 792.05779,-488.01742 788.35119,-488.01742 z" />
++ </g>
++ </g>
++</svg>
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/manual/diagrams-pipelines.svg gstreamer-0.10.23/docs/manual/diagrams-pipelines.svg
+--- gstreamer-0.10.23.orig/docs/manual/diagrams-pipelines.svg 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/manual/diagrams-pipelines.svg 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,12725 @@
++<?xml version="1.0" encoding="UTF-8" standalone="no"?>
++<!-- Created with Inkscape (http://www.inkscape.org/) -->
++<svg
++ xmlns:dc="http://purl.org/dc/elements/1.1/"
++ xmlns:cc="http://creativecommons.org/ns#"
++ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
++ xmlns:svg="http://www.w3.org/2000/svg"
++ xmlns="http://www.w3.org/2000/svg"
++ xmlns:xlink="http://www.w3.org/1999/xlink"
++ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
++ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
++ width="744.09448819"
++ height="1052.3622047"
++ id="svg2"
++ sodipodi:version="0.32"
++ inkscape:version="0.46"
++ sodipodi:docname="diagrams-pipelines.svg"
++ inkscape:output_extension="org.inkscape.output.svg.inkscape"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/diagrams-pipelines.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <sodipodi:namedview
++ id="base"
++ pagecolor="#ffffff"
++ bordercolor="#000000"
++ borderopacity="0.61568627"
++ gridtolerance="10000"
++ guidetolerance="10"
++ objecttolerance="10"
++ inkscape:pageopacity="1"
++ inkscape:pageshadow="2"
++ inkscape:zoom="0.60040375"
++ inkscape:cx="256.28906"
++ inkscape:cy="-1317.6843"
++ inkscape:document-units="px"
++ inkscape:current-layer="layer1"
++ showgrid="true"
++ showguides="true"
++ inkscape:guide-bbox="true"
++ inkscape:window-width="1400"
++ inkscape:window-height="1050"
++ inkscape:window-x="0"
++ inkscape:window-y="0"
++ showborder="false"
++ inkscape:showpageshadow="false"
++ borderlayer="false"
++ inkscape:snap-global="true">
++ <inkscape:grid
++ type="xygrid"
++ id="grid5665"
++ visible="false"
++ enabled="false"
++ color="#0000ff"
++ opacity="0.04705882"
++ empcolor="#0000ff"
++ empopacity="0.14901961" />
++ <sodipodi:guide
++ orientation="1,0"
++ position="49.982762,799.72419"
++ id="guide12829" />
++ </sodipodi:namedview>
++ <defs
++ id="defs4">
++ <linearGradient
++ id="linearGradient10080">
++ <stop
++ style="stop-color:#a40000;stop-opacity:0;"
++ offset="0"
++ id="stop10082" />
++ <stop
++ style="stop-color:#a40000;stop-opacity:1;"
++ offset="1"
++ id="stop10084" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient10072">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop10074" />
++ <stop
++ style="stop-color:#ad7fa8;stop-opacity:0;"
++ offset="1"
++ id="stop10076" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3690">
++ <stop
++ style="stop-color:white;stop-opacity:1;"
++ offset="0"
++ id="stop3692" />
++ <stop
++ style="stop-color:white;stop-opacity:0.25098041;"
++ offset="1"
++ id="stop7595" />
++ </linearGradient>
++ <marker
++ style="overflow:visible;"
++ id="Arrow2Mend"
++ refX="0.0"
++ refY="0.0"
++ orient="auto"
++ inkscape:stockid="Arrow2Mend">
++ <path
++ transform="scale(0.6) rotate(180) translate(0,0)"
++ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
++ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
++ id="path3513" />
++ </marker>
++ <marker
++ style="overflow:visible;"
++ id="Arrow2Lend"
++ refX="0.0"
++ refY="0.0"
++ orient="auto"
++ inkscape:stockid="Arrow2Lend">
++ <path
++ transform="scale(1.1) rotate(180) translate(1,0)"
++ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
++ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
++ id="path3507" />
++ </marker>
++ <inkscape:perspective
++ id="perspective10"
++ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
++ inkscape:vp_z="744.09448 : 526.18109 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 526.18109 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <marker
++ style="overflow:visible;"
++ id="Arrow2Mendq"
++ refX="0.0"
++ refY="0.0"
++ orient="auto"
++ inkscape:stockid="Arrow2Mendq">
++ <path
++ transform="scale(0.6) rotate(180) translate(0,0)"
++ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
++ style="stroke-linejoin:round;font-size:12.0;fill-rule:evenodd;stroke:#204a87;stroke-width:0.62500000;fill:#204a87"
++ id="path5832" />
++ </marker>
++ <radialGradient
++ r="17.576654"
++ fy="35.373093"
++ fx="22.930462"
++ cy="35.373093"
++ cx="22.930462"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.333333,2.658463e-16,23.58206)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2252"
++ xlink:href="#linearGradient4946"
++ inkscape:collect="always" />
++ <linearGradient
++ id="linearGradient4182">
++ <stop
++ style="stop-color:#a36d18;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop4184" />
++ <stop
++ style="stop-color:#d79020;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop4186" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4192">
++ <stop
++ style="stop-color:#e9b96e;stop-opacity:1;"
++ offset="0"
++ id="stop4194" />
++ <stop
++ style="stop-color:#f1d19e;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop4196" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4210">
++ <stop
++ style="stop-color:#eaba6f;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop4212" />
++ <stop
++ style="stop-color:#b97a1b;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop4214" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4222">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop4224" />
++ <stop
++ style="stop-color:#ffffff;stop-opacity:0.68639052;"
++ offset="1.0000000"
++ id="stop4226" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient4946">
++ <stop
++ style="stop-color:#000000;stop-opacity:1;"
++ offset="0"
++ id="stop4948" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0;"
++ offset="1"
++ id="stop4950" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4979">
++ <stop
++ style="stop-color:#fbf0e0;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop4981" />
++ <stop
++ style="stop-color:#f0ce99;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop4983" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient4987">
++ <stop
++ style="stop-color:#a0670c;stop-opacity:1;"
++ offset="0"
++ id="stop4989" />
++ <stop
++ style="stop-color:#a0670c;stop-opacity:0;"
++ offset="1"
++ id="stop4991" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4995">
++ <stop
++ style="stop-color:#de9523;stop-opacity:1;"
++ offset="0"
++ id="stop4997" />
++ <stop
++ style="stop-color:#a36d18;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop4999" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2869">
++ <stop
++ id="stop2871"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop2873"
++ offset="1.0000000"
++ style="stop-color:#cccccc;stop-opacity:1.0000000;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2884"
++ inkscape:collect="always">
++ <stop
++ id="stop2886"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop2888"
++ offset="1"
++ style="stop-color:#000000;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient5048">
++ <stop
++ id="stop5050"
++ offset="0"
++ style="stop-color:black;stop-opacity:0;" />
++ <stop
++ style="stop-color:black;stop-opacity:1;"
++ offset="0.5"
++ id="stop5056" />
++ <stop
++ id="stop5052"
++ offset="1"
++ style="stop-color:black;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient5060"
++ inkscape:collect="always">
++ <stop
++ id="stop5062"
++ offset="0"
++ style="stop-color:black;stop-opacity:1;" />
++ <stop
++ id="stop5064"
++ offset="1"
++ style="stop-color:black;stop-opacity:0;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective3711"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <linearGradient
++ y2="39.684914"
++ x2="34.534348"
++ y1="12.284524"
++ x1="14.462892"
++ gradientTransform="matrix(1.241935,0,0,1.241935,-5.027508,-7.208988)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3760"
++ xlink:href="#linearGradient3264"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="matrix(0.200685,0.000000,0.000000,0.200685,-0.585758,-1.050787)"
++ y2="248.6311"
++ x2="153.0005"
++ y1="15.4238"
++ x1="99.7773"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient53551"
++ xlink:href="#aigrd1"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="248.6311"
++ x2="153.0005"
++ y1="15.4238"
++ x1="99.7773"
++ gradientUnits="userSpaceOnUse"
++ id="aigrd1">
++ <stop
++ id="stop53300"
++ style="stop-color:#184375"
++ offset="0" />
++ <stop
++ id="stop53302"
++ style="stop-color:#C8BDDC"
++ offset="1" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2300">
++ <stop
++ style="stop-color:#000000;stop-opacity:0.32673267;"
++ offset="0.0000000"
++ id="stop2302" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0;"
++ offset="1"
++ id="stop2304" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3264">
++ <stop
++ id="stop3266"
++ offset="0"
++ style="stop-color:#c9c9c9;stop-opacity:1;" />
++ <stop
++ style="stop-color:#f8f8f8;stop-opacity:1;"
++ offset="0.25"
++ id="stop3276" />
++ <stop
++ style="stop-color:#e2e2e2;stop-opacity:1;"
++ offset="0.5"
++ id="stop3272" />
++ <stop
++ id="stop3274"
++ offset="0.75"
++ style="stop-color:#b0b0b0;stop-opacity:1;" />
++ <stop
++ id="stop3268"
++ offset="1"
++ style="stop-color:#c9c9c9;stop-opacity:1;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective3815"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <linearGradient
++ id="linearGradient2315"
++ inkscape:collect="always">
++ <stop
++ id="stop2317"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop2319"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2072"
++ inkscape:collect="always">
++ <stop
++ id="stop2074"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop2076"
++ offset="1"
++ style="stop-color:#000000;stop-opacity:0;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective3911"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <linearGradient
++ id="linearGradient7054"
++ inkscape:collect="always">
++ <stop
++ id="stop7056"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop7058"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <radialGradient
++ gradientUnits="userSpaceOnUse"
++ fy="22.6138"
++ fx="9.3418"
++ r="14.1515"
++ cy="22.6138"
++ cx="9.3418"
++ id="aigrd4">
++ <stop
++ id="stop6452"
++ style="stop-color:#767676"
++ offset="0" />
++ <stop
++ id="stop6454"
++ style="stop-color:#484848"
++ offset="1" />
++ </radialGradient>
++ <linearGradient
++ id="linearGradient7069"
++ inkscape:collect="always">
++ <stop
++ id="stop7071"
++ offset="0"
++ style="stop-color:#888a85;stop-opacity:1;" />
++ <stop
++ id="stop7073"
++ offset="1"
++ style="stop-color:#888a85;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7079"
++ inkscape:collect="always">
++ <stop
++ id="stop7081"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop7083"
++ offset="1"
++ style="stop-color:#000000;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7087">
++ <stop
++ id="stop7089"
++ offset="0"
++ style="stop-color:#888a85;stop-opacity:1;" />
++ <stop
++ id="stop7091"
++ offset="1"
++ style="stop-color:#b8b9b6;stop-opacity:1;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7138"
++ inkscape:collect="always">
++ <stop
++ id="stop7140"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop7142"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective3968"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <linearGradient
++ id="linearGradient2245">
++ <stop
++ id="stop2247"
++ offset="0.0000000"
++ style="stop-color:#dde1d9;stop-opacity:1.0000000;" />
++ <stop
++ id="stop2249"
++ offset="1.0000000"
++ style="stop-color:#cacdc6;stop-opacity:1.0000000;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2253">
++ <stop
++ id="stop2255"
++ offset="0.0000000"
++ style="stop-color:#8f8f8f;stop-opacity:1.0000000;" />
++ <stop
++ id="stop2257"
++ offset="1.0000000"
++ style="stop-color:#494949;stop-opacity:1.0000000;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2415"
++ inkscape:collect="always">
++ <stop
++ id="stop2417"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop2419"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2454"
++ inkscape:collect="always">
++ <stop
++ id="stop2456"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop2458"
++ offset="1"
++ style="stop-color:#000000;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2667">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop2669" />
++ <stop
++ style="stop-color:#fcfcff;stop-opacity:0.0000000;"
++ offset="1.0000000"
++ id="stop2671" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2675">
++ <stop
++ style="stop-color:#5b5b97;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop2677" />
++ <stop
++ style="stop-color:#1b1b43;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop2679" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient2683">
++ <stop
++ style="stop-color:#000000;stop-opacity:1;"
++ offset="0"
++ id="stop2685" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0;"
++ offset="1"
++ id="stop2687" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2701">
++ <stop
++ style="stop-color:#585956;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop2703" />
++ <stop
++ style="stop-color:#bbbeb8;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop2705" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2711">
++ <stop
++ style="stop-color:#909090;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop2713" />
++ <stop
++ style="stop-color:#bebebe;stop-opacity:0.0000000;"
++ offset="1.0000000"
++ id="stop2715" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient2321">
++ <stop
++ style="stop-color:#7b7f7a;stop-opacity:1;"
++ offset="0"
++ id="stop2323" />
++ <stop
++ style="stop-color:#7b7f7a;stop-opacity:0;"
++ offset="1"
++ id="stop2325" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2329">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop2331" />
++ <stop
++ style="stop-color:#ffffff;stop-opacity:0.0000000;"
++ offset="1.0000000"
++ id="stop2333" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective4076"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <linearGradient
++ id="linearGradient19149">
++ <stop
++ id="stop19151"
++ offset="0.0000000"
++ style="stop-color:#adadad;stop-opacity:1.0000000;" />
++ <stop
++ id="stop19153"
++ offset="1.0000000"
++ style="stop-color:#747474;stop-opacity:1.0000000;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient19270">
++ <stop
++ style="stop-color:#aaaaaa;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop19272" />
++ <stop
++ style="stop-color:#505050;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop19274" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient19474">
++ <stop
++ id="stop19476"
++ offset="0.0000000"
++ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
++ <stop
++ id="stop19478"
++ offset="1.0000000"
++ style="stop-color:#939393;stop-opacity:1.0000000;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2497">
++ <stop
++ id="stop2499"
++ offset="0.0000000"
++ style="stop-color:#ffffff;stop-opacity:0.60824740;" />
++ <stop
++ id="stop2501"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective4196"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <linearGradient
++ id="linearGradient3340">
++ <stop
++ id="stop3342"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop3344"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0.62886596;" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient2691">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1"
++ offset="0"
++ id="stop2693" />
++ <stop
++ style="stop-color:#d3d7cf"
++ offset="1"
++ id="stop2695" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient5075">
++ <stop
++ id="stop5077"
++ offset="0"
++ style="stop-color:#adb0a8;stop-opacity:1;" />
++ <stop
++ id="stop5079"
++ offset="1"
++ style="stop-color:#464744;stop-opacity:1" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2584">
++ <stop
++ id="stop2586"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop2588"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2684">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop2686" />
++ <stop
++ style="stop-color:#000000;stop-opacity:1;"
++ offset="1"
++ id="stop2688" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective4294"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,186.6949)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2831"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(-4e-4,-26.09426)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2825"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-145.0004,-97.0943)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2806"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(133,70.99999)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2797"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-12,0)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2795"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-12,0)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2793"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2791"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(133,70.99999)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2753"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-12,0)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2751"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2749"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1,0,0,0.536723,-1.44832e-12,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2747"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1,0,0,0.536723,4.579205e-13,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2745"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(133,70.99999)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4441"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-12,0)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2731"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2729"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1,0,0,0.536723,-1.432388e-12,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2727"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1,0,0,0.536723,4.526469e-13,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2725"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,-1.416456e-12,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2139"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,4.473733e-13,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2137"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(133.0000,70.99999)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2124"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-12.00000,0.000000)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2122"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2112"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <linearGradient
++ id="linearGradient8662"
++ inkscape:collect="always">
++ <stop
++ id="stop8664"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop8666"
++ offset="1"
++ style="stop-color:#000000;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3081"
++ inkscape:collect="always">
++ <stop
++ id="stop3083"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop3085"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient2679">
++ <stop
++ style="stop-color:#f7f7f7;stop-opacity:1"
++ offset="0"
++ id="stop2681" />
++ <stop
++ style="stop-color:#ccd0c7;stop-opacity:1"
++ offset="1"
++ id="stop2683" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2697">
++ <stop
++ style="stop-color:#babdb6"
++ offset="0"
++ id="stop2699" />
++ <stop
++ style="stop-color:#555753"
++ offset="1"
++ id="stop2701" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4414">
++ <stop
++ id="stop4416"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop4418"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2817">
++ <stop
++ id="stop2819"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop2821"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0.48453608;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective4408"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="matrix(3.000198,0,0,1,-67.006,-9.426e-2)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3421"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(-4e-4,-9.426e-2)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4655"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="matrix(1,0,0,1.004384,-145.0004,-71.4625)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4653"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,212.6949)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4651"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="105.49083"
++ x2="174.74524"
++ y1="84.263489"
++ x1="174.83363"
++ gradientTransform="matrix(1.103262,0,0,1.054917,-163.1228,-76.31138)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4649"
++ xlink:href="#linearGradient2817"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,186.6949)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4647"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(-4e-4,-26.09426)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4645"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="105.49083"
++ x2="174.74524"
++ y1="84.263489"
++ x1="174.83363"
++ gradientTransform="matrix(1.103262,0,0,1.054917,-163.1228,-76.31138)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4643"
++ xlink:href="#linearGradient2817"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,212.6949)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4641"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-145.0004,-97.0943)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4639"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="matrix(1,0,0,1.004384,-145.0004,-71.4625)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4637"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(-4e-4,-9.426e-2)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4635"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(133,70.99999)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4633"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-12,0)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4631"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-12,0)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4629"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4627"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(133,70.99999)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4625"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-12,0)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4623"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4621"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1,0,0,0.536723,-1.44832e-12,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4619"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1,0,0,0.536723,4.579205e-13,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4617"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(133,70.99999)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4615"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-12,0)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4613"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4611"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1,0,0,0.536723,-1.432388e-12,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4609"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1,0,0,0.536723,4.526469e-13,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4607"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1,0,0,0.536723,-1.416456e-12,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4605"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <radialGradient
++ r="15.644737"
++ fy="36.421127"
++ fx="24.837126"
++ cy="36.421127"
++ cx="24.837126"
++ gradientTransform="matrix(1,0,0,0.536723,4.473733e-13,16.87306)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4603"
++ xlink:href="#linearGradient8662"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="52.510574"
++ x2="14"
++ y1="15.291994"
++ x1="15.089521"
++ gradientTransform="translate(133,70.99999)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4601"
++ xlink:href="#linearGradient3081"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="93.204849"
++ x2="169"
++ y1="110.33805"
++ x1="169"
++ gradientTransform="translate(-12,0)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4599"
++ xlink:href="#linearGradient2697"
++ inkscape:collect="always" />
++ <radialGradient
++ r="11"
++ fy="100.20107"
++ fx="169.77171"
++ cy="100.20107"
++ cx="169.77171"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-42.61165,283.7891)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4597"
++ xlink:href="#linearGradient2679"
++ inkscape:collect="always" />
++ <linearGradient
++ id="linearGradient4573">
++ <stop
++ style="stop-color:#babdb6"
++ offset="0"
++ id="stop4575" />
++ <stop
++ style="stop-color:#555753"
++ offset="1"
++ id="stop4577" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4567">
++ <stop
++ id="stop4569"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop4571"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4561">
++ <stop
++ id="stop4563"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop4565"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0.48453608;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective4558"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <radialGradient
++ r="21.333334"
++ fy="38.807304"
++ fx="26.137741"
++ cy="38.807304"
++ cx="26.137741"
++ gradientTransform="matrix(0.769501,-1.2425,0.6703,0.415141,-21.77857,41.36563)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient23380"
++ xlink:href="#linearGradient3406"
++ inkscape:collect="always" />
++ <radialGradient
++ r="21.333334"
++ fy="23.914305"
++ fx="133.84108"
++ cy="23.914305"
++ cx="133.84108"
++ gradientTransform="matrix(-5.04822e-2,1.387847e-2,-0.12844,-0.467196,35.41257,39.44172)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient23365"
++ xlink:href="#linearGradient3435"
++ inkscape:collect="always" />
++ <radialGradient
++ r="21.333334"
++ fy="21.618015"
++ fx="35.511295"
++ cy="21.618015"
++ cx="35.511295"
++ gradientTransform="matrix(0.105916,-1.91424e-2,0.104789,0.579807,17.13693,7.115158)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient23363"
++ xlink:href="#linearGradient3435"
++ inkscape:collect="always" />
++ <radialGradient
++ r="21.333334"
++ fy="33.377594"
++ fx="16.885271"
++ cy="33.377594"
++ cx="16.885271"
++ gradientTransform="matrix(5.184267e-3,-0.12286,0.544548,2.297824e-2,0.957234,26.30756)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient23361"
++ xlink:href="#linearGradient3435"
++ inkscape:collect="always" />
++ <radialGradient
++ r="21.333334"
++ fy="48.238270"
++ fx="53.556889"
++ cy="48.238270"
++ cx="53.556889"
++ gradientTransform="matrix(0.15845,-0.158988,0.432907,0.431441,-2.723645,15.00107)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient23359"
++ xlink:href="#linearGradient3421"
++ inkscape:collect="always" />
++ <radialGradient
++ r="21.333334"
++ fy="38.807304"
++ fx="26.137741"
++ cy="38.807304"
++ cx="26.137741"
++ gradientTransform="matrix(0.769501,-1.2425,0.6703,0.415141,-21.77857,41.36563)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient23357"
++ xlink:href="#linearGradient3406"
++ inkscape:collect="always" />
++ <radialGradient
++ r="21.333334"
++ fy="27.569166"
++ fx="37.751469"
++ cy="27.569166"
++ cx="37.751469"
++ gradientTransform="matrix(0.848684,0.95802,-0.782119,0.692834,18.69147,-20.52578)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient23355"
++ xlink:href="#linearGradient3394"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="54.698483"
++ x2="48.798885"
++ y1="3.6100161"
++ x1="10.501720"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient23351"
++ xlink:href="#linearGradient6036"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="28.000000"
++ x2="29.000000"
++ y1="14.625000"
++ x1="21.125000"
++ gradientTransform="matrix(1.25,0,0,1.25,-5.652995,-2.604165)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient23349"
++ xlink:href="#linearGradient4236"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="28.000000"
++ x2="29.000000"
++ y1="14.625000"
++ x1="21.125000"
++ gradientTransform="matrix(1.25,0,0,1.25,-5.652995,-2.604165)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient23347"
++ xlink:href="#linearGradient4236"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="14.2033"
++ x2="35.3912"
++ y1="32.4165"
++ x1="12.2744"
++ gradientTransform="matrix(1.190476,0,0,1.190476,-4.224424,-2.500001)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient23345"
++ xlink:href="#aigrd2"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="34.3075"
++ x2="32.511"
++ y1="11.1885"
++ x1="14.9966"
++ gradientTransform="matrix(1.190476,0,0,1.190476,-4.224424,-2.5)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient23343"
++ xlink:href="#aigrd1"
++ inkscape:collect="always" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3406"
++ id="radialGradient3449"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.769501,-1.242500,0.670300,0.415141,-21.77857,41.36563)"
++ cx="26.137741"
++ cy="38.807304"
++ fx="26.137741"
++ fy="38.807304"
++ r="21.333334" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3435"
++ id="radialGradient3447"
++ gradientUnits="userSpaceOnUse"
++ cx="133.84108"
++ cy="23.914305"
++ fx="133.84108"
++ fy="23.914305"
++ r="21.333334"
++ gradientTransform="matrix(-5.048220e-2,1.387847e-2,-0.128440,-0.467196,35.41257,39.44172)" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3435"
++ id="radialGradient3443"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.105916,-1.914240e-2,0.104789,0.579807,17.13693,7.115158)"
++ cx="35.511295"
++ cy="21.618015"
++ fx="35.511295"
++ fy="21.618015"
++ r="21.333334" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3435"
++ id="radialGradient3433"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(5.184267e-3,-0.122860,0.544548,2.297824e-2,0.957234,26.30756)"
++ cx="16.885271"
++ cy="33.377594"
++ fx="16.885271"
++ fy="33.377594"
++ r="21.333334" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3421"
++ id="radialGradient3429"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.158450,-0.158988,0.432907,0.431441,-2.723645,15.00107)"
++ cx="53.556889"
++ cy="48.238270"
++ fx="53.556889"
++ fy="48.238270"
++ r="21.333334" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3394"
++ id="radialGradient3392"
++ cx="37.751469"
++ cy="27.569166"
++ fx="37.751469"
++ fy="27.569166"
++ r="21.333334"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.848684,0.958020,-0.782119,0.692834,18.69147,-20.52578)" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="54.698483"
++ x2="48.798885"
++ y1="3.6100161"
++ x1="10.501720"
++ id="linearGradient6042"
++ xlink:href="#linearGradient6036"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="18.366575"
++ x2="17.742729"
++ y1="31.494707"
++ x1="28.702885"
++ id="linearGradient6034"
++ xlink:href="#linearGradient6028"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="matrix(1.250000,0.000000,0.000000,1.250000,-5.652995,-2.604165)"
++ gradientUnits="userSpaceOnUse"
++ y2="28.000000"
++ x2="29.000000"
++ y1="14.625000"
++ x1="21.125000"
++ id="linearGradient4224"
++ xlink:href="#linearGradient4236"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="matrix(1.250000,0.000000,0.000000,1.250000,-5.652995,-2.604165)"
++ gradientUnits="userSpaceOnUse"
++ y2="28.000000"
++ x2="29.000000"
++ y1="14.625000"
++ x1="21.125000"
++ id="linearGradient4804"
++ xlink:href="#linearGradient4236"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="matrix(1.190476,0.000000,0.000000,1.190476,-4.224424,-2.500000)"
++ y2="34.3075"
++ x2="32.511"
++ y1="11.1885"
++ x1="14.9966"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3912"
++ xlink:href="#aigrd1"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="34.3075"
++ x2="32.511"
++ y1="11.1885"
++ x1="14.9966"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4798">
++ <stop
++ id="stop3034"
++ style="stop-color:#EBEBEB"
++ offset="0" />
++ <stop
++ id="stop3036"
++ style="stop-color:#FFFFFF"
++ offset="0.5" />
++ <stop
++ id="stop3038"
++ style="stop-color:#EBEBEB"
++ offset="1" />
++ </linearGradient>
++ <linearGradient
++ y2="14.2033"
++ x2="35.3912"
++ y1="32.4165"
++ x1="12.2744"
++ gradientUnits="userSpaceOnUse"
++ id="aigrd2">
++ <stop
++ id="stop3043"
++ style="stop-color:#FBFBFB"
++ offset="0" />
++ <stop
++ id="stop3045"
++ style="stop-color:#B6B6B6"
++ offset="0.5" />
++ <stop
++ id="stop3047"
++ style="stop-color:#E4E4E4"
++ offset="1" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4236">
++ <stop
++ id="stop4238"
++ offset="0.0000000"
++ style="stop-color:#ffffff;stop-opacity:0.32673267;" />
++ <stop
++ id="stop4240"
++ offset="1.0000000"
++ style="stop-color:#ffffff;stop-opacity:0.60396039;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient6028"
++ inkscape:collect="always">
++ <stop
++ id="stop6030"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop6032"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient6036"
++ inkscape:collect="always">
++ <stop
++ id="stop6038"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop6040"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3394"
++ gradientUnits="userSpaceOnUse"
++ x1="12.2744"
++ y1="32.4165"
++ x2="35.3912"
++ y2="14.2033">
++ <stop
++ offset="0.0000000"
++ style="stop-color:#fff307;stop-opacity:1.0000000;"
++ id="stop3396" />
++ <stop
++ offset="0.50000000"
++ style="stop-color:#166eff;stop-opacity:1.0000000;"
++ id="stop3398" />
++ <stop
++ offset="1.0000000"
++ style="stop-color:#ffffff;stop-opacity:0.0000000;"
++ id="stop3400" />
++ </linearGradient>
++ <linearGradient
++ y2="14.2033"
++ x2="35.3912"
++ y1="32.4165"
++ x1="12.2744"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3406">
++ <stop
++ id="stop3408"
++ style="stop-color:#b307ff;stop-opacity:0.82178217;"
++ offset="0.0000000" />
++ <stop
++ id="stop3410"
++ style="stop-color:#f0ff8b;stop-opacity:0.64356434;"
++ offset="1.0000000" />
++ <stop
++ id="stop3412"
++ style="stop-color:#ffffff;stop-opacity:0.0000000;"
++ offset="1.0000000" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4773"
++ gradientUnits="userSpaceOnUse"
++ x1="12.2744"
++ y1="32.4165"
++ x2="35.3912"
++ y2="14.2033">
++ <stop
++ offset="0.0000000"
++ style="stop-color:#ffffff;stop-opacity:1.0000000;"
++ id="stop3423" />
++ <stop
++ offset="1.0000000"
++ style="stop-color:#b8c04c;stop-opacity:0.0000000;"
++ id="stop3427" />
++ </linearGradient>
++ <linearGradient
++ y2="14.2033"
++ x2="35.3912"
++ y1="32.4165"
++ x1="12.2744"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3435">
++ <stop
++ id="stop3437"
++ style="stop-color:#ffffc8;stop-opacity:1.0000000;"
++ offset="0.0000000" />
++ <stop
++ id="stop3439"
++ style="stop-color:#9a91ef;stop-opacity:0.0000000;"
++ offset="1.0000000" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient23419"
++ inkscape:collect="always">
++ <stop
++ id="stop23421"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop23423"
++ offset="1"
++ style="stop-color:#000000;stop-opacity:0;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective4764"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4768"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4706"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4644"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4582"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4520"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-138.39033"
++ x2="249.82786"
++ y1="-138.39033"
++ x1="247.10906"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4458"
++ xlink:href="#linearGradient4227"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-211.44472"
++ x2="-454.32587"
++ y1="-207.90897"
++ x1="-450.47763"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4456"
++ xlink:href="#linearGradient3066"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-138.39033"
++ x2="249.82786"
++ y1="-138.39033"
++ x1="247.10906"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4454"
++ xlink:href="#linearGradient4227"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-209.19533"
++ x2="-450.64621"
++ y1="-212.70671"
++ x1="-454.62939"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4450"
++ xlink:href="#linearGradient3056"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(-17.08724,-55.72628)"
++ y2="-80.599586"
++ x2="-284.24194"
++ y1="-77.512611"
++ x1="-284.96951"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4448"
++ xlink:href="#linearGradient4275"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(-17.01418,-55.70393)"
++ y2="-192.71288"
++ x2="189.64017"
++ y1="-188.64658"
++ x1="191.13173"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4446"
++ xlink:href="#linearGradient4267"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-244.87511"
++ x2="-451.31165"
++ y1="-244.17062"
++ x1="-456.22388"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4444"
++ xlink:href="#linearGradient4141"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-197.33253"
++ x2="-452.35226"
++ y1="-206.95709"
++ x1="-458.00912"
++ gradientTransform="matrix(0.797456,0.000000,0.000000,0.742875,609.5472,-38.75752)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4442"
++ xlink:href="#linearGradient19198"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-204.17659"
++ x2="-443.46924"
++ y1="-216.85661"
++ x1="-462.03079"
++ gradientTransform="matrix(0.799360,0.000000,0.000000,0.747188,610.4265,-37.86474)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4440"
++ xlink:href="#linearGradient19198"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,3.345547e-14,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4438"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="matrix(0.859423,0.000000,0.000000,0.632454,35.00386,-46.28636)"
++ gradientUnits="userSpaceOnUse"
++ y2="-125.99247"
++ x2="248.41544"
++ y1="-124.22470"
++ x1="248.41544"
++ id="linearGradient4313"
++ xlink:href="#linearGradient4307"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="-80.599586"
++ x2="-284.24194"
++ y1="-77.512611"
++ x1="-284.96951"
++ id="linearGradient4281"
++ xlink:href="#linearGradient4275"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="-192.71288"
++ x2="189.64017"
++ y1="-188.64658"
++ x1="191.13173"
++ id="linearGradient4273"
++ xlink:href="#linearGradient4267"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="matrix(0.858948,0.000000,0.000000,0.586269,35.05258,-52.07290)"
++ gradientUnits="userSpaceOnUse"
++ y2="-128.60747"
++ x2="248.86223"
++ y1="-124.09965"
++ x1="248.84767"
++ id="linearGradient4249"
++ xlink:href="#linearGradient4243"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="-138.39033"
++ x2="249.82786"
++ y1="-138.39033"
++ x1="247.10906"
++ id="linearGradient4233"
++ xlink:href="#linearGradient4227"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-204.17659"
++ x2="-443.46924"
++ y1="-216.85661"
++ x1="-462.03079"
++ gradientTransform="matrix(0.799360,0.000000,0.000000,0.747188,610.4265,19.13255)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4197"
++ xlink:href="#linearGradient19198"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="-244.87511"
++ x2="-451.31165"
++ y1="-244.17062"
++ x1="-456.22388"
++ id="linearGradient4147"
++ xlink:href="#linearGradient4141"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-211.44472"
++ x2="-454.32587"
++ y1="-207.90897"
++ x1="-450.47763"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4023"
++ xlink:href="#linearGradient3066"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-209.19533"
++ x2="-450.64621"
++ y1="-212.70671"
++ x1="-454.62939"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4021"
++ xlink:href="#linearGradient3056"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-197.33253"
++ x2="-452.35226"
++ y1="-206.95709"
++ x1="-458.00912"
++ gradientTransform="matrix(0.797456,0.000000,0.000000,0.742875,609.5472,18.23977)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3959"
++ xlink:href="#linearGradient19198"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.761407e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3883"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.933907e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3811"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(0.999362,0.000000,0.000000,1.000477,114.0171,-227.0066)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3743"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.534089e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3741"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.910037e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3668"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="65.832352"
++ x2="-20.240932"
++ y1="75.510872"
++ x1="-13.656000"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3613"
++ xlink:href="#linearGradient8929"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(0.832553,0.000000,0.000000,0.998481,60.42500,-226.9769)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3611"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.803027e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3609"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(0.832553,0.000000,0.000000,0.998481,60.43196,-170.0018)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3555"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4254"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4192"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4130"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4068"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4006"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4004"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-12.425205"
++ x2="203.62500"
++ y1="-52.362705"
++ x1="181.02138"
++ gradientTransform="translate(55.95575,-56.98763)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4002"
++ xlink:href="#linearGradient3554"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-5.760179e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient4000"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(-4.428612e-2,-56.98763)"
++ y2="-12.425205"
++ x2="203.62500"
++ y1="-52.362705"
++ x1="181.02138"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3998"
++ xlink:href="#linearGradient3554"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-5.166383e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3996"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3994"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(1.387332,0.000000,0.000000,1.024650,103.3564,-114.0644)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3992"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.931222e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3990"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3988"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(1.387332,0.000000,0.000000,1.024650,47.34591,-114.0767)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3986"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.287676e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3984"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3708"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3704"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(56.00000,5.450779e-7)"
++ y2="-12.425205"
++ x2="203.62500"
++ y1="-52.362705"
++ x1="181.02138"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3632"
++ xlink:href="#linearGradient3554"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.971920e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3630"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="-12.425205"
++ x2="203.62500"
++ y1="-52.362705"
++ x1="181.02138"
++ id="linearGradient3560"
++ xlink:href="#linearGradient3554"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.534909e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2808"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2791"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(1.387332,0.000000,0.000000,1.024650,103.4007,-57.07667)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2789"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.400433e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2787"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient5738"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2971"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2950"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2904"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient2902"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient5732"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-5.153249e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient10291"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient10289"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient10287"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(1.211805,0.000000,0.000000,0.895257,49.69408,-224.5271)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient10285"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient10283"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient10281"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-9.0610695"
++ x2="-295.32266"
++ y1="-53.248569"
++ x1="-321.33310"
++ gradientTransform="matrix(0.789519,0.000000,0.000000,0.818328,492.2076,-177.7888)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient10279"
++ xlink:href="#linearGradient13288"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-9.0610695"
++ x2="-295.32266"
++ y1="-53.248569"
++ x1="-321.33310"
++ gradientTransform="matrix(0.789519,0.000000,0.000000,0.818328,434.9184,-176.8611)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient10277"
++ xlink:href="#linearGradient13288"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(1.211805,0.000000,0.000000,0.895257,108.0729,-224.5881)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient10275"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-5.216754e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient10273"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.047104e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient10271"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-3.136389e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient10269"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-5.095240e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9967"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9965"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9963"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(1.211805,0.000000,0.000000,0.895257,49.69405,-167.9586)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9961"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9959"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9957"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-9.0610695"
++ x2="-295.32266"
++ y1="-53.248569"
++ x1="-321.33310"
++ gradientTransform="matrix(0.789519,0.000000,0.000000,0.818328,492.2075,-121.2203)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9955"
++ xlink:href="#linearGradient13288"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-9.0610695"
++ x2="-295.32266"
++ y1="-53.248569"
++ x1="-321.33310"
++ gradientTransform="matrix(0.789519,0.000000,0.000000,0.818328,434.9183,-120.2926)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9953"
++ xlink:href="#linearGradient13288"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(1.211805,0.000000,0.000000,0.895257,108.0728,-168.0196)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9951"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-5.255944e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9949"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.010258e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9947"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-3.407561e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9945"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9319"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,457.0698,-40.47841)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9317"
++ xlink:href="#linearGradient7774"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9315"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,422.1275,-16.07031)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9313"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9311"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.323062e-12,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9309"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9307"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,289.0697,-40.47841)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9305"
++ xlink:href="#linearGradient7145"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9303"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,254.1274,-16.07031)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9301"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9299"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.071482e-12,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9297"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9295"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,233.0697,-40.47841)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9293"
++ xlink:href="#linearGradient7744"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9291"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,198.1274,-16.07031)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9289"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9287"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.001522e-12,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9285"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9283"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,345.0108,-40.47841)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9281"
++ xlink:href="#linearGradient7754"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9279"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,310.0685,-16.07031)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9277"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9275"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.170967e-12,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9273"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9271"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,401.0697,-40.47841)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9269"
++ xlink:href="#linearGradient7764"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9267"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,366.1274,-16.07031)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9265"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9263"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.242582e-12,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient9261"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8609"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8547"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8423"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8284"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8272"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8264"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8254"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8240"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8182"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,457.0350,71.55046)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8180"
++ xlink:href="#linearGradient7774"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8178"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,422.0927,95.95860)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8176"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.178954e-12,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8174"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8172"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,177.0485,15.55046)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8170"
++ xlink:href="#linearGradient7145"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8168"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,142.1062,39.95860)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8166"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.043081e-12,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8164"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8162"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,177.0606,15.55050)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8160"
++ xlink:href="#linearGradient7744"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8158"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,142.1183,39.95864)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8156"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-9.635224e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8154"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8142"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,401.0349,71.55046)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8140"
++ xlink:href="#linearGradient7764"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8138"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,366.0926,95.95860)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient8136"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.113686e-12,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient8134"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7741"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,457.0696,15.53428)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7739"
++ xlink:href="#linearGradient7774"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7737"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,422.1273,39.94242)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7735"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-9.211314e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient7733"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7660"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,289.0695,15.53428)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7658"
++ xlink:href="#linearGradient7145"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7656"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,254.1272,39.94242)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7654"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-8.872973e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient7652"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7580"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,233.0695,15.53428)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7578"
++ xlink:href="#linearGradient7744"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7576"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,198.1272,39.94242)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7574"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-8.809240e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient7572"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7496"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,345.0106,15.53428)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7494"
++ xlink:href="#linearGradient7754"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7492"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,310.0683,39.94242)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7490"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-8.561348e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient7488"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7396"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-8.900868e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient7095"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.730619,0.000000,0.000000,0.767032,401.0695,15.53428)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7067"
++ xlink:href="#linearGradient7764"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(1.387332,0.000000,0.000000,1.024650,47.39016,-57.08899)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7055"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.102685e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient7053"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7035"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,1.830093e-14,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient7013"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.743403,0.000000,0.000000,0.776658,366.1272,39.94242)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7003"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="65.832352"
++ x2="-20.240932"
++ y1="75.510872"
++ x1="-13.656000"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient6973"
++ xlink:href="#linearGradient8929"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.661058e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient6961"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient5125"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient5069"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient5013"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="47.416740"
++ x2="41.189976"
++ y1="20.934155"
++ x1="22.125528"
++ id="linearGradient4120"
++ xlink:href="#linearGradient4114"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4104"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4064"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient4013"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3973"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3907"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-2.861537e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3905"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3837"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3585"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3569"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3553"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3537"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3521"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3244"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(1.708228,0.000000,0.000000,1.262004,-416.4526,-251.8586)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3242"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-3.691986e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3238"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3043"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3037"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3384"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-9.0610695"
++ x2="-295.32266"
++ y1="-53.248569"
++ x1="-321.33310"
++ gradientTransform="matrix(1.112950,0.000000,0.000000,1.153561,34.16656,-110.5454)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3379"
++ xlink:href="#linearGradient13288"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-3.588875e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient3377"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="118.12593"
++ x2="-252.29054"
++ y1="115.78169"
++ x1="-252.16348"
++ gradientTransform="translate(520.1691,-142.8933)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3098"
++ xlink:href="#linearGradient3088"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(-5.539766,-1.997629)"
++ gradientUnits="userSpaceOnUse"
++ y2="117.83466"
++ x2="-251.20390"
++ y1="115.17856"
++ x1="-252.81038"
++ id="linearGradient3094"
++ xlink:href="#linearGradient3088"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="-211.44472"
++ x2="-454.32587"
++ y1="-207.90897"
++ x1="-450.47763"
++ id="linearGradient3072"
++ xlink:href="#linearGradient3066"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="-209.19533"
++ x2="-450.64621"
++ y1="-212.70671"
++ x1="-454.62939"
++ id="linearGradient3062"
++ xlink:href="#linearGradient3056"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(-8.005056e-2,9.090695)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25468"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(-8.007488e-2,5.926971)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25466"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(9.437144e-6,2.923441)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25464"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25462"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(-8.005056e-2,9.090695)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25460"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(-8.007488e-2,5.926971)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25458"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(9.437144e-6,2.923441)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25456"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25454"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(-8.005056e-2,9.090695)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25442"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(-8.007488e-2,5.926971)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25440"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(9.437144e-6,2.923441)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25438"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25436"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(-8.005056e-2,9.090695)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25414"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientTransform="translate(-8.007488e-2,5.926971)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25410"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(9.437144e-6,2.923441)"
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25406"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="50.082451"
++ x2="-290.78210"
++ y1="48.080093"
++ x1="-290.94226"
++ id="linearGradient25402"
++ xlink:href="#linearGradient25396"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(18.38478,-0.707107)"
++ gradientUnits="userSpaceOnUse"
++ y2="61.900581"
++ x2="-285.35447"
++ y1="61.900581"
++ x1="-295.45397"
++ id="linearGradient25376"
++ xlink:href="#linearGradient25370"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25364"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25360"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25356"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient25352"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="8.6301003"
++ x2="-215.08304"
++ y1="16.861975"
++ x1="-210.71640"
++ id="linearGradient25348"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(18.38478,-0.707107)"
++ gradientUnits="userSpaceOnUse"
++ y2="49.294865"
++ x2="-281.19888"
++ y1="32.677853"
++ x1="-300.04407"
++ id="linearGradient24585"
++ xlink:href="#linearGradient24579"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient23851"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient23841"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-2.243418e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient22201"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="-243.47842"
++ x2="-452.14810"
++ y1="-246.35371"
++ x1="-454.64041"
++ id="linearGradient20001"
++ xlink:href="#linearGradient19995"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(180.6394,255.6313)"
++ gradientUnits="userSpaceOnUse"
++ y2="-197.33253"
++ x2="-452.35226"
++ y1="-206.95709"
++ x1="-458.00912"
++ id="linearGradient19206"
++ xlink:href="#linearGradient19198"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(180.6394,255.6313)"
++ gradientUnits="userSpaceOnUse"
++ y2="-204.17659"
++ x2="-443.46924"
++ y1="-216.85661"
++ x1="-462.03079"
++ id="linearGradient19204"
++ xlink:href="#linearGradient19198"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-4.098049e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient16071"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="-9.0610695"
++ x2="-295.32266"
++ y1="-53.248569"
++ x1="-321.33310"
++ gradientTransform="matrix(1.112950,0.000000,0.000000,1.153561,33.12280,-184.0356)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient15909"
++ xlink:href="#linearGradient13288"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-3.076646e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient15907"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-3.676858e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient15487"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-3.068595e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient15483"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="matrix(1.112950,0.000000,0.000000,1.153561,13.71255,-110.5632)"
++ gradientUnits="userSpaceOnUse"
++ y2="-9.0610695"
++ x2="-295.32266"
++ y1="-53.248569"
++ x1="-321.33310"
++ id="linearGradient13294"
++ xlink:href="#linearGradient13288"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.991819e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient12537"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient12535"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.775165,0.000000,0.000000,0.779522,-208.4779,-67.34494)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient12361"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.752486,0.000000,0.000000,0.764968,-173.9653,-91.86330)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient12359"
++ xlink:href="#linearGradient5453"
++ inkscape:collect="always" />
++ <radialGradient
++ r="3.2040777"
++ fy="8.7893066"
++ fx="-215.24026"
++ cy="8.7893066"
++ cx="-215.24026"
++ gradientTransform="matrix(1.087839,0.843258,-0.612654,0.790351,24.29137,183.3457)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient12357"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <radialGradient
++ r="12.687500"
++ fy="-19.562500"
++ fx="-164.31250"
++ cy="-19.562500"
++ cx="-164.31250"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.339901,3.245406e-14,-12.91318)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient12355"
++ xlink:href="#linearGradient8734"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.775165,0.000000,0.000000,0.779522,-117.5223,-65.96566)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient11535"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.752486,0.000000,0.000000,0.764968,-83.00982,-90.48401)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient11533"
++ xlink:href="#linearGradient5453"
++ inkscape:collect="always" />
++ <radialGradient
++ r="3.2040777"
++ fy="8.7893066"
++ fx="-215.24026"
++ cy="8.7893066"
++ cx="-215.24026"
++ gradientTransform="matrix(1.087839,0.843258,-0.612654,0.790351,24.29137,183.3457)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient11531"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <radialGradient
++ r="12.687500"
++ fy="-19.562500"
++ fx="-164.31250"
++ cy="-19.562500"
++ cx="-164.31250"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.339901,1.451487e-14,-12.91318)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient11529"
++ xlink:href="#linearGradient8734"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.775165,0.000000,0.000000,0.779522,-69.84306,-65.69002)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient11435"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.752486,0.000000,0.000000,0.764968,-35.33052,-90.20845)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient11433"
++ xlink:href="#linearGradient5453"
++ inkscape:collect="always" />
++ <radialGradient
++ r="3.2040777"
++ fy="8.7893066"
++ fx="-215.24026"
++ cy="8.7893066"
++ cx="-215.24026"
++ gradientTransform="matrix(1.087839,0.843258,-0.612654,0.790351,24.29137,183.3457)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient11431"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <radialGradient
++ r="12.687500"
++ fy="-19.562500"
++ fx="-164.31250"
++ cy="-19.562500"
++ cx="-164.31250"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.339901,3.266919e-14,-12.91318)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient11429"
++ xlink:href="#linearGradient8734"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.764215,0.000000,0.000000,0.779522,-255.4007,-67.36425)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient11335"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.748646,0.000000,0.000000,0.764968,-219.9909,-91.99309)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient11333"
++ xlink:href="#linearGradient5453"
++ inkscape:collect="always" />
++ <radialGradient
++ r="12.687500"
++ fy="-19.562500"
++ fx="-164.31250"
++ cy="-19.562500"
++ cx="-164.31250"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.339901,1.952605e-14,-12.91318)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient11329"
++ xlink:href="#linearGradient8734"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient11327"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="31.094299"
++ x2="-132.63971"
++ y1="-46.437500"
++ x1="-171.66670"
++ gradientTransform="matrix(0.775165,0.000000,0.000000,0.779522,-164.2093,-66.79265)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient11235"
++ xlink:href="#linearGradient10924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="9.7278442"
++ x2="-194.25365"
++ y1="9.7278442"
++ x1="-223.18059"
++ spreadMethod="pad"
++ gradientTransform="matrix(0.752486,0.000000,0.000000,0.764968,-129.6967,-91.31101)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient11233"
++ xlink:href="#linearGradient5453"
++ inkscape:collect="always" />
++ <radialGradient
++ r="3.2040777"
++ fy="8.7893066"
++ fx="-215.24026"
++ cy="8.7893066"
++ cx="-215.24026"
++ gradientTransform="matrix(1.087839,0.843258,-0.612654,0.790351,24.29137,183.3457)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient11231"
++ xlink:href="#linearGradient5485"
++ inkscape:collect="always" />
++ <radialGradient
++ r="12.687500"
++ fy="-19.562500"
++ fx="-164.31250"
++ cy="-19.562500"
++ cx="-164.31250"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.339901,4.030109e-14,-12.91318)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient11229"
++ xlink:href="#linearGradient8734"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,-1.382391e-13,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2170"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <radialGradient
++ r="2.1875000"
++ fy="37.354755"
++ fx="10.268794"
++ cy="37.354755"
++ cx="10.268794"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2166"
++ xlink:href="#linearGradient2924"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="68.130447"
++ x2="-14.875132"
++ y1="68.130447"
++ x1="-22.822500"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9778"
++ xlink:href="#linearGradient8943"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="65.832352"
++ x2="-20.240932"
++ y1="75.510872"
++ x1="-13.656000"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9776"
++ xlink:href="#linearGradient8929"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(0.783486,0.000000,0.000000,1.000000,-36.97870,52.75248)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient9751"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="68.130447"
++ x2="-14.875132"
++ y1="68.130447"
++ x1="-22.822500"
++ id="linearGradient8949"
++ xlink:href="#linearGradient8943"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="65.832352"
++ x2="-20.240932"
++ y1="75.510872"
++ x1="-13.656000"
++ id="linearGradient8937"
++ xlink:href="#linearGradient8929"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(0.783486,0.000000,0.000000,1.000000,-36.97870,52.75248)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7335"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientTransform="matrix(1.708228,0.000000,0.000000,1.262004,-416.3836,-178.7204)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient7271"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <linearGradient
++ id="linearGradient2392">
++ <stop
++ id="stop2394"
++ offset="0.0000000"
++ style="stop-color:#715b26;stop-opacity:1.0000000;" />
++ <stop
++ id="stop2396"
++ offset="1.0000000"
++ style="stop-color:#312710;stop-opacity:1.0000000;" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient12129">
++ <stop
++ style="stop-color:#000000;stop-opacity:1;"
++ offset="0"
++ id="stop12131" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0;"
++ offset="1"
++ id="stop12133" />
++ </linearGradient>
++ <linearGradient
++ style="stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
++ y2="36.0328"
++ x2="31.0813"
++ y1="3.7319"
++ x1="12.4873"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient5510">
++ <stop
++ id="stop16177"
++ style="stop-color:#D2D2D2;stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
++ offset="0" />
++ <stop
++ id="stop16179"
++ style="stop-color:#EDEDED;stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
++ offset="1" />
++ </linearGradient>
++ <linearGradient
++ style="stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
++ y2="22.5769"
++ x2="21.9168"
++ y1="30.3413"
++ x1="21.877"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient5506">
++ <stop
++ id="stop16184"
++ style="stop-color:#5e4f07;stop-opacity:1.0000000;"
++ offset="0.0000000" />
++ <stop
++ id="stop16186"
++ style="stop-color:#348a31;stop-opacity:1.0000000;"
++ offset="1.0000000" />
++ </linearGradient>
++ <linearGradient
++ style="stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
++ y2="7.1091"
++ x2="21.9326"
++ y1="24.6274"
++ x1="21.9326"
++ gradientUnits="userSpaceOnUse"
++ id="aigrd3">
++ <stop
++ id="stop16199"
++ style="stop-color:#D0D6E5;stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
++ offset="0" />
++ <stop
++ id="stop16201"
++ style="stop-color:#093A80;stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667"
++ offset="1" />
++ </linearGradient>
++ <linearGradient
++ gradientTransform="matrix(1.098989,0.000000,0.000000,1.106697,2.774881e-2,1.968146)"
++ inkscape:collect="always"
++ xlink:href="#aigrd3"
++ id="linearGradient16270"
++ gradientUnits="userSpaceOnUse"
++ x1="21.9326"
++ y1="24.6274"
++ x2="21.9326"
++ y2="7.1091" />
++ <linearGradient
++ gradientTransform="matrix(1.110455,0.000000,0.000000,1.118244,-0.223961,1.617860)"
++ inkscape:collect="always"
++ xlink:href="#aigrd2"
++ id="linearGradient16277"
++ gradientUnits="userSpaceOnUse"
++ x1="21.877"
++ y1="30.3413"
++ x2="21.9168"
++ y2="22.5769" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#aigrd1"
++ id="linearGradient16280"
++ gradientUnits="userSpaceOnUse"
++ x1="12.4873"
++ y1="3.7319"
++ x2="31.0813"
++ y2="36.0328"
++ gradientTransform="matrix(1.211383,0.000000,0.000000,1.211383,-2.021434,0.172946)" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient12129"
++ id="radialGradient12135"
++ cx="24.218407"
++ cy="41.636040"
++ fx="24.218407"
++ fy="41.636040"
++ r="22.097088"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.184000,0.000000,33.97501)"
++ gradientUnits="userSpaceOnUse" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="27.352215"
++ x2="27.238144"
++ y1="20.227215"
++ x1="27.308506"
++ id="linearGradient2398"
++ xlink:href="#linearGradient2392"
++ inkscape:collect="always" />
++ <radialGradient
++ r="13.474453"
++ fy="45.153286"
++ fx="30.428225"
++ cy="45.153286"
++ cx="30.428225"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.201878,3.921342e-15,36.03783)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient2939"
++ xlink:href="#linearGradient5919"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(-403.4554,13.05442)"
++ y2="42.185024"
++ x2="28.011971"
++ y1="4.9350243"
++ x1="23.505463"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient12304"
++ xlink:href="#linearGradient9203"
++ inkscape:collect="always" />
++ <radialGradient
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.715328,-1.262878e-15,11.95620)"
++ r="8.5625000"
++ fy="42.000000"
++ fx="25.812500"
++ cy="42.000000"
++ cx="25.812500"
++ id="radialGradient4232"
++ xlink:href="#linearGradient4226"
++ inkscape:collect="always" />
++ <linearGradient
++ id="linearGradient4226"
++ inkscape:collect="always">
++ <stop
++ id="stop4228"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop4230"
++ offset="1"
++ style="stop-color:#000000;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2248">
++ <stop
++ id="stop2250"
++ offset="0"
++ style="stop-color:#c0c0c0;stop-opacity:1;" />
++ <stop
++ id="stop2252"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:1.0000000" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient6962">
++ <stop
++ id="stop6964"
++ offset="0"
++ style="stop-color:#717171;stop-opacity:1.0000000" />
++ <stop
++ id="stop6966"
++ offset="1"
++ style="stop-color:#838383;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient9203">
++ <stop
++ id="stop9205"
++ offset="0"
++ style="stop-color:#f9f9f9;stop-opacity:1;" />
++ <stop
++ id="stop9207"
++ offset="1.0000000"
++ style="stop-color:#f2f2f2;stop-opacity:1.0000000;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient5919"
++ inkscape:collect="always">
++ <stop
++ id="stop5921"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop5923"
++ offset="1"
++ style="stop-color:#000000;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2924"
++ inkscape:collect="always">
++ <stop
++ id="stop2926"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop2928"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient8929"
++ inkscape:collect="always">
++ <stop
++ id="stop8931"
++ offset="0"
++ style="stop-color:#d9dadc;stop-opacity:1;" />
++ <stop
++ id="stop8933"
++ offset="1"
++ style="stop-color:#d9dadc;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient8943"
++ inkscape:collect="always">
++ <stop
++ id="stop8945"
++ offset="0"
++ style="stop-color:#bebebe;stop-opacity:1;" />
++ <stop
++ id="stop8947"
++ offset="1"
++ style="stop-color:#bebebe;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient5453">
++ <stop
++ id="stop5455"
++ offset="0.0000000"
++ style="stop-color:#0a0000;stop-opacity:0.58762884;" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0.0000000;"
++ offset="0.10000000"
++ id="stop5461" />
++ <stop
++ id="stop5465"
++ offset="0.88000000"
++ style="stop-color:#000000;stop-opacity:0.0000000;" />
++ <stop
++ id="stop5457"
++ offset="1.0000000"
++ style="stop-color:#0a0000;stop-opacity:0.58823532;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient5485"
++ inkscape:collect="always">
++ <stop
++ id="stop5487"
++ offset="0"
++ style="stop-color:#dddddd;stop-opacity:1;" />
++ <stop
++ id="stop5489"
++ offset="1"
++ style="stop-color:#dddddd;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient8734"
++ inkscape:collect="always">
++ <stop
++ id="stop8736"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop8738"
++ offset="1"
++ style="stop-color:#000000;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient10924"
++ inkscape:collect="always">
++ <stop
++ id="stop10926"
++ offset="0"
++ style="stop-color:#efefef;stop-opacity:1;" />
++ <stop
++ id="stop10928"
++ offset="1"
++ style="stop-color:#efefef;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient10936">
++ <stop
++ id="stop10938"
++ offset="0"
++ style="stop-color:#2d589b;stop-opacity:1;" />
++ <stop
++ id="stop10940"
++ offset="1.0000000"
++ style="stop-color:#e3ebf7;stop-opacity:1.0000000;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient13288"
++ inkscape:collect="always">
++ <stop
++ id="stop13290"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop13292"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient19198"
++ inkscape:collect="always">
++ <stop
++ id="stop19200"
++ offset="0"
++ style="stop-color:#d6d6d4;stop-opacity:1;" />
++ <stop
++ id="stop19202"
++ offset="1"
++ style="stop-color:#d6d6d4;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient19995"
++ inkscape:collect="always">
++ <stop
++ id="stop19997"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop19999"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient24579"
++ inkscape:collect="always">
++ <stop
++ id="stop24581"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop24583"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient25370"
++ inkscape:collect="always">
++ <stop
++ id="stop25372"
++ offset="0"
++ style="stop-color:#929292;stop-opacity:1;" />
++ <stop
++ id="stop25374"
++ offset="1"
++ style="stop-color:#929292;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient25396"
++ inkscape:collect="always">
++ <stop
++ id="stop25398"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop25400"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3056"
++ inkscape:collect="always">
++ <stop
++ id="stop3058"
++ offset="0"
++ style="stop-color:#8d8d8d;stop-opacity:1;" />
++ <stop
++ id="stop3060"
++ offset="1"
++ style="stop-color:#8d8d8d;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3066"
++ inkscape:collect="always">
++ <stop
++ id="stop3068"
++ offset="0"
++ style="stop-color:#8d8d8d;stop-opacity:1;" />
++ <stop
++ id="stop3070"
++ offset="1"
++ style="stop-color:#8d8d8d;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3088"
++ inkscape:collect="always">
++ <stop
++ id="stop3090"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop3092"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4114"
++ inkscape:collect="always">
++ <stop
++ id="stop4116"
++ offset="0"
++ style="stop-color:#aaaaaa;stop-opacity:1;" />
++ <stop
++ id="stop4118"
++ offset="1"
++ style="stop-color:#aaaaaa;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7145">
++ <stop
++ style="stop-color:#8f5902;stop-opacity:1.0000000"
++ offset="0.0000000"
++ id="stop7147" />
++ <stop
++ id="stop7149"
++ offset="0.10000000"
++ style="stop-color:#000000;stop-opacity:0.0000000;" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0.0000000;"
++ offset="0.88000000"
++ id="stop7151" />
++ <stop
++ style="stop-color:#8f5902;stop-opacity:1.0000000"
++ offset="1.0000000"
++ id="stop7153" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7155">
++ <stop
++ style="stop-color:#204a87;stop-opacity:1.0000000"
++ offset="0.0000000"
++ id="stop7157" />
++ <stop
++ id="stop7159"
++ offset="0.10000000"
++ style="stop-color:#000000;stop-opacity:0.0000000;" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0.0000000;"
++ offset="0.88000000"
++ id="stop7161" />
++ <stop
++ style="stop-color:#204a87;stop-opacity:1.0000000"
++ offset="1.0000000"
++ id="stop7163" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7165">
++ <stop
++ style="stop-color:#a40000;stop-opacity:1.0000000"
++ offset="0.0000000"
++ id="stop7167" />
++ <stop
++ id="stop7169"
++ offset="0.10000000"
++ style="stop-color:#000000;stop-opacity:0.0000000;" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0.0000000;"
++ offset="0.88000000"
++ id="stop7171" />
++ <stop
++ style="stop-color:#a40000;stop-opacity:1.0000000"
++ offset="1.0000000"
++ id="stop7173" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7175">
++ <stop
++ style="stop-color:#727e0a;stop-opacity:1.0000000"
++ offset="0.0000000"
++ id="stop7177" />
++ <stop
++ id="stop7179"
++ offset="0.10000000"
++ style="stop-color:#000000;stop-opacity:0.0000000;" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0.0000000;"
++ offset="0.88000000"
++ id="stop7181" />
++ <stop
++ style="stop-color:#727e0a;stop-opacity:1.0000000"
++ offset="1.0000000"
++ id="stop7183" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7744">
++ <stop
++ id="stop7746"
++ offset="0.0000000"
++ style="stop-color:#555753;stop-opacity:1.0000000" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0.0000000;"
++ offset="0.10000000"
++ id="stop7748" />
++ <stop
++ id="stop7750"
++ offset="0.88000000"
++ style="stop-color:#000000;stop-opacity:0.0000000;" />
++ <stop
++ id="stop7752"
++ offset="1.0000000"
++ style="stop-color:#555753;stop-opacity:1.0000000" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7754">
++ <stop
++ id="stop7756"
++ offset="0.0000000"
++ style="stop-color:#204a87;stop-opacity:1.0000000" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0.0000000;"
++ offset="0.10000000"
++ id="stop7758" />
++ <stop
++ id="stop7760"
++ offset="0.88000000"
++ style="stop-color:#000000;stop-opacity:0.0000000;" />
++ <stop
++ id="stop7762"
++ offset="1.0000000"
++ style="stop-color:#204a87;stop-opacity:1.0000000" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7764">
++ <stop
++ id="stop7766"
++ offset="0.0000000"
++ style="stop-color:#a40000;stop-opacity:1.0000000" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0.0000000;"
++ offset="0.10000000"
++ id="stop7768" />
++ <stop
++ id="stop7770"
++ offset="0.88000000"
++ style="stop-color:#000000;stop-opacity:0.0000000;" />
++ <stop
++ id="stop7772"
++ offset="1.0000000"
++ style="stop-color:#a40000;stop-opacity:1.0000000" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient7774">
++ <stop
++ id="stop7776"
++ offset="0.0000000"
++ style="stop-color:#727e0a;stop-opacity:1.0000000" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0.0000000;"
++ offset="0.10000000"
++ id="stop7778" />
++ <stop
++ id="stop7780"
++ offset="0.88000000"
++ style="stop-color:#000000;stop-opacity:0.0000000;" />
++ <stop
++ id="stop7782"
++ offset="1.0000000"
++ style="stop-color:#727e0a;stop-opacity:1.0000000" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3554"
++ inkscape:collect="always">
++ <stop
++ id="stop3556"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop3558"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4141"
++ inkscape:collect="always">
++ <stop
++ id="stop4143"
++ offset="0"
++ style="stop-color:#636363;stop-opacity:1;" />
++ <stop
++ id="stop4145"
++ offset="1"
++ style="stop-color:#636363;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4227"
++ inkscape:collect="always">
++ <stop
++ id="stop4229"
++ offset="0"
++ style="stop-color:#2e3436;stop-opacity:1;" />
++ <stop
++ id="stop4231"
++ offset="1"
++ style="stop-color:#2e3436;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4243"
++ inkscape:collect="always">
++ <stop
++ id="stop4245"
++ offset="0"
++ style="stop-color:#888a85;stop-opacity:1;" />
++ <stop
++ id="stop4247"
++ offset="1"
++ style="stop-color:#888a85;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4267"
++ inkscape:collect="always">
++ <stop
++ id="stop4269"
++ offset="0"
++ style="stop-color:#9db029;stop-opacity:1;" />
++ <stop
++ id="stop4271"
++ offset="1"
++ style="stop-color:#9db029;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4275"
++ inkscape:collect="always">
++ <stop
++ id="stop4277"
++ offset="0"
++ style="stop-color:#cc0000;stop-opacity:1;" />
++ <stop
++ id="stop4279"
++ offset="1"
++ style="stop-color:#cc0000;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4307"
++ inkscape:collect="always">
++ <stop
++ id="stop4309"
++ offset="0"
++ style="stop-color:#888a85;stop-opacity:1;" />
++ <stop
++ id="stop4311"
++ offset="1"
++ style="stop-color:#888a85;stop-opacity:0;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective5360"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4264"
++ id="radialGradient4270"
++ cx="23.201941"
++ cy="27.096155"
++ fx="23.201941"
++ fy="27.096155"
++ r="23.555494"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.651032,0.000000,9.455693)"
++ gradientUnits="userSpaceOnUse" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4236"
++ id="linearGradient6005"
++ x1="12.277412"
++ y1="37.205811"
++ x2="12.221823"
++ y2="33.758667"
++ gradientUnits="userSpaceOnUse" />
++ <linearGradient
++ id="linearGradient4184">
++ <stop
++ style="stop-color:#838383;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop6000" />
++ <stop
++ style="stop-color:#bbbbbb;stop-opacity:0.0000000;"
++ offset="1.0000000"
++ id="stop4188" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4228">
++ <stop
++ style="stop-color:#bbbbbb;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop5996" />
++ <stop
++ style="stop-color:#9f9f9f;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop4232" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4244">
++ <stop
++ style="stop-color:#e4e4e4;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop4246" />
++ <stop
++ style="stop-color:#d3d3d3;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop4248" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient4254">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop4256" />
++ <stop
++ style="stop-color:#ffffff;stop-opacity:0;"
++ offset="1"
++ id="stop4258" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient4264">
++ <stop
++ style="stop-color:#000000;stop-opacity:1;"
++ offset="0"
++ id="stop4266" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0;"
++ offset="1"
++ id="stop4268" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4274">
++ <stop
++ id="stop4276"
++ offset="0.0000000"
++ style="stop-color:#ffffff;stop-opacity:0.25490198;" />
++ <stop
++ id="stop4278"
++ offset="1.0000000"
++ style="stop-color:#ffffff;stop-opacity:1.0000000;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient2555">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop2557" />
++ <stop
++ id="stop2561"
++ offset="0.50000000"
++ style="stop-color:#e6e6e6;stop-opacity:1.0000000;" />
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1.0000000;"
++ offset="0.75000000"
++ id="stop2563" />
++ <stop
++ id="stop2565"
++ offset="0.84166664"
++ style="stop-color:#e1e1e1;stop-opacity:1.0000000;" />
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop2559" />
++ </linearGradient>
++ <linearGradient
++ y2="609.50507"
++ x2="302.85715"
++ y1="366.64789"
++ x1="302.85715"
++ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient5969"
++ xlink:href="#linearGradient5048"
++ inkscape:collect="always" />
++ <linearGradient
++ id="linearGradient5961">
++ <stop
++ id="stop5963"
++ offset="0"
++ style="stop-color:black;stop-opacity:0;" />
++ <stop
++ style="stop-color:black;stop-opacity:1;"
++ offset="0.5"
++ id="stop5965" />
++ <stop
++ id="stop5967"
++ offset="1"
++ style="stop-color:black;stop-opacity:0;" />
++ </linearGradient>
++ <radialGradient
++ r="117.14286"
++ fy="486.64789"
++ fx="605.71429"
++ cy="486.64789"
++ cx="605.71429"
++ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient5959"
++ xlink:href="#linearGradient5060"
++ inkscape:collect="always" />
++ <radialGradient
++ r="117.14286"
++ fy="486.64789"
++ fx="605.71429"
++ cy="486.64789"
++ cx="605.71429"
++ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient5951"
++ xlink:href="#linearGradient5060"
++ inkscape:collect="always" />
++ <inkscape:perspective
++ id="perspective5948"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient12810"
++ id="linearGradient12941"
++ gradientUnits="userSpaceOnUse"
++ x1="65.623963"
++ y1="21.459777"
++ x2="87.528968"
++ y2="21.459777"
++ gradientTransform="matrix(0.755725,0,0,0.755725,-25.19847,17.09924)" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient12836"
++ id="linearGradient12934"
++ gradientUnits="userSpaceOnUse"
++ x1="88.750000"
++ y1="31.656250"
++ x2="92.062500"
++ y2="36.656250"
++ gradientTransform="matrix(0.755725,0,0,0.755725,-24.84491,17.27602)" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient12828"
++ id="radialGradient12931"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.732463,0.172296,-0.147115,0.625415,-17.70794,5.185566)"
++ cx="88.593018"
++ cy="33.398670"
++ fx="88.593018"
++ fy="33.398670"
++ r="7.0056136" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient12810"
++ id="linearGradient12927"
++ gradientUnits="userSpaceOnUse"
++ x1="84.998962"
++ y1="25.209778"
++ x2="62.591469"
++ y2="12.022278"
++ gradientTransform="matrix(0.755725,0,0,0.755725,-25.19847,17.09924)" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient11625"
++ id="linearGradient12924"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.985000,0.000000,0.000000,1.022813,-1.675625,-6.638771)"
++ x1="21.500000"
++ y1="30.000000"
++ x2="21.500000"
++ y2="27.375000" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient11625"
++ id="linearGradient12921"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.985000,0.000000,0.000000,1.000000,0.315001,-6.000012)"
++ x1="21.500000"
++ y1="30.000000"
++ x2="21.500000"
++ y2="27.375000" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient11625"
++ id="linearGradient12918"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.016250,0.000000,0.000000,1.000000,1.658750,-6.000012)"
++ x1="21.500000"
++ y1="30.000000"
++ x2="21.500000"
++ y2="27.375000" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient11615"
++ id="radialGradient12909"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(3.070491,2.727143e-15,-3.444813e-15,3.878514,-55.26225,-82.65742)"
++ cx="25.000000"
++ cy="27.749998"
++ fx="25.000000"
++ fy="27.749998"
++ r="4.7500000" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient11602"
++ id="linearGradient11608"
++ x1="24.445671"
++ y1="12.947163"
++ x2="24.445671"
++ y2="39.447163"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.837825,-2.875000,0.164729)" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient11594"
++ id="linearGradient11600"
++ x1="20.092352"
++ y1="8.9471626"
++ x2="31.799011"
++ y2="38.947163"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.061966,0.000000,0.000000,0.837825,-4.389811,0.164729)" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient11508"
++ id="radialGradient11532"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.000000,0.000000,0.000000,0.338462,-4.933466e-14,29.48178)"
++ cx="30.203562"
++ cy="44.565483"
++ fx="30.203562"
++ fy="44.565483"
++ r="6.5659914" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient11520"
++ id="radialGradient11526"
++ cx="24.445690"
++ cy="35.878170"
++ fx="24.445690"
++ fy="35.878170"
++ r="20.530962"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.995058,-1.383691e-32,0.000000,1.671510,-27.19988,-29.02822)" />
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient11508">
++ <stop
++ style="stop-color:#000000;stop-opacity:1;"
++ offset="0"
++ id="stop11510" />
++ <stop
++ style="stop-color:#000000;stop-opacity:0;"
++ offset="1"
++ id="stop11512" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient11520">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop11522" />
++ <stop
++ style="stop-color:#dcdcdc;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop11524" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient11594">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop11596" />
++ <stop
++ style="stop-color:#d1d1d1;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop11598" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient11602">
++ <stop
++ style="stop-color:#f6f6f6;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop11604" />
++ <stop
++ style="stop-color:#e0e0e0;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop11606" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient11615">
++ <stop
++ style="stop-color:#636363;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop11617" />
++ <stop
++ style="stop-color:#000000;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop11619" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient11625">
++ <stop
++ style="stop-color:#fce94f;stop-opacity:1;"
++ offset="0"
++ id="stop11627" />
++ <stop
++ style="stop-color:#fce94f;stop-opacity:0;"
++ offset="1"
++ id="stop11629" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient12810">
++ <stop
++ style="stop-color:#ffffff;stop-opacity:1;"
++ offset="0"
++ id="stop12812" />
++ <stop
++ style="stop-color:#e5e5e5;stop-opacity:1.0000000;"
++ offset="1.0000000"
++ id="stop12814" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient12828">
++ <stop
++ style="stop-color:#cccccd;stop-opacity:1.0000000;"
++ offset="0.0000000"
++ id="stop12830" />
++ <stop
++ id="stop12862"
++ offset="0.0000000"
++ style="stop-color:#adadae;stop-opacity:1.0000000;" />
++ <stop
++ style="stop-color:#8f8f90;stop-opacity:0.0000000;"
++ offset="1.0000000"
++ id="stop12832" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient12836">
++ <stop
++ style="stop-color:#515152;stop-opacity:1;"
++ offset="0"
++ id="stop12838" />
++ <stop
++ style="stop-color:#515152;stop-opacity:0;"
++ offset="1"
++ id="stop12840" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective6114"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <linearGradient
++ gradientTransform="translate(-64.70027,0)"
++ gradientUnits="userSpaceOnUse"
++ y2="11.030003"
++ x2="10.4375"
++ y1="11.030003"
++ x1="8.0536165"
++ id="linearGradient3794"
++ xlink:href="#linearGradient3788"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(-64.70027,0)"
++ y2="18.984955"
++ x2="10.4375"
++ y1="8.2899637"
++ x1="10.4375"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient3668"
++ xlink:href="#linearGradient3657"
++ inkscape:collect="always" />
++ <linearGradient
++ id="linearGradient4608">
++ <stop
++ id="stop4610"
++ offset="0"
++ style="stop-color:#eeeeec" />
++ <stop
++ id="stop4612"
++ offset="1"
++ style="stop-color:#8a8c87;stop-opacity:1;" />
++ </linearGradient>
++ <linearGradient
++ gradientTransform="matrix(0.997993,0,0,1,-97.71685,-9.352993)"
++ spreadMethod="reflect"
++ gradientUnits="userSpaceOnUse"
++ y2="40.9986"
++ x2="57.954308"
++ y1="35.01503"
++ x1="58.015995"
++ id="linearGradient4641"
++ xlink:href="#linearGradient4608"
++ inkscape:collect="always" />
++ <linearGradient
++ id="linearGradient3609"
++ inkscape:collect="always">
++ <stop
++ id="stop3611"
++ offset="0"
++ style="stop-color:#000000;stop-opacity:1;" />
++ <stop
++ id="stop3613"
++ offset="1"
++ style="stop-color:#000000;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3657">
++ <stop
++ id="stop3659"
++ offset="0"
++ style="stop-color:#fafafa;stop-opacity:1;" />
++ <stop
++ id="stop3661"
++ offset="1"
++ style="stop-color:#bfbfbf;stop-opacity:1;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3674">
++ <stop
++ id="stop3676"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ <stop
++ id="stop3678"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3788">
++ <stop
++ id="stop3790"
++ offset="0"
++ style="stop-color:#cccdcb;stop-opacity:1;" />
++ <stop
++ id="stop3792"
++ offset="1"
++ style="stop-color:#888a85;stop-opacity:1;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3676"
++ inkscape:collect="always">
++ <stop
++ id="stop4022"
++ offset="0"
++ style="stop-color:#eeeeec" />
++ <stop
++ id="stop3680"
++ offset="1"
++ style="stop-color:#555753" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient1557">
++ <stop
++ style="stop-color:#2e3436;stop-opacity:1;"
++ offset="0"
++ id="stop1559" />
++ <stop
++ style="stop-color:#888a85"
++ offset="1"
++ id="stop1561" />
++ </linearGradient>
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3730">
++ <stop
++ style="stop-color:#eeeeec"
++ offset="0"
++ id="stop3732" />
++ <stop
++ style="stop-color:#888a85"
++ offset="1"
++ id="stop3734" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3628"
++ inkscape:collect="always">
++ <stop
++ id="stop3630"
++ offset="0"
++ style="stop-color:#d3d7cf" />
++ <stop
++ id="stop3632"
++ offset="1"
++ style="stop-color:#555753" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3692"
++ inkscape:collect="always">
++ <stop
++ id="stop3694"
++ offset="0"
++ style="stop-color:#2e3436;stop-opacity:1;" />
++ <stop
++ id="stop3696"
++ offset="1"
++ style="stop-color:#babdb6" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4068">
++ <stop
++ id="stop4070"
++ offset="0"
++ style="stop-color:#eaeae9;stop-opacity:1;" />
++ <stop
++ id="stop4072"
++ offset="1"
++ style="stop-color:#a5a7a2;stop-opacity:1;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient4099"
++ inkscape:collect="always">
++ <stop
++ id="stop4101"
++ offset="0"
++ style="stop-color:#6f726f;stop-opacity:1;" />
++ <stop
++ id="stop4103"
++ offset="1"
++ style="stop-color:#6f726f;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3498"
++ inkscape:collect="always">
++ <stop
++ id="stop3500"
++ offset="0"
++ style="stop-color:#3465a4;stop-opacity:1;" />
++ <stop
++ id="stop3502"
++ offset="1"
++ style="stop-color:#3465a4;stop-opacity:0;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3510"
++ inkscape:collect="always">
++ <stop
++ id="stop3512"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop3514"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective6409"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="22.637957"
++ x2="7.378232"
++ y1="22.107626"
++ x1="9.485774"
++ id="linearGradient6730"
++ xlink:href="#linearGradient3510"
++ inkscape:collect="always" />
++ <radialGradient
++ r="1.2404949"
++ fy="24.427671"
++ fx="36.82843"
++ cy="24.427677"
++ cx="36.82843"
++ gradientTransform="matrix(13.39869,-4.118282e-6,6.831725e-6,22.22678,-456.6246,-518.5208)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient6728"
++ xlink:href="#linearGradient3498"
++ inkscape:collect="always" />
++ <radialGradient
++ r="1.2404949"
++ fy="24.427683"
++ fx="36.82843"
++ cy="24.427683"
++ cx="36.82843"
++ gradientTransform="matrix(21.09444,2.34445e-15,1.470518e-12,22.22672,-740.0468,-518.5196)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient6726"
++ xlink:href="#linearGradient3498"
++ inkscape:collect="always" />
++ <radialGradient
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(13.39869,-4.118282e-6,6.831725e-6,22.22678,-456.6246,-518.5208)"
++ r="1.2404949"
++ fy="24.427671"
++ fx="36.82843"
++ cy="24.427677"
++ cx="36.82843"
++ id="radialGradient6724"
++ xlink:href="#linearGradient3498"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="24.317278"
++ x2="8.3712559"
++ y1="24.665476"
++ x1="4.6831215"
++ id="linearGradient6722"
++ xlink:href="#linearGradient3281"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="matrix(1.296181,0,0,1.296181,-4.978245,-7.324566)"
++ gradientUnits="userSpaceOnUse"
++ y2="25.736509"
++ x2="9.346509"
++ y1="25.559732"
++ x1="11.125889"
++ id="linearGradient6720"
++ xlink:href="#linearGradient4099"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="27.345011"
++ x2="7.3215322"
++ y1="20.301662"
++ x1="7.5763841"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient6718"
++ xlink:href="#linearGradient4068"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="27.345011"
++ x2="7.3215322"
++ y1="20.301662"
++ x1="7.5763841"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient6716"
++ xlink:href="#linearGradient4068"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(-64.70027,0)"
++ gradientUnits="userSpaceOnUse"
++ y2="11.030003"
++ x2="10.4375"
++ y1="11.030003"
++ x1="8.0536165"
++ id="linearGradient6714"
++ xlink:href="#linearGradient3788"
++ inkscape:collect="always" />
++ <radialGradient
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.525791,4.898427e-16,-1.480441e-8,1.768964,-8.162983e-2,6.066255)"
++ r="2.9831069"
++ fy="12.516305"
++ fx="5.0822492"
++ cy="12.516305"
++ cx="5.0822492"
++ id="radialGradient6712"
++ xlink:href="#linearGradient3674"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientTransform="translate(-64.70027,0)"
++ y2="18.984955"
++ x2="10.4375"
++ y1="8.2899637"
++ x1="10.4375"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient6710"
++ xlink:href="#linearGradient3657"
++ inkscape:collect="always" />
++ <radialGradient
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.416,2.706926e-15,10.16382)"
++ r="5.524272"
++ fy="17.403807"
++ fx="6.4081554"
++ cy="17.403807"
++ cx="6.4081554"
++ id="radialGradient6708"
++ xlink:href="#linearGradient3609"
++ inkscape:collect="always" />
++ <linearGradient
++ id="linearGradient6702">
++ <stop
++ id="stop6704"
++ offset="0"
++ style="stop-color:#eeeeec" />
++ <stop
++ id="stop6706"
++ offset="1"
++ style="stop-color:#8a8c87;stop-opacity:1;" />
++ </linearGradient>
++ <linearGradient
++ gradientTransform="matrix(0.997993,0,0,1,-97.71685,-9.352993)"
++ spreadMethod="reflect"
++ gradientUnits="userSpaceOnUse"
++ y2="40.9986"
++ x2="57.954308"
++ y1="35.01503"
++ x1="58.015995"
++ id="linearGradient6700"
++ xlink:href="#linearGradient4608"
++ inkscape:collect="always" />
++ <linearGradient
++ y2="8.6796741"
++ x2="56.609135"
++ y1="4.9369388"
++ x1="56.302975"
++ gradientTransform="matrix(1.769913,0,0,1.769913,-88.34438,10.67235)"
++ gradientUnits="userSpaceOnUse"
++ id="linearGradient6698"
++ xlink:href="#linearGradient4608"
++ inkscape:collect="always" />
++ <linearGradient
++ id="linearGradient6686">
++ <stop
++ id="stop6688"
++ offset="0"
++ style="stop-color:#fafafa;stop-opacity:1;" />
++ <stop
++ id="stop6690"
++ offset="1"
++ style="stop-color:#bfbfbf;stop-opacity:1;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient6680">
++ <stop
++ id="stop6682"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ <stop
++ id="stop6684"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient6674">
++ <stop
++ id="stop6676"
++ offset="0"
++ style="stop-color:#cccdcb;stop-opacity:1;" />
++ <stop
++ id="stop6678"
++ offset="1"
++ style="stop-color:#888a85;stop-opacity:1;" />
++ </linearGradient>
++ <radialGradient
++ r="9.9205227"
++ fy="0.99004257"
++ fx="-1.0016617"
++ cy="0.99004257"
++ cx="-1.0016617"
++ gradientTransform="matrix(-0.127582,1.416065,-1.630141,-0.146854,17.48751,15.56121)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient6672"
++ xlink:href="#linearGradient3676"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="5.375"
++ x2="20.3125"
++ y1="34.950001"
++ x1="17.0625"
++ id="linearGradient6664"
++ xlink:href="#linearGradient1557"
++ inkscape:collect="always" />
++ <radialGradient
++ r="9.9205227"
++ fy="0.99004257"
++ fx="-1.0016617"
++ cy="0.99004257"
++ cx="-1.0016617"
++ gradientTransform="matrix(-0.310032,2.110862,-2.082775,-0.305867,17.75288,16.41459)"
++ gradientUnits="userSpaceOnUse"
++ id="radialGradient6656"
++ xlink:href="#linearGradient3730"
++ inkscape:collect="always" />
++ <radialGradient
++ gradientTransform="matrix(6.370852e-2,-1.424475,1.547293,6.92112e-2,-9.530629,30.98681)"
++ gradientUnits="userSpaceOnUse"
++ r="9.375"
++ fy="13.847466"
++ fx="12.704856"
++ cy="13.847466"
++ cx="12.704856"
++ id="radialGradient6648"
++ xlink:href="#linearGradient3628"
++ inkscape:collect="always" />
++ <linearGradient
++ gradientUnits="userSpaceOnUse"
++ y2="19.269905"
++ x2="-0.51990569"
++ y1="-0.51990569"
++ x1="-0.51990569"
++ id="linearGradient6640"
++ xlink:href="#linearGradient3692"
++ inkscape:collect="always" />
++ <radialGradient
++ gradientTransform="matrix(1.240749,9.690094e-9,-9.043116e-9,1.157631,-1.713645,-1.134736)"
++ gradientUnits="userSpaceOnUse"
++ r="9.375"
++ fy="7.1986876"
++ fx="6.8797626"
++ cy="7.1986876"
++ cx="6.8797626"
++ id="radialGradient6632"
++ xlink:href="#linearGradient3670"
++ inkscape:collect="always" />
++ <linearGradient
++ inkscape:collect="always"
++ id="linearGradient3670">
++ <stop
++ style="stop-color:#d3d7cf"
++ offset="0"
++ id="stop3672" />
++ <stop
++ style="stop-color:#555753"
++ offset="1"
++ id="stop3674" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient6623">
++ <stop
++ id="stop6625"
++ offset="0"
++ style="stop-color:#eaeae9;stop-opacity:1;" />
++ <stop
++ id="stop6627"
++ offset="1"
++ style="stop-color:#a5a7a2;stop-opacity:1;" />
++ </linearGradient>
++ <linearGradient
++ id="linearGradient3281"
++ inkscape:collect="always">
++ <stop
++ id="stop3283"
++ offset="0"
++ style="stop-color:#ffffff;stop-opacity:1;" />
++ <stop
++ id="stop3285"
++ offset="1"
++ style="stop-color:#ffffff;stop-opacity:0;" />
++ </linearGradient>
++ <inkscape:perspective
++ id="perspective6599"
++ inkscape:persp3d-origin="24 : 16 : 1"
++ inkscape:vp_z="48 : 24 : 1"
++ inkscape:vp_y="0 : 1000 : 0"
++ inkscape:vp_x="0 : 24 : 1"
++ sodipodi:type="inkscape:persp3d" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient23419"
++ id="radialGradient8917"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.25,0,31.22703)"
++ cx="23.334524"
++ cy="41.63604"
++ fx="23.334524"
++ fy="41.63604"
++ r="22.627417" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#aigrd1"
++ id="linearGradient8919"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.190476,0,0,1.190476,-4.224424,-2.5)"
++ x1="14.9966"
++ y1="11.1885"
++ x2="32.511"
++ y2="34.3075" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#aigrd2"
++ id="linearGradient8921"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.190476,0,0,1.190476,-4.224424,-2.500001)"
++ x1="12.2744"
++ y1="32.4165"
++ x2="35.3912"
++ y2="14.2033" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4236"
++ id="linearGradient8923"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.25,0,0,1.25,-5.652995,-2.604165)"
++ x1="21.125000"
++ y1="14.625000"
++ x2="29.000000"
++ y2="28.000000" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4236"
++ id="linearGradient8925"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.25,0,0,1.25,-5.652995,-2.604165)"
++ x1="21.125000"
++ y1="14.625000"
++ x2="29.000000"
++ y2="28.000000" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient6036"
++ id="linearGradient8927"
++ gradientUnits="userSpaceOnUse"
++ x1="10.501720"
++ y1="3.6100161"
++ x2="48.798885"
++ y2="54.698483" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient6028"
++ id="linearGradient8930"
++ gradientUnits="userSpaceOnUse"
++ x1="28.702885"
++ y1="31.494707"
++ x2="17.742729"
++ y2="18.366575" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3394"
++ id="radialGradient8932"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.848684,0.95802,-0.782119,0.692834,18.69147,-20.52578)"
++ cx="37.751469"
++ cy="27.569166"
++ fx="37.751469"
++ fy="27.569166"
++ r="21.333334" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3406"
++ id="radialGradient8934"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.769501,-1.2425,0.6703,0.415141,-21.77857,41.36563)"
++ cx="26.137741"
++ cy="38.807304"
++ fx="26.137741"
++ fy="38.807304"
++ r="21.333334" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3081"
++ id="radialGradient8936"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.15845,-0.158988,0.432907,0.431441,-2.723645,15.00107)"
++ cx="53.556889"
++ cy="48.238270"
++ fx="53.556889"
++ fy="48.238270"
++ r="21.333334" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3435"
++ id="radialGradient8938"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(5.184267e-3,-0.12286,0.544548,2.297824e-2,0.957234,26.30756)"
++ cx="16.885271"
++ cy="33.377594"
++ fx="16.885271"
++ fy="33.377594"
++ r="21.333334" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3435"
++ id="radialGradient8940"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.105916,-1.91424e-2,0.104789,0.579807,17.13693,7.115158)"
++ cx="35.511295"
++ cy="21.618015"
++ fx="35.511295"
++ fy="21.618015"
++ r="21.333334" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3435"
++ id="radialGradient8942"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(-5.04822e-2,1.387847e-2,-0.12844,-0.467196,35.41257,39.44172)"
++ cx="133.84108"
++ cy="23.914305"
++ fx="133.84108"
++ fy="23.914305"
++ r="21.333334" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5919"
++ id="radialGradient8944"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.201878,0,36.03783)"
++ cx="30.428225"
++ cy="45.153286"
++ fx="30.428225"
++ fy="45.153286"
++ r="13.474453" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2924"
++ id="radialGradient8946"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(3.495075,4.547273e-2,-1.300942e-2,0.999915,-25.42067,-0.463789)"
++ cx="10.268794"
++ cy="37.354755"
++ fx="10.268794"
++ fy="37.354755"
++ r="2.1875000" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient10924"
++ id="linearGradient8948"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.743403,0,0,0.776658,142.1177,39.94241)"
++ x1="-171.66670"
++ y1="-46.437500"
++ x2="-132.63971"
++ y2="31.094299" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5485"
++ id="linearGradient8950"
++ gradientUnits="userSpaceOnUse"
++ x1="-210.71640"
++ y1="16.861975"
++ x2="-215.08304"
++ y2="8.6301003" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient7754"
++ id="linearGradient8952"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.730619,0,0,0.767032,177.06,15.53427)"
++ spreadMethod="pad"
++ x1="-223.18059"
++ y1="9.7278442"
++ x2="-194.25365"
++ y2="9.7278442" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5485"
++ id="linearGradient8954"
++ gradientUnits="userSpaceOnUse"
++ x1="-210.71640"
++ y1="16.861975"
++ x2="-215.08304"
++ y2="8.6301003" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5048"
++ id="linearGradient8956"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
++ x1="302.85715"
++ y1="366.64789"
++ x2="302.85715"
++ y2="609.50507" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5060"
++ id="radialGradient8958"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
++ cx="605.71429"
++ cy="486.64789"
++ fx="605.71429"
++ fy="486.64789"
++ r="117.14286" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5060"
++ id="radialGradient8960"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
++ cx="605.71429"
++ cy="486.64789"
++ fx="605.71429"
++ fy="486.64789"
++ r="117.14286" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4228"
++ id="linearGradient8962"
++ gradientUnits="userSpaceOnUse"
++ x1="7.6046205"
++ y1="28.481176"
++ x2="36.183067"
++ y2="40.943935" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4244"
++ id="radialGradient8964"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.286242,0.781698,-0.710782,1.169552,-2.354348,-4.876862)"
++ cx="15.571491"
++ cy="2.9585190"
++ fx="15.571491"
++ fy="2.9585190"
++ r="20.935817" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4184"
++ id="linearGradient8966"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(0.795493,-1.325821)"
++ x1="7.0625000"
++ y1="35.281250"
++ x2="24.687500"
++ y2="35.281250" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#aigrd2"
++ id="linearGradient8968"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.190476,0,0,1.190476,-4.224424,-2.500001)"
++ x1="12.2744"
++ y1="32.4165"
++ x2="35.3912"
++ y2="14.2033" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4274"
++ id="linearGradient8970"
++ gradientUnits="userSpaceOnUse"
++ x1="23.688078"
++ y1="11.318835"
++ x2="23.688078"
++ y2="26.357183" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4254"
++ id="linearGradient8972"
++ gradientUnits="userSpaceOnUse"
++ x1="12.378357"
++ y1="4.4331360"
++ x2="44.096100"
++ y2="47.620636" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2555"
++ id="linearGradient8974"
++ gradientUnits="userSpaceOnUse"
++ x1="33.431175"
++ y1="31.964777"
++ x2="21.747974"
++ y2="11.780679" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient11508"
++ id="radialGradient8976"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.338462,0,29.48178)"
++ cx="30.203562"
++ cy="44.565483"
++ fx="30.203562"
++ fy="44.565483"
++ r="6.5659914" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient12810"
++ id="linearGradient8978"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.37407,0,0,1.37407,-85.1015,-12.38821)"
++ x1="65.623963"
++ y1="21.459777"
++ x2="87.528968"
++ y2="21.459777" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient12836"
++ id="linearGradient8980"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.37407,0,0,1.37407,-84.45865,-12.06679)"
++ x1="88.750000"
++ y1="31.656250"
++ x2="92.062500"
++ y2="36.656250" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient12828"
++ id="radialGradient8982"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.889444,0.209222,-0.178645,0.759454,-34.9767,-11.86445)"
++ cx="88.593018"
++ cy="33.398670"
++ fx="88.593018"
++ fy="33.398670"
++ r="7.0056136" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient12810"
++ id="linearGradient8984"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.37407,0,0,1.37407,-85.1015,-12.38821)"
++ x1="84.998962"
++ y1="25.209778"
++ x2="62.591469"
++ y2="12.022278" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5048"
++ id="linearGradient9048"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
++ x1="302.85715"
++ y1="366.64789"
++ x2="302.85715"
++ y2="609.50507" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5060"
++ id="radialGradient9050"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
++ cx="605.71429"
++ cy="486.64789"
++ fx="605.71429"
++ fy="486.64789"
++ r="117.14286" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5060"
++ id="radialGradient9052"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
++ cx="605.71429"
++ cy="486.64789"
++ fx="605.71429"
++ fy="486.64789"
++ r="117.14286" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4210"
++ id="linearGradient9054"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(1028.0257,-231.1927)"
++ x1="24.990499"
++ y1="34.004856"
++ x2="24.990499"
++ y2="22.585211" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4222"
++ id="linearGradient9056"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(1028.0257,-231.1927)"
++ x1="18.706615"
++ y1="19.912336"
++ x2="30.014812"
++ y2="47.388485" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4182"
++ id="linearGradient9058"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,1.039184,1028.0257,-231.23327)"
++ x1="16.148972"
++ y1="12.636667"
++ x2="34.193642"
++ y2="12.636667" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4987"
++ id="linearGradient9060"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(1028.0257,-231.1927)"
++ x1="21.906841"
++ y1="9.7577486"
++ x2="22.071806"
++ y2="16.020695" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4192"
++ id="linearGradient9062"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.986355,1028.0257,-230.87606)"
++ x1="25.381256"
++ y1="24.720648"
++ x2="24.119167"
++ y2="16.170370" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4995"
++ id="linearGradient9064"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(1028.0257,-231.1927)"
++ x1="36.288929"
++ y1="14.661557"
++ x2="47.065835"
++ y2="15.267649" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2884"
++ id="radialGradient9066"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.353283,0,0,0.635968,-8.45889,3.41347)"
++ cx="23.943670"
++ cy="20.800287"
++ fx="23.943670"
++ fy="20.800287"
++ r="6.4286140" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2869"
++ id="radialGradient9068"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.74942,0,0,0.394055,6.226925,10.09253)"
++ cx="21.578989"
++ cy="9.0255041"
++ fx="21.578989"
++ fy="9.0255041"
++ r="9.5862970" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2884"
++ id="radialGradient9070"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.353283,0,0,0.635968,-8.45889,3.41347)"
++ cx="23.943670"
++ cy="20.800287"
++ fx="23.943670"
++ fy="20.800287"
++ r="6.4286140" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2869"
++ id="radialGradient9072"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.74942,0,0,0.394055,6.226925,10.09253)"
++ cx="21.578989"
++ cy="9.8105707"
++ fx="21.578989"
++ fy="9.8105707"
++ r="9.5862970" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4979"
++ id="linearGradient9074"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(1028.0257,-231.1927)"
++ x1="30.062469"
++ y1="13.444801"
++ x2="17.696169"
++ y2="12.333632" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2300"
++ id="radialGradient9076"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.399258,-2.234445e-7,8.196178e-8,0.513264,4.365074,4.839285)"
++ cx="14.287618"
++ cy="68.872971"
++ fx="14.287618"
++ fy="72.568001"
++ r="11.689870" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#aigrd1"
++ id="linearGradient9078"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.200685,0,0,0.200685,-54.33576,-1.050787)"
++ x1="99.7773"
++ y1="15.4238"
++ x2="153.0005"
++ y2="248.6311" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2072"
++ id="radialGradient9080"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.398649,0,21.2728)"
++ cx="23.250000"
++ cy="35.375000"
++ fx="23.250000"
++ fy="35.375000"
++ r="18.500000" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2315"
++ id="radialGradient9082"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.509804,0,16.05392)"
++ cx="4.3920336"
++ cy="32.307854"
++ fx="4.3920336"
++ fy="32.307854"
++ r="6.3750000" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2315"
++ id="radialGradient9084"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.509804,0,16.05392)"
++ cx="4.3920336"
++ cy="32.307854"
++ fx="4.3920336"
++ fy="32.307854"
++ r="6.3750000" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient7079"
++ id="radialGradient9086"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.663934,0,9.061528)"
++ cx="23.157747"
++ cy="26.963573"
++ fx="23.157747"
++ fy="26.963573"
++ r="21.566757" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#aigrd4"
++ id="radialGradient9088"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.8013773,0,0,0.8013773,1475.9034,-149.67743)"
++ cx="20.655508"
++ cy="24.735121"
++ fx="20.655508"
++ fy="24.735121"
++ r="14.1515" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient7087"
++ id="linearGradient9090"
++ gradientUnits="userSpaceOnUse"
++ x1="23.816254"
++ y1="12.75"
++ x2="29.049412"
++ y2="25.772396" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient7054"
++ id="linearGradient9092"
++ gradientUnits="userSpaceOnUse"
++ x1="21.03167"
++ y1="31.867859"
++ x2="21.107563"
++ y2="-4.5986342" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient7069"
++ id="linearGradient9094"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.7091211,0,0,0.7091211,1478.5851,-152.30353)"
++ x1="46.54464"
++ y1="35.24506"
++ x2="40.820396"
++ y2="34.140205" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient7138"
++ id="linearGradient9096"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(0.8013773,0,0,0.8013773,1474.3233,-155.46349)"
++ x1="43.6875"
++ y1="32.133045"
++ x2="26.625"
++ y2="32.133045" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2454"
++ id="radialGradient9098"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="scale(1.925808,0.519262)"
++ cx="12.575710"
++ cy="67.501709"
++ fx="12.575710"
++ fy="67.501709"
++ r="8.7662794" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2321"
++ id="linearGradient9100"
++ gradientUnits="userSpaceOnUse"
++ x1="-35.658386"
++ y1="33.416473"
++ x2="-35.658386"
++ y2="28.205938" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2329"
++ id="linearGradient9102"
++ gradientUnits="userSpaceOnUse"
++ x1="-35.122688"
++ y1="34.242237"
++ x2="-35.074745"
++ y2="30.962345" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2701"
++ id="linearGradient9104"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.816345,0,0,1.278927,1688.6456,-199.39317)"
++ x1="12.206709"
++ y1="53.535141"
++ x2="12.127711"
++ y2="64.892525" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2245"
++ id="linearGradient9106"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.129863,0,0,0.885063,1689.0206,-157.57746)"
++ x1="8.6116238"
++ y1="7.2293582"
++ x2="34.784473"
++ y2="33.339787" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2253"
++ id="linearGradient9108"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.104397,0,0,0.905471,1690.6456,-156.27309)"
++ x1="10.390738"
++ y1="5.3817744"
++ x2="32.536823"
++ y2="31.246054" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2675"
++ id="linearGradient9110"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.174139,0,0,0.945431,1691.3674,-157.60461)"
++ x1="19.150396"
++ y1="32.622238"
++ x2="16.315819"
++ y2="8.8666229" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2683"
++ id="linearGradient9112"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(5.705159,0,0,0.17528,1691.6456,-156.95246)"
++ x1="3.7069976"
++ y1="171.29134"
++ x2="3.7069974"
++ y2="162.45061" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2415"
++ id="linearGradient9114"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.108069,0,0,0.902471,1691.6456,-155.27309)"
++ x1="17.698339"
++ y1="13.004725"
++ x2="34.974548"
++ y2="55.200756" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2667"
++ id="linearGradient9116"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.238977,0,0,0.895955,1691.2362,-157.60461)"
++ x1="11.492236"
++ y1="1.6537577"
++ x2="17.199417"
++ y2="26.729263" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2711"
++ id="linearGradient9118"
++ gradientUnits="userSpaceOnUse"
++ x1="34.300991"
++ y1="3.9384086"
++ x2="35.520542"
++ y2="3.8451097" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2711"
++ id="linearGradient9120"
++ gradientUnits="userSpaceOnUse"
++ x1="34.300991"
++ y1="3.9384086"
++ x2="35.520542"
++ y2="3.8451097" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2711"
++ id="linearGradient9122"
++ gradientUnits="userSpaceOnUse"
++ x1="34.300991"
++ y1="3.9384086"
++ x2="35.520542"
++ y2="3.8451097" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2711"
++ id="linearGradient9124"
++ gradientUnits="userSpaceOnUse"
++ x1="34.300991"
++ y1="3.9384086"
++ x2="35.520542"
++ y2="3.8451097" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2711"
++ id="linearGradient9126"
++ gradientUnits="userSpaceOnUse"
++ x1="34.300991"
++ y1="3.9384086"
++ x2="35.520542"
++ y2="3.8451097" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2684"
++ id="linearGradient9128"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.128181,0,0,1.128181,-53.99314,-83.36009)"
++ x1="70.913956"
++ y1="101.74152"
++ x2="70.951942"
++ y2="88.923729" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2691"
++ id="radialGradient9130"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(5.324342e-2,-0.836238,2.019473,0.128568,-151.9195,108.0768)"
++ cx="107.5884"
++ cy="83.990814"
++ fx="107.5884"
++ fy="83.990814"
++ r="12.551644" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient5075"
++ id="linearGradient9132"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(-45.00042,-71.09425)"
++ x1="71.288956"
++ y1="124.11652"
++ x2="70.826942"
++ y2="95" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2817"
++ id="linearGradient9134"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.103262,0,0,1.054917,-163.1228,-76.31138)"
++ x1="174.83363"
++ y1="84.263489"
++ x2="174.74524"
++ y2="105.49083" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2679"
++ id="radialGradient9136"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,212.6949)"
++ cx="169.77171"
++ cy="100.20107"
++ fx="169.77171"
++ fy="100.20107"
++ r="11" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2697"
++ id="linearGradient9138"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,1.004384,-145.0004,-71.4625)"
++ x1="169"
++ y1="110.33805"
++ x2="169"
++ y2="93.204849" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3081"
++ id="linearGradient9140"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(-4e-4,-9.426e-2)"
++ x1="15.089521"
++ y1="15.291994"
++ x2="14"
++ y2="52.510574" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2817"
++ id="linearGradient9142"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.103262,0,0,1.054917,-163.1228,-76.31138)"
++ x1="174.83363"
++ y1="84.263489"
++ x2="174.74524"
++ y2="105.49083" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2679"
++ id="radialGradient9144"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(3.562309e-6,-1.07205,1.992104,-1.250658e-6,-175.6121,212.6949)"
++ cx="169.77171"
++ cy="100.20107"
++ fx="169.77171"
++ fy="100.20107"
++ r="11" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2697"
++ id="linearGradient9146"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,1.004384,-145.0004,-71.4625)"
++ x1="169"
++ y1="110.33805"
++ x2="169"
++ y2="93.204849" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3081"
++ id="linearGradient9148"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="translate(-4e-4,-9.426e-2)"
++ x1="15.089521"
++ y1="15.291994"
++ x2="14"
++ y2="52.510574" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3609"
++ id="radialGradient9158"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1,0,0,0.416,0,10.16382)"
++ cx="6.4081554"
++ cy="17.403807"
++ fx="6.4081554"
++ fy="17.403807"
++ r="5.524272" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4068"
++ id="linearGradient9160"
++ gradientUnits="userSpaceOnUse"
++ x1="7.5763841"
++ y1="20.301662"
++ x2="7.3215322"
++ y2="27.345011" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4068"
++ id="linearGradient9162"
++ gradientUnits="userSpaceOnUse"
++ x1="7.5763841"
++ y1="20.301662"
++ x2="7.3215322"
++ y2="27.345011" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3264"
++ id="linearGradient9164"
++ gradientUnits="userSpaceOnUse"
++ x1="4.6831215"
++ y1="24.665476"
++ x2="8.3712559"
++ y2="24.317278" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4608"
++ id="linearGradient9166"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.769913,0,0,1.769913,-88.34438,10.67235)"
++ x1="56.302975"
++ y1="4.9369388"
++ x2="56.609135"
++ y2="8.6796741" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient4099"
++ id="linearGradient9168"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.296181,0,0,1.296181,-4.978245,-7.324566)"
++ x1="11.125889"
++ y1="25.559732"
++ x2="9.346509"
++ y2="25.736509" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3510"
++ id="linearGradient9170"
++ gradientUnits="userSpaceOnUse"
++ x1="9.485774"
++ y1="22.107626"
++ x2="7.378232"
++ y2="22.637957" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3674"
++ id="radialGradient9172"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.525791,0,-1.480441e-8,1.768964,-8.162983e-2,6.066255)"
++ cx="5.0822492"
++ cy="12.516305"
++ fx="5.0822492"
++ fy="12.516305"
++ r="2.9831069" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3676"
++ id="radialGradient9174"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(-0.127582,1.416065,-1.630141,-0.146854,17.48751,15.56121)"
++ cx="-1.0016617"
++ cy="0.99004257"
++ fx="-1.0016617"
++ fy="0.99004257"
++ r="9.9205227" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient1557"
++ id="linearGradient9176"
++ gradientUnits="userSpaceOnUse"
++ x1="17.0625"
++ y1="34.950001"
++ x2="20.3125"
++ y2="5.375" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3730"
++ id="radialGradient9178"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(-0.310032,2.110862,-2.082775,-0.305867,17.75288,16.41459)"
++ cx="-1.0016617"
++ cy="0.99004257"
++ fx="-1.0016617"
++ fy="0.99004257"
++ r="9.9205227" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3628"
++ id="radialGradient9180"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(6.370852e-2,-1.424475,1.547293,6.92112e-2,-9.530629,30.98681)"
++ cx="12.704856"
++ cy="13.847466"
++ fx="12.704856"
++ fy="13.847466"
++ r="9.375" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3692"
++ id="linearGradient9182"
++ gradientUnits="userSpaceOnUse"
++ x1="-0.51990569"
++ y1="-0.51990569"
++ x2="-0.51990569"
++ y2="19.269905" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient9203"
++ id="radialGradient9184"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(1.240749,0,0,1.157631,-1.713645,-1.134736)"
++ cx="6.8797626"
++ cy="7.1986876"
++ fx="6.8797626"
++ fy="7.1986876"
++ r="9.375" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3498"
++ id="radialGradient9186"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(13.39869,-4.118282e-6,6.831725e-6,22.22678,-456.6246,-518.5208)"
++ cx="36.82843"
++ cy="24.427677"
++ fx="36.82843"
++ fy="24.427671"
++ r="1.2404949" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3498"
++ id="radialGradient9188"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(13.39869,-4.118282e-6,6.831725e-6,22.22678,-456.6246,-518.5208)"
++ cx="36.82843"
++ cy="24.427677"
++ fx="36.82843"
++ fy="24.427671"
++ r="1.2404949" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3498"
++ id="radialGradient9190"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(21.09444,0,0,22.22672,-740.0468,-518.5196)"
++ cx="36.82843"
++ cy="24.427683"
++ fx="36.82843"
++ fy="24.427683"
++ r="1.2404949" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient3081"
++ id="linearGradient9250"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(3.000198,0,0,1,94.59141,-143.04229)"
++ x1="15.089521"
++ y1="15.291994"
++ x2="14"
++ y2="52.510574" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2697"
++ id="linearGradient9253"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(2.498884,0,0,1.004384,-252.46439,-214.45876)"
++ x1="169"
++ y1="110.33805"
++ x2="169"
++ y2="93.204849" />
++ <radialGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2679"
++ id="radialGradient9256"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(8.905772e-6,-1.07205,4.98026,-1.250658e-6,-329.18179,69.74687)"
++ cx="169.77171"
++ cy="100.20107"
++ fx="169.77171"
++ fy="100.20107"
++ r="11" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient2817"
++ id="linearGradient9259"
++ gradientUnits="userSpaceOnUse"
++ gradientTransform="matrix(2.624525,0,0,1.054917,-274.50449,-219.25939)"
++ x1="174.83363"
++ y1="84.263489"
++ x2="174.74524"
++ y2="105.49083" />
++ <linearGradient
++ inkscape:collect="always"
++ xlink:href="#linearGradient10080"
++ id="linearGradient10086"
++ x1="220.77719"
++ y1="2435.0949"
++ x2="325.9518"
++ y2="2435.0949"
++ gradientUnits="userSpaceOnUse" />
++ </defs>
++ <metadata
++ id="metadata7">
++ <rdf:RDF>
++ <cc:Work
++ rdf:about="">
++ <dc:format>image/svg+xml</dc:format>
++ <dc:type
++ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
++ <dc:title>gstreamer diagrams</dc:title>
++ <dc:creator>
++ <cc:Agent>
++ <dc:title>Luc Pionchon</dc:title>
++ </cc:Agent>
++ </dc:creator>
++ <dc:date>June 2008</dc:date>
++ <dc:description>This diagram uses icons from the Tango Desktop Project. http://tango.freedesktop.org</dc:description>
++ <cc:license
++ rdf:resource="http://creativecommons.org/licenses/by-nc-sa/3.0/" />
++ </cc:Work>
++ <cc:License
++ rdf:about="http://creativecommons.org/licenses/by-nc-sa/3.0/">
++ <cc:permits
++ rdf:resource="http://creativecommons.org/ns#Reproduction" />
++ <cc:permits
++ rdf:resource="http://creativecommons.org/ns#Distribution" />
++ <cc:requires
++ rdf:resource="http://creativecommons.org/ns#Notice" />
++ <cc:requires
++ rdf:resource="http://creativecommons.org/ns#Attribution" />
++ <cc:prohibits
++ rdf:resource="http://creativecommons.org/ns#CommercialUse" />
++ <cc:permits
++ rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
++ <cc:requires
++ rdf:resource="http://creativecommons.org/ns#ShareAlike" />
++ </cc:License>
++ </rdf:RDF>
++ </metadata>
++ <g
++ id="layer1"
++ inkscape:groupmode="layer"
++ inkscape:label="Layer 1">
++ <g
++ id="layer4"
++ inkscape:label="contorno"
++ style="display:inline"
++ transform="translate(1071.1328,-335.93253)" />
++ <flowRoot
++ xml:space="preserve"
++ id="flowRoot6177"
++ style="fill:black;fill-opacity:1;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;font-family:Bitstream Vera Sans;font-style:normal;font-weight:normal;font-size:10"><flowRegion
++ id="flowRegion6179"><rect
++ id="rect6181"
++ width="28.08502"
++ height="36.345318"
++ x="738.47083"
++ y="-251.93916" /></flowRegion><flowPara
++ id="flowPara6183" /></flowRoot> <g
++ inkscape:label="Layer 1"
++ id="g4840"
++ transform="translate(-80.486016,-590.47976)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <path
++ transform="matrix(1,0,0,1.066291,1,-2.885106)"
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ d="M 45.961941,41.63604 A 22.627417,5.6568542 0 1 1 0.70710754,41.63604 A 22.627417,5.6568542 0 1 1 45.961941,41.63604 z"
++ sodipodi:ry="5.6568542"
++ sodipodi:rx="22.627417"
++ sodipodi:cy="41.63604"
++ sodipodi:cx="23.334524"
++ id="path23417"
++ style="opacity:0.55;fill:url(#radialGradient8917);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ style="fill:url(#linearGradient8919);fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
++ d="M 24.347006,4.1666669 C 12.799386,4.1666669 3.5136719,13.452381 3.5136719,25 C 3.5136719,36.54762 12.799386,45.833335 24.347006,45.833335 C 35.894626,45.833335 45.180341,36.54762 45.180341,25 C 45.180341,13.452381 35.894626,4.1666669 24.347006,4.1666669 L 24.347006,4.1666669 z M 24.347006,30.000001 C 21.608911,30.000001 19.347006,27.738096 19.347006,25 C 19.347006,22.261905 21.608911,20 24.347006,20 C 27.085101,20 29.347006,22.261905 29.347006,25 C 29.347006,27.738096 27.085101,30.000001 24.347006,30.000001 z"
++ id="path3040"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="fill:url(#linearGradient8921);fill-rule:nonzero;stroke:#808080;stroke-miterlimit:4;stroke-opacity:1"
++ d="M 24.347006,4.1666665 C 12.799386,4.1666665 3.513672,13.452381 3.513672,25 C 3.513672,36.54762 12.799386,45.833335 24.347006,45.833335 C 35.894626,45.833335 45.180341,36.54762 45.180341,25 C 45.180341,13.452381 35.894626,4.1666665 24.347006,4.1666665 L 24.347006,4.1666665 z M 24.347006,30.000001 C 21.608911,30.000001 19.347006,27.738096 19.347006,25 C 19.347006,22.261905 21.608911,20 24.347006,20 C 27.085101,20 29.347006,22.261905 29.347006,25 C 29.347006,27.738096 27.085101,30.000001 24.347006,30.000001 z"
++ id="path3049"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="opacity:0.10999995;fill-rule:nonzero;stroke:none;stroke-miterlimit:4"
++ d="M 24.347006,14.895835 C 18.70442,14.895835 14.24284,19.488638 14.24284,25 C 14.24284,30.642588 18.835644,35.104166 24.347006,35.104166 C 29.989592,35.104166 34.451172,30.511364 34.451172,25 C 34.451172,19.357414 29.858368,14.895835 24.347006,14.895835 L 24.347006,14.895835 z M 24.347006,30.511364 C 21.328879,30.511364 18.835644,28.018129 18.835644,25 C 18.835644,21.981873 21.328879,19.488638 24.347006,19.488638 C 27.365133,19.488638 29.858368,21.981873 29.858368,25 C 29.858368,28.018129 27.365133,30.511364 24.347006,30.511364 z"
++ id="path3051"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ id="path3916"
++ d="M 29.922111,5.6692337 L 26.325518,19.663896 C 27.450222,19.963413 28.349661,20.659366 28.960646,21.622438 L 41.352866,14.073153 C 38.817618,9.9434382 34.748656,6.9050853 29.922111,5.6692337 z"
++ style="fill:url(#linearGradient8923);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4;stroke-opacity:1"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="fill:url(#linearGradient8925);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4;stroke-opacity:1"
++ d="M 17.307824,43.766057 L 22.043079,30.114558 C 20.946815,29.723566 20.107654,28.956005 19.577936,27.945951 L 6.6068752,34.450599 C 8.7939325,38.774811 12.599255,42.137482 17.307824,43.766057 z"
++ id="path4214"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ sodipodi:nodetypes="cccccc"
++ id="path5264"
++ d="M 24.347002,5.2023655 C 13.373458,5.2023655 4.5493711,14.026454 4.5493711,24.999997 C 4.5493711,35.973541 13.373458,44.797628 24.347002,44.797628 C 35.320546,44.797628 44.144633,35.973541 44.144633,24.999997 C 44.144633,14.026454 35.320546,5.2023655 24.347002,5.2023655 L 24.347002,5.2023655 z"
++ style="opacity:0.54644811;fill:none;fill-rule:nonzero;stroke:url(#linearGradient8927);stroke-miterlimit:4;stroke-opacity:1"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ transform="translate(8.838835e-2,8.838865e-2)"
++ d="M 30.405591,24.930641 A 6.0987959,6.0987959 0 1 1 18.207999,24.930641 A 6.0987959,6.0987959 0 1 1 30.405591,24.930641 z"
++ sodipodi:ry="6.0987959"
++ sodipodi:rx="6.0987959"
++ sodipodi:cy="24.930641"
++ sodipodi:cx="24.306795"
++ id="path6026"
++ style="opacity:0.67213111;fill:none;fill-opacity:0.31638417;fill-rule:nonzero;stroke:url(#linearGradient8930);stroke-width:0.93053865;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ id="path3390"
++ d="M 24.347006,4.1666665 C 12.799386,4.1666665 3.513672,13.452381 3.513672,25 C 3.513672,36.54762 12.799386,45.833335 24.347006,45.833335 C 35.894626,45.833335 45.180341,36.54762 45.180341,25 C 45.180341,13.452381 35.894626,4.1666665 24.347006,4.1666665 L 24.347006,4.1666665 z M 24.347006,30.000001 C 21.608911,30.000001 19.347006,27.738096 19.347006,25 C 19.347006,22.261905 21.608911,20 24.347006,20 C 27.085101,20 29.347006,22.261905 29.347006,25 C 29.347006,27.738096 27.085101,30.000001 24.347006,30.000001 z"
++ style="opacity:0.1142857;fill:url(#radialGradient8932);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4;stroke-opacity:1"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="opacity:0.09714284;fill:url(#radialGradient8934);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4;stroke-opacity:1"
++ d="M 24.347006,4.1666665 C 12.799386,4.1666665 3.513672,13.452381 3.513672,25 C 3.513672,36.54762 12.799386,45.833335 24.347006,45.833335 C 35.894626,45.833335 45.180341,36.54762 45.180341,25 C 45.180341,13.452381 35.894626,4.1666665 24.347006,4.1666665 L 24.347006,4.1666665 z M 24.347006,30.000001 C 21.608911,30.000001 19.347006,27.738096 19.347006,25 C 19.347006,22.261905 21.608911,20 24.347006,20 C 27.085101,20 29.347006,22.261905 29.347006,25 C 29.347006,27.738096 27.085101,30.000001 24.347006,30.000001 z"
++ id="path3404"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ id="path3419"
++ d="M 24.347006,4.1666665 C 12.799386,4.1666665 3.513672,13.452381 3.513672,25 C 3.513672,36.54762 12.799386,45.833335 24.347006,45.833335 C 35.894626,45.833335 45.180341,36.54762 45.180341,25 C 45.180341,13.452381 35.894626,4.1666665 24.347006,4.1666665 L 24.347006,4.1666665 z M 24.347006,30.000001 C 21.608911,30.000001 19.347006,27.738096 19.347006,25 C 19.347006,22.261905 21.608911,20 24.347006,20 C 27.085101,20 29.347006,22.261905 29.347006,25 C 29.347006,27.738096 27.085101,30.000001 24.347006,30.000001 z"
++ style="opacity:0.71428576;fill:url(#radialGradient8936);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4;stroke-opacity:1"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="opacity:0.62285713;fill:url(#radialGradient8938);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4;stroke-opacity:1"
++ d="M 24.347006,4.1666665 C 12.799386,4.1666665 3.513672,13.452381 3.513672,25 C 3.513672,36.54762 12.799386,45.833335 24.347006,45.833335 C 35.894626,45.833335 45.180341,36.54762 45.180341,25 C 45.180341,13.452381 35.894626,4.1666665 24.347006,4.1666665 L 24.347006,4.1666665 z M 24.347006,30.000001 C 21.608911,30.000001 19.347006,27.738096 19.347006,25 C 19.347006,22.261905 21.608911,20 24.347006,20 C 27.085101,20 29.347006,22.261905 29.347006,25 C 29.347006,27.738096 27.085101,30.000001 24.347006,30.000001 z"
++ id="path3431"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ id="path3441"
++ d="M 24.347006,4.1666665 C 12.799386,4.1666665 3.513672,13.452381 3.513672,25 C 3.513672,36.54762 12.799386,45.833335 24.347006,45.833335 C 35.894626,45.833335 45.180341,36.54762 45.180341,25 C 45.180341,13.452381 35.894626,4.1666665 24.347006,4.1666665 L 24.347006,4.1666665 z M 24.347006,30.000001 C 21.608911,30.000001 19.347006,27.738096 19.347006,25 C 19.347006,22.261905 21.608911,20 24.347006,20 C 27.085101,20 29.347006,22.261905 29.347006,25 C 29.347006,27.738096 27.085101,30.000001 24.347006,30.000001 z"
++ style="opacity:0.37142861;fill:url(#radialGradient8940);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4;stroke-opacity:1"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="opacity:0.23428572;fill:url(#radialGradient8942);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-miterlimit:4;stroke-opacity:1"
++ d="M 24.347006,4.1666665 C 12.799386,4.1666665 3.513672,13.452381 3.513672,25 C 3.513672,36.54762 12.799386,45.833335 24.347006,45.833335 C 35.894626,45.833335 45.180341,36.54762 45.180341,25 C 45.180341,13.452381 35.894626,4.1666665 24.347006,4.1666665 L 24.347006,4.1666665 z M 24.347006,30.000001 C 21.608911,30.000001 19.347006,27.738096 19.347006,25 C 19.347006,22.261905 21.608911,20 24.347006,20 C 27.085101,20 29.347006,22.261905 29.347006,25 C 29.347006,27.738096 27.085101,30.000001 24.347006,30.000001 z"
++ id="path3445"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ </g>
++ <g
++ id="g5800"
++ transform="translate(-81.144067,-643.89929)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <g
++ style="display:inline"
++ inkscape:label="Layer 1"
++ id="g5802">
++ <g
++ transform="matrix(1.315757,0,0,1.315757,-7.347598,-8.553446)"
++ id="g6589"
++ style="fill:#a2a6a7;fill-opacity:1;display:inline" />
++ <path
++ transform="matrix(0.853467,0,0,2.021914,-1.469485,-49.7834)"
++ d="M 43.902678,45.153286 A 13.474453,2.7201946 0 1 1 16.953772,45.153286 A 13.474453,2.7201946 0 1 1 43.902678,45.153286 z"
++ sodipodi:ry="2.7201946"
++ sodipodi:rx="13.474453"
++ sodipodi:cy="45.153286"
++ sodipodi:cx="30.428225"
++ id="path7856"
++ style="opacity:0.44999994;fill:url(#radialGradient8944);fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ sodipodi:type="arc" />
++ <g
++ transform="translate(-55.90238,-56.01615)"
++ id="g8425"
++ style="display:inline">
++ <rect
++ style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:#c2c2c2;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ id="rect8427"
++ width="13.589136"
++ height="3.1126587"
++ x="-0.94968754"
++ y="112.90335"
++ rx="1.5137454"
++ ry="1.3993458"
++ transform="matrix(0.85333,-0.521371,0.54466,0.838657,0,0)" />
++ <g
++ id="g8429">
++ <rect
++ transform="matrix(0.844299,-0.535873,0.577335,0.816508,0,0)"
++ ry="1.2146336"
++ rx="1.1134398"
++ y="113.35451"
++ x="-5.2611275"
++ height="2.5390387"
++ width="9.5848627"
++ id="rect8431"
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#c2c2c2;stroke-width:0.55335927;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ transform="matrix(1.086779,0,0,1.086779,52.58125,47.69086)"
++ d="M 18.788321,41.231144 A 5.0608273,5.0608273 0 1 1 8.666667,41.231144 A 5.0608273,5.0608273 0 1 1 18.788321,41.231144 z"
++ sodipodi:ry="5.0608273"
++ sodipodi:rx="5.0608273"
++ sodipodi:cy="41.231144"
++ sodipodi:cx="13.727494"
++ id="path8433"
++ style="opacity:1;fill:#c2c2c2;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ sodipodi:type="arc" />
++ <path
++ transform="matrix(0.934525,0,0,0.934525,54.59161,53.99504)"
++ d="M 18.788321,41.231144 A 5.0608273,5.0608273 0 1 1 8.666667,41.231144 A 5.0608273,5.0608273 0 1 1 18.788321,41.231144 z"
++ sodipodi:ry="5.0608273"
++ sodipodi:rx="5.0608273"
++ sodipodi:cy="41.231144"
++ sodipodi:cx="13.727494"
++ id="path8435"
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ sodipodi:type="arc" />
++ <g
++ transform="matrix(1.003468,0,0,0.969091,-0.221812,2.72854)"
++ id="g8437">
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#8d8d8d;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ id="path8439"
++ sodipodi:cx="13.727494"
++ sodipodi:cy="41.231144"
++ sodipodi:rx="5.0608273"
++ sodipodi:ry="5.0608273"
++ d="M 18.788321,41.231144 A 5.0608273,5.0608273 0 1 1 8.666667,41.231144 A 5.0608273,5.0608273 0 1 1 18.788321,41.231144 z"
++ transform="matrix(0.787521,0,0,0.787521,57.14101,59.79048)" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.46703294;fill:url(#radialGradient8946);fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ id="path8441"
++ sodipodi:cx="10.812501"
++ sodipodi:cy="38.25"
++ sodipodi:rx="2.1875"
++ sodipodi:ry="2.1875"
++ d="M 13.000001,38.25 A 2.1875,2.1875 0 1 1 8.625001,38.25 A 2.1875,2.1875 0 1 1 13.000001,38.25 z"
++ transform="matrix(1.756842,0,0,1.756842,49.13326,25.12495)" />
++ </g>
++ </g>
++ </g>
++ <rect
++ style="opacity:1;fill:#729fcf;fill-opacity:1;stroke:#204a87;stroke-width:1.0000006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7858"
++ width="22.029099"
++ height="40.991642"
++ x="13.520132"
++ y="2.5000002"
++ rx="2.8624377"
++ ry="0.38756484" />
++ <rect
++ style="opacity:0.60439561;fill:none;fill-opacity:1;stroke:url(#linearGradient8948);stroke-width:0.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7860"
++ width="20.040964"
++ height="38.97797"
++ x="14.499929"
++ y="3.512543"
++ rx="6.75"
++ ry="0.10631458" />
++ <path
++ transform="matrix(0.865538,0,0,0.865538,209.9203,22.3855)"
++ d="M -211.24815,9.3521948 A 3.2040777,3.2040777 0 1 1 -217.6563,9.3521948 A 3.2040777,3.2040777 0 1 1 -211.24815,9.3521948 z"
++ sodipodi:ry="3.2040777"
++ sodipodi:rx="3.2040777"
++ sodipodi:cy="9.3521948"
++ sodipodi:cx="-214.45222"
++ id="path7862"
++ style="opacity:0.83516487;fill:url(#linearGradient8950);fill-opacity:1;stroke:#c2c2c2;stroke-width:0.27324447;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ sodipodi:type="arc" />
++ <path
++ transform="matrix(0.800287,0,0,0.800287,191.3329,15.25978)"
++ d="M -197.81312,19.03072 A 10.628699,10.628699 0 1 1 -219.07052,19.03072 A 10.628699,10.628699 0 1 1 -197.81312,19.03072 z"
++ sodipodi:ry="10.628699"
++ sodipodi:rx="10.628699"
++ sodipodi:cy="19.03072"
++ sodipodi:cx="-208.44182"
++ id="path7864"
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.27187183;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ sodipodi:type="arc" />
++ <text
++ transform="scale(1.077754,0.927855)"
++ sodipodi:linespacing="125%"
++ id="text7866"
++ y="25.876835"
++ x="20.276695"
++ style="font-size:1.47469485px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#a2a6a7;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;font-family:Bitstream Vera Sans"
++ xml:space="preserve"><tspan
++ y="25.876835"
++ x="20.276695"
++ id="tspan7868"
++ sodipodi:role="line">MENU</tspan></text>
++ <g
++ transform="translate(607.0203,108.9958)"
++ id="g7870"
++ style="display:inline">
++ <path
++ sodipodi:type="star"
++ style="opacity:1;fill:#a2a6a7;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path7872"
++ sodipodi:sides="3"
++ sodipodi:cx="16.875"
++ sodipodi:cy="5.75"
++ sodipodi:r1="0.6502704"
++ sodipodi:r2="0.3251352"
++ sodipodi:arg1="0.95613337"
++ sodipodi:arg2="2.0033309"
++ inkscape:flatsided="false"
++ inkscape:rounded="0"
++ inkscape:randomized="0"
++ d="M 17.25,6.28125 L 16.738712,6.0451923 L 16.227424,5.8091345 L 16.6875,5.484375 L 17.147576,5.1596154 L 17.198788,5.7204327 L 17.25,6.28125 z"
++ transform="matrix(-0.593231,-0.723251,-0.841753,0.511835,-574.4794,-69.23682)" />
++ <path
++ sodipodi:type="star"
++ style="opacity:1;fill:#a2a6a7;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path7874"
++ sodipodi:sides="3"
++ sodipodi:cx="16.875"
++ sodipodi:cy="5.75"
++ sodipodi:r1="0.6502704"
++ sodipodi:r2="0.3251352"
++ sodipodi:arg1="0.95613337"
++ sodipodi:arg2="2.0033309"
++ inkscape:flatsided="false"
++ inkscape:rounded="0"
++ inkscape:randomized="0"
++ d="M 17.25,6.28125 L 16.738712,6.0451923 L 16.227424,5.8091345 L 16.6875,5.484375 L 17.147576,5.1596154 L 17.198788,5.7204327 L 17.25,6.28125 z"
++ transform="matrix(-0.59323,-0.726082,-0.841753,0.513838,-573.4796,-69.20067)" />
++ <rect
++ style="opacity:1;fill:#a2a6a7;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ id="rect7876"
++ width="0.18422361"
++ height="0.99286842"
++ x="590"
++ y="-78.992867"
++ ry="0"
++ transform="scale(-1,1)" />
++ </g>
++ <g
++ transform="translate(585.0392,109.0102)"
++ id="g7878"
++ style="display:inline">
++ <rect
++ style="opacity:1;fill:#eaeef9;fill-opacity:1;stroke:#69818f;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7880"
++ width="16.01894"
++ height="11.985675"
++ x="-568.51892"
++ y="-103.5"
++ rx="0.52014631"
++ ry="0.56434131" />
++ <rect
++ style="opacity:0.83516487;fill:#3e4b8f;fill-opacity:1;stroke:none;stroke-width:0.213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7882"
++ width="13"
++ height="1.96875"
++ x="-567"
++ y="-100.96875" />
++ <rect
++ style="opacity:0.83516487;fill:#3e4b8f;fill-opacity:1;stroke:none;stroke-width:0.213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7884"
++ width="4"
++ height="1.0042467"
++ x="-567"
++ y="-98" />
++ <rect
++ style="opacity:0.83516487;fill:#3e4b8f;fill-opacity:1;stroke:none;stroke-width:0.213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7886"
++ width="2"
++ height="0.99836552"
++ x="-567"
++ y="-95.998367" />
++ <rect
++ style="opacity:0.83516487;fill:#3e4b8f;fill-opacity:1;stroke:none;stroke-width:0.213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7888"
++ width="1.0028907"
++ height="0.97435272"
++ x="-555.00287"
++ y="-97.97435" />
++ <rect
++ style="opacity:0.83516487;fill:#3e4b8f;fill-opacity:1;stroke:none;stroke-width:0.213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7890"
++ width="0.99314684"
++ height="0.99644983"
++ x="-555"
++ y="-95.996452" />
++ <rect
++ style="opacity:0.83516487;fill:#3e4b8f;fill-opacity:1;stroke:none;stroke-width:0.213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7892"
++ width="2"
++ height="1.0185469"
++ x="-556"
++ y="-103" />
++ <rect
++ style="opacity:0.83516487;fill:#3e4b8f;fill-opacity:1;stroke:none;stroke-width:0.213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7894"
++ width="7"
++ height="1.0061938"
++ x="-565"
++ y="-103" />
++ <path
++ style="opacity:0.70329674;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;display:inline"
++ d="M -567.99243,-102.97657 C -567.99243,-102.97657 -553.81313,-102.99806 -553,-103 C -553,-103 -557.06089,-99.266087 -559.33679,-98.015165 C -562.46041,-96.298319 -566.42641,-97.090677 -567.96895,-92.00287 C -568.03,-91.80152 -567.97998,-102.24738 -567.99243,-102.97657 z"
++ id="path7896"
++ sodipodi:nodetypes="ccssc" />
++ <rect
++ style="opacity:0.83516487;fill:#3e4b8f;fill-opacity:1;stroke:none;stroke-width:0.213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7898"
++ width="5"
++ height="1.0042467"
++ x="-567"
++ y="-94" />
++ <rect
++ style="opacity:0.83516487;fill:#3e4b8f;fill-opacity:1;stroke:none;stroke-width:0.213;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7900"
++ width="0.99314684"
++ height="0.99644983"
++ x="-555"
++ y="-94" />
++ </g>
++ <rect
++ ry="0.23288508"
++ rx="2.8624377"
++ y="2.9958498"
++ x="13.999929"
++ height="40"
++ width="21.020203"
++ id="rect7902"
++ style="opacity:0.33516481;fill:url(#linearGradient8952);fill-opacity:1;stroke:none;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
++ <g
++ transform="matrix(-1,0,0,1,-557.9747,108.994)"
++ id="g7904"
++ style="display:inline">
++ <path
++ sodipodi:type="star"
++ style="opacity:1;fill:#a2a6a7;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path7906"
++ sodipodi:sides="3"
++ sodipodi:cx="16.875"
++ sodipodi:cy="5.75"
++ sodipodi:r1="0.6502704"
++ sodipodi:r2="0.3251352"
++ sodipodi:arg1="0.95613337"
++ sodipodi:arg2="2.0033309"
++ inkscape:flatsided="false"
++ inkscape:rounded="0"
++ inkscape:randomized="0"
++ d="M 17.25,6.28125 L 16.738712,6.0451923 L 16.227424,5.8091345 L 16.6875,5.484375 L 17.147576,5.1596154 L 17.198788,5.7204327 L 17.25,6.28125 z"
++ transform="matrix(-0.593231,-0.723251,-0.841753,0.511835,-574.4794,-69.23682)" />
++ <path
++ sodipodi:type="star"
++ style="opacity:1;fill:#a2a6a7;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path7908"
++ sodipodi:sides="3"
++ sodipodi:cx="16.875"
++ sodipodi:cy="5.75"
++ sodipodi:r1="0.6502704"
++ sodipodi:r2="0.3251352"
++ sodipodi:arg1="0.95613337"
++ sodipodi:arg2="2.0033309"
++ inkscape:flatsided="false"
++ inkscape:rounded="0"
++ inkscape:randomized="0"
++ d="M 17.25,6.28125 L 16.738712,6.0451923 L 16.227424,5.8091345 L 16.6875,5.484375 L 17.147576,5.1596154 L 17.198788,5.7204327 L 17.25,6.28125 z"
++ transform="matrix(-0.59323,-0.726082,-0.841753,0.513838,-573.4796,-69.20067)" />
++ <rect
++ style="opacity:1;fill:#a2a6a7;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ id="rect7910"
++ width="0.18422361"
++ height="0.99286842"
++ x="590"
++ y="-78.992867"
++ ry="0"
++ transform="scale(-1,1)" />
++ </g>
++ <path
++ transform="matrix(1.055159,0,0,1.055159,250.7822,20.64369)"
++ d="M -211.24815,9.3521948 A 3.2040777,3.2040777 0 1 1 -217.6563,9.3521948 A 3.2040777,3.2040777 0 1 1 -211.24815,9.3521948 z"
++ sodipodi:ry="3.2040777"
++ sodipodi:rx="3.2040777"
++ sodipodi:cy="9.3521948"
++ sodipodi:cx="-214.45222"
++ id="path7912"
++ style="opacity:0.83516487;fill:url(#linearGradient8954);fill-opacity:1;stroke:#c2c2c2;stroke-width:0.22414021;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ sodipodi:type="arc" />
++ <g
++ transform="translate(1.584276e-5,8.00313e-3)"
++ id="g7914"
++ style="display:inline">
++ <rect
++ transform="matrix(1.315757,0,0,1.315757,-7.347598,-8.553446)"
++ ry="0"
++ y="34.624207"
++ x="24.584782"
++ height="0.75728565"
++ width="0.23366779"
++ id="rect7916"
++ style="opacity:1;fill:#a2a6a7;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
++ <g
++ id="g7918">
++ <path
++ sodipodi:type="star"
++ style="opacity:1;fill:#a2a6a7;fill-opacity:1;stroke:none;stroke-width:0.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path7920"
++ sodipodi:sides="3"
++ sodipodi:cx="16.875"
++ sodipodi:cy="5.75"
++ sodipodi:r1="0.6502704"
++ sodipodi:r2="0.3251352"
++ sodipodi:arg1="0.95613337"
++ sodipodi:arg2="2.0033309"
++ inkscape:flatsided="false"
++ inkscape:rounded="0"
++ inkscape:randomized="0"
++ d="M 17.25,6.28125 L 16.738712,6.0451923 L 16.227424,5.8091345 L 16.6875,5.484375 L 17.147576,5.1596154 L 17.198788,5.7204327 L 17.25,6.28125 z"
++ transform="matrix(0.591247,-0.728125,0.83894,0.515285,9.532946,46.82691)" />
++ <rect
++ style="opacity:1;fill:#a2a6a7;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="rect7922"
++ width="0.30745003"
++ height="0.99640387"
++ x="25.692551"
++ y="37.003597"
++ ry="0" />
++ </g>
++ </g>
++ <g
++ transform="translate(-55.90238,-56.01615)"
++ id="g8443"
++ style="display:inline">
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#c2c2c2;stroke-width:1.91250193;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ d="M 97.88267,96.940154 C 104.58992,95.384481 92.027568,94.625463 91.340359,94.70701"
++ id="path8445"
++ sodipodi:nodetypes="cs" />
++ <path
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.78483576;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ d="M 97.875398,96.899543 C 104.58265,95.34387 92.020297,94.584853 91.333078,94.666399"
++ id="path8447"
++ sodipodi:nodetypes="cs" />
++ <g
++ style="fill:#c2c2c2;fill-opacity:1;display:inline"
++ id="g8449"
++ transform="matrix(1.148447,0,0,1.148447,52.4095,48.70484)">
++ <path
++ transform="matrix(1.044369,0,0,1.044369,-1.649051,-1.715604)"
++ d="M 35.40625,41.484375 A 4.578125,4.578125 0 1 1 26.25,41.484375 A 4.578125,4.578125 0 1 1 35.40625,41.484375 z"
++ sodipodi:ry="4.578125"
++ sodipodi:rx="4.578125"
++ sodipodi:cy="41.484375"
++ sodipodi:cx="30.828125"
++ id="path8451"
++ style="opacity:1;fill:#c2c2c2;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ sodipodi:type="arc" />
++ <path
++ transform="translate(0.25,0.34375)"
++ d="M 35.40625,41.484375 A 4.578125,4.578125 0 1 1 26.25,41.484375 A 4.578125,4.578125 0 1 1 35.40625,41.484375 z"
++ sodipodi:ry="4.578125"
++ sodipodi:rx="4.578125"
++ sodipodi:cy="41.484375"
++ sodipodi:cx="30.828125"
++ id="path8453"
++ style="opacity:1;fill:#c2c2c2;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ sodipodi:type="arc" />
++ </g>
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path8455"
++ sodipodi:cx="30.828125"
++ sodipodi:cy="41.484375"
++ sodipodi:rx="4.578125"
++ sodipodi:ry="4.578125"
++ d="M 35.40625,41.484375 A 4.578125,4.578125 0 1 1 26.25,41.484375 A 4.578125,4.578125 0 1 1 35.40625,41.484375 z"
++ transform="matrix(1.02821,0,0,1.02821,55.83221,53.73015)" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path8457"
++ sodipodi:cx="30.828125"
++ sodipodi:cy="41.484375"
++ sodipodi:rx="4.578125"
++ sodipodi:ry="4.578125"
++ d="M 35.40625,41.484375 A 4.578125,4.578125 0 1 1 26.25,41.484375 A 4.578125,4.578125 0 1 1 35.40625,41.484375 z"
++ transform="matrix(0.984529,0,0,0.984529,57.7018,55.75757)" />
++ <g
++ style="display:inline"
++ id="g8459"
++ transform="matrix(1.007793,0,0,1.004691,56.19417,54.3161)">
++ <rect
++ transform="matrix(0.985898,-0.167348,0.194419,0.980919,0,0)"
++ ry="1.5439408"
++ rx="1.6140188"
++ y="47.136684"
++ x="20.703314"
++ height="3.0878816"
++ width="13.480978"
++ id="rect8461"
++ style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:#c2c2c2;stroke-width:0.49689928;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <rect
++ transform="matrix(0.984635,-0.174627,0.177401,0.984139,0,0)"
++ ry="1.4996823"
++ rx="1.3586608"
++ y="47.28104"
++ x="21.659946"
++ height="3.0802486"
++ width="9.4694977"
++ id="rect8463"
++ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#c2c2c2;stroke-width:0.5495854;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ </g>
++ <g
++ style="display:inline"
++ id="g8465"
++ transform="matrix(1.211847,0,0,1.211847,52.90119,45.21661)">
++ <path
++ transform="translate(-0.34375,-9.375e-2)"
++ d="M 30.03125,39.921875 A 0.765625,0.765625 0 1 1 28.5,39.921875 A 0.765625,0.765625 0 1 1 30.03125,39.921875 z"
++ sodipodi:ry="0.765625"
++ sodipodi:rx="0.765625"
++ sodipodi:cy="39.921875"
++ sodipodi:cx="29.265625"
++ id="path8467"
++ style="opacity:1;fill:#cacaca;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ sodipodi:type="arc" />
++ <text
++ transform="matrix(0,-1,1,0,0,0)"
++ sodipodi:linespacing="125%"
++ id="text8469"
++ y="29.42164"
++ x="-40.349224"
++ style="font-size:1.31750739px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"><tspan
++ y="29.42164"
++ x="-40.349224"
++ id="tspan8471"
++ sodipodi:role="line">R</tspan></text>
++ </g>
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#8d8d8d;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path8473"
++ sodipodi:cx="31.406248"
++ sodipodi:cy="38.90625"
++ sodipodi:rx="0.46874997"
++ sodipodi:ry="0.46874997"
++ d="M 31.874998,38.90625 A 0.46874997,0.46874997 0 1 1 30.937498,38.90625 A 0.46874997,0.46874997 0 1 1 31.874998,38.90625 z"
++ transform="matrix(4.648302e-8,-0.525081,0.525081,4.648302e-8,63.94198,112.1245)" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#8d8d8d;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path8475"
++ sodipodi:cx="31.406248"
++ sodipodi:cy="38.90625"
++ sodipodi:rx="0.46874997"
++ sodipodi:ry="0.46874997"
++ d="M 31.874998,38.90625 A 0.46874997,0.46874997 0 1 1 30.937498,38.90625 A 0.46874997,0.46874997 0 1 1 31.874998,38.90625 z"
++ transform="matrix(4.648302e-8,-0.525081,0.525081,4.648302e-8,64.44962,111.0811)" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#8d8d8d;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path8477"
++ sodipodi:cx="31.406248"
++ sodipodi:cy="38.90625"
++ sodipodi:rx="0.46874997"
++ sodipodi:ry="0.46874997"
++ d="M 31.874998,38.90625 A 0.46874997,0.46874997 0 1 1 30.937498,38.90625 A 0.46874997,0.46874997 0 1 1 31.874998,38.90625 z"
++ transform="matrix(4.648302e-8,-0.525081,0.525081,4.648302e-8,65.15726,110.3156)" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#8d8d8d;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path8479"
++ sodipodi:cx="31.406248"
++ sodipodi:cy="38.90625"
++ sodipodi:rx="0.46874997"
++ sodipodi:ry="0.46874997"
++ d="M 31.874998,38.90625 A 0.46874997,0.46874997 0 1 1 30.937498,38.90625 A 0.46874997,0.46874997 0 1 1 31.874998,38.90625 z"
++ transform="matrix(4.648302e-8,-0.525081,0.525081,4.648302e-8,63.85072,113.2347)" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#8d8d8d;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path8481"
++ sodipodi:cx="31.406248"
++ sodipodi:cy="38.90625"
++ sodipodi:rx="0.46874997"
++ sodipodi:ry="0.46874997"
++ d="M 31.874998,38.90625 A 0.46874997,0.46874997 0 1 1 30.937498,38.90625 A 0.46874997,0.46874997 0 1 1 31.874998,38.90625 z"
++ transform="matrix(4.648302e-8,-0.525081,0.525081,4.648302e-8,64.12085,114.3221)" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#8d8d8d;fill-opacity:1;stroke:none;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
++ id="path8483"
++ sodipodi:cx="31.406248"
++ sodipodi:cy="38.90625"
++ sodipodi:rx="0.46874997"
++ sodipodi:ry="0.46874997"
++ d="M 31.874998,38.90625 A 0.46874997,0.46874997 0 1 1 30.937498,38.90625 A 0.46874997,0.46874997 0 1 1 31.874998,38.90625 z"
++ transform="matrix(4.648302e-8,-0.525081,0.525081,4.648302e-8,64.65661,115.3336)" />
++ </g>
++ </g>
++ <g
++ inkscape:label="Picture"
++ id="g5869" />
++ </g>
++ <g
++ id="g6012"
++ inkscape:label="pix"
++ transform="translate(-80.02649,-488.25015)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <g
++ id="g6014"
++ transform="matrix(2.45274e-2,0,0,2.086758e-2,45.69054,36.1536)">
++ <rect
++ y="-150.69685"
++ x="-1559.2523"
++ height="478.35718"
++ width="1339.6335"
++ id="rect6016"
++ style="opacity:0.40206185;fill:url(#linearGradient8956);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ sodipodi:nodetypes="cccc"
++ id="path6018"
++ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z"
++ style="opacity:0.40206185;fill:url(#radialGradient8958);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ style="opacity:0.40206185;fill:url(#radialGradient8960);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z"
++ id="path6020"
++ sodipodi:nodetypes="cccc" />
++ </g>
++ <path
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#535353;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 11.28569,7.9626278 C 10.66069,7.9626278 10.254441,8.252808 10.004442,8.8063808 C 10.004441,8.8063808 3.5356915,25.909938 3.5356915,25.909938 C 3.5356915,25.909938 3.2856915,26.581497 3.2856915,27.691188 C 3.2856915,27.691188 3.2856915,37.341156 3.2856915,37.341156 C 3.2856915,38.423769 3.943477,38.966158 4.9419415,38.966156 L 43.50444,38.966156 C 44.489293,38.966156 45.09819,38.247976 45.09819,37.122406 L 45.09819,27.472438 C 45.09819,27.472438 45.204153,26.702015 45.00444,26.159938 L 38.28569,8.9626314 C 38.101165,8.4507246 37.648785,7.9745331 37.16069,7.9626278 L 11.28569,7.9626278 z"
++ id="path4196"
++ sodipodi:nodetypes="cccsccccccccc" />
++ <path
++ style="fill:url(#linearGradient8962);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.02044296px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 3.2735915,26.996812 L 4.0381936,26.304597 L 41.647883,26.367097 L 45.11029,26.684395 L 45.11029,37.122927 C 45.11029,38.248496 44.503272,38.966258 43.518419,38.966258 L 4.9354314,38.966258 C 3.9369667,38.966258 3.2735915,38.424207 3.2735915,37.341594 L 3.2735915,26.996812 z"
++ id="path4170"
++ sodipodi:nodetypes="ccccccccc" />
++ <path
++ style="fill:url(#radialGradient8964);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 3.5490842,25.914404 C 2.8347985,27.37869 3.5484686,28.307261 4.5847985,28.307261 C 4.5847985,28.307261 43.584797,28.307261 43.584797,28.307261 C 44.703844,28.283451 45.430035,27.295356 45.013368,26.164403 L 38.299082,8.9537044 C 38.114558,8.4417976 37.64432,7.9656058 37.156225,7.9537008 L 11.299083,7.9537008 C 10.674083,7.9537008 10.263369,8.257274 10.01337,8.8108468 C 10.01337,8.8108468 3.5490842,25.914404 3.5490842,25.914404 z"
++ id="path3093"
++ sodipodi:nodetypes="csccccccs" />
++ <rect
++ style="opacity:1;fill:url(#linearGradient8966);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.40899992;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect4174"
++ width="17.625"
++ height="5.5625"
++ x="7.857996"
++ y="31.174183" />
++ <path
++ style="opacity:0.81142853;fill:url(#linearGradient8968);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 7.8579947,36.73668 C 7.8579947,36.73668 7.8579947,32.725195 7.8579947,32.725195 C 9.6935221,35.904421 16.154485,36.73668 20.795492,36.73668 C 20.795492,36.73668 7.8579947,36.73668 7.8579947,36.73668 z"
++ id="path4194"
++ sodipodi:nodetypes="cscc" />
++ <path
++ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 44.796162,25.628688 C 44.859684,26.878662 44.382159,27.944528 43.474046,27.972438 C 43.474046,27.972438 5.3553296,27.972437 5.3553297,27.972438 C 4.0660978,27.972438 3.4875937,27.647491 3.271279,27.104382 C 3.3630404,28.048714 4.0970964,28.753688 5.3553297,28.753688 C 5.3553296,28.753687 43.474046,28.753688 43.474046,28.753688 C 44.550053,28.720617 45.226851,27.329664 44.82621,25.758897 L 44.796162,25.628688 z"
++ id="path4201"
++ sodipodi:nodetypes="cccccccc" />
++ <path
++ style="opacity:0.69142857;fill:url(#linearGradient8970);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 10.96875,10.15625 C 10.922675,10.356571 10.78125,10.543047 10.78125,10.75 C 10.78125,11.698605 11.37223,12.539474 12.125,13.34375 C 12.365268,13.189675 12.490117,12.989342 12.75,12.84375 C 11.809691,12.027746 11.196604,11.127168 10.96875,10.15625 z M 37.625,10.15625 C 37.396273,11.125866 36.782988,12.028676 35.84375,12.84375 C 36.117894,12.997332 36.247738,13.21199 36.5,13.375 C 37.257262,12.568344 37.8125,11.701956 37.8125,10.75 C 37.8125,10.543047 37.670906,10.356571 37.625,10.15625 z M 39.8125,18.59375 C 39.198709,22.633861 32.513887,25.84375 24.28125,25.84375 C 16.068996,25.843751 9.4211001,22.650964 8.78125,18.625 C 8.7488928,18.822132 8.65625,19.016882 8.65625,19.21875 C 8.6562503,23.536697 15.645354,27.062501 24.28125,27.0625 C 32.917146,27.0625 39.937499,23.536698 39.9375,19.21875 C 39.9375,19.005826 39.848449,18.801394 39.8125,18.59375 z"
++ id="path4211" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:#ffffff;fill-opacity:0.45762706;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path4224"
++ sodipodi:cx="7.2036505"
++ sodipodi:cy="25.593554"
++ sodipodi:rx="1.3700194"
++ sodipodi:ry="1.016466"
++ d="M 8.5736699,25.593554 A 1.3700194,1.016466 0 1 1 5.833631,25.593554 A 1.3700194,1.016466 0 1 1 8.5736699,25.593554 z"
++ transform="translate(8.838843e-2,0.176776)" />
++ <path
++ transform="translate(33.96705,8.838804e-2)"
++ d="M 8.5736699,25.593554 A 1.3700194,1.016466 0 1 1 5.833631,25.593554 A 1.3700194,1.016466 0 1 1 8.5736699,25.593554 z"
++ sodipodi:ry="1.016466"
++ sodipodi:rx="1.3700194"
++ sodipodi:cy="25.593554"
++ sodipodi:cx="7.2036505"
++ id="path4226"
++ style="opacity:1;fill:#ffffff;fill-opacity:0.45762706;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:nodetypes="cccsccccccccc"
++ id="path4252"
++ d="M 11.642515,8.4157227 C 11.040823,8.4157227 10.649724,8.6950813 10.409049,9.22801 C 10.409048,9.22801 3.9940341,25.818732 3.9940341,25.818732 C 3.9940341,25.818732 3.7533573,26.465247 3.7533573,27.533555 C 3.7533573,27.533555 3.7533573,36.823651 3.7533573,36.823651 C 3.7533573,38.178391 4.1974134,38.45055 5.3478414,38.45055 L 43.034746,38.45055 C 44.357872,38.45055 44.569062,38.134153 44.569062,36.613058 L 44.569062,27.322962 C 44.569062,27.322962 44.671072,26.581271 44.478807,26.059409 L 37.885616,9.2534336 C 37.707973,8.7606171 37.334964,8.427184 36.865071,8.4157227 L 11.642515,8.4157227 z"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8972);stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ id="path4282"
++ d="M 40.5,31.429166 L 40.5,36.450101"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372885" />
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372885"
++ d="M 38.5,31.488943 L 38.5,36.509878"
++ id="path4284" />
++ <path
++ id="path4286"
++ d="M 36.5,31.488943 L 36.5,36.509878"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372885" />
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372885"
++ d="M 34.5,31.488943 L 34.5,36.509878"
++ id="path4288" />
++ <path
++ id="path4290"
++ d="M 32.5,31.488943 L 32.5,36.509878"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372885" />
++ <path
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372885"
++ d="M 30.5,31.488943 L 30.5,36.509878"
++ id="path4292" />
++ <path
++ style="opacity:0.09714284;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 39.5,31.479065 L 39.5,36.5"
++ id="path4294" />
++ <path
++ id="path4296"
++ d="M 37.5,31.538842 L 37.5,36.559777"
++ style="opacity:0.09714284;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1" />
++ <path
++ style="opacity:0.09714284;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 35.5,31.538842 L 35.5,36.559777"
++ id="path4298" />
++ <path
++ id="path4300"
++ d="M 33.5,31.538842 L 33.5,36.559777"
++ style="opacity:0.09714284;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1" />
++ <path
++ style="opacity:0.09714284;fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000048px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 31.5,31.538842 L 31.5,36.559777"
++ id="path4302" />
++ <path
++ style="opacity:0.43999999;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 7.875,31.1875 L 7.875,36.71875 L 20.4375,36.71875 L 8.21875,36.375 L 7.875,31.1875 z"
++ id="path4572" />
++ <path
++ transform="matrix(1.037815,0,0,1.060747,-1.632878,-2.094626)"
++ d="M 39.875,19.5625 A 14.875,6.6875 0 1 1 10.125,19.5625 A 14.875,6.6875 0 1 1 39.875,19.5625 z"
++ sodipodi:ry="6.6875"
++ sodipodi:rx="14.875"
++ sodipodi:cy="19.5625"
++ sodipodi:cx="25"
++ id="path2545"
++ style="opacity:0.20571427;fill:url(#linearGradient8974);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.93365198;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.42372879;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ </g>
++ <g
++ inkscape:label="Layer 1"
++ id="g6162"
++ transform="translate(-81.669824,-539.09139)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <path
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ sodipodi:type="arc"
++ style="opacity:0.40641713;fill:url(#radialGradient8976);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.81415844;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path12960"
++ sodipodi:cx="30.203562"
++ sodipodi:cy="44.565483"
++ sodipodi:rx="6.5659914"
++ sodipodi:ry="2.2223356"
++ d="M 36.769553,44.565483 A 6.5659914,2.2223356 0 1 1 23.63757,44.565483 A 6.5659914,2.2223356 0 1 1 36.769553,44.565483 z"
++ transform="matrix(2.752736,1.43844,-2.455422,4.679605,48.40044,-223.0412)" />
++ <path
++ style="fill:#484848;fill-opacity:1;fill-rule:evenodd;stroke:#4d4d4d;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 12.80097,5.8182116 L 5.1577075,12.516803 L 5.4153448,18.657177 L 23.407072,34.845436 L 35.000785,24.110515 L 35.258424,17.411926 L 12.80097,5.8182116 z"
++ id="path12803"
++ sodipodi:nodetypes="ccccccc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="fill:#a6a6a6;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 5.0704024,12.658182 L 5.3171158,18.579297 L 23.57389,34.615652 L 23.327178,28.201111 L 5.0704024,12.658182 z"
++ id="path12787"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="fill:#7f7f7f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 23.327178,28.201111 L 23.327178,34.739009 L 34.922696,24.006986 L 35.169408,17.345732 L 23.327178,28.201111 z"
++ id="path12789"
++ sodipodi:nodetypes="ccccc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="fill:url(#linearGradient8978);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 5.0704024,12.669106 L 23.57389,28.447823 L 35.169408,17.592444 L 12.71851,5.7502141 L 5.0704024,12.669106 z"
++ id="path12791"
++ sodipodi:nodetypes="ccccc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="fill:#ffc11a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 6.2664926,11.644777 L 9.1411708,13.645034 C 9.1411708,13.645034 9.8196319,13.891747 10.128023,13.645034 C 10.436414,13.398322 10.374736,12.658182 10.374736,12.658182 L 7.5000581,10.400285 L 6.2664926,11.644777 z"
++ id="path12793"
++ sodipodi:nodetypes="ccsccc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ id="path12795"
++ d="M 8.4010304,9.6710707 L 11.361588,11.671328 C 11.361588,11.671328 12.040051,11.918041 12.348442,11.671328 C 12.656831,11.424616 12.595154,10.684476 12.595154,10.684476 L 9.7204774,8.4265796 L 8.4010304,9.6710707 z"
++ style="fill:#ffc11a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:nodetypes="ccsccc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="fill:#ffc11a;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 10.583973,7.7348437 L 13.458651,9.8209807 C 13.458651,9.8209807 14.137112,10.067694 14.445505,9.8209807 C 14.753896,9.5742672 14.692216,8.8341268 14.692216,8.8341268 L 11.731658,6.4903526 L 10.583973,7.7348437 z"
++ id="path12797"
++ sodipodi:nodetypes="ccsccc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ sodipodi:nodetypes="ccccccc"
++ id="path12820"
++ d="M 12.829749,6.3689141 L 5.7478543,13.004915 L 5.9865695,18.350786 L 23.25803,33.865361 L 34.343751,23.57536 L 34.582465,17.96991 L 12.829749,6.3689141 z"
++ style="opacity:0.34224596;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8980);stroke-width:5;stroke-linecap:round;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 31.564353,28.210626 C 31.564353,28.210626 37.404149,30.529369 40.495806,35.252734 C 43.587462,39.976098 45.305051,46.846447 45.305051,46.846447"
++ id="path12822"
++ sodipodi:nodetypes="csc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ sodipodi:nodetypes="cscscscscc"
++ style="fill:url(#radialGradient8982);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 32.200708,26.732644 C 31.367882,26.833528 30.70943,27.486206 30.601215,28.318112 C 30.492999,29.150018 30.962562,29.949431 31.741863,30.260022 C 31.741863,30.260022 36.625199,32.925232 38.260739,35.423974 C 40.0495,38.156803 41.243238,42.622122 41.243238,42.622122 C 41.496652,43.6041 42.498135,44.194717 43.480113,43.941304 C 44.462091,43.687889 45.052708,42.686407 44.799295,41.704429 C 44.799295,41.704429 43.698802,36.992826 41.35795,33.416522 C 38.863875,29.606131 33.118401,26.876032 33.118401,26.876032 C 32.829855,26.750352 32.51384,26.700975 32.200708,26.732644 z"
++ id="path12824"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ id="path12801"
++ d="M 15.925782,15.865453 L 30.975286,27.214258 C 32.702277,28.324466 34.36759,27.029223 35.416121,25.733979 C 36.464653,24.438734 36.279618,22.896778 35.169408,22.03328 L 19.133053,13.39832 L 15.925782,15.865453 z"
++ style="fill:#a0a0a1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:nodetypes="cczccc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="fill:url(#linearGradient8984);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 15.309,15.865453 L 30.728571,25.240552 C 31.592068,25.857335 33.442415,25.117197 34.182556,24.253702 C 34.922696,23.390204 34.305913,22.156639 33.689131,21.786569 L 19.009696,13.02825 L 15.309,15.865453 z"
++ id="path12799"
++ sodipodi:nodetypes="cczccc"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ </g>
++ <g
++ id="g12659"
++ transform="translate(-110.75798,-523.53448)">
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ ry="5"
++ rx="5"
++ y="-171.33693"
++ x="164.58557"
++ height="290.7514"
++ width="790.17462"
++ id="rect4673"
++ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2.01112819;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1" />
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3530"
++ width="153.2551"
++ height="99.162369"
++ x="185.83698"
++ y="-59.909706"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="191.6134"
++ y="-42.633949"
++ id="text3532"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan3534"
++ x="191.6134"
++ y="-42.633949">file-source</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3538"
++ width="49.561798"
++ height="33.867229"
++ x="289.49799"
++ y="-27.26214" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="308.49664"
++ y="-7.5990381"
++ id="text3540"><tspan
++ sodipodi:role="line"
++ id="tspan3542"
++ x="308.49664"
++ y="-7.5990381">src</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3544"
++ width="153.2551"
++ height="99.162369"
++ x="379.95404"
++ y="-59.909706"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="385.73041"
++ y="-42.633949"
++ id="text3546"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan3548"
++ x="385.73041"
++ y="-42.633949">ogg-demuxer</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3552"
++ width="49.561798"
++ height="33.867229"
++ x="379.94818"
++ y="-27.26214" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="391.9256"
++ y="-6.600503"
++ id="text3554"><tspan
++ sodipodi:role="line"
++ id="tspan3556"
++ x="391.9256"
++ y="-6.600503">sink</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3560"
++ width="49.561798"
++ height="33.867229"
++ x="483.61493"
++ y="-48.764091" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="492.61359"
++ y="-27.700373"
++ id="text3562"><tspan
++ sodipodi:role="line"
++ id="tspan3564"
++ x="492.61359"
++ y="-27.700373">src_01</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3566"
++ width="153.2551"
++ height="99.162369"
++ x="586.65533"
++ y="-122.78056"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="592.43182"
++ y="-105.5048"
++ id="text3568"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan3570"
++ x="592.43182"
++ y="-105.5048">vorbis-decoder</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3574"
++ width="49.561798"
++ height="33.867229"
++ x="586.64948"
++ y="-90.132973" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="598.62689"
++ y="-69.471352"
++ id="text3576"><tspan
++ sodipodi:role="line"
++ id="tspan3578"
++ x="598.62689"
++ y="-69.471352">sink</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3582"
++ width="49.561798"
++ height="33.867229"
++ x="690.31622"
++ y="-90.132973" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="709.31488"
++ y="-70.469887"
++ id="text3584"><tspan
++ sodipodi:role="line"
++ id="tspan3586"
++ x="709.31488"
++ y="-70.469887">src</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3610"
++ width="153.2551"
++ height="99.162369"
++ x="780.29425"
++ y="-122.78056"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="786.07062"
++ y="-105.5048"
++ id="text3612"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan3614"
++ x="786.07062"
++ y="-105.5048">audio-sink</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3618"
++ width="49.561798"
++ height="33.867229"
++ x="780.28839"
++ y="-90.132973" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="792.26581"
++ y="-69.471352"
++ id="text3620"><tspan
++ sodipodi:role="line"
++ id="tspan3622"
++ x="792.26581"
++ y="-69.471352">sink</tspan></text>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 338.86911,-10.30825 L 375.86911,-10.30825"
++ id="path3624"
++ sodipodi:nodetypes="cc" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="173.85449"
++ y="-148.00755"
++ id="text3626"><tspan
++ style="font-size:18px;font-weight:bold;fill:#204a87;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ sodipodi:role="line"
++ id="tspan3628"
++ x="173.85449"
++ y="-148.00755">pipeline</tspan></text>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 741.29421,-73.1791 L 778.29421,-73.1791"
++ id="path3632"
++ sodipodi:nodetypes="cc" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 740.57991,51.61323 L 777.57991,51.61323"
++ id="path3634"
++ sodipodi:nodetypes="cc" />
++ <g
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ transform="translate(-816.76968,195.18659)"
++ id="g7012">
++ <g
++ style="display:inline"
++ transform="matrix(2.105461e-2,0,0,2.086758e-2,1070.6274,-195.7891)"
++ id="g6707">
++ <rect
++ style="opacity:0.40206185;fill:url(#linearGradient9048);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="rect6709"
++ width="1339.6335"
++ height="478.35718"
++ x="-1559.2523"
++ y="-150.69685" />
++ <path
++ style="opacity:0.40206185;fill:url(#radialGradient9050);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z"
++ id="path6711"
++ sodipodi:nodetypes="cccc" />
++ <path
++ sodipodi:nodetypes="cccc"
++ id="path6713"
++ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z"
++ style="opacity:0.40206185;fill:url(#radialGradient9052);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ </g>
++ <rect
++ ry="2.394444"
++ rx="2.4241352"
++ y="-215.91727"
++ x="1035.488"
++ height="23.112879"
++ width="31.978371"
++ id="rect3115"
++ style="fill:url(#linearGradient9054);fill-opacity:1;fill-rule:nonzero;stroke:#a0670c;stroke-width:1.00000072;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible" />
++ <rect
++ style="opacity:0.48101268;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient9056);stroke-width:1.00000107;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
++ id="rect4220"
++ width="29.804138"
++ height="21.075352"
++ x="1036.5247"
++ y="-214.94901"
++ rx="1.2846882"
++ ry="1.2846882" />
++ <path
++ sodipodi:nodetypes="ccccc"
++ id="path4162"
++ d="M 1036.7955,-214.64552 L 1041.8454,-221.45636 L 1060.641,-221.55737 L 1065.861,-214.78376 L 1036.7955,-214.64552 z"
++ style="fill:url(#linearGradient9058);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9060);stroke-width:1.00000083;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:nodetypes="ccccc"
++ id="path4164"
++ d="M 1066.302,-214.867 L 1071.495,-207.67234 L 1031.9866,-207.67234 L 1036.6507,-214.87194 L 1066.302,-214.867 z"
++ style="fill:url(#linearGradient9062);fill-opacity:1;fill-rule:nonzero;stroke:#a0670c;stroke-width:1.00000048;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible" />
++ <path
++ sodipodi:nodetypes="ccccc"
++ id="path4178"
++ d="M 1060.875,-221.5786 L 1065.5579,-214.65633 L 1074.5915,-210.2715 L 1066.477,-219.18416 L 1060.875,-221.5786 z"
++ style="fill:url(#linearGradient9064);fill-opacity:1;fill-rule:nonzero;stroke:#a0670c;stroke-width:1.00000048;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible" />
++ <path
++ sodipodi:nodetypes="ccccc"
++ style="fill:#f8e8cf;fill-opacity:1;fill-rule:nonzero;stroke:#a0670c;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
++ d="M 1041.6434,-221.47758 L 1037.6676,-214.75734 L 1028.533,-210.37252 L 1036.6475,-219.28517 L 1041.6434,-221.47758 z"
++ id="path4180" />
++ <path
++ style="fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#f4e3ca;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
++ d="M 1065.0507,-214.75665 L 1069.5046,-208.69969 L 1033.674,-208.69969 L 1037.815,-214.88001 L 1065.0507,-214.75665 z"
++ id="path4954"
++ sodipodi:nodetypes="ccccc" />
++ <g
++ id="g2892"
++ transform="matrix(0.676538,0,0,1,1032.0206,-231.1927)">
++ <path
++ style="opacity:1;fill:url(#radialGradient9066);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 23.926073,12.101621 C 18.588065,12.101621 14.282569,14.129809 14.282569,16.641813 L 33.604773,16.641813 C 33.604773,14.129809 29.264081,12.101621 23.926073,12.101621 z"
++ id="path2882" />
++ <path
++ id="path2141"
++ d="M 23.931961,12.861168 C 20.379986,12.861168 17.515057,14.210748 17.515057,15.882266 L 30.372285,15.882266 C 30.372285,14.210748 27.483936,12.861168 23.931961,12.861168 z"
++ style="opacity:1;fill:url(#radialGradient9068);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ </g>
++ <g
++ transform="matrix(0.676538,0,0,1,1038.5206,-231.1927)"
++ id="g2900">
++ <path
++ id="path2902"
++ d="M 23.926073,12.101621 C 18.588065,12.101621 14.282569,14.129809 14.282569,16.641813 L 33.604773,16.641813 C 33.604773,14.129809 29.264081,12.101621 23.926073,12.101621 z"
++ style="opacity:1;fill:url(#radialGradient9070);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ style="opacity:1;fill:url(#radialGradient9072);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 23.931961,12.861168 C 20.379986,12.861168 17.515057,14.210748 17.515057,15.882266 L 30.372285,15.882266 C 30.372285,14.210748 27.483936,12.861168 23.931961,12.861168 z"
++ id="path2904" />
++ </g>
++ <path
++ style="opacity:0.87974686;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9074);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
++ d="M 1037.678,-214.8209 L 1041.0623,-220.59968 L 1061.5405,-220.6749 L 1065.3825,-214.82282 L 1037.678,-214.8209 z"
++ id="path4966"
++ sodipodi:nodetypes="ccccc" />
++ </g>
++ <g
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ transform="translate(-830.81219,194.07975)"
++ id="g7032">
++ <g
++ inkscape:label="shadow"
++ id="layer2"
++ transform="matrix(0.8882175,0,0,0.8882175,1264.3555,-226.72473)">
++ <path
++ transform="matrix(1.18638,0,0,1.18638,-4.539687,-7.794678)"
++ d="M 44.285715,38.714287 A 19.928572,9.837245 0 1 1 4.4285717,38.714287 A 19.928572,9.837245 0 1 1 44.285715,38.714287 z"
++ sodipodi:ry="9.837245"
++ sodipodi:rx="19.928572"
++ sodipodi:cy="38.714287"
++ sodipodi:cx="24.357143"
++ id="path1538"
++ style="fill:url(#radialGradient9076);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.50000042;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ </g>
++ <g
++ id="g3839"
++ inkscape:label="Layer 1"
++ transform="matrix(0.8882175,0,0,0.8882175,1264.3555,-226.72473)">
++ <path
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ style="opacity:1;fill:url(#linearGradient9078);fill-opacity:1;fill-rule:nonzero;stroke:#3f4561;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 22.699525,0.94746963 C 22.22635,0.97984519 21.766437,1.0531317 21.301673,1.1063165 L 21.269903,1.1063165 L 20.157975,7.1742671 C 18.345621,7.5870046 16.640562,8.2874574 15.106644,9.2392765 L 10.118853,5.6493371 C 8.770521,6.6961412 7.543552,7.9170049 6.465374,9.2392765 L 9.928236,14.290607 C 8.876814,15.89739 8.086153,17.732094 7.640841,19.659632 C 7.640765,19.668743 7.640779,19.689813 7.640841,19.691401 L 1.60466,20.644482 C 1.494303,21.545851 1.445813,22.477386 1.445813,23.408418 C 1.445813,24.170171 1.466846,24.921747 1.541121,25.664043 L 7.577303,26.744202 C 8.0066,28.840363 8.822112,30.797987 9.960006,32.526228 L 6.370066,37.450482 C 7.398201,38.726866 8.585171,39.888962 9.864698,40.913343 L 14.947798,37.418712 C 16.724273,38.551956 18.707343,39.346604 20.856901,39.737877 L 21.809983,45.742288 C 22.487237,45.803935 23.181758,45.805827 23.874992,45.805827 C 24.853677,45.805826 25.788512,45.768738 26.734236,45.64698 L 27.877933,39.515491 C 29.91886,39.007587 31.836112,38.126493 33.501113,36.942172 L 38.393596,40.500342 C 39.662366,39.420897 40.822583,38.180154 41.824689,36.846863 L 38.266519,31.700225 C 39.230125,30.036028 39.897817,28.199859 40.23622,26.235892 L 46.240632,25.282811 C 46.29329,24.656221 46.30417,24.048546 46.30417,23.408418 C 46.30417,22.296018 46.174875,21.205317 46.018246,20.136172 L 39.918526,19.024244 C 39.440518,17.259164 38.656214,15.612364 37.662901,14.13176 L 41.25284,9.2075071 C 40.140075,7.8466524 38.870718,6.5895264 37.472284,5.5222596 L 32.293876,9.0804296 C 30.805549,8.200202 29.203897,7.5248159 27.464931,7.1424978 L 26.51185,1.1063165 C 25.644369,1.0042729 24.769749,0.94746963 23.874992,0.94746963 C 23.633166,0.94746964 23.384286,0.93986063 23.144296,0.94746963 C 23.027301,0.95117908 22.911525,0.94066346 22.794833,0.94746963 C 22.763228,0.94931296 22.73107,0.94531125 22.699525,0.94746963 z M 23.525529,16.387386 C 23.641592,16.381497 23.757473,16.387386 23.874992,16.387386 C 27.635598,16.387386 30.705408,19.457196 30.705408,23.217802 C 30.705409,26.978407 27.635597,30.016448 23.874992,30.016448 C 20.114387,30.016449 17.076346,26.978407 17.076346,23.217802 C 17.076347,19.574716 19.927558,16.569963 23.525529,16.387386 z"
++ id="path3243" />
++ <path
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ sodipodi:type="arc"
++ style="opacity:0.64772728;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.62180054;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path3283"
++ sodipodi:cx="23.511301"
++ sodipodi:cy="23.781593"
++ sodipodi:rx="12.727922"
++ sodipodi:ry="12.727922"
++ d="M 36.239223,23.781593 A 12.727922,12.727922 0 1 1 10.783379,23.781593 A 12.727922,12.727922 0 1 1 36.239223,23.781593 z"
++ transform="matrix(0.616598,0,0,0.616598,9.38202,8.539674)" />
++ <path
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ id="path3285"
++ d="M 21.995808,2.1484671 L 21.103024,8.0235243 C 19.404254,8.4103946 16.279442,9.5936035 14.841657,10.485771 L 10.091975,6.9406268 C 8.828145,7.9218257 8.741474,7.9883656 7.730867,9.2277688 L 11.165063,14.320988 C 10.179537,15.827071 8.995796,18.510982 8.570778,20.42893 C 8.570778,20.42893 2.552988,21.443355 2.552988,21.443355 C 2.449547,22.288234 2.49926,24.096528 2.56888,24.792303 L 8.317097,25.82782 C 8.71949,27.79261 10.225324,30.955232 11.291904,32.575161 L 7.656902,37.377719 C 8.620601,38.57411 8.813474,38.683589 10.01281,39.64377 L 14.873441,36.082733 C 16.538581,37.144954 19.84373,38.437109 21.858571,38.80386 L 22.656299,44.604952 C 23.291109,44.662736 25.044829,44.824827 25.931283,44.710701 L 26.824066,38.671821 C 28.737084,38.195749 32.042539,36.838896 33.603191,35.728798 L 38.458624,39.236958 C 39.647878,38.225166 39.658533,38.072709 40.597835,36.822978 L 36.999815,31.708667 C 37.90303,30.148767 39.070902,27.098068 39.388097,25.257187 L 45.279046,24.279744 C 45.328399,23.692424 45.330802,22.054578 45.18399,21.052439 L 39.182092,20.016922 C 38.73404,18.362463 37.196418,15.381153 36.265359,13.993342 L 40.080075,9.1907857 C 39.037052,7.915218 38.64924,7.7402002 37.338448,6.7398212 L 32.313994,10.337839 C 30.918941,9.5127782 28.137095,8.2550417 26.507114,7.8966842 L 25.619528,2.1484671 C 24.806414,2.0528187 22.460488,2.0952921 21.995808,2.1484671 z"
++ style="opacity:0.34659089;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.99999923;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:nodetypes="ccccccccccccccccccccccccccccccccc" />
++ <path
++ style="opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 10.102903,6.2970655 C 8.7545689,7.3438694 8.1656464,7.9719226 7.0874684,9.2941942 L 10.489927,14.259153 C 9.4385072,15.857755 8.3316275,18.426114 8.1423859,19.987706 C 8.1423859,19.987706 2.0798859,21.0319 2.0798859,21.0319 C 2.0109129,21.595256 1.90625,22.884803 1.90625,22.884803 L 2.0830267,24.447303 C 2.5107567,24.535638 2.9231817,24.617818 3.3642767,24.666053 L 3.8642767,23.134803 C 4.2083177,23.163279 4.5439297,23.197303 4.8955267,23.197303 C 5.2467347,23.197303 5.6139847,23.163473 5.9580267,23.134803 L 6.4267767,24.666053 C 6.8680647,24.617818 7.3115487,24.535638 7.7392767,24.447303 L 7.7392767,22.884803 C 8.4250337,22.72518 9.0712777,22.497045 9.7080267,22.228553 L 10.645527,23.509803 C 11.047878,23.327709 11.421123,23.133984 11.801777,22.916053 L 11.301777,21.416053 C 11.89901,21.053803 12.463529,20.620706 12.989277,20.166053 L 14.270527,21.103553 C 14.596162,20.806973 14.91164,20.491691 15.208027,20.166053 L 14.270527,18.916053 C 14.725373,18.390305 15.127027,17.826171 15.489277,17.228553 L 16.989277,17.697303 C 17.207208,17.316456 17.432571,16.943209 17.614277,16.541053 L 16.333027,15.603553 C 16.601517,14.966804 16.798016,14.320561 16.958027,13.634803 L 18.551777,13.634803 C 18.640112,13.207076 18.691236,12.763591 18.739277,12.322303 L 17.239277,11.853553 C 17.268139,11.509705 17.301777,11.142456 17.301777,10.791053 C 17.301776,10.43965 17.267753,10.104039 17.239277,9.7598034 L 18.739277,9.2910534 C 18.69373,8.8711662 18.633686,8.4490548 18.551777,8.0410534 C 17.404349,8.4403544 15.999117,9.1941729 14.983265,9.8245243 L 10.102903,6.2970655 z"
++ id="path3767"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ sodipodi:nodetypes="cccccccccsccccccccccccccccccccsccccc" />
++ <path
++ style="opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 37.236641,17.217754 C 36.85286,17.39913 36.490003,17.603509 36.123236,17.813295 L 36.692886,19.548136 C 35.995792,19.970436 35.338156,20.467825 34.725008,20.998151 L 33.249099,19.910639 C 32.869013,20.256538 32.507327,20.618223 32.161588,20.998151 L 33.249099,22.474059 C 32.718773,23.087371 32.221547,23.745002 31.799084,24.441937 L 31.255328,24.260685 C 31.207646,24.960968 31.018949,25.62217 30.737466,26.228563 L 30.841038,26.306242 C 30.527881,27.048922 30.27649,27.83664 30.090137,28.636624 L 28.614229,28.636624 C 28.477946,28.722076 28.343676,28.821684 28.199938,28.895555 C 28.121568,29.310822 28.065026,29.712881 28.018687,30.138426 L 29.77942,30.708074 C 29.746033,31.10935 29.727633,31.515269 29.727633,31.925052 C 29.727631,32.334993 29.746034,32.740753 29.77942,33.142029 L 28.018687,33.711677 C 28.074705,34.226432 28.148678,34.740347 28.251725,35.239372 L 30.090137,35.213479 C 30.218255,35.763466 30.393202,36.320918 30.582107,36.844746 C 31.327023,36.557466 32.05594,36.214561 32.731236,35.809021 C 32.319649,34.59298 32.083908,33.279913 32.083908,31.925052 C 32.083909,26.727119 35.376289,22.288397 39.981313,20.583861 L 38.893802,20.402608 C 38.671014,19.579946 38.382478,18.774017 38.013435,18.020441 C 38.002581,17.998277 37.99851,17.96486 37.987542,17.942761 L 37.935756,17.890975 L 37.236641,17.217754 z"
++ id="path3770"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ </g>
++ </g>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3848"
++ width="49.561798"
++ height="33.867229"
++ x="483.42755"
++ y="-5.2878809" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="492.42621"
++ y="15.77584"
++ id="text3850"><tspan
++ sodipodi:role="line"
++ id="tspan3852"
++ x="492.42621"
++ y="15.77584">src_02</tspan></text>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 532.61231,15.70274 L 583.15071,50.6503"
++ id="path3854"
++ sodipodi:nodetypes="cc" />
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3856"
++ width="153.2551"
++ height="99.162369"
++ x="586.65533"
++ y="2.011771"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="592.43182"
++ y="19.287527"
++ id="text3858"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan3860"
++ x="592.43182"
++ y="19.287527">theora-decoder</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3864"
++ width="49.561798"
++ height="33.867229"
++ x="586.64948"
++ y="34.65934" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="598.62689"
++ y="55.320976"
++ id="text3866"><tspan
++ sodipodi:role="line"
++ id="tspan3868"
++ x="598.62689"
++ y="55.320976">sink</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3872"
++ width="49.561798"
++ height="33.867229"
++ x="690.31622"
++ y="34.65934" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="709.31488"
++ y="54.322441"
++ id="text3874"><tspan
++ sodipodi:role="line"
++ id="tspan3876"
++ x="709.31488"
++ y="54.322441">src</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3878"
++ width="153.2551"
++ height="99.162369"
++ x="780.29999"
++ y="2.011771"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="786.07635"
++ y="19.287542"
++ id="text3880"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan3882"
++ x="786.07635"
++ y="19.287542">video-sink</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3886"
++ width="49.561798"
++ height="33.867229"
++ x="780.29413"
++ y="34.65934" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="792.27167"
++ y="55.320976"
++ id="text3888"><tspan
++ sodipodi:role="line"
++ id="tspan3890"
++ x="792.27167"
++ y="55.320976">sink</tspan></text>
++ <g
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ transform="translate(-830.81219,185.30822)"
++ id="g7053">
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.3;fill:url(#radialGradient9080);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path1344"
++ sodipodi:cx="23.25"
++ sodipodi:cy="35.375"
++ sodipodi:rx="18.5"
++ sodipodi:ry="7.375"
++ d="M 41.75,35.375 A 18.5,7.375 0 1 1 4.75,35.375 A 18.5,7.375 0 1 1 41.75,35.375 z"
++ transform="matrix(0.9587652,0,0,0.9587652,1470.52,-281.13949)" />
++ <path
++ sodipodi:nodetypes="cccccccccccccc"
++ id="path7042"
++ d="M 1510.4286,-276.38353 C 1510.4286,-276.38353 1488.3171,-273.66577 1488.3171,-273.66577 L 1488.3171,-252.78267 C 1486.739,-253.31732 1484.5474,-253.45709 1482.145,-252.96243 C 1477.9683,-252.10245 1474.9755,-249.799 1475.4337,-247.83903 C 1475.8918,-245.87906 1479.6462,-244.97163 1483.8229,-245.83162 C 1487.7698,-246.64429 1491.1901,-248.74416 1491.112,-250.62544 L 1491.2618,-268.87194 C 1491.2618,-268.87194 1507.4941,-271.64786 1507.4941,-271.64786 L 1507.4941,-255.07598 C 1497.6668,-256.51412 1494.75,-252.30204 1495.2082,-250.34207 C 1495.6664,-248.3821 1499.4207,-247.47468 1503.5974,-248.33466 C 1507.3034,-249.09772 1509.9563,-250.98393 1510.2189,-252.76895 L 1510.4286,-276.38353 z"
++ style="fill:#9db029;fill-opacity:1;fill-rule:nonzero;stroke:#596616;stroke-width:0.95876521;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block" />
++ <path
++ style="opacity:0.51176471;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.95876521;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block"
++ d="M 1509.5696,-275.32842 C 1509.5696,-275.32842 1489.2612,-272.61066 1489.2612,-272.61066 L 1489.2612,-251.67282 C 1482.0079,-253.49957 1476.0944,-249.91406 1476.5301,-248.05018 C 1477.2055,-244.86801 1490.3156,-246.9934 1490.2413,-251.05952 L 1490.3838,-269.72971 C 1490.3838,-269.72971 1508.4568,-272.50278 1508.4568,-272.50278 L 1508.4568,-253.8671 C 1501.2026,-255.7143 1495.7383,-252.54747 1496.174,-250.6836 C 1496.7296,-247.62127 1508.0418,-248.65738 1509.3701,-253.23118 L 1509.5696,-275.32842 z"
++ id="path2311"
++ sodipodi:nodetypes="ccccccccccc" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.51176471;fill:url(#radialGradient9082);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
++ id="path2313"
++ sodipodi:cx="5.875"
++ sodipodi:cy="32.75"
++ sodipodi:rx="6.375"
++ sodipodi:ry="3.25"
++ d="M 12.25,32.75 A 6.375,3.25 0 1 1 -0.5,32.75 A 6.375,3.25 0 1 1 12.25,32.75 z"
++ transform="matrix(0.7042284,-0.1070413,0.1070413,0.7042284,1474.2624,-272.13586)" />
++ <path
++ transform="matrix(0.7042284,-0.1070413,0.1070413,0.7042284,1493.2867,-274.85362)"
++ d="M 12.25,32.75 A 6.375,3.25 0 1 1 -0.5,32.75 A 6.375,3.25 0 1 1 12.25,32.75 z"
++ sodipodi:ry="3.25"
++ sodipodi:rx="6.375"
++ sodipodi:cy="32.75"
++ sodipodi:cx="5.875"
++ id="path2323"
++ style="opacity:0.51176471;fill:url(#radialGradient9084);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
++ sodipodi:type="arc" />
++ </g>
++ <g
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ transform="translate(-830.81219,188.92104)"
++ id="g7042">
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.70329674;fill:url(#radialGradient9086);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path7077"
++ sodipodi:cx="23.157747"
++ sodipodi:cy="26.963573"
++ sodipodi:rx="21.566757"
++ sodipodi:ry="14.318913"
++ d="M 44.724504,26.963573 A 21.566757,14.318913 0 1 1 1.5909901,26.963573 A 21.566757,14.318913 0 1 1 44.724504,26.963573 z"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ transform="matrix(0.8013773,0,0,0.8013773,1475.315,-156.45514)" />
++ <path
++ transform="matrix(1.0051171,0,0,1.2356645,1466.4725,-162.09851)"
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ d="M 40.5,21 A 14.75,8.25 0 1 1 11,21 A 14.75,8.25 0 1 1 40.5,21 z"
++ sodipodi:ry="8.25"
++ sodipodi:rx="14.75"
++ sodipodi:cy="21"
++ sodipodi:cx="25.75"
++ id="path7028"
++ style="fill:#a1a39f;fill-opacity:1;fill-rule:evenodd;stroke:#6d6f6a;stroke-width:0.7190817;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:type="arc"
++ style="fill:#555753;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.11522388;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path3999"
++ sodipodi:cx="25.75"
++ sodipodi:cy="21"
++ sodipodi:rx="14.75"
++ sodipodi:ry="8.25"
++ d="M 40.5,21 A 14.75,8.25 0 1 1 11,21 A 14.75,8.25 0 1 1 40.5,21 z"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ transform="matrix(0.6122611,0,0,0.802831,1476.1749,-155.02827)" />
++ <path
++ style="fill:url(#radialGradient9088);fill-rule:nonzero;stroke:#3b3d39;stroke-width:0.8013773;stroke-miterlimit:4;stroke-opacity:1"
++ d="M 1511.2073,-124.02847 C 1511.2073,-124.02847 1504.5368,-127.02323 1500.2637,-126.64635 C 1495.7095,-126.24466 1488.1014,-125.97524 1485.1192,-130.68476 C 1497.7795,-126.86662 1503.6206,-133.20569 1512.1892,-129.63534 C 1512.1892,-129.63534 1511.2073,-124.02847 1511.2073,-124.02847 z"
++ id="path6456"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ sodipodi:nodetypes="czccc" />
++ <path
++ transform="matrix(0.6098233,0,0,0.7906893,1476.6513,-156.59802)"
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ d="M 40.5,21 A 14.75,8.25 0 1 1 11,21 A 14.75,8.25 0 1 1 40.5,21 z"
++ sodipodi:ry="8.25"
++ sodipodi:rx="14.75"
++ sodipodi:cy="21"
++ sodipodi:cx="25.75"
++ id="path7026"
++ style="fill:url(#linearGradient9090);fill-opacity:1;fill-rule:evenodd;stroke:#757972;stroke-width:1.23408842;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ style="fill:#d3d7cf;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:0.8013773;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 1491.2274,-150.88061 C 1483.5682,-150.45935 1477.5288,-145.74008 1477.5288,-140.03697 C 1477.5288,-134.05786 1484.1706,-129.19333 1492.3543,-129.19334 C 1500.538,-129.19334 1507.1798,-134.05786 1507.1798,-140.03697 C 1507.1798,-146.01609 1500.538,-150.88061 1492.3543,-150.88061 C 1492.3223,-150.88061 1492.286,-150.88076 1492.2541,-150.88061 C 1492.0633,-150.87973 1491.8671,-150.88673 1491.6781,-150.88061 C 1491.5858,-150.87762 1491.4945,-150.88483 1491.4027,-150.88061 C 1491.3421,-150.87783 1491.2877,-150.88393 1491.2274,-150.88061 z M 1490.1255,-149.1276 C 1490.1761,-149.13169 1490.2245,-149.12482 1490.2757,-149.1276 C 1490.3832,-149.13343 1490.4917,-149.1276 1490.6013,-149.1276 C 1492.9384,-149.1276 1494.8336,-147.76349 1494.8336,-146.09739 C 1494.8336,-144.43129 1492.9384,-143.09222 1490.6013,-143.09222 C 1488.2641,-143.09222 1486.369,-144.43129 1486.369,-146.09739 C 1486.369,-147.64817 1488.0134,-148.95707 1490.1255,-149.1276 z M 1499.3413,-145.44627 C 1499.3947,-145.45105 1499.4376,-145.44286 1499.4916,-145.44627 C 1499.5851,-145.45218 1499.672,-145.44455 1499.767,-145.44627 C 1499.8057,-145.44697 1499.8283,-145.44627 1499.8672,-145.44627 C 1502.3542,-145.44627 1504.3749,-143.99241 1504.3749,-142.21572 C 1504.3749,-140.43903 1502.3542,-139.01021 1499.8672,-139.01021 C 1497.3802,-139.01021 1495.3595,-140.43903 1495.3595,-142.21572 C 1495.3595,-143.85694 1497.1159,-145.24717 1499.3413,-145.44627 z M 1483.9398,-142.91692 C 1484.1144,-142.9312 1484.3109,-142.91692 1484.4908,-142.91692 C 1487.0491,-142.91692 1489.1237,-141.44051 1489.1237,-139.61124 C 1489.1237,-137.78198 1487.0491,-136.30556 1484.4908,-136.30556 C 1481.9325,-136.30556 1479.8578,-137.78198 1479.8578,-139.61124 C 1479.8578,-141.31189 1481.6317,-142.72807 1483.9398,-142.91692 z M 1493.1807,-138.80986 C 1493.1999,-138.8121 1493.2115,-138.80779 1493.2308,-138.80986 C 1493.233,-138.80996 1493.2538,-138.80989 1493.2558,-138.80986 C 1493.2579,-138.80983 1493.2787,-138.80978 1493.2809,-138.80986 C 1493.2859,-138.80978 1493.3034,-138.80977 1493.3059,-138.80986 C 1493.3269,-138.80972 1493.36,-138.81017 1493.3811,-138.80986 C 1493.3836,-138.80993 1493.4011,-138.80993 1493.4061,-138.80986 C 1493.5992,-138.82571 1493.7831,-138.80986 1493.9821,-138.80986 C 1496.8123,-138.80986 1499.1159,-137.18342 1499.1159,-135.15358 C 1499.1159,-133.12374 1496.8123,-131.47225 1493.9821,-131.47225 C 1491.1519,-131.47225 1488.8483,-133.12374 1488.8483,-135.15358 C 1488.8483,-136.9823 1490.7407,-138.52634 1493.1807,-138.80986 z"
++ id="path7012"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ sodipodi:type="arc"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9092);stroke-width:1.05932879;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path7044"
++ sodipodi:cx="22.185474"
++ sodipodi:cy="19.008621"
++ sodipodi:rx="18.473166"
++ sodipodi:ry="13.435029"
++ d="M 40.65864,19.008621 A 18.473166,13.435029 0 1 1 3.7123089,19.008621 A 18.473166,13.435029 0 1 1 40.65864,19.008621 z"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ transform="matrix(0.7617356,0,0,0.7512912,1475.4861,-154.40517)" />
++ <path
++ style="fill:url(#linearGradient9094);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 1511.8879,-129.42361 L 1511.0211,-124.57528 C 1508.9303,-125.27684 1507.6697,-125.83197 1505.3544,-126.38388 L 1505.6204,-130.32076 C 1507.1418,-130.48208 1509.5177,-130.20718 1511.8879,-129.42361 z"
++ id="path7067"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ sodipodi:nodetypes="ccccc" />
++ <path
++ style="opacity:0.70329674;fill:url(#linearGradient9096);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 1511.8879,-129.56898 L 1511.7376,-128.86778 C 1505.2425,-131.29506 1499.2633,-129.04946 1493.0054,-128.86778 C 1501.5089,-129.57506 1504.297,-131.84542 1511.8879,-129.56898 z"
++ id="path7136"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ sodipodi:nodetypes="cccc" />
++ </g>
++ <g
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ transform="translate(-826.81219,187.77171)"
++ id="g7082">
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.50857143;fill:url(#radialGradient9098);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:0.70063692;visibility:visible;display:inline;overflow:visible"
++ id="path2452"
++ sodipodi:cx="24.218407"
++ sodipodi:cy="35.051105"
++ sodipodi:rx="16.882174"
++ sodipodi:ry="4.552"
++ d="M 41.10058,35.051105 A 16.882174,4.552 0 1 1 7.3362331,35.051105 A 16.882174,4.552 0 1 1 41.10058,35.051105 z"
++ transform="matrix(1.050251,0,0,1.867888,1685.2,-187.2542)" />
++ <path
++ sodipodi:type="arc"
++ style="fill:#adb0aa;fill-opacity:1;fill-rule:evenodd;stroke:#4b4d4a;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path2407"
++ sodipodi:cx="-35.658386"
++ sodipodi:cy="29.716238"
++ sodipodi:rx="9.3944187"
++ sodipodi:ry="3.939595"
++ d="M -26.263968,29.716238 A 9.3944187,3.939595 0 1 1 -45.052805,29.716238 A 9.3944187,3.939595 0 1 1 -26.263968,29.716238 z"
++ transform="translate(1746.179,-151.06966)" />
++ <path
++ transform="matrix(0.902373,0,0,0.82765,1742.6978,-146.28017)"
++ d="M -26.263968,29.716238 A 9.3944187,3.939595 0 1 1 -45.052805,29.716238 A 9.3944187,3.939595 0 1 1 -26.263968,29.716238 z"
++ sodipodi:ry="3.939595"
++ sodipodi:rx="9.3944187"
++ sodipodi:cy="29.716238"
++ sodipodi:cx="-35.658386"
++ id="path1825"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9100);stroke-width:1.15713382;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:type="arc"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9102);stroke-width:1.18333709;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path2983"
++ sodipodi:cx="-35.658386"
++ sodipodi:cy="29.716238"
++ sodipodi:rx="9.3944187"
++ sodipodi:ry="3.939595"
++ d="M -26.263968,29.716238 A 9.3944187,3.939595 0 1 1 -45.052805,29.716238 A 9.3944187,3.939595 0 1 1 -26.263968,29.716238 z"
++ transform="matrix(0.837548,0,0,0.852655,1740.3237,-148.14194)" />
++ <rect
++ y="-128.06947"
++ x="1706.118"
++ height="6.3650389"
++ width="9.0396729"
++ id="rect2699"
++ style="fill:url(#linearGradient9104);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.60872948;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ style="fill:url(#linearGradient9106);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9108);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 1693.7265,-154.57747 L 1727.3147,-154.57747 C 1728.226,-154.57747 1728.9388,-153.99399 1728.9814,-153.17588 L 1730.3135,-127.59777 C 1730.3717,-126.48003 1729.4124,-125.57746 1728.2932,-125.57746 L 1692.748,-125.57746 C 1691.6288,-125.57746 1690.6695,-126.48003 1690.7277,-127.59777 L 1692.0598,-153.17588 C 1692.1,-153.94942 1692.6073,-154.57747 1693.7265,-154.57747 z"
++ id="rect2404"
++ sodipodi:nodetypes="cssssssss" />
++ <path
++ sodipodi:nodetypes="ccccc"
++ id="path2377"
++ d="M 1695.0561,-151.96726 L 1693.8139,-129.92195 L 1725.4643,-129.92195 L 1724.1293,-151.87383 L 1695.0561,-151.96726 z"
++ style="fill:url(#linearGradient9110);fill-opacity:1;fill-rule:evenodd;stroke:#000079;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ <path
++ sodipodi:nodetypes="cc"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:url(#linearGradient9112);stroke-width:0.99618119;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.24840764"
++ d="M 1692.823,-127.5373 L 1728.2515,-127.5373"
++ id="path2393" />
++ <path
++ sodipodi:nodetypes="cssssssss"
++ id="path2397"
++ d="M 1693.5602,-153.56675 L 1727.4057,-153.60455 C 1727.6894,-153.60487 1727.965,-153.3673 1727.9878,-152.95201 L 1729.3497,-128.14876 C 1729.4077,-127.09173 1728.8099,-126.36289 1727.7513,-126.36289 L 1693.2274,-126.36289 C 1692.1687,-126.36289 1691.6343,-127.09168 1691.6915,-128.14876 L 1693.0156,-152.64293 C 1693.0543,-153.35876 1693.182,-153.56633 1693.5602,-153.56675 z"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9114);stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:0.70063692;visibility:visible;display:inline;overflow:visible" />
++ <path
++ sodipodi:nodetypes="ccccc"
++ style="opacity:0.53142856;fill:url(#linearGradient9116);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
++ d="M 1695.3571,-151.52673 L 1694.5546,-133.6564 C 1705.5992,-136.05703 1709.9761,-144.1486 1723.7086,-146.80315 L 1723.5472,-151.46066 L 1695.3571,-151.52673 z"
++ id="path2443" />
++ <path
++ transform="matrix(1.331237,0,0,0.658449,1680.2263,-153.41922)"
++ d="M 35.620504,3.9384086 A 0.83968931,0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931,0.83968931 0 1 1 35.620504,3.9384086 z"
++ sodipodi:ry="0.83968931"
++ sodipodi:rx="0.83968931"
++ sodipodi:cy="3.9384086"
++ sodipodi:cx="34.780815"
++ id="path2709"
++ style="fill:url(#linearGradient9118);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:type="arc"
++ style="fill:url(#linearGradient9120);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path2719"
++ sodipodi:cx="34.780815"
++ sodipodi:cy="3.9384086"
++ sodipodi:rx="0.83968931"
++ sodipodi:ry="0.83968931"
++ d="M 35.620504,3.9384086 A 0.83968931,0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931,0.83968931 0 1 1 35.620504,3.9384086 z"
++ transform="matrix(1.331237,0,0,0.658449,1680.3399,-151.31344)" />
++ <path
++ transform="matrix(1.331237,0,0,0.658449,1680.4535,-149.31344)"
++ d="M 35.620504,3.9384086 A 0.83968931,0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931,0.83968931 0 1 1 35.620504,3.9384086 z"
++ sodipodi:ry="0.83968931"
++ sodipodi:rx="0.83968931"
++ sodipodi:cy="3.9384086"
++ sodipodi:cx="34.780815"
++ id="path2723"
++ style="fill:url(#linearGradient9122);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:type="arc"
++ style="fill:url(#linearGradient9124);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path2727"
++ sodipodi:cx="34.780815"
++ sodipodi:cy="3.9384086"
++ sodipodi:rx="0.83968931"
++ sodipodi:ry="0.83968931"
++ d="M 35.620504,3.9384086 A 0.83968931,0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931,0.83968931 0 1 1 35.620504,3.9384086 z"
++ transform="matrix(1.331237,0,0,0.658449,1680.5671,-147.31344)" />
++ <path
++ transform="matrix(1.331237,0,0,0.658449,1680.6807,-145.31344)"
++ d="M 35.620504,3.9384086 A 0.83968931,0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931,0.83968931 0 1 1 35.620504,3.9384086 z"
++ sodipodi:ry="0.83968931"
++ sodipodi:rx="0.83968931"
++ sodipodi:cy="3.9384086"
++ sodipodi:cx="34.780815"
++ id="path2731"
++ style="fill:url(#linearGradient9126);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ id="text2735"
++ d="M 1708.6456,-128.95542 L 1708.9273,-128.95542 C 1709.0111,-128.95542 1709.0753,-128.93676 1709.12,-128.89943 C 1709.1649,-128.8624 1709.1874,-128.8095 1709.1874,-128.74072 C 1709.1874,-128.67165 1709.1649,-128.61845 1709.12,-128.58112 C 1709.0753,-128.54409 1709.0111,-128.52558 1708.9273,-128.52558 L 1708.8153,-128.52558 L 1708.8153,-128.2972 L 1708.6456,-128.2972 L 1708.6456,-128.95542 M 1708.8153,-128.83242 L 1708.8153,-128.64858 L 1708.9092,-128.64858 C 1708.9422,-128.64858 1708.9676,-128.65651 1708.9855,-128.67238 C 1709.0034,-128.68855 1709.0124,-128.71133 1709.0124,-128.74072 C 1709.0124,-128.77011 1709.0034,-128.79274 1708.9855,-128.80861 C 1708.9676,-128.82448 1708.9422,-128.83242 1708.9092,-128.83242 L 1708.8153,-128.83242 M 1709.6076,-128.84432 C 1709.5558,-128.84432 1709.5157,-128.82522 1709.4872,-128.78701 C 1709.4587,-128.7488 1709.4445,-128.69502 1709.4445,-128.62565 C 1709.4445,-128.55658 1709.4587,-128.50294 1709.4872,-128.46473 C 1709.5157,-128.42653 1709.5558,-128.40742 1709.6076,-128.40742 C 1709.6596,-128.40742 1709.6999,-128.42653 1709.7284,-128.46473 C 1709.7569,-128.50294 1709.7711,-128.55658 1709.7711,-128.62565 C 1709.7711,-128.69502 1709.7569,-128.7488 1709.7284,-128.78701 C 1709.6999,-128.82522 1709.6596,-128.84432 1709.6076,-128.84432 M 1709.6076,-128.96733 C 1709.7134,-128.96733 1709.7963,-128.93705 1709.8562,-128.87651 C 1709.9162,-128.81596 1709.9462,-128.73234 1709.9462,-128.62565 C 1709.9462,-128.51926 1709.9162,-128.43579 1709.8562,-128.37524 C 1709.7963,-128.31469 1709.7134,-128.28442 1709.6076,-128.28442 C 1709.5021,-128.28442 1709.4192,-128.31469 1709.3589,-128.37524 C 1709.299,-128.43579 1709.269,-128.51926 1709.269,-128.62565 C 1709.269,-128.73234 1709.299,-128.81596 1709.3589,-128.87651 C 1709.4192,-128.93705 1709.5021,-128.96733 1709.6076,-128.96733 M 1710.074,-128.95542 L 1710.2636,-128.95542 L 1710.503,-128.50397 L 1710.503,-128.95542 L 1710.6639,-128.95542 L 1710.6639,-128.2972 L 1710.4743,-128.2972 L 1710.2349,-128.74866 L 1710.2349,-128.2972 L 1710.074,-128.2972 L 1710.074,-128.95542 M 1710.7371,-128.95542 L 1710.9227,-128.95542 L 1711.0726,-128.72088 L 1711.2225,-128.95542 L 1711.4085,-128.95542 L 1711.1577,-128.57451 L 1711.1577,-128.2972 L 1710.9879,-128.2972 L 1710.9879,-128.57451 L 1710.7371,-128.95542"
++ style="font-size:0.9029026px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;writing-mode:lr-tb;text-anchor:start;fill:#4a4a4a;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" />
++ </g>
++ <g
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ transform="translate(226.32061,-143.29228)"
++ style="display:inline"
++ inkscape:label="Layer 1"
++ id="g4318">
++ <path
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ style="opacity:0.15;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9128);stroke-width:1.99999833;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 12,39.5 L 12,9 L 38.06998,23.817079 L 12,39.5 z"
++ id="path2682"
++ sodipodi:nodetypes="cccc" />
++ <path
++ sodipodi:nodetypes="cccc"
++ id="path3375"
++ d="M 12.49946,37.81149 L 12.49946,10.000005 L 36.602747,23.905748 L 12.49946,37.81149 z"
++ style="fill:url(#radialGradient9130);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000036;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ sodipodi:nodetypes="cccc"
++ id="path2479"
++ d="M 12.49946,37.81149 L 12.49946,10.000005 L 36.602747,23.905748 L 12.49946,37.81149 z"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9132);stroke-width:1.00000036;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ sodipodi:nodetypes="cccccccc"
++ id="path2481"
++ d="M 12.99946,10.87449 L 12.99946,36.93699 L 35.59321,23.90574 L 12.99946,10.87449 z M 13.99946,12.62449 L 33.56196,23.90574 L 13.99946,35.18699 L 13.99946,12.62449 z"
++ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ sodipodi:nodetypes="cccc"
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ id="path2339"
++ d="M 13.9375,12.5625 L 13.9375,24.25 C 18.206698,24.205215 23.101656,23.904436 31,22.375 L 13.9375,12.5625 z"
++ style="opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible" />
++ </g>
++ <g
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ transform="translate(193.47491,-142.94801)"
++ id="g2837">
++ <path
++ style="opacity:0.15;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9134);stroke-width:1.99999952;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 26.086565,12.829103 L 26.086565,34.982359 L 34.912658,34.982359 L 34.912658,12.829103 L 26.086565,12.829103 z"
++ id="path2815"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ style="fill:url(#radialGradient9136);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 26.4996,13.40575 L 26.4996,34.40575 L 34.4996,34.40575 L 34.4996,13.40575 L 26.4996,13.40575 z"
++ id="path2827" />
++ <path
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ id="path2762"
++ d="M 26.4996,13.407946 L 26.4996,34.50001 L 34.4996,34.50001 L 34.4996,13.407946 L 26.4996,13.407946 z"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9138);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9140);stroke-width:0.9999997;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 27.4996,14.40575 L 27.4996,33.40575 L 33.4996,33.40575 L 33.4996,14.40575 L 27.4996,14.40575 z"
++ id="path2811" />
++ <path
++ style="opacity:0.5;fill:#f7f7f7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
++ d="M 28.019106,14.942758 L 28.019106,23.328389 L 33.013048,22.70967 L 33.013048,14.85437 L 28.019106,14.942758 z"
++ id="path4470"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true"
++ sodipodi:nodetypes="ccccc" />
++ </g>
++ <g
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ transform="translate(180.50261,-142.94801)"
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ id="use2844">
++ <path
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ id="path2848"
++ d="M 26.086565,12.829103 L 26.086565,34.982359 L 34.912658,34.982359 L 34.912658,12.829103 L 26.086565,12.829103 z"
++ style="opacity:0.15;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9142);stroke-width:1.99999952;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ id="path2850"
++ d="M 26.4996,13.40575 L 26.4996,34.40575 L 34.4996,34.40575 L 34.4996,13.40575 L 26.4996,13.40575 z"
++ style="fill:url(#radialGradient9144);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9146);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 26.4996,13.407946 L 26.4996,34.50001 L 34.4996,34.50001 L 34.4996,13.407946 L 26.4996,13.407946 z"
++ id="path2852"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ id="path2854"
++ d="M 27.4996,14.40575 L 27.4996,33.40575 L 33.4996,33.40575 L 33.4996,14.40575 L 27.4996,14.40575 z"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9148);stroke-width:0.9999997;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ sodipodi:nodetypes="ccccc"
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ id="path2856"
++ d="M 28.019106,14.942758 L 28.019106,25.007768 L 33.013048,24.389049 L 33.013048,14.85437 L 28.019106,14.942758 z"
++ style="opacity:0.5;fill:#f7f7f7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible" />
++ </g>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ id="path4663"
++ d="M 175.60121,-130.11891 L 175.60121,-107.96565 L 196.59741,-107.96565 L 196.59741,-130.11891 L 175.60121,-130.11891 z"
++ style="opacity:0.15;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9259);stroke-width:1.99999952;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ id="path4665"
++ d="M 176.09741,-129.54228 L 176.09741,-108.54228 L 196.09741,-108.54228 L 196.09741,-129.54228 L 176.09741,-129.54228 z"
++ style="fill:url(#radialGradient9256);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9253);stroke-width:0.99999952;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 176.09411,-129.58831 L 176.09411,-108.49625 L 196.08521,-108.49625 L 196.08521,-129.58831 L 176.09411,-129.58831 z"
++ id="path4667"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ id="path4669"
++ d="M 177.09681,-128.54228 L 177.09681,-109.54228 L 195.09801,-109.54228 L 195.09801,-128.54228 L 177.09681,-128.54228 z"
++ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9250);stroke-width:0.99999976;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ inkscape:r_cx="true"
++ inkscape:r_cy="true" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ sodipodi:nodetypes="ccccc"
++ inkscape:r_cy="true"
++ inkscape:r_cx="true"
++ id="path4671"
++ d="M 177.59741,-124.27671 L 177.59741,-113.71947 L 194.59741,-116.5098 L 194.59741,-124.3651 L 177.59741,-124.27671 z"
++ style="opacity:0.5;fill:#f7f7f7;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible" />
++ <g
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ transform="translate(866.48891,-98.34908)"
++ id="g6482"
++ inkscape:label="Layer 1">
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.42857145;fill:url(#radialGradient9158);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path3607"
++ sodipodi:cx="6.4081554"
++ sodipodi:cy="17.403807"
++ sodipodi:rx="5.524272"
++ sodipodi:ry="2.2980971"
++ d="M 11.932427,17.403807 A 5.524272,2.2980971 0 1 1 0.88388348,17.403807 A 5.524272,2.2980971 0 1 1 11.932427,17.403807 z"
++ transform="matrix(2.901907,0,0,3.804948,-4.8525,-32.31157)" />
++ <g
++ id="g4090"
++ transform="matrix(1.296182,0,0,1.296182,-4.176277,-7.324567)">
++ <path
++ transform="matrix(1.415965,0,0,1.258558,-2.667614,-6.200669)"
++ d="M 12.374369,24.665476 A 3.6239223,6.3639612 0 1 1 5.126524,24.665476 A 3.6239223,6.3639612 0 1 1 12.374369,24.665476 z"
++ sodipodi:ry="6.3639612"
++ sodipodi:rx="3.6239223"
++ sodipodi:cy="24.665476"
++ sodipodi:cx="8.7504463"
++ id="path4076"
++ style="opacity:1;fill:url(#linearGradient9160);fill-opacity:1;fill-rule:nonzero;stroke:#5d615f;stroke-width:0.57792485;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:1;fill:url(#linearGradient9162);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.86615634;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path4060"
++ sodipodi:cx="8.7504463"
++ sodipodi:cy="24.665476"
++ sodipodi:rx="3.6239223"
++ sodipodi:ry="6.3639612"
++ d="M 12.374369,24.665476 A 3.6239223,6.3639612 0 1 1 5.126524,24.665476 A 3.6239223,6.3639612 0 1 1 12.374369,24.665476 z"
++ transform="matrix(1.154526,0,0,1.154526,-0.379902,-3.63468)" />
++ <path
++ transform="matrix(1.081355,0,0,1.081355,1.232653,-1.829889)"
++ d="M 12.374369,24.665476 A 3.6239223,6.3639612 0 1 1 5.126524,24.665476 A 3.6239223,6.3639612 0 1 1 12.374369,24.665476 z"
++ sodipodi:ry="6.3639612"
++ sodipodi:rx="3.6239223"
++ sodipodi:cy="24.665476"
++ sodipodi:cx="8.7504463"
++ id="path4058"
++ style="opacity:1;fill:#93958f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.86615634;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ sodipodi:type="arc"
++ style="opacity:0.39560439;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient9164);stroke-width:0.68416733;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ id="path3279"
++ sodipodi:cx="8.7504463"
++ sodipodi:cy="24.665476"
++ sodipodi:rx="3.6239223"
++ sodipodi:ry="6.3639612"
++ d="M 12.374369,24.665476 A 3.6239223,6.3639612 0 1 1 5.126524,24.665476 A 3.6239223,6.3639612 0 1 1 12.374369,24.665476 z"
++ transform="matrix(1.1807,0,0,1.076971,-0.608944,-1.721744)" />
++ </g>
++ <path
++ style="fill:url(#linearGradient9166);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9168);stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 9.4806798,18.24261 L 16.570367,12.118401 L 16.341232,37.201244 L 9.1369775,31.676187 C 6.6164956,29.613972 6.1582259,20.41939 9.4806798,18.24261 z"
++ id="path4542"
++ sodipodi:nodetypes="ccccc" />
++ <path
++ style="fill:url(#linearGradient9170);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 7.5383505,21.987453 L 11.593316,18.948432 L 11.341702,22.484506 L 7.3782322,23.145502 L 7.5383505,21.987453 z"
++ id="path4544"
++ sodipodi:nodetypes="ccccc" />
++ <path
++ style="opacity:0.7692308;fill:url(#radialGradient9172);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 8.203516,30.371178 L 12.644321,33.939519 L 12.087496,31.511626 L 7.6110912,29.008887 L 8.203516,30.371178 z"
++ id="path3672"
++ sodipodi:nodetypes="ccccc" />
++ <g
++ style="display:inline"
++ id="g4006"
++ transform="matrix(1.096894,0,0,1.509271,-4.216951,-12.11812)">
++ <path
++ sodipodi:nodetypes="ccsssscscsscscsscscsssssssc"
++ id="path3726"
++ d="M 23.75,14 C 21.81001,14.049168 20.013366,14.683436 18.5,15.6875 C 18.13319,15.264088 17.60375,15 17,15 C 16.9655,15 16.912662,15.000854 16.875,15 C 16.847007,14.9998 16.806453,14.997438 16.78125,15 C 15.773145,15.102481 15,15.965001 15,17 C 15,17.60375 15.264088,18.13319 15.6875,18.5 C 14.639107,20.080181 14,21.962011 14,24 C 14,26.033681 14.611921,27.921829 15.65625,29.5 C 15.243427,29.869532 15,30.401641 15,31 C 15,32.104 15.896,33.000001 17,33 C 17.60375,33 18.13319,32.735911 18.5,32.3125 C 20.080181,33.360893 21.962011,34 24,34 C 26.03799,34 27.919819,33.360893 29.5,32.3125 C 29.86681,32.735912 30.396251,33.000001 31,33 C 32.103999,33 33,32.104001 33,31 C 33,30.39625 32.735912,29.86681 32.3125,29.5 C 33.360893,27.919819 34,26.03799 34,24 C 34,21.962011 33.360893,20.080181 32.3125,18.5 C 32.735912,18.13319 33,17.60375 33,17 C 33,15.896 32.103999,15 31,15 C 30.9655,15 30.912662,15.000854 30.875,15 C 30.847007,14.9998 30.806453,14.997438 30.78125,15 C 30.277198,15.05124 29.819299,15.298435 29.5,15.65625 C 29.493313,15.651825 29.475448,15.660659 29.46875,15.65625 C 27.894622,14.620029 26.025064,14 24,14 C 23.913827,14 23.835651,13.997829 23.75,14 z"
++ style="opacity:1;fill:url(#radialGradient9174);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9176);stroke-width:1.47668338;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ sodipodi:nodetypes="ccsssscscsscscsscscsssssssc"
++ id="path6495"
++ d="M 23.75,14 C 21.81001,14.049168 20.013366,14.683436 18.5,15.6875 C 18.13319,15.264088 17.60375,15 17,15 C 16.9655,15 16.912662,15.000854 16.875,15 C 16.847007,14.9998 16.806453,14.997438 16.78125,15 C 15.773145,15.102481 15,15.965001 15,17 C 15,17.60375 15.264088,18.13319 15.6875,18.5 C 14.639107,20.080181 14,21.962011 14,24 C 14,26.033681 14.611921,27.921829 15.65625,29.5 C 15.243427,29.869532 15,30.401641 15,31 C 15,32.104 15.896,33.000001 17,33 C 17.60375,33 18.13319,32.735911 18.5,32.3125 C 20.080181,33.360893 21.962011,34 24,34 C 26.03799,34 27.919819,33.360893 29.5,32.3125 C 29.86681,32.735912 30.396251,33.000001 31,33 C 32.103999,33 33,32.104001 33,31 C 33,30.39625 32.735912,29.86681 32.3125,29.5 C 33.360893,27.919819 34,26.03799 34,24 C 34,21.962011 33.360893,20.080181 32.3125,18.5 C 32.735912,18.13319 33,17.60375 33,17 C 33,15.896 32.103999,15 31,15 C 30.9655,15 30.912662,15.000854 30.875,15 C 30.847007,14.9998 30.806453,14.997438 30.78125,15 C 30.277198,15.05124 29.819299,15.298435 29.5,15.65625 C 29.493313,15.651825 29.475448,15.660659 29.46875,15.65625 C 27.894622,14.620029 26.025064,14 24,14 C 23.913827,14 23.835651,13.997829 23.75,14 z"
++ style="opacity:1;fill:url(#radialGradient9178);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.09104455;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ transform="matrix(0.846982,0,0,0.911415,16.71027,15.44956)"
++ d="M 18.75,9.375 A 9.375,9.375 0 1 1 0,9.375 A 9.375,9.375 0 1 1 18.75,9.375 z"
++ sodipodi:ry="9.375"
++ sodipodi:rx="9.375"
++ sodipodi:cy="9.375"
++ sodipodi:cx="9.375"
++ id="path3636"
++ style="opacity:1;fill:url(#radialGradient9180);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient9182);stroke-width:0.8383193;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ transform="matrix(0.367272,0,0,0.32,18.56254,21.125)"
++ d="M 18.75,9.375 A 9.375,9.375 0 1 1 0,9.375 A 9.375,9.375 0 1 1 18.75,9.375 z"
++ sodipodi:ry="9.375"
++ sodipodi:rx="9.375"
++ sodipodi:cy="9.375"
++ sodipodi:cx="9.375"
++ id="path3519"
++ style="opacity:1;fill:url(#radialGradient9184);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6.57905483;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ d="M 17,16.5 A 0.5,0.5 0 1 1 16,16.5 A 0.5,0.5 0 1 1 17,16.5 z"
++ sodipodi:ry="0.5"
++ sodipodi:rx="0.5"
++ sodipodi:cy="16.5"
++ sodipodi:cx="16.5"
++ id="path3718"
++ style="opacity:1;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc"
++ transform="matrix(1.3125,0,0,1.3125,-4.657679,-5.09375)" />
++ <path
++ transform="translate(15.22159,0.25)"
++ d="M 17,16.5 A 0.5,0.5 0 1 1 16,16.5 A 0.5,0.5 0 1 1 17,16.5 z"
++ sodipodi:ry="0.5"
++ sodipodi:rx="0.5"
++ sodipodi:cy="16.5"
++ sodipodi:cx="16.5"
++ id="path3720"
++ style="opacity:1;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ transform="translate(15.22159,14.96875)"
++ d="M 17,16.5 A 0.5,0.5 0 1 1 16,16.5 A 0.5,0.5 0 1 1 17,16.5 z"
++ sodipodi:ry="0.5"
++ sodipodi:rx="0.5"
++ sodipodi:cy="16.5"
++ sodipodi:cx="16.5"
++ id="path3722"
++ style="opacity:1;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ <path
++ transform="matrix(1.375,0,0,1.375,-5.688929,8.8125)"
++ d="M 17,16.5 A 0.5,0.5 0 1 1 16,16.5 A 0.5,0.5 0 1 1 17,16.5 z"
++ sodipodi:ry="0.5"
++ sodipodi:rx="0.5"
++ sodipodi:cy="16.5"
++ sodipodi:cx="16.5"
++ id="path3724"
++ style="opacity:1;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ sodipodi:type="arc" />
++ </g>
++ <path
++ sodipodi:nodetypes="csc"
++ id="path3488"
++ d="M 36.087935,32.865672 C 37.005198,30.700908 37.568925,27.707589 37.568925,24.427683 C 37.568925,21.147777 37.005198,18.154458 36.087935,15.989694"
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient9186);stroke-width:0.99999982;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ <path
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient9188);stroke-width:0.99999982;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
++ d="M 39.838951,35.702755 C 41.064624,32.810137 41.817892,28.81038 41.817892,24.427678 C 41.817892,20.044976 41.064624,16.045219 39.838951,13.152601"
++ id="path3494"
++ sodipodi:nodetypes="csc" />
++ <path
++ sodipodi:nodetypes="csc"
++ id="path3496"
++ d="M 43.487454,39.708054 C 45.148528,35.787876 46.169383,30.367266 46.169383,24.427674 C 46.169383,18.488083 45.148528,13.067472 43.487454,9.1472948"
++ style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient9190);stroke-width:0.99999982;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
++ </g>
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ id="text6835"
++ y="111.17413"
++ x="170.37872"
++ style="font-size:10px;font-style:italic;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
++ xml:space="preserve"><tspan
++ style="font-size:14px;font-weight:normal;-inkscape-font-specification:Bitstream Vera Sans"
++ y="111.17413"
++ x="170.37872"
++ id="tspan6837"
++ sodipodi:role="line">Gstreamer pipeline for a basic ogg player</tspan></text>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 532.93871,-33.63525 L 583.47711,-68.58281"
++ id="path7621"
++ sodipodi:nodetypes="cc" />
++ </g>
++ <g
++ id="g12489"
++ transform="translate(-5.0970049,0)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#eeeeec;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect4780"
++ width="950.7605"
++ height="178.42247"
++ x="58.924595"
++ y="1656.538"
++ rx="5"
++ ry="5" />
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3369"
++ width="153.2551"
++ height="99.162369"
++ x="68.20414"
++ y="1725.4076"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="73.980515"
++ y="1740.6833"
++ id="text3371"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan3373"
++ x="73.980515"
++ y="1740.6833">file-source</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3385"
++ width="49.561798"
++ height="33.867229"
++ x="171.86508"
++ y="1770.4204" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="190.8638"
++ y="1790.0836"
++ id="text3387"><tspan
++ sodipodi:role="line"
++ id="tspan3389"
++ x="190.8638"
++ y="1790.0836">src</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3391"
++ width="153.2551"
++ height="99.162369"
++ x="262.32126"
++ y="1725.4076"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="268.09763"
++ y="1740.6833"
++ id="text3393"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan3395"
++ x="268.09763"
++ y="1740.6833">ogg-demuxer</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3399"
++ width="49.561798"
++ height="33.867229"
++ x="262.3154"
++ y="1770.4204" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="274.29282"
++ y="1791.0822"
++ id="text3401"><tspan
++ sodipodi:role="line"
++ id="tspan3403"
++ x="274.29282"
++ y="1791.0822">sink</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3407"
++ width="49.561798"
++ height="33.867229"
++ x="365.98215"
++ y="1770.4204" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="376.9808"
++ y="1789.8859"
++ id="text3409"><tspan
++ sodipodi:role="line"
++ id="tspan3411"
++ x="376.9808"
++ y="1789.8859">src_01</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3413"
++ width="153.2551"
++ height="99.162369"
++ x="456.4382"
++ y="1725.4076"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="462.21469"
++ y="1740.6833"
++ id="text3415"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan3417"
++ x="462.21469"
++ y="1740.6833">vorbis-decoder</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3421"
++ width="49.561798"
++ height="33.867229"
++ x="456.43234"
++ y="1770.4204" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="468.40976"
++ y="1791.0822"
++ id="text3423"><tspan
++ sodipodi:role="line"
++ id="tspan3425"
++ x="468.40976"
++ y="1791.0822">sink</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3429"
++ width="49.561798"
++ height="33.867229"
++ x="560.09912"
++ y="1770.4204" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="579.0979"
++ y="1790.0836"
++ id="text3431"><tspan
++ sodipodi:role="line"
++ id="tspan3433"
++ x="579.0979"
++ y="1790.0836">src</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3435"
++ width="153.2551"
++ height="99.162369"
++ x="651.2511"
++ y="1725.4076"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="657.02759"
++ y="1740.6833"
++ id="text3437"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan3439"
++ x="657.02759"
++ y="1740.6833">converter</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3443"
++ width="49.561798"
++ height="33.867229"
++ x="651.24536"
++ y="1770.4204" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="663.2229"
++ y="1791.0822"
++ id="text3445"><tspan
++ sodipodi:role="line"
++ id="tspan3447"
++ x="663.2229"
++ y="1791.0822">sink</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3451"
++ width="49.561798"
++ height="33.867229"
++ x="754.91223"
++ y="1770.4204" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="773.91089"
++ y="1790.0836"
++ id="text3453"><tspan
++ sodipodi:role="line"
++ id="tspan3455"
++ x="773.91089"
++ y="1790.0836">src</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3457"
++ width="153.2551"
++ height="99.162369"
++ x="845.02039"
++ y="1725.4076"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="850.79675"
++ y="1740.6833"
++ id="text3459"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan3461"
++ x="850.79675"
++ y="1740.6833">audio-output</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect3465"
++ width="49.561798"
++ height="33.867229"
++ x="845.01453"
++ y="1770.4204" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="856.99194"
++ y="1791.0822"
++ id="text3467"><tspan
++ sodipodi:role="line"
++ id="tspan3469"
++ x="856.99194"
++ y="1791.0822">sink</tspan></text>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 221.23625,1787.3743 L 258.23629,1787.3743"
++ id="path3481"
++ sodipodi:nodetypes="cc" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:18px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="70.221596"
++ y="1677.9606"
++ id="text4782"><tspan
++ style="font-size:18px;font-weight:bold;fill:#204a87;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ sodipodi:role="line"
++ id="tspan4784"
++ x="70.221596"
++ y="1677.9606">pipeline</tspan></text>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 415.29969,1787.3743 L 452.29969,1787.3743"
++ id="path6087"
++ sodipodi:nodetypes="cc" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 610.12959,1787.3743 L 647.12959,1787.3743"
++ id="path6089"
++ sodipodi:nodetypes="cc" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 803.84769,1787.3743 L 840.84769,1787.3743"
++ id="path6091"
++ sodipodi:nodetypes="cc" />
++ </g>
++ <flowRoot
++ xml:space="preserve"
++ id="flowRoot10316"
++ style="fill:black;fill-opacity:1;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;font-family:Bitstream Vera Sans;font-style:normal;font-weight:normal;font-size:14"><flowRegion
++ id="flowRegion10318"><rect
++ id="rect10320"
++ width="598.89526"
++ height="138.11003"
++ x="128.06566"
++ y="-862.34497" /></flowRegion><flowPara
++ id="flowPara10322" /></flowRoot> <g
++ id="g5717"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/gstreamer-overview.png"
++ inkscape:export-xdpi="91.230003"
++ inkscape:export-ydpi="91.230003"
++ transform="matrix(1.6161303,0,0,1.6161303,-1880.9642,104.72151)">
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path5719"
++ d="M 898.12621,-471.2939 C 897.89934,-475.93582 899.91669,-486.74453 904.5586,-485.72567 C 906.53722,-485.29096 905.99722,-482.56382 905.35059,-479.61253 C 904.47981,-475.63899 902.97326,-471.30069 902.97326,-471.30069 C 902.97326,-471.30069 908.63403,-471.07451 908.52059,-471.30069 C 909.08639,-478.43269 910.5848,-486.19503 914.74716,-485.61291 C 918.19837,-485.13066 913.76838,-471.30069 913.76838,-471.30069 C 913.76838,-471.30069 918.0272,-471.30069 918.92175,-471.30069 C 918.73701,-473.64611 920.00175,-479.10854 920.71155,-483.05898 C 921.42135,-487.00943 919.90937,-488.73741 916.73121,-488.76798 C 913.55307,-488.79854 910.4048,-486.02114 910.4048,-486.02114 C 910.52842,-488.39712 907.39645,-488.77206 907.39645,-488.77206 C 904.04781,-488.98465 900.83841,-486.73095 900.83841,-486.73095 L 901.13591,-488.47658 L 896.09258,-488.47658 C 896.09258,-488.47658 895.84465,-485.69986 894.82443,-480.63207 C 893.80422,-475.56427 892.44032,-471.30069 892.44032,-471.30069 L 898.12621,-471.2939 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path5721"
++ d="M 932.65662,-488.90315 C 925.75082,-488.90315 922.67183,-484.02757 922.67183,-479.04673 C 922.67183,-474.06588 925.61429,-470.78244 931.61467,-470.78244 C 934.43351,-470.78244 936.02972,-473.38663 936.02972,-473.38663 C 936.02972,-473.38663 936.12074,-474.09916 935.58822,-473.80233 C 935.05569,-473.50551 933.60484,-472.88401 931.70977,-472.88401 C 929.81469,-472.88401 927.76611,-474.68669 927.76611,-479.15947 C 927.76611,-479.15947 938.74667,-479.15947 938.63391,-479.15947 C 939.19972,-480.97101 939.56244,-488.90315 932.65662,-488.90315 z M 933.66394,-481.17546 L 928.39305,-481.17546 C 928.39305,-484.81753 931.30698,-487.56845 933.29104,-486.5917 C 935.0978,-485.75284 933.66394,-481.17546 933.66394,-481.17546 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path5723"
++ d="M 867.78941,-488.90315 C 860.88361,-488.90315 857.80462,-484.02757 857.80462,-479.04673 C 857.80462,-474.06588 860.74708,-470.78244 866.74746,-470.78244 C 869.5663,-470.78244 871.16251,-473.38663 871.16251,-473.38663 C 871.16251,-473.38663 871.25353,-474.09916 870.72101,-473.80233 C 870.18848,-473.50551 868.73763,-472.88401 866.84256,-472.88401 C 864.94748,-472.88401 862.8989,-474.68669 862.8989,-479.15947 C 862.8989,-479.15947 873.87946,-479.15947 873.7667,-479.15947 C 874.33251,-480.97101 874.69523,-488.90315 867.78941,-488.90315 z M 868.79673,-481.17546 L 863.52584,-481.17546 C 863.52584,-484.81753 865.98536,-487.17721 867.96941,-486.19978 C 869.77618,-485.3616 868.79673,-481.17546 868.79673,-481.17546 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path5725"
++ d="M 945.11181,-471.0195 L 939.54342,-471.0195 C 939.54342,-471.0195 942.79425,-482.69695 943.07749,-488.42224 C 943.02859,-488.37334 947.90688,-488.42224 947.90688,-488.42224 C 947.90688,-488.42224 947.48778,-487.13169 947.30574,-486.00484 C 948.68528,-487.53244 949.1526,-488.90655 952.89723,-488.90655 C 952.94613,-488.90655 952.89723,-484.07784 952.89723,-484.07784 C 952.89723,-484.07784 949.39916,-484.94386 948.14257,-483.68796 C 946.88597,-482.43205 945.53905,-481.42406 945.11181,-471.0195 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path5727"
++ d="M 848.99966,-471.0195 L 843.43127,-471.0195 C 843.43127,-471.0195 846.6821,-482.69695 846.96535,-488.42224 C 846.91644,-488.37334 851.79472,-488.42224 851.79472,-488.42224 C 851.79472,-488.42224 851.37563,-487.13169 851.1936,-486.00484 C 852.57313,-487.53244 853.04044,-488.90655 856.78508,-488.90655 C 856.83399,-488.90655 856.78508,-484.07784 856.78508,-484.07784 C 856.78508,-484.07784 853.28701,-484.94386 852.03041,-483.68796 C 850.77383,-482.43205 849.4269,-481.42406 848.99966,-471.0195 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path5729"
++ d="M 842.20864,-494.42263 L 837.65435,-492.84341 L 836.60764,-488.60224 L 833.70526,-488.60224 L 833.70526,-485.81397 L 835.99701,-485.81397 C 835.99701,-485.81397 833.55311,-477.06878 834.01092,-474.39462 C 834.4694,-471.49224 837.29571,-470.88161 838.97614,-470.95769 C 840.65658,-471.03376 841.11507,-472.25571 841.03831,-472.71419 C 840.96156,-473.17267 838.66981,-472.27677 838.44091,-474.33961 C 838.28807,-475.56156 840.35092,-485.81397 840.35092,-485.81397 L 843.9407,-485.81397 L 843.9407,-488.60224 L 841.11439,-488.60224 L 842.20864,-494.42263 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path5731"
++ d="M 889.67174,-471.28915 C 890.3469,-471.8468 889.89589,-472.96212 889.31174,-473.0966 C 888.65288,-474.46255 890.68584,-482.44495 890.68584,-484.63006 C 890.68584,-486.81517 887.01999,-491.19897 879.45804,-487.07463 C 878.72514,-486.60868 878.9948,-485.84658 879.17548,-485.59186 C 879.35615,-485.33715 879.69577,-485.16734 879.85471,-485.33715 C 880.56588,-486.11216 883.65981,-486.92181 885.10998,-485.3942 C 886.10303,-484.47724 886.0582,-482.70578 885.37013,-482.01839 C 884.53059,-481.94231 876.25,-482.18549 875.25695,-476.91528 C 873.54391,-467.55742 884.03271,-472.48529 884.57542,-472.86702 C 885.11812,-473.24875 885.05496,-471.76258 885.93593,-471.13632 C 888.32753,-470.92779 889.20035,-470.89994 889.67174,-471.28915 z M 884.43617,-475.19884 C 883.58713,-472.96279 880.43479,-473.30445 880.248,-474.88708 C 879.56876,-480.17969 885.03051,-479.7837 885.03051,-479.7837 C 885.03051,-479.7837 885.28522,-477.4349 884.43617,-475.19884 z" />
++ <path
++ style="font-size:14px;fill:#888a85"
++ id="path5733"
++ d="M 829.33368,-483.44682 L 830.91767,-486.12235 C 830.91767,-486.12235 829.62711,-488.86986 825.81591,-488.86986 C 822.00471,-488.86986 819.80602,-486.12167 819.80602,-482.85997 C 819.80602,-479.59826 827.06164,-477.14283 825.30309,-473.91848 C 822.3715,-470.91353 819.27689,-475.81491 819.33802,-476.13688 C 819.11659,-475.81763 817.59917,-473.72626 817.67253,-473.72626 C 818.03932,-472.99336 819.37062,-470.66968 823.61722,-470.62078 C 827.13499,-470.58003 829.26101,-473.18559 829.33437,-476.40993 C 829.40773,-480.73395 823.10439,-482.93332 823.03104,-484.91195 C 822.95768,-486.89057 827.20903,-489.16397 829.33368,-483.44682 z" />
++ <path
++ id="path5735"
++ d="M 821.0266,-489.81537 C 820.34737,-490.45249 819.83794,-489.60276 818.30965,-488.96632 C 816.78137,-488.32986 816.27194,-488.4141 814.74365,-488.6267 C 812.23863,-489.17891 807.83581,-489.01386 806.67771,-488.45689 C 798.9439,-485.35141 803.09065,-479.60574 804.35335,-478.45918 C 804.34249,-478.45918 802.46983,-477.47225 802.1961,-475.92223 C 801.84425,-473.93002 802.76054,-472.85208 802.78907,-472.82422 C 800.26231,-472.69313 798.63757,-470.1521 799.02881,-468.0716 C 799.44994,-465.8308 802.12137,-464.04304 805.94616,-464.0281 C 814.03181,-463.85218 814.45091,-469.02253 814.45091,-469.02253 C 815.55738,-475.31091 810.22469,-475.60096 806.42435,-475.30548 C 805.04889,-476.53422 806.12209,-477.6801 806.06368,-477.6801 C 818.90399,-477.37716 815.67149,-485.94099 815.67149,-485.94099 C 817.83962,-486.46876 822.08757,-488.7965 821.0266,-489.81537 z M 803.82831,-471.79994 C 808.85806,-470.89247 810.88219,-472.04582 811.22656,-469.4817 C 811.37532,-466.97939 809.25133,-466.26415 806.78095,-466.11064 C 804.31056,-465.95713 802.51058,-467.20557 802.41142,-468.81061 C 802.31292,-470.41565 803.71487,-470.24991 803.82831,-471.79994 z M 811.59811,-482.73839 C 811.13351,-480.68165 809.70846,-479.24982 808.41452,-479.54189 C 807.12057,-479.83464 806.4488,-481.73854 806.91272,-483.79596 C 807.37733,-485.85337 808.80236,-487.2852 810.09631,-486.99313 C 811.39026,-486.70038 812.0627,-484.7958 811.59811,-482.73839 z"
++ style="font-size:14px;fill:#2e3436" />
++ <path
++ style="font-size:14px;fill:#cc0000"
++ id="path5737"
++ d="M 794.60358,-507.62294 C 790.92958,-507.62294 785.55409,-510.61634 780.31513,-510.61634 C 775.07616,-510.61634 771.94691,-507.62294 771.40216,-507.21472 C 770.8581,-506.8065 770.51711,-505.24221 772.15069,-505.71836 C 773.78425,-506.19451 775.14409,-506.19451 777.72994,-506.19451 C 780.3158,-506.19451 786.50706,-502.65636 792.76692,-502.65636 C 799.02677,-502.65636 804.26505,-507.48641 805.42179,-509.1879 C 806.57854,-510.88939 805.48972,-511.43347 804.60535,-511.02456 C 803.7203,-510.61634 798.00588,-507.62294 794.60358,-507.62294 z" />
++ <path
++ style="font-size:14px;fill:#73d216"
++ id="path5739"
++ d="M 810.56431,-498.30244 C 806.7042,-498.30244 801.05701,-501.29516 795.55315,-501.29516 C 790.04929,-501.29516 786.7611,-498.30244 786.18918,-497.89354 C 785.61726,-497.48464 785.2593,-495.92103 786.97506,-496.39718 C 788.69081,-496.87332 790.11992,-496.87332 792.8362,-496.87332 C 795.55247,-496.87332 802.05754,-493.33517 808.63323,-493.33517 C 815.20893,-493.33517 820.71347,-498.16524 821.92863,-499.86605 C 823.14379,-501.56754 821.99996,-502.11228 821.07076,-501.70338 C 820.14156,-501.29449 814.13845,-498.30244 810.56431,-498.30244 z" />
++ <path
++ style="font-size:14px;fill:#204a87"
++ id="path5741"
++ d="M 788.35119,-488.01742 C 784.34844,-488.01742 778.49206,-491.25127 772.78442,-491.25127 C 767.07678,-491.25127 763.66633,-488.01742 763.07335,-487.57659 C 762.48037,-487.13577 762.10951,-485.44583 763.88844,-485.96069 C 765.66804,-486.47487 767.15013,-486.47487 769.96694,-486.47487 C 772.78374,-486.47487 779.52993,-482.65348 786.35015,-482.65348 C 793.16971,-482.65348 798.87734,-487.87071 800.13801,-489.70804 C 801.39867,-491.54538 800.21204,-492.13292 799.24821,-491.6921 C 798.28436,-491.25127 792.05779,-488.01742 788.35119,-488.01742 z" />
++ </g>
++ <g
++ id="g12864"
++ transform="translate(-3.8448289,-390.65639)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/src-element.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect10377"
++ width="153.2551"
++ height="99.162369"
++ x="53.827591"
++ y="196.1284"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="59.603958"
++ y="211.60356"
++ id="text10379"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan10381"
++ x="59.603958"
++ y="211.60356">source element</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect10383"
++ width="49.561798"
++ height="33.867229"
++ x="157.48853"
++ y="228.77596" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="176.48724"
++ y="248.43907"
++ id="text10385"><tspan
++ sodipodi:role="line"
++ id="tspan10387"
++ x="176.48724"
++ y="248.43907">src</tspan></text>
++ </g>
++ <text
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="-232.36481"
++ y="-184.07236"
++ id="text10389"><tspan
++ sodipodi:role="line"
++ id="tspan10391"
++ x="-232.36481"
++ y="-184.07236"
++ style="font-size:20px;font-weight:normal;-inkscape-font-specification:Bitstream Vera Sans">Chapter 5. Elements</tspan></text>
++ <g
++ id="g12853"
++ transform="translate(-203.64378,-238.20511)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/filter-element.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect10393"
++ width="153.2551"
++ height="99.162369"
++ x="253.6324"
++ y="196.1284"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="259.40887"
++ y="211.20474"
++ id="text10395"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan10397"
++ x="259.40887"
++ y="211.20474">filter</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect10399"
++ width="49.561798"
++ height="33.867229"
++ x="253.62654"
++ y="228.77596" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="265.60394"
++ y="249.43761"
++ id="text10401"><tspan
++ sodipodi:role="line"
++ id="tspan10403"
++ x="265.60394"
++ y="249.43761">sink</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect10405"
++ width="49.561798"
++ height="33.867229"
++ x="357.29327"
++ y="228.77596" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="376.29205"
++ y="248.43907"
++ id="text10407"><tspan
++ sodipodi:role="line"
++ id="tspan10409"
++ x="376.29205"
++ y="248.43907">src</tspan></text>
++ </g>
++ <g
++ id="g12839"
++ transform="translate(-419.83883,-95.282046)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/filter-element-multi.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect10417"
++ width="153.2551"
++ height="99.162369"
++ x="469.82745"
++ y="196.3278"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="475.60394"
++ y="211.60356"
++ id="text10419"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan10421"
++ x="475.60394"
++ y="211.60356">demuxer</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect10423"
++ width="49.561798"
++ height="33.867229"
++ x="469.82159"
++ y="228.97539" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="481.79901"
++ y="249.63701"
++ id="text10425"><tspan
++ sodipodi:role="line"
++ id="tspan10427"
++ x="481.79901"
++ y="249.63701">sink</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect10429"
++ width="49.561798"
++ height="33.867229"
++ x="573.52655"
++ y="253.34068" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="583.05841"
++ y="273.00381"
++ id="text10431"><tspan
++ sodipodi:role="line"
++ id="tspan10433"
++ x="583.05841"
++ y="273.00381">video</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect10435"
++ width="49.561798"
++ height="33.867229"
++ x="573.52655"
++ y="211.73633" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="582.62628"
++ y="231.39946"
++ id="text10437"><tspan
++ sodipodi:role="line"
++ id="tspan10439"
++ x="582.62628"
++ y="231.39946">audio</tspan></text>
++ </g>
++ <g
++ id="g12831"
++ transform="translate(-629.83895,47.641023)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/sink-element.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect10968"
++ width="153.2551"
++ height="99.162369"
++ x="679.82758"
++ y="196.3278"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="685.60394"
++ y="211.60356"
++ id="text10970"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan10972"
++ x="685.60394"
++ y="211.60356">sink element</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect10974"
++ width="49.561798"
++ height="33.867229"
++ x="679.82172"
++ y="228.97539" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="691.79913"
++ y="249.63701"
++ id="text10976"><tspan
++ sodipodi:role="line"
++ id="tspan10978"
++ x="691.79913"
++ y="249.63701">sink</tspan></text>
++ </g>
++ <g
++ id="g12377"
++ transform="translate(-68.561357,-11.534483)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/linked-elements.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <g
++ id="g11071"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/linked-elements.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <rect
++ ry="5"
++ rx="5"
++ y="442.60376"
++ x="122.38895"
++ height="99.162369"
++ width="153.2551"
++ id="rect10982"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text10984"
++ y="458.07892"
++ x="128.16531"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="458.07892"
++ x="128.16531"
++ id="tspan10986"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">source</tspan></text>
++ <rect
++ y="475.25131"
++ x="226.04988"
++ height="33.867229"
++ width="49.561798"
++ id="rect10988"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text10990"
++ y="494.91443"
++ x="245.0486"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="494.91443"
++ x="245.0486"
++ id="tspan10992"
++ sodipodi:role="line">src</tspan></text>
++ </g>
++ <g
++ transform="translate(-5,0)"
++ id="g11060"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/linked-elements.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <rect
++ ry="5"
++ rx="5"
++ y="442.60376"
++ x="322.19376"
++ height="99.162369"
++ width="153.2551"
++ id="rect10998"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text11000"
++ y="457.68008"
++ x="327.97025"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="457.68008"
++ x="327.97025"
++ id="tspan11002"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">filter</tspan></text>
++ <rect
++ y="475.25131"
++ x="322.1879"
++ height="33.867229"
++ width="49.561798"
++ id="rect11004"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text11006"
++ y="495.91296"
++ x="334.16531"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="495.91296"
++ x="334.16531"
++ id="tspan11008"
++ sodipodi:role="line">sink</tspan></text>
++ <rect
++ y="475.25131"
++ x="425.85464"
++ height="33.867229"
++ width="49.561798"
++ id="rect11010"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text11012"
++ y="494.91443"
++ x="444.85342"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="494.91443"
++ x="444.85342"
++ id="tspan11014"
++ sodipodi:role="line">src</tspan></text>
++ </g>
++ <g
++ transform="translate(-18,0)"
++ id="g11052"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/linked-elements.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <rect
++ ry="5"
++ rx="5"
++ y="442.80316"
++ x="530.38898"
++ height="99.162369"
++ width="153.2551"
++ id="rect11040"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text11042"
++ y="458.07892"
++ x="536.16534"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="458.07892"
++ x="536.16534"
++ id="tspan11044"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">sink</tspan></text>
++ <rect
++ y="475.45074"
++ x="530.38312"
++ height="33.867229"
++ width="49.561798"
++ id="rect11046"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text11048"
++ y="496.11237"
++ x="542.36053"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="496.11237"
++ x="542.36053"
++ id="tspan11050"
++ sodipodi:role="line">sink</tspan></text>
++ </g>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/linked-elements.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 276.30993,492.20522 L 313.30993,492.20522"
++ id="path11079"
++ sodipodi:nodetypes="cc" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/linked-elements.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 470.9978,492.20522 L 507.9978,492.20522"
++ id="path11081"
++ sodipodi:nodetypes="cc" />
++ </g>
++ <text
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="-186.13794"
++ y="680.05182"
++ id="text11083"><tspan
++ sodipodi:role="line"
++ id="tspan11085"
++ x="-186.13794"
++ y="680.05182"
++ style="font-size:20px;font-weight:normal;-inkscape-font-specification:Bitstream Vera Sans">Chapter 6. Bins</tspan></text>
++ <g
++ id="g12405"
++ transform="translate(-34.664742,0)"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/bin-element.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#eeeeec;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect11191"
++ width="590.96216"
++ height="178.84381"
++ x="88.492332"
++ y="670.72888"
++ rx="5.0000005"
++ ry="5" />
++ <g
++ transform="translate(-10.043098,290.59605)"
++ id="g11139">
++ <rect
++ ry="5"
++ rx="5"
++ y="442.60376"
++ x="122.38895"
++ height="99.162369"
++ width="153.2551"
++ id="rect11141"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text11143"
++ y="458.07892"
++ x="128.16531"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="458.07892"
++ x="128.16531"
++ id="tspan11145"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">Element 1</tspan></text>
++ <rect
++ y="475.25131"
++ x="226.04988"
++ height="33.867229"
++ width="49.561798"
++ id="rect11147"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text11149"
++ y="494.91443"
++ x="245.0486"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="494.91443"
++ x="245.0486"
++ id="tspan11151"
++ sodipodi:role="line">src</tspan></text>
++ </g>
++ <g
++ transform="translate(-15.043098,290.59605)"
++ id="g11153">
++ <rect
++ ry="5"
++ rx="5"
++ y="442.60376"
++ x="322.19376"
++ height="99.162369"
++ width="153.2551"
++ id="rect11155"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text11157"
++ y="457.68008"
++ x="327.97025"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="457.68008"
++ x="327.97025"
++ id="tspan11159"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">Element 2</tspan></text>
++ <rect
++ y="475.25131"
++ x="322.1879"
++ height="33.867229"
++ width="49.561798"
++ id="rect11161"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text11163"
++ y="495.91296"
++ x="334.16531"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="495.91296"
++ x="334.16531"
++ id="tspan11165"
++ sodipodi:role="line">sink</tspan></text>
++ <rect
++ y="475.25131"
++ x="425.85464"
++ height="33.867229"
++ width="49.561798"
++ id="rect11167"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text11169"
++ y="494.91443"
++ x="444.85342"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="494.91443"
++ x="444.85342"
++ id="tspan11171"
++ sodipodi:role="line">src</tspan></text>
++ </g>
++ <g
++ transform="translate(-28.043098,290.59605)"
++ id="g11173">
++ <rect
++ ry="5"
++ rx="5"
++ y="442.80316"
++ x="530.38898"
++ height="99.162369"
++ width="153.2551"
++ id="rect11175"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text11177"
++ y="458.07892"
++ x="536.16534"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="458.07892"
++ x="536.16534"
++ id="tspan11179"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">Element 3</tspan></text>
++ <rect
++ y="475.45074"
++ x="530.38312"
++ height="33.867229"
++ width="49.561798"
++ id="rect11181"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text11183"
++ y="496.11237"
++ x="542.36053"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="496.11237"
++ x="542.36053"
++ id="tspan11185"
++ sodipodi:role="line">sink</tspan></text>
++ </g>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 266.26683,782.80127 L 303.26683,782.80127"
++ id="path11187"
++ sodipodi:nodetypes="cc" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 460.9547,782.80127 L 497.9547,782.80127"
++ id="path11189"
++ sodipodi:nodetypes="cc" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:18px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="100"
++ y="692.36218"
++ id="text11193"><tspan
++ style="font-size:18px;font-weight:bold;fill:#204a87;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ sodipodi:role="line"
++ id="tspan11195"
++ x="100"
++ y="692.36218">Bin</tspan></text>
++ </g>
++ <text
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="-252.84822"
++ y="1009.3475"
++ id="text11251"><tspan
++ sodipodi:role="line"
++ id="tspan11253"
++ x="-252.84822"
++ y="1009.3475"
++ style="font-size:20px;font-weight:normal;-inkscape-font-specification:Bitstream Vera Sans">Chapter 8. Ghost pads</tspan></text>
++ <g
++ id="g5762"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/bin-element-ghost.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect11412"
++ width="457.9566"
++ height="179.06404"
++ x="53.827591"
++ y="1262.248"
++ rx="5.0000005"
++ ry="5" />
++ <g
++ transform="translate(111.55986,8.6772153)"
++ id="g11476">
++ <rect
++ y="1348.6534"
++ x="-57.549042"
++ height="33.867229"
++ width="49.561798"
++ id="rect11406"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text11408"
++ y="1369.3151"
++ x="-45.571625"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="1369.3151"
++ x="-45.571625"
++ id="tspan11410"
++ sodipodi:role="line">sink</tspan></text>
++ </g>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect11416"
++ width="153.2551"
++ height="99.162369"
++ x="339.65652"
++ y="1324.6831"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="345.43301"
++ y="1339.7594"
++ id="text11418"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan11420"
++ x="345.43301"
++ y="1339.7594">Element 2</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect11422"
++ width="49.561798"
++ height="33.867229"
++ x="339.65067"
++ y="1357.3307" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="351.62808"
++ y="1377.9923"
++ id="text11424"><tspan
++ sodipodi:role="line"
++ id="tspan11426"
++ x="351.62808"
++ y="1377.9923">sink</tspan></text>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 298.7727,1374.2845 L 335.7727,1374.2845"
++ id="path11448"
++ sodipodi:nodetypes="cc" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:18px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="64.505875"
++ y="1283.9915"
++ id="text11452"><tspan
++ style="font-size:18px;font-weight:bold;fill:#204a87;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ sodipodi:role="line"
++ id="tspan11454"
++ x="64.505875"
++ y="1283.9915">Bin</tspan></text>
++ <g
++ transform="translate(-177.62554,882.07933)"
++ id="g11456">
++ <rect
++ ry="5"
++ rx="5"
++ y="442.60376"
++ x="322.19376"
++ height="99.162369"
++ width="153.2551"
++ id="rect11458"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text11460"
++ y="457.68008"
++ x="327.97025"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="457.68008"
++ x="327.97025"
++ id="tspan11462"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">Element 1</tspan></text>
++ <rect
++ y="475.25131"
++ x="322.1879"
++ height="33.867229"
++ width="49.561798"
++ id="rect11464"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text11466"
++ y="495.91296"
++ x="334.16531"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="495.91296"
++ x="334.16531"
++ id="tspan11468"
++ sodipodi:role="line">sink</tspan></text>
++ <rect
++ y="475.25131"
++ x="425.85464"
++ height="33.867229"
++ width="49.561798"
++ id="rect11470"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text11472"
++ y="494.91443"
++ x="444.85342"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="494.91443"
++ x="444.85342"
++ id="tspan11474"
++ sodipodi:role="line">src</tspan></text>
++ </g>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2, 4;stroke-dashoffset:1.8;stroke-opacity:1"
++ d="M 103.81216,1374.2846 L 144.19728,1374.2846"
++ id="path11481"
++ sodipodi:nodetypes="cc" />
++ </g>
++ <g
++ id="g5789"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/bin-element-noghost.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect12019"
++ width="457.9566"
++ height="179.06404"
++ x="53.827591"
++ y="1000.8856"
++ rx="5.0000005"
++ ry="5" />
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect12029"
++ width="153.2551"
++ height="99.162369"
++ x="339.65652"
++ y="1063.3207"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="345.43301"
++ y="1078.397"
++ id="text12031"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan12033"
++ x="345.43301"
++ y="1078.397">Element 2</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect12035"
++ width="49.561798"
++ height="33.867229"
++ x="339.65067"
++ y="1095.9683" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="351.62808"
++ y="1116.6299"
++ id="text12037"><tspan
++ sodipodi:role="line"
++ id="tspan12039"
++ x="351.62808"
++ y="1116.6299">sink</tspan></text>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 298.77271,1112.9219 L 335.77271,1112.9219"
++ id="path12045"
++ sodipodi:nodetypes="cc" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:18px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="64.505882"
++ y="1022.629"
++ id="text12047"><tspan
++ style="font-size:18px;font-weight:bold;fill:#204a87;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ sodipodi:role="line"
++ id="tspan12049"
++ x="64.505882"
++ y="1022.629">Bin</tspan></text>
++ <g
++ transform="translate(-177.62553,620.71681)"
++ id="g12051">
++ <rect
++ ry="5"
++ rx="5"
++ y="442.60376"
++ x="322.19376"
++ height="99.162369"
++ width="153.2551"
++ id="rect12053"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text12055"
++ y="457.68008"
++ x="327.97025"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="457.68008"
++ x="327.97025"
++ id="tspan12057"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">Element 1</tspan></text>
++ <rect
++ y="475.25131"
++ x="322.1879"
++ height="33.867229"
++ width="49.561798"
++ id="rect12059"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text12061"
++ y="495.91296"
++ x="334.16531"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="495.91296"
++ x="334.16531"
++ id="tspan12063"
++ sodipodi:role="line">sink</tspan></text>
++ <rect
++ y="475.25131"
++ x="425.85464"
++ height="33.867229"
++ width="49.561798"
++ id="rect12065"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text12067"
++ y="494.91443"
++ x="444.85342"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="494.91443"
++ x="444.85342"
++ id="tspan12069"
++ sodipodi:role="line">src</tspan></text>
++ </g>
++ </g>
++ <text
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="-261.34482"
++ y="1686.3453"
++ id="text12073"><tspan
++ sodipodi:role="line"
++ id="tspan12075"
++ x="-261.34482"
++ y="1686.3453"
++ style="font-size:20px;font-weight:normal;-inkscape-font-specification:Bitstream Vera Sans">Chapter 10. Hello world</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="-226.36046"
++ y="2050.478"
++ id="text12077"><tspan
++ sodipodi:role="line"
++ id="tspan12079"
++ x="-226.36046"
++ y="2050.478"
++ style="font-size:20px;font-weight:normal;-inkscape-font-specification:Bitstream Vera Sans">Chapter 16. Threads</tspan></text>
++ <text
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="-270.39511"
++ y="2868.5122"
++ id="text12303"><tspan
++ sodipodi:role="line"
++ id="tspan12305"
++ x="-270.39511"
++ y="2868.5122"
++ style="font-size:20px;font-weight:normal;-inkscape-font-specification:Bitstream Vera Sans">Chapter 17. MIME types</tspan></text>
++ <g
++ id="g5111">
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect12207"
++ width="950.7605"
++ height="178.42247"
++ x="53.827591"
++ y="2869.4634"
++ rx="5"
++ ry="5" />
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect12209"
++ width="153.2551"
++ height="99.162369"
++ x="63.10714"
++ y="2938.333"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="68.883514"
++ y="2953.6089"
++ id="text12211"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan12213"
++ x="68.883514"
++ y="2953.6089">file-source</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect12215"
++ width="49.561798"
++ height="33.867229"
++ x="166.76808"
++ y="2983.3459" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="183.21158"
++ y="3003.009"
++ id="text12217"><tspan
++ sodipodi:role="line"
++ id="tspan12219"
++ x="183.21158"
++ y="3003.009">src</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect12221"
++ width="153.2551"
++ height="99.162369"
++ x="257.22424"
++ y="2938.333"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="263.00064"
++ y="2953.6089"
++ id="text12223"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan12225"
++ x="263.00064"
++ y="2953.6089">ogg-demuxer</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect12227"
++ width="49.561798"
++ height="33.867229"
++ x="257.21838"
++ y="2983.3459" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="270.05838"
++ y="3004.0076"
++ id="text12229"><tspan
++ sodipodi:role="line"
++ id="tspan12231"
++ x="270.05838"
++ y="3004.0076">sink</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect12233"
++ width="49.561798"
++ height="33.867229"
++ x="360.88513"
++ y="2983.3459" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="368.88379"
++ y="3002.8113"
++ id="text12235"><tspan
++ sodipodi:role="line"
++ id="tspan12237"
++ x="368.88379"
++ y="3002.8113">src_01</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect12239"
++ width="153.2551"
++ height="99.162369"
++ x="451.34122"
++ y="2938.333"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="457.11771"
++ y="2953.6089"
++ id="text12241"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan12243"
++ x="457.11771"
++ y="2953.6089">vorbis-decoder</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect12245"
++ width="49.561798"
++ height="33.867229"
++ x="451.33536"
++ y="2983.3459" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="464.17532"
++ y="3004.0076"
++ id="text12247"><tspan
++ sodipodi:role="line"
++ id="tspan12249"
++ x="464.17532"
++ y="3004.0076">sink</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect12251"
++ width="49.561798"
++ height="33.867229"
++ x="555.00208"
++ y="2983.3459" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="571.44556"
++ y="3003.009"
++ id="text12253"><tspan
++ sodipodi:role="line"
++ id="tspan12255"
++ x="571.44556"
++ y="3003.009">src</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect12257"
++ width="153.2551"
++ height="99.162369"
++ x="646.15405"
++ y="2938.333"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="651.93054"
++ y="2953.6089"
++ id="text12259"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan12261"
++ x="651.93054"
++ y="2953.6089">converter</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect12263"
++ width="49.561798"
++ height="33.867229"
++ x="646.14832"
++ y="2983.3459" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="658.98828"
++ y="3004.0076"
++ id="text12265"><tspan
++ sodipodi:role="line"
++ id="tspan12267"
++ x="658.98828"
++ y="3004.0076">sink</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect12269"
++ width="49.561798"
++ height="33.867229"
++ x="749.81519"
++ y="2983.3459" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="766.25867"
++ y="3003.009"
++ id="text12271"><tspan
++ sodipodi:role="line"
++ id="tspan12273"
++ x="766.25867"
++ y="3003.009">src</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect12275"
++ width="153.2551"
++ height="99.162369"
++ x="839.92334"
++ y="2938.333"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="845.69971"
++ y="2953.6089"
++ id="text12277"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan12279"
++ x="845.69971"
++ y="2953.6089">audio-output</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect12281"
++ width="49.561798"
++ height="33.867229"
++ x="839.91748"
++ y="2983.3459" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="851.8949"
++ y="3004.0076"
++ id="text12283"><tspan
++ sodipodi:role="line"
++ id="tspan12285"
++ x="851.8949"
++ y="3004.0076">sink</tspan></text>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 216.13925,3000.2998 L 253.13929,3000.2998"
++ id="path12287"
++ sodipodi:nodetypes="cc" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:18px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="65.124596"
++ y="2890.886"
++ id="text12289"><tspan
++ style="font-size:18px;font-weight:bold;fill:#204a87;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ sodipodi:role="line"
++ id="tspan12291"
++ x="65.124596"
++ y="2890.886">pipeline</tspan></text>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 410.20269,3000.2998 L 447.20269,3000.2998"
++ id="path12293"
++ sodipodi:nodetypes="cc" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 605.03259,3000.2998 L 642.03259,3000.2998"
++ id="path12295"
++ sodipodi:nodetypes="cc" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 798.75069,3000.2998 L 835.75069,3000.2998"
++ id="path12297"
++ sodipodi:nodetypes="cc" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2, 4;stroke-dashoffset:1.79999991;stroke-opacity:1"
++ d="M 191.54898,3019.5053 L 191.54898,3106.6813"
++ id="path12307"
++ sodipodi:nodetypes="cc" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="187.62395"
++ y="3120.1367"
++ id="text12309"><tspan
++ style="font-size:14px;font-weight:normal;text-align:center;text-anchor:middle;fill:#204a87;-inkscape-font-specification:Bitstream Vera Sans"
++ sodipodi:role="line"
++ id="tspan12311"
++ x="187.62395"
++ y="3120.1367">(any)</tspan></text>
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="219.951"
++ y="3142.5869"
++ id="text12317"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan12319"
++ x="219.951"
++ y="3142.5869">application/ogg</tspan></text>
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="343.84293"
++ y="3118.1367"
++ id="text12321"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan12323"
++ x="343.84293"
++ y="3118.1367">audio/x-vorbis</tspan></text>
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="433.16547"
++ y="3143.3936"
++ id="text12325"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan12327"
++ x="433.16547"
++ y="3143.3936">audio/x-vorbis</tspan></text>
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="537.2168"
++ y="3118.1367"
++ id="text12329"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan12331"
++ x="537.2168"
++ y="3118.1367">audio/x-raw-float</tspan></text>
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="627.71606"
++ y="3143.3936"
++ id="text12345"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan12347"
++ x="627.71606"
++ y="3143.3936">audio/x-raw-float</tspan></text>
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="732.46454"
++ y="3118.1367"
++ id="text12349"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan12351"
++ x="732.46454"
++ y="3118.1367">audio/x-raw-int</tspan></text>
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="821.01434"
++ y="3143.3936"
++ id="text12353"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan12355"
++ x="821.01434"
++ y="3143.3936">audio/x-raw-int</tspan></text>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2, 4;stroke-dashoffset:1.79999991;stroke-opacity:1"
++ d="M 386.08862,3018.1368 L 386.08862,3105.3128"
++ id="path12363"
++ sodipodi:nodetypes="cc" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2, 4;stroke-dashoffset:1.79999991;stroke-opacity:1"
++ d="M 579.783,3018.1368 L 579.783,3105.3128"
++ id="path12365"
++ sodipodi:nodetypes="cc" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2, 4;stroke-dashoffset:1.79999991;stroke-opacity:1"
++ d="M 774.83811,3018.4339 L 774.83811,3105.6099"
++ id="path12367"
++ sodipodi:nodetypes="cc" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2, 4;stroke-dashoffset:1.7999999;stroke-opacity:1"
++ d="M 475.54856,3018.7173 L 475.54856,3130.5895"
++ id="path12369"
++ sodipodi:nodetypes="cc" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2, 4;stroke-dashoffset:1.7999999;stroke-opacity:1"
++ d="M 670.81492,3018.2714 L 670.81492,3130.1436"
++ id="path12371"
++ sodipodi:nodetypes="cc" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2, 4;stroke-dashoffset:1.7999999;stroke-opacity:1"
++ d="M 863.70363,3018.5686 L 863.70363,3130.4408"
++ id="path12373"
++ sodipodi:nodetypes="cc" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2, 4;stroke-dashoffset:1.7999999;stroke-opacity:1"
++ d="M 281.25428,3018.2645 L 281.25428,3130.1367"
++ id="path12375"
++ sodipodi:nodetypes="cc" />
++ </g>
++ <g
++ id="g9165"
++ transform="translate(-353.31307,15.400826)">
++ <rect
++ ry="0"
++ rx="0"
++ y="2271.1328"
++ x="256.57138"
++ height="73.422379"
++ width="35.035748"
++ id="rect12181"
++ style="fill:#ef2929;fill-opacity:1;fill-rule:nonzero;stroke:#a40000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.8;stroke-opacity:1" />
++ <rect
++ ry="0"
++ rx="0"
++ y="2271.1328"
++ x="291.34567"
++ height="73.422379"
++ width="35.035748"
++ id="rect12183"
++ style="fill:#cc0000;fill-opacity:1;fill-rule:nonzero;stroke:#a40000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.8;stroke-opacity:1" />
++ <rect
++ ry="0"
++ rx="0"
++ y="2271.1328"
++ x="326.38141"
++ height="73.422379"
++ width="35.035748"
++ id="rect12185"
++ style="fill:#a40000;fill-opacity:1;fill-rule:nonzero;stroke:#a40000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.8;stroke-opacity:1" />
++ </g>
++ <g
++ id="g5242"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/thread-synchronizing.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9208"
++ width="153.2551"
++ height="99.162369"
++ x="55.164093"
++ y="2544.4136"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="60.940521"
++ y="2561.6895"
++ id="text9210"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan9212"
++ x="60.940521"
++ y="2561.6895">source</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9214"
++ width="49.561798"
++ height="33.867229"
++ x="158.8251"
++ y="2577.0613" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="177.82376"
++ y="2596.7244"
++ id="text9216"><tspan
++ sodipodi:role="line"
++ id="tspan9218"
++ x="177.82376"
++ y="2596.7244">src</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9220"
++ width="153.2551"
++ height="99.162369"
++ x="249.28116"
++ y="2544.4136"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="255.05753"
++ y="2561.6895"
++ id="text9222"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan9224"
++ x="255.05753"
++ y="2561.6895">demuxer</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9226"
++ width="49.561798"
++ height="33.867229"
++ x="249.2753"
++ y="2577.0613" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="261.25272"
++ y="2597.7229"
++ id="text9228"><tspan
++ sodipodi:role="line"
++ id="tspan9230"
++ x="261.25272"
++ y="2597.7229">sink</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9232"
++ width="49.561798"
++ height="33.867229"
++ x="352.94205"
++ y="2555.5593" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="361.9407"
++ y="2576.623"
++ id="text9234"><tspan
++ sodipodi:role="line"
++ id="tspan9236"
++ x="361.9407"
++ y="2576.623">src_01</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9238"
++ width="153.2551"
++ height="99.162369"
++ x="455.98245"
++ y="2481.5427"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="461.75894"
++ y="2498.8186"
++ id="text9240"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan9242"
++ x="461.75894"
++ y="2498.8186">queue</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9244"
++ width="49.561798"
++ height="33.867229"
++ x="455.97659"
++ y="2514.1904" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="467.95401"
++ y="2534.8521"
++ id="text9246"><tspan
++ sodipodi:role="line"
++ id="tspan9248"
++ x="467.95401"
++ y="2534.8521">sink</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9250"
++ width="49.561798"
++ height="33.867229"
++ x="559.64337"
++ y="2514.1904" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="578.64203"
++ y="2533.8535"
++ id="text9252"><tspan
++ sodipodi:role="line"
++ id="tspan9254"
++ x="578.64203"
++ y="2533.8535">src</tspan></text>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 208.19623,2594.0152 L 245.19623,2594.0152"
++ id="path9268"
++ sodipodi:nodetypes="cc" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 609.62133,2531.1443 L 646.62133,2531.1443"
++ id="path9274"
++ sodipodi:nodetypes="cc" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 609.90703,2655.9366 L 646.90703,2655.9366"
++ id="path9276"
++ sodipodi:nodetypes="cc" />
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9334"
++ width="49.561798"
++ height="33.867229"
++ x="352.75467"
++ y="2599.0354" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="361.75333"
++ y="2620.0991"
++ id="text9336"><tspan
++ sodipodi:role="line"
++ id="tspan9338"
++ x="361.75333"
++ y="2620.0991">src_02</tspan></text>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 401.93943,2620.0261 L 452.47783,2654.9737"
++ id="path9340"
++ sodipodi:nodetypes="cc" />
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9342"
++ width="153.2551"
++ height="99.162369"
++ x="455.98245"
++ y="2606.3352"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="461.75894"
++ y="2623.6108"
++ id="text9344"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan9346"
++ x="461.75894"
++ y="2623.6108">queue</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9348"
++ width="49.561798"
++ height="33.867229"
++ x="455.97659"
++ y="2638.9827" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="467.95401"
++ y="2659.6443"
++ id="text9350"><tspan
++ sodipodi:role="line"
++ id="tspan9352"
++ x="467.95401"
++ y="2659.6443">sink</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9354"
++ width="49.561798"
++ height="33.867229"
++ x="559.64337"
++ y="2638.9827" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="578.64203"
++ y="2658.6458"
++ id="text9356"><tspan
++ sodipodi:role="line"
++ id="tspan9358"
++ x="578.64203"
++ y="2658.6458">src</tspan></text>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 402.26583,2570.6882 L 452.80423,2535.7406"
++ id="path9532"
++ sodipodi:nodetypes="cc" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="166.21593"
++ y="2454.6899"
++ id="text9850"><tspan
++ style="font-size:14px;font-weight:bold;fill:#5c3566"
++ sodipodi:role="line"
++ id="tspan9852"
++ x="166.21593"
++ y="2454.6899">thread 1</tspan></text>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#5c3566;fill-opacity:0.75;fill-rule:evenodd;stroke:#5c3566;stroke-width:1.83017349;stroke-linecap:butt;stroke-linejoin:miter;marker-end:none;stroke-miterlimit:4;stroke-dasharray:5.49052032, 5.49052032;stroke-dashoffset:0;stroke-opacity:1"
++ d="M 158.6894,2441.549 L 158.6894,2643.1753"
++ id="path9854"
++ sodipodi:nodetypes="cc" />
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9862"
++ width="153.2551"
++ height="99.162369"
++ x="650.55011"
++ y="2481.3848"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="656.3266"
++ y="2498.6606"
++ id="text9864"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan9866"
++ x="656.3266"
++ y="2498.6606">audio decoder</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9868"
++ width="49.561798"
++ height="33.867229"
++ x="650.54425"
++ y="2514.0325" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="662.52167"
++ y="2534.6941"
++ id="text9870"><tspan
++ sodipodi:role="line"
++ id="tspan9872"
++ x="662.52167"
++ y="2534.6941">sink</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9874"
++ width="49.561798"
++ height="33.867229"
++ x="754.21112"
++ y="2514.0325" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="773.20972"
++ y="2533.6956"
++ id="text9876"><tspan
++ sodipodi:role="line"
++ id="tspan9878"
++ x="773.20972"
++ y="2533.6956">src</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9880"
++ width="153.2551"
++ height="99.162369"
++ x="845.18909"
++ y="2481.3848"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="850.96545"
++ y="2498.6606"
++ id="text9882"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan9884"
++ x="850.96545"
++ y="2498.6606">audio sink</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9886"
++ width="49.561798"
++ height="33.867229"
++ x="845.18323"
++ y="2514.0325" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="857.16064"
++ y="2534.6941"
++ id="text9888"><tspan
++ sodipodi:role="line"
++ id="tspan9890"
++ x="857.16064"
++ y="2534.6941">sink</tspan></text>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 804.189,2530.9863 L 841.189,2530.9863"
++ id="path9892"
++ sodipodi:nodetypes="cc" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 804.4747,2655.7786 L 841.4747,2655.7786"
++ id="path9894"
++ sodipodi:nodetypes="cc" />
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9896"
++ width="153.2551"
++ height="99.162369"
++ x="650.55011"
++ y="2606.1772"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="656.3266"
++ y="2623.4529"
++ id="text9898"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan9900"
++ x="656.3266"
++ y="2623.4529">video decoder</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9902"
++ width="49.561798"
++ height="33.867229"
++ x="650.54425"
++ y="2638.8247" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="662.52167"
++ y="2659.4863"
++ id="text9904"><tspan
++ sodipodi:role="line"
++ id="tspan9906"
++ x="662.52167"
++ y="2659.4863">sink</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9908"
++ width="49.561798"
++ height="33.867229"
++ x="754.21112"
++ y="2638.8247" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="773.20972"
++ y="2658.4878"
++ id="text9910"><tspan
++ sodipodi:role="line"
++ id="tspan9912"
++ x="773.20972"
++ y="2658.4878">src</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9914"
++ width="153.2551"
++ height="99.162369"
++ x="845.19482"
++ y="2606.1772"
++ rx="5"
++ ry="5" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="850.97119"
++ y="2623.4529"
++ id="text9916"><tspan
++ style="font-size:14px;fill:#204a87"
++ sodipodi:role="line"
++ id="tspan9918"
++ x="850.97119"
++ y="2623.4529">video sink</tspan></text>
++ <rect
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ id="rect9920"
++ width="49.561798"
++ height="33.867229"
++ x="845.18896"
++ y="2638.8247" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ x="857.1665"
++ y="2659.4863"
++ id="text9922"><tspan
++ sodipodi:role="line"
++ id="tspan9924"
++ x="857.1665"
++ y="2659.4863">sink</tspan></text>
++ <rect
++ y="2509.4458"
++ x="555.48694"
++ height="42.934864"
++ width="343.78937"
++ id="rect9998"
++ style="fill:#ad7fa8;fill-opacity:0.23766815;fill-rule:nonzero;stroke:#5c3566;stroke-width:1.06965554;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="566.90637"
++ y="2742.7981"
++ id="text10002"><tspan
++ style="font-size:14px;font-weight:bold;fill:#5c3566"
++ sodipodi:role="line"
++ id="tspan10004"
++ x="566.90637"
++ y="2742.7981">thread 3</tspan></text>
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="567.03729"
++ y="2455.3918"
++ id="text10008"><tspan
++ style="font-size:14px;font-weight:bold;fill:#5c3566"
++ sodipodi:role="line"
++ id="tspan10010"
++ x="567.03729"
++ y="2455.3918">thread 2</tspan></text>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#5c3566;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#5c3566;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker-end:none;stroke-miterlimit:4;stroke-dasharray:6, 6;stroke-dashoffset:0;stroke-opacity:1"
++ d="M 559.51083,2580.7393 L 559.51083,2437.7084"
++ id="path10006"
++ sodipodi:nodetypes="cc" />
++ <rect
++ y="2634.4126"
++ x="555.14301"
++ height="42.934864"
++ width="343.78937"
++ id="rect10012"
++ style="fill:#ad7fa8;fill-opacity:0.23766815;fill-rule:nonzero;stroke:#5c3566;stroke-width:1.06965554;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#5c3566;fill-opacity:0.75000000000000000;fill-rule:evenodd;stroke:#5c3566;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker-end:none;stroke-miterlimit:4;stroke-dasharray:6, 6;stroke-dashoffset:0;stroke-opacity:1"
++ d="M 559.3799,2606.3677 L 559.3799,2749.772"
++ id="path10000"
++ sodipodi:nodetypes="cc" />
++ <path
++ sodipodi:nodetypes="ccccccccccccccc"
++ id="path10022"
++ d="M 153.02849,2571.3044 L 153.02849,2614.9272 L 324.28397,2615.1612 L 413.25904,2677.4489 L 512.50127,2677.2025 L 512.50127,2633.7394 L 446.97702,2633.7394 L 408.27814,2603.3763 L 408.27814,2580.0996 L 446.97702,2552.8235 L 512.50127,2552.8235 L 512.50127,2507.1238 L 426.85229,2507.1171 L 324.28397,2571.3044 L 153.02849,2571.3044 z"
++ style="fill:#ad7fa8;fill-opacity:0.23529412;fill-rule:evenodd;stroke:#5c3566;stroke-width:0.88699782;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
++ </g>
++ <g
++ id="g5388"
++ inkscape:export-filename="/scratchbox/users/luc/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/thread-buffering.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90">
++ <g
++ transform="translate(124.13534,1663.516)"
++ id="g12149">
++ <rect
++ ry="5"
++ rx="5"
++ y="442.60376"
++ x="322.19376"
++ height="99.162369"
++ width="153.2551"
++ id="rect12151"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text12153"
++ y="457.68008"
++ x="327.97025"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="457.68008"
++ x="327.97025"
++ id="tspan12155"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">parser</tspan></text>
++ <rect
++ y="475.25131"
++ x="322.1879"
++ height="33.867229"
++ width="49.561798"
++ id="rect12157"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text12159"
++ y="495.91296"
++ x="334.16531"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="495.91296"
++ x="334.16531"
++ id="tspan12161"
++ sodipodi:role="line">sink</tspan></text>
++ <rect
++ y="475.25131"
++ x="425.85464"
++ height="33.867229"
++ width="49.561798"
++ id="rect12163"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text12165"
++ y="494.91443"
++ x="444.85342"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="494.91443"
++ x="444.85342"
++ id="tspan12167"
++ sodipodi:role="line">src</tspan></text>
++ </g>
++ <g
++ transform="translate(319.16821,1663.2153)"
++ id="g12095">
++ <rect
++ ry="5"
++ rx="5"
++ y="442.60376"
++ x="322.19376"
++ height="99.162369"
++ width="153.2551"
++ id="rect12097"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text12099"
++ y="457.68008"
++ x="327.97025"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="457.68008"
++ x="327.97025"
++ id="tspan12101"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">decoder</tspan></text>
++ <rect
++ y="475.25131"
++ x="322.1879"
++ height="33.867229"
++ width="49.561798"
++ id="rect12103"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text12105"
++ y="495.91296"
++ x="334.16531"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="495.91296"
++ x="334.16531"
++ id="tspan12107"
++ sodipodi:role="line">sink</tspan></text>
++ <rect
++ y="475.25131"
++ x="425.85464"
++ height="33.867229"
++ width="49.561798"
++ id="rect12109"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text12111"
++ y="494.91443"
++ x="444.85342"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="494.91443"
++ x="444.85342"
++ id="tspan12113"
++ sodipodi:role="line">src</tspan></text>
++ </g>
++ <g
++ transform="translate(306.16821,1663.2153)"
++ id="g12115">
++ <rect
++ ry="5"
++ rx="5"
++ y="442.80316"
++ x="530.38898"
++ height="99.162369"
++ width="153.2551"
++ id="rect12117"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text12119"
++ y="458.07892"
++ x="536.16534"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="458.07892"
++ x="536.16534"
++ id="tspan12121"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">audio sink</tspan></text>
++ <rect
++ y="475.45074"
++ x="530.38312"
++ height="33.867229"
++ width="49.561798"
++ id="rect12123"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text12125"
++ y="496.11237"
++ x="542.36053"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="496.11237"
++ x="542.36053"
++ id="tspan12127"
++ sodipodi:role="line">sink</tspan></text>
++ </g>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 600.47814,2155.4205 L 637.47814,2155.4205"
++ id="path12129"
++ sodipodi:nodetypes="cc" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 795.16601,2155.4205 L 832.16601,2155.4205"
++ id="path12131"
++ sodipodi:nodetypes="cc" />
++ <g
++ transform="translate(-66.56136,1663.675)"
++ id="g12133">
++ <rect
++ ry="5"
++ rx="5"
++ y="442.60376"
++ x="122.38895"
++ height="99.162369"
++ width="153.2551"
++ id="rect12135"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text12137"
++ y="458.07892"
++ x="128.16531"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="458.07892"
++ x="128.16531"
++ id="tspan12139"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">networked</tspan><tspan
++ id="tspan10050"
++ y="475.57892"
++ x="128.16531"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">source</tspan></text>
++ <rect
++ y="475.25131"
++ x="226.04988"
++ height="33.867229"
++ width="49.561798"
++ id="rect12141"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text12143"
++ y="494.91443"
++ x="245.0486"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="494.91443"
++ x="245.0486"
++ id="tspan12145"
++ sodipodi:role="line">src</tspan></text>
++ </g>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 209.74857,2155.8802 L 246.74857,2155.8802"
++ id="path12147"
++ sodipodi:nodetypes="cc" />
++ <g
++ id="g9183">
++ <rect
++ ry="5"
++ rx="5"
++ y="2106.0527"
++ x="251.34793"
++ height="99.162369"
++ width="153.2551"
++ id="rect7700"
++ style="fill:#729fcf;fill-opacity:0.11764706;fill-rule:nonzero;stroke:#204a87;stroke-width:1.78325748;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text7702"
++ y="2121.1292"
++ x="257.12442"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#204a87;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="2121.1292"
++ x="257.12442"
++ id="tspan7704"
++ sodipodi:role="line"
++ style="font-size:14px;fill:#204a87">queue</tspan></text>
++ <rect
++ y="2138.7002"
++ x="251.34207"
++ height="33.867229"
++ width="49.561798"
++ id="rect7706"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text7708"
++ y="2159.3621"
++ x="263.31949"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="2159.3621"
++ x="263.31949"
++ id="tspan7710"
++ sodipodi:role="line">sink</tspan></text>
++ <rect
++ y="2138.7002"
++ x="355.00882"
++ height="33.867229"
++ width="49.561798"
++ id="rect7712"
++ style="fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#204a87;stroke-width:1.77165353;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90" />
++ <text
++ id="text7714"
++ y="2158.3635"
++ x="374.0076"
++ style="font-size:10px;font-style:normal;font-weight:bold;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
++ xml:space="preserve"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ inkscape:export-xdpi="90"
++ inkscape:export-ydpi="90"><tspan
++ y="2158.3635"
++ x="374.0076"
++ id="tspan7716"
++ sodipodi:role="line">src</tspan></text>
++ </g>
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#204a87;stroke-width:2.11019325;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow2Mendq);stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:3.28930069;stroke-opacity:1"
++ d="M 404.85722,2155.7212 L 441.85722,2155.7212"
++ id="path9158"
++ sodipodi:nodetypes="cc" />
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="165.44383"
++ y="2066.1194"
++ id="text9179"><tspan
++ style="font-size:14px;font-weight:bold;fill:#5c3566"
++ sodipodi:role="line"
++ id="tspan9181"
++ x="165.44383"
++ y="2066.1194">thread 1</tspan></text>
++ <text
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/hello-world.png"
++ xml:space="preserve"
++ style="font-size:10px;font-style:normal;font-weight:normal;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
++ x="363.1228"
++ y="2066.1453"
++ id="text9196"><tspan
++ style="font-size:14px;font-weight:bold;fill:#5c3566"
++ sodipodi:role="line"
++ id="tspan9198"
++ x="363.1228"
++ y="2066.1453">thread 2</tspan></text>
++ <rect
++ y="2133.7251"
++ x="155.32449"
++ height="43.732185"
++ width="150.65686"
++ id="rect9200"
++ style="fill:#ad7fa8;fill-opacity:0.23766815;fill-rule:nonzero;stroke:#5c3566;stroke-width:1.01326835;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#5c3566;fill-opacity:0.75;fill-rule:evenodd;stroke:#5c3566;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker-end:none;stroke-miterlimit:4;stroke-dasharray:6, 6;stroke-dashoffset:0;stroke-opacity:1"
++ d="M 159.84581,2052.8151 L 159.84581,2255.9606"
++ id="path8510"
++ sodipodi:nodetypes="cc" />
++ <rect
++ y="2133.9568"
++ x="350.94913"
++ height="42.741657"
++ width="539.62024"
++ id="rect9202"
++ style="fill:#ad7fa8;fill-opacity:0.23766815;fill-rule:nonzero;stroke:#5c3566;stroke-width:1.04373991;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
++ <path
++ inkscape:export-ydpi="90"
++ inkscape:export-xdpi="90"
++ inkscape:export-filename="/home/luc/dev/mm/gstreamer-0.10.19.2/docs/manual/simple-player.png"
++ style="fill:#5c3566;fill-opacity:0.75;fill-rule:evenodd;stroke:#5c3566;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;marker-end:none;stroke-miterlimit:4;stroke-dasharray:6, 6;stroke-dashoffset:0;stroke-opacity:1"
++ d="M 355.13679,2052.5477 L 355.13679,2255.6932"
++ id="path10056"
++ sodipodi:nodetypes="cc" />
++ </g>
++ </g>
++</svg>
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/manual/highlevel-components.xml gstreamer-0.10.23/docs/manual/highlevel-components.xml
+--- gstreamer-0.10.23.orig/docs/manual/highlevel-components.xml 2009-01-21 11:11:03.000000000 +0100
++++ gstreamer-0.10.23/docs/manual/highlevel-components.xml 2009-06-11 14:19:59.000000000 +0200
+@@ -175,6 +175,9 @@
+ the commandline, using the command <quote>gst-launch-0.10 playbin
+ uri=file:///path/to/file</quote>.
+ </para>
++ <para>
++ New applications should use playbin2 instead of the old playbin.
++ </para>
+ </sect1>
+
+ <sect1 id="section-components-decodebin">
+@@ -362,8 +365,16 @@
+ </itemizedlist>
+ <para>
+ Decodebin can be easily tested on the commandline, e.g. by using the
+- command <command>gst-launch-0.8 filesrc location=file.ogg ! decodebin
+- ! audioconvert ! alsasink</command>.
++ command <command>gst-launch-0.10 filesrc location=file.ogg ! decodebin
++ ! audioconvert ! audioresample ! autoaudiosink</command>.
++ </para>
++ <para>
++ New applications should use decodebin2 instead of the old decodebin.
++ </para>
++ <para>
++ The uridecodebin element is very similar to decodebin2, only that it
++ automatically plugs a source plugin based on the protocol of the URI
++ given.
+ </para>
+ </sect1>
+
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/manual/outline.txt gstreamer-0.10.23/docs/manual/outline.txt
+--- gstreamer-0.10.23.orig/docs/manual/outline.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/manual/outline.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,92 @@
++Overview
++ Introduction
++ (creating multimedia apps)
++ (pipeline/plugin based)
++
++ Motivation
++ (multitude of duplicate code)
++ (mostly focused on one goal)
++ (reinvent plugin mechanisms)
++ (network transparency?)
++ (catch up with Windows(tm) world)
++
++ Goals
++ (clean and powerfull)
++ (building graphs)
++ (building plugins)
++ (object oriented)
++ (using GTK+ object model)
++ (extensible)
++ (alow binary only plugins)
++ (alow high performance)
++ (HW acceleration)
++ (efficient memory use)
++ (kernel buffers etc..)
++
++Basic concepts
++ elements
++ (what is it)
++ (types) sink, src, filter
++ (have pads)
++ linking elements
++ bin
++ (can contain elements)
++ pipeline (a complete graph)
++ thread (theaded operation)
++ buffers
++ (pass between elements)
++ (contains data)
++ (can cary metadata)
++ (use refcounting)
++ element states
++ (null)
++ (ready)
++ (paused)
++ (playing)
++
++Building apps
++ helloworld
++ (fdsrc->mp3decoder->audiosink)
++ (step by step explanation)
++ More on factories
++ problems with helloworld
++ MIME types
++ GStreamer types
++ Basic types
++ Your second application
++
++
++
++advanced concepts
++ threads
++ queues
++ cothreads
++ dynamic pipeline construction
++ ghost pads
++ type detection
++ utility functions
++
++XML in GStreamer
++ (saving)
++ (loading a pipeline)
++
++Plugin development
++ plugin types
++ chain based
++ loop based
++ buffers
++ metadata
++ subbufers
++ adding pads
++ libraries
++ plugin registry
++ types
++ type detection
++ QoS messages
++ clocks
++
++GStreamer programs
++ editor
++ gstplay
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/manuals.mak gstreamer-0.10.23/docs/manuals.mak
+--- gstreamer-0.10.23.orig/docs/manuals.mak 2009-01-21 11:11:03.000000000 +0100
++++ gstreamer-0.10.23/docs/manuals.mak 2009-06-11 14:19:59.000000000 +0200
+@@ -80,12 +80,12 @@
+
+ # a rule to copy all of the source for docs into $(builddir)/build
+ $(BUILDDIR)/$(MAIN): $(XML) $(CSS) $(EXTRA_SRC)
+- @-mkdir -p $(BUILDDIR)
+- @if test "x$(EXTRA_SRC)" != "x"; then for a in $(EXTRA_SRC); do cp $(srcdir)/$$a $(BUILDDIR); done; fi
+- @for a in $(XML); do cp $(srcdir)/$$a $(BUILDDIR); done
+- @for a in $(CSS); do cp $(srcdir)/$$a $(BUILDDIR); done
+- @cp ../version.entities $(BUILDDIR)
+- @cp $(top_srcdir)/docs/url.entities $(BUILDDIR)
++ @-mkdir -p $(BUILDDIR); \
++ if test "x$(EXTRA_SRC)" != "x"; then for a in $(EXTRA_SRC); do cp $(srcdir)/$$a $(BUILDDIR); done; fi ; \
++ for a in $(XML); do cp $(srcdir)/$$a $(BUILDDIR); done ; \
++ for a in $(CSS); do cp $(srcdir)/$$a $(BUILDDIR); done ; \
++ cp ../version.entities $(BUILDDIR) ; \
++ cp $(top_srcdir)/docs/url.entities $(BUILDDIR)
+
+ # we should switch to xsltproc
+ # docbook2html aka jade can't add the encoding easily to the html meta
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/API gstreamer-0.10.23/docs/random/API
+--- gstreamer-0.10.23.orig/docs/random/API 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/API 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,2 @@
++* signals should use dashes in their names, not underscores, so ::notify
++ works correctly
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/aspectratio gstreamer-0.10.23/docs/random/aspectratio
+--- gstreamer-0.10.23.orig/docs/random/aspectratio 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/aspectratio 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,64 @@
++1) playing DVD on 4:3 screen
++
++PAL DVD:
++ - video size in pixels: 720x576
++ - intended physical aspect ratio: 4/3
++ - pixel aspect ratio: 16/15
++
++normal 4:3 computer screen:
++ - screen size in pixels: 1024x768
++ - physical aspect ratio: 4/3
++ - pixel aspect ratio: 1/1
++
++ -> scale to video size 720 . 16 / 576 . 15 = 11520 / 8640 = 144 / 108
++ = 4 / 3
++
++2) playing PAL DVD on PAL TV
++
++PAL DVD:
++ - video size in pixels: 720x576
++ - pixel aspect ratio: 16/15
++
++ => intended display aspect ratio: 4/3
++
++ w/h = DAR/PAR (with w and h of pixel video size)
++
++DirectFB PAL TV output:
++ - screen size in pixels: 720x576
++ - pixel aspect ratio: 16/15
++
++ => display aspect ratio: 4/3
++
++ (v = video, source material - d = display)
++ DARv = DARd <=> wv / hv * PARv = wd / hd * PARd
++ <=> wd / hd = wv / hv * (PARv / PARd)
++ no scaling necessary
++
++
++4) playing an NTSC vob on PAL TV
++
++NTSC VOB (4/3):
++ - video size: 720x480
++ - pixel aspect ratio: 8/9
++
++ => intended DAR: DAR = 720/480 * 8/9 = 80 / 60 = 4 /3
++
++ wd / hd = wv / hv * PARv / PARd
++ = 720/480 * 8/9 / (16/15)
++ = 720 * 8 * 15 / (480 * 9 * 16)
++ = 120 * 1 * 5 / (80 * 3 * 2)
++ = 15 / 12
++ = 5 / 4
++
++ --> 720 x ( 720 * 4 / 5) = 720 x 576
++
++
++5) other examples
++ - 720 x 480, 32/27 on a square display
++ -> intended DAR: DAR = 720/480 * 32/27 = 80/3 * 1/15 = 16/9
++
++ keeping w constant:
++ 720/h * 1/1 = 16/9 -> h = 720/16 * 9 = 45 * 9 = 405
++
++ keeping h constant:
++ w/480 * 1/1 = 16/9 -> w = 480 * 16 / 9 = 160 / 3 * 16 = 853.33
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/autoplug1 gstreamer-0.10.23/docs/random/autoplug1
+--- gstreamer-0.10.23.orig/docs/random/autoplug1 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/autoplug1 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,206 @@
++COMPLETELY OUTDATED
++-------------------
++
++
++A little explanation of the first autoplugger in GStreamer:
++
++Autoplugging is implemented in the following places:
++
++ gstpipeline.c : construction of the pipeline
++ gstautoplug.c : selection of the elementfactories needed for autoplugging
++
++1) pipeline setup
++-----------------
++
++before any autoplugging will take place, a new GstPipeline has to be created.
++The autoplugger needs to have a src element and one or more sink elements. the
++autoplugger will try to find the elements needed to connect the src element
++to the sinks.
++
++using:
++
++ gst_pipeline_add_src (GstPipeline *pipeline, GstElement *element);
++
++a source element is added to the pipeline. only one src element can be added
++for now.
++
++using:
++
++ gst_pipeline_add_sink (GstPipeline *pipeline, GstElement *element);
++
++a sink element can be added to the pipeline.
++
++2) starting autoplug
++--------------------
++
++when the pipeline has been set up as above, you will call
++
++ gst_pipeline_autoplug (GstPipeline *pipeline);
++
++to start the autoplugger. this will be done in four phases
++
++ex. we are going to autoplug an mpeg1 system stream.
++
++2a) phase1: figure out the type (GstCaps) of the src element.
++-------------------------------------------------------------
++
++the gsttypefind element is connected to the "src" pad of the source
++element. gst_bin_iterate is called in a loop until gsttypefind
++signals "have_type". the gst_bin_iterate is stopped and the GstCaps
++is retrieved from the gsttypefind element.
++
++gsttypefind is disconnected from the src element and removed from the
++bin.
++
++the GstCaps of the source element is called src_caps later on.
++
++ex. all typefind functions are tried and the one in mpeg1types will
++ return a GstCaps:
++
++ video/mpeg,
++ "systemstream", GST_PROPS_BOOLEAN (TRUE),
++ "mpegversion", GST_PROPS_INT (1),
++ NULL
++
++
++2b) phase2: create lists of factories.
++---------------------------------------
++
++for each sink:
++{
++ sinkpad = take the first sinkpad of the sink (HACK)
++ call
++
++ list[i] = gst_autoplug_caps (src_caps, sinkpad->caps);
++
++ I++;
++}
++
++gst_autoplug_caps will figure out (based on the padtemplates)
++which elementfactories are needed to connect src_caps to sinkpad->caps
++and will return them in a list.
++
++ex. we have two sinks with following caps:
++
++ video/raw audio/raw
++ "...." "...."
++
++ gst_autoplug_caps will figure out that for the first sink the following
++ elements are needed:
++
++ mpeg1parse, mp1videoparse, mpeg_play
++
++ for the second sink the following is needed:
++
++ mpeg1parse, mp3parse, mpg123
++
++ We now have two lists of elementfactories.
++
++2c) phase3: collect common elements from the lists.
++---------------------------------------------------
++
++the rationale is that from the lists we have created in phase2, there
++must be some element that is a splitter and that it has to come first (HACK)
++We try to find that element by comparing the lists until an element differs.
++
++we add the common elements to the bin and run gst_pipeline_pads_autoplug. this
++function will loop over the pads of the previous element and the one we
++just added, and tries to connect src to sink if possible.
++
++If a connection between the two elements could not be made, a signal "new_pad"
++is connected to the element so that pad connection can occur later on when
++the pad is actually created.
++
++ex. when we compare the two lists we see that we have common element: mpeg1parse.
++
++ we add this element to the bin and try to connect it to the previous element in
++ the bin, the disksrc.
++
++ we see that the src pad of the disksrc and the sinkpad of the mpeg1parse element
++ can be connected because they are compatible. We have a pipeline like:
++
++ ---------) (--------
++ disksrc ! ! mpeg1parse
++ src --- sink
++ ---------) (--------
++
++
++2d) phase4: add remaining elements
++----------------------------------
++
++now we loop over all the list and try to add the remaining elements
++
++(HACK) we always use a new thread for the elements when there is a common
++element found.
++
++if a new thread is needed (either bacuase the previous element is a common
++element or the object flag of the next element is set to GST_SUGGEST_THREAD)
++we add a queue to the bin and we add a new thread. We add the elements to
++the bin and connect them using gst_pipeline_pads_autoplug.
++
++If we add a queue, we have to copy the caps of the sink element of the queue
++to the src pad of the queue (else they won't connect)
++
++we finally arrive at the sink element and we're done.
++
++ex.
++
++ we have just found our mpeg1parse common element, so we start a thread.
++ We add a queue to the bin and a new thread, we add the elements
++ mp1videoparse and mpeg_play to the thread. We arrive at the videosink, we
++ see that the SUGGEST_THREAD flag is set, we add a queue and a thread and
++ add the videosink in the thread.
++
++ the same procedure happens for the audio part. We are now left with the
++ following pipeline:
++
++ We will also have set a signal "new_pad" on the mpeg1parse element bacause
++ the element mp1videoparse could not be connected to the element just yet.
++
++ (------------------------------------) (----------
++ !thread ! ! thread
++ ! (-------------) (---------) ! ! (---------)
++ ! !mp1videoparse! !mpeg_play! ! ! !videosink!
++ videoqueue--sink src -- sink src -- queue --- sink !
++ ---------) (-----------) ! (-------------) (---------) ! ! (---------)
++ disksrc ! ! mpeg1parse! (------------------------------------) (-------------
++ src --- sink !
++ ---------) (-----------)
++ queue----- same for audio
++
++
++ then we play, create_plan happens, data is flowing and the "new_pad" signal is called
++ from mpeg1parse, gst_pipeline_pad_autoplug is called and the connection between
++ mpeg1parse and the videoqueue is made. same for audio.
++
++ voila. smame procedure for mp3/vorbis/avi/qt/mpeg2 etc...
++
++
++Problems:
++---------
++
++this is obviously a very naive solution. the creation of the elements actually happens
++beforehand. MPEG2, for one, fails bacause there are multiple possibilities to go
++from the mpeg demuxer to audio/raw (ac3, mp3)
++
++Also any intermedia elements like mixers (subtitles) are not possible because we
++assume that after the common elements, the streams to not converge anymore.
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/autoplug2 gstreamer-0.10.23/docs/random/autoplug2
+--- gstreamer-0.10.23.orig/docs/random/autoplug2 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/autoplug2 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,289 @@
++
++1) The Autoplugger API
++----------------------
++
++We'll first describe how to use the autoplugger. We will provide
++a use case: autoplug an mpeg1 system stream for audio/video playback.
++
++
++a) creating an autoplugger
++--------------------------
++
++Before any autoplugging can be done, you'll have to create an
++autoplugger object. Autoplugger objects (autopluggers) are
++provided by plugins and are created with gst_autoplugfactor_make().
++
++GStreamer has provisions for two types of autopluggers:
++
++ - regular autopluggers, which act as a complex element construction
++ mechanism. They usually don't create threads and operate solely on
++ GstCaps* for the source and destination. The complex elements
++ created by regular autopluggers have src and sink pad compatible
++ with the requested GstCaps*.
++
++ - renderer autopluggers, which are designed to create a complex
++ object that can be used to playback media. Renderer autoplugged
++ complex elements have no src pads, only one sink pad.
++
++We'll create a renderer autoplugger like this:
++
++!
++! GstAutoplug *autoplug;
++!
++! autoplug = gst_autoplugfactory_make ("staticrender");
++!
++
++
++b) finding out the source media type.
++-------------------------------------
++
++Before we can start the autoplugger, we have to find out the
++source media type. This can be done using the typefind functions
++provided by various plugins.
++
++We will create a little pipeline to detect the media type by connecting
++a disksrc element to a typefind element. The typefind element will
++repeadedly call all registered typefind functions with the buffer it
++receives on its sink pad. when a typefind function returns a non NULL
++GstCaps*, that caps is set to the sink pad of the typefind element and
++a signal is emitted to notify the app.
++
++Due to caps negotiation, the disksrc will have the detected GstCaps*
++set on its src pad.
++
++We typically use a function like below to detect the type of a media stream
++on an element (typically a disksrc). The function accepts a pipeline and the
++element inside the pipeline on which the typefind should be performed (passing
++a GstPad* is probably a better option FIXME).
++
++!
++! static GstCaps*
++! gst_play_typefind (GstBin *bin, GstElement *element)
++! {
++! GstElement *typefind;
++! GstCaps *caps = NULL;
++!
++! typefind = gst_elementfactory_make ("typefind", "typefind");
++! g_return_val_if_fail (typefind != NULL, FALSE);
++!
++! gst_pad_connect (gst_element_get_pad (element, "src"),
++! gst_element_get_pad (typefind, "sink"));
++!
++! gst_bin_add (bin, typefind);
++!
++! gst_element_set_state (GST_ELEMENT (bin), GST_STATE_PLAYING);
++!
++! // push a buffer... the have_type signal handler will set the found flag
++! gst_bin_iterate (bin);
++!
++! gst_element_set_state (GST_ELEMENT (bin), GST_STATE_NULL);
++!
++! caps = gst_pad_get_caps (gst_element_get_pad (element, "src"));
++!
++! gst_pad_disconnect (gst_element_get_pad (element, "src"),
++! gst_element_get_pad (typefind, "sink"));
++! gst_bin_remove (bin, typefind);
++! gst_object_unref (GST_OBJECT (typefind));
++!
++! return caps;
++! }
++!
++
++Also note that the disksrc was added to the pipeline before calling this
++typefind function.
++
++When the function returns a non-NULL pointer, the media type has been
++determined and autoplugging can commence.
++
++Assume that in our mpeg1 use case the above function returns a GstCaps*
++like:
++
++!
++! srccaps = GST_CAPS_NEW ("mpeg1system_typefind",
++! "video/mpeg",
++! "mpegversion", GST_PROPS_INT (1),
++! "systemstream", GST_PROPS_BOOLEAN (TRUE)
++! );
++!
++
++
++c) Performing the autoplugging
++------------------------------
++
++Since we use the renderer API, we have to create the output elements
++that are going to be used as the final sink elements.
++
++!
++! osssink = gst_elementfactory_make("osssink", "play_audio");
++! videosink = gst_elementfactory_make("xvideosink", "play_video");
++!
++
++We then create a complex element using the following code.
++
++!
++! new_element = gst_autoplug_to_renderers (autoplug,
++! srccaps,
++! videosink,
++! osssink,
++! NULL);
++!
++! if (!new_element) {
++! g_print ("could not autoplug, no suitable codecs found...\n");
++! exit (-1);
++! }
++!
++
++2) Autoplugging internals
++-------------------------
++
++We will now describe the internals of the above gst_autoplug_to_renderers()
++function call. This code is implemented in a plugin found in:
++
++ gst/autoplug/gststaticautoplugrender.c
++
++
++
++a) phase1: create lists of factories.
++---------------------------------------
++
++The autoplugger will start with executing the following piece of
++code:
++
++!
++! i = 0;
++!
++! for each sink:
++! {
++! sinkpad = take the first sinkpad of the sink (HACK)
++!
++! list[i] = gst_autoplug_caps (srccaps, sinkpad->caps);
++!
++! i++;
++! }
++!
++
++gst_autoplug_caps will figure out (based on the padtemplates)
++which elementfactories are needed to connect srccaps to sinkpad->caps
++and will return them in a list.
++
++The element list is created by using a modified shortest path algorithm
++by Dijkstra (http://www.orie.cornell.edu/~or115/handouts/handout3/handout3.html).
++The nodes of the graph are the elementfactories and the weight of the
++arcs is based on the pad compatibility of the padtemplates of the
++elementfactory. For incompatible elementfactories, we use a weight of
++MAX_COST (999999) and for compatible padtemplates we use 1.
++
++ex. we have two sinks with following caps:
++
++!
++! video/raw audio/raw
++! "...." "...."
++!
++
++gst_autoplug_caps will figure out that for the first sink the following
++elements are needed:
++
++!
++! mpeg1parse, mp1videoparse, mpeg_play
++!
++
++for the second sink the following is needed:
++
++!
++! mpeg1parse, mad
++!
++
++Note that for the audio connection the element list "mpeg1parse, mp3parse,
++mpg123" would also connect the srccaps to the audiosink caps. Since the
++"mpeg1parse, mad" list is shorter, it it always prefered by the autoplugger.
++
++We now have two lists of elementfactories.
++
++
++b) phase2: collect common elements from the lists and add them to a bin.
++------------------------------------------------------------------------
++
++The rationale is that from the lists we have created in phase1, there
++must be some element that is a splitter and that it has to come first (HACK)
++We try to find that element by comparing the lists until an element differs.
++
++We start by creating a toplevel bin that is going to be our complex element.
++
++In our use-case we find that mpeg1parse is an element common to both lists,
++so we add it to the bin. We then try to find a good ghostpad for the resulting
++complex element. This is done by looping over the sink pads of the first common
++element and taking the pad that is compatible with the srcaps.
++
++We end up with a bin like this:
++!
++! (----------------------)
++! ! autoplug_bin !
++! ! !
++! ! (------------) !
++! ! ! mpeg1parse ! !
++! ! - sink ! !
++! ! / (------------) !
++! sink !
++! (----------------------)
++!
++
++
++c) phase3: add remaining elements
++---------------------------------
++
++now we loop over all the list and try to add the remaining elements
++
++(HACK) we always use a new thread for the elements when there is a common
++element found.
++
++if a new thread is needed (either becuase the previous element is a common
++element or the object flag of the next element is set to GST_SUGGEST_THREAD)
++we add a queue to the bin and we add a new thread. We add the elements to
++the bin and connect them using gst_pipeline_pads_autoplug.
++
++we finally arrive at the sink element and we're done.
++
++ex.
++
++ we have just found our mpeg1parse common element, so we start a thread.
++ We add a queue to the bin and a new thread, we add the elements
++ mp1videoparse and mpeg_play to the thread. We arrive at the videosink, we
++ see that the SUGGEST_THREAD flag is set, we add a queue and a thread and
++ add the videosink in the thread.
++
++ the same procedure happens for the audio part. We are now left with the
++ following pipeline:
++
++ We will also have set a signal "new_pad" on the mpeg1parse element because
++ the element mp1videoparse could not be connected to the element just yet.
++
++ (---------------------------------------------------------------------------------------------)
++ !autoplug_bin !
++ ! !
++ ! (----------------------------------------) (------------) !
++ ! !thread ! ! thread ! !
++ ! (-----) ! (-------------) (---------) (-----) ! ! (---------)! !
++ ! !queue! ! !mp1videoparse! !mpeg_play! !queue! ! ! !videosink!! !
++ ! sink src-sink src-sink src-sink src-sink !! !
++ ! (-----------) (-----) ! (-------------) (---------) (-----) ! ! (---------)! !
++ ! ! mpeg1parse! (----------------------------------------) (------------) !
++ ! - sink ! !
++ ! / (-----------) !
++ sink (----------------------------------------) (------------) !
++ ! !thread ! ! thread ! !
++ ! (-----) ! (-------------) (-----) ! ! (---------)! !
++ ! !queue! ! !mad ! !queue! ! ! !videosink!! !
++ ! sink src-sink src ------------ sink src-sink !! !
++ ! (-----) ! (-------------) (-----) ! ! (---------)! !
++ ! (----------------------------------------) (------------) !
++ (---------------------------------------------------------------------------------------------)
++
++ The autoplugger will return the autoplug_bin. the app will then connect the
++ disksrc to the sinkpad of the autoplugged bin.
++
++ Then we play, create_plan happens, data is flowing and the "new_pad" signal is called
++ from mpeg1parse, gst_pipeline_pad_autoplug is called and the connection between
++ mpeg1parse and the videoqueue is made. same for audio.
++
++ Et voila. same procedure for mp3/vorbis/avi/qt/mpeg2 etc...
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/autotools gstreamer-0.10.23/docs/random/autotools
+--- gstreamer-0.10.23.orig/docs/random/autotools 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/autotools 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,61 @@
++These are some notes on our autotools setup, and some things to remember.
++
++plugin Makefile.am:
++- plugindir gets defined for you, don't set it in Makefile.am
++- plugin_LTLIBRARIES should contain the name of every plugin,
++ starting with libgst and ending in .la
++
++- put compile/link variables in the following order: CFLAGS, LIBADD, LDFLAGS
++- order _CFLAGS and _LIBADD with the highest in the stack first;
++ e.g. $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) $(MUSICBRAINZ_LIBS)
++ this makes sure that the one you're most likely to be hacking on
++ (GStreamer) has its -L flags pointing to your hacking directory,
++ and comes first on the link line. If it were to come later and you
++ had the library installed in the same place as the dependency, it
++ would take that version instead
++- DO NOT put any libraries in _LDFLAGS. Typically, _LDFLAGS should only
++ have $(GST_PLUGIN_LDFLAGS)
++- when using gst-plugins-base libraries, use $(GST_PLUGINS_BASE_LIBS) then
++ add -lgst(library)-$(GST_MAJORMINOR). Example:
++
++libgstsdlvideosink_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \
++ -lgstvideo-$(GST_MAJORMINOR) \
++ -lgstaudio-$(GST_MAJORMINOR) \
++ -lgstinterfaces-$(GST_MAJORMINOR) \
++ $(SDL_LIBS)
++
++
++- don't forget to use noinst_HEADERS if you have private headers
++
++plugin configure.ac snippet:
++ - ORDER THEM ALPHABETICALLY PLEASE
++ - wrap your check in a block like this:
++
++translit(dnm, m, l) AM_CONDITIONAL(USE_DEP, true)
++ GST_CHECK_FEATURE(DEP, [(dependency description)], (plug-in-name), [
++ (here go the checks)
++])
++ - plug-in name is the name of the *plug-in*, not the element; ie, the
++ first column when running gst-inspect
++
++ - For the checks, in the simplest case, use something like:
++ GST_PKG_CHECK_MODULES(LIBOIL, liboil-0.3 >= 0.3.2)
++ This will:
++ - do the check
++ - show a decent message if it can't find it, without failing
++ - set HAVE_LIBOIL to yes or no
++ - set LIBOIL_CFLAGS and LBOIL_LIBS
++ - if you want to make sure configure fails when this dependency is missing,
++ use:
++ GST_PKG_CHECK_MODULES(LIBOIL, liboil-0.3 >= 0.3.2, yes)
++
++ - if your library does not come with a .pc file, you have to roll your own
++ check
++
++pkg.m4: (last checked: version 0.20)
++ - was changed at some point to hide the error message from you, and error
++ out by default if no ACTION-IF-NOT-FOUND is given.
++ - caller is responsible for doing AC_MSG_RESULT if ACTION-IF-NOT-FOUND
++ is given
++ - for automake-1.6, AC_SUBST((PKG)_CFLAGS) and AC_SUBST((PKG)_LIBS) is not
++ done automatically. Starting from 1.7, it is. We require 1.7 now.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/bbb/optional-properties gstreamer-0.10.23/docs/random/bbb/optional-properties
+--- gstreamer-0.10.23.orig/docs/random/bbb/optional-properties 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/bbb/optional-properties 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,76 @@
++Optional properties in caps:
++
++During the 0.8 series of GStreamer, we regularly felt the need to add
++properties to caps, thereby sometimes breaking specific caps negotiation
++cases or annoying developers. This document outlines problems it could
++lead to and tries to explain in which cases properties can be added and
++when they can't. It also explains when properties can be optional (both
++temporarily and permanently) and when they cannot.
++
++--
++
++There's two cases where optional properties could be added:
++1) to fix an issue that makes any case fail
++2) to fix an issue that makes some cases fail
++
++Case 1 can be compared to not providing extra_data in caps for WMA. The caps
++are defined, but it will never work because you cannot decode WMA audio
++without the sequence header. In this case, adding the property breaks
++caps compatibility, but it is still allowed because there is no regression
++and it fixes a bug. No optional property should be added here, it should be
++made a required property directly. Another example here is channel-positions
++for channels>2.
++
++Case 2 is more complex. There's various subcases:
++a] not providing this property means ANY (or don't care, or unknown, each
++ of which is another way of saying ANY)
++b] not providing this property means a specific value
++ .] adding this property will lead to unwanted behaviour
++ .] adding this property will not lead to unwanted behaviour
++
++An example case for 2a is the buffer-frames property in float audio or the
++frames property in MPEG audio. Buffer-frames is 0 (which should be removed)
++means ANY. The reason that it should not be zero is because connecting an
++element with buffer-frames=SOME_VALUE should be allowed to connect to any
++element out there that has no buffer-frames requirement. The opposite is
++true reversely: an element with no buffer-frames property should never be
++allowed to connect to any element requesting a specific buffer-frames value.
++For MPEG audio, it is TRUE likewise. Mathematically, buffer-frames=0 does not
++exist. It implies ANY. Similarly, framed=FALSE cannot exist, because it
++implies framed={FALSE,TRUE} (in words: an element cannot require non-framed
++MPEG audio, because framed MPEG audio is a subset of non-framed MPEG audio
++and thus valid input). In all those cases for 2a, optional properties are
++fine. Subtraction will not work, but as explained, values are subsets of
++another value and thus subtraction is irrelevant (because the mathematical
++value of the subtraction has no real value).
++This same principle is true for rate/channels on (for example) MPEG audio.
++Our caps negotiation already allows for all of this, and optional properties
++are already being used for this.
++
++2b is complex, since subtraction actually has a value here, and addition
++of such properties may lead to regressions or crashes. Let's give another
++two examples: stride (for raw video; not providing this value implies 4-byte
++aligned video) and pixel-aspect-ratio (default value being 1/1). Adding p-a-r
++was in this case an example of 2bII, whereas stride is 2bI. The reason for
++this is simple: adding pixel-aspect-ratio to some element and not to others
++could lead to misunderstanding size. However, this is not a regression,
++because not adding it alltogether would lead to the same misunderstanding.
++In both cases, the result would be wrongly sized video. Therefore, there
++is no regression and there is a bugfix, so this is fine. Obviously, the
++optional property is in this case very specifically a temporary solution.
++As soon as we can, this property should become obligatory.
++Stride is different, because elements have implicit associated behaviour
++based on the previous beahviour. This hebaviour could break if some elements
++do implement stride and others still don't. Therefore, adding an optional
++property as a temporary hack is, in this case, not a good idea and should
++be disallowed. A proper fix should be done in the same timeframe as 2bII. In
++this case, optional properties should not be added. Another example of this
++case was adding channel-positions to audio caps with channels=1,2, which
++was rejected for the same reason: it would break a perfectly-working set
++of rules in a stable series.
++
++--
++
++Obviously, with all of the above, people will start fighting about which
++group their specific properties change belongs to. General consensus is
++the only way to get around that problem. Long live politics.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/bbb/streamselection gstreamer-0.10.23/docs/random/bbb/streamselection
+--- gstreamer-0.10.23.orig/docs/random/bbb/streamselection 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/bbb/streamselection 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,85 @@
++Stream selection
++=
++
++1. Problem
++URIs (that being either a media stream or a media stream plus subtitle) can
++contain multiple streams of a type (audio, subtitle). A user has to be given
++the option of selecting one of those streams (or none alltogether).
++
++2. Implementation ideas
++Stream selection, in GStreamer, has to be integrated at the player plugging
++level, which is (in the case of Totem) playbin. Playbin offers a feature to
++'mute' a stream (which means that no processing is done on that stream
++alltogether, saving the decoding step). Currently, playbin will select the
++first occurrence of a stream type and mute all others. A queue is connected
++(for pre-roll) to the active stream. What is missing here is a way to change
++the active stream.
++Playbin interface - one possible interface could simply consist of a bunch of
++GObject properties: 'textstream' and 'audiostream', both integer. The number
++of available streams can be retrieved using the 'stream-info' GObject property.
++Similar to the 'nstreams' property, we could add utility GObject properties
++for getting the number of available audio/text streams ('naudiostreams' and
++'ntextstreams'). Names of these streams (like language name or so) can be
++added as an additional GObject property to streaminfo. Some container
++formats contain such names internally. Alternatively, we could allow those
++to be user-settable as well (for .sub files).
++On a set of either of these properties, playbasebin would mute the old
++selected stream (if any), unmute the newly selected stream (if any) and
++replug the preroll queue. The queue itself is disabled as well if no new
++stream was linked. Alternatively, a switch-like element is used, which
++requires no replugging. Pad disabling/enabling is then enough. This also
++makes relinking less painful. The switch-like element needs to proxy the
++active pads' caps. However, since those caps are (in practice) always the
++same accross streams, caps setting will (inside the core) immediately
++return success.
++The switch-like element simply works like this:
++=
++static void
++loop_func (GstElement * element)
++{
++ GList *inpads;
++ GstPad *pad;
++ GstData *data;
++
++ for (inpads = ..; inpads != NULL; inpads = inpads->next) {
++ pad = inpads->data;
++ if (!GST_PAD_IS_USABLE (pad))
++ continue;
++
++ /* you'd also want some way to synchronize the inputs... */
++ data = gst_pad_pull (pad);
++ if (is_active_pad (pad))
++ gst_pad_push (srcpad, data);
++ else
++ gst_data_unref (data);
++ }
++}
++=
++It'd require an active-stream property itself, which (when set) takes
++care of doing renegotiation and so on. Using internal pad linkage is
++extremely useful here, and requires little code in the switch-like
++element itself. Note that there is a slight bit of duplication in the
++playbin interface and the switch-like element interface, but that's "just
++the way it is".
++The implemention of the switch-like element could initially be local to
++playbin, until it has been cleaned up and confirmed to be useful to a
++wider audience. This allows a lot of experimenting with interfaces because
++we won't be forced to maintain a stable interface.
++The current 'switch' element (gst-plugins/gst/switch/) already does a few
++of those operations, but stream synchronization, re-negotiation on stream
++changes, internal pad linkage and some other things are completely missing.
++If we're gonna use this element, it'll need a large overhaul. The choice of
++writing a new element or using an existing element as basis, and also the
++choice of whether or not to make this element local to playbin, should be
++based on technical merits and cost/effect analysis and not on personal
++pride.
++
++Notes:
++* seamless has the same switch-like element, but it's chain-based. Apart
++from scheduler considerations, this is a good idea, but limits its use
++(making either good docs and abuse-prevention [see multifilesrc] or
++private-to-playbin a prerequisite).
++* maybe text-* properties need to be renamed to subtitle-*.
++
++3. Written by
++Ronald S. Bultje <rbultje@ronald.bitfreak.net> - Jan. 2nd, 2005.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/bbb/subtitles gstreamer-0.10.23/docs/random/bbb/subtitles
+--- gstreamer-0.10.23.orig/docs/random/bbb/subtitles 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/bbb/subtitles 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,105 @@
++Subtitles
++=========
++
++1. Problem
++GStreamer currently does not support subtitles.
++
++2. Proposed solution
++ - Elements
++ - Text-overlay
++ - Autoplugging
++ - Scheduling
++ - Stream selection
++
++The first thing we'll need is subtitle awareness. I'll focus on AVI/MKV/OGM
++here, because I know how that works. The same methods apply to DVD subtitles
++as well. The matroska demuxer (and Ogg) will need subtitle awareness. For
++AVI, this is not needed. Secondly, we'll need subtitle stream parsers (for
++all popular subtitle formats), that can deal both with parsed streams (MKV,
++OGM) as well as .sub file chunks (AVI). Sample code is available in
++gst-sandbox/textoverlay/.
++
++Secondly, we'll need a textoverlay filter that can take text and video and
++blits text on video. We have several such elements (e.g. the cairo-based
++element) in gst-plugins already. Those might need some updates to work
++exactly as expected.
++
++Thirdly, playbin will need to handle all that. We expect subtitle streams
++to end up as subimages or plain text (or xhtml text). Note that playbin
++should also allow access to the unblitted subtitle as text (if available)
++for accessibility purposes.
++
++A problem popping up is that subtitles are no continuous streams. This is
++especially noticeable in the MKV/OGM case, because there the input of data
++depends on the other streams, so we'll only notice delays inside an element
++when we've received the next data chunk. There are two possible solutions:
++using timestamped filler events or using decoupled subtitle overlay elements
++(bins, probably). The first has as a difficulty that it only works well in
++the AVI/.sub case, where we will notice discontinuities before they become
++problematic. The second is more difficult to implement, but works for both
++cases.
++A) fillers
++Imagine that two subtitles come after each other, with 10 seconds of no-data
++in between. By parsing a .sub file, we would notice immediately and we could
++send a filler event (or empty data) with a timestamp and duration in between.
++B) decoupled
++Imagine this text element:
++------------------------------
++video ----- | actual element |out
++| / -----------------|
++text - - |
++------------------------------
++where the text pad is decoupled, like a queue. When no text data is available,
++the pad will have received no data, and the element will render no subtitles.
++The actual element can be a bin here, containing another subtitle rendering
++element. Disadvantage: it requires threading, and the element itself is (in
++concept) kinda gross. The element can be embedded in playbin to hide this
++fact (i.e. not be available outside the scope of playbin).
++Whichever solution we take, it'll require effort from the implementer.
++Scheduling (process, not implementation) knowledge is assumed.
++
++Stream selection is a problem that audio has, too. We'll need a solution for
++this at the playback bin level, e.g. playbin. By muting all unused streams
++and dynamically unmuting the selected stream, this is easily solved. Note
++that synchronization needs to be checked in this case. The solution is not
++hard, but someone has to do it.
++
++3. Written by
++Ronald S. Bultje <rbultje@ronald.bitfreak.net>, Dec. 25th, 2004
++
++
++Appendix A: random IRC addition
++<Company> intersting question: would it be a good idea to have a "max-buffer-length" property?
++<Company> that way demuxewrs would now how often they'd need to generate filler events
++<Company> s/now/know/
++<BBB> hm...
++<BBB> I don't think it's good to make that variable
++<Company> dunno
++<Company> (i'm btw always looking at this from the midi perspective, too)
++<Company> (because both subtitles and midi are basically the same in this regard)
++<BBB> and do you mean 'after the stream has advanced <time> and we didn't read a new subtitle in this mkv stream, we should send a filler'?
++<Company> yeah
++<BBB> it goes for avi with large init_delay values, too
++<Company> so you don't need to send fillers every frame
++<BBB> right
++<BBB> cant' we just set that to, for example, 1s?
++<BBB> it's fairly random, but still
++<Company> that's another option, too
++<Company> though you could write all file parsers with max-delay=MAXINT
++<Company> would make them a lot easier
++<BBB> it's true that queue size, for example, depends on this value
++<BBB> e.g. if you make this 5s and set queue size to 1s, it'll hang
++<Company> right
++<BBB> whereas if you set it to 1s and queue size to 5s, you waste space
++<BBB> :)
++<BBB> you ought to set it to max-delay * (n_streams + 1)
++<BBB> or so
++<BBB> or -1
++<BBB> I forgot
++<BBB> ohwell
++<Company> if you'd use filtercaps and queue sizes in your app, you could at least work around deadlocks
++<BBB> yeah
++<Company> though ideally it should just work of course...
++<BBB> good point...
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/buffers gstreamer-0.10.23/docs/random/buffers
+--- gstreamer-0.10.23.orig/docs/random/buffers 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/buffers 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,19 @@
++METADATA ON BUFFERS IS OUTDATED
++-------------------------------
++
++
++Buffer mutability properties are the most important part of gst, and
++similarly are the most complex.
++
++The simple case is that a buffer is created, memory allocated, data put
++in it, and passed to the next filter. That filter reads the data, does
++something (like creating a new buffer and decoding into it), and
++unreferences the buffer. This causes the data to be freed and the buffer
++to be destroyed.
++
++A more complex case is when the filter modifies the data in place. It
++does so and simply passes on the buffer to the next element. This is just
++as easy to deal with.
++
++If the second filter adds metadata to the buffer, it just has to add the
++pointer to the list. The next element simply traverses the list and
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/caps gstreamer-0.10.23/docs/random/caps
+--- gstreamer-0.10.23.orig/docs/random/caps 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/caps 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,209 @@
++SOME OF THE FIRST IDEAS, PRETTY OUTDATED
++----------------------------------------
++
++
++During the course of a discussion on IRC, it turned out
++that there are many possible ways to handle the capabilities.
++
++A capability is basically a set of properties attached to a
++mimetype in order to more closely describe the mimetype.
++Capabilities are supposed to be attached to pads so that the
++autoplugging algorithm has more specific information to connect
++compatible pads.
++
++We present 3 possible implementation for the capabilities. we need
++to pick one of them.
++
++1. static capabilities
++----------------------
++
++When an element is created, it creates its pads like:
++
++ mpg123->sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
++ gst_element_add_pad (GST_ELEMENT (mpg123), mpg123->sinkpad);
++
++ mpg123->srcpad = gst_pad_new ("src", GST_PAD_SRC);
++ gst_element_add_pad (GST_ELEMENT (mpg123), mpg123->srcpad);
++
++In the static capabilities case, it will attach a GstCaps* structure
++to the pad. The GstCaps structure in the above example might look like:
++
++ static GstCapsFactory mpg123_sink_caps = {
++ "audio/mp3",
++ "layer", GST_CAPS_INT_RANGE (1, 3),
++ "bitrate", GST_CAPS_INT_RANGE (8, 320),
++ NULL
++ };
++
++with
++
++mpg123sinkcaps = gst_caps_register (mpg123_sink_caps);
++
++the factory can be converted into a GstCaps* structure. The
++GstCaps* structure is attached to the pad with:
++
++gst_pad_add_caps (mpg123->sinkpad, mpg123sinkcaps);
++
++The GstElement would then have a sinkpad with the given
++mimetype (audio/mp3) and with the capabilitities of accepting
++mpeg layer 1 to 3 and a bitrate from 8 up to 320 Kbps.
++
++Likewise, the src pad could be set up in the same way. An
++example capability factory could look like:
++
++ static GstCapsFactory mpg123_src_caps = {
++ "audio/raw",
++ "format", GST_CAPS_BITFIELD (...),
++ "depth", GST_CAPS_INT (16),
++ "rate", GST_CAPS_INT_RANGE (4000, 96000),
++ "channels", GST_CAPS_INT_RANGE (1, 2),
++ NULL
++ };
++
++All GstElements would present their pads with the appropriate
++capabilities structure.
++
++The autoplugger would then proceed (once the source media type
++is known with a typefind function) in finding all the elements
++with compatible pads and connecting them into a pipeline.
++
++All elements of the complete pipeline could then be constructed
++with one single pass. No new elements should be added to the
++pipeline because we can figure out all the possibilities using the
++pad capabilities.
++
++We call this the static case because the capabilities of the pads
++are supposed to stay the same after creating the element.
++
++While the ability to completly setup the pipeline before actually
++starting playback is an advantage regarding performance, one obvious
++problem with this setup is that the static case may be too static in
++some cases. We can illustrate this with the following setup:
++
++ ----------) (------------
++ mpg123 ! ! audiosink
++ src sink
++ ! !
++ ----------) (------------
++
++The mpg123 element has its src capabilities set up as mpg123_src_caps
++in the above example.
++
++The audio renderer has its capabilities set up with the following
++factory:
++
++ static GstCapsFactory audio_sink_caps = {
++ "audio/raw",
++ "format", GST_CAPS_BITFIELD (...),
++ "depth", GST_CAPS_INT (16),
++ "rate", GST_CAPS_INT_RANGE (22000, 44000),
++ "channels", GST_CAPS_INT_RANGE (1, 2),
++ NULL
++ };
++
++The static autoplugger has to be carefull when connecting the mpg123
++element with the audiosink because it is theoretically possible that
++the mpg123 element outputs raw audio with a rate that cannot be
++handled by the audiosink (ex. 4000KHz). In the absense of another
++audiosink with more capabilities, the autoplugging of this simple
++pipeline will not be possible and would fail.
++
++the autoplugging algorithm would probably select another element to
++insert between the mpg123 element and the audiosink in order to handle
++the (uncommon) case of a rate conversion (audioscaler).
++
++It is clear that this static setup might even fail or work suboptimal
++for even the common case and should therefore be considered as too
++restrictive.
++
++
++2. dynamic capabilities
++-----------------------
++
++The idea of dynamic capabilities is that the capabilities are not set
++at element create time but rather while the pipeline is running.
++
++An element would still list its mime type using:
++
++ gst_pad_add_type_id(mpg123->sinkpad, mp3type);
++
++The idea would then be that a rough draft of the pipeline would be
++built afer the media type of the stream has been detected with the
++typefind functions. The rough draft would consist of laying out a
++global plan to reach the renderer(s). this plan would basically list
++the set of conversions that have to be performed. (mime-type to
++mime-type conversion).
++
++Elements that accept the src mime-type are tried by giving it a buffer.
++If the element accepts the buffer, it will set its capabilities for
++both the sink pad and the src pad. At that time other elements can be
++tried and added to the src pad, until we reach the renderer. As usual
++one has to be carefull to add just the minimum amount of elements to
++reach the renderer. The global plan will help with that.
++
++Since we basically do not use the capabilities of the sink pad one has
++to question the need for sink pad capabilities in the first place.
++
++We might also have a hard time trying different elements until we find
++a compatible one that does not cause a dead end at some point.
++
++
++3. combined setup
++-----------------
++
++This combined setup will minimise the effort needed to try different
++elements encountered by option 2 while still allowing a more dynamic
++setup based on the actual media stream we are handling.
++
++The combined setup will list/add the sink capabilities at create time.
++It will only set the mime-type of its src pads.
++
++As with option2, a global plan will be built. At runtime the src pads
++will actually specify the capabilities they need for any element that
++wants to be connected to its source pads.
++
++In this case we specifiy the capabilities for all the sink pads of an
++element at create time. The capabilities of the src pads would only
++become available when data has been processed by the element.
++
++The autoplugger would then be able to choose an element that can handle
++the capability listed by the src pad.
++
++in our previous example:
++
++ ----------) (------------
++ mpg123 ! ! audiosink
++ src sink
++ ! !
++ ----------) (------------
++
++the audiosink element would specify its sink pad capabilities at create
++time, while the mpg123 elements src pad would not yet have any capabilities
++set.
++
++When data is handled by the mpg123 element, a capability would be added to
++the mpg123 src pad. This capability might be:
++
++ static GstCapsFactory mpg123_src_caps = {
++ "audio/raw",
++ "format", GST_CAPS_INT (S16),
++ "depth", GST_CAPS_INT (16),
++ "rate", GST_CAPS_INT (44000),
++ "channels", GST_CAPS_INT (2),
++ NULL
++ };
++
++This capability would be compatible with the audiosinks sinkpad capabilities
++and the autoplugger would therefore be able to connect the two elements.
++
++While allowing a more flexible setup with option3, compared to option1, we
++introduce a slightly higher overhead when we need to dynamically connect
++elements. This overhead will not be as big as option2 because we don't
++have to 'try' elements.
++
++so:
++
++ src caps: added at runtime to list the caps needed for an element that
++ wants to connect to this pad.
++ sink caps: the (static) capabilities that this sinkpad has.
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/caps2 gstreamer-0.10.23/docs/random/caps2
+--- gstreamer-0.10.23.orig/docs/random/caps2 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/caps2 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,231 @@
++
++The new caps code uses the type name GstCaps2 and the function
++names gst_caps2_*(). Before the CAPS branch is merged, there
++will be a global change from caps2 to caps. Since GstCaps is
++no longer defined, it no longer compiles, thus highlighting
++exactly what needs to be changed in an element.
++
++
++
++Pad Templates:
++
++Old style:
++
++ GST_PAD_TEMPLATE_FACTORY (fakesrc_src_factory,
++ "src%d",
++ GST_PAD_SRC,
++ GST_PAD_REQUEST,
++ GST_CAPS_ANY
++ );
++
++New style:
++
++ GstStaticPadTemplate fakesrc_src_template = GST_STATIC_PAD_TEMPLATE (
++ "src%d",
++ GST_PAD_SRC,
++ GST_PAD_REQUEST,
++ GST_STATIC_CAPS2_ANY
++ );
++
++The old style defined a function called fakesrc_src_factory(), which,
++when called, returns a pad template. The new style defines a
++GstStaticPadTemplate, which can be converted to a GstPadTemplate
++by the function gst_static_pad_template_get(). The 4th argument
++is also different -- previously it would call the GST_CAPS_NEW()
++function. Now it is a GstStaticCaps.
++
++Not every pad template can be converted to a GstStaticPadTemplate,
++particularly those which create caps from another source at runtime,
++such as videotestsrc.
++
++Caps:
++
++Old style:
++
++ GST_CAPS_NEW (
++ "sinesrc_src",
++ "audio/x-raw-int",
++ "endianness", GST_PROPS_INT (G_BYTE_ORDER),
++ "signed", GST_PROPS_BOOLEAN (TRUE),
++ "width", GST_PROPS_INT (16),
++ "depth", GST_PROPS_INT (16),
++ "rate", GST_PROPS_INT_RANGE (8000, 48000),
++ "channels", GST_PROPS_INT (1)
++ )
++
++New style:
++
++ GST_STATIC_CAPS2 ( "audio/x-raw-int, "
++ "endianness = (int) " G_STRINGIFY (G_BYTE_ORDER) ", "
++ "signed = (boolean) true, "
++ "width = (int) 16, "
++ "depth = (int) 16, "
++ "rate = (int) [ 8000, 48000 ], "
++ "channels = (int) 1"
++ )
++
++The old style calls a function that creates a GstCaps. The new style
++stores a string in a GstStaticCaps2, and this string is converted to
++a caps in the function gst_static_caps2_get().
++
++Note that the old caps name is no longer used.
++
++Old style:
++
++ caps = GST_CAPS_NEW ("videotestsrc_filter",
++ "video/x-raw-rgb",
++ "bpp", GST_PROPS_INT(format->bitspp),
++ "endianness", GST_PROPS_INT(endianness),
++ "depth", GST_PROPS_INT(format->depth),
++ "red_mask", GST_PROPS_INT(format->red_mask),
++ "green_mask", GST_PROPS_INT(format->green_mask),
++ "blue_mask", GST_PROPS_INT(format->blue_mask));
++
++New style:
++
++ caps = gst_caps2_new_simple("video/x-raw-rgb",
++ "bpp", G_TYPE_INT, format->bitspp,
++ "endianness", G_TYPE_INT, endianness,
++ "depth", G_TYPE_INT, format->depth,
++ "red_mask", G_TYPE_INT, format->red_mask,
++ "green_mask", G_TYPE_INT, format->green_mask,
++ "blue_mask", G_TYPE_INT, format->blue_mask);
++
++Not everything can be converted in this way, especially lists and
++ranges.
++
++
++IMPLEMENTATION
++
++Pad Capabilities (caps) are mathematical sets that represent all the
++possible stream types that a pad can use. These general sets are
++represented by unions of simpler sets known as caps structures. Each
++caps structure has a media type (e.g., "audio/mpeg") and a number of
++properties. Each property has a name and a GValue. In normal
++circumstances, the GValue will have the types int, boolean, string,
++fourcc, and double. Simple sets are constructed by using GValues
++that are lists of other GValues, or the special types that represent
++int ranges and double ranges.
++
++A "fixed" caps represents exactly one media format. This means that
++the caps is a union of exactly one caps structure, and each property
++in the caps structure is a simple type, i.e., no ranges or lists.
++
++There are two special caps values, "ANY" which represents the union
++of all stream types, and "EMPTY", which represents the set of no
++stream types. The ANY caps is often used on generic elements that
++handle any type of data (e.g., filesrc and filesink). The EMPTY
++caps is the return value of gst_caps_intersect(), when the two
++given caps do not intersect. In many cases, using EMPTY is invalid.
++
++
++CAPS NEGOTIATION
++
++Elements provide information to the core about what stream formats
++they understand in four ways: the caps in the pad templates, the
++caps returned by a pad's getcaps function, accepting/denying
++a given caps in the pad link function, and a new fixate function.
++
++The pad template caps should be the union of caps a pad supports
++in any potential situation. Simultaneously, these caps should be
++as specific as possible, since it is used to decide which elements
++to attempt for autoplugging, without having to load the element.
++The pad template caps are generally detemined at compile time, but
++might be actually computed at run-time from other information.
++
++The getcaps() function returns the caps supported by a given pad,
++in the context of the element's state, its link to other elements,
++and the devices or files it has opened. These caps must be a
++subset of the pad template caps. In the NULL state with no links,
++the getcaps function should ideally return the same caps as the
++pad template. In rare circumstances, an object property can affect
++the caps returned by getcaps, but this is discouraged. For most
++filters, the caps returned by getcaps is directly affected by the
++allowed caps on other pads. For demuxers and decoders, the caps
++returned by the srcpad's getcaps function is directly related to
++the stream data. Again, getcaps should return the most specific
++caps it reasonably can, since this helps with autoplugging.
++
++The pad link function is the last step in negotiating caps. The
++core calls the pad link function with a fixed caps, meaning that
++the stream format is precisely defined, with the caps having one
++structure, with no fields that are ranges or lists.
++
++There is also a new pad function "fixate", which is used to help
++choose a fixed caps from a non-fixed caps. This is called in
++situations where normal negotiation cannot decide on a fixed caps.
++You should almost never implement a fixate function, please ask
++me if it is appropriate for your case. Fixate functions are called
++iteratively on the pads until a fixed caps is found. Fixate functions
++are called with a const caps, and should return a caps that is a
++strict subset of the given caps. That is, the function should
++create a caps that is "more fixed" than previously, but does not
++have to return fixed caps. If the fixate function can't provide
++more fixed caps, it should return NULL.
++
++
++
++Checklist for getcaps:
++
++ - The getcaps function prototype no longer has the caps parameter.
++ Remove it.
++
++ - The returned caps is owned by the caller. Make sure you don't
++ keep a pointer to the caps.
++
++ - Make sure that the getcaps function can be called safely in each
++ element state (NULL, READY, PAUSED, PLAYING), and for any element
++ configuration (properties, links, devices/files opened or not,
++ error state, etc.)
++
++ - Make sure that the returned caps do not depend on the caps that
++ indicate the stream type that the pad is currently using.
++
++Checklist for pad_link:
++
++ - The pad link function prototypes uses a const GstCaps *.
++
++ - Pad link functions are called with fixed caps. There's no need
++ to check for this. This means that you can assume that the caps
++ is not ANY or EMPTY, and that there is exactly one structure in
++ the caps, and that all the fields in the structure are fixed.
++
++ - Pad link functions are called with caps that are a subset of the
++ most recent return value of the pad's getcaps function. Generally,
++ the getcaps function was called immediately prior to calling the
++ src_link function. For 0.8, you can assume that nothing has changed
++ in your element that would cause a change to the return value of
++ getcaps.
++
++ - the return value GST_PAD_LINK_OK should be used when the caps are
++ acceptable, and you've extracted all the necessary information from
++ the caps and set the element's internal state appropriately.
++
++ - the return value GST_PAD_LINK_REFUSED should be used when the caps
++ are unacceptable for whatever reason.
++
++ - the return value GST_PAD_LINK_DELAYED should be used when the
++ element is in a state where it can't determine whether the caps
++ are acceptable or not. This is often used if the element needs
++ to open a device or process data before determining acceptable
++ caps.
++
++ - the pad_link function must not call gst_caps_try_set_caps() on
++ the pad that was specified as a parameter.
++
++ - the pad_link function may (and often should) call
++ gst_caps_try_set_caps() on pads that are not specified as the
++ pad parameter.
++
++Checklist for fixate:
++
++ - Make sure you actually should be using a fixate function. Fixate
++ functions are reasonable for non-fixed primary sources, such as
++ videotestsrc, v4lsrc, and osssrc.
++
++ - The user_data parameter is mainly used for user-provided fixate
++ function. It should be ignored in element fixate functions.
++
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/caps.dia gstreamer-0.10.23/docs/random/caps.dia
+--- gstreamer-0.10.23.orig/docs/random/caps.dia 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/caps.dia 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,1132 @@
++<?xml version="1.0"?>
++<diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
++ <diagramdata>
++ <attribute name="background">
++ <color val="#ffffff"/>
++ </attribute>
++ <attribute name="paper">
++ <composite type="paper">
++ <attribute name="name">
++ <string>#A4#</string>
++ </attribute>
++ <attribute name="tmargin">
++ <real val="2.82"/>
++ </attribute>
++ <attribute name="bmargin">
++ <real val="2.82"/>
++ </attribute>
++ <attribute name="lmargin">
++ <real val="2.82"/>
++ </attribute>
++ <attribute name="rmargin">
++ <real val="2.82"/>
++ </attribute>
++ <attribute name="is_portrait">
++ <boolean val="true"/>
++ </attribute>
++ <attribute name="scaling">
++ <real val="1"/>
++ </attribute>
++ <attribute name="fitto">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <attribute name="grid">
++ <composite type="grid">
++ <attribute name="width_x">
++ <real val="1"/>
++ </attribute>
++ <attribute name="width_y">
++ <real val="1"/>
++ </attribute>
++ <attribute name="visible_x">
++ <int val="1"/>
++ </attribute>
++ <attribute name="visible_y">
++ <int val="1"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <attribute name="guides">
++ <composite type="guides">
++ <attribute name="hguides"/>
++ <attribute name="vguides"/>
++ </composite>
++ </attribute>
++ </diagramdata>
++ <layer name="Background" visible="true">
++ <object type="UML - Class" version="0" id="O0">
++ <attribute name="obj_pos">
++ <point val="0.75,5.55"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="0.7,5.5;12.7504,9.6"/>
++ </attribute>
++ <attribute name="elem_corner">
++ <point val="0.75,5.55"/>
++ </attribute>
++ <attribute name="elem_width">
++ <real val="11.9504"/>
++ </attribute>
++ <attribute name="elem_height">
++ <real val="4"/>
++ </attribute>
++ <attribute name="name">
++ <string>#GstCaps#</string>
++ </attribute>
++ <attribute name="stereotype">
++ <string/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_attributes">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="visible_attributes">
++ <boolean val="true"/>
++ </attribute>
++ <attribute name="visible_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="attributes">
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#name#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#gchar *#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#id#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#guint16#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#properties#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#GstProps *#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <attribute name="operations"/>
++ <attribute name="template">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="templates"/>
++ </object>
++ <object type="UML - Class" version="0" id="O1">
++ <attribute name="obj_pos">
++ <point val="16.35,9.65"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="16.3,9.6;26.896,12.1"/>
++ </attribute>
++ <attribute name="elem_corner">
++ <point val="16.35,9.65"/>
++ </attribute>
++ <attribute name="elem_width">
++ <real val="10.496"/>
++ </attribute>
++ <attribute name="elem_height">
++ <real val="2.4"/>
++ </attribute>
++ <attribute name="name">
++ <string>#GstProps#</string>
++ </attribute>
++ <attribute name="stereotype">
++ <string/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_attributes">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="visible_attributes">
++ <boolean val="true"/>
++ </attribute>
++ <attribute name="visible_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="attributes">
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#properties#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#GList *#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <attribute name="operations"/>
++ <attribute name="template">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="templates"/>
++ </object>
++ <object type="UML - Association" version="0" id="O2">
++ <attribute name="obj_pos">
++ <point val="12.7004,9.05"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="11.2504,7.6;18.4892,11.8"/>
++ </attribute>
++ <attribute name="orth_points">
++ <point val="12.7004,9.05"/>
++ <point val="14.15,9.05"/>
++ <point val="14.15,10.35"/>
++ <point val="16.35,10.35"/>
++ </attribute>
++ <attribute name="orth_orient">
++ <enum val="0"/>
++ <enum val="1"/>
++ <enum val="0"/>
++ </attribute>
++ <attribute name="name">
++ <string/>
++ </attribute>
++ <attribute name="direction">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="ends">
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string>#1#</string>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="2"/>
++ </attribute>
++ </composite>
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string>#0..1#</string>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="0"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <connections>
++ <connection handle="0" to="O0" connection="13"/>
++ <connection handle="1" to="O1" connection="3"/>
++ </connections>
++ </object>
++ <object type="UML - Class" version="0" id="O3">
++ <attribute name="obj_pos">
++ <point val="14.75,13.45"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="14.7,13.4;26.2656,16.7"/>
++ </attribute>
++ <attribute name="elem_corner">
++ <point val="14.75,13.45"/>
++ </attribute>
++ <attribute name="elem_width">
++ <real val="11.4656"/>
++ </attribute>
++ <attribute name="elem_height">
++ <real val="3.2"/>
++ </attribute>
++ <attribute name="name">
++ <string>#GstPropsEntry#</string>
++ </attribute>
++ <attribute name="stereotype">
++ <string/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="true"/>
++ </attribute>
++ <attribute name="suppress_attributes">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="visible_attributes">
++ <boolean val="true"/>
++ </attribute>
++ <attribute name="visible_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="attributes">
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#propid#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#GQuark#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#propstype#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#GstPropsId#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <attribute name="operations"/>
++ <attribute name="template">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="templates"/>
++ </object>
++ <object type="UML - Association" version="0" id="O4">
++ <attribute name="obj_pos">
++ <point val="16.35,11.55"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="11.25,10.1;17.8,15.6"/>
++ </attribute>
++ <attribute name="orth_points">
++ <point val="16.35,11.55"/>
++ <point val="12.7,11.55"/>
++ <point val="12.7,14.15"/>
++ <point val="14.75,14.15"/>
++ </attribute>
++ <attribute name="orth_orient">
++ <enum val="0"/>
++ <enum val="1"/>
++ <enum val="0"/>
++ </attribute>
++ <attribute name="name">
++ <string/>
++ </attribute>
++ <attribute name="direction">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="ends">
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string>#1#</string>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="2"/>
++ </attribute>
++ </composite>
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string>#*#</string>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="0"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <connections>
++ <connection handle="0" to="O1" connection="8"/>
++ <connection handle="1" to="O3" connection="3"/>
++ </connections>
++ </object>
++ <object type="UML - Class" version="0" id="O5">
++ <attribute name="obj_pos">
++ <point val="4.45,19.05"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="4.4,19;14.996,21.5"/>
++ </attribute>
++ <attribute name="elem_corner">
++ <point val="4.45,19.05"/>
++ </attribute>
++ <attribute name="elem_width">
++ <real val="10.496"/>
++ </attribute>
++ <attribute name="elem_height">
++ <real val="2.4"/>
++ </attribute>
++ <attribute name="name">
++ <string>#boolean#</string>
++ </attribute>
++ <attribute name="stereotype">
++ <string/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_attributes">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="visible_attributes">
++ <boolean val="true"/>
++ </attribute>
++ <attribute name="visible_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="attributes">
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#bool_data#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#gboolean#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <attribute name="operations"/>
++ <attribute name="template">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="templates"/>
++ </object>
++ <object type="UML - Class" version="0" id="O6">
++ <attribute name="obj_pos">
++ <point val="10.55,22.4"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="10.5,22.35;21.5808,24.85"/>
++ </attribute>
++ <attribute name="elem_corner">
++ <point val="10.55,22.4"/>
++ </attribute>
++ <attribute name="elem_width">
++ <real val="10.9808"/>
++ </attribute>
++ <attribute name="elem_height">
++ <real val="2.4"/>
++ </attribute>
++ <attribute name="name">
++ <string>#fourcc#</string>
++ </attribute>
++ <attribute name="stereotype">
++ <string/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_attributes">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="visible_attributes">
++ <boolean val="true"/>
++ </attribute>
++ <attribute name="visible_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="attributes">
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#fourcc_data#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#guint32#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <attribute name="operations"/>
++ <attribute name="template">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="templates"/>
++ </object>
++ <object type="UML - Class" version="0" id="O7">
++ <attribute name="obj_pos">
++ <point val="16.8,19.2"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="16.75,19.15;24.922,21.65"/>
++ </attribute>
++ <attribute name="elem_corner">
++ <point val="16.8,19.2"/>
++ </attribute>
++ <attribute name="elem_width">
++ <real val="8.072"/>
++ </attribute>
++ <attribute name="elem_height">
++ <real val="2.4"/>
++ </attribute>
++ <attribute name="name">
++ <string>#int#</string>
++ </attribute>
++ <attribute name="stereotype">
++ <string/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_attributes">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="visible_attributes">
++ <boolean val="true"/>
++ </attribute>
++ <attribute name="visible_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="attributes">
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#int_data#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#gint#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <attribute name="operations"/>
++ <attribute name="template">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="templates"/>
++ </object>
++ <object type="UML - Class" version="0" id="O8">
++ <attribute name="obj_pos">
++ <point val="22.5,22.55"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="22.45,22.5;31.5916,25"/>
++ </attribute>
++ <attribute name="elem_corner">
++ <point val="22.5,22.55"/>
++ </attribute>
++ <attribute name="elem_width">
++ <real val="9.0416"/>
++ </attribute>
++ <attribute name="elem_height">
++ <real val="2.4"/>
++ </attribute>
++ <attribute name="name">
++ <string>#list#</string>
++ </attribute>
++ <attribute name="stereotype">
++ <string/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_attributes">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="visible_attributes">
++ <boolean val="true"/>
++ </attribute>
++ <attribute name="visible_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="attributes">
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#entries#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#GList *#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <attribute name="operations"/>
++ <attribute name="template">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="templates"/>
++ </object>
++ <object type="UML - Class" version="0" id="O9">
++ <attribute name="obj_pos">
++ <point val="27.9,18.85"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="27.85,18.8;33.598,22.1"/>
++ </attribute>
++ <attribute name="elem_corner">
++ <point val="27.9,18.85"/>
++ </attribute>
++ <attribute name="elem_width">
++ <real val="5.648"/>
++ </attribute>
++ <attribute name="elem_height">
++ <real val="3.2"/>
++ </attribute>
++ <attribute name="name">
++ <string>#int_range#</string>
++ </attribute>
++ <attribute name="stereotype">
++ <string/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_attributes">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="visible_attributes">
++ <boolean val="true"/>
++ </attribute>
++ <attribute name="visible_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="attributes">
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#min#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#gint#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#max#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#gint#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <attribute name="operations"/>
++ <attribute name="template">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="templates"/>
++ </object>
++ <object type="UML - Association" version="0" id="O10">
++ <attribute name="obj_pos">
++ <point val="30.724,18.85"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="19.0328,15.2;32.174,20.45"/>
++ </attribute>
++ <attribute name="orth_points">
++ <point val="30.724,18.85"/>
++ <point val="30.724,18.25"/>
++ <point val="20.4828,18.25"/>
++ <point val="20.4828,16.65"/>
++ </attribute>
++ <attribute name="orth_orient">
++ <enum val="1"/>
++ <enum val="0"/>
++ <enum val="1"/>
++ </attribute>
++ <attribute name="name">
++ <string/>
++ </attribute>
++ <attribute name="direction">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="ends">
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string/>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="0"/>
++ </attribute>
++ </composite>
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string/>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="1"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <connections>
++ <connection handle="0" to="O9" connection="1"/>
++ <connection handle="1" to="O3" connection="6"/>
++ </connections>
++ </object>
++ <object type="UML - Association" version="0" id="O11">
++ <attribute name="obj_pos">
++ <point val="20.836,19.2"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="19.0328,15.2;22.286,20.8"/>
++ </attribute>
++ <attribute name="orth_points">
++ <point val="20.836,19.2"/>
++ <point val="20.836,18.25"/>
++ <point val="20.4828,18.25"/>
++ <point val="20.4828,16.65"/>
++ </attribute>
++ <attribute name="orth_orient">
++ <enum val="1"/>
++ <enum val="0"/>
++ <enum val="1"/>
++ </attribute>
++ <attribute name="name">
++ <string/>
++ </attribute>
++ <attribute name="direction">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="ends">
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string/>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="0"/>
++ </attribute>
++ </composite>
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string/>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="1"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <connections>
++ <connection handle="0" to="O7" connection="1"/>
++ <connection handle="1" to="O3" connection="6"/>
++ </connections>
++ </object>
++ <object type="UML - Association" version="0" id="O12">
++ <attribute name="obj_pos">
++ <point val="9.698,19.05"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="8.248,15.2;21.9328,20.65"/>
++ </attribute>
++ <attribute name="orth_points">
++ <point val="9.698,19.05"/>
++ <point val="9.698,18.25"/>
++ <point val="20.4828,18.25"/>
++ <point val="20.4828,16.65"/>
++ </attribute>
++ <attribute name="orth_orient">
++ <enum val="1"/>
++ <enum val="0"/>
++ <enum val="1"/>
++ </attribute>
++ <attribute name="name">
++ <string/>
++ </attribute>
++ <attribute name="direction">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="ends">
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string/>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="0"/>
++ </attribute>
++ </composite>
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string/>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="1"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <connections>
++ <connection handle="0" to="O5" connection="1"/>
++ <connection handle="1" to="O3" connection="6"/>
++ </connections>
++ </object>
++ <object type="UML - Association" version="0" id="O13">
++ <attribute name="obj_pos">
++ <point val="16.0404,22.4"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="14.5904,15.2;21.9328,24"/>
++ </attribute>
++ <attribute name="orth_points">
++ <point val="16.0404,22.4"/>
++ <point val="16.0404,18.25"/>
++ <point val="20.4828,18.25"/>
++ <point val="20.4828,16.65"/>
++ </attribute>
++ <attribute name="orth_orient">
++ <enum val="1"/>
++ <enum val="0"/>
++ <enum val="1"/>
++ </attribute>
++ <attribute name="name">
++ <string/>
++ </attribute>
++ <attribute name="direction">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="ends">
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string/>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="0"/>
++ </attribute>
++ </composite>
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string/>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="1"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <connections>
++ <connection handle="0" to="O6" connection="1"/>
++ <connection handle="1" to="O3" connection="6"/>
++ </connections>
++ </object>
++ <object type="UML - Association" version="0" id="O14">
++ <attribute name="obj_pos">
++ <point val="27.0208,22.55"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="19.0328,15.2;28.4708,24.15"/>
++ </attribute>
++ <attribute name="orth_points">
++ <point val="27.0208,22.55"/>
++ <point val="27.0208,18.25"/>
++ <point val="20.4828,18.25"/>
++ <point val="20.4828,16.65"/>
++ </attribute>
++ <attribute name="orth_orient">
++ <enum val="1"/>
++ <enum val="0"/>
++ <enum val="1"/>
++ </attribute>
++ <attribute name="name">
++ <string>#union#</string>
++ </attribute>
++ <attribute name="direction">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="ends">
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string/>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="0"/>
++ </attribute>
++ </composite>
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string/>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="1"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <connections>
++ <connection handle="0" to="O8" connection="1"/>
++ <connection handle="1" to="O3" connection="6"/>
++ </connections>
++ </object>
++ <object type="UML - Association" version="0" id="O15">
++ <attribute name="obj_pos">
++ <point val="31.5416,24.45"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="24.7656,12.7;36.3,25.9"/>
++ </attribute>
++ <attribute name="orth_points">
++ <point val="31.5416,24.45"/>
++ <point val="34.85,24.45"/>
++ <point val="34.85,14.15"/>
++ <point val="26.2156,14.15"/>
++ </attribute>
++ <attribute name="orth_orient">
++ <enum val="0"/>
++ <enum val="1"/>
++ <enum val="0"/>
++ </attribute>
++ <attribute name="name">
++ <string/>
++ </attribute>
++ <attribute name="direction">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="ends">
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string>#1#</string>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="2"/>
++ </attribute>
++ </composite>
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string>#*#</string>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="0"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <connections>
++ <connection handle="0" to="O8" connection="9"/>
++ <connection handle="1" to="O3" connection="4"/>
++ </connections>
++ </object>
++ </layer>
++</diagram>
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/caps_grammar gstreamer-0.10.23/docs/random/caps_grammar
+--- gstreamer-0.10.23.orig/docs/random/caps_grammar 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/caps_grammar 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,54 @@
++
++Canonical caps/structure strings (those created by gst_caps_to_string()
++and gst_structure_to_string()) do not have AUTO_VALUE.
++
++Goals:
++ - UTF-8 clean
++ - SIMPLE_STRINGs should cover most simple cases that don't interfere
++ with other parts of the gst_caps or gst_parse grammar
++ - forward-parsed grammar
++ - quoted strings handle backslash escaping as well as XML-style (&ack;)
++ escaping
++
++CAPS = STRUCTURE [ ';' STRUCTURE ]*
++
++STRUCTURE = STRUCTURE_NAME [ ',' FIELD ]*
++
++STRUCTURE_NAME = STRING
++
++FIELD = FIELD_NAME '=' TYPED_VALUE
++
++FIELD_NAME = SIMPLE_STRING
++
++TYPED_VALUE = CANONICAL_VALUE | AUTO_VALUE
++
++CANONICAL_VALUE = '{' TYPED_VALUE [ ',' TYPED_VALUE ]* '}'
++ | '[' TYPED_VALUE ',' TYPED_VALUE ']'
++ | '(' TYPE ')' VALUE
++
++AUTO_VALUE = [-+]?[0-9][0-9]*
++ | [-+]?[0-9][0-9]*[.][0-9]*[eE][-+][0-9]*
++ | STRING
++
++VALUE = STRING
++
++STRING = ["][^"]["]
++ | ['][^'][']
++ | SIMPLE_STRING
++
++SIMPLE_STRING = [A-Za-z0-9_+-:./]+
++
++TYPE = "int" | "i" | "float" | "f" | "double" | "d" | "fourcc" | "4"
++ | "boolean" | "bool" | "b"
++ | GTYPE
++
++
++Canonical Examples:
++
++"audio/raw"
++"audio/raw", rate=(int)44100
++"audio/raw", rate=(int)44100, signed=(boolean)true
++"audio/raw", rate={ (int)44100, (int)48000 }
++"audio/raw", rate=[ (int)8000, (int)48000 ]
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ChangeLog-0.8 gstreamer-0.10.23/docs/random/ChangeLog-0.8
+--- gstreamer-0.10.23.orig/docs/random/ChangeLog-0.8 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ChangeLog-0.8 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,8759 @@
++2005-02-22 Stefan Kost <ensonic@users.sf.net>
++
++ * docs/libs/tmpl/gstcontrol.sgml:
++ * docs/libs/tmpl/gstdparam.sgml:
++ * docs/libs/tmpl/gstdplinint.sgml:
++ * docs/libs/tmpl/gstdpman.sgml:
++ * docs/libs/tmpl/gstdpsmooth.sgml:
++ * docs/libs/tmpl/gstunitconvert.sgml:
++ more docs for the state of dparams
++
++2005-02-19 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstelementfactory.c: (gst_element_factory_create):
++ * gst/gstobject.c: (gst_object_init),
++ (gst_object_set_name_default), (gst_object_set_name):
++ name objects by default, not in gst_element_factory_create. Allows
++ using elements created with g_object_new. (fixes #167283)
++
++2005-02-19 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstinfo.c: (_gst_debug_init), (gst_debug_log_default):
++ make the time that debugging functions print relative to when
++ gst_init was called
++
++2005-02-18 Tim-Philipp Müller <tim at centricular dot net>
++
++ * gst/gsttaginterface.c:
++ Fix inline docs: tag setter vararg functions are NULL-terminated,
++ GST_TAG_INVALID doesn't exist any more.
++
++2005-02-18 Zaheer Abbas Merali <zaheerabbas at merali dot org>
++
++ * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_dump_byte_array):
++ Allocate the 1 byte more memory that was forgotten!!!!!
++ fixes memory corruption on 64bit platforms
++
++2005-02-15 Stefan Kost <ensonic@users.sf.net>
++
++ * docs/pwg/building-pads.xml:
++ * docs/pwg/intro-basics.xml:
++ fixed a few typos, relabeled introductionary list of types
++ * docs/random/ensonic/dparams.txt:
++ more notes abut dparam changes
++ * libs/gst/control/dparam.c: (gst_dparam_attach):
++ * libs/gst/control/dparammanager.c:
++ * libs/gst/control/dparammanager.h:
++ - many comments and notes on dparam implementation
++ - new dparams are were not initialized to the default value
++ from param spec
++
++2005-02-14 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ submitted by: Peter Astakhov
++
++ * po/LINGUAS:
++ * po/ru.po:
++ adding Russian translation
++
++2005-02-11 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ * docs/gst/Makefile.am:
++ * docs/libs/Makefile.am:
++ make sure popt is added to gtk-doc flags. Fixes #147782.
++
++2005-02-09 Tim-Philipp Müller <tim at centricular dot net>
++
++ * docs/faq/using.xml:
++ Fix typo in FAQ (artssink => artsdsink)
++
++2005-02-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * tools/gst-launch.1.in:
++ Fix typo (#166699).
++
++2005-02-08 Tim-Philipp Müller <tim at centricular dot net>
++
++ * docs/faq/using.xml:
++ Add -v argument to fakesrc/fakesink gst-launch line,
++ so that the promised output will actually show up.
++
++2005-02-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstthread.c: (gst_thread_change_state):
++ Implement state-change error handling (#166073).
++
++2005-02-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstqueue.c: (gst_queue_chain), (gst_queue_get):
++ Release interrupt after handling (#166250).
++
++2005-02-08 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ back to HEAD
++
++=== release 0.8.9 ===
++
++2005-02-08 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * NEWS:
++ * RELEASE:
++ * configure.ac:
++ releasing 0.8.9, "Like Eating Glass"
++
++2005-02-08 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ submitted by: Clytie Siddall
++
++ * po/vi.po: Added Vietnamese translation
++
++2005-02-07 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ patch by: Tim Philipp-Müller
++
++ * configure.ac:
++ * gst/gstpad.c:
++ unref data when probe function returns FALSE. Fixes #166362
++
++2005-02-06 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gst.c: (gst_init_get_popt_table):
++ Fix typo (#166269).
++
++2005-02-04 Andy Wingo <wingo@pobox.com>
++
++ * gst/gstelement.c (gst_element_get_compatible_pad_template): Fix
++ the debugging on whether the caps are compatible.
++
++2005-02-03 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/manual/basics-elements.xml:
++ Fix two typos.
++
++2005-02-02 Wim Taymans <wim@fluendo.com>
++
++ * gst/schedulers/gstoptimalscheduler.c: (remove_decoupled),
++ (schedule_chain), (get_invalid_call), (chain_invalid_call),
++ (loop_group_schedule_function), (gst_opt_scheduler_iterate):
++ Remove some FIXMEs after analysing and commenting why they
++ are not issues.
++
++2005-02-02 Wim Taymans <wim@fluendo.com>
++
++ * gst/schedulers/gstoptimalscheduler.c:
++ (gst_opt_scheduler_class_init), (gst_opt_scheduler_init),
++ (gst_opt_scheduler_finalize), (remove_decoupled), (schedule_chain),
++ (get_invalid_call), (chain_invalid_call),
++ (get_group_schedule_function), (loop_group_schedule_function),
++ (gst_opt_scheduler_loop_wrapper), (gst_opt_scheduler_get_wrapper),
++ (gst_opt_scheduler_state_transition),
++ (gst_opt_scheduler_add_element),
++ (gst_opt_scheduler_remove_element), (gst_opt_scheduler_interrupt),
++ (gst_opt_scheduler_error), (gst_opt_scheduler_pad_link),
++ (gst_opt_scheduler_pad_unlink), (gst_opt_scheduler_iterate),
++ (gst_opt_scheduler_show):
++ Added lock to protect scheduler data structures.
++
++2005-02-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * testsuite/threads/threadi.c: (cb_data):
++ Fix buglet in test.
++
++2005-02-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * testsuite/threads/Makefile.am:
++ * testsuite/threads/threadi.c: (cb_data), (cb_play), (main):
++ On Wim's request, split the test in three separately-compiled
++ tests that each test a very specific bug. Two of them still fail,
++ will create bugs for those. threadi.c indicates why they fail.
++
++2005-02-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/schedulers/gstoptimalscheduler.c:
++ (get_group_schedule_function):
++ Try to work with the threading mess that queue_link is.
++
++2005-02-01 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstbin.c: (gst_bin_remove_func):
++ Explicitely make an element release locks in a group when being
++ remove from a bin.
++ * gst/gstqueue.c: (gst_queue_chain), (gst_queue_get):
++ If there's no scheduler, always return immediately (similar to
++ gst_element_interrupt).
++
++2005-01-31 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstbin.c: (gst_bin_child_state_change_func):
++ Remove a piece of code that could never be reached.
++ * docs/gst/gstreamer-sections.txt:
++ * gst/gstpad.c: (gst_pad_push), (gst_pad_pull),
++ (gst_pad_call_get_function):
++ * gst/gstpad.h:
++ * testsuite/pad/Makefile.am:
++ Fix #150546, enable tests.
++
++2005-01-31 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced-types.xml:
++ Fix description for buffer-frames=0.
++ * docs/gst/tmpl/gstbin.sgml:
++ * gst/gstbin.c: (gst_bin_child_state_change_func),
++ (gst_bin_change_state), (gst_bin_change_state_norecurse):
++ * gst/gstbin.h:
++ * testsuite/threads/Makefile.am:
++ * testsuite/threads/threadi.c: (cb_timeout), (cb_quit), (cb_eos),
++ (cb_state), (cb_play), (main):
++ Fix non-recursive state changes to *really* change the state
++ of the object, and not just call parent_class->state_change.
++ Fix a lot of lockups caused by this. Fixes #132775. Add test
++ for the problem. Also enable test to show #142588 (fixed).
++ * gst/gstthread.c: (gst_thread_change_state),
++ (gst_thread_child_state_change):
++ Don't exit the thread if we go to NULL and are inside thread
++ context. Instead, return control to the main thread context
++ and exit from there.
++ * gst/gstelement.c: (gst_element_disable_threadsafe_properties):
++ Don't unset virtual functions, since those may still be used.
++ That's not necessarily correct, but suffices for now.
++ * configure.ac:
++ * testsuite/Makefile.am:
++ * testsuite/pad/Makefile.am:
++ * testsuite/pad/chainnopull.c: (gst_test_sink_class_init),
++ (gst_test_sink_base_init), (gst_test_sink_chain),
++ (gst_test_sink_init), (main):
++ * testsuite/pad/getnopush.c: (gst_test_src_class_init),
++ (gst_test_src_base_init), (gst_test_src_get), (gst_test_src_init),
++ (main):
++ * testsuite/pad/link.c: (gst_test_element_class_init),
++ (gst_test_element_base_init), (gst_test_src_get),
++ (gst_test_src_loop), (gst_test_src_init), (gst_test_filter_chain),
++ (gst_test_filter_loop), (gst_test_filter_init),
++ (gst_test_sink_chain), (gst_test_sink_loop), (gst_test_sink_init),
++ (cb_error), (main):
++ Add tests to show #150546. Pass, but should fail (currently
++ disabled from the testsuite).
++ * gst/gstscheduler.c: (gst_scheduler_dispose):
++ Dereference child schedulers on dispose (#94464).
++ * testsuite/bytestream/filepadsink.c: (gst_fp_sink_init):
++ Fix typo.
++ * testsuite/threads/thread.c: (main):
++ Add more debug.
++
++2005-01-29 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstpad.c: (gst_pad_push):
++ Oops, revert previous commit, broke testsuite...
++
++2005-01-29 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstpad.c: (gst_pad_push):
++ Add check that the pad on which the push is performed is not a
++ get-based pad (#150546).
++
++2005-01-28 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/elements/gsttypefindelement.c:
++ (gst_type_find_element_handle_event):
++ Fix buffer pushing if stream EOSes during typefinding.
++
++2005-01-28 Edward Hervey <bilboed@bilboed.com>
++
++ Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstvalue.c: (gst_string_wrap):
++ Allow NULL-strings as argument (#165365).
++
++2005-01-27 Stephane Wirtel <stephane.wirtel@belgacom.net>
++
++ Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/schedulers/faircothreads.c:
++ (gst_fair_scheduler_cothread_queue_show):
++ Fix build without debug enabled.
++
++2005-01-26 Stefan Kost <ensonic@users.sf.net>
++
++ * docs/gst/gstreamer-sections.txt:
++ * docs/libs/gstreamer-libs-docs.sgml:
++ * docs/libs/gstreamer-libs-sections.txt:
++ * docs/libs/tmpl/gstcontrol.sgml:
++ * docs/libs/tmpl/gstdparam.sgml:
++ * docs/libs/tmpl/gstdplinint.sgml:
++ * docs/libs/tmpl/gstdpman.sgml:
++ * docs/libs/tmpl/gstdpsmooth.sgml:
++ * docs/libs/tmpl/gstputbits.sgml:
++ * docs/libs/tmpl/gstunitconvert.sgml:
++ * libs/gst/control/dparam.c:
++ * libs/gst/control/dparam.h:
++ * libs/gst/control/dparammanager.c:
++ (gst_dpman_add_required_dparam_callback),
++ (gst_dpman_add_required_dparam_direct),
++ (gst_dpman_add_required_dparam_array),
++ (gst_dpman_remove_required_dparam), (gst_dpman_attach_dparam),
++ (gst_dpman_get_dparam), (gst_dpman_get_dparam_type),
++ (gst_dpman_get_manager)
++ restructured DParam docs
++
++2005-01-25 Tim-Philipp Müller <tim at centricular dot net>
++
++ * gst-element-check.m4:
++ Only check for gst-inspect if we haven't already
++ found it in previous element check runs
++
++2005-01-25 Stefan Kost <ensonic@users.sf.net>
++
++ * docs/gst/Makefile.am:
++ * docs/libs/Makefile.am:
++ fixed install rules to treat style.css as optional
++
++2005-01-24 Stefan Kost <ensonic@users.sf.net>
++
++ * docs/gst/Makefile.am:
++ * docs/libs/Makefile.am:
++ install style.css along with docs
++ * docs/gst/tmpl/gstbin.sgml:
++ * docs/gst/tmpl/gstclock.sgml:
++ * docs/gst/tmpl/gstdata.sgml:
++ * docs/gst/tmpl/gstelement.sgml:
++ * gst/gstbin.h:
++ * gst/gstelement.c: (gst_element_class_init):
++ * gst/gstelement.h:
++ fixing incomplete docs
++
++2005-01-24 Tim-Philipp Müller <tim at centricular dot net>
++
++ * gst/elements/gstfilesink.c: (gst_filesink_handle_event):
++ Don't unref seek event twice when fflush() fails
++
++2005-01-22 David Schleef <ds@schleef.org>
++
++ * configure.ac: Add --disable-valgrind. (partial fix for #164890)
++
++2005-01-21 Stefan Kost <ensonic@users.sf.net>
++
++ * docs/gst/Makefile.am:
++ * docs/libs/Makefile.am:
++ added params for deprecation guards
++ * gst/gst.c:
++ * gst/gst.h:
++ * gst/gsterror.c: (_gst_resource_errors_init),
++ (_gst_stream_errors_init):
++ * gst/gsterror.h:
++ documented some more enums
++
++2005-01-19 Jan Schmidt <thaytan@mad.scientist.com>
++ * gst/autoplug/gstspideridentity.c:
++ Cosmetic fix - spider_find_peek should be static
++ * gst/parse/parse.l:
++ Applying fix for #164261
++
++2005-01-18 Stefan Kost <ensonic@users.sf.net>
++
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/gstplugin.sgml:
++ * docs/libs/gstreamer-libs-sections.txt:
++ * docs/libs/tmpl/gstcontrol.sgml:
++ * gst/gstbuffer.h:
++ * gst/gsttag.h:
++ * gst/gstvalue.c:
++ added docs for the TAG defines
++
++2005-01-18 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/schedulers/gstoptimalscheduler.c: (schedule_group):
++ Only unref entry if there is an entry.
++
++2005-01-17 Wim Taymans <wim@fluendo.com>
++
++ * gst/schedulers/gstoptimalscheduler.c: (add_to_group),
++ (remove_from_group), (schedule_group), (normalize_group),
++ (gst_opt_scheduler_iterate):
++ Also ref/unref decoupled elements before iterating the
++ group since they are not added to the list of elements.
++
++2005-01-17 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/manual/highlevel-components.xml:
++ Add subtitle/streamselection as new features to playbin.
++
++2005-01-17 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/manual/manual.xml:
++ Re-enable dataaccess docs (oops).
++
++2005-01-17 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced-types.xml:
++ * docs/random/mimetypes:
++ Add documentation on libsndfile types (#163309), by Steve Baker
++ <steve@stevebaker.org>.
++ * gst/gstelement.c: (gst_element_release_request_pad):
++ If an element has no explicit function, just remove the pad.
++
++2005-01-17 Luca Ognibene <luogni@tin.it>
++
++ Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/registries/gstxmlregistry.c: (gst_xml_registry_load):
++ Fix memleak (#163801).
++
++2005-01-17 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/elements/gsttee.c: (gst_tee_getcaps), (gst_tee_link):
++ I think this is actually more correct...
++
++2005-01-16 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstprobe.c: (gst_probe_dispatcher_dispatch):
++ Another workaround for memory access while destroyed in callback.
++ Please, someone with refcount knowledge, have a look at this.
++
++2005-01-15 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/faq/faq.xml:
++ * docs/faq/legal.xml:
++ move the legal Q&A here
++
++2005-01-14 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/elements/gsttee.c: (gst_tee_getcaps), (gst_tee_link),
++ (gst_tee_request_new_pad):
++ Fix negotiation.
++
++2005-01-14 Stephane LOEUILLET <stephane.loeuillet@tiscali.fr>
++
++ * docs/random/omega/caps2:
++ * testsuite/caps/caps_strings:
++ replace framerate aproximations by their real value
++ (24000/1001, 30000/1001, 60000/1001)
++ Partially fixes bug #164049
++
++2005-01-13 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/Makefile.am:
++ don't fail on the stupid GstPoptOption
++
++2005-01-13 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstpad.h:
++ * gst/gstprobe.c:
++ allow probes to work on ghost pads by realizing the pad
++ probe debugging
++
++2005-01-11 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/gstpad.sgml:
++ * gst/gstpad.c: (gst_pad_set_active_recursive):
++ * gst/gstpad.h:
++ Add gst_pad_set_active_recursive().
++
++2005-01-10 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/random/release:
++ updates
++ * gst/gst_private.h:
++ * gst/gstinfo.c:
++ * gst/gstobject.c:
++ move deep_notify logging to a new category
++ * gst/gstprobe.c:
++ * gst/gstprobe.h:
++ add stuff so bindings can wrap probes
++
++2005-01-09 Stephane LOEUILLET <stephane.loeuillet@tiscali.fr>
++
++ * gst/gstplugin.c: (gst_plugin_load):
++ Fix plugin loading if plugin/lib was already loaded. Fixes
++ #163383
++
++2005-01-09 Sebastien Cote <sc5@hermes.usherb.ca>
++
++ Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstpluginfeature.c: (gst_plugin_feature_ensure_loaded):
++ Protect plugin loading by a mutex so it's threadsafe. Fixes
++ #163234.
++
++2005-01-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstevent.c: (_gst_event_copy):
++ Reference source object when copying events, since it'll be
++ dereferenced on event dereferencing as well.
++
++2005-01-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/gstevent.sgml:
++ * gst/gstevent.c: (gst_event_new_filler_stamped),
++ (gst_event_filler_get_duration):
++ * gst/gstevent.h:
++ Add two new functions for filler events (which are used to
++ synchronize streams if one of them is not having any data
++ for a while) without interrupting the actual data-stream.
++ Basically a no-op.
++ * gst/gstqueue.c: (gst_queue_init), (gst_queue_getcaps),
++ (gst_queue_link_sink), (gst_queue_link_src),
++ (gst_queue_change_state):
++ Allow for renegotiation while filled. Required for stream
++ switching while playing.
++
++2005-01-08 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstelement.c: (gst_element_link_many):
++ fix up g_return_if_fail's
++ * po/LINGUAS:
++ * po/de.po:
++ add German translation, that was somehow not included
++
++2005-01-08 Stephane LOEUILLET <stephane.loeuillet@tiscali.fr>
++
++ * docs/random/mimetypes:
++ add 2 more 4CC code for DV (HDTV and SDTV-LongPlay profiles)
++ do not add them to riff-lib as they are not common
++
++2005-01-07 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstprobe.c: (gst_probe_dispatcher_dispatch):
++ Check for existence of probe after performing the probe before
++ re-accessing it to prevent segfaults caused by removal of the
++ probe in the callback.
++
++2005-01-05 David Schleef <ds@schleef.org>
++
++ * testsuite/registry/Makefile.am:
++ * testsuite/registry/gst-print-formats.c:
++ (print_pad_templates_info), (print_element_list),
++ (print_typefind_list), (list_sort_func), (get_typefind_mime_list),
++ (g_list_uniqify), (get_pad_templates_info),
++ (get_element_mime_list), (print_mime_list), (main): A little
++ program that looks through the registry to find elements of
++ a given type. Not particularly interesting as a test, except
++ that there's no other test covering the same area.
++
++2005-01-05 David Schleef <ds@schleef.org>
++
++ * tools/gst-launch.c: (idle_func), (fault_handler_sighandler),
++ (fault_handler_sigaction), (fault_spin),
++ (sigint_handler_sighandler), (play_handler), (main): Fix deadlocks
++ in signal.h-type signal handlers by not calling forbidden functions,
++ including gst_element_set_state().
++
++2005-01-05 David Schleef <ds@schleef.org>
++
++ * gst/gstvalue.h: Mark _gst_reserved[] as private
++
++2005-01-05 David Schleef <ds@schleef.org>
++
++ * gst/gstvalue.c: Fix doc build problem.
++
++2005-01-05 David Schleef <ds@schleef.org>
++
++ * gst/gstvalue.c: Add some documentation
++
++2005-01-05 Stefan Kost <ensonic@users.sf.net>
++
++ * docs/README:
++ another shell oneliner for empty return value docs
++ * gst/gstcaps.c:
++ * gst/gstvalue.c:
++ * libs/gst/control/dparam.c:
++ more doc fixes (parameters and return values)
++
++2005-01-05 Vincent Torri <torri@iecn.u-nancy.fr>
++
++ Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstregistry.h:
++ * gst/registries/gstxmlregistry.c:
++ Fix macro's for Mingw (fixes #162276).
++
++2005-01-04 Stefan Kost <ensonic@users.sf.net>
++
++ * docs/README:
++ quick shell oneliner to find undocumented members
++ * docs/gst/tmpl/gstplugin.sgml:
++ * docs/gst/tmpl/gstscheduler.sgml:
++ * docs/gst/tmpl/gstthread.sgml:
++ more enumtypes cleanup
++ * gst/gsterror.h:
++ activated documentation comments, now someone needs to document
++ the enums :(
++
++2005-01-03 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/manual/manual.xml:
++ Add dataaccess part (doh!).
++
++2005-01-03 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/manual/advanced-autoplugging.xml:
++ Fix typo (intiate -> initiate).
++
++2005-01-02 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/random/bbb/streamselection:
++ Add some notes on how to handle multi-subtitle/-audio streams.
++
++2004-12-30 Stefan Kost <ensonic@users.sf.net>
++
++ * docs/gst/gstreamer-docs.sgml:
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/gstenumtypes.sgml:
++ * docs/gst/tmpl/gsterror.sgml:
++ * docs/gst/tmpl/gstevent.sgml:
++ * docs/gst/tmpl/gstpad.sgml:
++ * docs/gst/tmpl/gstpadtemplate.sgml:
++ * docs/gst/tmpl/gstthread.sgml:
++ removed gstenumtypes section from docs and put all the enums into
++ their sections
++
++2004-12-27 Stephane Loeuillet <stephane.loeuillet@tiscali.fr>
++
++ * gst/gstplugin.c:
++ document gst_library_load a bit more (riff special case + return
++ value if already loaded)
++ * testsuite/bytestream/filepadsink.c:
++ plugin name is 'gstbytestream', not 'bytestream'
++
++2004-12-25 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/random/bbb/subtitles:
++ Add some first mind rumblings on proper subtitle support.
++
++2004-12-24 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * po/ca.po:
++ * po/sv.po:
++ updated translations
++
++2004-12-23 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/manual/advanced-dataaccess.xml:
++ Add section on how to use fakesrc/fakesink/identity in your
++ application, plus section on how to embed plugins. Also mention
++ probes.
++ * docs/manual/appendix-checklist.xml:
++ * docs/manual/appendix-debugging.xml:
++ * docs/manual/appendix-gnome.xml:
++ * docs/manual/appendix-integration.xml:
++ Debug -> checklist, GNOME -> integration, add sections on Linux,
++ KDE integration and add other things useful for application
++ development.
++ * docs/manual/manual.xml:
++ Remove some fixmes, update some file pointers.
++ * docs/pwg/appendix-checklist.xml:
++ Fix typo.
++ * docs/pwg/building-boiler.xml:
++ Remove ugly header and add commented fixme.
++ * docs/pwg/pwg.xml:
++ Add fixme.
++ * examples/manual/Makefile.am:
++ Add example for added docs.
++
++2004-12-23 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ back to HEAD
++
++=== release 0.8.8 ===
++
++2004-12-23 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * NEWS:
++ * RELEASE:
++ * configure.ac:
++ Releasing 0.8.8, "I'll Take Care Of You"
++
++2004-12-21 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ second prerelease
++
++2004-12-21 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ patch by: Wim Taymans
++
++ * gst/gstbin.c:
++ Fix for #159852 - make iterate emission threadsafe
++
++2004-12-21 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/faq/cvs.xml:
++ notes about new fdo account request
++
++2004-12-20 Stefan Kost <ensonic@users.sf.net>
++
++ * docs/gst/gstreamer-docs.sgml:
++ * docs/gst/tmpl/gstenumtypes.sgml:
++ * docs/gst/tmpl/gstplugin.sgml:
++ * docs/libs/gstreamer-libs-docs.sgml:
++ Added missing short docs. Added ids for navigation.
++
++2004-12-19 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/manual/advanced-autoplugging.xml:
++ * docs/manual/advanced-schedulers.xml:
++ * docs/manual/advanced-threads.xml:
++ Rewrites. Remove cothreads, go a bit into opt specifically,
++ document threads and their gotchas, and do some technical stuff
++ on autoplugging plus add some working examples. Fixes #157395.
++ * examples/manual/Makefile.am:
++ Add typefind/autoplugger example (one that actually works).
++ Remove queue example since it's a duplicate of the thread one.
++
++2004-12-17 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstvalue.c: (gst_value_deserialize_string):
++ use deprecated g_value_set_string_take_ownership to keep compatible
++ with glib 2.2
++
++2004-12-17 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstvalue.c: (gst_value_deserialize_string):
++ revert last patch, only dom a g_utf8_validate now before accepting
++ the string - caps parsing strips " from strings so we can't rely on
++ them
++ * testsuite/caps/value_serialize.c: (test_string_deserialization):
++ disable a test that tested the above and comment it
++
++2004-12-16 Steve Lhomme <steve.lhomme@free.fr>
++
++ Patch reviewed by David Schleef <ds@schleef.org>
++
++ * win32/gstenumtypes.c: Update from gst/gstenumtypes.c (See
++ bug #153882)
++ * win32/gstenumtypes.h: same
++
++2004-12-17 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstpad.c: (gst_pad_query):
++ Do query on realized pad, similar to how convert/send_event handle
++ this. Also makes sense, since this pad belongs to the function to
++ which this query will be sent. Fixes #158163.
++
++2004-12-16 Christian Fredrik Kalager Schaller <uraeus@gnome.org>
++
++ * docs/manual/appendix-programs.xml: fix pipeline to actually work
++
++2004-12-16 Christian Fredrik Kalager Schaller <christian@fluendo.com>
++
++ * docs/faq/general.xml: fix pipeline to actually work
++
++2004-12-16 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstvalue.c: (gst_value_deserialize_string):
++ check that a simple string that gets deserialized does not contain
++ invalid characters
++ * testsuite/caps/value_serialize.c: (test_string_deserialization):
++ remove a test that tested a wring behaviour
++
++2004-12-16 Matt Kraai <kraai@alumni.cmu.edu>
++
++ Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/manual/intro-motivation.xml:
++ Fix typos.
++
++2004-12-16 Edward Hervey <bilboed@bilboed.com>
++
++ Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/gst/tmpl/gstprobe.sgml:
++ Fix documentation of probe callback - it is supposed to return
++ FALSE, not TRUE, to remove data from the stream (#159087).
++
++2004-12-16 Daniel Gazard <dany42@free.fr>
++
++ Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstelementfactory.c: (gst_element_factory_create):
++ Fix compile failure if compiling without libxml2 support (#149936).
++
++2004-12-15 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/manual/advanced-autoplugging.xml:
++ * docs/manual/highlevel-components.xml:
++ Move spider from autoplugging to components. Autoplugging is for
++ internals, not for solutions. ;-).
++
++2004-12-15 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/random/ds/0.9-suggested-changes:
++ Make note on device/location/uri property names.
++
++2004-12-15 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/manual/advanced-autoplugging.xml:
++ * docs/manual/advanced-clocks.xml:
++ * docs/manual/advanced-interfaces.xml:
++ * docs/manual/advanced-metadata.xml:
++ * docs/manual/advanced-position.xml:
++ * docs/manual/advanced-schedulers.xml:
++ * docs/manual/advanced-threads.xml:
++ * docs/manual/appendix-gnome.xml:
++ * docs/manual/appendix-programs.xml:
++ * docs/manual/appendix-quotes.xml:
++ * docs/manual/autoplugging.xml:
++ * docs/manual/basics-bins.xml:
++ * docs/manual/basics-data.xml:
++ * docs/manual/basics-elements.xml:
++ * docs/manual/basics-helloworld.xml:
++ * docs/manual/basics-init.xml:
++ * docs/manual/basics-pads.xml:
++ * docs/manual/basics-plugins.xml:
++ * docs/manual/bins-api.xml:
++ * docs/manual/bins.xml:
++ * docs/manual/buffers-api.xml:
++ * docs/manual/buffers.xml:
++ * docs/manual/clocks.xml:
++ * docs/manual/components.xml:
++ * docs/manual/cothreads.xml:
++ * docs/manual/debugging.xml:
++ * docs/manual/dparams-app.xml:
++ * docs/manual/dynamic.xml:
++ * docs/manual/elements-api.xml:
++ * docs/manual/elements.xml:
++ * docs/manual/factories.xml:
++ * docs/manual/gnome.xml:
++ * docs/manual/goals.xml:
++ * docs/manual/helloworld.xml:
++ * docs/manual/helloworld2.xml:
++ * docs/manual/highlevel-components.xml:
++ * docs/manual/highlevel-xml.xml:
++ * docs/manual/init-api.xml:
++ * docs/manual/intro-basics.xml:
++ * docs/manual/intro-motivation.xml:
++ * docs/manual/intro-preface.xml:
++ * docs/manual/intro.xml:
++ * docs/manual/links-api.xml:
++ * docs/manual/links.xml:
++ * docs/manual/manual.xml:
++ * docs/manual/motivation.xml:
++ * docs/manual/pads-api.xml:
++ * docs/manual/pads.xml:
++ * docs/manual/plugins-api.xml:
++ * docs/manual/plugins.xml:
++ * docs/manual/programs.xml:
++ * docs/manual/queues.xml:
++ * docs/manual/quotes.xml:
++ * docs/manual/schedulers.xml:
++ * docs/manual/states-api.xml:
++ * docs/manual/states.xml:
++ * docs/manual/threads.xml:
++ * docs/manual/typedetection.xml:
++ * docs/manual/win32.xml:
++ * docs/manual/xml.xml:
++ Try 2. This time, include a short preface as a "general
++ introduction", also add code blocks around all code samples
++ so they get compiled. We still need a way to tell readers
++ the filename of the code sample. In some cases, don't show
++ all code in the documentation, but do include it in the generated
++ code. This allows for focussing on specific bits in the docs,
++ while still having a full test application available.
++ * examples/manual/Makefile.am:
++ Fix up examples for new ADM. Add several of the new examples that
++ were either added or were missing from the build system.
++ * examples/manual/extract.pl:
++ Allow nameless blocks.
++
++2004-12-15 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/manual/elements-api.xml:
++ * docs/manual/helloworld.xml:
++ * examples/manual/extract.pl:
++ fix last example. Add example of adding code blocks that are not
++ shown in docbook output.
++
++2004-12-15 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/manual/dynamic.xml:
++ * docs/manual/elements-api.xml:
++ * docs/manual/gnome.xml:
++ * docs/manual/helloworld2.xml:
++ * docs/manual/init-api.xml:
++ * docs/manual/queues.xml:
++ * docs/manual/threads.xml:
++ * docs/manual/xml.xml:
++ * examples/manual/extract.pl:
++ Make it possible to extract example code from separate blocks.
++ Should make Ronald happy.
++
++2004-12-15 Wim Taymans <wim@fluendo.com>
++
++ * gst/schedulers/gstoptimalscheduler.c: (add_to_group),
++ (remove_from_group), (group_elements_set_visited),
++ (normalize_group), (gst_opt_scheduler_iterate):
++ Fix bug where a flag was not updated on a decoupled entry point
++ because we were just checking the group element list and decoupled
++ elements are not in that list..
++
++2004-12-15 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/manual/advanced-autoplugging.xml:
++ * docs/manual/advanced-clocks.xml:
++ * docs/manual/advanced-dparams.xml:
++ * docs/manual/advanced-interfaces.xml:
++ * docs/manual/advanced-metadata.xml:
++ * docs/manual/advanced-position.xml:
++ * docs/manual/advanced-schedulers.xml:
++ * docs/manual/advanced-threads.xml:
++ * docs/manual/appendix-debugging.xml:
++ * docs/manual/appendix-gnome.xml:
++ * docs/manual/appendix-programs.xml:
++ * docs/manual/appendix-quotes.xml:
++ * docs/manual/appendix-win32.xml:
++ * docs/manual/autoplugging.xml:
++ * docs/manual/basics-bins.xml:
++ * docs/manual/basics-data.xml:
++ * docs/manual/basics-elements.xml:
++ * docs/manual/basics-helloworld.xml:
++ * docs/manual/basics-init.xml:
++ * docs/manual/basics-pads.xml:
++ * docs/manual/basics-plugins.xml:
++ * docs/manual/bins-api.xml:
++ * docs/manual/bins.xml:
++ * docs/manual/buffers-api.xml:
++ * docs/manual/buffers.xml:
++ * docs/manual/clocks.xml:
++ * docs/manual/components.xml:
++ * docs/manual/cothreads.xml:
++ * docs/manual/debugging.xml:
++ * docs/manual/dparams-app.xml:
++ * docs/manual/dynamic.xml:
++ * docs/manual/elements-api.xml:
++ * docs/manual/elements.xml:
++ * docs/manual/factories.xml:
++ * docs/manual/gnome.xml:
++ * docs/manual/goals.xml:
++ * docs/manual/helloworld.xml:
++ * docs/manual/helloworld2.xml:
++ * docs/manual/highlevel-components.xml:
++ * docs/manual/highlevel-xml.xml:
++ * docs/manual/init-api.xml:
++ * docs/manual/intro-motivation.xml:
++ * docs/manual/intro-preface.xml:
++ * docs/manual/intro.xml:
++ * docs/manual/links-api.xml:
++ * docs/manual/links.xml:
++ * docs/manual/manual.xml:
++ * docs/manual/motivation.xml:
++ * docs/manual/pads-api.xml:
++ * docs/manual/pads.xml:
++ * docs/manual/plugins-api.xml:
++ * docs/manual/plugins.xml:
++ * docs/manual/programs.xml:
++ * docs/manual/queues.xml:
++ * docs/manual/quotes.xml:
++ * docs/manual/schedulers.xml:
++ * docs/manual/states-api.xml:
++ * docs/manual/states.xml:
++ * docs/manual/threads.xml:
++ * docs/manual/typedetection.xml:
++ * docs/manual/win32.xml:
++ * docs/manual/xml.xml:
++ First try at rewriting the ADM. Needs lotsamore work, but some
++ parts might already be somewhat useful.
++ * docs/pwg/advanced-interfaces.xml:
++ Remove properties interface, it never actually existed (except for
++ on my HD...).
++
++2004-12-13 David Schleef <ds@schleef.org>
++
++ * gst/gstpad.c: (gst_pad_set_explicit_caps): Allow caps to
++ be NULL (bug #160220).
++
++2004-12-13 David Schleef <ds@schleef.org>
++
++ * configure.ac: remove all mmx stuff, because it's not used.
++ * docs/random/ds/0.9-suggested-changes: additional notes
++ * include/Makefile.am: we don't use these anymore
++ * include/mmx.h: remove
++ * include/sse.h: remove
++
++2004-12-13 Stephane Loeuillet <stephane.loeuillet@tiscali.fr>
++
++ * docs/random/mimetypes:
++ Add FOURCC code for h264 codec (VSSH)
++ Add alternate FOURCC codes for h263 related codecs
++
++2004-12-10 Stefan Kost <ensonic@users.sf.net>
++
++ * docs/manual/programs.xml:
++ Added more gst-launch examples.
++
++2004-12-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstqueue.c: (gst_queue_handle_src_query):
++ Check for availability again.
++
++2004-12-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstcaps.c: (gst_caps_compare_structures):
++ Simple caps go first. This has the nice side-effect of fixing an
++ obscure warning.
++
++2004-12-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstversion.h.in:
++ Protect header.
++
++2004-12-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/schedulers/gstoptimalscheduler.c:
++ (gst_opt_scheduler_schedule_run_queue), (schedule_chain),
++ (gst_opt_scheduler_get_wrapper):
++ When we're recursing into a chain run, only run the directly
++ related group, not all queued ones. This will fix a possible
++ deadlock in chains with more than two groups.
++
++2004-12-08 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * autogen.sh:
++ remove patch if autopoint fails
++
++2004-12-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/gst/gstreamer-sections.txt:
++ Document Thomas' addition, fix build, make Luis the sheriff happy.
++
++2004-12-07 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstplugin.c:
++ * gst/gstplugin.h:
++ add accessor for version field
++
++2004-12-06 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ submitted by: Luca Ferretti <elle.uca@infinito.it>
++
++ * po/LINGUAS:
++ * po/it.po:
++ New tranlation added: Italian
++
++2004-12-03 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstpad.c: (gst_pad_is_negotiated),
++ (gst_pad_get_negotiated_caps):
++ GST_RPAD_* will only operate on a RealPad (it casts the pointer,
++ it doesn't actually check the contents), so be sure to hand it
++ a RealPad else we'll crash.
++
++2004-12-03 Wim Taymans <wim@fluendo.com>
++
++ * gst/gstqueue.c: (gst_queue_init), (gst_queue_getcaps),
++ (gst_queue_link), (gst_queue_handle_src_query):
++ Reverted to 1.110 until this makes the testsuite and various
++ apps work.
++
++2004-12-01 Christian Fredrik Kalager Schaller <christian@fluendo.com>
++
++ * docs/upload.mak: fix included CVS conflict strings
++
++2004-12-01 William Jon McCann <mccann@jhu.edu>
++
++ Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstelement.c: (gst_element_error_full):
++ Use g_error_new_literal because error text may have
++ percentage signs in it. Fixes #160019.
++
++2004-12-01 Benjamin Otte <otte@gnome.org>
++
++ * gst/elements/gstbufferstore.c:
++ (gst_buffer_store_add_buffer_func):
++ don't try to make subbuffers bigger than they can be. (fixes
++ #159970)
++
++2004-11-29 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/gstvalue.sgml:
++ Add new function to docs to fix build.
++
++2004-11-29 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstcaps.c: (gst_caps_is_fixed_foreach):
++ * gst/gstpad.c: (_gst_pad_default_fixate_value),
++ (_gst_pad_default_fixate_foreach):
++ * gst/gstvalue.c: (gst_type_is_fixed), (gst_value_is_fixed):
++ * gst/gstvalue.h:
++ Deprecate _type_is_fixed, use _value_is_fixed instead, since
++ in some cases (arrays), the fixedness depends on the content.
++ * gst/gstqueue.c: (gst_queue_handle_src_query):
++ Check for availability before doing something.
++
++2004-11-29 Wim Taymans <wim@fluendo.com>
++
++ * testsuite/threads/Makefile.am:
++ * testsuite/threads/signals.c: (gst_test_get_type),
++ (gst_test_class_init), (gst_test_init), (gst_test_dispose),
++ (gst_test_set_property), (gst_test_get_property),
++ (gst_test_do_signal1), (signal2_handler), (gst_test_do_signal2),
++ (gst_test_do_prop), (run_thread), (main):
++ Added a bunch of testcases that show threadsafety bugs in glib.
++
++2004-11-29 Stefan Kost <ensonic@users.sf.net>
++
++ * docs/manual/programs.xml:
++ Added a first batch of gst-launch examples, as provided by Ronald
++ and others from the devel-mlist
++
++2004-11-28 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstelement.c: (gst_element_negotiate_pads):
++ simplify
++ * gst/gstvalue.c: (gst_string_wrap), (gst_string_unwrap),
++ (gst_value_serialize_string), (gst_value_deserialize_string):
++ add unwrapping of previously wrapped strings. Fix bug in wrapping
++ while at it.
++ * testsuite/caps/value_serialize.c: (test1),
++ (test_string_serialization), (test_string_deserialization), (main):
++ add tests for string (de)serialization
++
++2004-11-26 Wim Taymans <wim@fluendo.com>
++
++ * testsuite/threads/159566.c: (object_deep_notify), (main):
++ * testsuite/threads/Makefile.am:
++ Added testsuite to show bug #159566
++
++2004-11-25 Wim Taymans <wim@fluendo.com>
++
++ * gst/gstthread.c: (gst_thread_dispose), (gst_thread_change_state),
++ (gst_thread_child_state_change), (gst_thread_main_loop):
++ Ref the thread object in the GThread mainloop. Break out of the
++ thread mainloop if it holds the last ref. This properly exits
++ the threads when disposing the thread from its own context. It
++ also avoids possible deadlocks in the dispose function.
++
++2004-11-24 Martin Soto <martinsoto@users.sourceforge.net>
++
++ * gst/gstqueue.c (gst_queue_link_sink): Grab the lock only when
++ it is necessary to wait.
++
++2004-11-24 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/building-boiler.xml:
++ Make description somewhat clearer.
++
++2004-11-23 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/upload.mak:
++ Apparently docs changed location on FDO's server.
++
++2004-11-23 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/appendix-checklist.xml:
++ Add some random notes on things to check when writing an element.
++ This list can be extended as people see fit.
++
++2004-11-23 Martin Soto <martinsoto@users.sourceforge.net>
++
++ * gst/gstqueue.c (gst_queue_init, gst_queue_link_sink)
++ (gst_queue_link_src): Allow for renegotiating the caps of the sink
++ pad. The queue will now wait until it is empty and forward the new
++ caps to the source.
++ * gst/gstbin.c (gst_bin_set_element_sched)
++ (gst_bin_unset_element_sched): Make sure that all elements and
++ links are registered and unregistered with the scheduler exactly
++ once. This elaborates on a fix by Benjamin Otte, but
++ guarantees that decoupled elements are also registered.
++
++2004-11-11 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/manual/quotes.xml:
++ add a quote
++ * configure.ac:
++ * gst/gst.c:
++ * gst/gstinfo.c:
++ add LIBDIR and move init message higher up so it's at the start
++
++2004-11-08 Christian Fredrik Kalager Schaller <christian@fluendo.com>
++
++ * gst/schedulers/Makefile.am: fix disted build fair by including .h file
++ * gstreamer.spec.in: add fair
++
++2004-11-08 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/elements/gstfakesink.c: (gst_fakesink_class_init):
++ * gst/elements/gstidentity.c: (gst_identity_class_init):
++ Use G_SIGNAL_TYPE_STATIC_SCOPE, patch by Christophe Fergeau
++ <teuf@gnome.org> (#157263).
++ * gst/elements/gsttypefindelement.c: (gst_type_find_element_init),
++ (gst_type_find_handle_src_query):
++ Subtract size of internally stored data from position queries.
++
++2004-11-07 Martin Soto <martinsoto@users.sourceforge.net>
++
++ * gst/schedulers/fairscheduler.c:
++ * gst/schedulers/faircothreads.c:
++ * gst/schedulers/faircothreads.h:
++ New cothread based scheduler: Fair scheduler.
++ * gst/schedulers/gthread-cothreads.h:
++ Add the standard #if around the whole file.
++ Defining symbol GTHREAD_COTHREADS_NO_DEFINITIONS will now prevent
++ compilation of the functions defined in this file. This is
++ necessary to be able to use this file as a normal header.
++ * gst/schedulers/Makefile.am: Add compiling support for fair
++ scheduler.
++ * docs/gst/Makefile.am (IGNORE_HFILES): Exclude internal fair
++ scheduler cothreads layer from documentation generation.
++
++2004-11-07 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/autoplug/gstspideridentity.c:
++ (gst_spider_identity_sink_loop_type_finding):
++ Don't crash if that function is not implemented.
++
++2004-11-06 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced-types.xml:
++ Another typo.
++
++2004-11-06 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/intro-preface.xml:
++ Hm, ok, so the brackets weren't really useful...
++ * docs/pwg/other-ntoone.xml:
++ Fix embarassing typo.
++
++2004-11-06 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/intro-preface.xml:
++ Rewrite preface.
++
++2004-11-06 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced-scheduling.xml:
++ * docs/pwg/advanced-tagging.xml:
++ * docs/pwg/advanced-types.xml:
++ * docs/pwg/building-boiler.xml:
++ * docs/pwg/building-chainfn.xml:
++ * docs/pwg/building-signals.xml:
++ * docs/pwg/building-state.xml:
++ * docs/pwg/building-testapp.xml:
++ * docs/pwg/intro-basics.xml:
++ * docs/pwg/other-manager.xml:
++ * docs/pwg/other-source.xml:
++ Typo fixes.
++ * docs/pwg/other-manager.xml:
++ Add some first content. No example code yet.
++ * gst/elements/gstfilesink.c: (gst_filesink_handle_event):
++ Remove double newlines.
++
++2004-11-04 Wim Taymans <wim@fluendo.com>
++
++ * gst/schedulers/gstoptimalscheduler.c: (add_to_group),
++ (remove_from_group), (normalize_group), (group_migrate_connected),
++ (gst_opt_scheduler_iterate):
++ * testsuite/schedulers/.cvsignore:
++ * testsuite/schedulers/Makefile.am:
++ * testsuite/schedulers/queue_link.c: (main):
++ Added testcase for scheduler segfault.
++ Fix scheduler segfault when removing a decoupled
++ entry point as the last element from a group.
++
++2004-11-03 Christophe Fergeau <teuf@gnome.org>
++
++ * gst/gstmarshal.list: add missing marshaller, fixes build
++
++2004-11-03 Christophe Fergeau <teuf@gnome.org>
++
++ * docs/random/signal: added notes about using BOXED for GstBuffer
++ signal marshallers, not POINTER
++
++2004-11-03 Christophe Fergeau <teuf@gnome.org>
++
++ * gst/elements/gstfakesink.c: (gst_fakesink_class_init):
++ * gst/elements/gstfakesrc.c: (gst_fakesrc_class_init): more
++ POINTER=>BOXED changes to marshal GstBuffers
++
++2004-11-03 Christophe Fergeau <teuf@gnome.org>
++
++ * gst/elements/gstidentity.c: (gst_identity_class_init): GstBuffer is
++ a boxed type, marshal the signal with VOID__BOXED, not VOID__POINTER
++
++2004-11-03 Stefan Kost <ensonic@users.sf.net>
++
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/gstcaps.sgml:
++ * docs/gst/tmpl/gsterror.sgml:
++ * docs/gst/tmpl/gstinfo.sgml:
++ * docs/gst/tmpl/gstmacros.sgml:
++ * docs/gst/tmpl/gstutils.sgml:
++ * docs/random/ensonic/interfaces.txt:
++ * gst/gstinfo.h:
++ added some more docs, removed two obsolete defines
++
++2004-11-02 Kjartan Maraas <as at gnome.org>
++
++ reviewed by: Wim Taymans, Ronald Bultje.
++
++ * gst/cothreads.c: (cothread_create):
++ * gst/gstbin.c: (gst_bin_add_func), (gst_bin_remove_func),
++ (gst_bin_child_state_change_func):
++ * gst/gstbuffer.c: (gst_buffer_span):
++ * gst/gstelement.c: (gst_element_get_index),
++ (gst_element_get_event_masks), (gst_element_get_query_types),
++ (gst_element_get_formats):
++ * gst/gsterror.c: (_gst_core_errors_init),
++ (_gst_library_errors_init), (_gst_resource_errors_init),
++ (_gst_stream_errors_init):
++ * gst/gstobject.c: (gst_object_default_deep_notify):
++ * gst/gstpad.c: (gst_pad_get_event_masks),
++ (gst_pad_get_internal_links_default):
++ * gst/gstplugin.c: (gst_plugin_register_func),
++ (gst_plugin_get_module):
++ * gst/gststructure.c: (gst_structure_get_string),
++ (gst_structure_get_abbrs), (gst_structure_from_abbr),
++ (gst_structure_to_abbr):
++ * gst/gstutils.c: (gst_print_element_args):
++ * gst/schedulers/gstoptimalscheduler.c: (add_to_group),
++ (setup_group_scheduler), (gst_opt_scheduler_iterate):
++ Aplied part of patch #157127: Cleanup of issues reported by
++ sparse.
++ Also do not try to use cothreads when there is no cothread
++ context yet.
++
++2004-11-02 Sebastien Cote <sc5 at hermes.usherb.ca>
++
++ * gst/schedulers/gstoptimalscheduler.c: (add_to_group),
++ (gst_opt_scheduler_iterate):
++ Applied patch #154061. Running a pipeline in which an element
++ calls GST_ELEMENT_ERROR in the chain function, the opt
++ scheduler doesn't unref the chain so it never gets freed.
++
++2004-11-02 Wim Taymans <wim@fluendo.com>
++
++ * gst/gststructure.c: (gst_structure_get_abbrs),
++ (gst_structure_from_abbr), (gst_structure_to_abbr):
++ Remove that ugly if-then thing in the code that converts
++ between strings and types.
++
++2004-11-02 Wim Taymans <wim@fluendo.com>
++
++ * gst/gstscheduler.c: (gst_scheduler_add_element),
++ (gst_scheduler_remove_element), (gst_scheduler_state_transition):
++ Aplied clock distribution patch, this should fix bug
++ #148787.
++
++2004-10-27 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ Submitted by: Kjartan Maraas <kmaraas@broadpark.no>
++
++ * po/LINGUAS:
++ * po/nb.po:
++ Added Norwegian Bokmaal translation
++
++2004-10-22 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * tools/gst-inspect.c: (print_signal_info):
++ print signal arguments as pointers if they are
++
++2004-10-22 Stefan Kost <ensonic@users.sf.net>
++
++ * docs/pwg/building-boiler.xml:
++ exchanged GTK_ macros with G_TYPE macros (as pointed out by mathrick)
++
++2004-10-19 Wim Taymans <wim at fluendo dot com>
++
++ * gst/parse/parse.l:
++ * testsuite/parse/parse1.c: (main):
++ Since parse can do 'element name=a:b' make 'a:b.' work as
++ well.
++ Added testcase to verify fix.
++
++2004-10-19 Wim Taymans <wim at fluendo dot com>
++
++ * tools/gst-inspect.c: (print_pad_info), (print_plugin_features):
++ Use the realpad when printing the direction.
++ Add extra \n when printing extensions of typefind factories.
++
++2004-10-13 David Schleef <ds@schleef.org>
++
++ * examples/manual/Makefile.am: $< isn't portable in Makefile
++ rules.
++
++2004-10-13 Stefan Kost <ensonic@users.sf.net>
++
++ * docs/gst/tmpl/gstobject.sgml:
++ * docs/gst/tmpl/gstplugin.sgml:
++ * docs/gst/tmpl/gstpluginfeature.sgml:
++ * docs/gst/tmpl/gstregistry.sgml:
++ * docs/gst/tmpl/gstversion.sgml:
++ * gst/gstbin.c:
++ more api documentation
++ * gst/gstplugin.c: (gst_plugin_register_func),
++ (gst_plugin_check_file), (gst_plugin_load_file):
++ better error signaling and logging
++
++2004-10-11 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstqueue.c: (gst_queue_init), (gst_queue_handle_src_query):
++ Subtract current queue contents from position queries.
++
++2004-10-11 Johan Dahlin <johan@gnome.org>
++
++ * gst/gsturi.c (gst_uri_get_location): unescape string
++ (gst_uri_construct): escape string.
++
++2004-10-11 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstpad.c: (gst_pad_renegotiate), (gst_pad_try_set_caps),
++ (gst_pad_try_set_caps_nonfixed):
++ allow renegotiation of unconnected pads (as inside spider). Simply
++ return OK if unconnected - mimic try_set_caps there.
++
++2004-10-09 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstbin.c: (gst_bin_sync_children_state):
++ Add missing break.
++
++2004-10-09 Zaheer Abbas Merali <zaheerabbas at merali dot org>
++
++ * gst/elements/gstfakesrc.c: (gst_fakesrc_get):
++ Set element to EOS before sending EOS event
++
++2004-10-08 Wim Taymans <wim at fluendo dot com>
++
++ * gst/elements/gsttypefindelement.c:
++ (gst_type_find_element_handle_event):
++ Handle EOS events when doing the transition from
++ typefind to data passing. This should fix the
++ infinite loops in short files.
++
++2004-10-07 Wim Taymans <wim at fluendo dot com>
++
++ * gst/gstthread.c: (gst_thread_change_state),
++ (gst_thread_child_state_change):
++ Make sure no iteration happens while performing
++ the state change as it could mess up the internal
++ consistency of the thread state.
++
++2004-10-07 Wim Taymans <wim at fluendo dot com>
++
++ * gst/gstthread.c: (gst_thread_dispose), (gst_thread_sync),
++ (gst_thread_change_state), (gst_thread_child_state_change):
++ Do not try to grab the iterate lock in the state change method
++ when we are in the same thread as the iterate or else we
++ could deadlock. Some other cleanups.
++
++2004-10-06 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ bump nano to cvs
++
++=== release 0.8.7 ===
++
++2004-10-06 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ * NEWS:
++ * RELEASE:
++ * configure.ac:
++ releasing 0.8.7, "A Cruise"
++
++2004-10-06 Stephane Loeuillet <stephane.loeuillet@tiscali.fr>
++
++ * docs/random/mimetypes:
++ Add an entry for Sony ATRAC3 audio format with mime-type
++ used by rmdemux et riff-read
++
++2004-10-06 Wim Taymans <wim at fluendo dot com>
++
++ * gst/elements/gsttypefindelement.c: (stop_typefinding):
++ Push the buffer store instead of clearing it in case that
++ the stream is not seekable.
++
++2004-10-06 Wim Taymans <wim at fluendo dot com>
++
++ * gst/gstthread.c: (gst_thread_init), (gst_thread_change_state),
++ (gst_thread_main_loop):
++ Lock the iteration and the state change so that automatic
++ negotiation and fixation does not happen at the same time
++ as the in stream negotiation.
++
++2004-10-05 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ bump nano to cvs
++
++=== release 0.8.6 ===
++
++2004-10-05 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ * NEWS:
++ * RELEASE:
++ * configure.ac:
++ releasing 0.8.6, "Narc"
++
++2004-10-05 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ prerel bump
++
++2004-10-05 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ patch by: Steve Lhomme
++
++ * gst/elements/gstfakesrc.c:
++ * gst/elements/gstidentity.c:
++ * gst/gstthread.c:
++ Fix for #153881
++
++2004-10-01 Wim Taymans <wim at fluendo dot com>
++
++ * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_crc):
++ Fix threadsafety of the crc checking function.
++
++2004-09-26 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ patch by: Ronald Bultje
++
++ * gst/elements/gsttypefindelement.c: (stop_typefinding),
++ (gst_type_find_element_handle_event),
++ (gst_type_find_element_chain):
++ * gst/elements/gsttypefindelement.h:
++ #153657.
++ Filter out discont event from seekable sources when typefind
++ asks them to seek. Fixes typefind with demuxers for
++ avi, asf and matroska.
++
++2004-09-26 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/gstreamer-sections.txt:
++ * gst/gstcaps.c:
++ * gst/gstcaps.h:
++ * gst/gstpad.c:
++ Revert preferred caps: (#147789)
++
++2004-09-19 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/dirent.c:
++ fix a memory leak
++
++2004-09-10 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ bump for prerelease
++
++2004-09-09 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/Makefile.am:
++ * docs/manual/elements-api.xml:
++ restructure so that common stuff is shown first
++ * docs/manual/init-api.xml:
++ convert to examples
++ * docs/manual/manual.xml:
++ * docs/manuals.mak:
++ * docs/url.entities:
++ link to API on the website, possibly override later in build
++ * examples/manual/.cvsignore:
++ ignore more
++ * examples/manual/Makefile.am:
++ add more examples
++ * examples/manual/extract.pl:
++ error out on failure
++
++2004-09-08 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/tmpl/gstthread.sgml:
++ * docs/manual/init-api.xml:
++ * examples/manual/Makefile.am:
++ convert two code bits to examples
++
++2004-09-06 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstelement.c: (gst_element_change_state):
++ Well, actually, I was about to remove this insane assert when
++ I noticed Wim already did that. A warning is nice so we can
++ fix actual ugs (using --g-fatal-warnings and backtraces), so
++ I added that instead.
++
++2004-09-06 Wim Taymans <wim@fluendo.com>
++
++ * gst/gstelement.c: (gst_element_threadsafe_properties_pre_run),
++ (gst_element_threadsafe_properties_post_run),
++ (gst_element_set_state), (gst_element_change_state):
++ Added extra refcounting around various places.
++
++2004-09-06 Wim Taymans <wim@fluendo.com>
++
++ * gst/gstpad.c: (gst_pad_link_call_link_functions):
++ Fix debug info.
++
++2004-09-06 Wim Taymans <wim@fluendo.com>
++
++ * gst/schedulers/gstoptimalscheduler.c: (add_to_group),
++ (remove_from_group):
++ Some more debug info.
++
++2004-09-03 Wim Taymans <wim@fluendo.com>
++
++ * gst/elements/gstfakesrc.c: (gst_fakesrc_class_init),
++ (gst_fakesrc_init), (gst_fakesrc_set_clock),
++ (gst_fakesrc_set_property), (gst_fakesrc_get_property),
++ (gst_fakesrc_get), (gst_fakesrc_change_state):
++ * gst/elements/gstfakesrc.h:
++ * gst/elements/gstidentity.c: (gst_identity_class_init),
++ (gst_identity_init), (gst_identity_chain),
++ (gst_identity_set_property), (gst_identity_get_property),
++ (gst_identity_change_state):
++ * gst/elements/gstidentity.h:
++ Added datarate properties to limit the datarate.
++
++2004-08-25 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/autoplug/gstspider.c: (plugin_init):
++ don't set a rank. We don't want to autoplug by inserting spiders.
++
++2004-08-22 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/autoplug/gstspider.c: (gst_spider_class_init),
++ (gst_spider_identity_plug):
++ add a template for spider's sink
++ * gst/gst.c: (gst_register_core_elements):
++ queue's rank should be NULL, we don't want spider to add it.
++
++2004-08-18 David Schleef <ds@schleef.org>
++
++ * docs/gst/Makefile.am: Remove --ignore-fail-on-non-empty (#150331)
++ * docs/libs/Makefile.am: same
++ * docs/gst/tmpl/gstxml.sgml: Remove GstXMLNs
++ * docs/random/ds/0.9-planning: random additions
++ * docs/random/ds/0.9-suggested-changes: same
++ * gst/gstxml.h: remove vestigal GstXMLNs definition
++
++ Preferred caps: (#147789)
++ * docs/gst/gstreamer-sections.txt: Add symbols
++ * docs/gst/tmpl/gstcaps.sgml: Add symbols
++ * gst/gstcaps.c: (gst_caps_copy), (gst_caps_free),
++ (gst_caps_append), (gst_caps_copy_1), (gst_caps_intersect),
++ (gst_caps_union), (gst_caps_save_thyself), (gst_caps_load_thyself),
++ (gst_caps_get_preferred), (gst_caps_set_preferred),
++ (gst_caps_get_structure_by_id), (gst_caps_prefer_foreach),
++ (gst_caps_use_preferred): Handle caps preferences
++ * gst/gstcaps.h: Add caps preferences
++ * gst/gstpad.c: (gst_pad_link_get_preferred),
++ (gst_pad_link_fixate), (gst_pad_link_call_link_functions),
++ (gst_pad_renegotiate), (gst_pad_guess_preferred),
++ (gst_pad_get_caps), (gst_pad_push): Use caps preferences for
++ negotiation.
++
++2004-08-17 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/autoplug/gstspideridentity.c:
++ (gst_spider_identity_request_new_pad):
++ * gst/elements/gstaggregator.c: (gst_aggregator_base_init),
++ (gst_aggregator_init):
++ * gst/elements/gstfakesink.c: (gst_fakesink_base_init),
++ (gst_fakesink_init):
++ * gst/elements/gstfakesrc.c: (gst_fakesrc_base_init),
++ (gst_fakesrc_init):
++ * gst/elements/gstfdsink.c: (gst_fdsink_base_init),
++ (gst_fdsink_init):
++ * gst/elements/gstfdsrc.c: (gst_fdsrc_base_init), (gst_fdsrc_init):
++ * gst/elements/gstfilesink.c: (gst_filesink_base_init),
++ (gst_filesink_init):
++ * gst/elements/gstfilesrc.c: (gst_filesrc_base_init),
++ (gst_filesrc_init):
++ * gst/elements/gstidentity.c: (gst_identity_base_init),
++ (gst_identity_init):
++ * gst/elements/gstmultifilesrc.c: (gst_multifilesrc_base_init),
++ (gst_multifilesrc_init):
++ * gst/elements/gstpipefilter.c: (gst_pipefilter_base_init),
++ (gst_pipefilter_init):
++ * gst/elements/gststatistics.c: (gst_statistics_base_init),
++ (gst_statistics_init):
++ * gst/elements/gsttee.c: (gst_tee_base_init), (gst_tee_init):
++ * gst/gstqueue.c: (gst_queue_base_init), (gst_queue_init):
++ s/gst_pad_new/&_from_template/
++ register pad templates in the base_init function
++ add static pad template definitions
++
++2004-08-17 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * testsuite/bytestream/gstbstest.c: (gst_bstest_init):
++ * testsuite/dynparams/dparamstest.c: (gst_dptest_init):
++ * testsuite/refcounting/pad.c: (main):
++ * testsuite/refcounting/thread.c: (create_thread_ghostpads):
++ s/gst_pad_new/&_from_template/
++ prepare deprecation of gst_pad_new
++
++2004-08-17 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ patch by: Luca Ognibene <skaboy81@virgilio.it>
++
++ * gst/gstcaps.c:
++ * gst/gstelement.c:
++ * gst/gstpad.c:
++ * gst/gstxml.c:
++ fix memleaks. Fixes #150001
++
++2004-08-17 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * docs/random/ds/0.9-suggested-changes:
++ add notes - mostly about pad templates
++
++2004-08-16 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/GStreamer.vcproj:
++ temporary locale files are .gmo not .mo
++
++2004-08-16 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac: bump nano to cvs
++
++=== release 0.8.5 ===
++
++2004-08-16 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ releasing 0.8.5, "Stuttgart"
++ * NEWS:
++ * RELEASE:
++ * configure.ac:
++ * docs/random/release:
++ updates for release
++
++2004-08-16 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ patch by: Wim Taymans (wim@fluendo.com)
++
++ * gst/gstbuffer.c:
++ * gst/gstindex.h:
++ * libs/gst/dataprotocol/dataprotocol.c:
++ copy KEY_UNIT and DELTA_UNIT flags correctly. Fixes #150242
++
++2004-08-13 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * Makefile.am:
++ * win32/MANIFEST:
++ add win32 dir to the build. Fixes #149981.
++
++2004-08-13 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ bump libtool versioning
++ * gst/gststructure.c:
++ mark function as static
++ * po/af.po:
++ * po/az.po:
++ * po/ca.po:
++ * po/cs.po:
++ * po/en_GB.po:
++ * po/fr.po:
++ * po/nl.po:
++ * po/sq.po:
++ * po/sr.po:
++ * po/sv.po:
++ * po/tr.po:
++ * po/uk.po:
++ translations update
++ * win32/README.txt:
++ trademark protection
++
++2004-08-12 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ fix GST_ORIGIN
++ set GST_PACKAGE to source, and distinguish between release and other
++ * tools/gst-inspect.c:
++ print out plugin an element factory is part of so we see this info
++
++2004-08-12 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/gstbuffer.sgml:
++ * docs/gst/tmpl/gstschedulerfactory.sgml:
++ reorder docs a little, make GstBuffer's more sensible.
++ * gst/gstbuffer.h:
++ API: added GST_BUFFER_FLAG_DELTA_UNIT
++ * gst/gstscheduler.c:
++ comment API addition
++
++2004-08-12 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/elements/gstfilesrc.c: (gst_filesrc_get_mmap):
++ work with non-regular files that can be mmapped (like /dev/zero)
++ * gst/elements/gsttypefindelement.c: (gst_type_find_element_chain):
++ get rid of typefinds that require a seek when we can't seek instead
++ of trying them over and over again
++ * tools/gst-launch.c: (idle_func), (error_cb), (main):
++ return non-zero failure value when the pipeline was interrupted or
++ an error occurred
++
++2004-08-11 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/config.h:
++ * win32/GStreamer.vcproj:
++ compile and install the locales
++
++2004-08-11 Steve Lhomme <steve.lhomme@free.fr>
++
++ * gst/gstvalue.c:
++ fix a possible memory leak under Windows
++
++2004-08-11 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/GStreamer.vcproj:
++ fix a memory leak that occured under Windows
++ * win32/gstreamer.def:
++ add gst_scheduler_register
++
++2004-08-11 Benjamin Otte <otte@gnome.org>
++
++ * docs/gst/gstreamer-sections.txt:
++ * gst/gstscheduler.c: (gst_scheduler_register):
++ * gst/gstscheduler.h:
++ API:
++ add gst_scheduler_register shortcut similar to gst_element_register
++ * gst/schedulers/entryscheduler.c: (plugin_init):
++ * gst/schedulers/gstbasicscheduler.c: (plugin_init):
++ * gst/schedulers/gstoptimalscheduler.c: (plugin_init):
++ use it
++
++2004-08-10 Steve Lhomme <steve.lhomme@free.fr>
++
++ * gst/gstvalue.h:
++ fix a memory leak that occured under Windows
++
++2004-08-10 Colin Walters <walters@redhat.com>
++
++ * gst/registries/gstxmlregistry.c (gst_xml_registry_open_func):
++ Don't use O_EXCL to open temporary registry. It will prevent
++ registry creation if a temporary one already exists, which
++ is unnecessary.
++
++2004-08-09 Steve Lhomme <steve.lhomme@free.fr>
++
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/gstvalue.sgml:
++ remove some valuable stuff from the documentation due to the use of GST_EXPORT
++
++2004-08-09 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/gstbytestream.vcproj:
++ * win32/gstelements.vcproj:
++ * win32/gstgetbits.vcproj:
++ * win32/gst-inspect.vcproj:
++ * win32/gst-launch.vcproj:
++ * win32/gstoptimalscheduler.vcproj:
++ * win32/GStreamer.vcproj:
++ * win32/gst-register.vcproj:
++ * win32/gstspider.vcproj:
++ update the include and lib dirs to fit standard libraries as
++ described in the Win32 manual
++
++2004-08-09 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/config.h:
++ * win32/gstversion.h:
++ enable NLS again, push the version number for the coming 0.8.5 release
++
++2004-08-09 Steve Lhomme <steve.lhomme@free.fr>
++
++ * gst/gstvalue.h:
++ export gst_type_XXX for windows DLLs
++
++2004-08-09 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/faq/gst-uninstalled:
++ fix PKG_CONFIG_PATH and PYTHONPATH
++ * gst/schedulers/Makefile.am:
++ cleanup
++ * libs/gst/bytestream/bytestream.c:
++ remove newline
++ * po/LINGUAS:
++ * po/sq.po:
++ adding Albanian translation (Laurent Dhima)
++ * po/cs.po:
++ updated
++
++2004-08-05 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * po/ca.po:
++ * po/sv.po:
++ updated translations
++
++2004-08-04 Benjamin Otte <otte@gnome.org>
++
++ * tests/mass_elements.c: (main):
++ allow specifying src and sink element explicitly, so I can test
++ videotestsrc instead of fakesrc
++
++2004-08-04 Benjamin Otte <otte@gnome.org>
++
++ * gst/gststructure.c: (gst_structure_id_empty_new_with_size),
++ (gst_structure_id_empty_new), (gst_structure_empty_new),
++ (gst_structure_copy):
++ add gst_structure_id_empty_new_with_size to allow preallocating
++ value array sizes. Use this in gst_structure_copy to get rid of
++ reallocs.
++ don't do quark=>string=>quark when copying structures
++
++2004-08-03 Steve Lhomme <steve.lhomme@free.fr>
++
++ * docs/manual/win32.xml:
++ * win32/README.txt:
++ update documentation with the clean version of dependencies
++
++2004-08-03 Benjamin Otte <otte@gnome.org>
++
++ * gst/schedulers/entryscheduler.c:
++ (gst_entry_scheduler_remove_element):
++ fix for GST_DISABLE_DEBUG
++ * tools/gst-launch.c: (print_tag):
++ fixes for G_DISABLE_ASSERT
++
++2004-08-03 Benjamin Otte <otte@gnome.org>
++
++ * gst/gst.c: (gst_register_core_elements):
++ fix for G_DISABLE_ASSERT
++ * gst/gstinfo.c: (__gst_in_valgrind):
++ add for GST_DISABLE_DEBUG
++
++2004-08-03 Benjamin Otte <otte@gnome.org>
++
++ * gst/parse/parse.l:
++ fix for G_DISABLE_ASSERT
++
++2004-08-03 Wim Taymans <wim@fluendo.com>
++
++ * gst/gstbin.c: (gst_bin_get_type),
++ (gst_bin_child_state_change_func):
++ * gst/gstthread.c: (gst_thread_change_state):
++ Backported some debug logging from a reverted patch
++ Don't try to destroy the thread twice. Added some more
++ debugging in GstThread. Unlock and signal even if we
++ are in the thread context.
++
++2004-08-03 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * po/uk.po:
++ updated translation
++
++2004-07-30 David Schleef <ds@schleef.org>
++
++ * gst/gstatomic_impl.h: Enable atomic code for x86_64
++
++2004-07-29 David Schleef <ds@schleef.org>
++
++ * libs/gst/dataprotocol/dataprotocol-test.c: (conversion_test):
++ Use GST_READ_GUINTxx_BE(), since it accesses unaligned memory.
++
++2004-07-29 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstbin.c: (gst_bin_get_type), (gst_bin_class_init),
++ (gst_bin_add_func), (gst_bin_remove_func),
++ (gst_bin_child_state_change), (gst_bin_child_state_change_func),
++ (set_kid_state_func), (gst_bin_change_state), (gst_bin_set_state),
++ (gst_bin_change_state_norecurse), (gst_bin_dispose),
++ (gst_bin_sync_children_state):
++ * gst/gstbin.h:
++ * gst/gstthread.c: (gst_thread_class_init), (gst_thread_release),
++ (gst_thread_change_state):
++ * testsuite/states/Makefile.am:
++ revert state change patches as agreed so we can rework them
++ gradually
++
++2004-07-29 Benjamin Otte <otte@gnome.org>
++
++ * libs/gst/control/Makefile.am:
++ link to libgstreamer (fixes Debian bug 262019, see
++ http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=262019 )
++
++2004-07-29 Wim Taymans <wim@fluendo.com>
++
++ * testsuite/caps/fraction-convert.c: (check_from_double_convert),
++ (check_from_fraction_convert), (transform_test), (main):
++ Make the test less pedantic about float roundoff errors.
++
++2004-07-29 Benjamin Otte <otte@gnome.org>
++
++ * gst/elements/gstfilesrc.c: (gst_filesrc_open_file),
++ (gst_filesrc_srcpad_event):
++ make seek events to before start/after end of file not fail, but
++ seek to start/end instead
++ * testsuite/caps/fraction-convert.c: (check_from_double_convert):
++ add more output
++
++2004-07-29 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstpad.c: (gst_pad_set_explicit_caps):
++ check that caps are fixed
++ * gst/gstpad.c: (gst_pad_template_new):
++ don't try to simplify caps, costs too much time on gst_init
++ * gst/gstplugin.c: (gst_plugin_add_feature):
++ G_ERROR if features are added twice
++ * gst/gsttypefind.c: (gst_type_find_register):
++ * gst/gstelementfactory.c: (gst_element_register):
++ don't add features twice
++ * docs/random/ds/0.9-suggested-changes:
++ add note about possible gst_init optimization
++
++2004-07-28 David Schleef <ds@schleef.org>
++
++ * testsuite/elements/Makefile.am:
++ * testsuite/elements/struct_i386.h:
++ * testsuite/elements/struct_size.c: (main): A little test
++ to keep distcheck from working if someone changes a structure
++ size accidentally.
++
++2004-07-28 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/libs/Makefile.am:
++ * docs/libs/gstreamer-libs-docs.sgml:
++ * docs/libs/gstreamer-libs-sections.txt:
++ * docs/libs/tmpl/gstbytestream.sgml:
++ * docs/libs/tmpl/gstcontrol.sgml:
++ * docs/libs/tmpl/gstdataprotocol.sgml:
++ * docs/libs/tmpl/gstgetbits.sgml:
++ * libs/gst/bytestream/Makefile.am:
++ * libs/gst/bytestream/bytestream.c:
++ * libs/gst/bytestream/bytestream.h:
++ * libs/gst/control/Makefile.am:
++ * libs/gst/dataprotocol/Makefile.am:
++ * libs/gst/getbits/Makefile.am:
++ * libs/gst/getbits/getbits.h:
++ various doc and style fixes, adding bytestream to libs docs.
++
++2004-07-28 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/gstreamer-docs.sgml:
++ * docs/libs/Makefile.am:
++ * docs/libs/gstreamer-libs-docs.sgml:
++ * docs/libs/gstreamer-libs-sections.txt:
++ * libs/gst/control/dparam.c:
++ more doc fixes. gst-libs docs now build the same way as gst.
++
++2004-07-28 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ * testsuite/Makefile.am:
++ * testsuite/bins/Makefile.am:
++ * testsuite/caps/Makefile.am:
++ * testsuite/cleanup/Makefile.am:
++ * testsuite/clock/Makefile.am:
++ * testsuite/debug/Makefile.am:
++ * testsuite/dlopen/Makefile.am:
++ * testsuite/dynparams/Makefile.am:
++ * testsuite/elements/.cvsignore:
++ * testsuite/elements/Makefile.am:
++ * testsuite/enumcaps/Makefile.am:
++ * testsuite/enumcaps/enumcaps.c:
++ * testsuite/ghostpads/Makefile.am:
++ * testsuite/indexers/Makefile.am:
++ * testsuite/negotiation/Makefile.am:
++ * testsuite/parse/Makefile.am:
++ * testsuite/plugin/Makefile.am:
++ * testsuite/refcounting/Makefile.am:
++ * testsuite/schedulers/.cvsignore:
++ * testsuite/states/Makefile.am:
++ * testsuite/tags/Makefile.am:
++ * testsuite/threads/Makefile.am:
++ fold enumcaps into caps dir
++ clean up Makefile.am's for testsuite
++
++2004-07-28 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/Makefile.am:
++ * docs/libs/Makefile.am:
++ clean up docs build. Fixes needless rebuilding of template files.
++
++2004-07-28 Wim Taymans <wim@fluendo.com>
++
++ * gst/gstbin.c: (set_kid_state_func), (gst_bin_set_state):
++ * gst/gstthread.c: (gst_thread_release), (gst_thread_set_state):
++ Make sure that a bin state change tries to keep the children
++ in sync.
++ Added debug logging to the thread.
++
++2004-07-27 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/GStreamer.vcproj:
++ * win32/gstreamer.def:
++ more exports for the plugins
++
++2004-07-27 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/gstgetbits.vcproj:
++ * win32/gstgetbits.def:
++ * win32/msvc71.sln:
++ add support for the getbits plugin
++
++2004-07-27 Wim Taymans <wim@fluendo.com>
++
++ * gst/gstvalue.c: (gst_value_transform_double_fraction),
++ (gst_value_transform_fraction_double), (_gst_value_initialize):
++ * testsuite/caps/Makefile.am:
++ * testsuite/caps/fraction-convert.c: (check_from_double_convert),
++ (check_from_fraction_convert), (transform_test), (main):
++ Added transform functions between double and fraction.
++ Added testcase to verify transforms
++
++2004-07-26 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/GStreamer.vcproj:
++ rename GStreamer-0.8.lib to libgstreamer.lib
++
++2004-07-26 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/gstelements.vcproj:
++ * win32/gstoptimalscheduler.vcproj:
++ fixes for the Release build
++
++2004-07-26 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/config.h:
++ update the version number
++
++2004-07-26 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/GStreamer.vcproj:
++ add gstinterface to the build
++
++2004-07-26 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/gstreamer.def:
++ add many definitions needed by plugins,
++ GST_CAT_DEFAULT only available in the Debug build ?
++
++2004-07-26 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstelement.c: (gst_element_set_eos_recursive):
++ various whitespace fixes.
++ doc fix, fixes #148497
++
++2004-07-25 Benjamin Otte <otte@gnome.org>
++
++ * gst/autoplug/gstspideridentity.c: (gst_spider_identity_link):
++ don't delay links on the sink elements, it causes unnegotiated
++ links.
++ * gst/elements/gsttypefindelement.c:
++ (gst_type_find_element_base_init):
++ add our padtemplates, we indeed do have some.
++ * gst/elements/gsttypefindelement.c:
++ (gst_type_find_element_handle_event),
++ (gst_type_find_element_chain):
++ don't push data when typefinding failed.
++ * gst/gstpad.c: (gst_pad_link_fixate):
++ check that no fixate function returns empty caps.
++ * gst/gstpad.c: (gst_pad_push):
++ check that the link is negotiated before data gets pushed.
++ * tools/gst-register.c: (main):
++ don't assert (fixes #148283)
++
++2004-07-25 Steve Lhomme <steve.lhomme@free.fr>
++
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/gstconfig.sgml:
++ add GST_PLUGIN_EXPORT definition
++
++2004-07-25 Steve Lhomme <steve.lhomme@free.fr>
++
++ * gst/gstplugin.h:
++ * gst/gstconfig.h.in:
++ * win32/gstconfig.h:
++ * win32/gstelements.def:
++ * win32/gstelements.vcproj:
++ * win32/gstoptimalscheduler.def:
++ * win32/gstoptimalscheduler.vcproj:
++ * win32/gstspider.def:
++ * win32/gstspider.vcproj:
++ remove unused .def files and export symbols using GST_PLUGIN_DEFINE
++
++2004-07-25 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/gstreamer-sections.txt:
++ remove GST_CAT_DEFAULT because the type has changed
++
++2004-07-25 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/gstbytestream.vcproj:
++ * win32/gstelements.vcproj:
++ * win32/gst-inspect.vcproj:
++ * win32/gst-launch.vcproj:
++ * win32/gstoptimalscheduler.vcproj:
++ * win32/GStreamer.vcproj:
++ * win32/gst-register.vcproj:
++ * win32/gstspider.vcproj:
++ * win32/msvc71.sln:
++ Copy the files where needed after building, The testsuite will be
++ built separately
++
++2004-07-25 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/config.h:
++ * win32/README.txt:
++ * docs/manual/win32.xml:
++ Fixed the plugin and GStreamer location
++
++2004-07-24 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/gstreamer.def:
++ More exports for the plugins
++
++2004-07-24 Steve Lhomme <steve.lhomme@free.fr>
++
++ * gst/gstinfo.h:
++ Marc was right, we need to export literally GST_CAT_DEFAULT
++
++2004-07-24 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/config.h:
++ NLS crashes in gettext, disabled until this is solved
++
++2004-07-24 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/gst-inspect.vcproj:
++ * win32/gst-launch.vcproj:
++ Should use NLS when available
++
++2004-07-24 Steve Lhomme <steve.lhomme@free.fr>
++
++ * gst/registries/gstxmlregistry.c:
++ removing the file doesn't seem to be a good idea on Linux
++
++2004-07-24 Steve Lhomme <steve.lhomme@free.fr>
++
++ * gst/registries/gstxmlregistry.c:
++ Remove the registry before renaming the tempfile (needed for Windows)
++
++2004-07-23 Zaheer Abbas Merali <zaheerabbas at merali dot org>
++
++ * gst/elements/gstmultifilesrc.c: (gst_multifilesrc_class_init),
++ (gst_multifilesrc_init), (gst_multifilesrc_set_property),
++ (gst_multifilesrc_get_property), (gst_multifilesrc_get):
++ * gst/elements/gstmultifilesrc.h:
++ Added newmedia property so it generates newmedia events between each
++ file when property is set, as well as fixed eos handling
++
++2004-07-22 David Schleef <ds@schleef.org>
++
++ * gst/gststructure.c: (gst_structure_id_empty_new),
++ (gst_structure_empty_new): Set type field correctly.
++ * gst/gststructure.h: Check type field correctly.
++ * testsuite/caps/Makefile.am:
++ * testsuite/caps/structure.c: (test1), (main): Add a very small
++ test for structures.
++
++2004-07-22 David Schleef <ds@schleef.org>
++
++ * docs/random/ds/0.9-suggested-changes: more comments
++ * tools/gst-launch.c: (idle_func): Fix hard-to-translate string.
++
++2004-07-22 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstelementfactory.c: (gst_element_register):
++ set the factory in the class struct, so gst_element_get_factory
++ actually works
++ * gst/parse/grammar.y:
++ set element to playing when it gets unlocked as we can't rely on the
++ bin state - all elements in the bin state might still be locked in
++ NULL)
++
++2004-07-22 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstelement.c: (gst_element_set_state_func):
++ make this a static function
++
++2004-07-22 Wim Taymans <wim@fluendo.com>
++
++ * gst/schedulers/gstoptimalscheduler.c: (remove_from_group),
++ (gst_opt_scheduler_pad_link):
++ fix 147894-2 and the group_link problem.
++
++2004-07-22 Wim Taymans <wim@fluendo.com>
++
++ * testsuite/schedulers/147894-2.c: (queue_empty), (queue_filled),
++ (handoff_identity), (main):
++ * testsuite/schedulers/147894.c: (queue_empty), (queue_filled),
++ (handoff_identity), (main):
++ * testsuite/schedulers/Makefile.am:
++ * testsuite/schedulers/group_link.c: (main):
++ Show bug in scheduler when linking chain and loop based element
++ where the chain based element was not yet in a group.
++
++2004-07-21 Benjamin Otte <otte@gnome.org>
++
++ * gst/.cvsignore:
++ * gst/autoplug/.cvsignore:
++ * gst/elements/.cvsignore:
++ * gst/indexers/.cvsignore:
++ * libs/gst/bytestream/.cvsignore:
++ * libs/gst/control/.cvsignore:
++ * libs/gst/getbits/.cvsignore:
++ * testsuite/states/.cvsignore:
++ * testsuite/threads/.cvsignore:
++ keep this up to date, since I seem to be the only one who cares
++ about not missing files on commits (editor's note: no you don't,
++ but feel free to change them at the time you add stuff instead
++ of later on)
++
++2004-07-21 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstbin.c: (gst_bin_get_type), (gst_bin_class_init),
++ (gst_bin_fix_state), (gst_bin_add_func), (gst_bin_remove_func),
++ (gst_bin_child_state_change_func), (set_kid_state_func),
++ (gst_bin_set_state), (gst_bin_change_state_norecurse):
++ make state changes work correctly and reentrant (so removing
++ elements from bins during state changes of bins doesn't cause
++ segfaults or even wrong states)
++ add debugging category and debugging output to print children states
++ * gst/gstbin.c: (gst_bin_dispose):
++ add some assertion checks
++ * gst/gstbin.h:
++ * gst/gstbin.c: (gst_bin_sync_children_state):
++ deprecate this function - it just does gst_bin_set_state (bin,
++ GST_STATE (bin))
++ * testsuite/threads/queue.c: (main):
++ don't use gst_bin_sync_children_state anymore
++ * testsuite/states/Makefile.am:
++ * testsuite/states/bin.c:
++ test that the state changes of bins work as expected
++ * gst/gstthread.c: (gst_thread_class_init), (gst_thread_set_state):
++ some adjustments to change states correctly, too
++ * gst/gstthread.c: (gst_thread_change_state):
++ don't enable/disable "threadsafe" properties, they're unused and
++ cause random segfaults
++ * testsuite/threads/Makefile.am:
++ the queue check randomly passes now, ignore it
++
++2004-07-21 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstpad.c:
++ check if data is NULL before outputting debug info. (fixes #145100)
++
++2004-07-21 Benjamin Otte <otte@gnome.org>
++
++ * gst/schedulers/entryscheduler.c:
++ (gst_entry_scheduler_loop_wrapper),
++ (gst_entry_scheduler_chain_wrapper),
++ (gst_entry_scheduler_get_wrapper):
++ reset the state when the cothread starts, so we don't get assertion
++ failures on restarting of cothreads
++
++2004-07-20 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstelement.c: (gst_element_link_pads_filtered):
++ use correct sinkpad, if only sinkpad is specified, but not srcpad
++ (fixes #147889)
++ * gst/gstelement.c: (gst_element_set_state_func),
++ (gst_element_change_state): ref/unref the element, signal handlers
++ could get rid of the element otherwise
++
++2004-07-20 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/random/ds/0.9-suggested-changes:
++ Make note about renaming fixed-list to array.
++ * gst/gstvalue.c: (gst_value_intersect_fixed_list),
++ (_gst_value_initialize):
++ Add array intersections.
++ * testsuite/caps/intersect2.c: (main):
++ Add test for array intersections.
++
++2004-07-20 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac: back to cvs
++
++=== release 0.8.4 ===
++
++2004-07-20 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ releasing 0.8.4, "Paella"
++ bump libtool versioning
++
++2004-07-20 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * po/LINGUAS:
++ * po/ca.po:
++ adding Catalan translation (Jordi Mallach)
++
++2004-07-20 Wim Taymans <wim@fluendo.com>
++
++ * testsuite/schedulers/147894-2.c: (queue_empty), (queue_filled),
++ (handoff_identity), (main):
++ * testsuite/schedulers/147894.c: (queue_empty), (queue_filled),
++ (handoff_identity), (main):
++ * testsuite/schedulers/Makefile.am:
++ Added failing testcase for variant of #147894
++
++2004-07-20 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ patch by: David Moore
++
++ * gst/schedulers/gstoptimalscheduler.c: (group_has_element),
++ (schedule_group), (gst_opt_scheduler_schedule_run_queue),
++ (group_migrate_connected):
++ * testsuite/schedulers/Makefile.am:
++ fix for #142813 (Deadlock in optimal scheduler)
++
++2004-07-20 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ patch by: Wim Taymans
++
++ * gst/schedulers/gstoptimalscheduler.c: (group_has_element),
++ (gst_opt_scheduler_schedule_run_queue),
++ (gst_opt_scheduler_get_wrapper), (get_group),
++ (group_migrate_connected):
++ * testsuite/schedulers/Makefile.am:
++ fix for #147819 (Add some checks in the opt scheduler)
++
++2004-07-20 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ patch by: Benjamin Otte
++
++ * gst/gstelementfactory.c: (__gst_element_details_set):
++ fix for #147929: running gst-register in non-utf8 locale can cause
++ invalid registry
++
++2004-07-20 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ patch by: Wim Taymans
++
++ * gst/schedulers/gstoptimalscheduler.c: (group_num_elements),
++ (group_has_element), (element_get_reachables_func),
++ (group_migrate_connected):
++ fix for #147894 (opt scheduler decoupled elements mismanagement)
++ * testsuite/schedulers/Makefile.am:
++ testsuite app now passes
++
++2004-07-19 Wim Taymans <wim@fluendo.com>
++
++ * testsuite/schedulers/147819.c: (handoff_identity1),
++ (handoff_identity2), (main):
++ * testsuite/schedulers/Makefile.am:
++ Added testcase for bug 147819
++
++2004-07-19 Wim Taymans <wim@fluendo.com>
++
++ * testsuite/schedulers/147894.c: (queue_empty), (queue_filled),
++ (handoff_identity), (main):
++ * testsuite/schedulers/Makefile.am:
++ Added testcase for bug 147894
++
++2004-07-16 Wim Taymans <wim@fluendo.com>
++
++ * testsuite/schedulers/142183-2.c: (handoff_identity), (main):
++ * testsuite/schedulers/142183.c: (handoff_identity), (main):
++ * testsuite/schedulers/Makefile.am:
++ Added testsuite for bug 142183 in its two incarnations. Refcount
++ is not increased for scheduled elements and threadsafe properties
++ mutexes are not properly unlocked.
++
++2004-07-16 Wim Taymans <wim@fluendo.com>
++
++ * gst/schedulers/gstoptimalscheduler.c: (gst_opt_scheduler_init),
++ (create_chain), (destroy_chain), (create_group), (destroy_group),
++ (add_to_group), (merge_groups), (group_elements), (group_inc_link),
++ (group_dec_link), (gst_opt_scheduler_pad_link),
++ (group_inc_links_for_element), (group_migrate_connected):
++ Call group_inc_link with the proper src->sink ordering --
++ break this, and we break sort_chain. patch from wingo for bug
++ 147713.
++ Partially revert patch 1.89. When adding a loop based element to
++ the scheduler, the links to other groups are automatically followed
++ and incremented. This should not happen because the bin will call
++ pad_link explicitly for those connection, resulting in them counted
++ twice. Results in assertion failure on pipeline cleanup.
++
++2004-07-16 Wim Taymans <wim@fluendo.com>
++
++ * testsuite/schedulers/143777-2.c: (main):
++ * testsuite/schedulers/147713.c: (handoff_src), (handoff_sink),
++ (main):
++ * testsuite/schedulers/Makefile.am:
++ Added cleanup code to testcase 143777-2.
++ Added testcase to show bug 147713, does not really show the
++ deadlock as I can't figure out how to trigger it, but it does
++ demonstrate bad ordering in the scheduler.
++
++2004-07-16 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstvalue.c: (gst_value_deserialize_fraction):
++ change strndup to g_strndup. Fixes #147707
++
++2004-07-16 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * po/af.po:
++ * po/az.po:
++ * po/cs.po:
++ * po/en_GB.po:
++ * po/fr.po:
++ * po/nl.po:
++ * po/sr.po:
++ * po/sv.po:
++ * po/tr.po:
++ * po/uk.po:
++ updated translations
++
++2004-07-16 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstvalue.c: (gst_greatest_common_divisor):
++ use ints and return ints, fractions only use ints, too, so this
++ avoids accidently casting multiplications to unsigned
++ (gst_value_lcopy_fraction): it's ints, not uint32
++ (gst_value_set_fraction): disallow minint, multiplying and negation
++ are broken with it
++ (gst_value_fraction_multiply): fix to make large numbers work and get
++ rid of the assumption that the multiplication of two ints fits an
++ int64 - dunno if that's true for all systems
++ * testsuite/caps/Makefile.am:
++ * testsuite/caps/fraction-multiply-and-zero.c:
++ (check_multiplication), (check_equal), (zero_test), (main):
++ add tests for all the stuff above
++ * testsuite/caps/value_compare.c: (test1):
++ fix comment
++ * tests/.cvsignore:
++ * testsuite/caps/.cvsignore:
++ * testsuite/debug/.cvsignore:
++ * testsuite/dlopen/.cvsignore:
++ * testsuite/states/.cvsignore:
++ get up to date
++
++2004-07-16 Zaheer Abbas Merali <zaheerabbas at merali dot org>
++
++ * docs/manual/bins-api.xml:
++ * docs/manual/factories.xml:
++ * docs/manual/helloworld.xml:
++ * docs/manual/links-api.xml:
++ fixes for out of date info, incorrect info and grammar
++
++2004-07-15 Zaheer Abbas Merali <zaheerabbas at merali dot org>
++
++ * docs/manual/pads.xml:
++ * docs/manual/pads-api.xml: grammar fix
++
++2004-07-15 Zaheer Abbas Merali <zaheerabbas at merali dot org>
++
++ * docs/manual/pads-api.xml: typo + grammar fix
++
++2004-07-15 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/gstreamer-sections.txt:
++ add new symbols
++ * docs/gst/tmpl/gstelement.sgml:
++ * docs/gst/tmpl/gstpad.sgml:
++ * docs/gst/tmpl/gsttypes.sgml:
++ * docs/gst/tmpl/gstvalue.sgml:
++ update docs
++ * gst/gststructure.c: (gst_structure_set_valist),
++ (gst_structure_from_abbr), (gst_structure_to_abbr):
++ * gst/gstvalue.c: (gst_value_compare_double), (gst_type_is_fixed),
++ (gst_greatest_common_divisor), (gst_value_init_fraction),
++ (gst_value_copy_fraction), (gst_value_collect_fraction),
++ (gst_value_lcopy_fraction), (gst_value_set_fraction),
++ (gst_value_get_fraction_numerator),
++ (gst_value_get_fraction_denominator),
++ (gst_value_fraction_multiply), (gst_value_serialize_fraction),
++ (gst_value_deserialize_fraction),
++ (gst_value_transform_fraction_string),
++ (gst_value_transform_string_fraction),
++ (gst_value_compare_fraction), (_gst_value_initialize):
++ * gst/gstvalue.h:
++ adding GstFraction GValue type, get/set, and multiply
++ * testsuite/caps/Makefile.am:
++ * testsuite/caps/fraction.c: (test), (main):
++ * testsuite/caps/string-conversions.c: (main):
++ * testsuite/caps/value_compare.c: (test1), (main):
++ add regression tests for GstFraction
++
++2004-07-15 Zaheer Abbas Merali <zaheerabbas at merali dot org>
++
++ * docs/manual/init-api.xml: Grammar fix
++
++2004-07-15 Zaheer Abbas Merali <zaheerabbas at merali dot org>
++
++ * docs/manual/states.xml: Fix inconsistent information
++
++2004-07-15 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstelement.c: (gst_element_set_state):
++ * gst/gstpad.c: (gst_pad_try_set_caps):
++ * gst/gststructure.c:
++ * gst/gstthread.c: (gst_thread_child_state_change):
++ * gst/gstvalue.c: (gst_value_compare_double):
++ * gst/gstvalue.h:
++ * testsuite/parse/parse1.c: (main):
++ debugging additions and style cleanups
++
++2004-07-15 Zaheer Abbas Merali <zaheerabbas at merali dot org>
++
++ * docs/manual/states.xml: Grammar fix
++
++2004-07-15 Zaheer Abbas Merali <zaheerabbas at merali dot org>
++
++ * docs/manual/pads.xml: Grammar fix
++
++2004-07-15 Zaheer Abbas Merali <zaheerabbas at merali dot org>
++
++ * docs/manual/elements.xml: Fixed image reference
++
++2004-07-15 Zaheer Abbas Merali <zaheerabbas at merali dot org>
++
++ * docs/manual/goals.xml: Grammar fix
++
++2004-07-15 Zaheer Abbas Merali <zaheerabbas at merali dot org>
++
++ * docs/manual/motivation.xml:
++ Bonobo is no longer "emerging" and added sentence regarding tcp plugins
++
++2004-07-15 Zaheer Abbas Merali <zaheerabbas at merali dot org>
++
++ * docs/manual/motivation.xml: Fix spelling
++
++2004-07-15 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstelement.h:
++ Don't GST_ERROR_OBJECT empty strings - Solaris doesn't like NULL
++ strings.
++ * gst/gstelement.c (gst_element_class_init):
++ GError's are boxed, not objects
++ * gst/gstmarshal.list:
++ update list for the fixed error signal
++
++2004-07-14 Andy Wingo <wingo@pobox.com>
++
++ * gst/gsttag.c: Add a tag merge func for pointers. The header was
++ there all along, but the function wasn't. (guile-gstreamer's build
++ system uses the address of the function -- I wasn't actually
++ trying to use this.)
++
++2004-07-14 Andy Wingo <wingo@pobox.com>
++
++ * gst/gstpad.c (gst_pad_try_set_caps): Naive link functions (such
++ as gst_pad_proxy_pad_link) just link to every other pad when they
++ are called. In the case where the graph has cycles, this will mean
++ that a call to try_set_caps will recurse. Allow this recursion
++ and return OK, while we wait for the first try_set_caps to give a
++ proper return value.
++ (gst_pad_link_call_link_functions): Since this function is the
++ only one to set the NEGOTIATING flag on a pad, if the flag is set
++ it means that the link functions have indirectly recursed. If this
++ happens, error out to avoid infinite recursion and an eventual
++ SEGV.
++ (gst_real_pad_class_init): Remove a crufty GtkObject comment.
++ (gst_pad_proxy_getcaps): Intersect the result with the template
++ caps to ensure that the return value is valid.
++
++2004-07-14 Andy Wingo <wingo@pobox.com>
++
++ * gst/gstdata.c (gst_data_is_writable): s/>=/>/. If there is only
++ one refcount, the calling function is the owner of the buffer.
++
++2004-07-14 Wim Taymans <wim@fluendo.com>
++
++ * gst/schedulers/gstoptimalscheduler.c: (group_dec_link),
++ (gst_opt_scheduler_pad_link), (group_migrate_connected):
++ Fix stupid warning when an element is to be migrated but
++ is already migrated.
++
++2004-07-14 Wim Taymans <wim@fluendo.com>
++
++ * gst/schedulers/gstoptimalscheduler.c: (group_dec_link),
++ (gst_opt_scheduler_pad_link), (group_migrate_connected):
++ Make sure that a single non-loop-based element does not
++ end up in a group. This fixes the testsuite again.
++
++2004-07-14 Wim Taymans <wim@fluendo.com>
++
++ * gst/schedulers/gstoptimalscheduler.c: (create_group),
++ (add_to_group), (merge_groups), (schedule_group),
++ (gst_opt_scheduler_get_wrapper), (group_elements),
++ (group_dec_link), (gst_opt_scheduler_pad_link),
++ (group_migrate_connected), (gst_opt_scheduler_pad_unlink),
++ (gst_opt_scheduler_iterate):
++ move isolated groups to a new chain.
++ Emit a warning instead of segfaulting in some error cases.
++ Fix a bug where the link count between groups was not calculated
++ correctly. Fixes #144510.
++
++2004-07-13 Steve Lhomme <steve.lhomme@free.fr>
++ * gst/elements/gstfilesrc.c:
++ Binary files support under Windows now OK
++
++2004-07-13 Benjamin Otte <otte@gnome.org>
++
++ compatibility fixes for Solaris 8/gcc 2.95
++ * configure.ac:
++ include libintl libs in LDFLAGS
++ * gstvalue.c (gst_value_deserialize_buffer):
++ cast isxdigit stuff to int to silence compiler warning
++
++2004-07-12 Benjamin Otte <otte@gnome.org>
++
++ * gst/gsttypes.h:
++ get rid of GST_O_READONLY, GST_FILE_MODE_READ and
++ GST_FILE_MODE_WRITE, I don't want them in the exported headers. It
++ just causes support madness
++ * gst/elements/gstfilesrc.c: (gst_filesrc_open_file):
++ make it work without this
++ * gst/indexers/gstfileindex.c: (_file_index_id_save_entries),
++ (gst_file_index_commit):
++ glib IO channels don't want binary mode
++ * testsuite/bytestream/filepadsink.c: (main):
++ * testsuite/bytestream/test1.c: (read_param_file):
++ use "rb" instead of GST_FILE_MODE_READ, it works on POSIX systems
++
++2004-07-12 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstelement.c: (gst_element_class_init),
++ (gst_element_set_state), (gst_element_set_state_func):
++ virutalize gst_element_set_state, use set_state member in class
++ struct that was already added in 0.7 for this.
++ * gst/gstbin.c: (gst_bin_foreach), (set_kid_state_func),
++ (gst_bin_change_state):
++ make gst_bin_foreach works similar to other foreach functions, plug
++ memleaks in it. Make functions using it work with the new approach.
++ Document gst_bin_foreach, so it can be exported if we want to
++ * gst/gstbin.c: (gst_bin_class_init), (gst_bin_set_state):
++ use virtualized set_state to make set_state on bins set the state of
++ all its children.
++
++2004-07-12 Benjamin Otte <otte@gnome.org>
++
++ * configure.ac:
++ require valgrind >= 2.1 (fixes Gentoo bug 53967, see
++ http://bugs.gentoo.org/show_bug.cgi?id=53967)
++ * gst/gstpad.c: (gst_pad_alloc_buffer):
++ allow buffer_alloc functions to return NULL and allocate a normal
++ buffer in that case
++
++2004-07-12 Steve Lhomme <steve.lhomme@free.fr>
++ * gst/elements/gstfilesink.c:
++ * gst/elements/gstfilesrc.c:
++ * gst/indexers/gstfileindex.c:
++ * gst/gsttypes.h:
++ * testsuite/bytestream/filepadsink.c:
++ * testsuite/bytestream/test1.c:
++ Handle binary files under Windows
++
++2004-07-12 Steve Lhomme <steve.lhomme@free.fr>
++ * docs/manual/win32.xml:
++ * win32/config.h:
++ * win32/gst-register.vcproj:
++ * win32/gstreamer.def:
++ Update to another gettext public build
++
++2004-07-12 Steve Lhomme <steve.lhomme@free.fr>
++ * gst/gstplugin.c:
++ Fix an impossible C syntax
++ * win32/config.h:
++ Disable i18n under Windows for the moment
++ * win32/gst-register.vcproj:
++ Use this configuration
++
++2004-07-12 Jan Schmidt <thaytan@mad.scientis.com>
++ * docs/manual/quotes.xml:
++ Keep the quotes file alive
++ * docs/random/ds/0.9-suggested-changes:
++ Add the suggestion of including a 'rowstride' as part of video
++ format caps
++
++2004-07-12 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstelement.c: (gst_element_set_state),
++ (gst_element_change_state):
++ d'oh. Set PENDING state correctly before forcing bin to change.
++ * gst/gststructure.c: (gst_structure_value_get_generic_type),
++ (gst_structure_parse_fixed_list):
++ * gst/schedulers/gstoptimalscheduler.c:
++ (gst_opt_scheduler_state_transition):
++ * testsuite/states/parent.c: (main):
++ remove comment now that it's fixed.
++
++2004-07-11 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstclock.h:
++ GST_SECOND shouldn't cause a conversion to unsigned.
++ * testsuite/clock/.cvsignore:
++ * testsuite/clock/Makefile.am:
++ * testsuite/clock/signedness.c: (main):
++ make sure it never will again
++
++2004-07-11 Andy Wingo <wingo@pobox.com>
++
++ * gst/gstbin.c (gst_bin_add_func): If we're adding an element
++ whose state is higher than the bin state, raise the bin state to
++ ensure that bin state := highest child state.
++
++2004-07-11 Andy Wingo <wingo@pobox.com>
++
++ * gst/gstbin.c (gst_bin_foreach): New static function. Calls a
++ procedure on the children of a bin. Assumes that the procedure can
++ change the set of children.
++ (set_kid_state_func): New static function.
++ (gst_bin_change_state): Use gst_bin_foreach to call
++ set_kid_state_func. Fixes a bug: if a child had a state-change
++ handler that removes it from the bin, there would be a segfault.
++ Hopefully it should also work in the case where the state-change
++ handler on one child adds or removes other children. In any case,
++ fixes should go to gst_bin_foreach.
++
++2004-07-10 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstelement.c: (gst_element_set_state):
++ compatibility fix for latest plugins release. Change loop back
++ to while {}
++
++2004-07-09 Wim Taymans <wim@fluendo.com>
++
++ * gst/gstbin.c: (gst_bin_remove), (gst_bin_dispose):
++ * gst/gstthread.c: (gst_thread_dispose), (gst_thread_catch),
++ (gst_thread_main_loop):
++ Since remove is virtual in GstBin we must not assume the
++ elements GList to have anothing useful.
++ Add some more logging to GstThread and be a bit more paranoid
++ when resetting the scheduler.
++ Set the state of the bin to NULL before removing the children.
++
++2004-07-09 Zaheer Abbas Merali <zaheerabbas at merali dot org>
++
++ * testsuite/threads/Makefile.am:
++ * testsuite/threads/threadg.c:
++ added test to check if problem when removing all elements from a
++ GstThread before setting GstThread state to NULL
++
++2004-07-09 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
++
++ * docs/gst/tmpl/gstelement.sgml:
++ * docs/gst/tmpl/gsttypes.sgml:
++ * gst/gstbin.c: (gst_bin_change_state):
++ * gst/gstelement.c: (gst_element_set_state),
++ (gst_element_change_state):
++ rework so that for bins we try to set the state on all children
++ as well even if the bin is in the correct state already.
++ change while to do so at least one iteration is done.
++ For regular elements, we fall back to the previous behaviour for
++ now since we first need a new plugins release.
++ * testsuite/states/parent.c: (main):
++ test for this case
++ Fixes #123774
++
++2004-07-09 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
++
++ * gst/gstqueue.c: (gst_queue_class_init), (gst_queue_finalize),
++ (gst_queue_chain), (gst_queue_get), (gst_queue_handle_src_event),
++ (gst_queue_release_locks), (gst_queue_change_state),
++ (gst_queue_set_property):
++ add proper lock debugging. Change dispose to finalize, since
++ we're freeing mutexes and other stuff which should happen only once.
++
++2004-07-09 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
++
++ * docs/gst/tmpl/gstelement.sgml:
++ * docs/gst/tmpl/gstplugin.sgml:
++ * docs/gst/tmpl/gsttypes.sgml:
++ * docs/pwg/building-state.xml:
++ * gst/elements/gstfakesrc.c: (gst_fakesrc_change_state):
++ * gst/gstelement.c: (gst_element_change_state):
++ * gst/gstthread.c: (gst_thread_change_state):
++ catch wrong state changes in element base class.
++
++2004-07-09 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
++
++ * gst/gstinfo.h:
++ clean up layout a little.
++
++2004-07-09 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
++
++ * configure.ac:
++ * testsuite/Makefile.am:
++ * testsuite/states/Makefile.am:
++ * testsuite/states/parent.c: (main):
++ re-enable states testsuite dir. Add test for state changes and
++ parent behaviour
++
++2004-07-09 Wim Taymans <wim@fluendo.com>
++
++ * gst/schedulers/gstoptimalscheduler.c:
++ (gst_opt_scheduler_pad_link), (group_elements_set_visited),
++ (element_get_reachables_func), (element_get_reachables),
++ (debug_element), (rechain_group), (group_migrate_connected),
++ (gst_opt_scheduler_pad_unlink):
++ Do not try to migrate decoupled elements to a new group since
++ they are not added to groups.
++
++2004-07-08 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstelement.c: (gst_element_error_func):
++ make reentrant (= allow removing elements in error handler)
++
++2004-07-08 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
++
++ * gst/gstpad.c: (gst_pad_event_default_dispatch),
++ (gst_pad_send_event), (gst_pad_call_chain_function):
++ events sent to elements below PAUSED cannot be handled, so
++ don't try to
++
++2004-07-08 Wim Taymans <wim@fluendo.com>
++
++ * gst/schedulers/gstoptimalscheduler.c:
++ (chain_recursively_migrate_group), (create_group),
++ (schedule_group), (gst_opt_scheduler_pad_link),
++ (group_elements_set_visited), (element_get_reachables_func),
++ (element_get_reachables), (group_can_reach_group), (debug_element),
++ (rechain_group), (group_migrate_connected),
++ (gst_opt_scheduler_pad_unlink):
++ * testsuite/schedulers/Makefile.am:
++ Implemented group splitting and rechaining.
++ Fixes 143777 and 143777-2 in the testsuite.
++
++2004-07-08 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
++
++ * gst/autoplug/gstspideridentity.c: (gst_spider_identity_chain):
++ extra debugging
++ * gst/gstevent.h:
++ * gst/gstinfo.c: (gst_debug_log_default):
++ print time nicely. add thread pointer until someone figures out
++ a completely portable way of getting at thread id's.
++ * gst/gstpad.c: (gst_pad_set_active), (gst_pad_link_try),
++ (_invent_event), (gst_pad_pull), (gst_pad_event_default_dispatch),
++ (gst_pad_call_chain_function):
++ extra debugging
++ * gst/schedulers/gstoptimalscheduler.c:
++ (get_group_schedule_function), (loop_group_schedule_function),
++ (gst_opt_scheduler_loop_wrapper), (gst_opt_scheduler_get_wrapper),
++ (pad_clear_queued), (gst_opt_scheduler_iterate):
++ rename BUFPEN and friends to DATAPEN since that's what they are.
++
++2004-07-07 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
++
++ * gst/autoplug/gstspideridentity.c: (gst_spider_identity_chain):
++ * gst/gstbuffer.h:
++ * gst/gstpad.c:
++ cleanups and debugging
++
++2004-07-07 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * configure.ac:
++ * gst/gstvalue.c: (gst_value_compare_enum),
++ (gst_value_serialize_enum), (gst_value_deserialize_enum),
++ (gst_value_can_compare), (gst_value_compare):
++ * testsuite/Makefile.am:
++ * testsuite/enumcaps/Makefile.am:
++ * testsuite/enumcaps/enumcaps.c:
++ Fix enum serialization, deserialization, comparison in caps, add
++ a test to ensure that this continues working in the future.
++
++2004-07-06 David Schleef <ds@schleef.org>
++
++ * gst/gstcaps.c: (gst_caps_save_thyself), (gst_caps_load_thyself):
++ Fix memleak.
++
++2004-07-06 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstplugin.c: (gst_plugin_check_file), (gst_plugin_load_file):
++ * gst/gstplugin.h:
++ * gst/registries/gstxmlregistry.c:
++ (plugin_times_older_than_recurse), (plugin_times_older_than),
++ (gst_xml_registry_parse_padtemplate):
++ only rebuild registry when actual plugins have a newer time than
++ the registry. Fixes #145520
++
++2004-07-06 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/manual/manual.xml:
++ * docs/manual/win32.xml:
++ add chapter on win32 building. fixes #142422
++
++2004-07-06 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ patch by: Sebastien Cote <sc5 at hermes.usherb.ca>
++
++ * gst/autoplug/gstspider.c: (gst_spider_init),
++ (gst_spider_dispose):
++ fix spider memleaks. fixes #137863
++
++2004-07-06 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ patch by: Joe Marcus Clarke <marcus at freebsd dot org>
++
++ * gst/schedulers/gstoptimalscheduler.c:
++ (gst_opt_scheduler_pad_unlink):
++ fix SIGBUS error, fixes #145338
++
++2004-07-06 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstobject.c: (gst_object_replace):
++ * gst/gstscheduler.c: (gst_scheduler_get_clock):
++ * gst/gstsystemclock.c: (gst_system_clock_obtain):
++ clean up clock lifecycle. Fixes #109831
++
++2004-07-06 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * po/LINGUAS:
++ * po/cs.po:
++ added Czech translation (Miloslav Trmac)
++
++2004-07-04 David Schleef <ds@schleef.org>
++
++ * tools/Makefile.am:
++ * tools/gst-xmlinspect.1.in: Add man page. (bug #140219)
++
++2004-07-04 David Schleef <ds@schleef.org>
++
++ * common/m4/gst-doc.m4: Check for docbook2html 0.6.10 (bug #139909)
++
++2004-07-04 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstbin.c: (gst_bin_restore_thyself):
++ chain to parent restore so the bins get restored correctly
++ in the editor
++
++2004-07-03 David Schleef <ds@schleef.org>
++
++ * gst/gstcaps.c: (gst_caps_save_thyself), (gst_caps_load_thyself):
++ Actually do something in these functions, like before the big
++ caps change. (bug #145137)
++
++2004-07-03 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstelement.c: (gst_element_get_compatible_pad_template),
++ (gst_element_get_compatible_pad_filtered):
++ * gst/gstthread.c: (gst_thread_main_loop):
++ more debugging
++
++2004-07-02 David Schleef <ds@schleef.org>
++
++ * gst/gstinfo.h: wrap #pragmas in #ifdefs for the correct compiler
++ * gst/gstobject.h:
++ * gst/gstparse.h:
++ * gst/gsttrace.h:
++ * gst/gstxml.h:
++
++2004-07-02 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstpad.c: (gst_pad_check_schedulers),
++ (gst_pad_can_link_filtered), (gst_pad_link_filtered),
++ (gst_pad_link_prepare):
++ revert until testsuite is fixed
++
++2004-07-02 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * testsuite/Makefile.am:
++ * testsuite/caps/filtercaps.c: (main):
++ * testsuite/clock/clock1.c: (main):
++ * testsuite/dynparams/dparamstest.c: (gst_dptest_chain), (main):
++ fix some more tests
++
++2004-07-02 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * testsuite/cleanup/cleanup1.c: (create_pipeline):
++ * testsuite/cleanup/cleanup2.c: (create_pipeline):
++ * testsuite/cleanup/cleanup4.c: (main):
++ fix testsuite
++
++2004-07-02 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * libs/gst/control/control.c:
++ * libs/gst/control/dparam.c:
++ * libs/gst/control/dparam_smooth.c: (gst_dpsmooth_get_type):
++ * libs/gst/control/dparammanager.c:
++ * libs/gst/control/dparammanager.h:
++ * testsuite/dynparams/Makefile.am:
++ * testsuite/dynparams/dparamstest.c: (gst_dptest_base_init),
++ (gst_dptest_change_state), (gst_dptest_chain), (main):
++ fix testcase for dparams
++ add debugging category
++
++2004-07-02 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * testsuite/Rules:
++ change path
++
++2004-07-02 Benjamin Otte <otte@gnome.org>
++
++ * tests/.cvsignore:
++ * tests/Makefile.am:
++ * tests/mass_elements.c: (gst_get_current_time), (main):
++ add simple benchmark to test various speeds of fakesrc ! identity !
++ identity ! ... ! fakesink.
++ Usage: mass_elements [num_identities] [num_buffers]
++ If not specified they default to 1000.
++
++2004-07-02 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstpad.c: (gst_pad_check_schedulers),
++ (gst_pad_can_link_filtered), (gst_pad_link_filtered),
++ (gst_pad_link_prepare):
++ check that pads that get linked belong to the same manager. The old
++ code allowed linking elements before putting them into bins, so it
++ worked to link them and then put them in different threads, which
++ lead to weird behaviour.
++ Since this effectively disallows linking elements before putting
++ them in a bin, some applications might not work after this and error
++ out. If these applications are too critical, we might need to revert
++ that patch. Please test this before the next release...
++
++2004-06-28 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstpad.c: (gst_pad_get_caps):
++ throw an error if the getcaps function does not return a subset of
++ the template caps.
++ * libs/gst/bytestream/filepad.c: (gst_file_pad_chain):
++ make disconts without position info an error in debugging
++ * tests/spidey_bench.c: (handoff), (main):
++ don't count first try when averaging
++
++2004-06-26 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstplugin.c: (gst_plugin_load_file):
++ figure out problem with dynamic test
++
++2004-06-26 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/Makefile.am:
++ fix docs build
++
++2004-06-26 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * po/POTFILES.in:
++ * po/af.po:
++ * po/az.po:
++ * po/en_GB.po:
++ * po/fr.po:
++ * po/nl.po:
++ * po/sr.po:
++ * po/sv.po:
++ * po/tr.po:
++ * po/uk.po:
++ * tools/gst-register.c: (plugin_added_func), (main):
++ i18n-ize -register, fix plural
++
++2004-06-26 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/elements/gstidentity.c: (gst_identity_class_init),
++ (gst_identity_init), (gst_identity_chain),
++ (gst_identity_set_property), (gst_identity_get_property):
++ * gst/elements/gstidentity.h:
++ check for perfect stream
++
++2004-06-25 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/elements/gstidentity.c: (gst_identity_chain):
++ print offset_end
++
++2004-06-25 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/Makefile.am:
++ * docs/gst/gstreamer-docs.sgml:
++ doc fixes
++
++2004-06-24 David Schleef <ds@schleef.org>
++
++ * autogen.sh: Remove call to env, since the buildbot isn't
++ broken anymore.
++
++2004-06-24 Wim Taymans <wim@fluendo.com>
++
++ * gst/elements/Makefile.am:
++ * gst/elements/gstelements.c:
++ * gst/elements/gstmultifdsink.c: (gst_multifdsink_base_init),
++ (gst_multifdsink_class_init), (gst_multifdsink_init),
++ (gst_multifdsink_add), (gst_multifdsink_remove),
++ (gst_multifdsink_clear), (gst_multifdsink_chain),
++ (gst_multifdsink_set_property), (gst_multifdsink_get_property):
++ * gst/elements/gstmultifdsink.h:
++ Added an element that writes to multiple filedescriptors at once.
++
++2004-06-24 Benjamin Otte <otte@gnome.org>
++
++ * gst/parse/grammar.y:
++ don't try to link elements before they have been added to bins
++
++2004-06-24 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * libs/gst/bytestream/filepad.c: (gst_file_pad_available),
++ (gst_file_pad_get_length):
++ * libs/gst/bytestream/filepad.h:
++ add 2 new functions
++
++2004-06-22 Zaheer Abbas Merali <zaheerabbas at merali dot org>
++
++ * docs/gst/gstreamer-sections.txt:
++ remove from docs, the define that Benjamin removed from gstelement.h
++
++2004-06-22 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstelement.h:
++ remove define that referenced a nonexisting GstElement struct member
++
++2004-06-20 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstdata.c: (gst_data_is_writable):
++ whoops, return values were wrong, so writable data was marked as
++ non-writable and vice versa. (fixes #143953, spotted by Francis
++ Labonte)
++ Shows how rarely we need to copy data ;)
++
++2004-06-20 Benjamin Otte <otte@gnome.org>
++
++ * testsuite/schedulers/.cvsignore:
++ * testsuite/schedulers/Makefile.am:
++ * testsuite/schedulers/143777-2.c: (main):
++ add test for opt breakage in bug #143777
++
++2004-06-20 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstpad.c: (gst_pad_call_chain_function):
++ check for if we were unlinked while inside the chainfunction (fixes
++ entrygthread having issues with #143777)
++ * testsuite/schedulers/143777.c: (main):
++ * testsuite/schedulers/Makefile.am:
++ add a test for that fix
++
++2004-06-20 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstvalue.c: (gst_value_set_int_range):
++ test that start is smaller then end
++ * libs/gst/bytestream/Makefile.am:
++ * libs/gst/bytestream/filepad.c:
++ * libs/gst/bytestream/filepad.h:
++ add GstFilePad - a pad that behaves like a FILE*
++ * testsuite/bytestream/.cvsignore:
++ * testsuite/bytestream/Makefile.am:
++ * testsuite/bytestream/filepadsink.c:
++ test for the GstFilePad
++
++2004-06-18 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/elements/gstidentity.c: (gst_identity_class_init),
++ (gst_identity_init), (gst_identity_set_clock),
++ (gst_identity_chain), (gst_identity_set_property),
++ (gst_identity_get_property):
++ * gst/elements/gstidentity.h:
++ * gst/gstclock.c: (gst_clock_id_wait):
++ add a "sync" property to sync to the clock
++
++2004-06-16 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstelementfactory.c: (gst_element_factory_create):
++ make the freakin "elementfactory bla has no type" message more
++ useful. So we actually can do something when someone shows up
++ complaining about it.
++
++2004-06-15 Johan Dahlin <johan@gnome.org>
++
++ * tools/gst-inspect.c (main): Fallback to plugin if no element is
++ found. This matches the old behavior better. Thanks to Thomas for
++ pointing out.
++
++2004-06-14 David Schleef <ds@schleef.org>
++
++ * gst/gstcpu.c: (gst_cpuid_i386): Fix problem when using
++ -fomit-frame-pointer. Appears to generate correct code in
++ other cases as well.
++
++2004-06-14 Johan Dahlin <johan@gnome.org>
++
++ * tools/gst-inspect.c (main): Add two new command line options: -a
++ to print all elements and -n to print the name on each line. Also
++ fix some error reporting.
++ (main): Simplify, remove -n and always print names if -a is specified
++
++2004-06-13 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/gstconfig.h:
++ * win32/GSTreamer.vcproj:
++ * win32/Makefile:
++ * gst/gstconfig.h.in:
++ * gst/gst.h:
++ * gst/gstbin.h:
++ * gst/gstelement.h:
++ * gst/gstevent.h:
++ * gst/gstobject.h:
++ * gst/gstpad.h:
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/gstconfig.sgml:
++ rename GSTREAMER_EXPORT(S) to GST_EXPORT(S)
++
++2004-06-13 Jan Schmidt <thaytan@mad.scientist.com>
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/gstconfig.sgml:
++ Add the GSTREAMER_EXPORT macro to the docs
++
++2004-06-13 Jan Schmidt <thaytan@mad.scientist.com>
++
++ * tools/gst-compprep.c: (handle_xmlerror), (main):
++ Add a check for the version that introduced SetStructuredError to fix
++ the build on FC1
++
++2004-06-12 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/msvc71.sln:
++ * win32/testsuite/:
++ prepare to compile the testsuite with MSVC
++
++2004-06-12 Steve Lhomme <steve.lhomme@free.fr>
++
++ * docs/manual/win32.xml:
++ attempt to transform the Win32 README into an XML doc
++
++2004-06-12 Steve Lhomme <steve.lhomme@free.fr>
++
++ * gst/gst.c:
++ * gst/gstbin.*:
++ * gst/config.h.in:
++ * gst/gstelement.*:
++ * gst/gstevent.h:
++ * gst/gstobject.*:
++ * gst/gstpad.h:
++ * tools/gst-register.c:
++ * win32/gstreamer.def:
++ extern symbols are now exported for the Windows DLL
++
++2004-06-12 Steve Lhomme <steve.lhomme@free.fr>
++
++ * gst/gstinfo.h:
++ fix a problem to enable/disable DEBUG under MSVC
++
++2004-06-12 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/:
++ enable more debug code in DEBUG build
++
++2004-06-12 Steve Lhomme <steve.lhomme@free.fr>
++
++ * win32/config.h:
++ * gst/gst-i18n-app.h:
++ enable NLS under Windows
++
++2004-06-12 Jan Schmidt <thaytan@mad.scientist.com>
++ * tools/gst-compprep.c: (handle_xmlerror), (main):
++ Make an error that baffled me a bit clearer
++
++2004-06-12 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstqueue.c:
++ don't use g_queue_get_length () because it's 2.4, use ->length
++
++2004-06-11 Steve Lhomme <steve.lhomme@free.fr>
++
++ reviewed by Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * tools/gst-inspect.c: (print_signal_info):
++ don't free random data twice. (fixes #144185)
++
++2004-06-11 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstqueue.c:
++ * gst/gstqueue.h:
++ fix removing from the wrong queue on event timeout
++ fix disposing of the event queue by casting correctly
++ add mutexes for handling the event queue
++ someone was sleeping when fixing queue last time around :)
++
++2004-06-10 Johan Dahlin <johan@gnome.org>
++
++ * gst/gst.c (gst_init_check_with_popt_table): Do not fail on
++ errors, like gtk. It makes it more useful in bindings. Fixes #141692.
++
++2004-06-09 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/random/gdp:
++ * libs/gst/dataprotocol/dataprotocol-test.c: (buffer_test):
++ * libs/gst/dataprotocol/dataprotocol.c:
++ (gst_dp_header_from_buffer), (gst_dp_packet_from_caps),
++ (gst_dp_buffer_from_header):
++ * libs/gst/dataprotocol/dataprotocol.h:
++ * libs/gst/dataprotocol/dp-private.h:
++ rev version to 0.1, add buffer flags and copy them
++
++2004-06-09 Johan Dahlin <johan@gnome.org>
++
++ * gst/gstbuffer.c (gst_buffer_default_copy): Don't forget to merge
++ the flags from the buffer we're copying.
++
++2004-06-09 Wim Taymans <wim@fluendo.com>
++
++ * gst/elements/gstfakesink.c: (gst_fakesink_chain):
++ * gst/elements/gstidentity.c: (gst_identity_init),
++ (gst_identity_chain):
++ Print more buffer info in fakesink.
++ Make identity output similar to fakesink.
++
++2004-06-07 Daniel Gazard <dany42@free.fr>
++
++ reviewed by Benjamin Otte <otte@gnome.org>
++
++ * configure.ac:
++ fix cross compiling not working. (fixes #143741)
++
++2004-06-07 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstelement.c: (gst_element_set_time_delay):
++ add failure check
++ * gst/gstinfo.h:
++ put brackets around macro arguments of GST_TIME_ARGS, add note to
++ move it to correct header in 0.9
++
++2004-06-07 Benjamin Otte <otte@gnome.org>
++
++ * gst/indexers/gstfileindex.c: (gst_file_index_get_writer_id),
++ (gst_file_index_load), (_file_index_id_save_entries),
++ (gst_file_index_commit), (gst_file_index_add_association),
++ (gst_file_index_add_entry), (gst_file_index_get_assoc_entry),
++ (gst_file_index_plugin_init):
++ make debugging use a default category
++
++2004-06-06 David Moore <dcm@acm.org>
++
++ reviewed by Benjamin Otte <otte@gnome.org>
++
++ * gst/elements/gstfdsrc.c: (gst_fdsrc_class_init),
++ (gst_fdsrc_change_state):
++ reset offset counter when going READY => PAUSED. (fixes #142903)
++
++2004-06-06 ed@catmur.co.uk
++
++ reviewed by Benjamin Otte <otte@gnome.org>
++
++ * gst/registries/gstxmlregistry.c:
++ (gst_xml_registry_rebuild_recurse):
++ don't rely on g_dir_open to figure out if a file is a directory, use
++ explicit G_TEST_IS_DIR. Reiserfs4 allows opening files as
++ directories. (fixes #142850)
++
++2004-06-06 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstqueue.c: (gst_queue_dispose), (gst_queue_change_state):
++ fix memory leaks (fixes #142795). Initial patch by Sebastien Cote
++ * libs/gst/bytestream/adapter.c:
++ * libs/gst/bytestream/adapter.h:
++ fix copyright in header and typo in debugging category name
++
++2004-06-05 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
++
++ * configure.ac:
++ bump nano to cvs
++
++=== release 0.8.3 ===
++
++2004-06-05 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ update libtool versioning
++ do a new release
++ * docs/gst/tmpl/gstelement.sgml:
++ * docs/gst/tmpl/gsttypes.sgml:
++ * gst/gstinfo.c: (_gst_debug_init):
++ put back GST_CAT_DATAFLOW to fix API breakage
++
++2004-06-04 David Schleef <ds@schleef.org>
++
++ * autogen.sh: Add a temporary 'env' to test buildbot problems.
++
++2004-06-04 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
++
++ * configure.ac:
++ bump nano to cvs
++
++=== release 0.8.2 ===
++
++2004-06-03 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gst.c: (parse_debug_list), (gst_init_check_with_popt_table):
++ check GST_DEBUG environment variable which is parsed the same way
++ as --gst-debug=
++
++2004-05-28 Stephane Loeuillet <stephane.loeuillet@tiscali.fr>
++
++ * gst/elements : gstaggregator.c gstfakesink.c gstfakesrc.c
++ gstmd5sink.c gstshaper.c gsttee.c
++ gsttypefindelement.c
++ * gst/schedulers : gstbasicscheduler.c gstoptimalscheduler.c
++
++ - removing trailing commas at end of enums
++ it is correct C99 code but C90 compilers would complain
++ (AIX, Forte, ...)
++ ('should' fix #143290, at least partially)
++
++2004-05-27 Wim Taymans <wim@fluendo.com>
++
++ * gst/schedulers/gstoptimalscheduler.c: (remove_from_chain),
++ (chain_group_set_enabled), (create_group), (add_to_group),
++ (merge_groups), (setup_group_scheduler), (group_elements),
++ (gst_opt_scheduler_iterate), (gst_opt_scheduler_show):
++ Don't try to follow the pad connections with other groups
++ when a loop based element is added to the scheduler because
++ the bin will inform the scheduler about the pad links a little
++ later.
++
++2004-05-27 Wim Taymans <wim@fluendo.com>
++
++ * gst/schedulers/gstoptimalscheduler.c: (add_to_chain),
++ (remove_from_chain), (chain_group_set_enabled),
++ (setup_group_scheduler), (group_element_set_enabled),
++ (gst_opt_scheduler_state_transition), (gst_opt_scheduler_iterate),
++ (gst_opt_scheduler_show):
++ Elements without a group can do a state change as well, just wait
++ with the setup of the scheduling function when it is added to a
++ chain.
++
++2004-05-27 Wim Taymans <wim@fluendo.com>
++
++ * gst/schedulers/gstoptimalscheduler.c: (add_to_chain),
++ (remove_from_chain), (chain_group_set_enabled), (add_to_group),
++ (merge_groups), (setup_group_scheduler),
++ (group_inc_links_for_element), (gst_opt_scheduler_iterate),
++ (gst_opt_scheduler_show):
++ Fixes to maintain internal consistency of the scheduler data
++ structures.
++ - adding an enabled group to a chain should increment the
++ number of enabled elements in that chain.
++ - removing an enabled group from a chain could disable the
++ chain.
++ - removing a disabled group from a chain could enable the
++ chain.
++ - add g_assert when internal inconsistency is detected.
++ - adding an element to a group could increase the number of
++ links this group has with other groups.
++ - merging two groups also merges the chains.
++ - also show group links in the _show method.
++
++
++2004-05-25 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstcaps.c: (gst_caps_structure_simplify):
++ don't print error messages when there is no error
++ * gst/gstvalue.c: (gst_value_compare_int_range):
++ compare the second value, too
++ * testsuite/caps/Makefile.am:
++ * testsuite/caps/random.c: (assert_on_error), (main):
++ add tests to make sure the two things above are checked for
++
++2004-05-24 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ * libs/gst/dataprotocol/Makefile.am:
++ * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_packet_from_caps):
++ * libs/gst/dataprotocol/dataprotocol.h:
++ wrap header in GST_ENABLE_NEW. make code use it
++
++2004-05-23 Johan Dahlin <johan@gnome.org>
++
++ * tools/gst-inspect.c (main): Cleanup most parts of it, don't be
++ so verbose and print GstElement signal names all the time.
++
++2004-05-22 David Schleef <ds@schleef.org>
++
++ * gst/registries/gstxmlregistry.c:
++ (gst_xml_registry_parse_padtemplate): Fix warning on OS X.
++ (bug #142957)
++
++2004-05-22 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ scrub cflags for glib2 so gcc doesn't complain when glib is in
++ /usr/local
++
++2004-05-21 Johan Dahlin <johan@gnome.org>
++
++ * gst/gstcpu.c (gst_cpuid_i386): Protect some gcc asm stuff with
++ __GNUC__, patch from Brian Cameron, fixes bug #142804
++
++2004-05-20 David Schleef <ds@schleef.org>
++
++ * gst/gstindex.c: (gst_index_compare_func): Fix overflows in
++ comparison code. (bug #142819)
++
++2004-05-20 Wim Taymans <wim@fluendo.com>
++
++ * gst/gstbuffer.c: (gst_buffer_default_copy):
++ * gst/gstbuffer.h:
++ Added Comment to a flag.
++ copy relevant flags in _buffer_copy.
++
++2004-05-20 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ reviewed by: Wim Taymans <wim at fluendo dot com>
++
++ * gst/gstbuffer.h:
++ add GST_BUFFER_IN_CAPS buffer flag
++ * gst/gststructure.c: (gst_structure_value_get_generic_type),
++ (gst_structure_parse_any_list), (gst_structure_parse_list),
++ (gst_structure_parse_fixed_list), (gst_structure_parse_value):
++ * gst/gstvalue.c: (gst_value_serialize_any_list),
++ (gst_value_transform_any_list_string),
++ (gst_value_list_prepend_value), (gst_value_list_append_value),
++ (gst_value_list_get_size), (gst_value_list_get_value),
++ (gst_value_transform_list_string),
++ (gst_value_transform_fixed_list_string),
++ (gst_value_serialize_list), (gst_value_serialize_fixed_list),
++ (gst_value_deserialize_fixed_list), (gst_type_is_fixed),
++ (_gst_value_initialize):
++ * gst/gstvalue.h:
++ add a GST_TYPE_FIXED_LIST which is fixed by definition and uses
++ < , > as a format.
++ * testsuite/caps/string-conversions.c: (main):
++ add regression tests for < >
++
++2004-05-20 Johan Dahlin <johan@gnome.org>
++
++ * docs/gst/Makefile.am (all-local): Re-add
++
++2004-05-20 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
++
++ * docs/gst/Makefile.am:
++ * docs/gst/gstreamer-docs.sgml:
++ * docs/libs/Makefile.am:
++ * docs/libs/gstreamer-libs-docs.sgml:
++ fix distcheck issues
++
++2004-05-19 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * libs/gst/dataprotocol/Makefile.am:
++ add to autotest
++
++2004-05-19 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * libs/gst/dataprotocol/Makefile.am:
++ * libs/gst/dataprotocol/dataprotocol.c:
++ (gst_dp_header_from_buffer), (gst_dp_packet_from_caps),
++ (gst_dp_packet_from_event), (gst_dp_event_from_packet):
++ * libs/gst/dataprotocol/dp-private.h:
++ use GST macros to read/write fixed length ints
++ add some more asserts
++
++2004-05-19 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/libs/gstreamer-libs-docs.sgml:
++ * docs/libs/gstreamer-libs-sections.txt:
++ remove idct and putbits
++ * configure.ac:
++ * docs/libs/tmpl/gstdataprotocol.sgml:
++ * libs/gst/Makefile.am:
++ * libs/gst/dataprotocol/Makefile.am:
++ * libs/gst/dataprotocol/dataprotocol-test.c: (conversion_test),
++ (buffer_test), (caps_test), (event_test), (main):
++ * libs/gst/dataprotocol/dataprotocol.c: (gst_dp_crc),
++ (gst_dp_dump_byte_array), (gst_dp_init),
++ (gst_dp_header_payload_length), (gst_dp_header_payload_type),
++ (gst_dp_header_from_buffer), (gst_dp_packet_from_caps),
++ (gst_dp_packet_from_event), (gst_dp_buffer_from_header),
++ (gst_dp_caps_from_packet), (gst_dp_event_from_packet),
++ (gst_dp_validate_header), (gst_dp_validate_payload),
++ (gst_dp_validate_packet), (plugin_init):
++ * libs/gst/dataprotocol/dataprotocol.h:
++ * libs/gst/dataprotocol/dp-private.h:
++ add dataprotocol
++
++2004-05-19 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstvalue.c: (gst_value_deserialize_int_helper):
++ fix int variable deserialization and add a helper so we can actually
++ debug this.
++
++2004-05-18 David Schleef <ds@schleef.org>
++
++ * testsuite/debug/commandline.c: (main): Call ./commandline, not
++ argv[0]. Calling yourself is probably not the best way to
++ construct a test like this, btw.
++
++2004-05-18 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstbin.c: (gst_bin_iterate_func), (gst_bin_iterate):
++ don't claim to be more intelligent than a scheduler when the
++ scheduler claims the pipeline is stopped
++ * gst/schedulers/entryscheduler.c: (safe_cothread_switch),
++ (safe_cothread_destroy),
++ (gst_entry_scheduler_remove_all_cothreads),
++ (gst_entry_scheduler_reset), (_remove_cothread),
++ (gst_entry_scheduler_state_transition):
++ hold off cothread destruction if we're not in main cothread
++ * configure.ac:
++ * testsuite/Makefile.am:
++ add new test dir
++ * testsuite/schedulers/.cvsignore:
++ * testsuite/schedulers/Makefile.am:
++ add tests
++ * testsuite/schedulers/relink.c: (cb_handoff), (main):
++ check relinking and adding/removing elements from a running pipeline
++ * testsuite/schedulers/unlink.c: (cb_handoff), (main):
++ check unlinking in a running pipeline
++ * testsuite/schedulers/unref.c: (cb_handoff), (main):
++ check unreffing a running pipeline
++ * testsuite/schedulers/useless_iteration.c: (main):
++ check iterating a pipeline that contains running threads works
++
++2004-05-18 David Schleef <ds@schleef.org>
++
++ * docs/gst/Makefile.am: Add all-local target for when HAVE_GTK_DOC
++ is false.
++
++2004-05-18 Wim Taymans <wim@fluendo.com>
++
++ * gst/schedulers/gstoptimalscheduler.c: (remove_from_group),
++ (setup_group_scheduler), (gst_opt_scheduler_pad_link):
++ Fixed an error introduced with patch for 1.63. When setting
++ a get based element as the entry point in a group, make sure
++ to mark the group as GET based.
++
++2004-05-18 Wim Taymans <wim@fluendo.com>
++
++ * gst/schedulers/gstoptimalscheduler.c: (create_group),
++ (setup_group_scheduler), (loop_group_schedule_function),
++ (gst_opt_scheduler_pad_link):
++ Added some more debug info and fixed a bug where the group
++ type was set to LOOP but it was in fact unknown.
++
++2004-05-18 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/schedulers/entryscheduler.c: (gst_entry_scheduler_reset):
++ make resetting scheduler work twice in a row
++
++2004-05-18 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstvalue.c: (gst_strtoll), (CREATE_SERIALIZATION),
++ (CREATE_USERIALIZATION), (_gst_value_initialize),
++ (gst_value_compare_float), (gst_value_serialize_float),
++ (gst_value_deserialize_float), (gst_value_compare_enum),
++ (gst_value_serialize_enum), (gst_value_deserialize_enum):
++ add serialization and comparison functions for long, int64, enum and
++ float values
++ * gst/gstvalue.c: (gst_value_serialize), (gst_value_deserialize):
++ use best serialization function in type hierarchy instead of only a
++ matching one. This is required for enums to work.
++ * gst/parse/grammar.y:
++ use gst_caps_deserialize
++ * testsuite/parse/Makefile.am:
++ parse1 now works
++ * testsuite/parse/parse1.c: (main):
++ remove aggregator check, aggregator is broken, this test works now
++ but fails because of bug #138012
++ * testsuite/parse/parse2.c: (main):
++ s/xvideosink/xvimagesink - this test looks a lot like we should
++ disable it
++
++2004-05-13 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstelement.c: (gst_element_class_init):
++ whoops, store the signal id correctly
++ * gst/schedulers/gstbasicscheduler.c:
++ (gst_basic_scheduler_chain_wrapper):
++ detect infinfinfinfinfinf^Cinite loops in chain wrapper when the
++ chain function isn't linked
++
++2004-05-13 Jan Schmidt <thaytan@mad.scientist.com>
++ * configure.ac:
++ Add $GST_PKG_CFLAGS back into GST_INT_CFLAGS so I have large file
++ support until we decide where the flags should be used
++ * gst/elements/gstfilesrc.c: (gst_filesrc_srcpad_query):
++ Use GST_FORMAT_BYTES when GST_FORMAT_DEFAULT is passed
++ * gst/gstpad.c: (gst_pad_link_call_link_functions):
++ Output refused caps in the debug info
++
++2004-05-13 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/elements/gstidentity.c: (gst_identity_chain):
++ add duration debug
++ * gst/gstinfo.c: (gst_debug_log_default):
++ add timestamp
++
++2004-05-13 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstpipeline.c: (gst_pipeline_dispose),
++ (gst_pipeline_change_state):
++ call gst_scheduler_reset on dispose (fixes #141416)
++
++2004-05-11 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/elements/gstfilesrc.c: (gst_filesrc_get_mmap):
++ compute mapsize correctly
++ * gst/elements/gstfilesrc.c: (gst_filesrc_get_mmap):
++ use correct datatypes when calling a varargs function
++ * gst/elements/gsttypefindelement.c: (stop_typefinding):
++ push a DISCONT event as first thing
++ * gst/gst_private.h:
++ * gst/gstinfo.c: (_gst_debug_init):
++ remove GST_DATAFLOW debugging category
++ * gst/gstbin.c: (gst_bin_iterate):
++ use GST_SCHEDULING category
++ * gst/gstpad.c: (gst_pad_get_type), (_invent_event),
++ (gst_pad_push), (gst_pad_pull), (gst_pad_call_chain_function),
++ (gst_pad_call_get_function):
++ add GST_DATAFLOW to easily track flow of buffers or events.
++ * gst/gstqueue.c: (gst_queue_get_type),
++ (gst_queue_handle_pending_events), (gst_queue_chain),
++ (gst_queue_get), (gst_queue_handle_src_event):
++ use own static debugging category GST_DATAFLOW for dataflow,
++ use DEBUG category for showing which path events go, use LOG
++ category for buffers.
++
++2004-05-10 David Schleef <ds@schleef.org>
++
++ * docs/gst/gstreamer-sections.txt: Add gst_element_no_more_pads.
++
++2004-05-10 David Schleef <ds@schleef.org>
++
++ * docs/gst/Makefile.am: Dear gtk-doc, please print out the unused
++ symbols, because otherwise we don't know what they are. Thanks,
++ the GStreamer team.
++ * gst/registries/gstxmlregistry.c: (make_dir): Remove a spurious ;
++
++2004-05-10 David Schleef <ds@schleef.org>
++
++ (from Steve Lhomme)
++ * win32/Makefile: When using make clean the MS Visual Studio makefiles
++ are deleted. Fix.
++ * win32/Makefile.inspect:
++ * win32/Makefile.launch:
++ * win32/Makefile.register:
++
++2004-05-10 David Schleef <ds@schleef.org>
++
++ * gst/gstinfo.h: Add missing inline function.
++ * gst/gsttrace.c: add include
++ * gst/parse/grammar.y: remove unused code
++ * gst/registries/gstxmlregistry.c: (make_dir): make mkdir call
++ more portable.
++ * tools/gst-register.c: wrap unistd.h
++
++ More additions/fixes from Steve for the MSVC build.
++ * win32/GStreamer.vcproj:
++ * win32/Makefile:
++ * win32/Makefile.inspect:
++ * win32/Makefile.launch:
++ * win32/Makefile.register:
++ * win32/README.txt:
++ * win32/gst-inspect.vcproj:
++ * win32/gst-launch.vcproj:
++ * win32/gst-register.vcproj:
++ * win32/gstbytestream.def:
++ * win32/gstbytestream.vcproj:
++ * win32/gstconfig.h:
++ * win32/gstelements.def:
++ * win32/gstelements.vcproj:
++ * win32/gstenumtypes.c:
++ * win32/gstenumtypes.h:
++ * win32/gstoptimalscheduler.def:
++ * win32/gstoptimalscheduler.vcproj:
++ * win32/gstreamer.def:
++ * win32/gstspider.def:
++ * win32/gstspider.vcproj:
++ * win32/gstversion.h:
++ * win32/msvc71.sln:
++
++2004-05-10 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstelement.c: (gst_element_class_init),
++ (gst_element_no_more_pads):
++ * gst/gstelement.h:
++ add gst_element_no_more_pads and the "no-more-pads" signal
++
++2004-05-10 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstregistry.c: (gst_registry_add_plugin):
++ refuse to add plugins when a plugin with same name is already
++ registered. Fixes a bunch of "How to remove plugins?" issues.
++ May lead to other problems though, let's test
++
++2004-05-10 Stephane Loeuillet <stephane.loeuillet@tiscali.fr>
++
++ * testsuite/caps/caps_strings : audio/ac3 => audio/x-ac3
++ * docs/manual/pads-api.xml : audio/wav => audio/x-wav
++ * docs/random/uraeus/gstreamer_and_midi.txt : audio/wav => audio/x-wav
++
++2004-05-09 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * tests/Makefile.am: fix am16 issue
++
++2004-05-09 Benjamin Otte <otte@gnome.org>
++
++ * libs/gst/bytestream/Makefile.am:
++ we should indeed add .c files to makefiles or they won't be built
++ (d'oh)
++
++2004-05-08 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstpad.c: (gst_pad_proxy_fixate):
++ really reduce the set of caps
++
++2004-05-08 Benjamin Otte <otte@gnome.org>
++
++ * tests/Makefile.am:
++ * tests/spidey_bench.c: (handoff), (main):
++ add benchmark to test how long spider needs to create a pipeline
++
++2004-05-08 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstpad.c: (gst_pad_set_active), (gst_pad_link_unnegotiate):
++ mark links as unengaged when unnegotiating instead of deactivating.
++ This way pads aren't marked as unengaged when going PLAYING=>PAUSED
++
++2004-05-08 Benjamin Otte <otte@gnome.org>
++
++ * docs/manual/helloworld.xml:
++ s/audiosink/osssink (patch by Patrick Guimond)
++
++2004-05-07 David Schleef <ds@schleef.org>
++
++ * configure.ac: Make sure GST_INT_CFLAGS is not clobbered,
++ since it contains important stuff.
++
++2004-05-07 David Schleef <ds@schleef.org>
++
++ * testsuite/caps/caps.c: (test3), (main): A check for appending
++ ANY caps.
++
++2004-05-07 David Schleef <ds@schleef.org>
++
++ * common/m4/as-compiler-flag.m4: Properly quote arguments,
++ which may contain commas. Fixes detection of -Wa,-mregnames
++
++2004-05-06 David Schleef <ds@schleef.org>
++
++ Changes to handle compilers that don't have variadic macro
++ support. In particular, glib headers define some inlines
++ that need G_LOG_DOMAIN defined. Additional fixes for MSVC
++ builds.
++ * gst/Makefile.am:
++ * gst/cothreads.c:
++ * gst/elements/gstfdsink.c:
++ * gst/elements/gstfdsrc.c:
++ * gst/elements/gstfilesink.c:
++ * gst/elements/gstfilesrc.c:
++ * gst/gst_private.h:
++ * gst/gstatomic.c:
++ * gst/gstcaps.c: (gst_caps_append):
++ * gst/gstcpu.c: (gst_cpuid_i386):
++ * gst/gstelement.c:
++ * gst/gsterror.c:
++ * gst/gstfilter.c:
++ * gst/gstinfo.h:
++ * gst/gstprobe.c:
++ * gst/gstquery.c:
++ * gst/gstregistry.c:
++ * gst/gststructure.c:
++ * gst/gsttaginterface.c:
++ * gst/gsttrace.c: (gst_trace_new):
++ * gst/gsttrashstack.c:
++ * gst/gsturi.c:
++ * gst/gstvalue.c:
++ * gst/parse/grammar.y:
++ * gst/parse/parse.l:
++ * tools/gst-inspect.c: (main):
++ * tools/gst-launch.c: (main):
++ * tools/gst-xmlinspect.c: (PUT_STRING):
++
++2004-05-06 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/elements/gstfilesrc.c: (gst_filesrc_get),
++ (gst_filesrc_change_state), (gst_filesrc_srcpad_event):
++ * gst/elements/gstfilesrc.h:
++ send NEW_MEDIA events correctly
++ * gst/elements/gsttypefindelement.c: (start_typefinding),
++ (gst_type_find_element_handle_event):
++ restart typefinding when we get a NEW_MEDIA event
++ * gst/gstbin.c: (gst_bin_remove_func), (gst_bin_change_state),
++ (gst_bin_dispose):
++ don't die when someone removes elements in callbacks
++ * gst/gstelement.c: (gst_element_change_state):
++ improve debugging
++ * gst/gstpad.c: (gst_pad_pull), (gst_pad_call_chain_function):
++ we need a NEW_MEDIA event to engage a link
++ * gst/gsttrace.c: (gst_trace_new), (gst_alloc_trace_set_flags_all):
++ don't g_print debugging stuff
++ * testsuite/caps/simplify.c: (check_caps):
++
++2004-05-04 Benjamin Otte <otte@gnome.org>
++
++ * gst/parse/grammar.y:
++ use GST_ERROR instead of g_warning, and always throw a GST_ERROR
++
++2004-05-04 Benjamin Otte <otte@gnome.org>
++
++ * testsuite/caps/renegotiate.c: (main):
++ improve output in error case
++
++2004-05-04 Benjamin Otte <otte@gnome.org>
++
++ * gst/parse/grammar.y:
++ fix assert to not trigger when there's no error argument
++ * gst/parse/parse.l:
++ fix definition of caps to allow more than two structures
++ * testsuite/caps/Makefile.am:
++ * testsuite/caps/renegotiate.c: (main):
++ it's sinesrc and works in that case
++
++2004-05-04 Wim Taymans <wim@fluendo.com>
++
++ * gst/schedulers/gstoptimalscheduler.c: (remove_from_group),
++ (group_dec_link), (gst_opt_scheduler_pad_unlink):
++ when removing an element from a group, we always need to
++ decrement the link count that this group had with other
++ groups through the element.
++ added an extra assert to catch inconsistencies when decrementing
++ the link count.
++
++2004-05-04 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ * docs/gst/Makefile.am:
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/gstcompat.sgml:
++ * examples/appreader/Makefile.am:
++ * examples/cutter/Makefile.am:
++ * examples/events/Makefile.am:
++ * examples/helloworld/Makefile.am:
++ * examples/helloworld2/Makefile.am:
++ * examples/launch/Makefile.am:
++ * examples/manual/Makefile.am:
++ * examples/mixer/Makefile.am:
++ * examples/pingpong/Makefile.am:
++ * examples/plugins/Makefile.am:
++ * examples/queue/Makefile.am:
++ * examples/queue2/Makefile.am:
++ * examples/queue3/Makefile.am:
++ * examples/queue4/Makefile.am:
++ * examples/retag/Makefile.am:
++ * examples/thread/Makefile.am:
++ * examples/typefind/Makefile.am:
++ * examples/xml/Makefile.am:
++ * gst/Makefile.am:
++ * gst/autoplug/Makefile.am:
++ * gst/elements/Makefile.am:
++ * gst/gstcompat.h:
++ * gst/indexers/Makefile.am:
++ * gst/parse/Makefile.am:
++ * gst/registries/Makefile.am:
++ * gst/schedulers/Makefile.am:
++ * libs/gst/bytestream/Makefile.am:
++ * libs/gst/control/Makefile.am:
++ * libs/gst/getbits/Makefile.am:
++ * po/af.po:
++ * po/az.po:
++ * po/en_GB.po:
++ * po/fr.po:
++ * po/nl.po:
++ * po/sr.po:
++ * po/sv.po:
++ * po/tr.po:
++ * po/uk.po:
++ * tests/Makefile.am:
++ * tests/bufspeed/Makefile.am:
++ * tests/instantiate/Makefile.am:
++ * tests/memchunk/Makefile.am:
++ * tests/muxing/Makefile.am:
++ * tests/negotiation/Makefile.am:
++ * tests/probes/Makefile.am:
++ * tests/sched/Makefile.am:
++ * tests/seeking/Makefile.am:
++ * tests/threadstate/Makefile.am:
++ * testsuite/caps/Makefile.am:
++ * testsuite/cleanup/Makefile.am:
++ * testsuite/dlopen/Makefile.am:
++ * testsuite/dynparams/Makefile.am:
++ * testsuite/plugin/Makefile.am:
++ * testsuite/states/Makefile.am:
++ * tools/Makefile.am:
++ reorganize compile/link flags to be consistent
++ put gst_info in gstcompat.h and actually use GST_DISABLE_DEPRECATED
++
++2004-05-04 David Schleef <ds@schleef.org>
++
++ The "once more, with feeling" check-in.
++ * testsuite/caps/Makefile.am: dist caps_strings
++ * testsuite/caps/renegotiate.c: (main): This test triggers a
++ segfault in the core. Marking as failing.
++
++2004-05-03 David Schleef <ds@schleef.org>
++
++ * testsuite/caps/deserialize.c: (main): Fix problems noticed
++ by the build bots.
++ * testsuite/caps/renegotiate.c: (main): Same.
++
++2004-05-03 David Schleef <ds@schleef.org>
++
++ * testsuite/caps/renegotiate.c: (my_fixate), (main): Another test.
++
++2004-05-03 David Schleef <ds@schleef.org>
++
++ * testsuite/caps/deserialize.c: (main): Use the srcdir environment
++ variable to find our source file.
++
++2004-05-03 David Schleef <ds@schleef.org>
++
++ * configure.ac: Link plugins with libgstreamer and dependent
++ libraries
++ * testsuite/caps/Makefile.am:
++ * testsuite/caps/caps_strings:
++ * testsuite/caps/deserialize.c: (main): Add a little test to slog
++ through a file of caps strings and test each one
++
++2004-05-04 Benjamin Otte <otte@gnome.org>
++
++ * libs/gst/bytestream/Makefile.am:
++ * libs/gst/bytestream/adapter.c:
++ * libs/gst/bytestream/adapter.h:
++ add GstAdapter, similar to bytestream, but doesn't require ugly event
++ handling or uglier loopbased elements
++
++2004-05-03 David Schleef <ds@schleef.org>
++
++ * testsuite/caps/Makefile.am: Fix spelling of ??????????????????????
++ * testsuite/caps/erathostenes.c:
++ * testsuite/caps/eratosthenes.c: (eratosthenes), (main):
++
++2004-05-03 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/pwg/pwg.xml:
++ remove hardcoded stylesheet path (duh)
++ * docs/random/release:
++ * docs/gst/gstreamer-sections.txt:
++ * gst/Makefile.am:
++ * gst/gst.h:
++ * gst/gst_private.h:
++ * gst/gstcaps.c:
++ * gst/gstevent.c:
++ * gst/gstformat.c:
++ * gst/gstinfo.c:
++ * gst/gstinfo.h:
++ * gst/gstinterface.c:
++ * gst/gstmemchunk.c:
++ * gst/gstprobe.c:
++ * gst/gstquery.c:
++ * gst/gstregistry.c:
++ * gst/gstregistrypool.c:
++ * gst/gststructure.c:
++ * gst/gsttaginterface.c:
++ * gst/gstthread.c:
++ * gst/gsttrace.c:
++ * gst/gsttypefind.c: (gst_type_find_factory_get_type):
++ * gst/gsturi.c:
++ * gst/gstvalue.c:
++ deprecate gst_info; remove gstlog.h
++
++
++2004-05-03 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * Makefile.am:
++ * po/en_GB.po:
++ * po/sv.po:
++ * po/uk.po:
++ updated translations
++
++2004-05-03 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstbin.c: (gst_bin_dispose):
++ better debugging
++
++2004-05-03 Johan Dahlin <johan@gnome.org>
++
++ * gst/schedulers/gstoptimalscheduler.c
++ (gst_opt_scheduler_pad_unlink): Check if element is non-NULL and
++ really is a GstElement. Avoids critical when running gst-launch -v
++ and a oggdemux/decoding pipeline.
++
++2004-05-02 Stephane Loeuillet <stephane.loeuillet@tiscali.fr>
++
++ * docs/gst/tmpl/gstpipeline.sgml :
++ * docs/manual/elements-api.xml :
++ doc fix by Patrick Guimond (Protector) from devel ML
++ reviewed by ronald
++
++2004-05-02 Stephane Loeuillet <stephane.loeuillet@tiscali.fr>
++
++ * docs/gst/Makefile.am :
++ * docs/libs/Makefile.am :
++ apply a patch from Arwed v. Merkatz so that gtk-doc
++ generated docs install (same for .devhelp file)
++ (fixes part 1 of #138836)
++
++2004-04-30 Stephane Loeuillet <stephane.loeuillet@tiscali.fr>
++
++ * docs/faq/dependencies.xml: typo
++ * docs/faq/getting.xml :
++ - fix download URL for new gstreamer site
++ - hide sf.net download page as latest version aren't there
++ - fix apt URLs
++ - fill "get via CVS" paragraph (link to dev page on the site)
++ * docs/faq/general.xml:
++ hide status tables as they no more exists
++ change case on plugins license file to reflect reality
++ * docs/faq/troubleshooting.xml:
++ remove the wiki question/answer as there is no more wiki
++
++2004-04-30 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gsterror.h:
++ include the headers needed for declarations used in this header
++
++2004-04-30 Stephane Loeuillet <stephane.loeuillet@tiscali.fr>
++
++ * docs/random/uraeus/gstreamer_and_midi.txt :
++ add .kar (midi + karaoke/lyrics 'track') doc to midi doc.
++ (fixes #132288)
++
++2004-04-30 Sebastien Cote <sc5@hermes.usherb.ca>
++
++ reviewed by Benjamin Otte <otte@gnome.org>
++
++ * gst/schedulers/gthread-cothreads.h:
++ free allocated data for main cothread, too when destroying context
++ (fixes #141417)
++
++2004-04-29 Stephane Loeuillet <stephane.loeuillet@tiscali.fr>
++
++ * docs/manual/goals.xml : remove duplicated paragraph at end
++ of doc page (fixes #141448)
++
++2004-04-29 David Schleef <ds@schleef.org>
++
++ * gst/elements/gstfilesink.c: (gst_filesink_handle_event):
++ Patch from Sebastien Cote to fix leakage of events. (bug #141414)
++
++2004-04-29 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/elements/gstfakesrc.c: (gst_fakesrc_class_init):
++ fix property
++ * gst/gstcaps.c:
++ fix doc string
++ * po/POTFILES.in:
++ rename typefind source file
++
++2004-04-28 David Schleef <ds@schleef.org>
++
++ Several new files from Steve Lhomme's MSVC patch (bug #141317):
++ * win32/GStreamer.vcproj:
++ * win32/Makefile:
++ * win32/config.h:
++ * win32/dirent.c: (_topendir), (_treaddir), (_tclosedir),
++ (_trewinddir), (_ttelldir), (_tseekdir):
++ * win32/dirent.h:
++ * win32/gst-inspect.vcproj:
++ * win32/gst-launch.vcproj:
++ * win32/gst-register.vcproj:
++ * win32/gstbytestream.vcproj:
++ * win32/gstelements.vcproj:
++ * win32/gstoptimalscheduler.vcproj:
++ * win32/gstspider.vcproj:
++ * win32/gtchar.h:
++ * win32/mman.c: (mmap), (mprotect), (msync), (munmap):
++ * win32/mman.h:
++ * win32/mman.inl:
++ * win32/msvc71.sln:
++
++2004-04-29 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gst.c: (init_post):
++ * gst/gstinfo.c:
++ remove useless _gst_progname stuff
++ * tools/gst-inspect.c: (print_field), (print_caps):
++ improve caps output
++
++2004-04-28 David Schleef <ds@schleef.org>
++
++ Disable parsing of a lot of files that aren't part of the
++ exported API. Move corresponding template files to old/,
++ waiting for removal when they don't contain anything
++ interesting.
++ * docs/gst/Makefile.am:
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/cothreads.sgml:
++ * docs/gst/tmpl/cothreads_compat.sgml:
++ * docs/gst/tmpl/gettext.sgml:
++ * docs/gst/tmpl/gobject2gtk.sgml:
++ * docs/gst/tmpl/grammar.tab.sgml:
++ * docs/gst/tmpl/gst-i18n-app.sgml:
++ * docs/gst/tmpl/gst-i18n-lib.sgml:
++ * docs/gst/tmpl/gst_private.sgml:
++ * docs/gst/tmpl/gstaggregator.sgml:
++ * docs/gst/tmpl/gstarch.sgml:
++ * docs/gst/tmpl/gstatomic_impl.sgml:
++ * docs/gst/tmpl/gstbufferstore.sgml:
++ * docs/gst/tmpl/gstdata_private.sgml:
++ * docs/gst/tmpl/gstdisksink.sgml:
++ * docs/gst/tmpl/gstdisksrc.sgml:
++ * docs/gst/tmpl/gstelementfactory.sgml:
++ * docs/gst/tmpl/gstextratypes.sgml:
++ * docs/gst/tmpl/gstfakesink.sgml:
++ * docs/gst/tmpl/gstfakesrc.sgml:
++ * docs/gst/tmpl/gstfdsink.sgml:
++ * docs/gst/tmpl/gstfdsrc.sgml:
++ * docs/gst/tmpl/gstfilesink.sgml:
++ * docs/gst/tmpl/gstfilesrc.sgml:
++ * docs/gst/tmpl/gsthttpsrc.sgml:
++ * docs/gst/tmpl/gstidentity.sgml:
++ * docs/gst/tmpl/gstindexfactory.sgml:
++ * docs/gst/tmpl/gstmarshal.sgml:
++ * docs/gst/tmpl/gstmd5sink.sgml:
++ * docs/gst/tmpl/gstmultidisksrc.sgml:
++ * docs/gst/tmpl/gstmultifilesrc.sgml:
++ * docs/gst/tmpl/gstpadtemplate.sgml:
++ * docs/gst/tmpl/gstpipefilter.sgml:
++ * docs/gst/tmpl/gstschedulerfactory.sgml:
++ * docs/gst/tmpl/gstsearchfuncs.sgml:
++ * docs/gst/tmpl/gstshaper.sgml:
++ * docs/gst/tmpl/gstspider.sgml:
++ * docs/gst/tmpl/gstspideridentity.sgml:
++ * docs/gst/tmpl/gststatistics.sgml:
++ * docs/gst/tmpl/gsttee.sgml:
++ * docs/gst/tmpl/gsttimecache.sgml:
++ * docs/gst/tmpl/gsttypefind.sgml:
++ * docs/gst/tmpl/gsttypefindfactory.sgml:
++ * docs/gst/tmpl/gstxmlregistry.sgml:
++ * docs/gst/tmpl/gthread-cothreads.sgml:
++ * docs/gst/tmpl/old/cothreads.sgml:
++ * docs/gst/tmpl/old/cothreads_compat.sgml:
++ * docs/gst/tmpl/old/gettext.sgml:
++ * docs/gst/tmpl/old/gobject2gtk.sgml:
++ * docs/gst/tmpl/old/grammar.tab.sgml:
++ * docs/gst/tmpl/old/gst-i18n-app.sgml:
++ * docs/gst/tmpl/old/gst-i18n-lib.sgml:
++ * docs/gst/tmpl/old/gst_private.sgml:
++ * docs/gst/tmpl/old/gstaggregator.sgml:
++ * docs/gst/tmpl/old/gstarch.sgml:
++ * docs/gst/tmpl/old/gstatomic_impl.sgml:
++ * docs/gst/tmpl/old/gstbufferstore.sgml:
++ * docs/gst/tmpl/old/gstdata_private.sgml:
++ * docs/gst/tmpl/old/gstdisksink.sgml:
++ * docs/gst/tmpl/old/gstdisksrc.sgml:
++ * docs/gst/tmpl/old/gstelementfactory.sgml:
++ * docs/gst/tmpl/old/gstextratypes.sgml:
++ * docs/gst/tmpl/old/gstfakesink.sgml:
++ * docs/gst/tmpl/old/gstfakesrc.sgml:
++ * docs/gst/tmpl/old/gstfdsink.sgml:
++ * docs/gst/tmpl/old/gstfdsrc.sgml:
++ * docs/gst/tmpl/old/gstfilesink.sgml:
++ * docs/gst/tmpl/old/gstfilesrc.sgml:
++ * docs/gst/tmpl/old/gsthttpsrc.sgml:
++ * docs/gst/tmpl/old/gstidentity.sgml:
++ * docs/gst/tmpl/old/gstindexfactory.sgml:
++ * docs/gst/tmpl/old/gstmarshal.sgml:
++ * docs/gst/tmpl/old/gstmd5sink.sgml:
++ * docs/gst/tmpl/old/gstmultidisksrc.sgml:
++ * docs/gst/tmpl/old/gstmultifilesrc.sgml:
++ * docs/gst/tmpl/old/gstpadtemplate.sgml:
++ * docs/gst/tmpl/old/gstpipefilter.sgml:
++ * docs/gst/tmpl/old/gstschedulerfactory.sgml:
++ * docs/gst/tmpl/old/gstsearchfuncs.sgml:
++ * docs/gst/tmpl/old/gstshaper.sgml:
++ * docs/gst/tmpl/old/gstspider.sgml:
++ * docs/gst/tmpl/old/gstspideridentity.sgml:
++ * docs/gst/tmpl/old/gststatistics.sgml:
++ * docs/gst/tmpl/old/gsttee.sgml:
++ * docs/gst/tmpl/old/gsttimecache.sgml:
++ * docs/gst/tmpl/old/gsttypefindfactory.sgml:
++ * docs/gst/tmpl/old/gstxmlregistry.sgml:
++ * docs/gst/tmpl/old/gthread-cothreads.sgml:
++ * docs/gst/tmpl/old/types.sgml:
++ * docs/gst/tmpl/types.sgml:
++
++ Rename gsttypefind.[ch] back to gsttypefindelement.[ch], since
++ gtkdoc-scan doesn't like files with the same name in different
++ directories.
++ * gst/elements/Makefile.am:
++ * gst/elements/gstelements.c:
++ * gst/elements/gsttypefind.c:
++ * gst/elements/gsttypefind.h:
++ * gst/elements/gsttypefindelement.c:
++ * gst/elements/gsttypefindelement.h:
++
++2004-04-28 David Schleef <ds@schleef.org>
++
++ A bunch of portability fixes, derived from Steve Lhomme's MSVC
++ patch (bug #141317):
++ * gst/gst-i18n-lib.h: Allow disabling gettext.
++ * gst/gstatomic_impl.h: disable warning when it's dumb.
++ * gst/gstclock.c: fix include
++ * gst/gstcompat.h: fix variadic macro
++ * gst/gstinfo.c: fix include
++ * gst/gstmacros.h: add defines for inlines on MSVC
++ * gst/gstplugin.c: fix includes
++ * gst/gstregistry.c: fix includes
++ * gst/gstregistry.h: use S_IREAD, etc., if S_IRUSR isn't defined
++ * gst/gstsystemclock.c: fix include
++ * gst/gsttrace.c: (gst_trace_new), (gst_trace_text_flush): use
++ S_IREAD if S_IRUSR isn't defined. fix use of non-portable functions
++ * gst/registries/gstxmlregistry.c:
++ (gst_xml_registry_parse_element_factory): fix use of non-portable
++ functions
++ * libs/gst/control/dparam.h: Remove trailing comma in enum definition
++ * libs/gst/control/dparammanager.h: same
++
++2004-04-28 David Schleef <ds@schleef.org>
++
++ Move a bunch of unused files to old/ with names that are
++ not case-insensitive-unique. These files still contain some
++ useful information that needs to be merged into gstbin.sgml,
++ etc., so they shouldn't be deleted yet.
++ * docs/gst/tmpl/GstBin.sgml:
++ * docs/gst/tmpl/GstBuffer.sgml:
++ * docs/gst/tmpl/GstCaps.sgml:
++ * docs/gst/tmpl/GstClock.sgml:
++ * docs/gst/tmpl/GstCompat.sgml:
++ * docs/gst/tmpl/GstData.sgml:
++ * docs/gst/tmpl/GstElement.sgml:
++ * docs/gst/tmpl/GstEvent.sgml:
++ * docs/gst/tmpl/GstIndex.sgml:
++ * docs/gst/tmpl/GstStructure.sgml:
++ * docs/gst/tmpl/GstTag.sgml:
++ * docs/gst/tmpl/old/GstBin.sgml:
++ * docs/gst/tmpl/old/GstBuffer.sgml:
++ * docs/gst/tmpl/old/GstCaps.sgml:
++ * docs/gst/tmpl/old/GstClock.sgml:
++ * docs/gst/tmpl/old/GstCompat.sgml:
++ * docs/gst/tmpl/old/GstData.sgml:
++ * docs/gst/tmpl/old/GstElement.sgml:
++ * docs/gst/tmpl/old/GstEvent.sgml:
++ * docs/gst/tmpl/old/GstIndex.sgml:
++ * docs/gst/tmpl/old/GstStructure.sgml:
++ * docs/gst/tmpl/old/GstTag.sgml:
++
++2004-04-28 David Schleef <ds@schleef.org>
++
++ * gst/gstcaps.c: (gst_caps_copy), (gst_caps_free),
++ (gst_caps_append), (gst_caps_append_structure),
++ (gst_caps_get_size), (gst_caps_get_structure), (gst_caps_copy_1),
++ (gst_caps_set_simple), (gst_caps_set_simple_valist),
++ (gst_caps_is_any), (gst_caps_is_empty), (gst_caps_is_chained),
++ (gst_caps_is_fixed), (gst_caps_is_always_compatible),
++ (gst_caps_intersect), (gst_caps_normalize),
++ (gst_caps_transform_to_string): Patch from Tim-Philipp Müller
++ to fix GST_CAPS() and GST_IS_CAPS(). (bug #141304)
++ * gst/gstcaps.h: use GST_IS_CAPS().
++
++2004-04-26 David Schleef <ds@schleef.org>
++
++ * gst/gstcpu.c: (gst_cpuid_i386): Don't clobber ebx in inline
++ assembly. gcc doesn't handle it correctly. (bug #141083)
++ * gst/gsttrashstack.h: same
++
++2004-04-25 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstelement.c: (gst_element_change_state):
++ fix assertion to do an int comparison
++
++2004-04-25 Benjamin Otte <otte@gnome.org>
++
++ * gst/elements/gstfilesrc.c: (gst_filesrc_open_file):
++ better debugging output on error
++
++2004-04-25 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstcaps.c: (gst_caps_subtract):
++ fix memleak
++
++2004-04-23 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstvalue.c: (gst_value_compare_buffer),
++ (_gst_value_initialize):
++ add comparison function for buffers
++
++2004-04-22 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/pwg.xml:
++ Just found out that this so-called "ima-wav" format is really
++ just "dvi adpcm" (according to the MS WAV documentation). So
++ renaming it. We didn't use it yet anyway.
++
++2004-04-23 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstcaps.c: (gst_caps_is_always_compatible):
++ call gst_caps_is_subset
++
++2004-04-23 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstcaps.c: (gst_caps_subtract), (gst_caps_is_equal),
++ (gst_caps_is_subset):
++ add documentation
++
++2004-04-23 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstcaps.c: (gst_caps_structure_subtract_field),
++ (gst_caps_structure_subtract), (gst_caps_subtract),
++ (gst_caps_structure_figure_out_union),
++ (gst_caps_structure_simplify), (gst_caps_do_simplify):
++ fix simplifying and subtracting not working correctly with optional
++ properties
++ solve assorted problems that make it now simplify ebven more
++ * docs/gst/tmpl/gstcaps.sgml:
++ * gst/gstcaps.h:
++ make gst_caps_do_simplify return a bool to indicate if it simplified
++ * testsuite/caps/simplify.c: (main):
++ add more checks. The tests is quite a bit useless right now because
++ the core is heavily simplifying itself.
++ * testsuite/caps/caps.h:
++ fix caps to contain all optional properties
++
++2004-04-22 Benjamin Otte <otte@gnome.org>
++
++ * docs/gst/tmpl/gstcaps.sgml:
++ * docs/gst/tmpl/gstfilesrc.sgml:
++ * docs/gst/tmpl/gststructure.sgml:
++ * docs/gst/tmpl/gstvalue.sgml:
++ update for recent API changes
++ * gst/gstcaps.c: (gst_caps_do_simplify):
++ fix to stop trying with a freed structure
++ * gst/gstpad.c: (gst_pad_link_fixate):
++ simplify caps
++ * gst/gstpad.c: (gst_pad_template_get_caps_by_name):
++ remove C++ comment
++ * gst/gstpad.h:
++ deprecate gst_pad_template_get_caps_by_name, it doesn't work anyway
++ * gst/gststructure.c: (gst_structure_value_get_generic_type),
++ (gst_structure_to_string):
++ keep the correct type when using lists of ranges
++ * gst/gstvalue.c: (gst_value_list_prepend_value),
++ (gst_value_list_append_value):
++ copy the value before adding to the list (d'oh)
++ * gst/gstvalue.c: (gst_value_subtract_int_range_int),
++ (gst_value_subtract_int_range_int_range):
++ handle overflows correctly
++ * gst/gstvalue.c: (gst_value_subtract_from_list):
++ fix memleak
++ * testsuite/caps/caps.h:
++ add a caps that caused segfaults
++
++2004-04-22 Benjamin Otte <otte@gnome.org>
++
++ * testsuite/refcounting/pad.c: (main):
++ fix test
++
++2004-04-22 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstcaps.c: (gst_caps_subtract):
++ allow subtracting ANY and EMPTY from ANY caps
++
++2004-04-22 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstcaps.c: (gst_caps_append), (gst_caps_intersect),
++ (gst_caps_union):
++ only simplify in functions that create new caps. Simplifying in
++ gst_caps_append breaks tests.
++
++2004-04-22 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstcaps.c: (gst_caps_structure_simplify):
++ unset GValue after use
++ * gst/gstcaps.c: (gst_caps_append),
++ * gst/gstpad.c: (gst_pad_link_fixate), (gst_pad_template_new):
++ use gst_caps_simplify (reduces registry size by 30%)
++ * gst/gstpad.c: (gst_pad_template_new):
++ don't allow NULL caps
++
++2004-04-22 Benjamin Otte <otte@gnome.org>
++
++ * docs/gst/gstreamer-sections.txt:
++ add gst_caps_do_simplify
++ * gst/gstcaps.c:
++ add documentation for gst_caps_do_simplify
++ * gst/gstvalue.h:
++ fix typo in gst_value_register_subtract_func declaration for gst-doc
++
++2004-04-22 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstcaps.c: (gst_caps_from_string_inplace):
++ fix bug when converting from empty string.
++ * gst/gstcaps.c: (gst_caps_new_any), (gst_caps_new_simple),
++ (gst_caps_new_full_valist), (gst_caps_copy), (gst_caps_copy_1):
++ use gst_caps_new_empty to allocate a new caps. Only that function
++ allocates memory for caps now.
++ * gst/gstcaps.c: (gst_caps_remove_and_get_structure),
++ (gst_caps_remove_structure):
++ add ability to remove one structure (but not to header yet)
++ * gst/gstcaps.c: (gst_caps_compare_structures),
++ (gst_caps_simplify), (gst_caps_structure_figure_out_union),
++ (gst_caps_structure_simplify), (gst_caps_do_simplify),
++ * gst/gstcaps.h:
++ add gst_caps_do_simplify that tries to simplify a caps in place.
++ Deprecate old gst_caps_simplify function.
++ * testsuite/caps/caps.h:
++ add caps.h containing a common set of caps to test against.
++ * testsuite/caps/sets.c: (check_caps), (main):
++ use it.
++ * testsuite/caps/.cvsignore:
++ * testsuite/caps/Makefile.am:
++ * testsuite/caps/simplify.c: (check_caps), (main):
++ add test to check correctness and efficency of caps simplification.
++
++2004-04-22 Sebastien Cote <sc5@hermes.usherb.ca>
++
++ reviewed by Benjamin Otte <otte@gnome.org>
++
++ * gst/gstparse.c: (_gst_parse_escape):
++ Free the GString used in _gst_parse_escape()
++
++2004-04-21 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstpad.c: (gst_pad_link_negotiate):
++ refuse to link if the link is not possible
++ * configure.ac:
++ * testsuite/Makefile.am:
++ * testsuite/negotiation/.cvsignore:
++ * testsuite/negotiation/Makefile.am:
++ * testsuite/negotiation/pad_link.c: (main):
++ add test that checks the above behaviour
++
++2004-04-21 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/gstreamer-sections.txt:
++ add newly added API
++
++2004-04-21 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/elements/gstfilesrc.c: (gst_filesrc_init),
++ (gst_filesrc_get_mmap), (gst_filesrc_get_read), (gst_filesrc_get),
++ (gst_filesrc_open_file), (gst_filesrc_close_file),
++ (gst_filesrc_srcpad_query), (gst_filesrc_srcpad_event):
++ * gst/elements/gstfilesrc.h:
++ add support for non-regular files (#140734)
++
++2004-04-21 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstpad.c: (gst_pad_link_fixate):
++ add sophisticated error checking code to see if fixation functions
++ did their fixation right
++
++2004-04-21 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstcaps.c: (gst_caps_append), (gst_caps_union):
++ check for ANY caps before appending/unioning
++ * gst/gstcaps.c: (gst_caps_is_subset),
++ (gst_caps_is_equal), (gst_caps_structure_subtract_field),
++ (gst_caps_structure_subtract), (gst_caps_subtract):
++ * gst/gstcaps.h:
++ add gst_caps_is_equal, gst_caps_is_subset and gst_caps_subtract to
++ the API. deprecate gst_caps_is_equal_fixed
++ * gst/gstpad.c: (gst_pad_try_set_caps):
++ * gst/gstqueue.c: (gst_queue_link):
++ s/gst_caps_is_equal_fixed/gst_caps_is_equal/
++ * gst/gststructure.c: (gst_structure_get_name_id):
++ * gst/gststructure.h:
++ add function gst_structure_get_name_id
++ * gst/gstvalue.c: (gst_value_subtract_int_int_range),
++ (gst_value_create_new_range), (gst_value_subtract_int_range_int),
++ (gst_value_subtract_int_range_int_range),
++ (gst_value_subtract_double_double_range),
++ (gst_value_subtract_double_range_double),
++ (gst_value_subtract_double_range_double_range),
++ (gst_value_subtract_from_list), (gst_value_subtract_list),
++ (gst_value_can_intersect), (gst_value_subtract),
++ (gst_value_can_subtract), (gst_value_register_subtract_func),
++ (_gst_value_initialize):
++ * gst/gstvalue.h:
++ add support for subtracting values from each other. Note that
++ subtracting means subtracting as in set theory. Required for caps
++ stuff above.
++ * testsuite/caps/.cvsignore:
++ * testsuite/caps/Makefile.am:
++ * testsuite/caps/erathostenes.c: (erathostenes), (main):
++ * testsuite/caps/sets.c: (check_caps), (main):
++ * testsuite/caps/subtract.c: (check_caps), (main):
++ add tests for subtraction and equality code.
++
++2004-04-20 David Schleef <ds@schleef.org>
++
++ * gst/autoplug/Makefile.am: Fix some little buglets in last checkin.
++ * gst/indexers/Makefile.am:
++ * gst/schedulers/Makefile.am:
++ * libs/gst/bytestream/Makefile.am:
++ * libs/gst/control/Makefile.am:
++ * libs/gst/getbits/Makefile.am:
++
++2004-04-20 David Schleef <ds@schleef.org>
++
++ * common/as-libtool.mak: Fine-tune DLL building.
++ * configure.ac: Link plugins against libgstreamer. Define plugindir
++ (like gst-plugins)
++ * examples/plugins/Makefile.am: remove plugindir
++ * gst/autoplug/Makefile.am: DLL building fixes
++ * gst/elements/Makefile.am: DLL building fixes. Disable pipefilter on
++ Windows.
++ * gst/elements/gstelements.c: Conditionally disable pipefilter.
++ * gst/indexers/Makefile.am: DLL building fixes
++ * gst/schedulers/Makefile.am: DLL building fixes.
++ * libs/gst/bytestream/Makefile.am: DLL building fixes.
++ * libs/gst/control/Makefile.am: same
++ * libs/gst/getbits/Makefile.am: same
++ * testsuite/Makefile.am: New dlopen directory
++ * testsuite/dlopen/Makefile.am: Tests to check if libgstreamer works
++ when dlopened.
++ * testsuite/dlopen/dlopen_gst.c: (main): same
++ * testsuite/dlopen/loadgst.c: (do_test): same
++
++2004-04-20 David Schleef <ds@schleef.org>
++
++ * gst/parse/grammar.y: Apply patch from Sebastien Cote
++ <sc5@hermes.usherb.ca> to fix a memleak. (bug #140594)
++
++2004-04-20 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstelement.c: (gst_element_wait),
++ (gst_element_set_time_delay), (gst_element_change_state):
++ Use GST_TIME_*
++
++2004-04-20 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/autoplug/gstspider.c: (gst_spider_link_sometimes),
++ (gst_spider_identity_plug):
++ improve debugging messages
++ * gst/gstbin.c: (gst_bin_remove_func):
++ make sure the state_change function is only called with simple state
++ transitions
++
++2004-04-20 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/elements/gstfakesink.c: (gst_fakesink_state_error_get_type),
++ (gst_fakesink_set_property), (gst_fakesink_chain):
++ * gst/elements/gstfakesrc.c: (gst_fakesrc_set_property):
++ * gst/elements/gstfdsrc.c: (gst_fdsrc_set_property):
++ * gst/elements/gstfilesrc.c: (gst_filesrc_set_property):
++ * gst/elements/gstidentity.c: (gst_identity_chain),
++ (gst_identity_set_property):
++ * gst/elements/gstmultifilesrc.c: (gst_multifilesrc_set_property):
++ * gst/elements/gstpipefilter.c: (gst_pipefilter_set_property):
++ add warnings to _set_property for unknown arguments
++ use GST_TIME_FORMAT/GST_TIME_ARGS for timestamp printing
++
++2004-04-20 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * Makefile.am:
++ * docs/manuals.mak:
++ add .po file download snippet
++ fix a bug in the doc makefile
++
++2004-04-20 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * Makefile.am:
++ * po/LINGUAS:
++ * po/en_GB.po:
++ Added en_GB translation (Gareth Owen)
++
++2004-04-20 Johan Dahlin <johan@gnome.org>
++
++ * gst/gstpad.c (_invent_event): Clean up
++
++2004-04-20 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * testsuite/caps/filtercaps.c: (main):
++ fix test to test things correctly (caps are complicated)
++
++2004-04-20 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * testsuite/caps/Makefile.am:
++ * testsuite/caps/filtercaps.c: (main):
++ add test (that doesn't work right now, but should)
++
++2004-04-19 David Schleef <ds@schleef.org>
++
++ * configure.ac: Add test for allowing unaligned access. Add define
++ to put in gstconfig.h.
++ * docs/gst/gstreamer-sections.txt: New symbols
++ * docs/gst/tmpl/gstcompat.sgml: Check in changes made by gtkdoc
++ * docs/gst/tmpl/gstfilesrc.sgml:
++ * docs/gst/tmpl/gstparse.sgml:
++ * docs/gst/tmpl/gsttypes.sgml:
++ * docs/gst/tmpl/gstutils.sgml:
++ * docs/gst/tmpl/gstvalue.sgml:
++ * gst/gstconfig.h.in: Add GST_HAVE_UNALIGNED_ACCESS
++ * gst/gstutils.h: Add macros for unaligned memory access. Useful
++ on most !i386/!powerpc architectures. From Daniel Gazard
++ <daniel.gazard@free.fr>. (bug #140156)
++ * po/af.po: Check in changes made by gettext.
++ * po/az.po:
++ * po/fr.po:
++ * po/nl.po:
++ * po/sr.po:
++ * po/sv.po:
++
++2004-04-20 Benjamin Otte <otte@gnome.org>
++
++ * gst/schedulers/entryscheduler.c:
++ (gst_entry_scheduler_yield):
++ refuse to yield when decoupled elements insist on doing that.
++ At least it's better than crashing
++
++2004-04-19 David Schleef <ds@schleef.org>
++
++ * docs/libs/Makefile.am: Change sinclude to include
++ * docs/gst/Makefile.am: same
++ * pkgconfig/Makefile.am: Remove GNU-ism from makefile target
++
++2004-04-19 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * po/LINGUAS:
++ * po/uk.po:
++ Added Ukrainian translation (Maxim V. Dziumanenko)
++
++2004-04-19 Johan Dahlin <johan@gnome.org>
++
++ * gst/parse/grammar.y (__gst_parse_chain_free): Don't do null
++ checking here, do it before calling the function.
++ Clean up, use for loops instead of while loops while iterating
++ over lists.
++
++ * gst/autoplug/gstspider.c (gst_spider_request_new_pad): Fix typo
++ in debug message.
++ (gst_spider_create_and_plug): Improve debug message.
++ General: Replace while loops which iterates over GLists with for
++ loops. Which are much cleaner, improves readability, especially
++ for gst_spider_identity_plug
++
++ * gst/gstpad.c (_invent_event): Fix parameters to warning macros,
++ fixes bug 140477
++
++2004-04-18 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * po/LINGUAS:
++ * po/tr.po:
++ Added Turkish translation (Baris Cicek)
++
++2004-04-18 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/faq/troubleshooting.xml:
++ Mention gst-register in the FAQ (fixes 139045).
++
++2004-04-17 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/gstreamer-sections.txt:
++
++2004-04-17 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstelement.c: (gst_element_dispose):
++ simplify
++ * gst/gstpad.c: (gst_pad_call_chain_function):
++ don't create loads of events due to bad macro usage
++
++2004-04-16 David Schleef <ds@schleef.org>
++
++ * gst/gstcaps.c: (gst_caps_is_fixed_foreach):
++ * gst/gstpad.c: (_gst_pad_default_fixate_foreach):
++ * gst/gstvalue.c: (gst_value_serialize_buffer),
++ (gst_value_deserialize_buffer), (gst_type_is_fixed),
++ (_gst_value_initialize): Create a new function gst_type_is_fixed()
++ to indicate types that are fixed wrt caps or not. Switching to
++ this function fixes (bug #140298).
++ * gst/gstvalue.h:
++
++2004-04-16 David Schleef <ds@schleef.org>
++
++ * common/m4/gst-arch.m4: Implmenent a whitelist and blacklist
++ for GST_UNALIGNED_ACESS, since we essentially know which archs
++ are ok.
++
++2004-04-17 Benjamin Otte <otte@gnome.org>
++
++ * docs/gst/Makefile.am:
++ ignore gst/parse directory when building docs (fixes #140205)
++
++2004-04-16 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * testsuite/refcounting/mem.c: (vmsize):
++ do error checking
++
++2004-04-16 Johan Dahlin <johan@gnome.org>
++
++ * docs/gst/gstreamer-sections.txt: Add gst_pad_call_chain_function
++ and gst_pad_call_get_function.
++
++2004-04-15 David Schleef <ds@schleef.org>
++
++ * common/m4/gst-arch.m4: Add GST_UNALIGNED_ACCESS() macro that
++ checks if we can access unaligned memory.
++ * configure.ac: Use it.
++
++2004-04-16 Benjamin Otte <otte@gnome.org>
++
++ * gst/elements/gstfilesrc.c: (gst_filesrc_init), (gst_filesrc_get),
++ (gst_filesrc_change_state), (gst_filesrc_srcpad_event):
++ * gst/elements/gstfilesrc.h:
++ s/seek_happened/need_discont/ and require discont before sending any
++ data
++
++2004-04-15 David Schleef <ds@schleef.org>
++
++ * gst/gstvalue.c: (gst_value_serialize_buffer),
++ (gst_value_deserialize_buffer), (_gst_value_initialize):
++ Register these types as fundamental types. (bug #140015)
++
++2004-04-16 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstpad.c: (gst_pad_set_active), (gst_pad_link_new),
++ (gst_pad_link_free), (gst_pad_link_try), (_invent_event),
++ (gst_pad_pull):
++ implement enforcing discont events before buffers are passed. This
++ allows state changes of only some elements and later correctly going
++ on where they left off (or in short: you can now set audio sinks to
++ NULL to release the device when the pipeline is paused)
++ * gst/gstpad.c: (gst_pad_call_chain_function),
++ (gst_pad_call_get_function):
++ * gst/gstpad.h:
++ add gst_pad_call_chain_function and gst_pad_call_get_function for
++ scheduler interaction. They are required because of the changes
++ above.
++ * gst/schedulers/entryscheduler.c: (get_buffer),
++ (gst_entry_scheduler_chain_wrapper),
++ (gst_entry_scheduler_get_wrapper),
++ (gst_entry_scheduler_state_transition),
++ (gst_entry_scheduler_pad_link):
++ * gst/schedulers/gstbasicscheduler.c:
++ (gst_basic_scheduler_chain_wrapper),
++ (gst_basic_scheduler_src_wrapper),
++ (gst_basic_scheduler_chainhandler_proxy),
++ (gst_basic_scheduler_gethandler_proxy),
++ (gst_basic_scheduler_cothreaded_chain),
++ (gst_basic_scheduler_chain_elements):
++ * gst/schedulers/gstoptimalscheduler.c:
++ (get_group_schedule_function), (pad_clear_queued),
++ (gst_opt_scheduler_pad_link):
++ use the new functions instead of calling get/chain-functions
++ directly.
++
++2004-04-15 David Schleef <ds@schleef.org>
++
++ * docs/gst/gstreamer-sections.txt: Remove deprecated symbols.
++ * docs/gst/tmpl/gstinfo.sgml: same
++ * docs/gst/tmpl/gstutils.sgml: Remove a bunch of bogus crap that
++ gtk-doc put here.
++ * gst/gstutils.h: Remove the \ that was confusing gtk-doc.
++ * examples/queue/queue.c: (main): We iterate pipelines, not
++ bins. (bug #139996)
++
++2004-04-15 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced-types.xml:
++ Add MS RLE support. Also document Qt RLE although I have no sample
++ files for that yet. And document an extra property for ADPCM.
++
++2004-04-15 David Schleef <ds@schleef.org>
++
++ * gst/gstplugin.c: (_gst_plugin_fault_handler_restore),
++ (_gst_plugin_fault_handler_setup): Disable more stuff on
++ Windows.
++
++2004-04-15 David Schleef <ds@schleef.org>
++
++ * gst/gstinfo.c: (_gst_debug_init): Change some internal
++ symbol names to not conflict with new gstinfo.h symbols.
++ * gst/gstinfo.h: Add inline functions for all those crazy
++ compilers that don't know how to handle variadic macros (MSVC).
++
++2004-04-15 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac: bump nano to 1
++
++=== release 0.8.1 ===
++
++2004-04-15 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * NEWS:
++ * RELEASE:
++ * configure.ac:
++ releasing 0.8.1, "Snow Brigade"
++
++2004-04-14 David Schleef <ds@schleef.org>
++
++ * testsuite/Makefile.am: define tests_ignore
++ * testsuite/Rules: Added new tests_ignore, which get compiled,
++ but not run (generally because they're inconsistent or have
++ heisenbugs). Now we can ensure all the .c files compile in
++ testsuite/.
++ * testsuite/bins/Makefile.am: define tests_ignore
++ * testsuite/bytestream/Makefile.am:
++ * testsuite/caps/Makefile.am:
++ * testsuite/clock/Makefile.am:
++ * testsuite/debug/Makefile.am:
++ * testsuite/debug/global.c: (gst_debug_log_one),
++ (gst_debug_log_two): Fix compilation problem.
++ * testsuite/dynparams/Makefile.am:
++ * testsuite/elements/Makefile.am:
++ * testsuite/ghostpads/Makefile.am:
++ * testsuite/indexers/Makefile.am:
++ * testsuite/parse/Makefile.am:
++ * testsuite/plugin/Makefile.am:
++ * testsuite/refcounting/Makefile.am:
++ * testsuite/refcounting/element_pad.c: (main): Don't return leak
++ results, because it's not calculated correctly.
++ * testsuite/refcounting/pad.c: (main): same
++ * testsuite/states/Makefile.am:
++ * testsuite/tags/Makefile.am:
++ * testsuite/threads/Makefile.am:
++
++2004-04-14 David Schleef <ds@schleef.org>
++
++ * gst/gstcpu.c: (gst_cpuid_i386): Add workaround for gcc-3.2
++ generating bad code around the cpu detection asm code.
++
++2004-04-14 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * tools/gst-inspect.c: (print_element_info):
++ print numeric version of rank as well, since we added some - 1
++ rank values to elements
++
++2004-04-13 David Schleef <ds@schleef.org>
++
++ * configure.ac: Disable various code when compiling for MinGW.
++ * gst/elements/Makefile.am:
++ * gst/elements/gstelements.c:
++ * gst/elements/gstfdsrc.c: (gst_fdsrc_get):
++ * gst/elements/gstfilesrc.c: (gst_filesrc_init), (gst_filesrc_get):
++ * gst/registries/gstxmlregistry.c: (make_dir):
++
++2004-04-13 David Schleef <ds@schleef.org>
++
++ * gst/Makefile.am:
++ * gst/gstcpu.c: (gst_cpuid_i386): Convert asm source into inline
++ assembly.
++ * gst/gstcpuid_i386.s: remove
++
++2004-04-13 David Schleef <ds@schleef.org>
++
++ * docs/gst/tmpl/gstaggregator.sgml: Random checkin because gtk-doc
++ seems to think it needs to be done.
++ * docs/gst/tmpl/gstfakesink.sgml:
++ * docs/gst/tmpl/gstfakesrc.sgml:
++ * docs/gst/tmpl/gstfdsink.sgml:
++ * docs/gst/tmpl/gstfdsrc.sgml:
++ * docs/gst/tmpl/gstfilesink.sgml:
++ * docs/gst/tmpl/gstfilesrc.sgml:
++ * docs/gst/tmpl/gstidentity.sgml:
++ * docs/gst/tmpl/gstmd5sink.sgml:
++ * docs/gst/tmpl/gstmultifilesrc.sgml:
++ * docs/gst/tmpl/gstpipefilter.sgml:
++ * docs/gst/tmpl/gstshaper.sgml:
++ * docs/gst/tmpl/gstspider.sgml:
++ * docs/gst/tmpl/gstspideridentity.sgml:
++ * docs/gst/tmpl/gststatistics.sgml:
++ * docs/gst/tmpl/gsttee.sgml:
++ * docs/gst/tmpl/gsttypefind.sgml:
++ * docs/gst/tmpl/gstutils.sgml:
++
++2004-04-13 David Schleef <ds@schleef.org>
++
++ * configure.ac: Changes to remove POSIXisms (mmap in this case)
++ and to build DLLs on Windows.
++ * gst/Makefile.am:
++ * gst/elements/gstfilesrc.c: (gst_filesrc_get),
++ (gst_filesrc_open_file):
++ * gst/schedulers/Makefile.am:
++
++2004-04-13 David Schleef <ds@schleef.org>
++
++ * gst/gstcaps.c: (gst_caps_structure_fixate_field_nearest_int),
++ (gst_caps_structure_fixate_field_nearest_double): Fix bug in
++ fixating lists.
++
++2004-04-12 David Schleef <ds@schleef.org>
++
++ * gst/gstbuffer.c: (_gst_buffer_initialize), (gst_buffer_get_type),
++ (gst_buffer_free_chunk): Added gst_buffer_get_type() and changed
++ to using it.
++ * gst/gstbuffer.h: Changed GST_BUFFER_TYPE to gst_buffer_get_type()
++ * gst/gstcaps.c: (gst_caps_is_fixed_foreach): Buffer is a fixed type
++ * gst/gstpad.c: (_gst_pad_default_fixate_foreach): same
++ * gst/gststructure.c: (gst_structure_set_valist),
++ (gst_structure_from_abbr), (gst_structure_to_abbr): Add vararg
++ support for buffers.
++ * gst/gsttag.c: (gst_tag_register): Constify a prototype that was
++ intended to be const.
++ * gst/gsttag.h: same
++ * gst/gstvalue.c: (gst_value_serialize_buffer),
++ (gst_value_deserialize_buffer), (_gst_value_initialize): Add code
++ to (de)serialize buffers.
++ * testsuite/caps/Makefile.am: Add a bit of buffer testing
++ * testsuite/caps/string-conversions.c: (main):
++ * testsuite/caps/value_serialize.c: add new test
++
++2004-04-11 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced-types.xml:
++ Document MS video 1 (video/x-msvideocodec) mimetype/format.
++
++2004-04-11 Benjamin Otte <otte@gnome.org>
++
++ * gst/schedulers/gstbasicscheduler.c: (plugin_init):
++ rename categories to basic_*
++ * gst/schedulers/gstbasicscheduler.c:
++ (gst_basic_scheduler_chain_wrapper),
++ (gst_basic_scheduler_chainhandler_proxy),
++ (gst_basic_scheduler_gethandler_proxy),
++ (gst_basic_scheduler_eventhandler_proxy):
++ debugging category fixes - put common stuff in log category
++ * gst/schedulers/gstbasicscheduler.c:
++ (gst_basic_scheduler_chain_elements):
++ dirty fix: call gst_basic_scheduler_cothreaded_chain when already
++ active and linking two active chains
++
++2004-04-10 Benjamin Otte <otte@gnome.org>
++
++ * docs/pwg/intro-preface.xml:
++ fix dead links and remove reference to Wiki
++
++2004-04-10 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/schedulers/gstbasicscheduler.c:
++ make sure we can switch back to the main function if we're still in
++ the main function (supposed to fix #139617)
++ * gst/schedulers/gthread-cothreads.h:
++ don't throw an error when switching to the same cothread
++
++2004-04-09 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstbin.c: (gst_bin_get_type):
++ * gst/gstclock.c: (gst_clock_get_type):
++ * gst/gstindex.c: (gst_index_get_type):
++ * gst/gstobject.c: (gst_object_get_type),
++ (gst_signal_object_get_type):
++ * gst/gstpad.c: (gst_pad_get_type), (gst_real_pad_get_type),
++ (gst_pad_template_get_type), (gst_ghost_pad_get_type):
++ * gst/gstpluginfeature.c: (gst_plugin_feature_get_type):
++ * gst/gstqueue.c: (gst_queue_get_type):
++ * gst/gstregistry.c: (gst_registry_get_type):
++ * gst/gstsystemclock.c: (gst_system_clock_get_type):
++ * gst/gstthread.c: (gst_thread_get_type):
++ don't use memchunks for these objects, use malloc instead
++
++2004-04-08 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/.cvsignore:
++ * docs/gst/Makefile.am:
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/gstaggregator.sgml:
++ * docs/gst/tmpl/gstbuffer.sgml:
++ * docs/gst/tmpl/gstclock.sgml:
++ * docs/gst/tmpl/gstelement.sgml:
++ * docs/gst/tmpl/gstfakesink.sgml:
++ * docs/gst/tmpl/gstfakesrc.sgml:
++ * docs/gst/tmpl/gstfdsink.sgml:
++ * docs/gst/tmpl/gstfdsrc.sgml:
++ * docs/gst/tmpl/gstfilesink.sgml:
++ * docs/gst/tmpl/gstfilesrc.sgml:
++ * docs/gst/tmpl/gstidentity.sgml:
++ * docs/gst/tmpl/gstindex.sgml:
++ * docs/gst/tmpl/gstinfo.sgml:
++ * docs/gst/tmpl/gstmd5sink.sgml:
++ * docs/gst/tmpl/gstmultifilesrc.sgml:
++ * docs/gst/tmpl/gstpad.sgml:
++ * docs/gst/tmpl/gstpipefilter.sgml:
++ * docs/gst/tmpl/gstpipeline.sgml:
++ * docs/gst/tmpl/gstpluginfeature.sgml:
++ * docs/gst/tmpl/gstqueue.sgml:
++ * docs/gst/tmpl/gstregistry.sgml:
++ * docs/gst/tmpl/gstscheduler.sgml:
++ * docs/gst/tmpl/gstshaper.sgml:
++ * docs/gst/tmpl/gstspider.sgml:
++ * docs/gst/tmpl/gstspideridentity.sgml:
++ * docs/gst/tmpl/gststatistics.sgml:
++ * docs/gst/tmpl/gstsystemclock.sgml:
++ * docs/gst/tmpl/gsttee.sgml:
++ * docs/gst/tmpl/gstthread.sgml:
++ * docs/gst/tmpl/gsttypefind.sgml:
++ * docs/gst/tmpl/gstutils.sgml:
++ further doc build fixes
++
++2004-04-07 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/Makefile.am:
++ make docs exit on scanning problems
++ fix nonsrcdir build issues
++ * docs/gst/gstreamer-sections.txt:
++ adding stuff from -unused
++ * gst/gstqueue.h:
++ create GstQueueSize
++ * gst/schedulers/cothreads_compat.h:
++ fix cothread warnings
++
++2004-04-07 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/gstreamer-sections.txt:
++ remove defines deprecated by Benjamin
++
++2004-04-07 Benjamin Otte <otte@gnome.org>
++
++ * gst/elements/gstbufferstore.c: (gst_buffer_store_get_buffer):
++ when the buffer is complete, don't check if other buffers are needed
++ * gst/elements/gstfilesrc.c: (gst_filesrc_srcpad_event):
++ check that the offset is >0 so we don't try to read before the
++ beginning of the file
++ * gst/gstpad.c: (gst_pad_set_pad_template):
++ sink the template, so we don't end up with 130k pad templates
++
++2004-04-06 Benjamin Otte <otte@gnome.org>
++
++ * gst/autoplug/gstspider.c: (gst_spider_link_add):
++ don't ref the element, adding already reffed it. And we didn't unref
++ it later anyway... (huge memleak when you used many spider elements)
++ * gst/gstelement.c: (gst_element_base_class_finalize):
++ * gst/gstelementfactory.c: (gst_element_factory_cleanup),
++ (gst_element_register):
++ * gst/gsturi.c: (gst_element_make_from_uri):
++ use gst_object_(un)ref instead of g_object(un)ref
++
++2004-04-06 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstbuffer.h:
++ remove macro that wouldn't work anymore because struct member has
++ been removed.
++ * gst/schedulers/entryscheduler.c: (schedule_forward):
++ fix segfault for unconnected pads
++
++2004-04-06 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ reviewed by David Schleef <ds@schleef.org>
++
++ * gst/gstinfo.h:
++ *_FORMAT modifiers should require putting a % in front of them for
++ consistency reasons.
++
++2004-04-05 Colin Walters <walters@redhat.com>
++
++ * configure.ac (VALGRIND_CFLAGS, VALGRIND_LIBS): Remove spurious
++ space.
++
++2004-04-05 Benjamin Otte <otte@gnome.org>
++
++ * configure.ac:
++ * gst/Makefile.am:
++ * gst/gst_private.h:
++ * gst/gstinfo.c: (__gst_in_valgrind), (_gst_debug_init):
++ add support for detecting if GStreamer runs inside valgrind.
++ requires valgrind (d'oh) and --enable-debug for correct cdetection.
++ print a big message in valgrind that GStreamer has detected it's
++ running inside and might now use different code.
++ * gst/gstmemchunk.c: (populate), (free_area),
++ (gst_mem_chunk_destroy), (gst_mem_chunk_alloc),
++ (gst_mem_chunk_free):
++ flag memchunks for valgrind, so it can detect leaking of chunks.
++ This allows detecting leaks of GstBuffer and GstEvent correctly
++ inside valgrind.
++
++2004-04-05 David Schleef <ds@schleef.org>
++
++ * gst/gsttrace.h: Fix #ifdef nesting (bug #139109) Patch from
++ jensgr@gmx.net (Jens Granseuer)
++
++2004-04-05 David Schleef <ds@schleef.org>
++
++ * gst/gstbuffer.c: (_gst_buffer_sub_free),
++ (gst_buffer_default_free), (gst_buffer_default_copy),
++ (gst_buffer_alloc_chunk), (gst_buffer_free_chunk),
++ (gst_buffer_new), (gst_buffer_create_sub): Allocate GstBuffer
++ structures in one place.
++
++2004-04-05 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstinfo.h: adding Ronald's timestamp debugging defines
++ (GST_TIME_FORMAT, GST_TIME_ARGS)
++
++2004-04-05 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * testsuite/elements/Makefile.am:
++ disable test until it stops breaking make distcheck
++
++2004-04-05 Johan Dahlin <johan@gnome.org>
++
++ * po/sv.po: Updated translation
++
++2004-04-05 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstplugin.c: (gst_plugin_load_file):
++ fix segfault for when original plugin was loaded statically
++
++2004-04-05 Benjamin Otte <otte@gnome.org>
++
++ * testsuite/debug/category.c: (main):
++ * testsuite/debug/commandline.c: (main):
++ * testsuite/debug/output.c: (main):
++ fix tests to work again with debugging enabled
++
++2004-04-05 Benjamin Otte <otte@gnome.org>
++
++ * gst/schedulers/gstbasicscheduler.c:
++ (gst_basic_scheduler_pad_link):
++ fix to work with recent scheduling changes
++
++2004-04-05 Benjamin Otte <otte@gnome.org>
++
++ * gst/schedulers/entryscheduler.c: (some functions, dunno which,
++ prepareChangeLog doesn't work when cvs indents):
++ don't throw an error when no element can be scheduled, there's too
++ many weird reasons why it doesn't work. Return STOPPED instead.
++ decoupled elemts' schedulability doesn't depend on bufpens.
++
++2004-04-04 Benjamin Otte <otte@gnome.org>
++
++ * gst/schedulers/gstbasicscheduler.c:
++ (gst_basic_scheduler_pad_select):
++ fix uninitialized variable warnings
++
++2004-04-04 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstpad.c: (gst_pad_collect_valist):
++ fix uninitialized variable warning
++ * gst/schedulers/entryscheduler.c: (schedule_forward):
++ fix shadowed variable
++
++2004-04-04 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstpad.c: (gst_pad_collect_array), (gst_pad_collectv),
++ (gst_pad_collect), (gst_pad_collect_valist), (gst_pad_selectv),
++ (gst_pad_select):
++ * gst/gstpad.h:
++ * gst/gstscheduler.c: (gst_scheduler_pad_select),
++ (gst_scheduler_lock_element), (gst_scheduler_unlock_element):
++ * gst/gstscheduler.h:
++ implement gst_pad_collect as replacement for gst_pad_select.
++ deprecate gst_pad_select and gst_scheduler_(un)lock_element
++ add new flag GST_SCHEDULER_FLAG_NEW_API for API that implements the
++ new pad_select, lock and unlock calls.
++ * gst/cothreads.c: (cothread_destroy), (cothread_switch):
++ * gst/cothreads.h:
++ * gst/schedulers/cothreads_compat.h:
++ * gst/schedulers/gthread-cothreads.h:
++ remove unused cothread_lock and cothread_unlock calls
++ * gst/schedulers/entryscheduler.c:
++ (gst_entry_scheduler_class_init), (gst_entry_scheduler_init),
++ (_can_schedule_loop), (gst_entry_scheduler_get_handler),
++ (gst_entry_scheduler_pad_select):
++ update to new API
++ * gst/schedulers/gstbasicscheduler.c:
++ (gst_basic_scheduler_class_init), (gst_basic_scheduler_init),
++ (gst_basic_scheduler_pad_select):
++ remove useless lock and unlock calls, update pad_select to new API
++ (untested)
++ * gst/schedulers/gstoptimalscheduler.c:
++ (gst_opt_scheduler_class_init):
++ remove useless select, lock and unlock function calls
++ * gst/elements/gstaggregator.c: (gst_aggregator_loop):
++ use gst_pad_collect instead of gst_pad_select
++
++2004-04-04 Benjamin Otte <otte@gnome.org>
++
++ * gst/schedulers/entryscheduler.c: (_can_schedule_get),
++ (can_schedule_pad), (can_schedule), (schedule), (schedule_forward),
++ (schedule_next_element), (print_entry):
++ add can_schedule_pad to handle element states.
++ add schedule_forward to select the correct entry to schedule next
++
++2004-04-03 Benjamin Otte <otte@gnome.org>
++
++ * gst/schedulers/entryscheduler.c:
++ remove unused variable, fix error inside Rb, fix compile warning in
++ unreachable code
++
++2004-04-03 Benjamin Otte <otte@gnome.org>
++
++ * gst/schedulers/entryscheduler.c:
++ completely revamp the inner workings, so it's a lot easier to
++ understand and extend
++
++2004-04-03 Andy Wingo <wingo@pobox.com>
++
++ * gst/schedulers/gstoptimalscheduler.c (GstOptSchedulerGroupLink):
++ Rename ->group1 and ->group2 to ->src and ->sink, respectively.
++ This allows better introspection of pipeline topology.
++ (add_to_chain): Don't do trickery to put loop elements first;
++ rather, queue a chain sort by marking the chain as dirty.
++ (remove_from_chain): Mark the chain dirty.
++ (sort_chain): New function. Sorts the group list so that terminal
++ sinks are first. This means elements on the sink side will be
++ preferentially sscheduled before elements on the src side of the
++ pipeline.
++ (chain_recursively_migrate_group): Use OTHER_GROUP_LINK.
++ (schedule_chain): If the chain is marked DIRTY, call sort_chain.
++ (gst_opt_scheduler_pad_link, gst_opt_scheduler_pad_unlink)
++ (group_inc_link): Change argument and variable names to match the
++ new link structure member names (src and sink).
++ (group_dec_link): Add some description
++
++2004-04-03 Benjamin Otte <otte@gnome.org>
++
++ * gst/autoplug/gstspider.c: (gst_spider_identity_plug):
++ * gst/gstinfo.h:
++ * testsuite/debug/category.c: (main):
++ * testsuite/debug/commandline.c: (main):
++ * testsuite/debug/output.c: (main):
++ * testsuite/debug/printf_extension.c: (main):
++ fix to successfully build and test with --disable-gst-debug
++ configure switch (fixes #138705)
++
++2004-04-03 Benjamin Otte <otte@gnome.org>
++
++ * docs/pwg/building-boiler.xml:
++ add cvs login line and s/anonymous/anoncvs/
++
++2004-04-03 Tim-Phillip Müller <t.i.m@zen.co.uk>
++
++ reviewed by Benjamin Otte <otte@gnome.org>
++
++ * gst/gststructure.c: (gst_structure_free):
++ memleak fix: free fields array (partial fix for #134839)
++
++2004-04-01 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/random/ds/0.9-suggested-changes:
++ Add a note to change handoff use in fakesrc to be usable in
++ a more generic way (fakesrc should be renamed to appsrc or so).
++ * gst/elements/gstfakesrc.c: (gst_fakesrc_class_init):
++ Change signal type to scope, so we can fill the buffer in the
++ handoff handler (that's the whole use of this signal...).
++
++2004-04-01 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/other-ntoone.xml:
++ Document muxers and n-to-1 elements.
++
++2004-04-01 Martin Soto <martinsoto@users.sourceforge.net>
++
++ * gst/registries/gstxmlregistry.c
++ (gst_xml_registry_rebuild_recurse): Fix the algorithm to
++ determine if a file is a G_MODULE. The old one discards paths
++ containing "so" somewhere in the middle. My home directory is
++ called "soto". Go figure...
++
++2004-03-31 David Schleef <ds@schleef.org>
++
++ * gst/gstbuffer.c: (gst_buffer_join): Add function gst_buffer_join()
++ to eventually deprecate gst_buffer_merge(). (bug: #136408)
++ * gst/gstbuffer.h:
++
++2004-03-31 David Schleef <ds@schleef.org>
++
++ * gst/gstvalue.c: (gst_value_union_int_int_range),
++ (gst_value_union_int_range_int_range), (gst_value_can_union),
++ (gst_value_union), (_gst_value_initialize): Add some union
++ implementations. We didn't have any previously.
++ * testsuite/caps/Makefile.am:
++ * testsuite/caps/audioscale.c: (gst_audioscale_expand_value),
++ (gst_audioscale_getcaps), (test_caps), (main): A little test
++ that is the same as the caps manipulation in audioscale.
++
++2004-03-30 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * docs/faq/general.xml:
++ add entry about "does gst support format X?"
++
++2004-03-30 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstthread.c:
++ fix docs
++ * gst/gstutils.h:
++ fix GST_BOILERPLATE_FULL to not throw casting errors on C++
++
++2004-03-30 Benjamin Otte <otte@gnome.org>
++
++ * gst/elements/gstbufferstore.c: (gst_buffer_store_get_buffer):
++ set the offset of the buffer to the requested offset
++ * gst/elements/gsttypefind.c: (stop_typefinding):
++ revert patch 1.18 (which I unfortunately don't know the reason for).
++ This is needed to allow downstream elements to seek. Otherwise
++ typefind might overwrite a previous seek by downstream elements.
++ This lead to errors with id3tag and typefind on some mp3s.
++ * gst/schedulers/entryscheduler.c: (COTHREADS_TYPE),
++ (gst_entry_scheduler_iterate):
++ be more verbose when debugging
++
++2004-03-30 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstcaps.c: (gst_caps_from_string_inplace):
++ make sure we don't get NULL strings
++
++2004-03-30 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstcaps.c:
++ * gst/gstelement.c:
++ * gst/gstelementfactory.c: (gst_element_factory_get_type):
++ * gst/gstindex.c: (gst_index_resolver_get_type),
++ (gst_index_get_type), (gst_index_factory_get_type):
++ * gst/gstinfo.c:
++ * gst/gstpad.c:
++ * gst/gstplugin.c:
++ * gst/gsturi.c: (gst_uri_handler_get_type):
++ * gst/gstvalue.c:
++ first batch of documentation fixes
++
++2004-03-29 David Schleef <ds@schleef.org>
++
++ * docs/gst/Makefile.am: Disable a bunch of headers from being scanned
++ * docs/gst/gstreamer-docs.sgml: More hacking
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/cothreads_compat.sgml:
++ * docs/gst/tmpl/gstcaps.sgml:
++ * docs/gst/tmpl/gstclock.sgml:
++ * docs/gst/tmpl/gstelement.sgml:
++ * docs/gst/tmpl/gstevent.sgml:
++ * docs/gst/tmpl/gstpad.sgml:
++ * docs/gst/tmpl/gstutils.sgml:
++ * docs/gst/tmpl/gstxml.sgml:
++ * docs/gst/tmpl/gthread-cothreads.sgml:
++ * docs/random/ds/0.9-suggested-changes:
++ * gst/elements/gstfakesink.h: doc fixes
++ * gst/elements/gstfakesrc.h: doc fixes
++ * gst/gstcaps.c: doc fixes
++ * gst/gstcaps.h: doc fixes
++ * gst/gstelement.c: doc fixes
++ * gst/gstelement.h: doc fixes
++ * gst/gstindex.c: doc fixes
++ * gst/gstinfo.c: doc fixes
++ * gst/gstpad.c: doc fixes
++ * gst/gstpad.h: doc fixes
++ * gst/gstplugin.c: doc fixes
++ * gst/gsttypefind.h: doc fixes
++ * gst/gsturi.c: doc fixes
++ * gst/gstvalue.c: doc fixes
++
++2004-03-29 Colin Walters <walters@redhat.com>
++
++ * gst/registries/gstxmlregistry.c (get_time)
++ (plugin_times_older_than_recurse):
++ Use the result of stat to determine whether a path is a file,
++ so we don't attempt to opendir() files.
++
++2004-03-29 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstpad.c: (gst_pad_set_explicit_caps):
++ print caps in debugging output when setting caps failed
++ * gst/schedulers/entryscheduler.c: (COTHREADS_TYPE),
++ (schedule_next_element), (get_buffer), (run_chainhandler),
++ (element_may_start), (gst_entry_scheduler_chain_handler),
++ (gst_entry_scheduler_get_handler),
++ (gst_entry_scheduler_state_transition),
++ (gst_entry_scheduler_pad_link):
++ make this scheduler a testcase for mandatory
++ discont-before-first-buffer which is needed if we want to allow apps
++ to release the sound device.
++ add SCHED_ASSERT macro to print scheduler state before an assertion
++ triggers.
++
++2004-03-29 Benjamin Otte <otte@gnome.org>
++
++ * COPYING:
++ replace by LGPL (former COPYING.LIB). The core is completely
++ licensed LGPL.
++ * COPYING.LIB:
++ remove
++
++2004-03-29 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * po/af.po:
++ * po/sv.po:
++ updated Afrikaans and Swedish
++
++2004-03-29 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * po/LINGUAS:
++ * po/az.po:
++ adding Azerbaijani (M??tin ??mirov)
++
++2004-03-28 Martin Soto <martinsoto@users.sourceforge.net>
++
++ * gst/gstelement.h:
++ * gst/gstelement.c (gst_element_set_time_delay): New function for
++ setting element time taking into account a hardware buffering
++ delay.
++ (gst_element_set_time): Now just an invocation of
++ gst_element_set_time_delay.
++ * gst/gstclock.h:
++ * gst/gstclock.c (gst_clock_get_event_time_delay): New function
++ allowing to set event times in the future.
++ (gst_clock_get_event_time): Now just an invocation of
++ gst_clock_get_event_time_delay.
++
++2004-03-28 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstbin.c: (gst_bin_set_element_sched),
++ (gst_bin_unset_element_sched):
++ don't add decoupled elements to schedulers - otherwise it's
++ impossible to control if a link to a decoupled element was already
++ removed from a scheduler or not.
++ * gst/schedulers/cothreads_compat.h:
++ * gst/schedulers/gthread-cothreads.h:
++ add COTHREADS_TYPE macro. Make do_cothread_set_func a macro so there
++ is no "unused" warning.
++ * gst/schedulers/Makefile.am:
++ * gst/schedulers/entryscheduler.c:
++ add new scheduler, based on ideas from talking to David and Martin.
++ It's supposed to be small and correct. Currently it's also slow (but
++ it's not noticable)
++ * examples/retag/retag.c: (main):
++ * testsuite/bytestream/test1.c: (main):
++ fix missing NULLs at end of variadic functions
++ * testsuite/elements/.cvsignore:
++ update
++
++2004-03-28 Jan Schmidt <thaytan@mad.scientist.com>
++
++ * gst/gstevent.h:
++ Added GST_EVENT_ANY for GstEvents that pass a GstStructure
++
++2004-03-25 David Schleef <ds@schleef.org>
++
++ * docs/gst/gstreamer-sections.txt: More doc hacking.
++ * docs/gst/tmpl/gstaggregator.sgml:
++ * docs/gst/tmpl/gstautoplugfactory.sgml:
++ * docs/gst/tmpl/gstbin.sgml:
++ * docs/gst/tmpl/gstbuffer.sgml:
++ * docs/gst/tmpl/gstbufferstore.sgml:
++ * docs/gst/tmpl/gstfakesink.sgml:
++ * docs/gst/tmpl/gstfakesrc.sgml:
++ * docs/gst/tmpl/gstmd5sink.sgml:
++ * docs/gst/tmpl/gstreamer-unused.sgml:
++ * docs/gst/tmpl/gstsearchfuncs.sgml:
++ * docs/gst/tmpl/gstshaper.sgml:
++ * docs/gst/tmpl/gstspider.sgml:
++ * docs/gst/tmpl/gsttee.sgml:
++ * docs/gst/tmpl/gstutils.sgml:
++ * docs/gst/tmpl/gstvalue.sgml:
++ * docs/gst/tmpl/gstxml.sgml:
++ * gst/Makefile.am: Remove gstthreaddummy.c. It never worked,
++ and we don't support it.
++ * gst/gst.c: (gst_init_get_popt_table), (init_pre), (init_post),
++ (gst_use_threads), (gst_has_threads): same
++ * gst/gstthreaddummy.c: same
++ * gst/autoplug/gstspider.c: Make gst_spider_details static.
++ * gst/autoplug/gstspider.h: same
++ * gst/elements/gstaggregator.h: Remove bogus function from header
++ * gst/elements/gstfakesink.h: same
++ * gst/elements/gstfakesrc.h: same
++ * gst/elements/gstmd5sink.h: same
++ * gst/elements/gstshaper.h: same
++ * gst/elements/gsttee.h: same
++ * gst/gstbin.c: doc fixes
++ * gst/gstbin.h: Remove unused definition.
++ * gst/gstbuffer.c: doc fixes
++ * gst/gstcaps.c: (gst_caps_is_always_compatible): doc fixes
++ * gst/gstfilter.c: doc fixes
++ * gst/gsttag.c: doc fixes
++ * gst/gstvalue.c: doc fixes
++
++2004-03-25 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced-types.xml:
++ Document typefinding.
++ * docs/pwg/other-oneton.xml:
++ Document one-to-n elements, demuxers and parsers.
++
++2004-03-25 Tim-Philipp Müller <t.i.m@zen.co.uk>
++
++ reviewed by: David Schleef <ds@schleef.org>
++
++ * configure.ac: Check bison version (bug #127838)
++
++2004-03-25 David Schleef <ds@schleef.org>
++
++ * docs/gst/gstreamer-docs.sgml: More fine tuning.
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/gstautoplug.sgml:
++ * docs/gst/tmpl/gststaticautoplug.sgml:
++ * docs/gst/tmpl/gststaticautoplugrender.sgml:
++ * docs/gst/tmpl/gstutils.sgml:
++ * docs/gst/tmpl/gstxml.sgml:
++
++2004-03-24 David Schleef <ds@schleef.org>
++
++ * docs/gst/gstreamer-docs.sgml: I got tired of the reference
++ manual being such complete crap, that I decided to do major
++ hacking of it. This checkin replaces any fine tuning that
++ may have been done previously, with the benefit of actually
++ being complete for much of the API that was changed since
++ 0.6. Further fine tuning will occur shortly. (bug #134721)
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/GstBin.sgml:
++ * docs/gst/tmpl/GstBuffer.sgml:
++ * docs/gst/tmpl/GstCaps.sgml:
++ * docs/gst/tmpl/GstClock.sgml:
++ * docs/gst/tmpl/GstCompat.sgml:
++ * docs/gst/tmpl/GstData.sgml:
++ * docs/gst/tmpl/GstElement.sgml:
++ * docs/gst/tmpl/GstEvent.sgml:
++ * docs/gst/tmpl/GstIndex.sgml:
++ * docs/gst/tmpl/GstStructure.sgml:
++ * docs/gst/tmpl/GstTag.sgml:
++ * docs/gst/tmpl/cothreads.sgml:
++ * docs/gst/tmpl/cothreads_compat.sgml:
++ * docs/gst/tmpl/gettext.sgml:
++ * docs/gst/tmpl/grammar.tab.sgml:
++ * docs/gst/tmpl/gst-i18n-app.sgml:
++ * docs/gst/tmpl/gst-i18n-lib.sgml:
++ * docs/gst/tmpl/gst.sgml:
++ * docs/gst/tmpl/gst_private.sgml:
++ * docs/gst/tmpl/gstaggregator.sgml:
++ * docs/gst/tmpl/gstarch.sgml:
++ * docs/gst/tmpl/gstatomic.sgml:
++ * docs/gst/tmpl/gstatomic_impl.sgml:
++ * docs/gst/tmpl/gstbin.sgml:
++ * docs/gst/tmpl/gstbuffer.sgml:
++ * docs/gst/tmpl/gstbufferstore.sgml:
++ * docs/gst/tmpl/gstcaps.sgml:
++ * docs/gst/tmpl/gstclock.sgml:
++ * docs/gst/tmpl/gstcompat.sgml:
++ * docs/gst/tmpl/gstconfig.sgml:
++ * docs/gst/tmpl/gstcpu.sgml:
++ * docs/gst/tmpl/gstdata.sgml:
++ * docs/gst/tmpl/gstdata_private.sgml:
++ * docs/gst/tmpl/gstelement.sgml:
++ * docs/gst/tmpl/gstenumtypes.sgml:
++ * docs/gst/tmpl/gsterror.sgml:
++ * docs/gst/tmpl/gstevent.sgml:
++ * docs/gst/tmpl/gstfakesink.sgml:
++ * docs/gst/tmpl/gstfakesrc.sgml:
++ * docs/gst/tmpl/gstfilesink.sgml:
++ * docs/gst/tmpl/gstfilter.sgml:
++ * docs/gst/tmpl/gstindex.sgml:
++ * docs/gst/tmpl/gstinfo.sgml:
++ * docs/gst/tmpl/gstinterface.sgml:
++ * docs/gst/tmpl/gstlog.sgml:
++ * docs/gst/tmpl/gstmacros.sgml:
++ * docs/gst/tmpl/gstmarshal.sgml:
++ * docs/gst/tmpl/gstmd5sink.sgml:
++ * docs/gst/tmpl/gstmultifilesrc.sgml:
++ * docs/gst/tmpl/gstobject.sgml:
++ * docs/gst/tmpl/gstpad.sgml:
++ * docs/gst/tmpl/gstparse.sgml:
++ * docs/gst/tmpl/gstpipeline.sgml:
++ * docs/gst/tmpl/gstplugin.sgml:
++ * docs/gst/tmpl/gstpluginfeature.sgml:
++ * docs/gst/tmpl/gstqueue.sgml:
++ * docs/gst/tmpl/gstreamer-unused.sgml:
++ * docs/gst/tmpl/gstregistry.sgml:
++ * docs/gst/tmpl/gstregistrypool.sgml:
++ * docs/gst/tmpl/gstscheduler.sgml:
++ * docs/gst/tmpl/gstsearchfuncs.sgml:
++ * docs/gst/tmpl/gstshaper.sgml:
++ * docs/gst/tmpl/gstspider.sgml:
++ * docs/gst/tmpl/gstspideridentity.sgml:
++ * docs/gst/tmpl/gststructure.sgml:
++ * docs/gst/tmpl/gstsystemclock.sgml:
++ * docs/gst/tmpl/gsttag.sgml:
++ * docs/gst/tmpl/gsttaginterface.sgml:
++ * docs/gst/tmpl/gsttee.sgml:
++ * docs/gst/tmpl/gstthread.sgml:
++ * docs/gst/tmpl/gsttrace.sgml:
++ * docs/gst/tmpl/gsttrashstack.sgml:
++ * docs/gst/tmpl/gsttypefind.sgml:
++ * docs/gst/tmpl/gsttypes.sgml:
++ * docs/gst/tmpl/gsturi.sgml:
++ * docs/gst/tmpl/gsturitype.sgml:
++ * docs/gst/tmpl/gstutils.sgml:
++ * docs/gst/tmpl/gstvalue.sgml:
++ * docs/gst/tmpl/gstversion.sgml:
++ * docs/gst/tmpl/gstxml.sgml:
++ * docs/gst/tmpl/gstxmlregistry.sgml:
++ * docs/gst/tmpl/gthread-cothreads.sgml:
++ * docs/gst/tmpl/types.sgml:
++
++2004-03-24 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/other-sink.xml:
++ * docs/pwg/other-source.xml:
++ Documentation on how to write source and sink elements. Other
++ stuff in chapter 4 (1-to-n/demuxer, n-to-1/muxer, n-to-n,
++ manager, autoplugger) are all still pending.
++
++2004-03-25 Benjamin Otte <otte@gnome.org>
++
++ * testsuite/elements/Makefile.am:
++ * testsuite/elements/gst-compprep-check:
++ add check to make sure gst-compprep works
++ * testsuite/elements/gst-inspect-check.in:
++ improve initialization output
++ * testsuite/Makefile.am:
++ * testsuite/gst-inspect-check:
++ remove old file
++
++2004-03-24 David Schleef <ds@schleef.org>
++
++ * testsuite/elements/Makefile.am:
++ * testsuite/elements/gst-inspect-check.in: Add gst-inspect-check
++ to the testsuite.
++
++2004-03-24 Benjamin Otte <otte@gnome.org>
++
++ * libs/gst/control/dparam.c: (gst_dparam_attach),
++ (gst_dparam_detach):
++ * libs/gst/control/dparammanager.c: (gst_dpman_init):
++ fix lvalue casts for real
++
++2004-03-24 Benjamin Otte <otte@gnome.org>
++
++ * gst/schedulers/gstbasicscheduler.c:
++ (gst_basic_scheduler_src_wrapper):
++ * gst/schedulers/gstoptimalscheduler.c:
++ (gst_opt_scheduler_loop_wrapper), (gst_opt_scheduler_get_wrapper),
++ (pad_clear_queued), (gst_opt_scheduler_add_element),
++ (gst_opt_scheduler_remove_element):
++ fix GStreamer to not have issues with lvalue casts anymore (fixes
++ #136841)
++
++2004-03-24 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstelement.c:
++ add documentation about a gobject quirk where the object hasn't the
++ correct class pointer set on initialization
++ * gst/schedulers/gstbasicscheduler.c:
++ (gst_basic_scheduler_src_wrapper):
++ make sure to not run into an infinite loop
++
++2004-03-22 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstutils.c: (gst_util_dump_mem):
++ * gst/gstutils.h:
++ first argument of gst_util_dump_mem should be const
++
++2004-03-22 Johan Dahlin <johan@gnome.org>
++
++ * gst/gstvalue.h: Clean up a little bit.
++
++2004-03-21 Tim-Philipp Müller <t.i.m@zen.co.uk>
++
++ reviewed by Benjamin Otte <otte@gnome.org>
++
++ * gst/autoplug/gstspider.c: (gst_spider_dispose):
++ * gst/elements/gstaggregator.c: (gst_aggregator_finalize),
++ (gst_aggregator_class_init), (gst_aggregator_init):
++ * gst/elements/gstfilesrc.c: (gst_filesrc_init),
++ (gst_filesrc_dispose), (gst_filesrc_set_location):
++ * gst/elements/gstidentity.c: (gst_identity_finalize),
++ (gst_identity_class_init), (gst_identity_chain):
++ * gst/elements/gstmultifilesrc.c: (gst_multifilesrc_open_file):
++ * gst/elements/gststatistics.c: (gst_statistics_finalize),
++ (gst_statistics_class_init):
++ * gst/elements/gsttee.c: (gst_tee_finalize), (gst_tee_class_init),
++ (gst_tee_get_property):
++ clean up used memory in this elements correctly on teardown (closes
++ #137279)
++
++2004-03-20 Colin Walters <walters@redhat.com>
++
++ * gst/registries/gstxmlregistry.c:
++ (gst_xml_registry_open_func, gst_xml_registry_close_func): Make
++ registry saving atomic.
++
++2004-03-20 Colin Walters <walters@redhat.com>
++
++ * gst/registries/gstxmlregistry.c (gst_xml_registry_get_perms_func):
++ Just use
++ access() instead of actually creating and deleting files.
++
++2004-03-18 David Schleef <ds@schleef.org>
++
++ * configure.ac: Remove HAVE_ATOMIC_H test, since it's unused.
++ (bug #137625)
++
++2004-03-18 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * po/sv.po: updated translation (Christian Rose)
++
++2004-03-18 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/elements/gstfilesink.c: (gst_filesink_get_formats),
++ (gst_filesink_get_query_types), (_do_init),
++ (gst_filesink_handle_event), (gst_filesink_uri_get_protocols):
++ return FALSE silently
++ * po/af.po: updated translation (Petri Jooste)
++
++2004-03-18 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * Makefile.am:
++ * configure.ac:
++ dist common properly
++ * po/af.po:
++ * po/fr.po:
++ * po/nl.po:
++ * po/sr.po:
++ * po/sv.po:
++ refreshing translations
++
++2004-03-17 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * po/LINGUAS:
++ * po/sv.po:
++ * po/af.po:
++ adding Swedish (Christian Rose) and Afrikaans (Petri Jooste)
++
++2004-03-17 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * Makefile.am: use common/release.mak
++
++2004-03-17 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/faq/gst-uninstalled:
++ adding gst-monkeysaudio to the list of possible plugin dirs
++
++2004-03-16 David Schleef <ds@schleef.org>
++
++ * gst/gst.c: (gst_get_popt_options), (gst_init_get_popt_table),
++ (gst_init_check_with_popt_table): Fix some gettext strings to
++ make them easier to translate. Required making the strings
++ non-const.
++
++2004-03-16 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac: bump nano to 1
++
++=== release 0.8.0 ===
++
++2004-03-16 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac: release 0.8.0, "Executive Slacks"
++
++2004-03-16 Johan Dahlin <johan@gnome.org>
++
++ * gst/schedulers/gstoptimalscheduler.c
++ (gst_opt_scheduler_pad_unlink): Remove double ;,
++ spotted by Scott Wheeler
++
++2004-03-16 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac: bump libtool version
++
++2004-03-15 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstcaps.h:
++ * gst/gststructure.h:
++ add reserved padding
++
++2004-03-15 Benjamin Otte <otte@gnome.org>
++
++ * gst/elements/gstfdsrc.c: (gst_fdsrc_get):
++ set the first parameter for select call correctly.
++ (fixes #137230)
++
++2004-03-15 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * *.c,*.h: don't mix tabs and spaces
++
++2004-03-15 Johan Dahlin <johan@gnome.org>
++
++ * gst/schedulers/gstoptimalscheduler.c
++ (gst_opt_scheduler_pad_unlink): Fix bug that causes totem to
++ crash on MPEG playback. My boolean arithmetic is a bit rusty.
++
++ * tools/Makefile.am (EXTRA_DIST): Add gst-indent
++
++2004-03-15 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * testsuite/Rules:
++ fix gst-register rules
++
++2004-03-15 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * testsuite/Rules:
++ use versioned gst-register
++
++2004-03-15 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/libs/gstreamer-libs-sections.txt:
++ remove </SUBSECTION>
++ * gst/gstplugin.c:
++ * gst/gstregistry.c: (gst_registry_add_plugin):
++ * gst/registries/gstxmlregistry.c: (gst_xml_registry_get_type),
++ (gst_xml_registry_open_func), (gst_xml_registry_close_func):
++ add debugging and fix some comment blocks
++
++2004-03-15 Johan Dahlin <johan@gnome.org>
++
++ * *.h: Revert indent changes.
++
++2004-03-14 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/registries/gstxmlregistry.c: (gst_xml_registry_load_plugin):
++ g_error_free the g_error
++ * tools/gst-feedback-m.m:
++ check for other versions of gstreamer
++ * tools/gst-indent:
++ use sh, not bash
++
++2004-03-14 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * tools/gst-register.c: do not spill paths when registries are not
++ writable, until we fix the "user running gst-register" case.
++
++2004-03-13 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * *.c, *.h: commit of gst-indent run on core
++
++2004-03-13 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * tools/gst-indent:
++ * tools/Makefile.am:
++ add our indentation style as a script
++
++2004-03-13 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * po/sr.po:
++ * po/LINGUAS:
++ added Serbian translation
++
++2004-03-13 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstelement.c:
++ add documentation note about gst_element_found_tags_for_pad not
++ being usable in getfunctions. (see #137042)
++
++2004-03-12 David Schleef <ds@schleef.org>
++
++ * gst/gstcaps.h: jdahlin, what are you smoking? We can't just
++ change API right now! Readd gst_caps_is_simple() macro.
++ * gst/gstelement.c: (gst_element_base_class_finalize): Fix
++ uninitialized variable. I'd bet this caused crashes.
++ * gst/gstinfo.c: (gst_debug_print_object): Fix 64-bit cleanliness.
++
++2004-03-12 Johan Dahlin <johan@gnome.org>
++
++ * gst/gstcaps.h (GST_CAPS_IS_SIMPLE): Capitalize macro
++ * gst/gstcaps.h: Clean up
++
++ * gst/gst.c (init_post): call gst_caps_get_type() instead of
++ _gst_caps_initalize()
++
++ * gst/gstcaps.c: Style fixes, stay closer to glib and friends
++ (_gst_caps_initialize): Remove, in favor for gst_caps_get_type()
++
++ * gst/gststructure.c (gst_structure_get_type): Ditto
++
++ * gst/gststructure.h: Ditto
++
++2004-03-11 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstqueue.c: (gst_queue_init):
++ Reset default max. values in queues. Reason is simply to avoid
++ braindead use. If you want wider values, use the properties. The
++ default is supposed to always work. Wider values would make this
++ beast a memory hog by default (250 full-PAL RGB32 video frames?
++ That's 440 MB! No thank you).
++
++2004-03-10 David Schleef <ds@schleef.org>
++
++ * tools/gst-run.c: (main): Fix crash when no relevant tools
++ were found. (bug #136793)
++
++2004-03-10 Johan Dahlin <johan@gnome.org>
++
++ * gst/schedulers/gstoptimalscheduler.c
++ (gst_opt_scheduler_pad_unlink): Implement unlink for elements with
++ links to elements within the same group, so we can finally remove
++ that annoying warning. Refactor the code a little bit
++ (group_dec_links_for_element): Split out
++
++2004-03-09 David Schleef <ds@schleef.org>
++
++ * docs/manual/dparams-app.xml: Fix to handle double dparams.
++ (bug #134863)
++
++2004-03-09 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac: first bug fix due to major/minor bump
++
++2004-03-09 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac: bump nano to 1
++
++=== release 0.7.6 ===
++
++2004-03-09 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * NEWS:
++ * RELEASE:
++ * configure.ac:
++ releasing 0.7.6, "Almost"
++ * po/fr.po:
++ * po/nl.po:
++ * tools/Makefile.am:
++ * tools/gst-feedback-m.m:
++ unversioned source
++
++2004-03-09 Johan Dahlin <johan@gnome.org>
++
++ Reviewed by: Thomas Vander Stichele
++
++ * gst/gstelement.c (gst_element_class_init): register second
++ parameter as GST_TYPE_G_ERROR instead of G_TYPE_POINTER, so
++ language bindings can (de)marshall correctly.
++
++ * gst/gsterror.h: Add GST_TYPE_G_ERROR and cleanup a little bit
++
++ * gst/gsterror.c (gst_g_error_get_type): New function
++
++ * gst/gstmarshal.list: Remove VOID:OBJECT,POINTER,STRING, replace
++ with VOID:OBJECT,OBJECT,STRING
++
++2004-03-10 Jan Schmidt <thaytan@mad.scientist.com>
++
++ * gst/registries/gstxmlregistry.c: (gst_xml_registry_load):
++ Free a leaked g_timer on early returns.
++
++2004-03-08 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced-types.xml:
++ Add cinepak description.
++
++2004-03-07 David Schleef <ds@schleef.org>
++
++ * docs/random/mimetypes: Added cinepak description
++
++2004-03-07 Andy Wingo <wingo@pobox.com>
++
++ * gst/gstbin.c (gst_bin_remove): Debugging fixes.
++
++ * gst/schedulers/gstoptimalscheduler.c (destroy_group): Assert
++ there are no links to other groups when a group is destroyed.
++ (gst_opt_scheduler_pad_unlink): If the unlink means an element is
++ removed from a group, make sure the link count to elements linked
++ to other pads is appropriately decremented. This really fixes
++ #135672.
++
++ The 1.60->1.61 patch has been reapplied in light of this fix.
++
++ * gst/gstelement.c (gst_element_dispose): Really protect against
++ multiple invocations this time.
++
++2004-03-06 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/gsttag.sgml:
++ remove some deprecated functions, document some existing ones
++ * gst/gsttag.c: (gst_tag_get_flag):
++ * gst/gsttag.h:
++ add accessor function
++
++2004-03-06 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/gsttag.sgml:
++ * docs/gst/tmpl/gstxml.sgml:
++ * gst/gsttag.c: (gst_tag_get_flag):
++ * gst/gsttag.h:
++
++2004-03-06 Christophe Fergeau <teuf@gnome.org>
++
++ * gst/autoplug/gstspider.c: (gst_spider_identity_plug): fixed caps
++ leak
++
++2004-03-05 David Schleef <ds@schleef.org>
++
++ * REQUIREMENTS: Add bison and flex.
++ * configure.ac: Fix comment about bison.
++ * docs/random/ds/0.9-suggested-changes: yer ma
++ * tools/gst-inspect.c: (print_element_info): Fix warning.
++
++2004-03-05 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstelement.c: (gst_element_error_full):
++ revert recent recursive state changing commit - messing with other
++ elements' states is evil and should be done by apps only.
++
++2004-03-05 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstelement.c: (gst_element_get_compatible_pad_template):
++ check for empty intersection instead of NULL caps
++ (gst_element_get_compatible_pad_filtered):
++ remove old workaround that is only a bug nowadays
++
++2004-03-05 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstelement.c: (gst_element_error_full):
++ make elements try to recursively change state to PAUSED on all
++ parents after an error to suppress ensuing warnings
++ * gst/parse/grammar.y:
++ make it check if it was able to sync the state, and throw an error
++ if not, so stuff like
++ oggdemux ! vorbisdec ! osssink gets caught
++
++2004-03-05 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac: use ${libdir} for PLUGINS_DIR since on 64bit
++ it contains lib64; use AS_AC_EXPAND to handle it properly
++
++2004-03-05 David Schleef <ds@schleef.org>
++
++ * gst/gstcpuid_i386.s: Remove unused code
++ * libs/gst/getbits/getbits.c: (gst_getbits_init),
++ (gst_getbits_newbuf): Remove MMX code
++ * libs/gst/getbits/getbits.h: Remove MMX code
++
++2004-03-04 David I. Lehn <dlehn@users.sourceforge.net>
++
++ * debian/.cvsignore:
++ * debian/README.Debian:
++ * debian/changelog:
++ * debian/control:
++ * debian/control.in:
++ * debian/copyright:
++ * debian/gstreamer-core-libs-dev.files:
++ * debian/gstreamer-core-libs.files:
++ * debian/gstreamer-core.files:
++ * debian/gstreamer-core.postinst:
++ * debian/gstreamer-core.postrm:
++ * debian/gstreamer-doc.files:
++ * debian/gstreamer-doc.links:
++ * debian/gstreamer-doc.lintian:
++ * debian/gstreamer-runtime.files:
++ * debian/gstreamer-runtime.manpages:
++ * debian/gstreamer-runtime.postinst:
++ * debian/gstreamer-runtime.postrm:
++ * debian/gstreamer-tools.files:
++ * debian/gstreamer-tools.manpages:
++ * debian/libgstreamer-dev.files:
++ * debian/libgstreamer0.4.1.files:
++ * debian/libgstreamerVERSION.files:
++ * debian/rules:
++ Debian package info not maintained here.
++
++2004-03-04 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/elements/gstmultifilesrc.c: (gst_multifilesrc_class_init):
++ * gst/gstbin.c: (gst_bin_class_init):
++ * gst/gstelement.c: (gst_element_class_init):
++ * gst/gstindex.c: (gst_index_class_init):
++ * gst/gstobject.c: (gst_object_class_init),
++ (gst_signal_object_class_init):
++ * gst/gstpad.c: (gst_pad_template_class_init):
++ * gst/gstregistry.c: (gst_registry_class_init):
++ * gst/gsturi.c: (gst_uri_handler_base_init):
++ * gst/gstxml.c: (gst_xml_class_init):
++ * libs/gst/control/dparam.c: (gst_dparam_class_init):
++ * libs/gst/control/dparammanager.c: (gst_dpman_class_init):
++ make all signal names use dashes instead of underscore
++
++2004-03-03 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac: AC_SUBST GLIB_ONLY CFLAGS and LIBS
++
++2004-03-03 Benjamin Otte <otte@gnome.org>
++
++ * gst/schedulers/gstoptimalscheduler.c:
++ revert last commit by Andy Wingo. It causes segfaults on unreffing
++ in Rhythmbox. (see bug #135672)
++
++2004-03-02 Christophe Fergeau <teuf@gnome.org>
++
++ * po/fr.po: fix typo
++
++2004-03-02 Christophe Fergeau <teuf@gnome.org>
++
++ * tools/gst-inspect.c: (main):
++ * tools/gst-launch.c: (main): add calls to bind_textdomain_codeset
++
++2004-03-02 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ get GLIB_ONLY and POPT flags for the nonversioned binaries
++ * tools/Makefile.am:
++ use them
++
++2004-03-02 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gst.c: (init_post):
++ change so that GST_REGISTRY now is where the global registry gets
++ saved, since that is where plugins now get attached to first, and
++ spilled over to the user registry. Note that in the case of using
++ GST_REGISTRY env var, we don't want to affect any real registries
++ beyond the one given by this var, and thus we don't set a user
++ registry to spill to. So make sure GST_REGISTRY is writable.
++
++2004-03-01 David Schleef <ds@schleef.org>
++
++ * AUTHORS: Added some names. Add yourself if you're missing.
++
++2004-03-01 David Schleef <ds@schleef.org>
++
++ * MAINTAINERS: Add
++
++2004-03-01 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ remove whitespace
++ * docs/gst/tmpl/gstbuffer.sgml:
++ * docs/gst/tmpl/gstdata.sgml:
++ * docs/gst/tmpl/gstreamer-unused.sgml:
++ * docs/gst/tmpl/gstxml.sgml:
++ doc update
++ * docs/manuals.mak:
++ add a FIXME
++ * docs/pwg/intro-preface.xml:
++ * docs/pwg/pwg.xml:
++ remove GNOME
++ * gst/gst.c: (init_post):
++ try GST_PLUGIN_PATH paths for the _global_registry first
++ * gst/gstelement.h:
++ add the error message as well, otherwise (null) debug info doesn't
++ make much sense
++ * tools/gst-register.c: (main):
++ spill paths to next registry if this registry is not writable
++ * po/fr.po:
++ * po/nl.po:
++ translation updates
++
++2004-03-01 Johan Dahlin <johan@gnome.org>
++
++ * gst/gstbuffer.c (_gst_buffer_initialize):
++ * gst/gstdata.c (gst_data_get_type):
++ * gst/gstevent.c (_gst_event_initialize): Use gst_data_copy,
++ instead of ref, since some applications that uses GBoxed
++ routines depends on a function that actually returns a copy.
++
++2004-02-27 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstbuffer.h:
++ remove gst_buffer_free, use gst_data_unref
++ * gst/gstdata.c: (gst_data_get_type):
++ use refcounting in GstData GBoxed registration
++ * gst/gstdata.h:
++ remove gst_data_free, use gst_data_unref
++
++2004-02-27 Johan Dahlin <johan@gnome.org>
++
++ * gst/gstdata.c (gst_data_get_type): New function, register
++ GstData as a GBoxed type.
++
++ * gst/gstdata.h (GST_TYPE_DATA): New macro
++
++2004-02-27 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * Makefile.am:
++ * gstreamer.spec.in:
++ put back RELEASE
++ * gst/Makefile.am:
++ clean up non-disting of built files
++ * testsuite/debug/commandline.c:
++ test fix for option rename
++
++2004-02-26 David Schleef <ds@schleef.org>
++
++ * configure.ac: We don't really need glib-2.3. Also remove
++ some unneeded checks for library functions.
++ * gst/Makefile.am: Instead, we need to not dist files created
++ by glib-genmarshal.
++
++2004-02-26 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ bump glib required version to 2.3.0 for g_value_takes_boxed
++
++ 2004-02-25 Christian Fredrik Kalager Schaller <uraeus@gnome.org>
++
++ * common/m4/gst-docs.m4
++ change flavour text from enable to disable as enable is our default
++ closes bug Bug 135304
++
++=== release 0.7.5 ===
++
++ 2004-02-26 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * NEWS:
++ instate NEWS file
++ * Makefile.am:
++ * gstreamer.spec.in:
++ * RELEASE:
++ put back release
++ * configure.ac:
++ * docs/random/release:
++ more updates
++
++2004-02-26 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gsttag.c: (_gst_tag_initialize):
++ * po/fr.po:
++ * po/nl.po:
++ remove hyphen from codec tags
++
++2004-02-26 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/parse/Makefile.am:
++ fix dependency so that a make from a clean build works the first
++ time
++
++2004-02-26 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/random/release:
++ update release strategy
++ * po/fr.po:
++ auto-update po file
++ * po/nl.po:
++ update dutch translation
++
++2004-02-25 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/manual/debugging.xml:
++ fix manual for new debugging system
++
++2004-02-25 Andy Wingo <wingo@pobox.com>
++
++ * gst/gstpad.c (gst_pad_link_prepare): Re-add
++ gst_pad_link_prepare. Please email the list with specific reasons
++ for reverting.
++
++2004-02-24 Andy Wingo <wingo@pobox.com>
++
++ * gst/gstelement.c (gst_element_dispose): Protect against multiple
++ invocations.
++
++ * gst/schedulers/gstoptimalscheduler.c:
++ I added a mess of prototypes at the top of the file by way of
++ documentation. Some of the operations on chains and groups were
++ re-organized.
++
++ (create_group): Added a type argument so if the group is enabled,
++ the setup_group_scheduler knows what to do.
++ (group_elements): Added a type argument here, too, to be passed on
++ to create_group.
++ (group_element_set_enabled): If an unlinked PLAYING element is
++ added to a bin, we have to create a new group to hold the element,
++ and this function will be called before the group is added to the
++ chain. Thus we have a valid case for group->chain==NULL. Instead
++ of calling chain_group_set_enabled, just set the flag on the group
++ (the chain's status will be set when the group is added to it).
++ (gst_opt_scheduler_state_transition, chain_group_set_enabled):
++ Setup the group scheduler when the group is enabled, not
++ specifically when an element goes PAUSED->PLAYING. This means
++ PLAYING elements can be added, linked, and scheduled into a
++ PLAYING pipeline, as was intended.
++ (add_to_group): Don't ref the group twice. I don't know when this
++ double-ref got in here. Removing it has the potential to cause
++ segfaults if other parts of the scheduler are buggy. If you find
++ that the scheduler is segfaulting for you, put in an extra ref
++ here and see if that hacks over the underlying issue. Of course,
++ then find out what code is unreffing a group it doesn't own...
++ (create_group): Make the extra refcount floating, and remove it
++ after adding the element. This means that...
++ (unref_group): Destroy when the refcount reaches 0, not 1, like
++ every other refcounted object in the known universe.
++ (remove_from_group): When a group becomes empty, set it to be not
++ active, and remove it from its chain. Don't unref it again,
++ there's no floating reference any more.
++ (destroy_group): We have to remove the group from the chain in
++ remove_from_group (rather than here) to break refcounting cycles
++ (the chain always has a ref on the group). So assert that
++ group->chain==NULL.
++ (ref_group_by_count): Removed, it was commented out anyway.
++ (merge_chains): Use the remove_from_chain and add_to_chain
++ primitives to do the reparenting, instead of rolling our own
++ implementation.
++ (add_to_chain): The first non-disabled group in the chain's group
++ list will be the entry point for the chain. Because buffers can
++ accumulate in loop elements' peer bufpens, we preferentially
++ schedule loop groups before get groups to avoid unnecessary
++ execution of get-based groups when the bufpens are already full.
++ (gst_opt_scheduler_schedule_run_queue): Debug fixes.
++ (get_group_schedule_function): Ditto.
++ (loop_group_schedule_function): Ditto.
++ (gst_opt_scheduler_loop_wrapper): Ditto.
++ (gst_opt_scheduler_iterate): Ditto.
++
++ I understand the opt scheduler now, yippee!
++
++ * gst/gstpad.c: All throughout, added FIXMEs to look at for 0.9.
++ (gst_pad_get_name, gst_pad_set_chain_function)
++ (gst_pad_set_get_function, gst_pad_set_event_function)
++ (gst_pad_set_event_mask_function, gst_pad_get_event_masks)
++ (gst_pad_get_event_masks_default, gst_pad_set_convert_function)
++ (gst_pad_set_query_function, gst_pad_get_query_types)
++ (gst_pad_get_query_types_default)
++ (gst_pad_set_internal_link_function)
++ (gst_pad_set_formats_function, gst_pad_set_link_function)
++ (gst_pad_set_fixate_function, gst_pad_set_getcaps_function)
++ (gst_pad_set_bufferalloc_function, gst_pad_unlink)
++ (gst_pad_renegotiate, gst_pad_set_parent, gst_pad_get_parent)
++ (gst_pad_add_ghost_pad, gst_pad_proxy_getcaps)
++ (gst_pad_proxy_pad_link, gst_pad_proxy_fixate)
++ (gst_pad_get_pad_template_caps, gst_pad_check_compatibility)
++ (gst_pad_get_peer, gst_pad_get_allowed_caps)
++ (gst_pad_alloc_buffer, gst_pad_push, gst_pad_pull)
++ (gst_pad_selectv, gst_pad_select, gst_pad_template_get_caps)
++ (gst_pad_event_default_dispatch, gst_pad_event_default)
++ (gst_pad_dispatcher, gst_pad_send_event, gst_pad_convert_default)
++ (gst_pad_convert, gst_pad_query_default, gst_pad_query)
++ (gst_pad_get_formats_default, gst_pad_get_formats): Better
++ argument checks, and some doc fixes.
++
++ (gst_pad_custom_new_from_template): Um, does anyone
++ use these functions? Actually make a custom pad instead of a
++ normal one.
++ (gst_pad_try_set_caps): Transpose some checks.
++ (gst_pad_try_set_caps_nonfixed): Same, and use a macro to check if
++ the pad is in negotiation.
++ (gst_pad_try_relink_filtered): Use pad_link_prepare.
++
++ * gst/gstelement.c: Remove prototypes also defined in gstclock.h.
++
++ * gst/gstelement.h:
++ * gst/gstclock.h: Un-deprecate the old clocking API, as discussed
++ on the list.
++
++2004-02-24 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstbin.c: (gst_bin_add):
++ add error for not being able to add elements
++
++2004-02-22 Julien MOUTTE <julien@moutte.net>
++
++ * gst/gsttag.c: (_gst_tag_initialize): Registering 2 new tags,
++ audio-codec and video-codec.
++
++2004-02-22 Benjamin Otte <otte@gnome.org>
++
++ reported by: Padraig O'Briain <padraig.obriain@sun.com>
++
++ * autogen.sh:
++ replace test -e with test -x for mkinstalldirs to be more portable.
++ (fixes #134816)
++
++2004-02-22 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstpad.c:
++ revert last patch from Andy, it makes gst_pad_can_link_filtered much
++ too noisy
++ * gst/gsttag.c: (_gst_tag_initialize):
++ * gst/gsttag.h:
++ add GST_TAG_ALBUM_VOLUME_{COUNT,NUMBER}
++ * libs/gst/control/dparam.c: (gst_dparam_attach):
++ * libs/gst/control/dparammanager.c: (gst_dpman_attach_dparam):
++ check that types for attached dparams match
++
++2004-02-22 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/elements/gstfilesink.c: (gst_filesink_open_file):
++ * gst/elements/gstfilesrc.c: (gst_filesrc_open_file):
++ * gst/elements/gstmultifilesrc.c: (gst_multifilesrc_open_file):
++ fix errors
++
++2004-02-20 Andy Wingo <wingo@pobox.com>
++
++ * gst/gstbin.c:
++ * gst/gstbuffer.c:
++ * gst/gstplugin.c:
++ * gst/registries/gstxmlregistry.c:
++ * gst/schedulers/gstoptimalscheduler.c: Debugging tweaks.
++
++ * gst/gstelement.c (gst_element_set_scheduler): Debugging fixes.
++ (gst_element_add_pad): DEBUG->INFO, some fixes.
++ (gst_element_get_compatible_pad_template): Just see if the
++ templates' caps intersect, not if one is a strict subset of the
++ other. This conforms more to what gst_pad_link_intersect() does.
++ (gst_element_class_add_pad_template): Don't memcpy the pad
++ template, just ref it.
++ (gst_element_get_compatible_pad_filtered): Clean up debug messages
++
++ * gst/gstpad.c (gst_pad_can_link_filtered): Debug a true result.
++ (gst_pad_link_filtered): Debug changes.
++ (gst_pad_link_prepare): New function, consolidated from
++ can_link_filtered and link_filtered.
++
++ * gst/parse/grammar.y (gst_parse_perform_link): Made INFO output
++ look more like that of the functions in gstelement.c
++
++ * gst/gstinfo.c (gst_debug_print_object): Put a space before the
++ object, and return the empty string if object is NULL.
++
++ * gst/parse/parse.l: Remove trailing newlines when calling PRINT.
++ * gst/parse/grammar.y (YYFPRINTF): Log bison debugging info via
++ LOG, not DEBUG. We still get flex info on debug.
++
++ * gst/registries/gstxmlregistry.c (gst_xml_registry_load): Make
++ debug string more verbose.
++ (plugin_times_older_than): DEBUG->LOG.
++
++2004-02-20 Julien MOUTTE <julien@moutte.net>
++
++ * gst/gsttag.h: Adding video-codec and audio-codec for demuxers which
++ will emit found_tag for each stream they demux with the codec.
++
++2004-02-20 Benjamin Otte <otte@gnome.org>
++
++ * gst/gstevent.c: (_gst_event_copy), (_gst_event_free):
++ copy navigation event correctly. Check freeing tag lists.
++ * gst/gstthread.c: (gst_thread_change_state):
++ don't abort() on state changing mess - it might happen because of
++ bugs.
++ * gst/gstvalue.c: (gst_value_set_caps), (gst_value_get_caps):
++ use boxed functions
++ * gst/gstvalue.h:
++ fix GST_VALUE_HOLDS_CAPS
++
++2004-02-19 David Schleef <ds@schleef.org>
++
++ * gst/gstinfo.h: Copy G_STRFUNC implementation from glib-2.4
++ and use it for GST_FUNCTION. (bug #134750)
++
++2004-02-19 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * po/fr.po:
++ * po/nl.po:
++ updating translations
++
++2004-02-19 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * tools/gst-run.c: (get_candidates), (main): some fixes from jdahlin
++
++2004-02-18 kost@imn.htwk-leipzig.de
++
++ reviewed by: David Schleef <ds@schleef.org>
++
++ * docs/libs/gstreamer-libs-sections.txt: Add missing sections
++ for libgstcontrol.
++
++2004-02-18 David Schleef <ds@schleef.org>
++
++ * libs/gst/control/dparam.c: (gst_dparam_class_init):
++ * libs/gst/control/dparam_smooth.c: (gst_dpsmooth_class_init),
++ (gst_dpsmooth_new): Additional fixes to get double dparams working.
++ * tools/gst-inspect.c: (print_element_info): Support dumping of
++ double dparam information.
++
++2004-02-17 David Schleef <ds@schleef.org>
++
++ * gst/elements/gstmultifilesrc.c: (gst_multifilesrc_class_init):
++ Use G_TYPE_STRING in signal prototype instead of G_TYPE_POINTER.
++ * gst/elements/gsttypefind.c: (gst_type_find_element_class_init):
++ Use GST_TYPE_CAPS in signal prototype.
++ * gst/gstcaps.c: (_gst_caps_initialize), (gst_caps_copy_conditional):
++ Convert GST_TYPE_CAPS to boxed.
++ * gst/gstelement.c: (gst_element_class_init):
++ Use GST_TYPE_TAG_LIST in signal prototype.
++ * gst/gstindex.c: (gst_index_class_init):
++ * gst/gstindex.h:
++ Add GST_TYPE_INDEX_ENTRY type.
++ * gst/gstmarshal.list:
++ Add necessary marshal types.
++ * gst/gstpad.c: (gst_real_pad_class_init),
++ (_gst_real_pad_fixate_accumulator), (gst_pad_link_fixate),
++ (gst_pad_recover_caps_error):
++ Use GST_TYPE_CAPS in signal prototypes. Fix some debugging strings.
++ * gst/gststructure.c: (_gst_structure_initialize),
++ (gst_structure_copy), (_gst_structure_copy_conditional):
++ * gst/gststructure.h:
++ Convert GST_TYPE_STRUCTURE to boxed.
++ * gst/gsttag.c: (gst_tag_list_get_type):
++ * gst/gsttag.h:
++ Add GST_TYPE_TAG_LIST type.
++
++2004-02-17 Julien MOUTTE <julien@moutte.net>
++
++ * gst/gstpad.c: (gst_pad_try_set_caps): Reverting my change according
++ to what we agreed with david.
++ * gst/gstpad.h: adding GST_PAD_IS_NEGOTIATING macro.
++
++2004-02-17 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * po/nl.po: update translation
++
++2004-02-17 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/autoplug/gstspider.c: (gst_spider_identity_plug):
++ throw an error if spider is trying to play a mime type there is
++ no decoder for
++ * po/POTFILES.in:
++ add gst/autoplug/gstspider.c for translation
++
++2004-02-17 Julien MOUTTE <julien@moutte.net>
++
++ * gst/gstpad.c: (gst_pad_try_set_caps): We are nice people. Return
++ silently when the pad is negotiating.
++
++2004-02-16 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/faq/Makefile.am:
++ add script to run gstreamer uninstalled
++ * docs/faq/faq.xml:
++ * docs/faq/developing.xml:
++ * docs/faq/gst-uninstalled:
++ extract script to run gstreamer uninstalled
++ * docs/manuals.mak:
++ add EXTRA_SOURCES variable for Makefile.am's to set to
++ use additional SOURCE files for the doc build
++
++2004-02-16 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstatomic_impl.h: Fedora 2 test package patch for S390
++
++2004-02-15 Julien MOUTTE <julien@moutte.net>
++
++ * gst/gstbin.c: (gst_bin_change_state), (gst_bin_iterate): Fix a big
++ bug that was breaking pipelines like sinesrc ! { queue ! osssink } when
++ an error was thrown by osssink. Basically a state change failure for
++ an element in a different scheduling group was considered as
++ successful, which means that caps nego was going on and weird stuff
++ happened. Like I wrote in the comment there, if someone wants to
++ revert that please drop me a mail explaining why because I really see
++ no point in keeping that broken behaviour there.
++ * gst/gstqueue.c: (gst_queue_get): Add a safety check as the queue CAN
++ be empty, we then return NULL which will trigger a nice error when
++ pulling from the pad.
++
++2004-02-13 David Schleef <ds@schleef.org>
++
++ * libs/gst/control/dparam.c: (gst_dparam_class_init),
++ (gst_dparam_get_property), (gst_dparam_set_property),
++ (gst_dparam_do_update_default):
++ * libs/gst/control/dparam.h:
++ * libs/gst/control/dparam_smooth.c: (gst_dpsmooth_class_init),
++ (gst_dpsmooth_new), (gst_dpsmooth_set_property),
++ (gst_dpsmooth_get_property), (gst_dpsmooth_value_changed_double),
++ (gst_dpsmooth_do_update_double):
++ * libs/gst/control/dparam_smooth.h:
++ * libs/gst/control/dparammanager.c:
++ (gst_dpman_inline_direct_update):
++ Add support for double dparams.
++
++2004-02-13 David Schleef <ds@schleef.org>
++
++ * gst/elements/gstfdsrc.c: (gst_fdsrc_get): Use GST_TIME_TO_TIMEVAL()
++ * gst/gstclock.h: Avoid using 64-bit % operator (slow!)
++
++2004-02-13 Mattias Wadman <mattias@sudac.org>
++
++ reviewed by: David Schleef <ds@schleef.org>
++
++ * gst/elements/gstfdsrc.c: (gst_fdsrc_class_init),
++ (gst_fdsrc_init), (gst_fdsrc_set_property),
++ (gst_fdsrc_get_property), (gst_fdsrc_get):
++ * gst/elements/gstfdsrc.h: Adds timeout property to fdsrc,
++ and sends an EOS event if file descriptor reading times out.
++
++2004-02-13 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ add calls to AM_CONDITIONAL for subsystems for automake 1.6.x
++
++2004-02-13 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac: pass required libxml version as argument
++ (bug reported by Christophe Fergeau)
++
++2004-02-12 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/gstreamer-docs.sgml:
++ * docs/gst/tmpl/gstxml.sgml:
++ * docs/libs/gstreamer-libs-docs.sgml:
++ version API docs
++
++2004-02-12 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstinfo.c:
++ * gst/gstregistrypool.c: (gst_registry_pool_plugin_filter),
++ (gst_registry_pool_feature_filter):
++ * gst/gstthread.c: (gst_thread_class_init):
++ * gst/gstvalue.c:
++ add includes exposed by building without libxml
++ * gst/indexers/Makefile.am:
++ do not build fileindex when LOADSAVE disabled; we should have
++ a better libxml check later since fileindex depends on xml, not
++ LOADSAVE or REGISTRY
++ * libs/gst/control/Makefile.am:
++ link with m
++ * tools/Makefile.am:
++ fix wrong source code for gst-xmlinspect
++
++2004-02-12 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ fix gcov help output
++ move calls to and use new GST_CHECK_DISABLE_SUBSYSTEM
++ * docs/random/release:
++ some updated releasing notes
++ * gstreamer.spec.in:
++ more updates
++
++2004-02-12 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/faq/faq.xml:
++ * docs/manual/manual.xml:
++ * docs/pwg/pwg.xml:
++ * docs/pwg/titlepage.xml:
++ put version in documentation
++
++2004-02-12 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * tools/Makefile.am: fix man page installation
++
++2004-02-12 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ don't check for libxml when load/save and registry disabled (#105844)
++ * gstreamer.spec.in:
++ sync with fedora candidate spec
++
++2004-02-12 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * po/fr.po:
++ * po/nl.po:
++ replace multidisksrc with multifilesrc
++
++2004-02-11 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * po/POTFILES.in:
++ update to multidisksrc => multifilesrc file renaming (#134145)
++
++2004-02-11 David Schleef <ds@schleef.org>
++
++ * docs/gst/tmpl/gstcaps.sgml: Fix stuff that mentions GstProps
++ * docs/gst/tmpl/gstpadtemplate.sgml: same
++ * docs/gst/tmpl/gstreamer-unused.sgml: Remove GstProps
++ * gst/gstobject.c: (gst_object_set_name_default): Do the memleak
++ fixing dance.
++ * gst/gstutils.c: Remove disabled code that uses GstProps.
++ * gst/registries/gstxmlregistry.h: same
++ * docs/random/ds/0.9-suggested-changes: random notes
++
++2004-02-11 kost@imn.htwk-leipzig.de
++
++ reviewed by: David Schleef <ds@schleef.org>
++
++ * gst/gstclock.c: (gst_clock_entry_new): fixes structure
++ initialisation of clock (bug #134128)
++
++2004-02-11 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ * gst/elements/Makefile.am:
++ * gst/elements/gstelements.c:
++ * gst/elements/gstmultifilesrc.c: (gst_multifilesrc_base_init),
++ (gst_multifilesrc_class_init), (gst_multifilesrc_init),
++ (gst_multifilesrc_set_property), (gst_multifilesrc_get_property),
++ (gst_multifilesrc_get), (gst_multifilesrc_open_file),
++ (gst_multifilesrc_close_file), (gst_multifilesrc_change_state):
++ * gst/elements/gstmultifilesrc.h:
++ rename multidisksrc to multifilesrc (part of #122200)
++
++2004-02-11 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/manuals.mak:
++ fix automake complaints
++ * gst-element-check.m4:
++ fix unquotedness
++
++2004-02-11 David Schleef <ds@schleef.org>
++
++ * docs/gst/Makefile.am: Call gst_init() in built gstreamer-scan.
++ * gst/gstatomic_impl.h: Disable sparc implementation.
++
++2004-02-11 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst-element-check.m4:
++ fix underquoted macros as reported by automake 1.8.x (#133800)
++ * configure.ac:
++ require gettext 0.11.5 so ulonglong.m4 gets checked out and copied
++ by autopoint (fixes #132996)
++
++2004-02-10 Andy Wingo <wingo@pobox.com>
++
++ * gst/gstpad.c (gst_pad_custom_new): Add a FIXME, this is a hacky
++ way to do inheritance.
++ (gst_pad_get_event_masks, gst_pad_get_event_masks_default)
++ (gst_pad_get_query_types, gst_pad_get_query_types_default):
++ Routine docs.
++ (gst_pad_set_link_function, gst_pad_set_fixate_function)
++ (gst_pad_set_getcaps_function): Doc from Dave's negotation random
++ doc.
++ (gst_pad_unlink, gst_pad_is_linked): Docs.
++ (gst_pad_renegotiate): A brief description of capsnego.
++ (gst_pad_try_set_caps): Document.
++ (gst_pad_try_set_caps_nonfixed): Document.
++ (gst_pad_can_link_filtered, gst_pad_link_filtered): Doc fixes.
++ (gst_pad_set_parent): Deprecated (although not out of the API).
++ (gst_pad_get_parent): Deprecated, although many plugins use this.
++ (gst_pad_add_ghost_pad, gst_pad_remove_ghost_pad): Doc that these
++ are private and will go away in 0.9.
++ (gst_pad_perform_negotiate): Doc.
++ (gst_pad_link_unnegotiate): I think this is meant to be static.
++ (gst_pad_get_negotiated_caps, gst_pad_get_pad_template_caps)
++ (gst_pad_template_get_caps_by_name, gst_pad_check_compatibility)
++ (gst_pad_get_peer): Doc updates.
++ (gst_pad_caps_change_notify): Doc.
++ (gst_pad_alloc_buffer, gst_pad_push, gst_static_pad_template_get)
++ (gst_ghost_pad_new): Doc fixes.
++
++ * gst/gstobject.c (gst_object_get_parent, gst_object_unparent)
++ (gst_object_check_uniqueness):
++
++ * gst/gstelement.c (gst_element_add_pad)
++ (gst_element_add_ghost_pad, gst_element_remove_pad)
++ (gst_element_remove_ghost_pad, gst_element_get_pad)
++ (gst_element_get_static_pad, gst_element_get_pad_list)
++ (gst_element_class_get_pad_template_list)
++ (gst_element_class_get_pad_template): Work on the docs.
++ (gst_element_get_pad_template_list): Uses the class method.
++ (gst_element_get_compatible_pad_template): Docs, and consolidate
++ some test conditions.
++ (gst_element_get_pad_from_template): New static function.
++ (gst_element_request_compatible_pad): Docs, and work with
++ non-request compatible templates.
++ (gst_element_get_compatible_pad_filtered): Docs and remove
++ redundant checks.
++ (gst_element_get_compatible_pad, gst_element_link_pads_filtered)
++ (gst_element_link_filtered, gst_element_link_many)
++ (gst_element_link, gst_element_link_pads)
++ (gst_element_unlink_many): Docs.
++
++2004-02-05 Andy Wingo <wingo@pobox.com>
++
++ * gst/gstpad.c (_gst_real_pad_fixate_accumulator):
++ s/pointer/boxed/.
++
++ * gst/gstmarshal.list (VOID:BOXED, BOXED:BOXED): New marshallers.
++
++ * gst/gstpad.c (gst_real_pad_class_init): Use a BOXED:BOXED
++ marshaller for ::fixate, and VOID:BOXED for ::caps-nego-failed,
++ with the type=GST_TYPE_CAPS. This allows language bindings to know
++ what kind of data they're dealing with.
++
++ * gst/gstcaps.c (_gst_caps_value_init): GBoxed values initialize
++ to NULL when g_value_init is called. GstCaps, which rolls its own
++ type implementation, now does the same instead of allocating empty
++ caps.
++ (_gst_caps_initialize, _gst_caps_collect_value,
++ _gst_caps_lcopy_value): Provide collect_value and lcopy_value type
++ table methods. This allows G_VALUE_COLLECT to work.
++
++2004-02-05 Andy Wingo <wingo@pobox.com>
++
++ * configure.ac:
++ * testsuite/Makefile.am (SUBDIRS):
++ * testsuite/ghostpads/Makefile.am:
++ * testsuite/ghostpads/ghostpads.c: A new test for ghost pads.
++
++ * gst/gstpad.c (gst_pad_add_ghost_pad, gst_pad_remove_ghost_pad):
++ These two routines are the only ones that set
++ GST_GPAD_REALPAD(gpad), the ghost pad list, and the ghost pad's
++ pad template. They should be made static, depending on ABI needs.
++ (gst_real_pad_dispose): Handle the case of ghost pads without a
++ parent. Assert after dealing with ghost pads that the ghost pad
++ list is empty.
++ (gst_ghost_pad_class_init): New property added, ::real-pad. Can be
++ set after creation.
++ (gst_ghost_pad_dispose): Set ::real-pad to NULL.
++ (gst_ghost_pad_set_property, gst_ghost_pad_get_property): New
++ functions. set_property will call add_ghost_pad/remove_ghost_pad
++ as appropriate.
++ (gst_ghost_pad_new): All the work is offloaded to g_object_new.
++
++ * gst/gstelement.c (gst_element_add_pad): Handle ghost pads as well.
++ (gst_element_add_ghost_pad): Remove code duplicated from _add_pad.
++ (gst_element_remove_pad): Handle ghost pads as well.
++ (gst_element_remove_ghost_pad): Deprecated (could be removed,
++ depending on API-stability needs).
++
++2004-02-05 Andy Wingo <wingo@pobox.com>
++
++ * gst/gstbin.[ch]: (gst_bin_get_by_interface): GTypes are scalars,
++ of course they're const
++
++2004-02-11 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * tools/Makefile.am:
++ * tools/gst-feedback:
++ * tools/gst-feedback-0.7:
++ make gst-feedback versioned too for consistency
++
++2004-02-11 David Schleef <ds@schleef.org>
++
++ * gst/gstpad.c: (gst_pad_link_intersect), (gst_pad_link_fixate),
++ (gst_pad_try_set_caps): Fix format strings for GST_PTR_FORMAT.
++
++2004-02-10 Julien MOUTTE <julien@moutte.net>
++
++ * gst/gstevent.c: (_gst_event_free): Sometimes a tag event arrives but
++ the structure does not contain a valid tag list. Adding a safety check
++ to remove a noisy warning in that case.
++
++2004-02-10 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gst.c: fix name to be in line with others
++
++2004-02-09 Julien MOUTTE <julien@moutte.net>
++
++ * libs/gst/bytestream/bytestream.c: (gst_bytestream_peek): We should
++ not shout that loud when len is 0. Just return 0 silently.
++
++2004-02-09 Julien MOUTTE <julien@moutte.net>
++
++ * gst/gstdata.c: (gst_data_ref): Adding a categorized debug on data_ref
++ because data_unref has one and I prefer the debug to be symetric.
++ * gst/gstqueue.c: (gst_queue_locked_flush): Fix a huge memleak. Buffers
++ were refed when added to the queue and unrefed only once when the queue
++ was flushed. Now the flush handler unref the buffers two times : first
++ unref for the ref added when pushing in the queue's tail and second
++ unref to destroy the flushed buffer.
++
++2004-02-08 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/pwg/building-boiler.xml: fix cvs checkout documentation
++
++2004-02-06 David Schleef <ds@schleef.org>
++
++ * docs/random/ds/0.9-suggested-changes: Random ramblings
++ * gst/elements/gstfilesrc.c: (gst_filesrc_get_mmap): Cast size_t
++ to int before printing.
++ * gst/parse/grammar.y: Fix gcc-2.95 style variadic macros.
++ * gst/parse/parse.l: same. See bug #129600
++
++2004-02-06 David Schleef <ds@schleef.org>
++
++ * gst/gstindex.c: (gst_index_add_format), (gst_index_add_id),
++ (gst_index_add_entry), (gst_index_add_associationv),
++ (gst_index_add_association): Add gst_index_add_associationv()
++ and clean up gst_index_add_association(). #127133
++
++2004-02-06 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * autogen.sh: check out common with right tag if CVS/Tag exists
++
++2004-02-06 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * testsuite/ghostpads/ghostpads.c: (main):
++ fix testsuite from segfaulting
++
++2004-02-06 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * Makefile.am: add release target
++ * configure.ac: bump nano to 1
++ * docs/random/release:
++
++2004-02-06 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstcaps.h:
++ * gst/gstelement.c: (gst_element_base_class_init),
++ (gst_element_class_set_details), (gst_element_clear_pad_caps):
++ * gst/gstpad.c: (gst_pad_link_intersect), (gst_pad_link_fixate),
++ (gst_pad_try_set_caps), (gst_pad_can_link_filtered),
++ (gst_real_pad_dispose):
++ * gst/gststructure.c: (gst_structure_free),
++ (gst_structure_from_string):
++ put reverted patch back in
++ * gst/gstelement.c: (gst_element_remove_pad):
++ free explicit caps if they're set
++ * gst/gstpad.c: (_gst_pad_default_fixate_func):
++ copy the structure when fixating
++
++2004-02-05 David Schleef <ds@schleef.org>
++
++ * gst/gstmarshal.list:
++ * gst/gstpad.c: (gst_real_pad_class_init),
++ (_gst_real_pad_fixate_accumulator):
++ Revert POINTER->BOXED change in signal marshaller.
++
++=== release 0.7.4 ===
++
++2004-02-06 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * NEWS: GStreamer 0.7.4 "Wooden Eels" released
++ * configure.ac: changed for release
++
++2004-02-05 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
++
++ * gstreamer.spec.in:
++ bump required version of gtk-doc
++
++2004-02-05 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstcaps.h:
++ * gst/gstelement.c: (gst_element_base_class_init),
++ (gst_element_class_set_details), (gst_element_clear_pad_caps):
++ * gst/gstpad.c: (gst_pad_link_intersect), (gst_pad_link_fixate),
++ (gst_pad_try_set_caps), (gst_pad_can_link_filtered),
++ (gst_real_pad_dispose):
++ * gst/gststructure.c: (gst_structure_free),
++ (gst_structure_from_string):
++ revert patch that breaks applications, reapply after release
++ to get this fixed properly
++
++2004-02-05 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gsttag.c: (_gst_tag_initialize):
++ * gst/gsttag.h:
++ remove duplicated field GST_TAG_APPLICATION. It's GST_TAG_ENCODER
++
++2004-02-04 David Schleef <ds@schleef.org>
++
++ Fix some memleaks:
++ * gst/autoplug/gstspider.c: (gst_spider_request_new_pad),
++ (gst_spider_plug_from_srcpad):
++ * gst/autoplug/gstspideridentity.c: (gst_spider_identity_link):
++
++2004-02-04 David Schleef <ds@schleef.org>
++
++ * gst/gstelement.c: (gst_element_clear_pad_caps): Make sure we have
++ a GstRealPad before accessing its structure members.
++
++2004-02-04 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstclock.c: (gst_clock_init), (gst_clock_set_speed),
++ (gst_clock_get_speed):
++ * gst/gstclock.h:
++ reset padding, remove unused fields
++
++2004-02-04 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/autoplug/gstspideridentity.c:
++ (gst_spider_identity_sink_loop_type_finding):
++ use get_allowed_caps, not get_caps (fixes #132519)
++ * gst/elements/gsttypefind.c: (stop_typefinding):
++ use correct order when sending buffers and seeking
++
++2004-02-04 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ * gst/gstelement.h:
++ * gst/gstpad.h:
++ * gst/gstqueue.h:
++ upgrade libtool CURRENT, reset padding
++
++2004-02-04 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ bump to prerelease
++ put back AM_PROG_LIBTOOL to make libtoolize stop complaining
++
++2004-02-04 David Schleef <ds@schleef.org>
++
++ * docs/random/ds/0.9-suggested-changes: random notes
++ * gst/elements/gstfakesrc.c: (gst_fakesrc_get_formats),
++ (gst_fakesrc_get_query_types), (gst_fakesrc_get_event_mask):
++ Replace GST_PAD_EVENT_MASK_FUNCTION() (et al.) with its
++ expansion.
++ * gst/elements/gstfilesink.c: (gst_filesink_get_formats),
++ (gst_filesink_get_query_types): same
++ * gst/elements/gstfilesrc.c: (gst_filesrc_get_event_mask),
++ (gst_filesrc_get_query_types), (gst_filesrc_get_formats): same
++ * gst/gstcaps.h: deprecate GST_DEBUG_CAPS(), and fix the macro
++ to use new GST_PTR_FORMAT.
++ * gst/gstelement.h: deprecate function factory macros
++ GST_ELEMENT_QUERY_TYPE_FUNCTION(), GST_ELEMENT_EVENT_MASK_FUNCTION().
++ These are our last variadic macros that can't be replaced with
++ inlines. Celebrate! Also fix a typo in an #ifdef that was
++ attempting to deprecate gst_element_clock_wait().
++ * gst/gstevent.h: same
++ * gst/gstpad.c: (gst_pad_link_intersect), (gst_pad_link_fixate),
++ (gst_pad_try_set_caps): replace GST_DEBUG_CAPS() with GST_DEBUG()
++ * gst/gstpad.h: deprecate function factory macros similar to above.
++
++2004-02-04 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ * tools/Makefile.am:
++ * tools/gst-run.c: (popt_callback), (hash_print_key),
++ (find_highest_version), (unmangle_libtool), (get_dir_of_binary),
++ (get_candidates), (main):
++ add new source file to generate non-versioned wrapper binaries
++ for our tools.
++
++2004-02-04 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstevent.c: (_gst_event_free):
++ actually break; inside the switch statement
++ * gst/parse/grammar.y:
++ fix memleak where GValues weren't unset
++
++2004-02-03 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gststructure.c: (gst_structure_from_string):
++ fix huge memleak
++ * gst/elements/gsttypefind.c: (gst_type_find_element_have_type),
++ (new_entry), (gst_type_find_element_chain):
++ * gst/gstelement.c: (gst_element_base_class_init),
++ (gst_element_class_set_details):
++ * gst/gstpad.c: (gst_pad_can_link_filtered):
++ fix smaller memleaks
++ * gst/gstpad.c: (gst_real_pad_dispose):
++ check that explicit caps are gone
++ * gst/gststructure.c: (gst_structure_free):
++ actually free the structure
++ * gst/gstelement.c: (gst_element_clear_pad_caps):
++ unset explicit caps
++
++2004-02-03 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * tools/Makefile.am:
++ use AM_CFLAGS since all the CFLAGS are the same
++ use AM_LDFAGS
++
++2004-02-03 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/manual/gnome.xml:
++ expand example a little
++ * gst/gst.c: (gst_init_with_popt_table),
++ (gst_init_check_with_popt_table), (init_pre), (init_popt_callback):
++ make sure popt option displays are done with right textdomain
++ use GstPoptOption type
++ * gst/gst.h:
++ create GstPoptOption type
++
++2004-02-03 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gsterror.c: (_gst_stream_errors_init):
++ * gst/gsterror.h:
++ adding error type for no codec
++ * po/POTFILES.in:
++ add gst-inspect
++ * po/nl.po:
++ update dutch translation
++ * tools/gst-inspect.c: (print_element_list), (main):
++ do proper internationalization
++ * tools/gst-launch.c: (idle_func):
++ remove commented out function call
++
++2004-02-03 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/README:
++ add some error fixing notes
++ * docs/gst/gstreamer-sections.txt:
++ remove double entries
++ * docs/gst/tmpl/gstbin.sgml:
++ * docs/gst/tmpl/gstclock.sgml:
++ remove override
++ * docs/gst/tmpl/gstelement.sgml:
++ * docs/gst/tmpl/gstindex.sgml:
++ * docs/gst/tmpl/gstobject.sgml:
++ * docs/gst/tmpl/gstpadtemplate.sgml:
++ * docs/gst/tmpl/gstreamer-unused.sgml:
++ * docs/gst/tmpl/gsttag.sgml:
++ * docs/gst/tmpl/gstthread.sgml:
++ * docs/gst/tmpl/gstxml.sgml:
++ * gst/gsttag.h:
++ sync header prototypes with c decls
++ * gst/gsttaginterface.c:
++ fix doc headers
++
++2004-02-03 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/parse/Makefile.am:
++ * gst/gstobject.h:
++ get rid of gstmarshal.h dependency. It's not needed.
++ * gst/gst.h:
++ * gst/elements/gstfakesink.c:
++ * gst/elements/gstfakesrc.c:
++ * gst/elements/gstidentity.c:
++ * gst/gstbin.c:
++ * gst/gstelement.c:
++ * gst/gstindex.c:
++ * gst/gstobject.c:
++ * gst/gstpad.c:
++ * gst/gstthread.c:
++ * gst/gstxml.c:
++ * libs/gst/control/dparam.c:
++ * libs/gst/control/dparammanager.c:
++ include gstmarshal.h.
++ Fixes #132045
++
++2004-02-03 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/elements/gstfilesrc.c: (gst_filesrc_init),
++ (gst_filesrc_dispose), (gst_filesrc_free_parent_mmap),
++ (gst_filesrc_map_region), (gst_filesrc_get_mmap):
++ * gst/elements/gstfilesrc.h:
++ don't ref the filesrc when creating mmaped buffers. Don't keep a
++ list of not-yet-destroyed buffers.
++ * gst/gstbuffer.h:
++ Deprecated BST_BUFFER_FREE_FUNC and GST_BUFFER_COPY_FUNC
++
++2004-02-02 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gst.c: (init_pre):
++ remove textdomain
++
++2004-02-02 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced-events.xml:
++ * docs/pwg/advanced-scheduling.xml:
++ * docs/pwg/intro-basics.xml:
++ * docs/pwg/other-manager.xml:
++ * docs/pwg/other-nton.xml:
++ * docs/pwg/other-ntoone.xml:
++ * docs/pwg/other-oneton.xml:
++ * docs/pwg/pwg.xml:
++ All sort of documentation... Forgot what. Point is that I want this
++ in before I leave. The 'other-*' will be the last section and will
++ explain issues specific to these type of elements.
++
++2004-02-02 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/elements/gstfilesrc.c: (gst_filesrc_map_region),
++ (gst_filesrc_get_read):
++ set all the values on buffers that we can
++
++2004-02-02 David Schleef <ds@schleef.org>
++
++ Change usage of isblah() to g_ascii_isblah() to be more locale
++ independent. (#133076)
++ * gst/gsturi.c: (gst_uri_protocol_check_internal):
++ * gst/gstutils.c:
++ * gst/parse/parse.l:
++
++2004-02-02 Jon Trowbridge <trow@gnu.org>
++
++ reviewed by: David Schleef <ds@schleef.org>
++
++ Fix memory leaks:
++ * gst/gstcaps.c: (gst_caps_to_string):
++ * gst/registries/gstxmlregistry.c:
++ (gst_xml_registry_add_path_list_func),
++ (gst_xml_registry_parse_padtemplate):
++
++2004-02-02 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstelement.c: (gst_element_default_error):
++ suffix error messages with period
++
++2004-01-31 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/elements/gstfilesrc.c: (gst_filesrc_open_file):
++ * gst/elements/gstmultidisksrc.c: (gst_multidisksrc_open_file):
++ * gst/gsterror.c: (gst_error_get_message):
++ Suffix with dots
++ * po/fr.po:
++ * po/nl.po:
++ Update translation files
++
++2004-01-31 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/autoplug/gstspideridentity.c:
++ (gst_spider_identity_sink_loop_type_finding):
++ * gst/elements/gstfakesink.c: (gst_fakesink_change_state):
++ * gst/elements/gstfilesink.c: (gst_filesink_open_file),
++ (gst_filesink_close_file), (gst_filesink_handle_event),
++ (gst_filesink_chain):
++ * gst/elements/gstfilesrc.c: (gst_filesrc_map_region),
++ (gst_filesrc_get_read), (gst_filesrc_open_file):
++ * gst/elements/gstidentity.c: (gst_identity_chain):
++ * gst/elements/gstmultidisksrc.c: (gst_multidisksrc_open_file):
++ * gst/elements/gstpipefilter.c: (gst_pipefilter_get),
++ (gst_pipefilter_chain), (gst_pipefilter_open_file):
++ * gst/elements/gsttypefind.c: (gst_type_find_element_chain):
++ * gst/gsterror.c: (_gst_core_errors_init),
++ (_gst_library_errors_init), (_gst_resource_errors_init),
++ (_gst_stream_errors_init), (gst_error_get_message):
++ * gst/gstpad.c: (gst_pad_set_explicit_caps),
++ (gst_pad_recover_caps_error), (gst_pad_pull):
++ * gst/gstqueue.c: (gst_queue_chain), (gst_queue_get):
++ * gst/schedulers/gstbasicscheduler.c:
++ (gst_basic_scheduler_chainhandler_proxy),
++ (gst_basic_scheduler_gethandler_proxy),
++ (gst_basic_scheduler_cothreaded_chain):
++ Suffix error messages with period.
++ Use (NULL) instead of NULL
++
++2004-01-31 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/tmpl/gstelement.sgml:
++ * docs/gst/tmpl/gstxml.sgml:
++ * gst/gstelement.c: (gst_element_error_full):
++ add element path to error
++
++2004-01-31 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * docs/random/mimetypes:
++ update raw int/float info
++ * gst/gsttag.c: (_gst_tag_initialize):
++ * gst/gsttag.h:
++ add GST_TAG_ENCODER
++
++2004-01-30 David Schleef <ds@schleef.org>
++
++ * gst/cothreads.c: Add another fallback if MAP_ANONYMOUS is
++ missing (#132991)
++
++2004-01-30 Laurent Vivier <Laurent.Vivier@bull.net>
++
++ reviewed by Benjamin Otte
++ parts of the patch submitted in bug #113913
++
++ * configure.ac:
++ use AC_C_INLINE. Use = instead of == with test
++ * examples/plugins/example.c:
++ * gst/autoplug/gstspideridentity.c:
++ * gst/elements/gstfdsrc.c:
++ * gst/elements/gstfilesrc.c:
++ * gst/elements/gstidentity.c:
++ * gst/elements/gstmultidisksrc.c:
++ * gst/elements/gststatistics.c:
++ * gst/gstelement.c:
++ * gst/gstobject.c:
++ * gst/gstpad.c:
++ * gst/gstpipeline.c:
++ * gst/gstthread.c:
++ don't end enums with a comma
++ * gst/gstindex.c: (gst_index_compare_func):
++ do explicit casting to gint
++ * gst/gsttrace.c: (gst_trace_text_flush):
++ #define strsize as a macro
++
++2004-01-30 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/README:
++ * docs/gst/gstreamer-docs.sgml:
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/gstelement.sgml:
++ * docs/gst/tmpl/gsterror.sgml:
++ * docs/gst/tmpl/gstinterface.sgml:
++ * docs/gst/tmpl/gstreamer-unused.sgml:
++ * docs/gst/tmpl/gststructure.sgml:
++ * docs/gst/tmpl/gsttag.sgml:
++ * docs/gst/tmpl/gsttaginterface.sgml:
++ * docs/gst/tmpl/gstvalue.sgml:
++ make sure all API ends up in the built docs
++ * gst/gstinterface.c:
++ * gst/gststructure.c: (gst_structure_id_set_value),
++ (gst_structure_set_value), (gst_structure_id_get_value):
++ * gst/gststructure.h:
++ * gst/gstvalue.h:
++ sync .h with .c declarations
++
++2004-01-30 Julien Moutte <julien@moutte.net>
++
++ * libs/gst/bytestream/bytestream.c: Reverting my event handling patch.
++ Ronald will fix riffread.
++
++2004-01-30 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced-interfaces.xml:
++ Added tuner interface docs.
++
++2004-01-30 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * docs/random/mimetypes:
++ correct Theora information
++ * gst/gstelement.h:
++ make GST_ELEMENT_ERROR do a GST_ERROR_OBJECT
++
++2004-01-29 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstelement.c: (gst_element_error_full):
++ * gst/gstelement.h:
++ GST_ELEMENT_ERROR in enum -> _IN_ERROR
++
++2004-01-29 Julien MOUTTE <julien@moutte.net>
++
++ * gst/elements/gstfilesrc.c: (gst_filesrc_get),
++ (gst_filesrc_uri_handler_init): Fixing seeking by making FLUSH happen
++ again and even before DISCONT.
++ * gst/gstpad.c: (gst_pad_event_default): Remove a unused switch case.
++ * libs/gst/bytestream/bytestream.c: (gst_bytestream_get_next_buf): Fix
++ bytestream so that it's not stopping to fill the bytestream if events
++ different than EOS or DISCONT are received. Instead it process them so
++ that they go downstream.
++
++2004-01-29 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/tmpl/gstelement.sgml:
++ * docs/gst/tmpl/gstreamer-unused.sgml:
++ * docs/gst/tmpl/gstxml.sgml:
++ * gst/autoplug/gstspideridentity.c:
++ (gst_spider_identity_sink_loop_type_finding):
++ * gst/elements/gstfakesink.c: (gst_fakesink_change_state):
++ * gst/elements/gstfilesink.c: (gst_filesink_open_file),
++ (gst_filesink_close_file), (gst_filesink_handle_event),
++ (gst_filesink_chain):
++ * gst/elements/gstfilesrc.c: (gst_filesrc_map_region),
++ (gst_filesrc_get_read), (gst_filesrc_open_file):
++ * gst/elements/gstidentity.c: (gst_identity_chain):
++ * gst/elements/gstmultidisksrc.c: (gst_multidisksrc_open_file):
++ * gst/elements/gstpipefilter.c: (gst_pipefilter_get),
++ (gst_pipefilter_chain), (gst_pipefilter_open_file):
++ * gst/elements/gsttypefind.c: (gst_type_find_element_chain):
++ * gst/gstelement.h:
++ * gst/gstpad.c: (gst_pad_set_explicit_caps),
++ (gst_pad_recover_caps_error), (gst_pad_pull):
++ * gst/gstqueue.c: (gst_queue_chain), (gst_queue_get):
++ * gst/schedulers/gstbasicscheduler.c:
++ (gst_basic_scheduler_chainhandler_proxy),
++ (gst_basic_scheduler_gethandler_proxy),
++ (gst_basic_scheduler_cothreaded_chain):
++ gst_element_error -> GST_ELEMENT_ERROR
++
++2004-01-29 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/Makefile.am:
++ * docs/gst/tmpl/gstelement.sgml:
++ * docs/gst/tmpl/gstxml.sgml:
++ * docs/manuals.mak:
++ * docs/pwg/advanced-request.xml:
++ * docs/pwg/advanced-scheduling.xml:
++ * docs/pwg/advanced-tagging.xml:
++ fix non-validating docbook using CDATA
++ make sure make check-local gets run first to check if it validates
++
++2004-01-29 Julien MOUTTE <julien@moutte.net>
++
++ * docs/pwg/advanced-events.xml: Adding documentation on advanced event
++ handling (up and downstream).
++ * docs/pwg/advanced-interfaces.xml: Make it coherent with the
++ my_filter thing.
++
++2004-01-29 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced-tagging.xml:
++ Add docs about tag writing.
++
++2004-01-29 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced-tagging.xml:
++ Add a part about tag reading and application signalling... Tag
++ writing still needs to be documented.
++ * gst/elements/gstfilesrc.c: (gst_filesrc_set_location):
++ We can set file locations in READY, too.
++
++2004-01-29 Julien MOUTTE <julien@moutte.net>
++
++ * docs/random/ds/element-checklist: Adding some notes about src
++ events.
++
++2004-01-29 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/random/mimetypes:
++ Update docs to point to correct elements for various mimetypes, and
++ some more errors pointed out by St??phane LOEUILLET (aka LeRoutier)
++ <stephane.loeuillet@tiscali.fr>.
++
++2004-01-28 David Schleef <ds@schleef.org>
++
++ * docs/pwg/intro-basics.xml: rewrite bufferpool stuff.
++
++2004-01-29 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * docs/random/mimetypes:
++ update docs for audio/x-raw-float. Add "buffer-frames=0 means
++ undefined"
++ * gst/elements/gstfilesrc.c: (gst_filesrc_set_location):
++ make it only work in NULL.
++ * gst/gstcaps.c:
++ don't posion NULL caps
++ * gst/gstelement.c: (gst_element_set_time):
++ add debugging statement
++ * gst/gstelement.c: (gst_element_emit_found_tag),
++ (gst_element_found_tag_func), (gst_element_found_tags):
++ * gst/gstelement.h:
++ These functions take const taglists
++ * gst/gstpad.c: (gst_pad_proxy_getcaps):
++ fix memleak
++ * gst/gstpad.c: (gst_pad_event_default):
++ make more effort on handling discont and clocks, g_warn if everything
++ fails
++ * gst/gststructure.c: (gst_structure_remove_fields),
++ (gst_structure_remove_fields_valist):
++ * gst/gststructure.h:
++ add gst_structure_remove_fields(_valist)
++ * gst/gsttag.c:
++ fix doc glitch
++
++2004-01-28 David Schleef <ds@schleef.org>
++
++ * docs/random/ds/element-checklist: Notes about gst_caps_to_string()
++ * gst/registries/gstxmlregistry.c: (gst_xml_registry_save_caps):
++ Fix memory leakage of gst_caps_to_string().
++
++ Use GST_PTR_FORMAT instead of gst_caps_to_string():
++ * gst/autoplug/gstsearchfuncs.c: (gst_autoplug_sp):
++ * gst/autoplug/gstspideridentity.c: (spider_find_suggest),
++ (gst_spider_identity_sink_loop_type_finding):
++ * gst/elements/gsttypefind.c: (gst_type_find_element_have_type),
++ (find_suggest):
++ * gst/gstpad.c: (gst_pad_try_relink_filtered),
++ (gst_pad_set_explicit_caps):
++ * gst/parse/grammar.y:
++
++2004-01-28 David Schleef <ds@schleef.org>
++
++ * configure.ac: Add detection for HAVE_PRINTF_EXTENSION and
++ GST_PRINTF_EXTENSION_FORMAT_DEFINE.
++ * docs/random/ds/0.9-suggested-changes: Notes from Company.
++ * gst/gstcaps.c: (gst_caps_to_string): Add comment.
++ * gst/gstconfig.h.in: Add define for GST_PTR_FORMAT
++ * gst/gstinfo.c: (_gst_debug_init), (gst_debug_print_object),
++ (gst_debug_log_default), (_gst_info_printf_extension),
++ (_gst_info_printf_extension_arginfo): Add printf extension.
++ * gst/gstinfo.h: remove G_GNUC_PRINTF, because it doesn't work with %P
++ * gst/gststructure.c: (gst_structure_to_string),
++ (_gst_structure_parse_value): Use gst_value_deserialize() and
++ remove old code.
++ * gst/gstvalue.c: (gst_value_deserialize_fourcc),
++ (gst_value_deserialize_boolean), (gst_strtoi),
++ (gst_value_deserialize_int), (gst_value_deserialize_double),
++ (gst_value_deserialize_string), (gst_value_deserialize): Implement
++ a bunch of deserialize functions and gst_value_deserialize.
++ * gst/gstvalue.h: er, _de_serialize, not unserialize
++ * testsuite/caps/string-conversions.c: (main): We don't currently
++ handle (float) in caps, so convert these to (double).
++ * testsuite/debug/Makefile.am: Add new test for the printf extension
++ * testsuite/debug/printf_extension.c: (main): same
++
++2004-01-28 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * docs/random/company/time:
++ Add some docs about clocking and time
++
++2004-01-28 Julien MOUTTE <julien@moutte.net>
++
++ * docs/pwg/advanced-interfaces.xml: Adding XOverlay documentation.
++
++2004-01-28 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/pwg/advanced-clock.xml:
++ * docs/pwg/advanced-dparams.xml:
++ * docs/pwg/advanced-events.xml:
++ * docs/pwg/advanced-interfaces.xml:
++ * docs/pwg/advanced-midi.xml:
++ * docs/pwg/advanced-request.xml:
++ * docs/pwg/advanced-scheduling.xml:
++ * docs/pwg/advanced-tagging.xml:
++ * docs/pwg/advanced-types.xml:
++ * docs/pwg/appendix-checklist.xml:
++ * docs/pwg/building-boiler.xml:
++ * docs/pwg/building-chainfn.xml:
++ * docs/pwg/building-filterfactory.xml:
++ * docs/pwg/building-pads.xml:
++ * docs/pwg/building-props.xml:
++ * docs/pwg/building-signals.xml:
++ * docs/pwg/building-state.xml:
++ * docs/pwg/building-testapp.xml:
++ * docs/pwg/intro-basics.xml:
++ * docs/pwg/intro-preface.xml:
++ * docs/pwg/other-autoplugger.xml:
++ * docs/pwg/other-sink.xml:
++ * docs/pwg/other-source.xml:
++ * docs/pwg/titlepage.xml:
++ fix up id's
++
++2004-01-28 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/95NonPath:
++ * docs/HACKING:
++ * docs/README:
++ * docs/building-the-docs-on-debian:
++ collect relevant bits of doc info
++
++2004-01-28 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced_tagging.xml:
++ Half-assed commit so Thomas can re-arrange document IDs here to be
++ consistent, too.
++
++2004-01-28 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/manual/autoplugging.xml:
++ * docs/manual/bins-api.xml:
++ * docs/manual/bins.xml:
++ * docs/manual/buffers-api.xml:
++ * docs/manual/buffers.xml:
++ * docs/manual/clocks.xml:
++ * docs/manual/components.xml:
++ * docs/manual/cothreads.xml:
++ * docs/manual/debugging.xml:
++ * docs/manual/dparams-app.xml:
++ * docs/manual/dynamic.xml:
++ * docs/manual/elements-api.xml:
++ * docs/manual/elements.xml:
++ * docs/manual/factories.xml:
++ * docs/manual/gnome.xml:
++ * docs/manual/goals.xml:
++ * docs/manual/helloworld.xml:
++ * docs/manual/helloworld2.xml:
++ * docs/manual/init-api.xml:
++ * docs/manual/intro.xml:
++ * docs/manual/links-api.xml:
++ * docs/manual/links.xml:
++ * docs/manual/manual.xml:
++ * docs/manual/motivation.xml:
++ * docs/manual/pads-api.xml:
++ * docs/manual/pads.xml:
++ * docs/manual/plugins-api.xml:
++ * docs/manual/plugins.xml:
++ * docs/manual/programs.xml:
++ * docs/manual/queues.xml:
++ * docs/manual/quotes.xml:
++ * docs/manual/schedulers.xml:
++ * docs/manual/states-api.xml:
++ * docs/manual/states.xml:
++ * docs/manual/threads.xml:
++ * docs/manual/typedetection.xml:
++ * docs/manual/xml.xml:
++ use chapter, part, section or misc as id starts for all bits
++
++2004-01-28 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/gstreamer-sections.txt:
++ Fix up TITLE of the sections
++
++2004-01-28 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced_interfaces.xml:
++ Add documentation on propertyprobing.
++ * docs/pwg/advanced_events.xml:
++ * docs/pwg/advanced_tagging.xml:
++ * docs/pwg/building_boiler.xml:
++ * docs/pwg/building_filterfactory.xml:
++ * docs/pwg/pwg.xml:
++ Move filterfactory and tagging into their own chapter, add a chapter
++ on events. all these are empty placeholders that will be filled in
++ some day.
++
++2004-01-28 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced_interfaces.xml:
++ Docs for mixer interface. Also a check for website uploading.
++
++2004-01-28 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/HACKING:
++ * docs/Makefile.am:
++ * docs/faq/Makefile.am:
++ * docs/gst/Makefile.am:
++ * docs/gst/tmpl/gstelement.sgml:
++ * docs/gst/tmpl/gstplugin.sgml:
++ * docs/gst/tmpl/gstreamer-unused.sgml:
++ * docs/libs/Makefile.am:
++ * docs/manual/Makefile.am:
++ * docs/manuals.mak:
++ * docs/pwg/Makefile.am:
++ * docs/upload.mak:
++ Separate out upload target and make it similar for
++ both docbook and gtk-doc docs
++
++2004-01-28 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/manuals.mak:
++ Fix upload target to work with freedesktop
++
++2004-01-28 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced_types.xml:
++ Add notes on creating your own types.
++ * docs/pwg/building_boiler.xml:
++ * docs/pwg/building_pads.xml:
++ * docs/pwg/building_state.xml:
++ Add some stuff about how to retrieve values from structures, how
++ that relates to types and change layout slightly again to be almost
++ perfect.
++
++2004-01-28 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced_dparams.xml:
++ * docs/pwg/advanced_scheduling.xml:
++ Change index layout slightly.
++
++2004-01-28 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced_clock.xml:
++ * docs/pwg/advanced_interfaces.xml:
++ * docs/pwg/advanced_midi.xml:
++ General placeholders for now.
++ * docs/pwg/advanced_request.xml:
++ Explanation about sometimes and request pads.
++ * docs/pwg/advanced_scheduling.xml:
++ Concept of bytestream, loopfunctions and schedulers.
++ * docs/pwg/building_boiler.xml:
++ Add something about plugin-init.
++
++2004-01-28 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/pwg/building_pads.xml:
++ Fix broken docbook
++
++2004-01-27 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced_interfaces.xml:
++ * docs/pwg/pwg.xml:
++ Add as a placeholder for future filling-in.
++ * docs/pwg/basics_autoplugging.xml:
++ * docs/pwg/basics_buffers.xml:
++ * docs/pwg/basics_elements.xml:
++ * docs/pwg/basics_events.xml:
++ * docs/pwg/basics_plugins.xml:
++ * docs/pwg/basics_types.xml:
++ Remove, because unused (this is all in intro_basics.xml).
++ * docs/pwg/building_signals.xml:
++ Short intro to signals + reference to GObject docs - we really
++ shouldn't go into these sort of things to deply because we don't
++ use them that extensively anyway.
++ * docs/pwg/building_state.xml:
++ Explanation of states. Benjamin, please check.
++ * docs/pwg/building_testapp.xml:
++ Put everything in one page - putting only a few lines of content
++ per page doesn't really make sense.
++
++ Time to get into the advanced topics. ;).
++
++2004-01-27 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced_types.xml:
++ Finish documenting the current state of mimetypes.
++ * docs/pwg/building_boiler.xml:
++ * docs/pwg/building_chainfn.xml:
++ * docs/pwg/building_pads.xml:
++ * docs/pwg/building_props.xml:
++ * docs/pwg/building_testapp.xml:
++ Start documenting the "how to build a simple audio filter" part
++ of the PWG. Most stuff is ready by now. Stuff remaining: signals,
++ states and (maybe?) a short introduction to capsnego in the chapter
++ on pads (building_pads.xml). Capsnego should probably be explained
++ fully in advanced_capsnego.xml or so.
++
++2004-01-26 David Schleef <ds@schleef.org>
++
++ * gst/gstpad.c: (gst_pad_try_set_caps_nonfixed):
++ * gst/gstpad.h: Add new function to allow element to (somewhat)
++ specify non-fixed caps on a pad.
++ * gst/gstqueue.c: (gst_queue_chain): Remove noisy g_object_notify()
++ that I added a few weeks ago.
++
++2004-01-26 David Schleef <ds@schleef.org>
++
++ * gst/gstpad.c: (gst_pad_try_set_caps): Revert last change
++ making try_set_caps() work with non-fixed caps.
++
++2004-01-26 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * docs/pwg/advanced_types.xml:
++ * docs/pwg/intro_basics.xml:
++ * docs/pwg/intro_preface.xml:
++ * docs/pwg/pwg.xml:
++ * docs/pwg/titlepage.xml:
++ First try to resurrect the PWG. I'm halfway integrating the mimetypes
++ in here (docs/random/mimetypes), and will from there on work on both
++ updating outdated parts and adding missing parts.
++ That doesn't mean I'll fix it completely, but I'll try at least. ;).
++
++2004-01-26 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gsterror.h: reinstate GST_LIBRARY_ERROR_ENCODE until
++ policy is set
++
++2004-01-26 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstelement.h:
++ remove gst_element_factory_get_version. It doesn't exist anymore.
++ * gst/gstplugin.c:
++ * gst/gstplugin.h:
++ remove gst_plugin_set_name and change gst_plugin_get_longname to
++ gst_plugin_get_description to match code.
++ * gst/gsterror.h:
++ remove GST_LIBRARY_ERROR_ENCODE. It's GST_STREAM_ERROR_ENCODE.
++ * gst/gstpad.c: (gst_pad_try_set_caps):
++ make it work with nonfixed caps.
++ Note that even in the nonfixed case the link function of the pad
++ that tries to set caps isn't called.
++
++2004-01-25 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/elements/gstbufferstore.c: (gst_buffer_store_get_buffer):
++ fix bug where buffer was not assembled correctly
++ * gst/elements/gsttee.c: (gst_tee_class_init), (gst_tee_init):
++ silence by default
++ * gst/elements/gsttypefind.c: (gst_type_find_element_chain):
++ only seek if there's no more buffers that could work without seeking
++
++2004-01-23 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gsttag.c: (_gst_tag_initialize):
++ * gst/gsttag.h:
++ Add application tag (for encoding/muxing app).
++
++2004-01-23 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * autogen.sh:
++ make autopoint force, and libtoolize not copy
++ * common/m4/as-docbook.m4:
++ added docbook xml catalog setup check
++ * common/m4/gst-doc.m4:
++ use docbook check
++
++2004-01-22 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gsttag.c: (_gst_tag_initialize), (gst_tag_register):
++ * gst/gsttag.h:
++ add GstTagFlag
++
++2004-01-20 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/gst.sgml:
++ * docs/gst/tmpl/gstbuffer.sgml:
++ * docs/gst/tmpl/gstclock.sgml:
++ * docs/gst/tmpl/gstelement.sgml:
++ * docs/gst/tmpl/gstreamer-unused.sgml:
++ * docs/gst/tmpl/gstxml.sgml:
++ sync latest API changes to docs
++
++2004-01-20 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstpluginfeature.c:
++ fix doc snippet
++ * tools/gst-inspect.c: (print_element_list):
++ fix output of typefind
++ add GPL header
++ * tools/gst-launch.c:
++ add GPL header
++
++2004-01-20 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/elements/Makefile.am:
++ * gst/elements/gstelements.c:
++ * gst/elements/gsttypefindelement.c:
++ * gst/elements/gsttypefindelement.h:
++ * po/POTFILES.in:
++ * po/fr.po:
++ * po/nl.po:
++ renamed gsttypefindelement to gsttypefind, conserving CVS history
++
++2004-01-20 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gsttag.c: (_gst_tag_initialize), (gst_tag_list_add_valist):
++ * gst/gsttag.h:
++ add some tags used in ogg as well
++ fix _ in replaygain tags
++
++2004-01-20 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gsterror.h:
++ fix wrong GST_LIBRARY_ERROR_ENCODE addition
++
++2004-01-20 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstelement.c: (gst_element_error_full):
++ * gst/gstelement.h:
++ change _extended to _full
++
++2004-01-20 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ reviewed by: <delete if not using a buddy>
++
++ * docs/gst/tmpl/gst.sgml:
++ * docs/gst/tmpl/gstbuffer.sgml:
++ * docs/gst/tmpl/gstclock.sgml:
++ * docs/gst/tmpl/gstelement.sgml:
++ * docs/gst/tmpl/gstreamer-unused.sgml:
++ * docs/gst/tmpl/gstxml.sgml:
++ * gst/gstelement.c: (gst_element_error_full):
++ * gst/gstelement.h:
++
++2004-01-20 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstelement.h: fix _gst_element_error_printf prototype
++
++2004-01-20 David Schleef <ds@schleef.org>
++
++ * gst/gststructure.c: (gst_structure_to_string):
++ Convert function to use gst_value_serialize().
++ * gst/gstvalue.c: (gst_value_serialize_list),
++ (gst_value_serialize_fourcc), (gst_value_serialize_int_range),
++ (gst_value_serialize_double_range), (gst_value_serialize_boolean),
++ (gst_value_serialize_int), (gst_value_serialize_double),
++ (gst_string_wrap), (gst_value_serialize_string),
++ (gst_value_serialize), (gst_value_deserialize):
++ * gst/gstvalue.h:
++ Add implementations for serialize.
++
++2004-01-20 Julien MOUTTE <julien@moutte.net>
++
++ * gst/gsterror.h: xvidenc.c needs GST_LIBRARY_ERROR_ENCODE. Dunno if
++ we want to keep that one in the future or change xvidenc.c to use
++ another error.
++
++2004-01-19 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstelement.c: (_gst_element_error_printf):
++ * gst/gstelement.h:
++ privatise function
++
++2004-01-19 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/random/error:
++ doc explaining error system
++ * gst/elements/gstfilesrc.c: (gst_filesrc_open_file):
++ cleanup
++
++2004-01-19 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gst-i18n-app.h:
++ * gst/gst-i18n-lib.h:
++ remove inclusion of config.h
++ * po/POTFILES.in:
++ * po/nl.po:
++ add gst/gstelement.c
++
++2004-01-19 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * po/nl.po: updated Dutch translation
++
++2004-01-19 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gsterror.c: (_gst_core_errors_init),
++ (_gst_library_errors_init), (_gst_resource_errors_init),
++ (_gst_stream_errors_init):
++ remove ending punctuation dots
++
++2004-01-19 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/elements/gstfilesink.c: (gst_filesink_open_file):
++ * gst/elements/gstfilesrc.c: (gst_filesrc_get_read):
++ * gst/elements/gstmultidisksrc.c: (gst_multidisksrc_open_file):
++ * gst/elements/gstpipefilter.c: (gst_pipefilter_get),
++ (gst_pipefilter_chain), (gst_pipefilter_open_file):
++ use GST_ERROR_SYSTEM
++
++2004-01-19 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstelement.c: (gst_element_error_printf),
++ (gst_element_error_extended):
++ * gst/gstelement.h:
++ add a helper printf function so we can have NULL values passed.
++
++2004-01-19 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstelement.h:
++ add G_STMT macros to gst_element_error, which isn't strictly
++ necessary but people tell me to anyway.
++
++2004-01-18 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/Makefile.am:
++ * gst/autoplug/gstspideridentity.c:
++ (gst_spider_identity_sink_loop_type_finding):
++ * gst/elements/gstfakesink.c: (gst_fakesink_change_state):
++ * gst/elements/gstfilesink.c: (gst_filesink_open_file),
++ (gst_filesink_close_file), (gst_filesink_handle_event),
++ (gst_filesink_chain):
++ * gst/elements/gstfilesrc.c: (gst_filesrc_set_property),
++ (gst_filesrc_map_region), (gst_filesrc_get_read),
++ (gst_filesrc_open_file):
++ * gst/elements/gstidentity.c: (gst_identity_chain):
++ * gst/elements/gstmultidisksrc.c: (gst_multidisksrc_open_file):
++ * gst/elements/gstpipefilter.c: (gst_pipefilter_get),
++ (gst_pipefilter_chain), (gst_pipefilter_open_file):
++ * gst/elements/gsttypefindelement.c: (gst_type_find_element_chain):
++ * gst/gst.h:
++ * gst/gst_private.h:
++ * gst/gstelement.c: (gst_element_class_init),
++ (gst_element_default_error), (gst_element_error_func),
++ (gst_element_error_extended):
++ * gst/gstelement.h:
++ * gst/gsterror.c: (_gst_core_errors_init),
++ (_gst_library_errors_init), (_gst_resource_errors_init),
++ (_gst_stream_errors_init), (gst_error_get_message):
++ * gst/gsterror.h:
++ * gst/gstinfo.c: (_gst_debug_init):
++ * gst/gstmarshal.list:
++ * gst/gstpad.c: (gst_pad_set_explicit_caps),
++ (gst_pad_recover_caps_error), (gst_pad_pull):
++ * gst/gstqueue.c: (gst_queue_chain), (gst_queue_get):
++ * gst/schedulers/gstbasicscheduler.c:
++ (gst_basic_scheduler_chainhandler_proxy),
++ (gst_basic_scheduler_gethandler_proxy),
++ (gst_basic_scheduler_cothreaded_chain):
++ * po/POTFILES.in:
++ * po/fr.po:
++ * po/nl.po:
++ change error signal
++ add error categories
++
++2004-01-18 Jeremy Simon <jesimon@libertysurf.fr>
++
++ * gst/gsttag.c: (_gst_tag_initialize):
++ * gst/gsttag.h:
++ Add replaygain tag
++
++2004-01-18 Colin Walters <walters@verbum.org>
++
++ * examples/retag/retag.c: Call gst_init before processing
++ program args. Add g_assert to _link_many call.
++
++2004-01-16 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstpad.c: (gst_pad_alloc_buffer):
++ Return a newly allocated buffer when the pad has no peer.
++
++2004-01-16 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstclock.c: (gst_clock_get_time):
++ make it compile with gcc 2.95 again.
++ Patch by Scott Wheeler
++
++2004-01-15 David Schleef <ds@schleef.org>
++
++ * gst/gstcaps.h:
++ Added gst_caps_is_simple() macro.
++ * testsuite/caps/caps.c: (test1):
++ * testsuite/caps/intersect2.c: (main):
++ * testsuite/caps/intersection.c: (main):
++ Fixes to make 'make check' work again after removing
++ gst_caps_is_chained().
++
++2004-01-15 Leif Johnson <leif@ambient.2y.net>
++
++ * docs/random/uraeus/gstreamer_and_midi.txt: Rather large edits
++ and additions to the MIDI document.
++
++2004-01-15 David Schleef <ds@schleef.org>
++
++ * gst/gstelement.c: (gst_element_get_compatible_pad_filtered),
++ (gst_element_link_pads_filtered): Use GST_PAD_ macros instead
++ of GST_RPAD_, since we don't know if it's a real or ghost pad.
++
++2004-01-15 David Schleef <ds@schleef.org>
++
++ * gst/gstqueue.c:
++ * gst/gstqueue.h:
++ Fix the spelling of "treshold" and make min_threshold actually
++ affect the queue.
++
++2004-01-15 David Schleef <ds@schleef.org>
++
++ * gst/gstcaps.c:
++ Add lots of documentation.
++ * gst/gstcaps.h:
++ Deprecate a few functions.
++ * gst/gstpad.c:
++ Removed use of deprecated functions.
++
++2004-01-15 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstpad.c: (gst_pad_is_linked):
++ * gst/gstpad.h:
++ implement gst_pad_is_linked
++ * gst/gstelement.h:
++ reserve space for initiate_state_change
++
++2004-01-15 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/autoplug/gstspideridentity.c:
++ (gst_spider_identity_sink_loop_type_finding):
++ break infinite loop by just returning instead of looping
++ * gst/gstclock.c: (gst_clock_class_init), (gst_clock_set_property):
++ set event time difference correctly. Set it to 1 second instead
++ of 100ms to be more tolerant
++ * gst/gstelement.c: (gst_element_set_time):
++ add debugging output
++
++2004-01-14 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstqueue.c: (gst_queue_getcaps), (gst_queue_link):
++ query if buffers are inside the pool, ignore events
++
++2004-01-13 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstclock.c: (gst_clock_class_init), (gst_clock_init),
++ (gst_clock_set_speed), (gst_clock_set_active),
++ (gst_clock_is_active), (gst_clock_reset),
++ (gst_clock_handle_discont):
++ * gst/gstclock.h:
++ deprecate old interface and disable functions that aren't in use
++ anymore.
++ * gst/gstelement.h:
++ * gst/gstelement.c: (gst_element_get_time), (gst_element_wait),
++ (gst_element_set_time), (gst_element_adjust_time):
++ add concept of "element time" and functions to get/set this time.
++ * gst/gstelement.c: (gst_element_change_state):
++ update element time correctly.
++ * gst/gstelement.c: (gst_element_get_compatible_pad_filtered):
++ This is a debug message, not a g_critical.
++ * gst/gstpad.c: (gst_pad_event_default):
++ handle discontinuous events right with element time.
++ * gst/gstscheduler.c: (gst_scheduler_state_transition):
++ update to clocking fixes.
++ set clocks on elements in READY=>PAUSED. The old behaviour caused
++ a wrong element time on the first element that started playing.
++ * gst/schedulers/gstbasicscheduler.c:
++ (gst_basic_scheduler_class_init):
++ * gst/schedulers/gstoptimalscheduler.c:
++ (gst_opt_scheduler_class_init):
++ remove code that just implements the default behaviour.
++ * gst/elements/gstfakesink.c: (gst_fakesink_chain):
++ update to use new clocking functions
++ * testsuite/clock/clock1.c: (gst_clock_debug), (main):
++ * testsuite/clock/clock2.c: (gst_clock_debug), (main):
++ update to test new element time.
++ * gst/autoplug/gstspideridentity.c: (gst_spider_identity_getcaps):
++ use _get_allowed_caps instead of _get_caps. This catches filtered
++ caps correctly.
++ * testsuite/debug/commandline.c:
++ update for new GST_DEBUG syntax.
++ * testsuite/threads/Makefile.am:
++ disable a test that only works sometimes.
++
++2004-01-13 Julien MOUTTE <julien@moutte.net>
++
++ * po/LINGUAS: Adding fr.
++ * po/fr.po: Adding french translation.
++
++2004-01-13 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/parse/grammar.y:
++ * po/POTFILES.in:
++ * po/nl.po:
++ * tools/gst-launch.c: (xmllaunch_parse_cmdline), (main):
++ translate parsing error messages
++
++2004-01-13 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * po/POTFILES.in: adding gst-launch
++ * po/nl.po: updated translation, all 99 strings translated
++ * tools/gst-launch.c: (idle_func), (xmllaunch_parse_cmdline),
++ (found_tag), (sigint_handler_sighandler), (play_handler), (main):
++ fix strings for translation
++
++2004-01-13 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gst.c:
++ - capitalize beginnings of popt options
++ - fix strings for translation
++ - change gst-debug format from =N1=V1:N2=V2 to =N1:V1,N2:V2
++
++2004-01-13 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * po/README: add some notes on how to update translations
++
++2004-01-13 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * ABOUT-NLS: removed, is autogenerated from autopoint
++ * autogen.sh: add autopoint stuff
++ * configure.ac: fix up gettext stuff
++ * gst/Makefile.am: add i18n headers to noinst_HEADERS
++ * gst/elements/gsttypefindelement.c: add header include
++ * gst/gettext.h: add header, copy from system-installed header
++ * gst/gst-i18n-app.h: to be included by each app having translations
++ * gst/gst-i18n-lib.h: to be included by each lib having translations
++ * gst/gst.c: (init_pre): fix up gettext calls
++ * gst/gst_private.h: remove i18n stuff, moving to separate headers
++ * po/LINGUAS: the new way to specify translations present
++ * po/Makefile.in.in: removed from cvs, autogenerated from autopoint
++ * po/Makevars: the variables filled in for GStreamer
++ * po/POTFILES.in: added new files with translations
++ * po/de.po: has new strings
++ * po/nl.po: readded, has new strings
++
++2004-01-13 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gsttag.c: fix some strings marked for translation
++
++2004-01-13 Iain <iain@prettypeople.org>
++
++ * gst/schedulers/gstoptimalscheduler.c (add_to_group): Reference the
++ group when we add an element to it, cos we unref it when we remove one
++
++2004-01-12 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * testsuite/debug/commandline.c: (debug_not_reached):
++ * testsuite/debug/output.c: (check_message):
++ fix testsuite
++
++2004-01-12 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * examples/cutter/.cvsignore:
++ * examples/helloworld/.cvsignore:
++ * examples/launch/.cvsignore:
++ * examples/manual/.cvsignore:
++ * examples/mixer/.cvsignore:
++ * examples/pingpong/.cvsignore:
++ * examples/plugins/.cvsignore:
++ * examples/queue/.cvsignore:
++ * examples/queue2/.cvsignore:
++ * examples/queue3/.cvsignore:
++ * examples/queue4/.cvsignore:
++ * examples/retag/.cvsignore:
++ * examples/thread/.cvsignore:
++ * examples/typefind/.cvsignore:
++ * examples/xml/.cvsignore:
++ * gst/.cvsignore:
++ * gst/autoplug/.cvsignore:
++ * gst/elements/.cvsignore:
++ * gst/indexers/.cvsignore:
++ * gst/parse/.cvsignore:
++ * gst/registries/.cvsignore:
++ * gst/schedulers/.cvsignore:
++ * libs/gst/bytestream/.cvsignore:
++ * libs/gst/control/.cvsignore:
++ * libs/gst/getbits/.cvsignore:
++ * tests/.cvsignore:
++ * tests/bufspeed/.cvsignore:
++ * tests/instantiate/.cvsignore:
++ * tests/memchunk/.cvsignore:
++ * tests/muxing/.cvsignore:
++ * tests/sched/.cvsignore:
++ * tests/seeking/.cvsignore:
++ * tests/threadstate/.cvsignore:
++ * testsuite/.cvsignore:
++ * testsuite/caps/.cvsignore:
++ * testsuite/cleanup/.cvsignore:
++ * testsuite/dynparams/.cvsignore:
++ * testsuite/plugin/.cvsignore:
++ * tools/.cvsignore:
++ update - this is huge, because it includes *.bb, *.bbg and *.da files
++ which are generated for gcov.
++
++2004-01-11 David Schleef <ds@schleef.org>
++
++ * gst/gststructure.c: (gst_strtoi), (gst_value_from_string): Add
++ a function to parse integers in ways that strto[u]l() does not.
++
++2004-01-11 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * tools/gst-inspect.c: (print_caps):
++ improve output of caps a bit
++
++2004-01-11 David Schleef <ds@schleef.org>
++
++ * gst/gstbuffer.c: (gst_buffer_create_sub): Subbuffers should
++ inherit correct flags (READONLY and DONTKEEP).
++
++2004-01-11 David Schleef <ds@schleef.org>
++
++ * gst/elements/gstfilesrc.c: (gst_filesrc_free_parent_mmap),
++ (gst_filesrc_map_region):
++ * gst/gstbuffer.c: (_gst_buffer_initialize),
++ (_gst_buffer_sub_free), (gst_buffer_default_copy),
++ (gst_buffer_new), (gst_buffer_create_sub),
++ (gst_buffer_is_span_fast), (gst_buffer_span):
++ * gst/gstbuffer.h:
++ Change GstBuffer private structure element names. (all files)
++ * gst/gstqueue.c: (gst_queue_init), (gst_queue_getcaps),
++ (gst_queue_link):
++ * gst/gstqueue.h:
++ Implement getcaps/pad_link functions that handle the case where
++ there are data in the queue.
++
++2004-01-11 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/elements/gstbufferstore.c:
++ initialize debugging structure correctly
++ * gst/elements/gsttee.c: (gst_tee_set_property):
++ g_object_notify when property was changed
++ * gst/elements/gsttypefindelement.c:
++ (gst_type_find_element_change_state):
++ clear caps correctly
++
++2004-01-11 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstqueue.c: (gst_queue_init):
++ Use better defaults for when a queue should block. This
++ gets rid of jerky playback for quite a few files.
++ It takes more memory.
++
++2004-01-10 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ (gst_xml_registry_parse_padtemplate):
++ make critical message slightly more useful
++
++2004-01-10 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstinfo.c: (gst_debug_log), (gst_debug_log_valist),
++ (gst_debug_message_get), (gst_debug_log_default):
++ * gst/gstinfo.h:
++ Change gst_debug_log(_valist) to take a const format string.
++ Change prototype of log function and functions using those to
++ take a GstDebugMessage instead of a string that requires using
++ gst_debug_message_get.
++
++2004-01-08 David Schleef <ds@schleef.org>
++
++ * Makefile.am:
++ * configure.ac:
++ Add option --enable-gcov to build GStreamer with -fprofile-arcs
++ and -ftest-coverage, which allows gcov to show information about
++ testsuite coverage.
++
++2004-01-08 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstutils.h:
++ Add GST_BOILERPLATE(_FULL), GST_PARENT_CALL and
++ GST_PARENT_CALL_WITH_DEFAULT
++ * gst/elements/gstaggregator.c:
++ * gst/elements/gstbufferstore.c:
++ * gst/elements/gstfakesink.c:
++ * gst/elements/gstfakesrc.c:
++ * gst/elements/gstfdsink.c:
++ * gst/elements/gstfdsrc.c:
++ * gst/elements/gstfilesink.c:
++ * gst/elements/gstfilesrc.c:
++ * gst/elements/gstidentity.c:
++ * gst/elements/gstmd5sink.c:
++ * gst/elements/gstmultidisksrc.c:
++ * gst/elements/gstpipefilter.c:
++ * gst/elements/gstshaper.c:
++ * gst/elements/gststatistics.c:
++ * gst/elements/gsttee.c:
++ * gst/elements/gsttypefindelement.c:
++ use them.
++
++2004-01-07 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/gstreamer-docs.sgml: remove props
++ * docs/gst/gstreamer-sections.txt: remove props
++ * docs/gst/tmpl/gst.sgml:
++ * docs/gst/tmpl/gstbin.sgml:
++ * docs/gst/tmpl/gstbuffer.sgml:
++ * docs/gst/tmpl/gstcaps.sgml:
++ * docs/gst/tmpl/gstclock.sgml:
++ * docs/gst/tmpl/gstelement.sgml:
++ * docs/gst/tmpl/gstindex.sgml:
++ * docs/gst/tmpl/gstobject.sgml:
++ * docs/gst/tmpl/gstpad.sgml:
++ * docs/gst/tmpl/gstpadtemplate.sgml:
++ * docs/gst/tmpl/gstreamer-unused.sgml:
++ * docs/gst/tmpl/gstthread.sgml:
++ * docs/gst/tmpl/gstxml.sgml:
++ sync with code reorganization
++
++2004-01-07 Jan Schmidt <thaytan@mad.scientist.com>
++
++ * gst/gstelement.c: (gst_element_get_compatible_pad_filtered):
++ Make the 'Could not find compatible pad' message more informative.
++
++2004-01-07 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/elements/gstfilesink.c: (gst_filesink_set_location):
++ Fix for if we pass NULL as property to location.
++ * gst/elements/gstpipefilter.c: (gst_pipefilter_init),
++ (gst_pipefilter_handle_event), (gst_pipefilter_chain):
++ Fix for instantiate-test (see below).
++ * gst/gststructure.c: (_gst_structure_parse_value):
++ Fix compile error on gcc-2.96.
++ * configure.ac:
++ * tests/Makefile.am:
++ * tests/instantiate/Makefile.am:
++ * tests/instantiate/create.c: (create_all_elements), (main):
++ Add a test that instantiates all elements. This makes it easy to
++ track dead code for old API/design (like setting event functions
++ on sink pads and so on).
++
++2004-01-06 Jan Schmidt <thaytan@mad.scientist.com>
++
++ * gst/gstcaps.c: (gst_caps_append_structure):
++ Move the poisoning to allow a NULL structure
++ * gst/gstevent.c: (_gst_event_free):
++ When freeing a navigation event, free the structure
++ also
++
++2004-01-04 David Schleef <ds@schleef.org>
++
++ * gst/elements/gsttee.c: (gst_tee_init), (gst_tee_request_new_pad):
++ Remove usage of gst_pad_proxy_fixate.
++ * gst/gstcaps.c: (gst_caps_append), (gst_caps_append_structure),
++ (gst_caps_split_one), (gst_caps_replace):
++ Add poisoning code.
++ * gst/gstmarshal.list:
++ Add pointer__pointer for fixate signal
++ * gst/gstpad.c: (gst_real_pad_class_init),
++ (_gst_real_pad_fixate_accumulator), (gst_pad_link_fixate),
++ (_gst_pad_default_fixate_func), (gst_pad_proxy_fixate),
++ (gst_pad_set_explicit_caps), (gst_pad_template_new):
++ Add poisoning code. Add fixate signal on RealPad. Change
++ set_explicit_caps() to take const GstCaps, like try_set_caps().
++ * gst/gstpad.h:
++ * testsuite/caps/Makefile.am:
++ * testsuite/caps/app_fixate.c: Add a test for the fixate signal
++
++2004-01-03 David Schleef <ds@schleef.org>
++
++ * gst/elements/gsttypefindelement.c:
++ (gst_type_find_element_have_type), (gst_type_find_element_init):
++ Use gst_pad_use_explicit_caps for src pad.
++ * gst/gstpad.c: (gst_pad_try_set_caps): Check that link exists
++ before using it.
++
++2004-01-03 David Schleef <ds@schleef.org>
++
++ * gst/gstelement.c: (gst_element_link_pads_filtered),
++ (gst_element_negotiate_pads): Fix to allow DELAYED to indicate
++ that linking was successful.
++ * gst/gstpad.c: (gst_pad_link_free),
++ (gst_pad_link_call_link_functions), (gst_pad_link_negotiate),
++ (gst_pad_link_try), (gst_pad_link_unnegotiate),
++ (gst_pad_unnegotiate), (gst_pad_set_explicit_caps): Pass
++ GstPadLinkReturn correctly between functions, and don't fail
++ when DELAYED is used (DELAYED is very important). Better
++ cleanup on unlinking and unnegotiation. Should fix some spider
++ bugs.
++
++2004-01-02 David Schleef <ds@schleef.org>
++
++ * gst/gstelement.c: (gst_element_class_init),
++ (gst_element_base_class_init): ->padtemplates should be cleared
++ in base_init, since we need to have a fresh list for every
++ class. (Alternately, we chould copy the list and share the
++ actual pad templates (not the list), but that would require
++ changing every plugin to move pad template registration from
++ base_init to class_init.)
++
++2004-01-03 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstelement.c: (gst_element_class_add_pad_template):
++ Refuse registering a pad template if another pad template
++ with the same name already exists (#114715).
++
++2004-01-02 David Schleef <ds@schleef.org>
++
++ * gst/gstcaps.c: (_gst_structure_is_equal_foreach),
++ (gst_caps_is_equal_fixed): Add new function.
++ * gst/gstcaps.h: ditto.
++ * gst/gstpad.c: (gst_real_pad_class_init),
++ (gst_pad_link_call_link_functions), (gst_pad_try_set_caps),
++ (gst_pad_set_explicit_caps), (gst_pad_get_caps): In try_set_caps,
++ check new caps against existing caps -- if they're the same, return
++ OK without renegotiating. caps-nego-failed signal fixed so that
++ the marshaller isn't VOID__OBJECT. Also changed to G_TYPE_POINTER
++ to save an extra caps copy. Don't complete negotiation if a pad
++ link function returns DELAYED.
++
++2004-01-02 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstpad.c: (gst_pad_try_relink_filtered):
++ Fix wrong g_return_if_fail
++
++2004-01-03 Jan Schmidt <thaytan@mad.scientist.com>
++
++ * gst/gstbin.c: (gst_bin_class_init):
++ Change the marshalling of element_added/element_removed
++ to use gst_marshal_VOID__OBJECT, since gst_marshal_VOID__POINTER
++ complains that GST_TYPE_ELEMENT is not G_TYPE_POINTER
++
++2004-01-01 David Schleef <ds@schleef.org>
++
++ * gst/gstpad.c: (gst_pad_set_explicit_caps),
++ (gst_pad_explicit_getcaps), (gst_pad_explicit_link),
++ (gst_pad_use_explicit_caps):
++ * gst/gstpad.h:
++ Add new functions. gst_pad_use_explicit_caps() sets up a pad
++ to use an internal getcaps and link fuction so that negotiation
++ always results in the explicitly set caps.
++ gst_pad_set_explicit_caps() sets the explicit caps. These functions
++ are particularly useful for decoders.
++
++2003-12-31 David Schleef <ds@schleef.org>
++
++ * gst/elements/gstidentity.c: (gst_identity_class_init),
++ (gst_identity_init), (gst_identity_chain),
++ (gst_identity_set_property), (gst_identity_get_property):
++ * gst/elements/gstidentity.h:
++ * gst/gstqueue.c: (gst_queue_init):
++ Negotiation fixes.
++
++2003-12-31 David Schleef <ds@schleef.org>
++
++ * gst/gstcaps.c: (gst_caps_intersect),
++ (_gst_caps_normalize_foreach), (gst_caps_normalize):
++ Implement gst_caps_normalize().
++ * testsuite/caps/normalisation.c: (main):
++ Add an additional test
++
++2003-12-31 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstqueue.c: (gst_queue_init):
++ use gst_pad_proxy_getcaps()
++
++2003-12-31 David Schleef <ds@schleef.org>
++
++ * gst/elements/gstshaper.c: (gst_shaper_link):
++ * gst/elements/gsttee.c: (gst_tee_init), (gst_tee_request_new_pad):
++ * gst/gstqueue.c: (gst_queue_link):
++ Negotiation fixes.
++
++2003-12-31 David Schleef <ds@schleef.org>
++
++ * gst/gstpad.c: (gst_pad_proxy_pad_link), (gst_pad_proxy_fixate):
++ * gst/gstpad.h: Add functions that are useful as default pad
++ link and fixate functions for elements.
++
++2003-12-30 David Schleef <ds@schleef.org>
++
++ * gst/gstpad.c: (gst_pad_link_try):
++ Fix segfault when attempting to return to old caps
++
++2003-12-29 David Schleef <ds@schleef.org>
++
++ * gst/gstcaps.c: (gst_caps_normalize), (simplify_foreach),
++ (gst_caps_structure_simplify), (gst_caps_simplify):
++ * gst/gstcaps.h:
++ Add simplify function
++ * gst/gstpad.c: (gst_pad_link_try), (gst_pad_try_set_caps),
++ (gst_pad_perform_negotiate), (gst_pad_is_negotiated):
++ * gst/gstpad.h:
++ Copy over srcnotify, sinknotify when calling old pad_link
++ functions. Add new is_negotiated() function.
++ * gst/gststructure.c: (gst_structure_copy):
++ Fix an incredibly stupid bug that should have been noticed
++ weeks ago. _copy() returned the argument, not the new copy.
++
++2003-12-27 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/gstcaps.c: (gst_caps_append):
++ add sanity checks
++ * gst/gstcaps.h: (gst_caps_debug):
++ remove, it doesn't exist anymore.
++ * gst/gstelement.c: (gst_element_threadsafe_properties_pre_run),
++ (gst_element_threadsafe_properties_post_run):
++ make debugging messages not clutter up THREAD debug category
++ (gst_element_negotiate_pads), (gst_element_clear_pad_caps),
++ (gst_element_change_state):
++ update to new caps API
++ * gst/gstinterface.c: (gst_implements_interface_cast):
++ don't put vital code in g_return_if_fail
++ * gst/gstpad.c: (gst_pad_link_try), (gst_pad_try_set_caps),
++ (gst_pad_link_filtered):
++ add pst_pad_try_link and use it.
++ (gst_pad_perform_negotiate), (gst_pad_renegotiate):
++ implement correctly, deprecate first one.
++ (gst_pad_link_unnegotiate), (gst_pad_unnegotiate):
++ add and implement.
++ (gst_pad_try_relink_filtered), (gst_pad_relink_filtered):
++ implement.
++ (gst_pad_get_negotiated_caps):
++ add and implement. Make GST_PAD_CAPS call this function.
++ (gst_pad_get_caps):
++ remove unneeded check..
++ (gst_pad_recover_caps_error):
++ disable, always return FALSE.
++ (gst_real_pad_dispose):
++ don't free caps and appfilter anymore, they're unused.
++ * gst/gstpad.h:
++ Reflect changes mentioned above.
++ * gst/gstsystemclock.c: (gst_system_clock_wait):
++ Make 'clock is way behind' a debugging message.
++ * gst/gstthread.c: (gst_thread_change_state):
++ Fix debugging message
++
++2003-12-25 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstinfo.h:
++ fix GST_DEBUG_CATEGORY_INIT gtk-doc description
++ * docs/gst/tmpl/gstreamer-unused.sgml:
++ removed all traces of cvs conflicts
++
++2003-12-24 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac:
++ * gst/schedulers/cothreads_compat.h:
++ * libs/Makefile.am:
++ remove last instances of wingo cothread usage
++
++2003-12-24 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstplugin.c:
++ * gst/gstversion.h.in:
++ * gst/parse/grammar.y:
++ change comment block from /** to /* when not gtk-doc comments
++
++2003-12-24 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gst.c: whitespace and doc style fixes
++
++2003-12-24 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gstformat.h: remove trailing whitespace from enum for gtk-doc
++
++2003-12-24 Colin Walters <walters@verbum.org>
++
++ * gst/elements/gsttypefindelement.c:
++ gst/elements/gsttypefindelement.h: Make GstCaps parameter const.
++ Copy caps parameter. Use _POINTER to marshal caps instead of _BOXED.
++ Don't double-free caps.
++
++2003-12-23 David Schleef <ds@schleef.org>
++
++ * gst/gstelement.c, gst/gstpad.c, gst/parse/grammar.y,
++ gst/gstcaps.c, gst/autoplug/gstspideridentity.c:
++ Many little fixes and additions of debug statements to
++ get rhythmbox working.
++
++2003-12-23 Colin Walters <walters@verbum.org>
++
++ * gst/autoplug/gstspideridentity.c (gst_spider_identity_sink_loop_type_finding):
++ Use GST_PAD_LINK_SUCCESSFUL.
++
++2003-12-23 David Schleef <ds@schleef.org>
++
++ * gst/elements/gstaggregator.c:
++ * gst/elements/gsttee.c:
++ Use gst_pad_proxy_getcaps().
++ * gst/gstpad.c:
++ * gst/gstpad.h:
++ Add gst_pad_proxy_getcaps(), which filter elements can use
++ as a generic getcaps implementation.
++ Fix gst_pad_get_allowed_caps(). It just wasn't doing what
++ was advertised.
++
++2003-12-23 David Schleef <ds@schleef.org>
++
++ * gst/gstpad.c:
++ Rearrange/rewrite much of the pad negotiation code, since it
++ resembled pasta. This actually changes the way some
++ negotiation works, since the previous code was inconsistent
++ depending on how it was invoked. Add (internal) structure
++ GstPadLink, which is used to hold some information (more in
++ the future) about the link between two pads. Fixes a number
++ of bugs, including random lossage of filter caps when the
++ initial negotiation is delayed. A few functions are still
++ unimplemented.
++ * gst/gstpad.h:
++ Add GST_PAD_LINK_{SUCESSFUL|FAILED}() macros. Please use
++ these when testing GstPadLinkReturn values instead of comparing
++ directly.
++
++2003-12-23 David Schleef <ds@schleef.org>
++
++ * gst/gstvalue.c:
++ * gst/gstvalue.h:
++ Rearrange lots of code. Change registration of compare function
++ into registration of compare/serialize/deserialize functions.
++ Doesn't include implementation of gst_value_[de]serialize(),
++ but that should be easy.
++
++2003-12-23 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * docs/gst/gstreamer-sections.txt:
++ * docs/gst/tmpl/gstprops.sgml: removed
++ * docs/gst/tmpl/gstreamer-bufferpool.sgml: removed
++ David removed props and caps code, so let's remove their docs as well.
++ Removed all no longer existing symbols from gstreamer-sections.txt
++
++2003-12-22 Colin Walters <walters@verbum.org>
++
++ * gst/gsttaginterface.c, gst/gsttaginterface.h,
++ gst/gsttag.c, gst/gsttag.h: Add interface to setting GValues
++ of tags directly.
++
++2003-12-22 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/elements/gstelements.c:
++ Set ranks of elements to NONE, so the autoplugger doesn't use them.
++ * gst/elements/gstshaper.c: (gst_shaper_getcaps):
++ Fix proxying to new CAPS stuff. Don't call get_allowed_caps but
++ gst_caps (peer).
++
++2003-12-22 Benjamin Otte <in7y118@public.uni-hamburg.de>
++
++ * gst/autoplug/gstsearchfuncs.c: (gst_autoplug_caps_intersect):
++ * gst/autoplug/gstspideridentity.c: (gst_spider_identity_link),
++ (gst_spider_identity_getcaps), (gst_spider_identity_change_state),
++ (gst_spider_identity_sink_loop_type_finding):
++ * gst/autoplug/gstspideridentity.h:
++ Fix autoplugging in spider element, so it works with new caps.
++ This was mainly caused by identifying empty caps incorrectly.
++
++2003-12-22 David Schleef <ds@schleef.org>
++
++ * gststructure.c, gstvalue.c, gstvalue.h: Add
++ gst_value_init_and_copy() and use it, to avoid silly mistakes in
++ using g_value_copy()
++
++2003-12-21 David Schleef <ds@schleef.org>
++
++ * many, many files: Merge CAPS branch. This includes:
++ - implemention of GstValue and several GstValue types
++ - implemention of GstStructure
++ - entire rewrite of GstCaps
++ - removal of GstProps
++ - many changes to GstPad to compensate for new caps paradigm
++ - removal of GstBufferpool
++ * gst/Makefile.am, gst/gst.h, gst/gstpad.h, gst/gsttypefind.h,
++ gstvalue.h, gst/gstcaps[2]*.[ch]:
++ - rename gstcaps2.[ch] to gstcaps.[ch]
++
++2003-12-21 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * gst/gstqueue.c: (gst_queue_handle_pending_events),
++ (gst_queue_chain), (gst_queue_handle_src_event):
++ implement timeout for sending events. Workaround for if the
++ pipeline on this queue is not passing any data.
++
++2003-12-21 Ronald Bultje <rbultje@ronald.bitfreak.net>
++
++ * ChangeLog: moved to gstreamer/docs/random/old/ChangeLog.gstreamer
++ * moved CVS to freedesktop.org
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/classes.dia gstreamer-0.10.23/docs/random/classes.dia
+--- gstreamer-0.10.23.orig/docs/random/classes.dia 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/classes.dia 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,21 @@
++\1f\8b\b\0\0\0\0\0\0\ 3í]]sÛÆ\92}ϯP)¯ôh¾\81¹¼Î|ú%Ùxor«ö\8d\ 5\91\10\855\b°\0жò°¿}\a$mE\12\ 1\82\ 4\ 6\14È\93ªÄ±4D³É\9eÓ\1fÓ}æ\9fÿú¼\88¯>\86Y\1e¥ÉÛkFèõ¿¾ûæ\9f³(ø\87ýw\9e\ 5\8b+» ÉË¿½½¾/\8aå?nn>}úDâ\87<(Ò\8cÄÑ\8aäáÍÿ\ 5q\1cÜØE7×ß}suõ÷\aÌ\82"(\7f¶ýiP\14Yt»*«$X\84o¯o\83é\87y\96®\92ÙõfÕvÝ4\8dÓìêc\10¿½þönýÏõÍö17O\9eSóìe°\f³ç\8f],Ó<²K\8a\87å\8b%\15Ï)ÿû·5ÛU¹]\94Ì¿ûö{ùíæ-m\7fðø¬]o´RH±\b²y\94¼\94\93\85A¼ù 8ñ9ç_>\87ÃEܺ\17\11»\17\91¹\17\11å\93e\9a\15Y\10\15/Åܦi\1c\ 6ÉFR\91ÂãåäÓ ¶&S§
++;þéwQQ¤{Þÿ]\10çM\14Øüøëî9t'γhV¿\11\9f¬¨xʧhVÜO>;ú¸6O\7fpôô\8fQ\1eÝÆá®w\1f%Eg\8f\7fhùø¶ßó*\9a\85ù\9eoúé\9a\8a'Ýo\97ÝìSüùº¦\1al~ôÌIEÄÁC\98m\1fÿã{ºÚ~ÆÛMÿ·O!½ýßpZlÕûÏo¿^½¹ú1\ eòüúѳÒë«hööúwúô³y®\8d}\92E\9e\17\1fÎ2ýú%RB\99¢\9eñFo$1\9eö\9ekþò+\12t{û\NfÕ\b\92y\1cnd½±Â\844\9c\8aÑ\eE(×Þ\98)"©a#M¤'Äq²Ã8\L¦i\96¼ô¼Ý+º\16¶ÞÚ/\95ýº\15\11R¶xþ}\18Íï\8b\1a\ 1\8c\1cùøg¡Ç\93Àã]^¼\8fWÖ\15î\8c?\ e\91\92\17a\16¦¥ýî\96uÔ[\ fní\8b\83é\8b\8f¥Îÿ\1cô¦WËe\16æùäë/rç¢R\e-\ 6\85ÝÑÎD}\ 1ò\86J=\8d?\8e\11ÔP¥ã\ 5Ý¥Y¸\81ÐÉ:¨\7f.æï\91>]ÿs\9c\9cÇLb¿\9c§\19Å\81v]ùÍ<÷t«EüuñK¿¼7Ëx¶ÝËßWd\1a5ÑBU¶ñt¯¿\10öÇúÏÎÄÙO}U#ï¦Õ³KC\8eâ¨xØ% LV\8b\1dáÏábvÀYÃ\90úpYÓ2z\98äÓt÷\97t´¸\9d±QOæ\e§É\1c&\f\13\1e° ßEq\b\13\86 \ fÙ\84à XÙP¶7\13~÷k\94\17°`XpW\16¼Hg«¸?\b~÷[·ò`Á¯Ù\82\ f*¡U&Î;6À×Åí7@0\9bM\96AqßÓ\16èÅ"éyZäóÓ¡Ã¥-\83ÌþY\84Y¾KØ\ eCûú\82gë\9b\eÛ¡Qè\1eµ\ e1»\17¢;\17º\v~ë\fþX9\1f¢dV%¦Òì÷
++«ô»]úê\ e¡*N\83Ù$\88c@ÕeAÕÍë0¿U\ 2\ 3\84\ 1\9e\18ÿzËT¶\9ffw\99
++ì\11±\eb·K\8dÝæa1\89»¬Ýõ\)\ 4z\9d\9b7-\v\1fÛú5â¹³ªÆ½b\aúµÉê\97=\96\aW
++WZãJ·À\ 5\97
++@kèS\ f9\8b(ÂÅ2\ e\8aÐUWâ\97ççO\87p6\8dÏÇuB³¶\9dÐÌ'Þ\88\12å°\ 1Ú\8aÐÊÊ\90j,)ñ}ÆG\9a\bå²í¹\9dVMº\9d9'L0î°ÝY\11ßI·óïkë\1ap·óñM´hvF³3\9a\9dÑf\87\16\8fA4)Ù@/Lz\8cók}#l\186|L«h\1cÌûë\13\9d¯l\b,8\f\18}v¯¤ÏÎÆÀ\85\8dæ&ÅýC\1eÆw(9£äÜOÉùó"þ¯t\16¾/2\14\9bQl>\14¶òàcß\98ÕÈd\81e\97\88e{\12!\978æ\10F\81h\97qFÁ[\9fQ(â\vé\8f|¢=Ã\8dË£
++E<\7f#\89[Ic.\89áZ\8e\18#\8a\e§L-\9d(ÙääÂ\10*\99vxpÁ\1d\1d\ìï Àù\ 5Î/p~áôüâæUV\19¬\eÏ˶\904\98\853Ô\18Ð\ 5r\9e\11Ö»ÐÆ\10A\1cýµÙ6/C-Ñ6Ôâ\86xZé²AÃa\98Å)\11t#e,(ÑÌþ\7f»à.+î'k5\ eV®z\99Gtí2«\84j¾¬½~i\16Ù,ð¹~\15\85ò:\1c©~]7ÑÚÍÉâ±i\9a$ÖÔJ\aôÂÿ|ùÍÕ}\90ÌJ\ 2J»i\8atÝCuõøÛ·×/¿Í\1d¯eÛ×ò§¯e/\194\9f½¡öé\94l\9dN ¢\8dÏF\\10)\8ct\99NYIr#IøF\8e\85G\84\10ÞHø\84úF:M§ºP²Q#\98 ÊW.ó)&\89v\92Pýl¥WÕ\95\90J!\95B*u>`áf¯Oîì\96J³\87>\9bj¶0óKÇ\92Ñ\9bð\1aæÞNÛ\1f6û\9aL\81\8a\rF<H#\9e®²òpo\92\17Ö\8cO\0Ë\7ft*\17ö\8c®Ý0\99Ùÿ\81Aà Ïà óé}Ø/[f^üѵLØ18_\83$\98\87Ù \19V\f+î0éC²\aë½dÖbt8 ó¸·ÎãÙIÚ\8eËv?\a¢ÑrÜïì×"ý\18\ 2°\0X\0,\0Ö@(Æ\96=\92\rï1\1a Ø%"X-i\8bK\bsÄr\f\b;\ 1\84\81!\110öÚX\87ç÷i^ \e\80/E6\0Wúâ\97\b°`\15\ 3*jÁ\99Á\99Á\99\ 1¶\86\94\17\9eIG\1eÀììÒügë\847½xoZon\8eýi#`\84c\1d\ 4S`yÃ[\9a.'w«d=è\r\b\ 3\84õ\ 3a¥Ù\9d\18Á~µoá\97}\86\ f \ 3A`\1d£\85jËhA\89\92JzjÄ$¡\8aºd\b¤D\9a¯¢(5cÎ\88§<6²\7f*J\8dKN\8bnÔlDjÁ\bÓNI\ 2="]rZÔ\r\9b\ f\83Ú¢\v p[\80Ûâ\ 2¸-À\ 3\80`\7fø\83M³°\b¢8?A}ö§\8e%Ã\981çÔþ´\ 2\1dl\17À¼2\98\13\8a»(\99\9d\ 3i\16,\13\1dâh`ºä\ 3\8bEð!\1c4\a\ 4 lø\10¶¥¡<\19\92\ 1ÃÐ\9a\vÏvf\9em\9a\85§ip\83où<P\f(Ö%ÇÏ\97\13\r´\13\ 1¶ú\81µÅ\9dpÂàÏ}\16\ füB\1fQ]\1f\91nÛGôF\10f\ 4g#. \97N¯Æ±¢¸Ü\8abÆȱG\84â\9e\19 F¨q{7N7j6é#be»\94Ë6"íè®Ñ\ 6'£h#B\e\11Ú\88Ψ\8d(N\93ymêÖu\ 1aOº\86¶\vô\10\1dhÂ\1fJ\9d`¿°ßÁöÀåÓ,Zö8F\ 5+\86\15wmÅÛÄ\14\16\f\v\1e¨\ 5\a«â>Í`À0à\81\1a°Uæ!+KG°aØð«é¡¿\19jÅýû<O§Ñæ\80óeÝÝk[wç\84*é\99\1eÊîV\12]KbD*jÆ\8c\11ßÓbÄ\15ñ\8f\97\9c\15÷\93µ:G)Y³T\10n¤ª[j\15`¼Tà\80¥\eÝ[è\9afQ\98¼¨;W\2T\a*Õ¯ë¦\96\7fÔãfQi4OÏò«\958èH#\99U×4÷b\faÀ\91GX¬â"ZÆÑ´Â't "ȲôS\1f® \98ϳp\1e\14a7Îa\14\83o¯×o\8f»óßÓ4I6û?\7fñe\7fùÍÕ}\90Ìâpí\ 2\8bt}ô|õøÛ]\0¸ãµlûZõôµ/\8eK_¼¡æ~û]\98Øà#\8eþªrÝ~k×M\89PJ\8f¬s±\1eK8tÝV\ 2-]õVRI¼Ái)¹\15çG3×]¥dÍRN\f\17º\89?>dik]ÏÛuwrÎ~\14\0ðÊM|0\0°\ e\ 1 ªUÆ´Ý÷\82\12Î\8d\18\19¨1\9eÃ}o%1o-\89*+i,Ëî\15³Þ6\9evÙ&Ó\89\8a\8dºdJ\0pØ$#\88vÒ$SÅ
++<\8cÎ\98ã\e.Ð\18\83Æ\98Kj\8c 7Íp\93e\16}ìsÀf\8dÅ\1d^X\8eû\97/þ\ ¾ÇÝÍý~\7fv=É\ 1;ÆÙÀëïÆg´u\8ea\88aL\8d\98ï2½0Ä×¥\10\8f\185V>ÑÆ°u\17¾r\9a\´ÔQ^á\13Ox.Ûï\99p\92XüÛ
++\18vr\81¶{d\17È.\9aµj\ 4Ë^I\ f\7fìR\1eÚ4гü常ç´â§ÎåÂ\98/Þ\98\97a\98õiÇu\91\1eL\18&|\fwly3ç2\98\81
++\1c&|¹ìÉÃ\8eªa¦gyÅc¯F¹ýHa\94 9jZmpÌqô£\vÙ 7ê\95bò>\9c~\98\942ì\ 37h\0\826`\17.\80\ar½rä*²\87ɶ\91\14!\18`ì\947oGÉ\a@\19 ¬Åpw\9f0\86À\v\88\ 5Ä\ 2bµ;#Î\ 1Z\0-\80\16@k8 U\1e#Ý®îîÂli·G\9f\87I?¬¥¾ïR*0í\1c\8f\94\92Ù$üØå\ 5<¨hÀÕ\1eîjëmб£ýÙ\89p¸Ú>\91l¹Êï\91\19\0®ú\81+\eÔ\9d
++¬6\91\1dÐjàh\15\9f \1d@Ì5ÌTàL.\9dÚK¥ÅXëyWM´¿e¶a.G^\15ñÅ\179ci\88\10T\1c?eÛ\88B«B·\9a\85\1e©]gß6÷é\ 1ë|°f½:Ö,Ó\825\8bÑþi³\18oÍ\97gÍ\9b+¶\197÷µKª[M\94·\95D}=\16>a\92zkúWê;eÎêDÉF\13îV\17´Sî,édÄý]9¥\82\19w̸cÆý\ 2fÜK<Yv8æx¡\93\95 \1d\1aòXZ¹ ¢¿ÂAo\ 2\94\ eP:pP:\10\83)\1dp"¨g¶¥\ 3á\11%6¹z\8bdæ4õ\83R\13UjÒ|]K\1dQDx\85E\ 4î®\88°\7fÛËÖÕ\ 4C<\9bÿ\8e4qɼÏ}bØFÊØn/O´æýnƺ¿K¹êe\1eÑMp¡á²öúa»»Ùî¬Åv7§Üíj »]\11)©ÙìvJt¹ó¹ R8¾\1e«ÓÝ^*a¬\12\r\97µ×\ f»ýõívy\82\ 3\ 2Ýv\93KE¨GåÈú\-\\12ß\96\82øF\10\13þXKâso}\9d\8eÏ\84ïòx \v\15\e\9d\ eX¬ \9eË\9b5\14ñ]ݬQË\1a\8e\ 3\ 2\1c\10à\80à\8c\ e\bÊßO\8a®/
++¸À;\8bqD\02\\183\8c¹\132\\e\16\84É4ìÙ\96ßw-\16¦|ñ¦\f\92}Ø/\18qóÉíä\\vf\4 \9cp\0«Ö\ 4]N`íIø0~ÕrüêL\1aV*«Û^Ûê6\13e\13º\1eIF¨T.ËÛV\125¥$J\8cQþ\98\e¢¨ä#EíÏ\95Óúv'J6*pk"\98pÙþn\9c\94·\7f\88\12\94µQÖFYûìïv»\8fâY\16&¸\8a\ 5\91ü0\v'\8b æál²½\ 3\1d\97
++Á\92\ajÉÖz³(\84\ 1Ã\80\87ZÃN\93"üÜ\1f×Û4-îm&T\86fÝ
++\86-£\9eÝn+\ 4³\19èÂPî\89Ýp\13ú\9e\8cßÐ\91x\14û\1dþ]¤\1fC\80\16@\v \ 5Ð\1a\12\ 3zß\1d\ 3ݦÍ\03ô\v _àâQ,î\12T\0a¸¹¡\9dIÚçf}\ eºàÚ\ 6ð\0\r\81\aÈoM\11°\1dh\17>¡Ç\ f´7¢ `\84KO~\914æ\9a\88\926 ]gW3ª\80*%k\96\1a¢\ 5«ç\ 2°
++\99R¡æKÛë
++Ú\07´\ 1²\r'\90w\ 2Þ\0Ó\9a\ 1L\10¡Åzÿ)I]vV\96\92ØF\92Ý[~I,l<6\92\82x\86:m¬ìDÇ&\8d\95\8a(u,\8fZ£¾JN¸\93ÎÊÿ^\85+P\ 6 ·\12½\95§è¼izX|sn\93\ 1\9c¶\8e\7aÂ\1f)A\94fÚmäj½ÈF\12czÌ=Â\85\18)E|ÆÜòâw¡c3ÿåiÃ\aè¿þ\wÜÀ\81Á\81Á\81Á\81\9d¢\ 6ÃÙ\80j0\92hù(©$ge\86Ë\969à k0¥\ 2\92ËC\96¶×\155\98WX\839%S+ç\1d\ 4³ë\ 2a9lêvÌ\95S"壤±\85\ 4!}Ù2\8cn\ 6\ 1UJÖ,eÄó\ 5¯]*íRÿ°¥u\ 5\ 4¸\81\80ç¥Ô\830\80\9fà\827Þú&\ 6Í\bS\82\97~Éf\93.óØR\12ÝH¢Zë±Ö6\9fõLY\88\15Z;Md;Q²Y"+\98ô\ 6\98ȾÏÒ
++Ú\17ä±Èc\91Ç"\8fuT\88m}§\88*\ fò¥M׬\e\11¾ËôÕJâf#\89û¾\1c[¯"\98òFB\11å\1f+¹\99\ 3ëDÉ&\ eL\12Ã[\9dT\9eÊ\81UÒ\96Á\7fÁ\7fÁ\7fÁ\7f9ò_oÉyÃ(aF¬±ÝÓÜe\ 6V\8aâr+\8aq=f\9cH\8f³\91\94D2î4\ 5ëFÍ&.\8csÒî°r\9f\v³\9ah'>ì\8fé}8[Åa6`Gv<>Â\8fÁ\8f]\12Ù\18(\9a0¯0p\86\9bû J`¿`i¿XV\9bɾ¹}\10E4\8c@0Z\r\9e\bLX÷In\ 3ì\ 2v\ 1»\80]î0 Ê*\a°\vØ\ 5ì\ 2v\r
++»fQ\ eð\ 2x\ 1¼\0^Ã\ 3¯8\9d~\0r\ 1¹\80\@®a!×*\ 1v\ 1»\80]À®áa×rs\9fK97\ 6à\ 2põ\ 2\y6]\ 6³SáÖ{\a¢Ï\16³úµ\8b(ù\0Ã\803kåÌfQ\ e\7f\ 6\7f\ 6\7f\ 6Ø\82?\83a\fÚ\9fáZ\0x·\8b»\15 r\12R·\9d\84d\920Au\ f\94ªV\12õ·\92Ö\94ª\94H!u\1f\9cª\9d(Ùd\fR\13®ä\10\99h¢e\18G XÁ1\ 4\89!H\fó»paû\19\15½á0*2\8fpêéGFENØ\9aañÕ2*\1ajê\96\96
++©R¡\ 3\96\82Qñ,\19\15õ \18\15[ßi%¨\r"}QÚ/S\9ery³\r%\9eÞJ¢\9e\1aÛðUr¡FÚ\86±ôXÉ\r¯¶éBÉFl\1e\92(¥\Þ\r`#r7t\1e?¬îî\ 6Íå\818\16q,È<\1a\8eTÞMvý]Z\e% ò\0\95Ggö[vHöf»¿Ù¥\9fa½°Þ®¬÷.\ eæýñЬ,ö2\rû\85ýve¿³ \bz3ßu\16W\91\97À~a¿GØo\1eý\15ö
++¿\82Ã|a¾]\99ï"ø\f\v\86\ 5\ fØ\82Ó»»<,`À0à\81\1ap\11-¼\b\16Ë>\vhZÂ\84aÂ\1dF\11Á<\84ýÂ~\87i¿Ë \v{<À¨? \85\rÃ\86\81Á°ßKÃ`û¦ûGà÷]J\85\15\83W¿Ý&\98faP\84\93|u;ä`\ 4¦z\ 6£Ã{êj.'D÷ÔØ0!zÚÑá\9aã\ 2X\ 5æ\86ë\1d\º|\80k\83kk67Ü\8bI.¬Ǽ\196\89pk'ÁÁêîTl\1c{ì\11\8eu\10\84\1cv¿,\83dr\17ä\ 5X9\0e\802@Y÷PvîD.¦í\ 4¬Tå5ó¢¼V^1ê9\9c\80µ\92\98ÙH\92\9azcÅ\88aÔ\8c¤G\84>Vr³ ØN\94lFä¢\99§\9d2¹øNæ_\7fªêjÇMö\18~Åðëù\f¿\96Ïì¯vðg\97ÒpZy\86§\95çKL$hëØÌ'Jq¶\8e\90\1cÇf¢d\ 52_$\8d¥!\92ZÉíxQ\1a\11\13U*Y³Ô¾;iê\97Z\85L©Pó¥íu\ 51ÑÞ\87\1eELd³\9c\16ÄD~ÿÄD\82µÝúÊØÝ ½\92®KPß8ÜúV\12×\eI\ùf¬K\12\1f\9f\8f\14/ÿ4.Ó²N\94l\92\963O5@\82Í\9f?Vµù\82\95\b\89\19\123·\89\19Ø5\7f\17|@A¬G<ú(i¬\191\9a©\96>ô\84Al©\0³
++\1c°´½®\bb_a\10k\ 3Êþ\83XÑzës"\994£7\82\18£}\97,ñV\94Ð¥(i\13Y+jì1âk\9f\8d8ñ\95\r2\9d\9e.t¢f#\82Í2-\17. 6µ£ó\85ÿYÄ\bc\11Æ"\8c}Íal¯ý?\9f²¨Çëx>/â\9fÒéû\ 2]\8c\1d\9d\18´¿ÿ\a÷>ãÞç3¹*3ËÃÉ,\9d¢\8d\11m\8c'\ 4³:\vt dû}+pì\94\ 3pY\9a\9eÆÃý±þ\13Vq\ 6Þí.\8aqw&ÜÛ)ÝÛ]¹\b8\ 6ïöJÆ»#$n\bx\0\14g\1að,ÂE\9a= äAÈsÚÁD\17Ó\81M lßÍ\13À2\ 4=0 \ 4=\bzÎ"è\99\87Ådßa\98\ 3f\99\9f;\16\89°ç\1cÂ\1e\14z\0eí ¬°ÏÛ@K\7fW\r¾û5Ê\81d¯\12Én.\85'd\7f?¿lÛÔË\rñ´Ò#M\84Ã~^î\13ì\14N|*\98\1c+\8f0ÕÈ'Â\18Ïe+ÿNýª\97yD\99úÖüò3ûÖ\9b¯Ü*\8d&þW×ÄÏÚôð\8bÊ\17·îáÿ>ÏÓiT¹éUëqTß\9a¤\12#¡\88\12¾t9\8eê\13ª\1e%\8dµ ¾¦j$9ñ,\ 2¸Üù\95JÖ,5ÄW\86ÕNæX\ 5\98Uà\80¥\92\958 ±ÿ+\1e7\8b²Í>¹n¢ÄA3\12ɬº\rzoÄ\91Yÿï\88\9fd±\8a\8bh\19GÓ\8a\80°\ 3\11A\96¥\9fú\bÌ\82ù<\vçA\11ÖG¶¬Û;@ðíõúíQwl2Ç\8dßÉ6\1c\12ÂÝøÝOáÒ¢N\98L\1fvynÝÖs3A´ñÙHX\9f"\8cKÏÍ\88¦Ò3¥$*\8d\1c[É\9e,%\v"%uê¹+\95¬YÊ\89~ò®v\84ø6\12Y+tÀÒ\8dîçã¹gYðiò\1c[º\9c»:\9bÔà\19¾p~\bÀè\93¥\ 6^ëz\0%BÙDØ'Ú3Ü%S\8d&FxÔ·\99¹äB\8c`I`F ÷\8cpZ\13¨Ò±n)\15\9c«º¥\1eÑ~©Ï\ 1K7ª#1@b\80Ð\12\89Á ¿=þÚ\12\83ÊÐ~¿Û¦mÝöæïqð\10fß}³ù\8býw\9e\ 5\8bï¾ù\7f\\ 219û\85\ 2\0
+\ Kein Zeilenumbruch am Dateiende.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/company/clocks gstreamer-0.10.23/docs/random/company/clocks
+--- gstreamer-0.10.23.orig/docs/random/company/clocks 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/company/clocks 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,93 @@
++TIME
++In this document, the word "time" is not meant to represent a representation of
++time that is close to reality. Though that is the idea in most cases, it is not
++the focus. Time in this document is meant to represent time inside a stream that
++is played back by GStreamer. There might be reasons to represent time in non-
++realtime, for example when the processor is too slow to allow for video playback
++in realtime, the clock might not update fast enough. Or one might want to use
++a clock that purposefully increases/reduces the speed of time.
++Time in this document is not meant to be linear either. Whereas elements can set
++time freely by seeking, clocks should do their best to supply linear time. It is
++not a requirement however, there might for example be slight inconsistencies
++when audio clocks have buffer over/underruns.
++
++TIME IN A CLOCK
++The job of a clock is to report the time as exactly as possible that has elapsed
++in the stream since the stream was started.
++A Clock does never seek, so if someone seeks the stream back to the beginning,
++the clock will still represent the time since a start.
++The state of the clock is managed by all elements using its time as a state of a
++bin is changed according to its children. A clock will try to synchronize its
++state with its provider. (FIXME: or with all its children like a bin? FIXME:
++What to do in the case of a providerless clock like _a_ systemclock (we might
++use multiple systemclocks)? Attach to one element that uses it and reattach if
++element is removed? FIXME: What do we do when a provider is removed from a
++scheduler? Sounds like a good time to get a new clock to take over. FIXME:
++Write a test that does exactly this in Gst-Player when changing the GConf Key.)
++- NULL / READY
++ Nobody cares about time reported by the clock.
++- PLAYING
++ Clock is supposed to present the time elapsed since it was started.
++- PAUSED
++ The clock has to remember the time it was stopped and resume with that time
++ when it restarts playing.
++
++TIME IN AN ELEMENT
++An element only can request time information if it uses a clock. The element can
++query functions that give information about the elements time. Time information
++for the element is always in relation to the timestamps the element expects on
++its buffers.
++Example: XVideosink will output a new frame, when xvideosinks time matches the
++ timestamps of the buffer.
++The elements time is in no relation to the time of its clock because of seeks.
++If an element seeks, it adjusts its time by the difference the seek has
++introduced.
++Example: Playback of a song with duration 1000 that is looping. Clock and
++ element start at time offset 0, when the element is first set to
++ PLAYING. After the first loop, the elements time is (by request of that
++ element) reset to 0. The clock's time stays at 1000.
++Note: If an element goes into the PAUSED state the elements time will continue
++ running. (FIXME: possibility to change that needed? Why would you want to
++ pause an element that should be synced while the others continue running?
++ FIXME: What happens if a clock provider and therefore the clock are
++ already at EOS while other elements are still playing? I'd vote for make
++ all other elements go as fast as possible. FIXME: Ask some video people if
++ that sounds reasonable or if we gotta force the clock to go on, which
++ would make it difficult to detect the difference between EOS and pause.
++
++PROVIDERS
++Providers are elements that can provide timing information and therefore provide
++a clock to other elements. These elements have to update the clock, when it is
++used. When a clock is used (state != NULL - FIXME: or other states?), the
++provider is guaranteed to use this clock. (FIXME: necessary?). The element is
++however required to synchronize to the clock it was assigned to, wether it is
++its own clock or not.
++
++SYNC POINTS
++FIXME: Is it necessary to have sync points? This would allow to supply a fixed
++time between sync point "SOURCE" and "SINK" so one could buffer the time
++inbetween. Or is there another solution for this problem? It's possibly easier
++to use an element that does TIMESTAMP = TIMESTAMP - x inside the pipeline and
++drops every buffer before.
++
++FUNCTIONS
++FIXME: Use GstTime(Diff) instead of GstClockTime(Diff) ?
++
++GstClockTime gst_clock_get_time (GstClock *clock);
++GstElementState gst_clock_get_state (GstClock *clock); /* setting works internally */
++GstClockReturn gst_clock_wait (GstClock *clock, GstClockTime until, GstClockTimeDiff *jitter);
++
++GST_FLAG GST_ELEMENT_NEEDS_CLOCK; /* wether we want a clock or not */
++GstClockTime gst_element_get_time (GstElement *element);
++void gst_element_(clock_)seek (GstElement *element, GstClockTimeDiff diff);
++GstClock * gst_element_get_clock (GstElement *element);
++GstClockReturn gst_element_(clock_)wait (GstElement *element, GstClockTime until, GstClockTimeDiff *jitter);
++
++possible extensions:
++GstClockTime gst_clock_get_resolution (GstClock *clock); /* sounds interesting */
++void gst_clock_wait_async (GstClock *clock, GFunc callback, gpointer data); /* useless IMO */
++void gst_clock_unlock (GstClock *clock); /* dunno what for */
++void gst_clock_set_state (GstClock *clock, GstElementState state); /* might be needed, but screw up alot */
++
++Hm, this looks to easy when you only need an API of 8 functions. But it's quite
++a bit of internal hacking because of the state changes.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/company/gstdata gstreamer-0.10.23/docs/random/company/gstdata
+--- gstreamer-0.10.23.orig/docs/random/company/gstdata 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/company/gstdata 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,212 @@
++STATUS: GstData is not implemented as a class for speed reasons.
++----------------------------------------------------------------
++
++NB: This document does not represent the current state of CVS but my current plans on how to implement this.
++
++Basics
++======
++
++Hierarchy
++---------
++GstData
++ GstInstream
++ GstBuffer
++ GstEventNewMedia
++ GstEventDiscontinuous
++ GstEventEOS
++ GstEventLength
++ GstOutOfStream
++ GstEventLock
++ GstEventUnLock
++ GstEventSeek
++ GstEventFlush
++ GstEventEmpty
++
++
++GstData
++=======
++
++typedef GstData * (*GstDataCopyFunction) (GstData *data);
++typedef void (*GstDataFreeFunction) (GstData *data);
++
++struct _GstData
++{
++ /* is a */
++ GstDataClass * klass;
++
++ /* refcounting */
++#ifdef HAVE_ATOMIC_H
++ atomic_t refcount;
++#else
++ gint refcount;
++ GMutex * reflock;
++#endif
++
++ /* flags */
++ guint flags;
++};
++
++struct _GstDataClass
++{
++ GstDataType type;
++
++ GstDataCopyFunction copy;
++ GstDataFreeFunction free;
++};
++
++Inheritance
++-----------
++A GstData descandant GstMyData, would look like this:
++struct _GstMyData {
++ GstData parent;
++ /* more stuff specific to GstMyData */
++}
++
++You can even enhance the class struct, if you want to. This works just like inheritance in GLib.
++
++If it can be a parent class, it should implement these three functions publically:
++void gst_my_data_init (GstMyData *data) {
++ /* call the parent's init function, eg: */
++ gst_data_init (GST_DATA (data));
++ /* initialize your data now */
++}
++void gst_my_data_dispose (GstMyData *data) {
++ /* free every data, that needs to be freed */
++ /* call the parent's dispose function, eg: */
++ gst_data_dispose (GST_DATA (data));
++ /* do NOT free the data */
++}
++GstData *gst_my_data_do_copy (GstMyData *to, GstMyData *from) {
++ /* call the parent's copy function, eg: */
++ gst_data_do_copy (GST_DATA (to), GST_DATA (from));
++ /* copy relevant stuff from your struct now */
++ /* note: the copy function must return a writable object, you may not set GST_DATA_READONLY here */
++}
++
++If GstMyData should be instantiable, you should do this:
++Get a class struct, something like this:
++static GstDataClass my_data_class = { GST_TYPE_MY_DATA,
++ gst_my_data_copy_func,
++ gst_my_data_free_func };
++FIXME: At the moment all types need to be specified in a big enum in gstdata.h.
++ We might want to change that when we support event plugins.
++The two functions above should look something like this:
++GstData *gst_my_data_copy_func (GstData *from) {
++ /* allocate memory */
++ GstMyData *copy = g_new (GstMyData, 1);
++ /* copy relevant variables or initialize them */
++ gst_my_data_copy (copy, GST_MY_DATA (from));
++
++ return copy;
++}
++void gst_my_data_free_func (GstData *data) {
++ /* first dispose all data */
++ gst_my_data_dispose (GST_MY_DATA (data));
++ /* now free the struct */
++ g_free (data);
++}
++
++Now you just need a function that can be called from the real world:
++GstMyData *gst_my_data_new (void) {
++ /* allocate memory */
++ GstMyData *my_data = g_new (GstMyData, 1);
++ /* initialize the variables */
++ gst_my_data_init (my_data);
++ /* set the right type */
++ GST_DATA (my_data)->type = &my_data_class;
++
++ return my_data;
++}
++
++summary of inheritance:
++- define structs like GObject inheritance
++- inheritance works by calling the functions of the parent when creating/copying/freeing an object
++- type recognition is done by the type field in the class struct
++- memory allocation is specific to the struct.
++
++Refcounting
++-----------
++GstData provides threadsafe refcounting. If you create a new object - either by copying or explicit creation - the refcount is initialized to 1.
++This reference is owned by the creator of the object.
++If the reference count reaches 0, the object is freed. The free function of the class is called for that purpose.
++In accordance with GLib, that uses g_object_(un)ref for everything, gst_data_(un)ref is used and no wrapper macros are created.
++
++MT safety
++---------
++Manipulating data inside an object is not threadsafe unless otherwise noted.
++If an object has a reference count of 1 it is assumed that the reference holder is the only user of that object and he may modify it the way he likes.
++If the reference count is greater than 1, the object may not be modified. If you need to modify it, you have to copy the object and use that copy instead.
++NB: Object creation and refcounting are threadsafe - or must be implemented that way.
++
++Flags
++-----
++Flags work and can be used like the GstObject flags.
++GstData defines only one flag: GST_DATA_READONLY. If this flag is set, you are not allowed to modify the contents of a struct, even if the refcount is 1.
++
++GBoxed
++------
++
++
++GstInstream
++===========
++
++GstInstream is the base class for events and buffers that are passed inside the stream.
++It enhances the GstData struct by
++guint64 offset[GST_OFFSET_TYPES];
++This field describes the offset in the current stream in various different ways:
++GST_OFFSET_BYTES: The number of bytes from the beginning of the stream.
++GST_OFFSET_TIME: The timestamp in microseconds. The beginning of the stream equals timestamp 0. In buffers the timestamp should match the beginning of the data.
++GST_OFFSET_FRAMES: This type is specific to the stream and should be defined there. (video will probably use it for frame numbers, audio to count samples)
++If an offset can't be specified, it is set to GST_OFFSET_INVALID, which equals (guint64) -1. The byte offset always has to be specified. It is an error if it is invalid.
++A plugin playing data from an "infinite" source (eg a shoutcast stream from the internet) it should start with byteoffset 0.
++
++
++GstBuffer
++=========
++
++The buffer enhances the GstInstream struct by including a data and a size field.
++
++Memory allocation
++-----------------
++Memory is allocated via a special memchunk implementation, that is threadsafe. The default implementation uses a mutex and GMemChunks.
++FIXME: This is not true, we use g_malloc/g_free for now.
++
++GstBufferClass
++--------------
++GstBufferClasses (note the plural) replace bufferpools. The default class uses g_free/g_malloc for storing data. However, you are free to write your own if
++you need buffers that store data in another way.
++Note however that the copy function needs to supply a writable copy of your buffer.
++
++Subbuffers
++----------
++Subbuffers have been replaced by a special kind of GstBufferClass.
++
++
++Instream events
++===============
++
++GstEventNewMedia
++----------------
++Signals the start of a new stream. This must be send before any buffer of a new stream can be send.
++FIXME: The "must be send" can only be enforced if all elements are event aware. And this is necessary if we don't want to get parts of stream 1 inside stream 2.
++
++GstEventDiscontinuous
++---------------------
++This must be send between buffers, that don't have continuous data. This is necessary for example after seeking or when data is dropped for speed.
++
++GstEventEOS
++-----------
++Signals the end of a stream. Must be send after all data is finished. If you want to start a new stream, don't send this event, send a GstEventNewMedia instead.
++After having processed this event, elements in the pipeline switch their state to paused.
++
++GstEventLength
++--------------
++Specifies the length of the stream.
++FIXME: Write more, when sure how to do this.
++
++Upstream events
++===============
++These will be discussed in a seperate doc.
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/company/gstparse gstreamer-0.10.23/docs/random/company/gstparse
+--- gstreamer-0.10.23.orig/docs/random/company/gstparse 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/company/gstparse 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,166 @@
++GstParse
++========
++
++This document describes how GstParse works. GstParse is the infrastructure used
++to describe pipelines \(or parts thereof) as a string. This powerful yet easy
++language is for example by the gst-launch command-line utility or in the GConf
++keys that are used by various applications, such as Rhythmbox or Gst-Player.
++\(You can find these keys in /system/gstreamer/default in GConf)
++
++The following examples will show commands for gst-launch. Please note that some
++characters need to be escaped when the pipeline is written in the shell as
++gst-launch command.
++
++If you want to debug the GstParse part of an application, you can start it with
++the --gst-mask=0x10000 command line option.
++
++
++Basics
++======
++
++Elements
++--------
++The most basic thing you specify in a pipeline are elements. You add an element
++by the name of its type, so "filesrc" will add a file source and "identity" will
++add an identity element.
++Gstparse will put all these elements into a toplevel pipeline element.
++ example:#> gst-launch filesrc identity
++This adds a filesrc and an identity element to a pipeline. Of course this
++pipeline will not run, because the elements are not yet connected.
++
++Properties
++----------
++You can set element properties by specifying them directly after the element in
++the form name=value \(you need to escape here) or name="value" \(you only need to
++escape the " sign.
++ example:#> gst-launch filesrc name=source location="music.mp3"
++This adds a filesrc element with the name "source" pointing to the location
++music.mp3 to your pipeline. \(This pipeline doesn't work either.)
++It's a good idea to set the name property on important elements, because if they
++are referenced \(see below), they will be referenced by name and the name of an
++element is unspecified if it wasn't set before.
++Please note that not all properties can be set yet. You might get a warning like
++ property "myproperty" in element myelement cannot be set
++In that case, please file a feature request. We can't guess all properties in
++advance.
++
++Bins
++----
++If you want to add bins to your pipeline, you can do so by specifying
++ <bintype> . ( <properties> <elements> )
++in your pipeline. This adds a bin to your pipeline and puts all elements that
++are specified between the brackets inside this bin. You can specify properties
++of the bin directly after the opening bracket.
++There are to special bins: if you don't specify a bintype and no dot either, the
++type of the bin defaults to "bin". And you can use curly brackets { } to get a
++bin of type "thread".
++ example:#> gst-launch \( { fakesrc pipeline . \( fakesink \) } \)
++This will put a fakesrc element inside a thread inside a bin and a fakesink into
++a pipeline element inside the thread inside the bin.
++Please note that this pipeline would not work, even if the elements were
++connected properly, because the pipeline only specifies one top level element,
++the element is not put inside a pipeline but returned directly. So if you don't
++want your elements be put into a pipeline, just add a bin of whatever type you
++wish around the pipeline.
++
++Links
++-----
++What would a pipeline be without the ability to link the elements?
++Well it's very easy. Just put the link sign, an exclamation mark, between two
++elements and they will be linked.
++ example:#> gst-launch fakesrc ! fakesink
++This will put the two elements into a pipeline and connect the fakesrc to the
++fakesink. This is the first pipeline that should run - and run it will until you
++terminate it.
++You can't however control which pads are linked, you can reference the pad\(s)
++you want to connect by name with a dot before the name.
++ example:#> gst-launch fakesrc .src ! fakesink
++ example:#> gst-launch fakesrc ! .sink fakesink
++ example:#> gst-launch fakesrc .src ! .sink fakesink
++These examples will all do the exact same thing as the example before. You have
++however referenced the pads you wanted to connect in different ways.
++Another way to reference is to reference the element you want to connect, too.
++In this case you have to add the element name before the dot. You can even not
++reference the pad and only the element name, to connect any pad.
++ example:#> gst-launch fakesrc name=src fakesink name=sink src.src ! sink.sink
++ example:#> gst-launch fakesrc name=src ! sink.sink fakesink name=sink
++ example:#> gst-launch fakesrc name=src src. ! fakesink name=sink
++ example:#> gst-launch fakesrc name=src fakesink name=sink src. ! sink.
++These examples all do the same as the other ones. Please note that we specified
++the element name property to be sure to reference the right element.
++In these examples you may have noticed, that an omitted element name on a link
++automatically means the element directly in front of / after the link is used
++to create the link to save you some typing work and that not specifying a pad
++name will automatically create 1 connection between the two elements. If more
++than one connection was possible you might end up surprised.
++You may even specify pad lists to connect elements. They are seperated by
++commas.
++ example:#> gst-launch fakesrc ! tee name=tee1 .src0,src1 ! .sink0, sink1 aggregator ! fakesink
++ example:#> gst-launch fakesrc ! tee name=tee aggregator name=aggregator ! fakesink tee.src0,src1 ! aggregator.sink0, sink1
++ example:#> gst-launch fakesrc ! tee name=tee .src0 ! .sink0 aggregator name=aggregator ! fakesink tee.src1 ! aggregator.sink1
++These will all do the same. They will connect the tee twice to the aggregator.
++
++
++Examples
++========
++
++Audio playback
++--------------
++The most common audio pipeline for playing back an mp3 file is this:
++ example:#> gst-launch filesrc location=/path/to/file.mp3 ! mad ! osssink
++
++You can however improve on this by adding visualization:
++ example:#> gst-launch filesrc location=/path/to/file.mp3 ! mad ! tee name=tee ! osssink tee.src%d ! goom ! colorspace ! xvideosink
++Note that the reference of the tee element has a pad named "src%d". This is as
++used by printf and is a useful way to specify request pads where you don't know
++how this pad is named. Yes, the pad name could have been omitted anyway.
++
++If you have jerky playback you might want to use this pipeline threaded so audio
++and video have less chance of problems and you have a little buffer:
++ example:#> gst-launch filesrc location=/path/to/file.mp3 ! mad ! tee name=tee ! { queue ! osssink } tee name=tee { ! queue ! osssink } { tee. ! queue ! goom ! colorspace ! xvideosink }
++Remember to put queues at thread boundaries or it will not work.
++
++Video playback
++--------------
++The basic pipeline to playback a standard mpeg video would be this:
++ example:#> gst-launch filesrc location=/path/to/file.mpeg ! mpegdemux name=demux ! mad ! osssink demux. ! mpeg2dec ! xvideosink
++
++Or using threads for better playback:
++ example:#> gst-launch filesrc location=/path/to/file.mpeg ! mpegdemux name=demux ! { queue ! mad ! osssink } demux. ! { queue ! mpeg2dec ! xvideosink }
++
++For a DivX avi, this might work:
++ example:#> gst-launch filesrc location=/path/to/file.avi ! avidemux name=demux ! { queue ! mad ! osssink } { demux. ! ffdec_msmpeg4 ! xvideosink }
++
++
++If these don't work the video might need different treatment. You should skip to
++the autoplugger part.
++Please be aware of the fact that the mpegdemux element uses pads that are not
++always available. GstParse will wait for them to become available and disable
++the elements that need to be connected by disabling their state until the link
++can be established.
++
++Autoplugging
++------------
++You can also use the spider element for autoplugging. This will take care of
++selecting the right elements for you. Just use this pipeline for all your needs:
++ example:#> gst-launch filesrc location=/path/to/anything ! spider name=spider ! { queue ! osssink } { spider. ! queue ! xvideosink }
++
++To throw you out
++----------------
++Finally the current experimental pipeline that powers the gst-player specified
++as a simple (ahem...) command line:
++ example:#> gst-launch pipeline. \( { filesrc location=/path/to/anything ! spider name=spider ! { queue ! volume ! \( tee name=tee ! { queue ! \( goom \) ! colorspace ! \( xvideosink \) } tee. ! { queue ! \( osssink \) } \) } spider. ! { queue ! colorspace \( xvideosink \) } } \)
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/company/gvadec.txt gstreamer-0.10.23/docs/random/company/gvadec.txt
+--- gstreamer-0.10.23.orig/docs/random/company/gvadec.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/company/gvadec.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,229 @@
++GStreamer Internals
++
++Benjamin Otte
++Universität Hamburg, Germany
++otte@gnome.org
++
++
++Abstract
++
++GStreamer is a multimedia streaming framework. It aims to provide developers
++with an abstracted view on media files, while still allowing him to do all
++modifications necessary for the different types ofmedia handling applications.
++
++The framework is utilizes as a graph-based streaming architecture, which is
++implemented in the GStreamer core. Being media agnostic, the Gstreamer core
++uses a plugin-based architecture to provide the building blocks for streams
++processing. The GStreamer plugins collection provides these building blocks
++for multimedia processing.
++
++
++Introduction
++
++While there is a good number of high-quality applications available today for
++audio and video playback such as MPlayer[1] and Xine[2], none of these provide
++a generic media processing backend and a lot of code duplication has been
++going on when trying to provide a generic playback backend. On top of this,
++most application backends are limited in their abilities and only provide
++solutions for the problem space of the application. GStreamer tries to
++overcome these issues by providing a generic infrastructure that allows
++creating all sorts of applications. The applications show the flexibility of
++this approach. Examples are Rhythmbox[3], an audio player, Totem[4], a video
++player, Marlin[5], an audio editor, /*FIXME*/[6], an audio synthesis
++application and fluendo[7], a video streaming server.
++
++Although the GStreamer framework's focus is multimedia processing, the core
++has been used outside the real of multimedia, for example in the gst-sci
++package[8] that provides statistical data analysis.
++
++This paper focusses on the GStreamer core and explains the goals of the
++framework and how the core tries to achieve these by following a simple
++mp3 playback example.
++
++
++Plugins
++
++To allow easy extensibility, the complete media processing functionality
++inside GStreamer is provided via plugins. Upon initialization a plugin
++registeres its different capabilities with the GStreamer library. These
++capabilities are schedulers, typefind functions or - most common - elements.
++The capabilities of plugins are recorded inside the registry.
++
++
++The registry
++
++The registry is a cache file that is used to inspect certain plugin capabilities
++without the need to load the plugin. As an example those stored capabilites
++enabled automatically determining which plugins must be loaded in order to
++decode a certain media file.
++The gst-register(1) command updates the registry file. The gst-inspect(1)
++command allows querying plugins and their capabilities.
++[Add: output of gst-inspect gstelements]
++
++
++Elements
++
++Elements are at the main building block inside GStreamer. An element takes
++data from 0 to n input sink pads, processes it and produces data for 0 to n
++output source pads. Pads are used to enable data flow between elements in
++GStreamer. A pad can be viewed as a "place" or "port" on an element where
++links may be made with other elements, and through which data can flow to or
++from those elements. For the most part, all data in GStreamer flows one way
++through a link between elements. Data flows out of one element through one or
++more source pads, and elements accept incoming data through one or more sink
++pads. Elements are ordered in a tree structure by putting them inside
++container elements, called bins. This allows to operate only on the toplevel
++element (called the pipeline element) which propagates these operations to the
++contained elements.
++[Add: gst-editor with a simple mp3 decoder]
++There exists a simple command line tool to quickly construct media pipelines,
++called gst-launch. It helps to get comfortable with using it when developing
++code for or with GStreamer. /* FIXME: write more? */
++As an example the pipeline above would be presented by the command gst-launch
++filesrc ! mad ! alsasink
++
++
++The sample program
++
++/* note that the sample program does not do error checking for simplicities
++ * sake */
++int
++main (int argc, char **argv)
++{
++ GstElement *pipeline;
++
++ gst_init (&argc, &argv);
++ pipeline = gst_parse_launch ("filesrc location=./music.mp3 ! mad ! osssink",
++ NULL);
++ gst_element_set_state (pipeline, GST_STATE_PLAYING);
++ while (gst_bin_iterate (GST_BIN (pipeline)));
++ gst_object_unref (GST_OBJECT (pipeline));
++}
++
++
++Step 1: gst_init
++
++gst_init initializes the GStreamer library. The most important part here is
++loading information from the registry. The other important part is preparing
++the subsystems that need it. It also processes the command line options and
++environment variables specific to GStreamer, like the debugging options.
++
++
++The debugging subsystem
++
++GStreamer includes a powerful debugging subsystem. The need for such a system
++becomes apparent when looking at the way GStreamer works. It is built out of
++little independet elements that process unknown data for long times with or
++without user intervention, realtime requirements or other factors that can
++affect processing. Debugging messages are divided into named categories and 5
++levels for importance, ranging from "log" to "error". Desired debugging output
++can be specified either on the command line or as environment variable
++GST_DEBUG.
++
++
++Step 2: creating the pipeline
++
++A pipeline is set up by creating an element tree, setting options on these
++elements and finally linking their pads.
++Elements are created from their element factories. Element factories contain
++information about elements loaded from the registry. Getting the right element
++factory is done by either knowing its name (in the example "filesrc" is such a
++name) or querying the features of element factories and then deciding which
++one to use. Upon requesting an element, the element factory automatically
++loads the required plugin and returns a newly created element.
++Setting options on elements can be achieved in 2 ways. Either by knowing the
++GObject properties of the element and setting the property directly (the
++location property of filesrc is set in the example pipeline) or by using
++interfaces. Interfaces are used when there is a set of elements that allows the
++same features in a different context. For example there is an interface for
++setting tags that is implemented by different encoding plugins that support
++tag writing as well as tag changing plugins. Another example would be the
++mixer interface that allows changing the volume of an audio element. It is
++implemented by different audio sinks (oss, alsa) as well as the generic volume
++changing element. There is a set of interfaces included in the GStreamer
++Plugins plugin set, but people are of course free to add interfaces and
++elements implementing them.
++The last step in creating a pipeline is linking pads. When attempting to link
++two pads, GStreamer checks that a link is possible and if so, links them. After
++they are linked data may pass through this link. Most of the time (just like
++in this example) convenience funtions are used that automatically select the
++right elements to connect inside a GStreamer pipeline.
++
++
++Step 3: setting the state
++
++GStreamer elements know of four different states: NULL, READY, PAUSED and
++PLAYING. Each state and more important each state transition allows and
++requires different things from elements. State transitions are done step by
++step internally. (Note that in the following description state transitions in
++opposite directions can be assumed to do exactly the reverse thing.) Every
++transition may fail to succeed. In that case the gst_element_set_state
++function will return an error.
++
++
++GST_STATE_NULL to GST_STATE_READY
++
++GST_STATE_NULL is the 'uninitialized' state. Since it is always possible to
++create an element, nothing that might require interaction or can fail is done
++while creating the element. During the state transition elements are supposed
++to initialize external ressources. A file source opens its file, X elements
++open connections to the X server etc. This ensures that all elements can
++provide the best possible information about their capabilities during future
++interactions. The GStreamer core essentially does nothing. After this
++transition all external dependencies are initialized and supposed to work and
++the element is ready to start.
++
++
++GST_STATE_READY to GST_STATE_PAUSED
++
++During this state change all internal dependencies are resolved. The GStreamer
++core tries to resolve links between pads by negotiating capabilites of pads.
++(See below for an explanation.) The schedulers will prepare the elements for
++playback and the elements will prepare their internal data structures. After
++this state change is successful, nearly all elements are done with their setup.
++
++
++GST_STATE_PAUSED to GST_STATE_PLAYING
++
++The major difference between these two states is that in the playing state
++data is processed. Therefore the two major things happening here are the
++schedulers finishing their setup and readying their elements to run and the
++clocking subsystem starting the clocks. After this state change succeeded
++elements' processing function may finally be called.
++
++
++capabilities (or short: caps) and negotiation
++
++"Caps" are the format descriptions of the data passed. A caps is a list of
++structures. Each structure describes one "mime type" by n properties and its
++name. Note that "mime type" is used escaped because there is no 1:1 mapping
++between GStreamer caps names and real world mime types though GStreamer tries
++to orient itself at those. Properties are either fixed values, ranges or lists
++of values. There's also two special caps: any and empty.
++The mathematicians reading this should think of caps as a mathematical set of
++formats that is a union of the formats described in every structure. The
++GStreamer core provides functions to union, intersect and subtract caps or
++test them for various conditions (subsets, equality, etc).
++The negotiation phase works as follows: Both pads figure out all possible caps
++for themselves - most of the time depending on caps on other pads in the
++element. The core then takes those, intersects them and if the intersection
++isn't empty fixates them. Fixation is a process that selects the best possible
++fixed caps from a caps. A fixed caps is a caps that describes only one format
++and cannot be reduced further. After both pads acdepted the fixed caps, its
++format is then used to describe the contents of the buffers that are passed on
++this link. Caps can be serialized and deserialized to a string representation.
++[Add: a medium complex caps description (audioconvert?)]
++
++
++
++
++
++
++1. Mplayer media player - http://www.mplayerhq.hu
++2. Xine media player - http://xine.sourceforge.net
++3. Rhythmbox audio player - http://web.rhythmbox.org
++4. Totem video player - http://hadess.net/totem /* FIXME? */
++5. Marlin sample editor - http://marlin.sourceforge.net
++6. /* FIXME */
++7. Fluendo - http://www.fluendo.com
++8. gst-sci - /*FIXME */
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/company/push-vs-pull gstreamer-0.10.23/docs/random/company/push-vs-pull
+--- gstreamer-0.10.23.orig/docs/random/company/push-vs-pull 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/company/push-vs-pull 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,40 @@
++PUSH vs PULL
++
++(This is a writedown of ideas I plan to update whenever I find issues. This
++should be fleshed out when doing the threadsafety / buffer passing changes.)
++
++GStreamer allows 3 different forms of elements:
++- loopbased:
++Loopbased elements may push and pull from every pad however they want. They're
++therefore heaviest on the scheduler and for latency or similar considerations.
++- chainbased:
++Chainbased elements have one sinkpad. Data gets pushed into a function attached
++to the pad. => PUSH based
++- getbased:
++Getbased elements have no sinkpads. Every sourcepad has a getfunction that
++produces data on request. => PULL based
++
++The current problem is that PUSH and PULL based elements are quite limited in
++what they may or may not do (especially PULL based elements). Some libraries
++elements link to might also expect the architecture around them to work in a
++specific way (libogg requires the ogg input to be pull-based, JACK is PULL-based
++on sinks and PUSH-based on sinks). This often requires costly wrapping.
++
++Inside a scheduler cothread switches can be avoided (which makes the pipeline
++faster and scheduling less error-prone) if a PUSH-based element is connected on
++the push-side of the pipeline. (Same goes with PULL-based on the pull-side). So
++a pipeline with elements like "pull-pull-loop-push" works without cothread
++switches while a pipeline like "push-loop-pull" needs 2. Even "push-pull" needs
++one.
++
++I'm under the impression that push-vs-pull is often best decided by the
++application in use. (Video players probably prefer PULL because they display on
++demand, live recorders prefer PUSH.) Since many elements probably don't care if
++they're PUSH or PULL based it would be nice if an element could implement both
++and use whatever suits better. (The code to achieve this should obviously be
++abstracted into superclasses like videofilter.)
++
++
++references:
++MPlayer (http://www.mplayerhq.hu) - push-based architecture on version 1,
++ switching to PULL-based on version 2.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/company/tagging gstreamer-0.10.23/docs/random/company/tagging
+--- gstreamer-0.10.23.orig/docs/random/company/tagging 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/company/tagging 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,104 @@
++Quoting iain <iain@prettypeople.org>:
++
++> If you could write a small thing about how to use the tagging, it'd be
++> appreciated. I think MArlin is going to be using it pretty extensivly,
++> and so it'd be nice to get it in there and tested quickly.
++>
++Ok. A short writeup.
++
++
++Oh! Intro - Jellyman, offspring. Offspring, Jellyman.
++
++GStreamer manages tags in the form of GstTagList objects. A GstTagList (named
++taglist from now on) consists of zero or more different tags (this will be
++what I mean when I say tag) where each tag has one or more values attached to
++it. A tag is registered via gst_tag_register with it's name, translated name
++(glib calls that nick), a translated description, the GType values for this
++tag must have and an optional merge function.
++GStreamer provides default caps which are registered in gsttag.c. You can look
++them up there.
++
++
++You've got serious thrill issues, dude.
++
++A taglist is primarily thought about as a 1:1 tag:value mapping. Sometimes it
++is useful to have multiple values for the same tag however. (Multiple artists
++performing a song). If a merge function is provided at tag registration time,
++you can attach multiple values to a tag. These values are handled as an
++ordered list, so you can access each of them with an index. The merge function
++allows to merge all of them back into a single value.
++If no merge function is provided, only a single value is kept.
++
++
++Tell me, Dory, do you see anything? - Yeah, I see a light.
++
++There's a whole lot of API provided to change taglists. see gsttag.h for the
++whole glory. Most of that should be self explaining. Foreach functions, number
++of values per tag, getting tags and so on. The gst-launch code shows a usage
++example. The only thing that might be of interest is the merge mode. If you
++merge two tag lists (via _merge or _insert or even when only adding values via
++_add_tag) you have to provide a merge mode. The merge mode decides how to
++handle the merging of caps. If you merge new_tags into old_tags, the different
++merge modes do this:
++GST_TAG_MERGE_MODE_REPLACE_ALL: Remove all tags from old_tags, use only
++new_tags.
++GST_TAG_MERGE_MODE_REPLACE: Remove all tags from old_tags where tags from
++new_tags are available. Keep the others. Insert everything from new_tags.
++GST_TAG_MERGE_MODE_PREPEND: Prepend values from new_tags to the values from
++old_tags. For single value tags when both are set, use the new_tags tag.
++GST_TAG_MERGE_MODE_APPEND: Same as GST_TAG_MERGE_MODE_PREPEND with new_tags
++and old_tags swapped.
++GST_TAG_MERGE_MODE_KEEP: Same as GST_TAG_MERGE_MODE_REPLACE with new_tags and
++old_tags swapped.
++GST_TAG_MERGE_MODE_KEEP_ALL: Same as GST_TAG_MERGE_MODE_REPLACE_ALL with
++new_tags and old_tags swapped.
++This allows some powerful usage of taglists. I'll describe further down where
++it really makes sense.
++
++
++Now what?
++
++There are supposed to be two "producers" of taglists. The first are
++applications, the second are plugins. (In my tag world domination plans I
++simply assumed Rhythmbox would start using taglists internally.) Applications
++can easily create and access them with the API shown above. It should even be
++reasonably easy to put their values inside gtk objects via foreach loops and
++similar. Especially because they're all just GValues internally.
++Plugins extract tag lists from the GstBuffer data. They'll have to convert it
++to taglists obviously. (If you write plugins, please make sure to use the same
++mapping than other plugins that use the same format. Mappings and plugins for
++common tagging formats are kept in gst-plugins/gst/tags/* ) Once they have
++extracted the taglist, they signal they have found tags via the "found-tag"
++signal. After that they create a tag event and send that down the pipeline.
++There are convenience functions for this. See code that implements this.
++
++
++Oh, look at me, I'm a flippy little dolphin, let me flip for you!
++
++There are also supposed to be two "consumers" of taglists. Applications and -
++you guessed it - plugins. Applications obviously want to show the tags of the
++playing pipeline or store tags for a given file, use them as the basis for
++editing or whatever.
++Plugins that can set tags implement the GstTagSetter interface. Don't let
++yourself be fooled by the fact that this interface is an empty interface. Your
++plugin still has to do something. ;) The interface provides a way to attach
++tags to elements implementing the interface. Whenever the interface wants to
++write tags it has to do the following:
++1) Get the tags from the pipeline that you want to write. (This obviously
++includes storing tags that came in via tag events.)
++2) Merge the user set tags into these tags with the user set merge mode. This
++is the place where the merge mode allows all te flexibility you may want:
++adding tags, adding values to tags, overwriting all tags or overwriting only
++some tags.
++3) Write these tags to the buffer.
++
++
++Hey! You guys made me ink!
++
++I hope this exciting little intro answered some of your questions. If not, ask
++more specific questions next time, please. :)
++
++
++Benjamin
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/company/time gstreamer-0.10.23/docs/random/company/time
+--- gstreamer-0.10.23.orig/docs/random/company/time 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/company/time 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,39 @@
++Time in Gstreamer
++
++When talking about time in streams (or "clocking"), people often confuse 3
++different things that need to be treated seperately. Older designs in GStreamer
++confused those and this made it difficult to design solutions for time
++management.
++
++1) clock time
++There are many clock providers in GStreamer. In normal circumstances there is
++only one clock, commonly referred to as the system clock. But in the GStreamer
++case there are others - like a sound card. If a sound card claims to output
++44100 samples/sec, one second in the sound cards clock has elapsed when 44100
++samples have been processed. If a webcam claims to deliver 25 pictures/sec a
++second has elapsed after processing 25 pictures. This concept is useful in
++starvation cases - when you use the clock of the sound card and due to high
++load (or the hard disc of your laptop needing to start spinning again to read
++in an mp3) no samples are processed, the clock does not advance. A system clock
++would merrily go on ticking and make your song jump.
++
++2) element time
++Some elements need to know when to output a buffer. Therefore buffers have
++timestamps. But there needs to be a way those timestamps to the time reported by
++clocks. This is were element time comes in. GStreamer takes transparently care
++of this by remembering at what clock time you set your element to PLAYING and
++computes the time that has passed since then automatically. It takes care of the
++PAUSE state, too. There is even a way to adjust the time in the case of a
++discontinuity event (which most likely happens after seeking).
++
++3) synchronization
++It is a common case (especially in video playback) that people want to
++synchronize two elements (audio and video output), so that they report the same
++time. This is an unsolved problem in GStreamer and is only handled implicitly.
++To aid in this, clocks have "clock events". An event happens when an element
++does something, for example changing states. Because people want to set the
++states of multiple elements at once, but computers serialize everything, the
++actual state setting on the elements is serialized, too. If however such events
++happen shortly after each other, GStreamer assumes they were meant to happen at
++the same time and handles this as such.
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/draft-missing-plugins.txt gstreamer-0.10.23/docs/random/draft-missing-plugins.txt
+--- gstreamer-0.10.23.orig/docs/random/draft-missing-plugins.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/draft-missing-plugins.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,7 @@
++This document has moved to gstreamer/docs/design/draft-missing-plugins.txt.
++
++It can be found online at
++http://webcvs.freedesktop.org/gstreamer/gstreamer/docs/design/draft-missing-plugins.txt?view=markup
++
++Also see:
++http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstbaseutilsinstallplugins.html
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ds/0.9-planning gstreamer-0.10.23/docs/random/ds/0.9-planning
+--- gstreamer-0.10.23.orig/docs/random/ds/0.9-planning 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ds/0.9-planning 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,165 @@
++
++
++
++Scheduling:
++
++ - remove loop/get/chain from GstElement and add a "iterate" method.
++ The iterate method is called with the event (or events) that
++ triggered it, performs some action, and resets the events (file
++ descriptors becoming readable, semaphores, pads becoming readable
++ or writable, or a time occurs).
++
++ - Add GstLoopElement, GstChainElement, etc. for compatibility.
++
++ - Remove existing state handling and create 2 states, "playing" and
++ "stopped". "playing" means that the iterate() method of the
++ element may be called, that is, the element is allowed to move
++ buffers, negotiate, etc. "stopped" means that no gstreamer-ish
++ things happen to an element, only gobject-ish. A separate
++ reset() method will handle the difference between READY and NULL.
++
++ - Add a flag "ready" to GstElement that is under the control of the
++ element. If the element is ready to stream, it sets this flag,
++ and the entire pipeline starts streaming. (This is basically
++ the difference between PAUSED and PLAYING.) For example, osssink
++ won't set the ready flag until the device is opened and there is
++ a buffer available to write to the device.
++
++ - Scheduling of elements and movement of buffers will be timed by
++ clocks.
++
++
++
++Example #1:
++
++ Pipeline: sinesrc ! osssink
++
++ - The application creates the pipeline and sets it to "playing".
++
++ - The clock is created and set to "paused".
++
++ - sinesrc.iterate() decides to watch for the event "src pad
++ negotiation" and sets the available caps on the pad.
++
++ - osssink.iterate() opens device, determines available caps, and
++ sets the available caps on the pad. Then it decides to wait for
++ "sink pad negotiation".
++
++ - The scheduler realizes that the two elements are waiting for
++ negotiation, so it negotiates the link.
++
++ - sinesrc.iterate() sets the "ready" flag (because it needs no more
++ preparation to stream) and decides to watch for the event "src
++ pad ready to accept buffer".
++
++ - osssink.iterate() decides to watch for the event "sink pad has
++ available buffer".
++
++ - The scheduler realizes that sinesrc.srcpad is now ready, so it
++ calls sinesrc.iterate()
++
++ - sinesrc.iterate() creates a buffer and pushes it, and decides to
++ wait for the same event.
++
++ - The scheduler realizes that osssink.sinkpad now has a buffer, so
++ it calls osssink.iterate().
++
++ - osssink.iterate() is now ready to stream, so it sets the "ready"
++ flag and waits for "time 0".
++
++ - The pipeline is now completely ready, so the clock may be
++ started. A signal is fired to let the application know this
++ (and possibly change the default behavior).
++
++ - The clock starts with the time 0. The scheduler realizes this,
++ and decides to schedule osssink.
++
++ - osssink.iterate() is called, and writes the buffer to the device.
++ This starts the clock counting. (Actually, the buffer could be
++ written by the clock code, since presumably the clock is related
++ to osssink.) iterate() then waits for "sink pad has available
++ buffer".
++
++ We're now basically in streaming mode. A streaming cycle:
++
++ - osssink.iterate() decides the audio output buffer is full enough,
++ so it waits for "time X", where X is the time when the output
++ buffer will be below some threshold.
++
++ - osssink.iterate() waits for "sink pad has available buffer"
++
++ - sinesrc.iterate() creates and pushes a buffer, then waits for
++ "src pad ready".
++
++
++ Further ideas:
++
++ - osssink can set a hard deadline time, which means that if it is
++ not scheduled before that time, you'll get a skip. Skipping
++ involves setting osssink to "not ready" and pauses the clock.
++ Then the scheduler needs to go through the same process as above
++ to start the clock.
++
++ - As a shortcut, osssink can say "I need a buffer on the sinkpad
++ at time X". This information can be passed upstream, and be used
++ in filters -- filter.sinkpad says "I need a buffer at time X-N",
++ where N is the latency of the filter.
++
++
++Example #2:
++
++ Pipeline: osssrc ! osssink
++
++ - The application creates the pipeline and sets it to "playing".
++
++ - The clock is created and set to "paused".
++
++ - negotiation happens roughly as in example #1, although osssrc
++ additionally opens and prepares the device.
++
++ - osssrc.iterate() sets the "ready" flag (because it needs no more
++ preparation to stream) and waits for "time 0", since it presumably
++ can't wait for the file descriptor (audio input hasn't been
++ enabled on the device yet.)
++
++ - osssink.iterate() decides to watch for the event "sink pad has
++ available buffer".
++
++ - The scheduler realizes the deadlock and (somehow) tells osssink
++ that it can't pre-roll. (This needs more work) In other words,
++ osssink can't be the clock master, but only a clock slave.
++
++ - osssink.iterates() agrees to start at time SOME_LATENCY, sets the
++ "ready" flag, and waits for a buffer on its sink pad.
++
++ - The pipeline is now completely ready, so the clock may be
++ started. A signal is fired to let the application know this
++ (and possibly change the default behavior).
++
++ - The clock starting causes two things to happen: osssrc starts
++ the recording of data, and osssink starts the outputting of data.
++ The data being output is a chunk of silence equal to SOME_LATENCY.
++
++ - osssrc.iterate() is called for "time 0", does nothing, and waits
++ on the file descriptor (via the scheduler, of course). All waiting
++ on file descriptors should have an associated timeout.
++
++ - osssrc.iterate() is called when the file descriptor is ready,
++ reads a chunk of data, and pushes the buffer. It then waits for
++ its file descriptor to be ready.
++
++ - osssink.iterate() is called
++
++
++Evil:
++
++ fakesrc ! tee ! fakesink tee0. ! never_accept_a_buffer_sink
++
++ sinesrc ! osssink videotestsrc ! ximagesink
++
++ fakesrc ! fakesink (pausing)
++
++ sinesrc ! identity ! osssink
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ds/0.9-planning2 gstreamer-0.10.23/docs/random/ds/0.9-planning2
+--- gstreamer-0.10.23.orig/docs/random/ds/0.9-planning2 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ds/0.9-planning2 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,129 @@
++
++plans:
++
++ - The primary object that applications deal with is a GstPipeline. A
++ given pipeline is connected to a particular main loop (GMainLoop for
++ glib, etc.). Calls to gst_ functions for objects owned by that
++ pipeline must be done from the context of the pipeline's main loop.
++ Signals fired by elements are marshalled in the pipeline's main
++ loop.
++
++ Notably, this means the gst_ API is not necessarily thread-safe.
++ However, it is safe to operate on different GstPipelines from
++ different threads. This makes it possible, for example, for
++ rhythmbox to play music and gather metadata from different threads
++ using different pipelines. Likewise, it's also possible to do
++ both in the same thread.
++
++ - The primary method of scheduling an element is through a generic
++ 'iterate()' method. The iterate method explicitly tells the core
++ what it is waiting for (a specific time, pads to have available
++ data, etc.), and the core calls the iterate method when these
++ "triggers" happen. GstElement subclasses will be created to
++ emulate 0.8-style get/chain/loop methods. Existing elements will
++ be converted to the new subclasses rather than implement the
++ iterate method directly, unless there is a compelling reason to
++ do so. Iterate implementations are expected not to block, ever.
++
++ Rationale: This makes it possible to create completely non-blocking
++ elements.
++
++ - Scheduling elements will be done in either a threaded or
++ non-threaded way. The idle handler that is called by a pipeline's
++ main loop determines which elements are ready to be iterated
++ (based on their triggers), and puts them into a ready queue. In
++ the non-threaded case, the idle handler then calls the iterate()
++ method on each element in the ready queue. In the threaded case,
++ additional helper threads (which are completely owned by the
++ pipeline) are used to call the iterate methods.
++
++ Note that in the threaded case, elements may not always be run
++ in the same thread.
++
++ Some elements are much easier to write if they run in the same
++ thread as the main loop (i.e., elements that are also GUI widgets).
++ An element flag can be set to make the manager always call the
++ iterate method in the manager context (i.e., in the main loop
++ thread). Also, elements like spider need to make core calls
++ which may not be allowed from other threads.
++
++ Rationale: Doing all bookkeeping in a single thread/context makes
++ the core code _much_ simpler. This bookkeeping takes only a
++ minimal amount of CPU time, less than 5% of the CPU time in a
++ rhythmbox pipeline. There is very little benefit to spreading
++ this over multiple CPUs until the number of CPUs is greater than
++ ~16, and you have _huge_ pipelines. Also, a single-threaded
++ manager significantly decreases the number of locks necessary
++ in the core, decreasing lock contention (if any) and making it
++ easier to understand deadlocks (if any).
++
++ - There are essentially two types of objects/structures. One type
++ includes objects that are derived from GObject, and are passed in
++ function calls similarly to gtk. The other type includes objects
++ (structures, really) that are not reference counted and passed
++ around similar to how GstCaps works in 0.8. That is, functions
++ that take 'const GstCaps *' do not take ownership of the passed
++ object, whereas functions that take 'GstCaps *' do. Similar is
++ true for return values.
++
++ - The concept of GstBuffer from 0.8 will be split into two types.
++ One type will focus solely on holding information pertaining to
++ ownership of a memory area (call this GstMemBuffer), and the
++ other type will focus solely in transfering information between
++ elements (call this GstPipeBuffer). In case you get confused,
++ GstMemBuffers _are not_ transferred between elements, and
++ GstPipeBuffers _do not_ own the memory they point to.
++
++ In general, GstPipeBuffers point to (and reference) a GstMemBuffer.
++ GstMemBuffers are GObjects. GstPipeBuffers are structs, like
++ GstCaps. GstPipeBuffers have timestamps, durations, and flags.
++ GstMemBuffers contain read/write flags. There are no subbuffers
++ for either type, because they are not necessary. Essentially,
++ GstPipeBuffers completely replace the concept of subbuffers.
++
++ (I'd like to continue to use the name GstBuffer for GstPipeBuffers,
++ since its usage is much more common in elements.)
++
++ Rationale: Memory regions need an ultimate owner and reference
++ counting. However, chunks passed around between elements need
++ to be small and efficient. These goals are non-overlapping and
++ conflicting, and thus are inappropriate to be combined in the
++ same class.
++
++ - Core objects should have very few (if any) public fields. This
++ means that accessor macros will all be eliminated and replaced
++ with accessor functions.
++
++ Rationale: This makes it possible to change the core more during
++ an ABI-stable series.
++
++ - Remove pluggable scheduling.
++
++ Rationale: We need one good scheduler. Having multiple schedulers
++ is directly opposed to this goal.
++
++ - 0.8-style element states are split up. One state (AppState)
++ indicates what the application wants the element to be doing,
++ and is completely under the control of the application. The
++ other state (ElementState) indicates what the element is actually
++ doing, and is under control of the element. If the application
++ wants an element to pause, it sets the AppState to PAUSED, and
++ the element eventually changes its ElementState to PAUSED (and
++ fires a signal). If the element has an error or EOS, it sets
++ its ElementState to SOME_STATE and fires a signal, while the
++ AppState remains at PLAYING. The actual number and descriptions
++ of states has not been discussed.
++
++ Rationale: It's pretty obvious that we're mixing concepts for
++ elements states in 0.8.
++
++ - getcaps() methods will be replaced by an element_allowed_caps()
++ field in the pad. The primary reason for this is because
++ renegotiation only needs to happen when circumstances change.
++ This is more easily done by a field in GstPad and notification
++ of peers when this changes.
++
++ Somewhere, there's a document I wrote about completely redoing
++ caps.
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ds/0.9-suggested-changes gstreamer-0.10.23/docs/random/ds/0.9-suggested-changes
+--- gstreamer-0.10.23.orig/docs/random/ds/0.9-suggested-changes 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ds/0.9-suggested-changes 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,122 @@
++
++
++API:
++
++ - MAKE A DOCUMENT THAT LISTS ALL API CHANGES AND HOW TO DEAL WITH THEM
++
++ - replace object/structure set/get macros with actual functions.
++
++ - reorganize headers (split app headers vs plugin headers maybe)
++ while at it also make sure to only allow including of the main headers like
++ glib, so we can freely shuffle stuff around
++
++ - make GstPadLinkReturn internal (to either plugins+core or just core)
++ and return gboolean to apps.
++
++ - rewrite GstIndex (it's gross)
++
++ - gst_init() et al. need to work correctly when called multiple times
++ and from libraries, etc.
++
++ - gst_pad_get_pad_template_caps -> gst_pad_get_template_caps()
++
++ - make templates mandatory for pads.
++
++ - force pads to use a pad template from the element they belong to.
++
++ - s/PadTemplate/PadFactory/ to describe better what it is and be more in line
++ with the rest of the API?
++
++ - add ways for autopluggers to manage negotiation of their children.
++ This would allow autopluggers to no longer need helper identities.
++ (Though the main reason for identities atm is to be able to connect without
++ plugging - Company)
++
++ - read/write locks on buffers
++
++ - be able to send events to unlinked pads (bug #114442)
++
++ - caps should have a flag on fields to indicate that the field is optional
++
++ - fakesrc handoff should be changed to return a GstData * or carry a
++ GstData **, wo the user can provide own buffers and events.
++
++ - don't install gstmarshal.h
++
++ - make sure GstClockTime is used wherever it should (e.g. gstplay)
++
++ - make gst_bin_get_list virtual so subclasses can override it (e.g.
++ gst-play which contains an internal thread not inside the bin that is
++ gstplay)
++ - make gst_bin_get_by_interface search on the list provided by this get_list
++ so that you can search a GstPlay for an element implementing the interface
++ (right now gstplay has added a gst_play_get_by_interface)
++
++ - make multichannel properties on audio caps manditory
++
++ - talk to vektor about various wierdness with NTSC video (combinations of
++ 24 fps pulled down to 60 and straight video, etc) and make sure our
++ video stream descriptions make sense.
++
++ - do an audit to remove GtkObject-isms from gtk-1.2
++
++caps:
++
++ (Company:)
++
++ "An idea I had once was to force registration of mimetypes and then
++ only allow caps with a registered mimetype - like it's done now with caps.
++ You could then add functions to those registrations like
++ - gchar *get_human_readable_string (caps);
++ should be kinda selfexplanatory. Would return stuff like "16bit signed
++ integer audio", "MPEG2 video" or "video format in RGB colorspace" (for
++ unfixed RGB)
++ - GstCaps *default_fixate (const GstCaps *caps);
++ A default fixation function, so we don't fixate to minimum integer
++ anymore but have the ability to fixate to 320x240 for video or 44100 for
++ audio rates
++ - gboolean validate (const GstCaps *caps);
++ check if the given caps are ok for this mimetype - debugging only function
++ I'd _really_ like to have - especially during gst_register.
++
++ But that's 0.10 material."
++
++ (Thaytan)
++ - Add rowstride as a property so that video frames don't have to have
++ rowstride == width. For example, gdkpixbufdec would prefer to pad
++ rowstrides to multiples of 4 bytes.
++
++negotiation:
++
++- autopluggers would be easier to write if there was a core method
++ to do what plugidentities do.
++
++- there should be a way to hook into negotiation and be able to do something if
++ negotiation fails. Autopluggers would need that for exchanging elements when
++ they can't link.
++
++bugs with interesting info:
++
++ XML descriptions of plugin information:
++ http://bugzilla.gnome.org/show_bug.cgi?id=114216
++
++
++object hierarchy:
++- a method for elements to know when downstream elements are ignoring
++ the data stream. This would allow automatic shutoff of pipelines
++ whose processing is being dumped.
++
++- object properties:
++ - all bitrates should be bits per second, since they're specified
++ as integers
++ - use device for nodes (not location; dvdreadsrc, dvdnavsrc, cdparanoia).
++ Also figure out if we want to continue separating uri/location.
++
++- categorization of plugins:
++ - categories were intended from the start as a list of keywords, instead
++ of an implicit tree.
++ - this makes a lot more sense and probably fixes our constant discussion
++ about categorizing
++ - make this explicit by having a list of keywords instead of a fixed string
++ with slashes
++ - fix the editor/el browser to display this nicely
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ds/buffer_locking gstreamer-0.10.23/docs/random/ds/buffer_locking
+--- gstreamer-0.10.23.orig/docs/random/ds/buffer_locking 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ds/buffer_locking 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,30 @@
++
++
++Buffers should have readlocks and writelocks to enforce
++GST_BUFFER_DONTKEEP and relax the restriction that buffers with
++multiple refcounts are read-only.
++
++
++
++Example:
++
++ videotestsrc ! ximagesink
++
++ videotestsrc requests a buffer from its src pad
++
++ ximagesink creates a buffer (refcount:1 readlock:0 writelock:0)
++
++ videotestsrc writelocks it (refcount:1 readlock:0 writelock:1)
++
++ videotestsrc writes to the buffer
++
++ videotestsrc un-writelocks it (refcount:1 readlock:0 writelock:0)
++
++ ximagesink readlocks it (refcount:1 readlock:1 writelock:0)
++
++ ximagesink writes it to the screen
++
++ ximagesink un-readlocks it (refcount:1 readlock:0 writelock:0)
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ds/bufferpools gstreamer-0.10.23/docs/random/ds/bufferpools
+--- gstreamer-0.10.23.orig/docs/random/ds/bufferpools 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ds/bufferpools 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,57 @@
++On Thu, Jan 08, 2004 at 04:10:00PM +0100, Julien MOUTTE wrote:
++>
++> Hi David,
++>
++> I'd like to implement bufferpools again in x[v]imagesink asap.. Could
++> you please point me to a template/doc on how to do that ?
++>
++> The best for me would be a simple testcase showing how to use the buffer
++> free methods to replace bufferpools.
++
++
++x[v]imagesink should call gst_pad_set_bufferalloc_function() on
++their sink pads with a bufferalloc implementation. This bufferalloc
++function is to allocate buffers that _peers_ will send _to_ that pad.
++
++A trivial version of a bufferalloc function, i.e., one that just
++allocates normal buffers:
++
++static GstBuffer *
++gst_ximagesink_sink_bufferalloc (GstPad *pad, guint64 offset, guint
++size)
++{
++ GstBuffer *buffer;
++
++ buffer = gst_buffer_new_and_alloc (size);
++ GST_DATA_FREE_FUNC (data) = gst_ximagesink_buffer_free;
++ GST_BUFFER_POOL_PRIVATE (data) = ximagesink; /* whatever */
++
++ return buffer;
++}
++
++static void
++gst_ximagesink_buffer_free (GstData *data)
++{
++ g_free (GST_BUFFER_DATA (data));
++}
++
++The hard part is going through each element, and every time it
++allocates a buffer using gst_buffer_new_and_alloc () that is then
++sent to a sink pad, the call should be replaced with
++gst_pad_alloc_buffer (sinkpad, offset, size).
++
++
++
++dave...
++
++
++
++-------------------------------------------------------
++This SF.net email is sponsored by: Perforce Software.
++Perforce is the Fast Software Configuration Management System offering
++advanced branching capabilities and atomic changes on 50+ platforms.
++Free Eval! http://www.perforce.com/perforce/loadprog.html
++_______________________________________________
++gstreamer-devel mailing list
++gstreamer-devel@lists.sourceforge.net
++https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ds/caps gstreamer-0.10.23/docs/random/ds/caps
+--- gstreamer-0.10.23.orig/docs/random/ds/caps 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ds/caps 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,81 @@
++
++
++Problem #1:
++
++ How does the core allow the application to choose appropriate
++ caps in the following cases:
++
++ videotestsrc ! xvimagesink
++
++ videotestsrc ! identity ! xvimagesink
++
++ videotestsrc ! videoscale ! xvimagesink
++
++ Goals:
++
++ - Give the application a clear overview of the formats available
++ and the elements involved.
++
++ - Provide reasonable defaults in as many cases as possible.
++
++ - Allow specialized elements to suggest reasonable defaults.
++
++
++
++Problem #2:
++
++ How does the API express to an autoplugger what an element does?
++
++ Currently, "colorspace" and "videoscale" have approximately the
++ same pad template caps. Until the autoplugger plugs and looks,
++ it has no way to determine that colorspace changes format, and
++ videoscale changes size.
++
++
++
++Problem #3:
++
++ How do we properly handle codec metadata?
++
++ Solution #3a:
++
++ Stream initialization event. This event would be held by all
++ src pads, and pushed to sink pads upon connection, and would
++ flow downstream.
++
++ Solution #3b:
++
++ Put a buffer in the caps.
++
++
++Problem #4:
++
++ (Related to #1) How does one specify that a converter should limit
++ it's conversion? I.e., audioconvert to not change number of channels,
++ or audioscale upsample by 20%. Basically, this means caps based on
++ other caps.
++
++ Solution #4a:
++
++ One can put a converter element into a special bin:
++
++ specialbin.( specialidentity ! converter ! specialidentity )
++
++ Specialbin can then interfere with caps negotiation all it wants.
++
++
++Problem #5:
++
++ (Related to #3) How do we specify stream format information that
++ is non-critical and optional, such as pixel aspect ratio on raw
++ video?
++
++Problem #6:
++
++ How do we specify the difference between nominal values and actual
++ values, such as video frame rate? The actual frame rate may not
++ correspond to the nominal frame rate in the caps, and often a guess
++ is listed.
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ds/categories gstreamer-0.10.23/docs/random/ds/categories
+--- gstreamer-0.10.23.orig/docs/random/ds/categories 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ds/categories 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,50 @@
++
++Element Categories:
++-------------------
++
++
++Decoder:
++
++
++Encoder:
++
++
++Converter:
++ A converter has one or more source pads and one or more sink pads.
++ Converter pads may have different caps templates. Converters are
++ expected
++
++
++Filter:
++ A filter has one source and one sink pad. These pads have the same
++ caps and (thus) the same caps template.
++
++ Filters generally do not handle events.
++
++ Filters may have interfaces.
++
++ Filters are generally not autoplugged unless they have interfaces.
++
++
++Source:
++ A source has one source pad and no sink pads.
++
++ Sources usually handle events.
++
++ Sources may have interfaces.
++
++ Sources are not autoplugged.
++
++Sink:
++ A sink has one sink pad and no source pads.
++
++ Sources usually handle events.
++
++ Sources may have interfaces.
++
++ Sinks are not autoplugged.
++
++
++
++Converter/Colorspace
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ds/element-checklist gstreamer-0.10.23/docs/random/ds/element-checklist
+--- gstreamer-0.10.23.orig/docs/random/ds/element-checklist 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ds/element-checklist 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,43 @@
++
++This is a list of things to check in elements.
++
++
++
++1. Add a "Element-Checklist-Version: 1" comment
++
++This comment is to indicate which items on this checklist have been
++checked, so that future checkers can skip things that you've already
++carefully checked. This number should obviously be updated whenever
++you do additional checks. Ideally, you should not do checks out of
++order, but using "1, also 4-6" is acceptable.
++
++
++2. Each pad should have a pad template
++
++Create and register a pad template to the element class.
++
++
++3. config.h
++
++Make sure that each .c file includes config.h (conditionally on
++HAVE_CONFIG_H). Make sure that each .h file does _not_ include
++config.h.
++
++4. src event handling
++
++Every element having multiple sink pads or having a specific need to handle
++src events in a different manner than the default event handler should do that
++correctly. Correctly means that :
++
++- It should not leak the event if it is handled (gst_event_unref)
++- It should call return gst_pad_event_default (pad, event) for all non handled
++localy events. Otherwise it breaks navigation, seeking, etc...
++- it should return a TRUE/FALSE boolean if the localy handled event was handled.
++
++
++
++
++other ideas:
++
++- plugins should avoid using gst_caps_to_string() in debug statement.
++ They should use %"GST_PTR_FORMAT" instead. Check all usage for leaks.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ds/negotiation gstreamer-0.10.23/docs/random/ds/negotiation
+--- gstreamer-0.10.23.orig/docs/random/ds/negotiation 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ds/negotiation 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,268 @@
++
++
++Properties:
++
++ "template_caps"
++ The union of all possible caps that a pad might have in any
++ condition. Is a class property, and doesn't change over the
++ life of an object. Set by the element during class init.
++
++ "internal_caps"
++ The caps that the element will allow on a pad, given its current
++ state and the external_caps of all the other pads of the element.
++ Set by the element.
++
++ "external_caps"
++ The caps representing what the core will allow on a pad. This is
++ a combination of the peer's allowed caps, and filtering caps, and
++ any in-process negotiation restrictions. Set by the core.
++
++ "negotiated_caps"
++ The format that the element will use. Set by the core.
++
++ "filter_caps"
++ The caps intersected with everything else during negotiation. Set
++ by the application.
++
++ "negotiable"
++ A boolean that indicates that the pad is ready to negotiate. Set
++ by the element.
++
++
++
++Negotiation steps, from the element perspective:
++
++ - During object initialization, an element must set template_caps
++ and allowed_caps for each pad.
++
++ - In response to changes in the internal state of the element or in
++ the peer_allowed_caps of any other pad owned by the element, the
++ element should update allowed_caps of a pad.
++
++ - Pads are initially created with negotiable as FALSE. When an
++ element wants to indicate that negotiation is allowable, it should
++ set negotiable to TRUE.
++
++ - In response to a negotiate signal, an element should copy the caps
++ in "allowed_caps" to "negotiated_caps", and extract any information
++ needed to handle the format. At this point, "allowed_caps" is
++ guaranteed to be fixed.
++
++
++Negotiation steps, from the core perspective:
++
++
++
++
++
++
++
++<ds> I'd like to split it up into manageable "projects"
++<ds> hopefully some of which we can recruit others to do
++<Company> i'd like a decision about if we drop threads
++<ds> in what sense?
++<ds> threads being not required?
++<Company> threads being not part of the API
++<ds> or threads being not used
++<Company> so no thread safety considerations
++<ds> I would like threads to not be part of the API
++<ds> requiring apps/plugins to be written thread-safely is insane
++<Company> the question is this: If someone calls gst_element_set_state (element, state), does he have to marshal it into the correct thread himself or not?
++<ds> no
++<ds> reason being: we already have to deal with subthreads
++<ds> we == the core
++<Company> then you'll have a lot of problems
++<Company> i'd like to just drop subthreads and be done with it
++--> StyXman (~mdione@200.59.114.71) has joined #gstreamer
++<ds> and run everything in one thread?
++<Company> yes
++<Company> schedulers are free to use threads though
++<ds> this is obviously a retreat
++<Company> right
++<ds> but perhaps a strategic one
++<Company> otherwise you have to guarantee that you get no races
++<ds> I've seen this as a viable option for some time
++<Company> there's stuff that just does not work as is currently
++<ds> it always seemed difficult to convince other people that it's the right thing to do
++<ds> for example, wtay
++<Company> like setting xwindow ids, changing states or app-events
++<Company> like seeks
++<-- iain has quit ("leaving")
++<Company> all of this has the typical thread issues currently: it sometimes works and sometimes crashes the app
++<Company> and that's not acceptable to me
++<ds> let's do it
++<Company> if you look at my 0.10 code, I've tried to have GstObjects belong to a "context"
++<ds> this all fits into the idea that I think we should be a lot more like gtk architecturally
++<ds> for example, gtk doesn't have anything like caps negotiation, where elements call each other recursively
++<Company> and have functions ensure they're in the right context or otherwise marshal
++<Company> yes it does
++<ds> ?
++<Company> size requests and allocations
++<ds> but that's more like how I want it -- setting a property and firing a signal telling others that it's updated
++<ds> as i understand it
++<Company> though gtk has the bonus of being a tree which we don't have, we have a directed, maybe cyclic graph
++<Company> and for caps, the graph isn't even directed
++<Company> gtk is far too simple for gst
++<ds> true
++<Company> i can't even come up with an analogy to a video transcoder
++<ds> but we do some relatively simple stuff in a complicated way
++<-- StyXman (~mdione@200.59.114.71) has left #gstreamer
++<Company> like?
++<ds> caps negotiation
++<Company> that's not simple
++<ds> passing around the data should be
++<ds> was it you or thomasvs that wanted to split core headers into app headers and plugin headers?
++<Company> I definitely wanted that
++<Company> app/plugin/registry to be exact
++<ds> registry?
++<ds> for functions that access "internal" stuff?
++<Company> stuff an app normally doesn't touch
++<Company> so we can do something like declare the "app" stuff supported for a longer time
++<ds> oooh, good call
++<ds> I'm sold
++<Company> so, now that threads are gone, what are the biggies I want in 0.10?
++<Company> 1) non-blocking main-loop integrated processing
++<ds> that's rather important if you don't have threads :)
++<Company> right
++<Company> but it works in my gst-01.0 stuff already
++<Company> minus the elements that need to be ported of cause
++<Company> which aren't that many fortunately
++<Company> though some are hard (like gnomevfs), because they have no non-blocking API
++<ds> a subclass of GstElement that fires up a helper thread?
++<ds> (dirty, but it works)
++<Company> probably
++<ds> - autopluggers would be easier to write if there was a core method
++<ds> to do what plugidentities do.
++<Company> no clue how to implement that
++<ds> there's also a note about bins being more involved with negotiation
++<Company> that's the next biggie: 2) fix the negotiation process to allow good autoplugging
++<ds> that was something I thought about last time around
++<Company> bins?
++<ds> that sounds like something I'd work on
++<ds> GstBin
++<Company> the only reason bhins still exist for me is to group elements
++<ds> so that a bin subclass could override how its children are negotiated
++<ds> much like GtkBin, actually
++<ds> and allocation
++<Company> hum
++<Company> how do you solve that issue with links that are only partly inside the bin and partly inside another one?
++<ds> that would be up to the parent (grandparent?)
++<Company> so all links must be in the same toplevel bin?
++<ds> yes
++<ds> isn't that the case currently?
++<ds> probably not checked
++<Company> pfff
++<Company> currently you can do anything
++<ds> heh
++<ds> what about state changes?
++<Company> dunno
++<Company> it's not really important for me
++<Company> apart from the EOS stuff
++<ds> I'd like states to be split into "what state does the app want me to be in" and "what state am I in"
++<ds> with the latter being under control of the element
++<Company> yeah, that'd be nice
++<ds> that way, you don't have multiple people trying to control the state
++<Company> we definitely need to fix EOS
++<Company> i'm not sure how we should handle errors
++<ds> element errors?
++<Company> yeah, if we want to explicitly unset errors or not
++<Company> currently on error the element goes to paused
++<ds> it's easier with actual_state
++<Company> in theory i just set it to PLAYING again and continue?
++<ds> the actual_state goes to PAUSED and fires a signal
++<Company> dunno, maybe actual_state should go to ERROR
++<ds> yeah
++<Company> that'd require gst_element_unset_error though
++<ds> with actual_state, we can add states without thinking too hard
++<Company> but if you can just unset it, why not just do it and continue
++<ds> the app may want to be involved
++<ds> especially to get the error message
++<ds> do we want a separate api section for autopluggers?
++<Company> why would we want that?
++<ds> or make it part of registry
++<Company> maybe s/registry/internal/ or some other name
++<ds> because autopluggers may want to access internal information that we wouldn't expose to apps or plugins
++<ds> could you add gst/gstcompat.c to your arch repo?
++<Company> hm
++<Company> what internal info would an autoplugger need
++<ds> depends
++<ds> whatever replaces plugidentities
++<Company> a simple one (decoder) just needs caps and ranks
++<ds> I meant for negotiation information
++<Company> hm
++<Company> no, i don't want a seperate section for it
++<Company> just put it in "internal", "extended" or whatever
++<ds> ok
++<ds> do we want to plan for the app api to be ABI compatible past 0.10?
++<ds> er, that's silly
++<ds> er, kinda silly
++<Company> API compat
++<Company> you could achieve ABI compat if you expose all objects just as typedefs
++<Company> lemme reboot into linux so i can add gstcompat.c
++<Company> brb
++<-- Company has quit (Read error: 104 (Connection reset by peer))
++--> Company (~Company@pD95D53D9.dip.t-dialin.net) has joined #gstreamer
++--> ploum (~ploum@21-4.CampusNet.ucl.ac.be) has joined #gstreamer
++<-- marv has quit (Read error: 104 (Connection reset by peer))
++<ds> so do you still support caps registration?
++<-- ploum has quit (Client Quit)
++<ds> registering media types, fields, descriptions, and default fixate functions?
++<ds> and validation
++<Company> yes
++<Company> that's an important thing we need
++<Company> otherwise people mess up by either carelessly doing stuff wrong or not understanding what they're supposed to do
++<ds> whose responsibility is it to register these?
++<ds> libgstplugins?
++<ds> a plugin?
++<ds> do we want this info in the registry so that a plugin can automatically be loaded to provide registration for video/x-raw-rgb?
++<Company> haven't really thought about that part yet
++<ds> it's somewhat similar to typefind functions
++<Company> yeah
++--> ultrafunk (~pd@eth779.vic.adsl.internode.on.net) has joined #gstreamer
++<Company> i'd probably have a seperate Factory for caps info
++<Company> and have the system load them when you use the caps info stuff
++<ds> should caps info be manditory?
++<ds> have you synced your repo?
++<Company> i'm trying to, but some commit was interrupted last time...
++<ds> how does one sync a local repository to fd.o?
++<ds> rsync?
++<Company> tla archive-mirror
++<ds> ah
++<Company> see rhythmbox.org => developers for how it works
++<Company> and _never_ press ctrl-c in arch
++<-- Misirlou has quit (Remote closed the connection)
++--> Misirlou (~asdf@c-24-125-118-27.va.client2.attbi.com) has joined #gstreamer
++<ds> is there a reason why a pad might know (and set) allowed_caps, but not be ready to negotiate?
++<Company> i don't know a good one
++<ds> know a bad one?
++<Company> "arch-mirror: unable to acquire revision lock (internal error in archive-pfs.c(pfs_lock_revision))"
++<Company> stupidly ordered code
++<Company> no, don't know one
++<ds> here's a good question:
++<ds> should the core negotiate links in a pipeline that are negotiatable, even though some other links are not negotiatable?
++<ds> this ends up making us negotiate some things multiple times
++<ds> filesrc ! mad ! audioconvert ! audioscale ! osssink
++<Company> the core doesn't know if links are negotiable
++<ds> it will in the future :)
++<Company> sinesrc ! identity ! osssink
++<Company> how does it know if sinesrc ! identity is negotiable?
++<ds> because the allowed_caps on the two pads intersect
++--> marv (~ilovekimm@host-216-76-232-134.hsv.bellsouth.net) has joined #gstreamer
++<ds> I'm pretty sure that I don't want gst_pad_link() to return negotiation errors
++<ds> ever
++<Company> you can't avoid that
++<ds> I want to separate "linkable" from "negotiable"
++<Company> ah, gst_pad_link
++<ds> so you can link videotestsrc ! identity ! osssink
++<Company> i confused it with GstPadLink
++<Company> yeah, i was thinking about that, too
++<ds> vts ! osssink won't link, since the pad templates don't intersect
++<Company> http://web.ics.purdue.edu/~kuliniew/wp/archives/2004/08/07/error-handling/
++<Company> :)
++<ds> right now the vts ! id ! osssink pipeline fails to link
++<Company> yeah
++<Company> and goom ! xvimagesink only fails when xvimagesink is at least READY
++<Company> (assuming your xv can't do RGB)
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ds/registry gstreamer-0.10.23/docs/random/ds/registry
+--- gstreamer-0.10.23.orig/docs/random/ds/registry 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ds/registry 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,15 @@
++
++Ideas for a new registry system:
++
++- each plugin has an associated registry XML file. Each xml file in
++ a plugin directory is loaded to create the in-core registry.
++
++- needed for avidemux:
++
++ <Company> plugin x create some registry information that says stuff like:
++ <Company> "caps x are fourcc FOOO in avi"
++ <Company> or "caps y may be contained in id3 tagged files"
++ <Company> or "caps z is a valid format to put in an ogg container"
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ds/roadmap gstreamer-0.10.23/docs/random/ds/roadmap
+--- gstreamer-0.10.23.orig/docs/random/ds/roadmap 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ds/roadmap 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,79 @@
++
++After some discussion on IRC, I think it's time to propose a
++formal plan for the next 6 months or so to the list.
++
++I think most people are in agreement that we need a period of time
++in which we can focus on improving non-core bits (like elements,
++schedulers, autopluggers, applications, etc.) In the last cycle,
++there was a lot of time spent with a significant number of plugins
++broken, and it's realistic to assume that this could happen again
++in a 0.9 unstable series.
++
++What I propose is:
++
++ - We continue to develop the 0.8.x series as HEAD, with the obvious
++ requirement that all changes be ABI/API compatible.
++
++ - API additions are encouraged, as long as they are well-thought-out.
++
++ - Significant API additions should be developed on a separate branch
++ (not HEAD) to test out any bugs.
++
++In mid-August (or so, in order to coordinate with GNOME-2.8), we have
++two options:
++
++ - Continue with 0.8.x releases, obviously ABI compatible with 0.8.0.
++
++ - or, remove deprecated functions, readjust the padding on structures,
++ perhaps make a few additional ABI changes [1], and quickly go to
++ 0.10.0.
++
++I prefer the latter, although we don't have to decide that until
++later. In either case, there should be no API changes that affect
++more than a bare minimum of elements or applications.
++
++A few things that we won't be able to do without a true unstable
++branch are:
++
++ - using GstStructure for all GstEvents.
++
++ - significant clock changes
++
++ - significant scheduling changes
++
++ - separation of headers into application and plugin headers
++
++ - anything that requires modification of every plugin
++
++There are perils with having HEAD being the stable branch,
++specifically that bugs can creep in and accidentally cause regressions
++in releases. I'm hoping that the introduction of media regression
++testing and also the development of new testsuites will keep this
++to a minimum. Don't forget that accidental bugs that get into
++releases typically cause rude IRC conversations, which we really
++don't need. Please keep the bugs (and the rudeness) to a minimum.
++
++Also, keep in mind that we will have to live with 0.8's unfixable
++bugs for an entire year.[2]
++
++
++
++dave...
++
++--
++[1] I'm thinking about making GstData a subclass of GTypeInstance or
++ GObject.
++[2] But then, 0.6 was 1 year ago, and felt a lot more buggy when it
++ was released.
++
++
++
++-------------------------------------------------------
++This SF.Net email is sponsored by: IBM Linux Tutorials
++Free Linux tutorial presented by Daniel Robbins, President and CEO of
++GenToo technologies. Learn everything from fundamentals to system
++administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
++_______________________________________________
++gstreamer-devel mailing list
++gstreamer-devel@lists.sourceforge.net
++https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/dynpads gstreamer-0.10.23/docs/random/dynpads
+--- gstreamer-0.10.23.orig/docs/random/dynpads 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/dynpads 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,50 @@
++Dynamic pads are pads that are created while the element is playing.
++This means that the element will create a new pas depending on the
++media type it is handling. For example, the mpeg1pdemuxer element will
++create one or more video pads and one or more audio pads depending
++on the number of elementtary streams found in the media stream.
++
++The element will present its dynamic pads with the padtemplate list
++attached to the elementfactory. both the MIME type, direction, presence
++and properties of a pad can be obtained from the elementfactory using
++the padtemplates.
++
++Dynamic pad usually have the presence indicator set to
++GST_PAD_SOMETIMES. This indicated that the pad might become
++available at runtime. When the pad is actually created in the
++element, the element will signal the new_pad signal. This signal can
++then be used to attach a desired (compatible) element to the
++pad.
++
++For certain elements, like a tee and a muxer, we need another pad
++presence flag: GST_PAD_REQUEST. With this flag, the
++elementfactory will announce that some of the pads are available on
++request. For the tee element, for example, one might obtain a new output
++pad by looking up a suitable padtemplate (temp) and performing:
++gst_element_request_new_pad (element, temp). The element will then
++create a new pad from the template (sink or source) and will return
++a handle to it. You can then connect elements to this new pad.
++
++The muxer element (an avi encoder, for example) might expose several
++padtemplates for audio and video. The typical usage pattern for the
++muxer would then be: create a compressor element (JPEG). Get the
++src pad of the compressor, Request a new pad from the element using the
++padtemplate provided by the compressor src pad and connect the
++compressor element to this pad.
++
++An element that can be requested for a new pad has to implement the
++gst_element_request_new_pad method and perform the nessesary steps
++to create a pad from that template.
++
++This interesting behaviour can be extended to ghostpads too. A
++compound element (a bin with internal elements) will also expose some
++padtemplates, either from the internal elements or from itself. Along
++with a new GstGhostPad class, this also solves the naming conflicts
++we might have with the ghostpads. The compound element will override
++the request_new_pad function and figure out which element it needs
++to get a pad from.
++
++Related to this solution: we will move the tee element to the
++gst/elements/ directory because there is no point in having the
++header files anymore. The new pad request API will become a feature
++of gstelement so gsttee becomes a real element too.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ensonic/audiobaseclasses.txt gstreamer-0.10.23/docs/random/ensonic/audiobaseclasses.txt
+--- gstreamer-0.10.23.orig/docs/random/ensonic/audiobaseclasses.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ensonic/audiobaseclasses.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,18 @@
++$Id$
++
++= audio base classes =
++We have gst-plugins-base/gst-libs/gst/audio with some audio helper and base
++classes.
++
++audiofilter: for src_caps=sink_caps
++basetransform: *
++
++= new stuff =
++
++
++= todo =
++* mv gstaudiofilterexample -> gst-template
++* make more elements using the baseclass
++ * base: audiorate, audioresample, volume
++ * good: audiopanorama
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ensonic/distributed.txt gstreamer-0.10.23/docs/random/ensonic/distributed.txt
+--- gstreamer-0.10.23.orig/docs/random/ensonic/distributed.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ensonic/distributed.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,42 @@
++$Id$
++
++= distributed gstreamer pipelines =
++
++The idea is to have a proxy element for remote elements so that you can treat
++the whole pipeline as a local one. The proxy element creates the real instance
++by talking to GOD (GStreamer Object Daemon, GObject Daemon, ...) on the
++respective machine.
++
++At runtime when the proxy-element receives data it sends it to the remote
++element and after processing it gets it back and forwards it to the element.
++The challenge is to optimize links when multiple conected elements are on the
++same remote machine so that the data gets passed directly there.
++
++== proxy creation ==
++
++In addition to
++GstElement* gst_element_factory_make (const gchar *factoryname,
++ const gchar *name);
++
++we need:
++GstElement* gst_element_factory_make_remote (const gchar *factoryname,
++ const gchar *name,
++ GstRemoteFactory *remote);
++
++and some API to get a remote factory handle via hostname lookup, ip address
++lookup or even zeroconf (avahi).
++
++== remote server ==
++
++The remote server manages pipelines with elements that are bound to the proxies.
++Each pipeline has an id, that refers to the client+the clients pipeline address.
++Proxyelements supply the client. pipeline address pair when creating remote
++elements.
++
++== issues / thoughts ==
++
++* we need to distribute the clock
++* is dataprotocol-library useful to send events, data, property- and state-
++ changes
++* we need to sync the remote pipelines with the main-pipeline
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ensonic/dparams.txt gstreamer-0.10.23/docs/random/ensonic/dparams.txt
+--- gstreamer-0.10.23.orig/docs/random/ensonic/dparams.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ensonic/dparams.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,14 @@
++$Id$
++
++* controller changes
++ * handling of G_TYPE_XXX is distributed over
++ gst-controller.c::gst_controlled_property_set_interpolation_mode()
++ gst-controller.c::gst_controlled_property_new
++ gst-interpolation.c
++ * it would be better to put handlers for each type into a struct
++ and register it into a hashmap with the G_TYPE as the key
++ * functions in gst-controller.c could try the key,
++ if no handler is registered the try the type_parent and so on
++
++* implement quadric/qubic interpolation
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ensonic/dynlink.txt gstreamer-0.10.23/docs/random/ensonic/dynlink.txt
+--- gstreamer-0.10.23.orig/docs/random/ensonic/dynlink.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ensonic/dynlink.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,89 @@
++$Id$
++
++Currently its only save to link/unlink elements/pad when pipeline is in READY.
++Belowe some thoughts. See http://bugzilla.gnome.org/show_bug.cgi?id=435487
++for patches.
++
++= current api =
++
++gboolean gst_element_link (GstElement *src, GstElement *dest);
++void gst_element_unlink (GstElement *src, GstElement *dest);
++
++gst_element_link_many, gst_element_unlink_many, gst_element_link_filtered,
++gst_element_link_pads, gst_element_unlink_pads, gst_element_link_pads_filtered
++
++GstPadLinkReturn gst_pad_link (GstPad *srcpad, GstPad *sinkpad);
++gboolean gst_pad_unlink (GstPad *srcpad, GstPad *sinkpad);
++
++= use cases =
++
++== inserting an element ==
++
++* we have: e1 ! e4
++* we want: e1 ! e2 ! e3 ! e4
++* we want: e1 ! e2 ! e4
++
++gst_element_insert_linked(e1, e2, e3, e4); // e2 == e3 allowed
++gst_pads_insert_link (e1.src, e2.sink, e3.src, e4.sink);
++ disconnect e1.src, e1.src.peer
++ disconnect e4.sink, e4.sink.peer
++ connect e1.src, e2.sink
++ connect e3.src, e4.sink
++
++== removing an element ==
++
++* we have: e1 ! e2 ! e3
++* we want: e1 ! e3
++
++gst_element_remove_linked(e2);
++gst_pads_remove_link (e1.src, e3.sink);
++ disconnect e1.src, e1.src.peer
++ disconnect e3.sink, e3.sink.peer
++ connect e1.src, e3.sink
++
++== swapping out an elelment ==
++
++* we have: e1 ! e2 ! e6
++* we have: e1 ! e2 ! e3 ! e6
++* we want: e1 ! e4 ! e5 ! e6
++* we want: e1 ! e3 ! e6
++
++gst_element_swap_linked(e1, e4, e5, e6);
++gst_pads_insert_link (e1.src, e4.sink, e5.src, e6.sink);
++ disconnect e1.src, e1.src.peer (=e2.sink)
++ disconnect e6.sink, e6.sink.peer
++ connect e1.src, e4.sink
++ connect e5.src, e6.sink
++
++= thoughts =
++* I don't think we need api for pads
++* Should current api check for the state?
++* do we want to swapp multiple elements at once
++
++== events ==
++* tee and adder need special treatment
++ * both would need to cache an accumulated segment
++ * tee
++ * would also cache tags
++ * when linkfunc is called, it can send out the segment and the tags
++ * when all pads got unlinked it could clear the segment
++ * adder
++ * when linkfunc gets called it sends a seek-event
++
++= ideas =
++== dynlinkpoint ==
++* use cases
++ * its ment to be used with one side disconnected to allow to connect elements
++ at runtime
++ * it can be used in a pipeline to remove/insert elements at runtime
++* element with 1 source- and 1 sinkpad
++* when both connected it passes data thru
++* if src is not connected it drops received buffers
++* if sink is not conected
++ * it does not push
++ * it creates silence on pull
++* events
++ * it caches events
++ * down: newsegment, tags, buffersize
++ * up: seek (needs to be modified)
++ * when other-pad get connected it pushes events depending on direction
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ensonic/embedded.txt gstreamer-0.10.23/docs/random/ensonic/embedded.txt
+--- gstreamer-0.10.23.orig/docs/random/ensonic/embedded.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ensonic/embedded.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,57 @@
++$Id$
++
++= embedded =
++
++== index handling ==
++For avidemux I currently have a big patch doing memory optimized index handling.
++It basically thins out the index to save memory. Right now it only keeps index
++entries marked with the avi keyframe flag.
++
++In gstreamer core we have some indexing objects. They are curently used nowhere.
++The idea is to use them and to make the index strategy plugable or configurable
++at run time.
++
++The challenge is then to rewrite muxers and demuxers to use them instead of the
++built in index logic.
++
++This way the different requirements of desktop and embedded platforms could be
++encapsulated in the indexer strategy.
++
++== ranking ==
++Autopluggers like playbin and decodebin use the element caps plus static ranks
++to create piplines.
++The rank of an elemnt right now refers to the quality/maturity of the element.
++Elements with higher rank should be functionaly more complete. If we have
++multiple elements that are feature complete there is a draw.
++
++There are more decission criteria thinkable:
++* target processor (CPU,DSP,GPU)
++* ressource usage (CPU, memory)
++* license (proprietary, open source)
++* quality (in terms of the audio/image quality)
++
++One problem of taking criteria like quality and performance into account when
++autoplugging, is that elements might have objects-properties that influence
++them.
++
++Beside adding more ranking criteria, we might consider adding an overridable
++mechanism for picking elements (basically registry filters that not decide on
++the base of ranks). Applications might choose the filter mechanism based on the
++use-case (which gstreamer not know right now).
++
++== g_malloc vs. g_try_malloc ==
++g_malloc/g_new should not be used when allocating space of a size that is
++derived from a value found in the file. Instead one should use g_try_malloc or
++g_try_new and check the return value.
++
++$ find . -name "*.c" -exec grep "g_malloc" {} \; | wc -l
++190
++$ find . -name "*.c" -exec grep "g_try_malloc" {} \; | wc -l
++0
++$ find . -name "*.c" -exec grep "g_new" {} \; | wc -l
++398
++$ find . -name "*.c" -exec grep "g_try_new" {} \; | wc -l
++3
++
++This is not strickly related to embedded, but its easier to crash gstreamer on
++embedded this way.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ensonic/interfaces.txt gstreamer-0.10.23/docs/random/ensonic/interfaces.txt
+--- gstreamer-0.10.23.orig/docs/random/ensonic/interfaces.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ensonic/interfaces.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,85 @@
++$Id$
++
++* existing gstreamer interfaces
++ ./gstreamer/gst/gsttaginterface.c
++ ./gstreamer/gst/gstinterface.c
++ ./gstreamer/gst/gsturi.c
++ ./gst-plugins/gst-libs/gst/propertyprobe/propertyprobe.c
++ ./gst-plugins/gst-libs/gst/mixer/mixer.c
++ ./gst-plugins/gst-libs/gst/tuner/tuner.c
++ ./gst-plugins/gst-libs/gst/xoverlay/xoverlay.c
++ ./gst-plugins/gst-libs/gst/colorbalance/colorbalance.c
++ ./gst-plugins/gst-libs/gst/navigation/navigation.c
++* new general interfaces
++ * GST_TYPE_UI_HINT
++ - add hints to generate 'good' looking interfaces to elements
++ - API:
++ GList *get_group_list();
++ struct ui_hint_group {
++ gchar *label;
++ gachr *role;
++ GList *entries;
++ }
++ struct ui_hint_group_entry {
++ enum UiHintGroupEntryType type={PARAM,DPARAM};
++ gchar *name;
++ }
++ roles {
++ /* graphics */
++ "color_selection/rgb",
++ "color_selection/hsv",
++ "aspect_ratio",
++ /* audio */
++ "envelope/adsr",
++ }
++ - features
++ - grouping of parameters, each group has:
++ - a label: giving a title to the group
++ - a role:
++ - this can give the UI a hint about the purpose of the controls
++ - this only makes sense, if we dont make this a thousand templates
++ - a list of dparams or properties
++ - question
++ - should this be aware of instruments (voice-groups)
++ - no, instruments should auto-generate those
++ * GST_TYPE_QUALITY_VS_SPEED
++ - get the name of a property that can be used to switch between
++ - a fast version for e.g. realtime usage
++ - a slower version with higher precission that can be used for off-line
++ rendering
++* new interfaces for audio applications
++ * GST_TYPE_MULTI_VOICE
++ - control interface for elements that support multiple voices (in one output-pad)
++ - API:
++ gulong number_of_voices;
++ void add_voice();
++ void remove_last_voice();
++ gulong get_number_of_voices();
++ - features
++ - plugin will initially have one voice and that one can not be deleted
++ * GST_TYPE_MUSIC_GENERATOR
++ - add hints so that application can use a element as an instrument
++ - API:
++ // param types
++ DParam *get_note_dparam();
++ GList *get_trigger_dparams();
++ // -- or
++ DParamType get_dparam_type(DParam *);
++ dparamtype = { NOTE, TRIGGER, OTHER }
++ // voices
++ char *get_number_of_voices_property();
++ GList *get_global_param_names();
++ GList *get_voice_param_names();
++ - features
++ - find out which params to use to play notes/trigger sounds
++ - these params will not appear in a control-ui
++ - notes involve a key to frequency translation
++ - find out if the element has a number_of_voices property
++ - if yes, we can find out about the max by looking at the gparamspec
++ - setting the property, adds/removes voices
++ - if the element supports it, it needs to:
++ - register voice-dparams as e.g. note_XXX, where XXX is the voice-number
++ - run the voice-loop in the chain/loop function
++ each voice processes the same input, if at all
++ the outputs of all voices are mixed together
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ensonic/logging.txt gstreamer-0.10.23/docs/random/ensonic/logging.txt
+--- gstreamer-0.10.23.orig/docs/random/ensonic/logging.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ensonic/logging.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,56 @@
++$Id$
++
++rethink log format. current format:
++* is not easy to parse/process by commandline tools
++* cannnot be easily diffed (timestamps, pid)
++
++gst_debug_log_default() is default gst-log handler.
++try new via:
++ gst_debug_remove_log_function(gst_debug_log_default)
++ gst_debug_add_log_function(func,data)
++
++== reorder fields ==
++
++format of default handler is:
++ DEBUG (0x8134bc0 - 0:00:00.848191000) GST_QOS( 3340) gstbasesink.c(1431):gst_base_sink_do_render_stats:<xvimagesink0> avg_render: 0:00:00.009044000
++log_level_name --^^^^^ | | | | | | | | | | | | |
++thread-id --------------^^^^^^^^^ | | | | | | | | | | |
++timestamp --------------------------^^^^^^^^^^^^^^^^^ | | | | | | | | |
++log_category -------------------------------------------------------^^^^^^^ | | | | | | |
++process-id -----------------------------------------------------------------^^^^^ | | | | |
++file:line -------------------------------------------------------------------------^^^^^^^^^^^^^^^^^^^ | | |
++function ----------------------------------------------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
++message -----------------------------------------------------------------------------------------------------------------------------^^^^^^^^^^^^^^^
++
++new proposed format:
++ 0:00:00.848191000 3340 0x8134bc0 DEBUG GST_QOS gstbasesink.c:1431:gst_base_sink_do_render_stats:<xvimagesink0> avg_render: 0:00:00.009044000
++timestamp -------^^^^^^^^^^^^^^^^^ | | | | | | | | | | | | |
++process-id ------------------------^^^^^ | | | | | | | | | | |
++thread-id -------------------------------^^^^^^^^^ | | | | | | | | |
++log_level_name ------------------------------------^^^^^ | | | | | | |
++log_category ----------------------------------------------------------^^^^^^^ | | | | |
++file:line ---------------------------------------------------------------------^^^^^^^^^^^^^^^^^^ | | |
++function -----------------------------------------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
++message ------------------------------------------------------------------------------------------------------------------------^^^^^^^^^^^^^^^
++
++something like:
++ cut -c35- | sed -e "s/0x[0-9a-f]\{7,8\}//g"
++should make logs easily 'diffable'.
++
++== color code level ==
++
++I suggedt to color-code loglevels if COLOR is allowed:
++ERROR : red
++WARNING : yellow
++INFO : green
++DEBUG : turkis
++LOG : gray
++NONE : gray
++
++== log sources ==
++
++What about differentating between log sources:
++ core
++ elements
++ application
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ensonic/media-device-daemon.txt gstreamer-0.10.23/docs/random/ensonic/media-device-daemon.txt
+--- gstreamer-0.10.23.orig/docs/random/ensonic/media-device-daemon.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ensonic/media-device-daemon.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,42 @@
++$Id$
++
++components
++================================================================================
++
++- daemon process
++ - is a gstreamer appliation
++ - open physical sink, src elements
++ - prepends an adder to sinks
++ - appends an tee to sources
++ - listens to dbus, to get notified by virtual-endpoints of init/finalize
++ (the dbus notify, would also be useful for gst-editor to hook on running
++ apps)
++
++- 4 new elements
++ - virtual-audiosink, virtual-videosink
++ virtual-audiosrc, virtual-videosrc
++ - virtual sinks establish a connection to the daemon
++ - they link to request_pads of the adder/tee elements
++ - on init and finalize they send a dbus-message
++
++- gui app
++ - lists instances as mixing-desk like channelstrips
++ - channelstrips would contain
++ - audio
++ - volume, panorama, 3-band eq
++ - video
++ - brightness, contrast, alpha-level
++ - user can
++ - add insert-fx
++ - route channel to targets, where targets can be real sinks or more
++ virtual-sinks (sub-groups)
++ - virtual sinks need queues to decouple application processes
++
++- interfaces
++ - expose child-elements via child-proxy
++ - then e.g. the applications volume-control could directly access the
++ channelstrip
++ - state-control (play, pause/mute)
++ - it would be useful if one app could pause/mute others
++ - think of a voip-client, if there is an incomming call, if pauses your
++ media-player, or mutes the monitoring of your recording app
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ensonic/profiling.txt gstreamer-0.10.23/docs/random/ensonic/profiling.txt
+--- gstreamer-0.10.23.orig/docs/random/ensonic/profiling.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ensonic/profiling.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,140 @@
++$Id$
++
++= profiling =
++
++== what information is interesting? ==
++* pipeline throughput
++ if we know the cpu-load for a given datastream, we could extrapolate what the
++ system can handle
++ -> qos profiling
++* load distribution
++ which element causes which cpu load/memory usage
++
++
++= qos profiling =
++* what data is needed ?
++ * (streamtime,propotion) pairs from sinks
++ draw a graph with gnuplot or similar
++ * number of frames in total
++ * number of audio/video frames dropped from each element that support QOS
++ * could be expressed as percent in relation to total-frames
++
++* query data (e.g. via. gst-launch)
++ * add -r, --report option to gst-launch
++ * during playing we capture QOS-events to record 'streamtime,proportion' pairs
++ gst_pad_add_event_probe(video_sink->sink_pad,handler,data)
++ * during playback we like to know when an elemnt drops frames
++ what about elements sending a qos_action message?
++ * after EOS, send qos-queries to each element in the pipeline
++ * qos-query will return:
++ number of frames rendered
++ number of frames dropped
++ * print a nice table with the results
++ * QOS stats first
++ * writes a gnuplot data file
++ * list of 'streamtime,proportion,<drop>' tuples
++
++
++= core profiling =
++* scheduler keeps a list of usecs the process function of each element was
++ running
++* process functions are: loop, chain, get, they are driven by gst_pad_push() and
++ gst_pad_pull_range()
++* scheduler keeps a sum of all times
++* each gst-element has a profile_percentage field
++
++* when going to play
++ * scheduler sets sum and all usecs in the list to 0
++* when handling an element
++ * remember old usecs t_old
++ * take time t1
++ * call elements processing function
++ * take time t2
++ * t_new=t2-t1
++ * sum+=(t_new-t_old)
++ * profile_percentage=t_new/sum;
++ * should the percentage be averaged?
++ * profile_percentage=(profile_percentage+(t_new/sum))/2.0;
++
++* the profile_percentage shows how much CPU time the element uses in relation
++ to the whole pipeline
++
++= rusage + pad-probes =
++* check get_rusage() based cpu usage detection in buzztard
++ this together with pad_probes could gives us decent application level profiles
++* different elements
++ * 1:1 elements are easy to handle
++ * 0:1 elements need a start timer
++ * 1:0 elements need a end timer
++ * n:1, 1:m and n:m type elemnts are tricky
++ adapter based elements might have a fluctuating usage in addition
++
++ // result data
++ struct {
++ beg_min,beg_max;
++ end_min,end_max;
++ } profile_data;
++
++ // install probes
++ gst_bin_iterate_elements(pipeline)
++ gst_element_iterate_pads(element)
++ if (gst_pad_get_direction(pad)==GST_PAD_SRC)
++ gst_pad_add_buffer_probe(pad,end_timer,profile_data)
++ else
++ gst_pad_add_buffer_probe(pad,beg_timer,profile_data)
++
++ // listen to bus state-change messages to
++ // * reset counters on NULL_TO_READY
++ // * print results on READY_TO_NULL
++
++= PerformanceMonitor =
++Write a ld-preload lib that can gather data from gstreamer and logs it to files.
++The idea is not avoid adding API for performance meassurement to gstreamer.
++
++== Services ==
++library provides some common services used by the sensor modules.
++* logging
++* timestamps
++
++== Sensors ==
++Sensors do meassurements and deliver timestampe performance data.
++* bitrates and latency via gst_pad_push/pull per link
++* qos ratio via gst_event_new_qos(), gst_pad_send_event()
++* cpu/mem via get_rusage
++ * when (gst_clock_get_time) ?
++ * we want it per thread
++* queue fill levels
++* number of
++ * threads
++ * open files
++
++== Wanted Sensors ==
++* dropped buffers
++
++== Log Format ==
++* we have global data, data per {link,element,thread}
++
++<timestamp> [<sensor-data>] [<sensor-data>]
++
++* sample
++timestamp [qos-ratio] [cpu-load={sum,17284,17285}]
++00126437 [0.5] [0.7,0.2,0.5]
++00126437 [0.8] [0.9,0.2,0.7]
++
++* questions
++** should we have the log config in the header or in some separate config?
++ - if config, we just specify the config when capturing put that
++ in the first log line
++ - otheriwse the analyzer ui has to parse it from the first line
++
++== Running ==
++LD_PRELOAD=libgstperfmon.so GST_PERFMON_DETAILS="qos-ratio,cpu-load=all" <application>
++LD_PRELOAD=libgstperfmon.so GST_PERFMON_DETAILS="qos-ratio,cpu-load=sum" <application>
++LD_PRELOAD=libgstperfmon.so GST_PERFMON_DETAILS="*" <application>
++
++== Exploration
++pygtk ui, mathplotlib
++
++== Ideas ==
++* can be used in media test suite as a monitor
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/ensonic/receipies.txt gstreamer-0.10.23/docs/random/ensonic/receipies.txt
+--- gstreamer-0.10.23.orig/docs/random/ensonic/receipies.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/ensonic/receipies.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,37 @@
++$Id$
++
++= receipies =
++
++The idea is to collect some recommendations for common, but not so trivial
++tasks. docs/design/part-block.txt has something like that already. Ideally these
++would go to the application developer manual and there would be sample code.
++
++== initial seeking ==
++=== question ===
++How to I configure the initial playback segment?
++
++=== idea ===
++1) set pipeline to PAUSED
++2) send seek event
++3) set pipeline to PLAYING
++
++=== problems ===
++1) would preroll the pipeline only, to flush it when the seek comes
++
++
++== async state changes ==
++=== question ===
++what to do when gst_element_set_state() returns ASYNC?
++
++=== idea ===
++1) listen to the STATE_CHANGED message on the bus
++2) trigger next action
++
++=== problems ===
++This scatters logic over multiple functions (callbacks).
++
++
++== topic ==
++=== question ===
++=== idea ===
++=== problems ===
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/eos gstreamer-0.10.23/docs/random/eos
+--- gstreamer-0.10.23.orig/docs/random/eos 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/eos 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,209 @@
++OUTDATED
++--------
++
++
++case 1)
++
++ (--------) (--------) (--------)
++ ! fakesrc! !identity! !fakesink!
++ ! src ----- sink src ---- sink !
++ (--------) (--------) (--------)
++
++
++
++ fakesrc detects the end of stream. It just sent the last buffer
++ and sets the srcpad to EOS with gst_pad_eos ().
++
++ gst_pad_eos() will notify the parent about the plugins attempt to
++ signal eos. the parent adds the element to its possible EOS
++ providers.
++
++ gst_pad_eos() will by default propagate to identy and to fakesink.
++ none of these plugins override the default behaviour so gst_pad_eos
++ returns TRUE and fakesrc signals EOS with the value TRUE.
++
++ The parent looks in the list of EOS providers and finds the faksrc
++ element that is now signaling EOS. all EOS providers are now in EOS
++ and so the bin fires EOS.
++
++
++
++case 2)
++ (---------------)
++ !thread !
++ (--------) (--------) (--------) ! (--------)!
++ ! fakesrc! !identity! ! queue ! ! !fakesink!!
++ ! src ----- sink src ---- sink src ---- sink !!
++ (--------) (--------) (--------) ! (--------)!
++ (---------------)
++
++
++ fakesrc detects the end of stream. It just sent the last buffer
++ and sets the srcpad to EOS with gst_pad_eos ().
++
++ gst_pad_eos() will notify the parent about the plugins attempt to
++ signal eos. the parent adds the element to its possible EOS
++ providers.
++
++ gst_pad_eos() will by default propagate to identy and to queue.
++ queue overrides the eos handler and returns false on the eos
++ request. fakesrc signals EOS with a value of false and the parent
++ bin removes the EOS provider from its list.
++
++ after the queue has sent out the last buffer, its calls eos on its
++ src pad. queue is added to the top level bin as an eos provider and
++ the default eos handler signals EOS with a value of TRUE to the parent.
++
++ the parent sees that all the eos providers are in eos now and signals
++ EOS.
++
++
++case 3)
++ (---------------)
++ !thread !
++ (--------) (--------) (--------) ! (--------)!
++ ! fakesrc! ! tee ! ! queue1 ! ! !fakesink!!
++ ! src ----- sink src ---- sink src ---- sink !!
++ (--------) ! ! (--------) ! (--------)!
++ ! ! (---------------)
++ ! !
++ ! ! (---------------)
++ ! ! !thread !
++ ! ! (--------) ! (--------)!
++ ! ! ! queue2 ! ! !fakesink!!
++ ! src ---- sink src ---- sink !!
++ ! ! (--------) ! (--------)!
++ (--------) (---------------)
++
++
++ fakesrc detects the end of stream. It just sent the last buffer
++ and sets the srcpad to EOS with gst_pad_eos ().
++
++ the eos handler returns false because both queues return false on the
++ eos request. the parent removes fakesrc as an EOS provider.
++
++ queue1 and queue2 were responisble for the EOS delay and so they get
++ added to the bin as possible EOS providers.
++
++ after the queues have sent out their last buffer, they calls eos on their
++ src pads.
++ the parent allready has the two queues in the EOS provider list so they dont
++ get added twice.
++ the two queues perform gst_pad_eos () on their pads when the queue is empty,
++ the parent removes the EOS providers from its list, when the list is empty,
++ the parent fires EOS.
++
++
++case 4)
++
++ (---------------)
++ !thread !
++ (--------) (----------) (--------) ! (--------)!
++ ! fakesrc! !mpeg1parse! ! queue1 ! ! !fakesink!!
++ ! src -- sink src ---- sink src ---- sink !!
++ (--------) ! ! (--------) ! (--------)!
++ ! ! (---------------)
++ ! !
++ ! ! (---------------)
++ ! ! !thread !
++ ! ! (--------) ! (--------)!
++ ! ! ! queue2 ! ! !fakesink!!
++ ! src ---- sink src ---- sink !!
++ ! ! (--------) ! (--------)!
++ (----------) (---------------)
++
++
++ this case differs from case3 in that one of the queues can be empty
++ while the other isn't. we assume queue1 is empty while queue2 isn't yet.
++
++ fakesrc detects the end of stream. It just sent the last buffer
++ and sets the srcpad to EOS with gst_pad_eos ().
++
++ the eos handler returns false because queue2 returns false on the
++ eos request. the parent removes fakesrc as an EOS provider.
++
++ queue2 was responisble for the EOS delay and so it gets added to the bin
++ as a possible EOS provider.
++
++ after the queue2 has sent its last buffer, it performs gst_pad_eos on its
++ src pad.
++ the parent allready has the queue2 in the list of EOS providers so it does not
++ get added twice.
++ queue2 finally fires the EOS signal and the parent removes the EOS provider
++ from its list, when the list is empty, the parent fires EOS.
++
++
++
++case 5)
++
++ (--------) (--------) (--------)
++ ! disksrc! ! mad ! !filesink!
++ ! src ----- sink src ---- sink !
++ (--------) (--------) (--------)
++
++
++ disksrc detects the end of stream. It just sent the last buffer
++ and sets the srcpad to EOS with gst_pad_eos ().
++
++ the eos handler returns false because mad returns false on the
++ eos request. the parent removes mad as an EOS provider.
++
++ mad was responsible for the EOS delay and so it gets added to the bin
++ as a possible EOS provider.
++
++ After mad has sent its last buffer, it performs gst_pad_eos on its
++ src pad.
++ the parent already has mad in the list of EOS providers so it does not
++ get added twice.
++ mad finally fires the EOS signal. This time, filesink returns false on
++ the eos request. the parent removes mad as an EOS provider.
++
++ filesink was responsible for the EOS delay and gets added to the bin
++ as a possible EOS provider.
++ When filesink has written all of it's data and closed the output file,
++ it fires EOS.
++ The parent already has filesink in the list of EOS providers so it does
++ not get added twice.
++ The parent removes the EOS provider
++ from its list, and since the list is empty, the parent fires EOS.
++
++case 6)
++
++ (--------) (--------) (--------)
++ !disksrc1! ! mad1 ! ! mixer !
++ ! src ----- sink src ---- sink1 ! (--------)
++ (--------) (--------) ! ! !filesink!
++ ! src ---- sink !
++ (--------) (--------) ! ! (--------)
++ !disksrc2! ! mad2 ! ! !
++ ! src ----- sink src ---- sink2 !
++ (--------) (--------) (--------)
++
++ In this case, we want to make sure the pipeline keeps running after one
++ of the two sources reaches eos. Suppose in this case that disksrc1 will
++ reach eos first.
++
++ disksrc1 detects the end of stream. It sets eos, mad1 will return false,
++ and mad1 will be responsible for eos. When mad1 had sent out the last
++ buffer, it sends out eos.
++
++ The mixer intercepts eos and returns false. mad1 is removed from the
++ eos providers and mixer is added.
++
++ (At this point, the mixer might choose to disconnect mad1->src and
++ mixer->sink1 pads, since it's received eos on mad1->src)
++
++ mixer will not send out eos since it hasn't received eos from
++ mad2->src.
++
++ After a while, disksrc2 will detect end of stream, and eos will finally
++ propagate to mixer. mixer might disconnect mad->src2, and after
++ realizing all of it's sources have reached eos, it sends out the final
++ buffer and fires EOS.
++
++ At this point, filesink will return false, mixer will be removed as an
++ eos provider, and filesink will write out it's final buffer and close
++ the file on disk. At this point, it fires eos, and since it's the last
++ eos provider, the parent can fire eos.
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/error gstreamer-0.10.23/docs/random/error
+--- gstreamer-0.10.23.orig/docs/random/error 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/error 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,59 @@
++Some notes on the error handling introduced after 0.7.3
++
++- there are four domains for errors:
++ - CORE: core GStreamer errors
++ - LIBRARY: supporting library errors
++ - RESOURCE: errors accessing resources (files, network, memory, ...)
++ - STREAM: errors in the data stream
++- Each error in GStreamer or plug-ins can be put under one of these four.
++- the enum is called Gst(Domain)Error and has GST_(DOMAIN)_ERROR_(CODE) members
++ (see GError API docs for rationale)
++- each of the enums starts with _FAILED at 1 (with FAILED being the generic
++ error if none of the others applies)
++- second in the enum is TOO_LAZY, which allows us to keep track of those errors
++ that we haven't categorized yet. This means they really should either move
++ to another one, or a new one ought to be created.
++- each enum ends with NUM_ERRORS
++
++- elements call gst_element_error to signal an error:
++ gst_element_error (element, domain, code, message, debug);
++ With :
++ - element being the one signalling the error
++ - domain one of CORE, LIBRARY, RESOURCE, STREAM
++ - code one of the suffixes in the Gst(Domain)Error enum
++ - message is either NULL (to signal the standard error message for the
++ given domain and code), or a printf-like set with the format being
++ marked for translation.
++ The string should start with a capital and end in a period so it forms
++ a complete sentence.
++ The string can/should be shown to the user of an application.
++ - debug is either NULL or a non-translated debug string, which can be used
++ to diagnose errors after they've happened.
++ The string can be shown to the user when he asks for additional debug info.
++ A useful macro is GST_ERROR_SYSTEM, which prints out the system error
++ that explains the failure by using g_strerror.
++
++- Some example calls:
++
++ gst_element_error (src, RESOURCE, OPEN_READ,
++ (_("Could not open file \"%s\" for reading"), src->filename),
++ GST_ERROR_SYSTEM);
++
++ The message is specified since we have more information:
++ - the resource is a file
++ - we know the file name
++
++ gst_element_error (element, CORE, NEGOTIATION, NULL, NULL);
++
++ This is a simple negotiation error. The default message will be
++ signaled, telling the user that GStreamer had an internal error.
++
++ gst_element_error (ebml, RESOURCE, READ, NULL,
++ ("Read error at position %llu (0x%llx)",
++ pos, pos));
++
++ The plugin asked to read on the underlying resource (using bytestream),
++ but failed. The user will get a generic read error. The debug info
++ will contain the exact position in the stream at which the read error
++ occured.
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/events gstreamer-0.10.23/docs/random/events
+--- gstreamer-0.10.23.orig/docs/random/events 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/events 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,330 @@
++EARLY DOCUMENT, NOT EXACTLY AS IMPLEMENTED
++------------------------------------------
++
++EVENTS RFC
++==========
++
++
++Scope
++-----
++This document tries to describe a possible implementation of an event
++system for GStreamer that is able to handle all known problems and works
++better than the current (0.3.1) system which evolved over time.
++
++
++Definition
++----------
++
++The event system is designed to be a mechanism for communication between
++elements. They are used to get information to the right point when this
++point cannot be known in advance.
++Events can be generated by either an element or the application and are
++processed by elements.
++
++
++Event Handling
++--------------
++
++Events may be inserted into a pipeline in the PAUSED or PLAYING state. Some
++events may travel during the PAUSED state, others may only travel when PLAYING.
++The insertion of events during the NULL or READY state should be supported if
++at all possible. Events may not be processed in those states though.
++After an event is inserted into the pipeline, no assumption may be made on how
++the event will be processed. It is eg wrong to assume that an event that is
++inserted at the beginning of the pipeline may come out at the end.
++There are 3 different directions an event can be processed.
++
++* downstream events
++
++ Downstream events are inserted on source pads and travel along the pipeline.
++ They are handled like buffers and processed in order. If event x is inserted
++ into a pipeline after buffer y, they are guaranteed to travel in that order.
++ Downstream events therefore only travel when the pipeline is PLAYING.
++ Downstream events must be handled by the routines that handle buffers, too.
++ An example downstream event is the event signalling that the stream has ended.
++ Please keep in mind that downstream events take the same way as buffers. So a
++ ghost pad will never receive these events.
++
++* upstream events
++
++ Upstream events are inserted on sink pads and travel backwards through the
++ pipeline. They travel as fast as possible. Source pads must have a handler
++ function in place to process events. A default handler is implemented.
++ An example upstream event is an event that seeks inside the stream.
++ Please keep in mind that upstream events take the same way as buffers in reverse
++ direction. This means that ghost pads will never receive them.
++
++* vertical events
++
++ Vertical events travel from elements to their parents. They are targetted at
++ the application. Vertical events should be used for information that an
++ application cannot receive in an easy way by using callbacks or properties.
++ Vertical events are send to the application by the pipeline that collects those
++ events and supplies a callback for the application. Vertical events are also only
++ happening when the pipeline is in PAUSED or PLAZING state.
++ An example vertical event is the error event informing the application about
++ unexpected behaviour.
++
++
++The GstEvent object
++-------------------
++
++struct _GstEvent {
++ GstData data;
++
++ GstEventType type;
++ guint64 timestamp;
++ GstObject *src;
++
++ union {
++ ...
++ } event_data;
++};
++
++data: The parent object.
++type: The type of the event. GStreamer aims to keep the number of different
++ plugin types as small as possible.
++timestamp: The time when the event was created. This property is used to identify
++ duplicated events. If the application inserts an event, the timestamp
++ is set by the element receiving the event from the application.
++src: The element that created the event. If an application inserts an event,
++ the element that received the event from the application sets itself as
++ the source.
++event_data: data specific to the event type.
++
++
++The different event types
++-------------------------
++
++The following names in brackets correspong to the event's type property.
++
++GST_EVENT_DISCONTINUOUS
++direction(s): downstream
++event_data: struct {
++ GstDiscontType type;
++ } discontinuous;
++This event is used to indicate that the current stream does not continue. Possible
++indications are a new stream (type = GST_DISCONT_NEW), the happening of a seek
++(type = GST_DISCONT_SEEK) or the end of the stream when no more data is available.
++(type = GST_DISCONT_EOS)
++
++GST_EVENT_SEEK
++direction(s): upstream
++event_data: struct {
++ GstSeekType type;
++ gint64 offset;
++ gboolean flush;
++ } seek;
++This event is used if a seek is needed. Uses include applications or the avi demuxer
++element requesting the end of the stream first. The seek can happen absolute (SET),
++relative to the current position (CUR) or relative to the end (END). It is possible
++to seek by frames (FRAME), time in microseconds (TIME) or bytes (BYTE). This is
++indicated by the type field, which takes the values
++GST_SEEK_FRAME/TIME/BYTEOFFSET_SET/CUR/END. The offset field indicates how many units
++should be seeked. Negative values indicate seeking backwards from the indicated position.
++The flush field indicates if buffered data shuold be flushed or discarded.
++
++GST_EVENT_FLUSH
++direction(s): upstream
++event_data: none
++This event indicates that all buffered data should be flushed out immediately.
++
++GST_EVENT_INFO
++direction(s): downstream, vertical
++event_data: struct {
++ GstProps *props;
++ } info;
++The Info event is used to transport meta information like bitrate, author, title,
++interpret or stream length. Most info events will be emitted vertical and downstream
++at the same time. Vertical emission ensures that an application knows about those
++properties and downstream emission ensures that elements can compute own information
++from these infos. (eg converting stream length in bytes to song length in
++microseconds).
++Props consist of key / value pairs, where the key is a string identifier and the value
++is a GstPropEntry. Many key strings are predefined to allow consistency between elements.
++Elements should try to suppy any information they can as soon as possible.
++
++GST_EVENT_HAS_INFO
++direction(s): upstream
++void (*GstHasInfoCallback) (gchar *name, GstPropsEntry *info, gpointer data);
++event_data: struct {
++ GList *info;
++ GstHasInfoCallback callback;
++ gpointer data;
++ } has_info;
++The has_info event might be inserted by an application to find out if a pipeline can supply
++the specified infos. the info list contains all information that the application is
++interested in. If an element can supply information it calls the supplied callback with the
++name of the information it can supply, the information if it is already available or NULL and
++the data. If this event is destroyed, it will call the callback with name = NULL to indicate
++that no more data will be received.
++This event will for example be used by playlists when they generate information.
++
++GST_EVENT_ERROR
++direction(s): vertical
++event_data: struct {
++ gchar *message
++ } error;
++An error event is emitted, whenever a recoverable error occurs that the application
++should know about. The usage should be similar to GLibs GError. An example would be
++"connection closed" for a host to host plugin.
++
++
++Reference Counting
++------------------
++
++References to events are handled similar to buffers. An element receives an event with
++a single reference. If it forwards the event, this reference is lost.
++Events own a reference to the element that created them. They take care of all of all
++data inside them too (strings, props). So elements and applications that want to keep
++this informations need to copy or add a reference them.
++
++
++Changing Events
++---------------
++It is not allowed to change any data inside an event. Changing events can only be
++accomplished by removing the reference to them and not forwarding the event and then
++creating a new one.
++
++
++Default Behaviour
++-----------------
++
++* downstream events
++
++ These are not handled by default, because they must be handled by the chain handler
++ of the sink pad. There is however a function called gst_pad_event_default(GstPad *,
++ GstData *) that will take care of events if your code doesn't want to handle them.
++ But your code must be aware that not everything that your chain function receives
++ is a buffer. It could be an event.
++
++* upstream events
++
++ Upstream events are handled by a default handler function that is inserted on sink
++ pads when they are created. This function simply forwards the event to all connected
++ sink pads of the element. You are free to change this handler.
++
++* vertical events
++
++ Vertical events can not be received by elements. Bins have a default handler function
++ that simply forwards the event to their parent. Pipelines offer callbacks for events.
++ You may change this handler for your custom bins.
++
++
++Use Cases
++---------
++
++Following are some simple use cases describing how events are generated. The pipeline
++decriptions use gst-launch syntax. "..." indicates that something follows there but is
++not important for the example.
++
++* filesrc ! fakesink
++
++ - When starting the pipeline, filesrc will emit a DISCONTINUOUS event of type NEW
++ indicating a new stream.
++ - Following that event will be an INFO event containing the length of the file/stream
++ in bytes.
++ - After the file was played, the filesrc emits a "DISCONTINUOUS" of type EOS.
++
++* filesrc ! mad ! ...
++
++ - When starting, filesrc emits a DISCONTINUOUS event followed by an INFO event (see above).
++ The mad plugin remembers the length of the file and removes the INFO element as it
++ is no longer of use. The DISCONTINUOUS event has passed mad after making sure, that all
++ buffers are cleared.
++ - Mad will emit a SEEK event to BYTEOFFSET_END; offset = -sizeof(ID3_info) to read out the ID3
++ information.
++ - Filesrc emits a DISCONTINUOUS event of type SEEK to indicate that it seeked to the end.
++ This event will not be passed on by mad.
++ - after receiving the ID 3 information, mad will issue an INFO event containing all data
++ it extracted. This event will probably only be passed vertical as ID3 information is of
++ no use to other elements.
++ - mad then ISSUES a SEEK event of type BYTEOFFSET_SET; offset = 0 to make the filesrc start
++ playing the file.
++ - The filesrc will reset its offset and issue a DISCONTINUOUS event of type SEEK. This event
++ will not be forwarded by mad.
++ - When playing starts, mad is able to compute bitrate and other information including playing
++ time with the help of the previous length information supplied by the filesrc. It will then
++ issue another INFO event with that informations. This one will be send downstream and vertical.
++
++* ... ! avimux ! filesink
++
++ This example is showing a more exotic way of using events. The reader should be aware that AVI
++ files have a limited filesize. Only 4 GB are allowed. We now show what happens when the avimux
++ encoder hits that limit.
++ - When the internal counter of avimux shows that it is approaching the filesize limit, the
++ avimux element pushes a buffer containig the footer to the filesink.
++ - After that it issues a DISCONTINUOUS event of the type DISCONT_NEW indicating a new stream.
++ The filesink will close the file and reopen a new one.
++ - The avimux plugin resets its internal size counter and restarts sending data to the new file.
++
++* filesrc ! gunzip ! mikmod ! osssink
++
++ (please note that this example is purely theoretical. It should just show ideas)
++ During playback, an application is interested in "interpret", "title", "length_time",
++ "length_size" and "URI" of the current stream.
++ - The application creates a HAS_INFO event and inserts it at the end of the pipeline into the
++ osssink.
++ - The osssink cannot supply any info so it forwards the event to the mikmod element.
++ - The mikmod element can supply "title" and "length_time". It calls the supplied callback twice
++ and gives these two options. It forwards the event to the gunzip element.
++ - The gunzip element has already decoded the whole data so it knows the size of the stream. It
++ calls the callback for "length_size" and forwards the event.
++ - The filesrc supplies the "URI" and the "length_size" for a second time. It is now up to the
++ application's callback function to handle this second occurence of "length_size" information.
++ The filesrc does not forward the event and dereferences it.
++ - During disposal of the event, the callback function is called again with name=NULL. The
++ application now knows that no "title" can be supplied.
++
++
++Open Questions
++--------------
++
++Open questions are issues that should probably be solved by events but can not be solved
++currently.
++
++* A filesink needs to be able to inform elements of a restricted file size. Simply closing
++ the file and opening a new one might not work because elements might need to supply a
++ footer. (eg avimux)
++
++
++
++Issues / changes (to be deleted in final version)
++----------------
++
++? Are the event directions distinct? Or is it possible that some type of event
++ can travel eg upstream _and_ vertical?
++? How are upstream/vertical events supposed to be handled if they occur when
++ the element is READY or NULL? Buffer the event? How many events should be
++ buffered? Maybe a READY element is attached to a PLAYING/PAUSED one and
++ constantly receiving events, no?
++! The EOS event was merged with the DISCONTINUOUS event.
++? Does the DISCONTINUOUS event need a "flush" option?
++? Should chain funcs be changed to expect GstData instead of GstBuffer?
++ It's a little bit misleading if events can arrive there.
++! added information about timestamp.
++? Should timestamps of "follow up" events (eg conversion of seek) keep the
++ timestamp?
++? src = NULL, when app inserts event?
++? How do elements handle events they cannot use? (eg filesrc getting timebased
++ seek request)
++? Somebody fix the GST_EVENT_FLUSH part.
++? GValue or GstProps for INFO events? First requires to open up the props headers
++ and writing some API to ease the retrieval of the elements, the second requires
++ a rewrite of GST_EVENT_INFO.
++? GQuark/GValue possible in INFO events?
++! Merged INFO and PROPS event. They are nearly the same. Added documentation.
++? Need to work out the ERROR event.
++! changed prototype for gst_pad_event_default to accept buffers so the function checks
++ if it is an event and not every chain handler has to.
++! added HAS_INFO event. An alternative to the callback function could be another vertical
++ event.
++? Should HAS_INFO callback supply the element calling the function?
++? Use case one: start with discont event?
++? Do we need a state change event?
++? Should we make elements supply information as soon as possible or only upon HAS_INFO
++ request?
++? should the second example be done with region requesting instead of events?
++? "location" or "URI"?
++? What about suggesting buffer sizes?
++? What about QoS?
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/example gstreamer-0.10.23/docs/random/example
+--- gstreamer-0.10.23.orig/docs/random/example 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/example 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,108 @@
++OUTDATED, methods have different names now
++------------------------------------------
++
++
++Here's a pipeline that does audio/video MPEG streams with a queue on
++either side of each decompressor, for a total of 5 threads (read/split,
++decode audio, decode video, play audio, play video):
++
++NOTES: mpegsplit is the intelligence in this pipeline, providing an IDL
++that allows one to connect things to a GUI.
++
++Pipeline(mpegplay)
++ Thread(reader)
++ Element(:disk_async_src) [StreamerAsyncSrc]
++ OutPad(disk1)
++ Element(:mpegsplit)
++ InPad(disk1)
++ OutPad(audio1)
++ OutPad(video1)
++
++ Queue(audioQ1)
++ InPad(audio1)
++ OutPad(audio2)
++ Thread(audiodecode)
++ Element(:mpeg_audio_decode) [StreamerVideoFilter]
++ InPad(audio2)
++ OutPad(audio3)
++ Queue(audioQ2)
++ InPad(audio3)
++ OutPad(audio4)
++ Thread(audioplay)
++ Element(:audio_play) [StreamerAudioSink]
++ InPad(audio4)
++
++ Queue(videoQ1)
++ InPad(video1)
++ OutPad(video2)
++ Thread(videodecode)
++ Element(:mpeg_video_decode) [StreamerVideoFilter]
++ InPad(video2)
++ OutPad(video3)
++ Queue(videoQ2)
++ InPad(video3)
++ OutPad(video4)
++ Thread(videoplay)
++ Element(:video_play) [StreamerVideoSink]
++ InPad(video4)
++
++
++A simpler pipeline that just does MPEG videos:
++
++Pipeline(mpegplay)
++ Thread(reader)
++ Element(:disk_async_src) [GstAsyncSrc]
++ OutPad(disk1)
++ Element(:mpeg_control)
++ InPad(disk1)
++ OutPad(video1)
++ Element(:mpeg_video_decode) [GstVideoFilter]
++ InPad(video1)
++ InPad(video2)
++ Queue(queue)
++ InPad(video2)
++ OutPad(video3)
++ Thread(play)
++ Element(:video_play) [GstVideoSink]
++ InPad(video3)
++
++The code for the above looks roughly like:
++
++/* all the objects we're worried about */
++GstPipeline *mpegplay;
++GstThread *reader;
++GstSrc *disk_src;
++GstControl *mpeg_control;
++GstFilter *mpeg_video_decode;
++GstQueue *queue;
++GstThread *play;
++GstSink *video_play;
++
++/*** first we create all of the objects ***/
++
++mpegplay = gst_pipeline_new();
++reader = gst_thread_new();
++disk_src = gst_async_disk_src_new("filename.mpg");
++mpeg_control = gst_mpeg_control_new();
++mpeg_video_decode = gst_mpeg_video_decode_new();
++queue = gst_queue_new();
++play = gst_thread_new();
++video_play = gst_video_sink_new();
++
++
++/*** now we start to create the pipeline ***/
++
++/* first set up the reader thread */
++gst_bin_add(reader,disk_src);
++gst_object_connect(disk_src,"out",mpeg_control,"in");
++gst_object_connect(mpeg_control,"out",mpeg_audio_decode,"in");
++gst_bin_ghost_pad(reader,mpeg_audio_decode,"out");
++
++/* then set up the player thread */
++gst_bin_add(play,audio_play);
++gst_bin_ghost_pad(play,audio_play,"in");
++
++/* now plug them all into the main pipeline */
++gst_bin_add(mp3play,reader);
++gst_object_connect(reader,"out",queue,"in");
++gst_object_connect(queue,"out",play,"in");
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/gdp gstreamer-0.10.23/docs/random/gdp
+--- gstreamer-0.10.23.orig/docs/random/gdp 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/gdp 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,25 @@
++GStreamer data protocol
++ Intended to wrap GstData objects in a line protocol for use with
++ pipe / network elements.
++ IDEAS-- -- -*for transporting buffers, have a function that creates a header for a given buffer to be written before the buffer.This way, you don 't lose
++ time creating a GDP buffer from the buffer
++* allow for CRC' ing of the GstBuffer, optionally * have a version number of the protocol * optimizing the header for size is not useful since the GstData structure
++ already contains more than 32 bytes anyway, making up half the header size PROTOCOL-- -- ----*1 byte GDP major
++version (0)
++ *1 byte GDP minor version (1)
++ * 1 byte GDP flags
++ * 1 byte GDP data type
++ 1 for buffer, 2 caps, 65 + for events
++ * 4 byte length of "payload"
++ * 8 byte timestamp of buffer / event
++ * 8 byte duration of buffer
++ * 8 byte offset
++ * 8 byte offset_end
++ * 2 byte buffer data flags * 14 byte future extension (ABI padding)
++ *2 byte optional header crc
++ * 2 byte optional payload crc
++ * (length) payload
++ header:60 bytes
++ PROTOCOL CHANGELOG-- --
++ --------------0.1:added two bytes for buffer flags all numbers use
++ network byte ordering.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/hierarchy gstreamer-0.10.23/docs/random/hierarchy
+--- gstreamer-0.10.23.orig/docs/random/hierarchy 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/hierarchy 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,153 @@
++OUTDATED
++--------
++
++
++Face it, the plugins/ directory hierarchy is crap. We want to propose a
++better layout for it now. Some things to consider:
++
++ - Elements have a klass member in the factory that is used to
++ denote the functional type of the element. For example, the
++ mp3 encoder has a klass of Codec/Encoder/Audio
++
++ - The plugins can be grouped together by the media type they
++ operate on or by the way they work (decoder/encoder)
++
++In GStreamer all plugins are techically filters, the only way they
++can be considered sources or sinks (input/output) elements is
++by the absence of src/sink pads. At first sight the source/filter/
++sink distinction is quite useless because most of the plugins
++will go into the filters category anyway.
++
++We don't want to make the hierarchy too deep, yet provide a
++clean way to ask for a mp3 decoder element..
++
++Anyway this is a rough proposal to fire off the discussions...
++
++Wim
++
++Source
++ Disk
++ disksrc
++ fdsrc
++ multifilesrc
++ Network
++ HTTPsrc
++ RTPsrc
++ CDDA
++ cdparanoia
++ XMMS
++ ..
++ DVD
++ dvdsrc
++ Audio
++ ASLA
++ OSS
++ Capture
++ v4lsrc
++ firewire
++
++Demuxer
++ AVI
++ MPEG1
++ MPEG2
++ QT
++
++Muxer
++ AVI
++ MPEG1
++ QT
++
++Aggregator
++
++Tee
++ gsttee
++
++Connection
++ queue
++ CORBA
++
++Parser
++ MPEG1
++ MPEG2
++ AC3
++
++Mixer
++ Audio
++ Merge
++ Video
++ Subtitles
++ Merge
++
++Filters
++ Audio
++ ladspa
++ resample
++ Video
++ colorspace
++
++Effect
++ Audio
++ stereo
++ volume
++ delay
++ chorus
++ Video
++ median
++ smooth
++ XMMS
++
++Decoder
++ MPEG1
++ MPEG2
++ MP3
++ mpg123
++ xing
++ win32
++ AU
++ WAV
++ JPEG
++ AC3
++ ac3dec
++ RTJPEG
++ vorbis
++
++Encoder
++ MPEG1
++ MPEG2
++ MP3
++ lame
++ mpegaudio
++ win32
++ JPEG
++ AU
++ WAV
++ RTJPEG
++ Vorbis
++
++Visualisation
++ Video
++ histogram
++ Audio
++ smoothwave
++ spectrum
++ synaesthesia
++ vumeter
++ XMMS
++
++Sink
++ Disk
++ filesink
++ multifilesink
++ Network
++ ICECASTsink
++ FTPsink
++ RTPsink
++ XMMS
++ ESD
++ Video
++ videosink
++ SDLsink
++ Audio
++ OSSsink
++ ALSAsink
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/i18n gstreamer-0.10.23/docs/random/i18n
+--- gstreamer-0.10.23.orig/docs/random/i18n 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/i18n 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,52 @@
++Internationalization notes
++--------------------------
++- apps:
++ - use setlocale to parse locale env vars and set to language code
++ - use textdomain to set the text domain of their app
++ - use bindtextdomain to tie the domain to a locale dir
++ - use gettext (possibly disguised as _) to translate in the current domain
++
++- libraries:
++ - should only use bindtextdomain to tie a domain to a locale dir
++ - use dgettext (possibly disguised as _) to translate from a set domain
++
++- How to make your plug-in code translateable:
++ - include <gst/gst-i18n-plugin.h> in all files that mark strings for
++ translation, or do the bindtextdomain call
++ - in plugin_init, add a block like this:
++
++#ifdef ENABLE_NLS
++ GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE,
++ LOCALEDIR);
++ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
++#endif /* ENABLE_NLS */
++
++ - mark all strings you want translated for translation by wrapping them in
++ _()
++ - typically, these are all strings that serve as the message string for a
++ GST_ELEMENT_ERROR or _WARNING
++ - but it could also consist of any strings that may end up being presented
++ to the user (for example mixer track)
++
++Things to watch out for
++-----------------------
++- forgetting to bindtextdomain is an error that is not always noticeable,
++ because:
++ - any plugin from the same module being init'd binds the text domain,
++ so you may forget it in B, and still have it work because A bound the
++ domain
++ - without a bindtextdomain call, any domain is bound to the system locale
++ dir - so you could still have translations if it happens to be where the
++ translations are
++
++- our translations are managed by the Translation Project
++ http://www.iro.umontreal.ca/translation/
++ They are updated by the release manager for prereleases using
++ make download-po
++ As the translator project website clearly states, only accept translations
++ from the translation project, and direct would-be translators there:
++ "It would defeat the purpose of the teams if you were directly accepting PO
++ files from individual translators, or were having "contracts" with them. If
++ people write to you, wanting to volunteer as translators, direct them to
++ translation@iro.umontreal.ca, and the translation coordinator will send them
++ appropriate documentation."
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/interfaces gstreamer-0.10.23/docs/random/interfaces
+--- gstreamer-0.10.23.orig/docs/random/interfaces 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/interfaces 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,337 @@
++INTERFACES & ELEMENTS
++---------------------
++
++1) Introduction
++===============
++Interfaces are descriptions on how to handle an object, without actually
++implementing the object. This allows for multiple objects to be instantiated
++based on this interface. Each of them can then be handled equally by an
++application.
++Glib, apparently (unchecked), has a way of creating interfaces, probably
++by means of a class struct without actually defining the object. The object,
++then, does not define a class and these two add up. Benjamin knows more
++about interfaces, I didn't study interfaces & glib too deeply, yet. I know
++them just from Java.
++Interfaces are cool! It allows for some sort of random element creation
++without needing to link to the implementation. This is similar to how
++GStreamer currently handles media plugins. GStreamer itself could be seen
++as an interface too, in that respect.
++
++2) So why do we need interfaces?
++================================
++Because GStreamer doesn't handle it all. GStreamer in itself is a media
++framework for streams of data from one element to the next. There's lots
++of things that's media-related, but not handled in this description.
++Several examples will probably clarify this: think of the Xvideo output
++plugin. We can create an overlay here (Xv-based), and we currently control
++this X-connection using glib properties. However, what property name is
++associated with what control? And does it work the same as v4lsrc's
++overlay image control?
++The same goes for a mixer, for image control, audio control, and probably
++a lot more. The general idea is simple: *this needs to be documented*.
++But properties aren't all - they simply cannot do this all. Some things
++cannot be described in a simple one-argument property thing. Of course,
++we could give a pointer to a struct as argument, but that's merely a hack
++and requires both plugin and app to know the ABI of the struct. This
++kills the whole idea of making the plugin independent of the app.
++In short: we want interfaces for this.
++
++3) How to integrate an interface in GStreamer
++=============================================
++Let us start with some starting point: an interface is associated
++with an element. It is a feature exported by that specific element,
++not by a pipeline or anything more complex. Pipelines are already
++handled just fine by GStreamer (or you wouldn't be reading all
++this).
++Obviously, a pipeline can be a fallback for an interface. Imagine
++that we're looking for an audio sink that exposes a mixer, but our
++fakesink audio output doesn't ("I wonder why"). We could then create
++a pipeline with the volume element in it to "fake" a mixer. Ideally,
++the volume element would implement a mixer interface itself.
++
++How are we going to do that in programmatic way? We currently use
++properties. Their huge advantage is that we do not need to care
++about adding new functions or whatever. Their disadvantage is that
++they're limited to one argument. Anything more complex requires
++app/plugin knowledge about the shared data, and that defeats the
++point of them: to have no dependency on each other. This could be
++solved partially by using action signals, but that makes the whole
++picture quite complex (since you use multiple methods for doing one
++simple thing). Also, they are quite slow compared to functions
++because of the table lookups. In short: it'd work, but I'm not in
++facour of it...
++OK, so an element exposes interfaces. This allows us to think of
++the idea of embedding interfaces (dynamically, of course) in the
++GstElement object. Think of an object being able to register an
++indefinate number of interfaces per object instance, and a client
++application could then enumerate interfaces and instantiate one.
++Glib gives us GInterface for this purpose. The disadvantage of
++this is that it's on a per-class basis, not a per-instance basis.
++This is a problem in case of elements where it depends on several
++properties whether it supports an interface or not. This can be
++solved by simply making one generic virtual function "supported ()"
++in a generic derived object of GInterface (GstInterface?).
++
++GstInterface is then a generic thing that is inherited by specific
++interfaces (see examples). Obviously, the client will need to know
++about the ABI/API of this struct, but that'll happen either way.
++Surely, there needs to binary linkage, but I don't consider that a
++bad thing. It does improve performance compared to action signals!
++
++So an element contains interfaces. But where are these interfaces
++described? And who creates them? I suggest that we do that just as
++we handle gstvideo and gstaudio right now (these libs do *nothing*
++useful currently, so this'd make them a lot more interesting).
++These interfaces inherit from GstInterface. The functions that
++are needed, can be provided through a class object. The element is
++then responsible for storing variables and so on. gstvideo/audio
++provides wrapper functions for the class functions. That's also how
++glib suggest us to use GInterfaces.
++
++Plugin and application then handle and retrieve interfaces as
++documented in the glib documentation, which is available at:
++http://www.gnome.org/~mathieu/gobject/main.html
++
++So the most important part left is to document the interfaces
++and make sure all elements exporting them work equally. For this,
++I'll give two examples.
++
++4) Examples
++===========
++
++/* This small extra virtual function is here to provide an
++ * interface functionality on a per-instance basis rather
++ * than a per-class basis, which is the case for glib.
++ */
++typedef struct _GstInterfaceClass {
++ GTypeInterface parent;
++
++ /* virtual functions */
++ gboolean (* supported) (GstInterface *iface);
++} GstInterfaceClass;
++
++There would probably be a convenience function that checks
++a specific interface's implementation (glib allows for this)
++and checks for ->supported () to be set and to return TRUE:
++
++gboolean
++gst_element_implements_interface (GstElement *element,
++ GType iface_type)
++{
++ if (G_TYPE_CHECK_INSTANCE_TYPE (G_OBJECT (element),
++ type)) {
++ GstInterface *iface;
++ GstInterfaceClass *ifclass;
++
++ iface = G_TYPE_CHECK_INSTANCE_CAST (G_OBJECT (element),
++ type, GstInterface)
++ ifclass = GST_INTERFACE_GET_CLASS (iface);
++
++ if (ifclass->supported != NULL &&
++ ifclass->supported (iface) == TRUE) {
++ return TRUE;
++ }
++ }
++
++ return FALSE;
++}
++
++Let's now add some functions so we can abuse this in case/check
++functions.
++
++GstInterface *
++gst_interface_cast (gpointer from,
++ GType type)
++{
++ GstInterface *iface;
++
++ /* check cast, give warning+fail if it's invalid */
++ if (!(iface = G_TYPE_CHECK_INSTANCE_CAST (G_OBJECT (element),
++ type, GstInterface))) {
++ return NULL;
++ }
++
++ /* if we're an element, take care that this interface
++ * is actually implemented */
++ if (GST_IS_ELEMENT (from)) {
++ gboolean interface_is_implemented =
++ gst_element_implements_interface (GST_ELEMENT (from),
++ type);
++ g_return_val_if_fail (interface_is_implemented == TRUE, NULL);
++ }
++
++ return iface;
++}
++
++gboolean
++gst_interface_check (gpointer from,
++ GType type)
++{
++ GstInterface *iface;
++
++ /* check cast, return FALSE if it fails, don't give a warning... */
++ if (!G_TYPE_CHECK_INSTANCE_CAST (from, type,
++ GstInterface)) {
++ return FALSE;
++ }
++
++ iface = G_TYPE_CHECK_INSTANCE_CAST (G_OBJECT (element),
++ type, GstInterface);
++
++ /* now, if we're an element (or derivative), is this thing
++ * actually implemented for real? */
++ if (GST_IS_ELEMENT (from)) {
++ if (!gst_element_implements_interface (GST_ELEMENT (from),
++ type)) {
++ return FALSE;
++ }
++ }
++
++ return TRUE;
++}
++
++#define GST_INTERFACE_CHECK_INSTANCE_CAST(obj, type, cast_t) \
++ ((cast_t *) gst_interface_cast ((obj), (type))
++#define GST_INTERFACE_CHECK_INSTANCE_TYPE(obj, type) \
++ (gst_interface_check ((obj), (type))
++
++We could use this in the GST_IS_... () macros. For example, the
++macros GST_IS_MIXER () and GST_MIXER () would then look like this:
++
++/* Note that this is a non-standard macro, and with a reason! */
++#define GST_MIXER(obj) \
++ (GST_INTERFACE_CHECK_INSTANCE_CAST ((obj), \
++ GST_TYPE_MIXER,
++ GstMixer))
++#define GST_IS_MIXER(obj) \
++ (GST_INTERFACE_CHECK_INSTANCE_TYPE ((obj), \
++ GST_TYPE_MIXER))
++
++So the application would just tread it with the known macro, and
++everything would look extremely simple to the end user.
++
++4a) mixer
++---------
++A mixer is a way of controlling volume and input/output channels.
++This doesn't mean that you control which channel is the subwoofer,
++all that is supposed to be done automatically. It is really meant
++as a way of representing system-level volumes and such. It could
++also be used to turn on/off certain outputs or inputs.
++As you've noticed, I'm not only talking about output, but also
++input. Indeed, I want both osssrc *and* osssink to export the
++same mixer interface! Or at least a very similar one. Volume
++control works the same for both. You could say that osssrc should
++enumerate the input channels (such as microphone, line-in). Of
++course, osssink should not. Or maybe it should, not sure... Maybe,
++we'd need a parent osselement which implements all mixer channels.
++And alsa* would surely implement the same interface.
++
++/* This is confusing naming... (i.e. FIXME)
++ * A channel is referred to both as the number of simultaneous
++ * sound streams the input can handle as well as the in-/output
++ * itself
++ */
++
++#define GST_MIXER_CHANNEL_INPUT (1<<0)
++#define GST_MIXER_CHANNEL_OUTPUT (1<<1)
++#define GST_MIXER_CHANNEL_MUTE (1<<2)
++#define GST_MIXER_CHANNEL_RECORD (1<<3)
++
++typedef struct _GstMixerChannel {
++ gchar *label;
++ gint current_num_channels,
++ max_num_channels,
++ flags;
++} GstMixerChannel;
++
++typedef struct _GstMixerClass {
++ GTypeInterface klass;
++
++ /* virtual functions */
++ GList * (* list_channels) (GstMixer *mixer);
++
++ void (* set_volume) (GstMixer *mixer,
++ GstMixerChannel *channel,
++ gint *volumes);
++ void (* get_volume) (GstMixer *mixer,
++ GstMixerChannel *channel,
++ gint *volumes);
++
++ void (* set_mute) (GstMixer *mixer,
++ GstMixerChannel *channel,
++ gboolean mute);
++ void (* set_record) (GstMixer *mixer,
++ GstMixerChannel *channel,
++ gboolean record);
++} GstMixerClass;
++
++libgstmixer.la/so provides wrapper functions for each of the
++class' virtual functions. Possibly also some macros for
++GST_MIXER_CHANNEL_HAS_FLAG () or _get_channel ().
++
++The rest is done automatically, as described in the already-
++mentioned glib documentation for GInterface. This includes
++things like the base_init () function of the GstMixerClass,
++which fills all the virtual functions for the mixer, and the
++actual function implementations. The mixer, basically, operates
++as an element on its own. It gets the file descriptor from
++the interface->element (every oss... is a osscommon, etc.).
++
++4b) overlay
++-----------
++Overlay is used in both in- and output, too. Think of v4lsrc,
++v4l2src, v4lmjpegsrc, xvideosink - all overlays. But where do
++we position the overlay window? Control of this can be done at
++various levels: locational control (over the server, asynchronous)
++or XID control (but that makes you depend on X and limits the
++ability to broaden it over to non-X elements such as fbsink).
++
++However, simplicity *is* an issue here. Do we really care about
++overlay? In the end, users will have to link against either FB
++or X anyway, so we might want to create separate interfaces for
++both. On the other hand, we want to be general too... This is a
++decision that we need to make as early as possible in this process.
++For now, I propose making X- and FB-based interfaces.
++
++Let's assume that we take X as a basis. Then, overlay becomes as
++simple as one function. Possible extendible by providing inputs
++(like in the mixer) and norms, although that only applies to
++input-to-analog, not to-digital... Others simply return NULL.
++
++typedef struct _GstOverlayClass {
++ GTypeInterface klass;
++
++ /* virtual functions */
++ void (* set_xwindowid) (GstOverlay *overlay,
++ XID xid);
++} GstOverlayClass;
++
++That's all! It would look similar for FB & co.
++
++4c) user input
++--------------
++And yes, user input could be an interface too. Even better, it
++should definately be. And wasn't this one of our key issues for
++0.8.0?
++
++No code here. Go implement it, lazy ass!
++
++General ways of thinking: input can come from a plugin, or from
++the application (we don't have modules for joystick input et all).
++However, plugins handling input (such as dvdsrc) need to be able
++to handle each. So we get both input-to-application as well as
++input-from-application APIs.
++
++5) Status of this document
++==========================
++The interfaces are implemented, more (for metadata, framebuffer-
++overlay, video balancing (brightness), user input etc. are all
++pending.
++
++6) Copyright and blabla
++=======================
++(c) Ronald Bultje, 2003 <rbultje@ronald.bitfreak.net> under the
++terms of the GNU Free Documentation License. See http://www.gnu.org/
++for details.
++
++And no, I'm not for hire. ;).
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/intro gstreamer-0.10.23/docs/random/intro
+--- gstreamer-0.10.23.orig/docs/random/intro 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/intro 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,16 @@
++GNOME Streamer is a pipeline-based media streaming framework. It is built
++on top of the gobject object model.
++
++A pipeline consists of at one or more each of sources, sinks, and filters.
++These elements may be combined inside container elements, which may have
++their own specific properties, and act as any other element. Each element
++has one or more pads, which are connection points. These pads are
++connected to chain from one element to the next, providing a path along
++which buffers are passed.
++
++Operation of the pipeline is fully automatic once a buffer is put in the
++front of the pipeline. As each element finishes its processing, it pushes
++the buffer to the next element through an indirect function call, by way
++of the two connected pads.
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/LICENSE gstreamer-0.10.23/docs/random/LICENSE
+--- gstreamer-0.10.23.orig/docs/random/LICENSE 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/LICENSE 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,18 @@
++/* GStreamer
++ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/matth/scheduling.txt gstreamer-0.10.23/docs/random/matth/scheduling.txt
+--- gstreamer-0.10.23.orig/docs/random/matth/scheduling.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/matth/scheduling.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,125 @@
++-----------------------------------------------------------
++- GStreamer Scheduling / Synchronization (incsched) Notes -
++-----------------------------------------------------------
++
++These notes describe deadlock scenarios and proposed solutions for
++GStreamer. This will be implemented in the INCSCHED1 branch.
++
++I. Miscelaneous proposals
++II. Liveness problems (sometimes deadlock ;) and propsed solutions
++III. State transition approach and responsibility
++
++MattH.
++
++--------------------------------
++- I. Miscalenous proposals -
++--------------------------------
++
++1. Change the names of GstThread and GstQueue to GstPtThread and GstPtQueue
++ for pthread versions of Thread and Queue.
++
++2. Change GstPtQueue to check its pads' peers' managers and make sure
++ they are different. If not, fail and generate error message. (This
++ ensures a GstPtQueue straddles a pthread boundary.)
++
++3. Change state transitions to NULL <-> READY <-> PAUSED <-> PLAYING.
++
++
++---------------------------------------------------
++- II. Deadlock Scenarios and Proposed Solutions -
++- (in the order they will be implemented) -
++---------------------------------------------------
++
++1. A downstream element "waits" for a buffer from its upstream element,
++ a state change happens and "pauses" the upstream element -- the
++ downstream element is blocked and cannot execute its change_state.
++
++ Note that this can only happen within a single GstPtQueue! Either a
++ downstream element calls Pull, finds no buffer, and does a
++ wait_cond(new buffer) or an upstream element calls Push, finds no
++ room, and does a wait_cond(new room). Thus, GstPtQueue contains all
++ the cond_wait / signal code.
++
++ => The managing container (thread, pipeline) "wakes" up any sleep
++ conditions of its "bottom half". (In the scenario described, it
++ wakes the blocked downstream element's call to Pull.) The GstPtQueue
++ cond_wait section determines that it woke up due to a pending state
++ change and does a cothread_switch(0) to return to the main loop,
++ which then executes the state transition.
++
++ Note that a managing container will have only one sleep condition
++ in its "bottom half."
++
++
++2. Element "blocked" on getting I/O and cannot execute its change_state.
++
++ => We will provide an I/O library for the elements to use that does
++ not actually block. (A retry-loop with timeout or select() on
++ 2 -- or more -- file descriptors: one the one you want I/O from,
++ the other one that GStreamer uses to "wake" everyone up.) The
++ I/O library determines that it was woken due to a pending state
++ change and does a cothread_switch(0) to return to the main loop,
++ which then executes the state transition.
++
++ Note that a managing container will have only one elements in
++ the middle of doing blocking I/O.
++
++
++3. Element using a library (code out of its control) which blocks for
++ some reason (e.g., using real blocking I/O) so main loop never gets
++ run to execute change_state.
++
++ => Build in some timeout in the manging container (the "top half")
++ when waiting for bottom half to respond to pending state. If
++ managing container times out, kill the element's thread with a
++ signal (or series of signals -- escalating priority). This
++ requires that the element (the "bottom half") have matching
++ signal handler(s) that execute(s) the state-transition.
++
++
++--------------------------------------------------------
++- III. State-transition Approach and Responsibility -
++--------------------------------------------------------
++
++A. The "top half" context of the managing container. (This is likely the
++ context of the application.)
++
++ Call change_state on the managing container (GstPipeline, GstPtThread).
++ If its "bottom half" (main_loop) is asleep, signal the condition to
++ wake it up. Then do a cond_wait for the "bottom half" to execute the
++ state transition and return (once the state has been changed).
++
++
++B. The main_loop (the "bottom half") of the managing container.
++
++ Needs to check for pending state transition after every switch back from
++ one of its elements. If a pending state is found, it calls change_state
++ on each of its elements, signals the "top half" that the state has been
++ changed, then continues executing the plan (if Playing) or puts itself
++ to sleep (Paused, Ready).
++
++
++C. Element.
++
++ Implement a change_state function to make transition for that element.
++ The elements' change_state is what actually changes the state variable
++ and notifies the scheduler that the state was changed. This function
++ may also do things like close or open resources.
++
++ NOTE: when an element goes through certain state transitions (e.g., from
++ Paused to Ready) its state (stack) will be wiped out. If it wants to
++ preserve any state or data, it needs to store the information in a safe
++ place.
++
++
++D. Cothread Scheduler.
++
++ Gets notified of state transition by elements' change_state functions
++ then (re)set the plan accordingly. Assuming
++ NULL <-> READY <-> PAUSED <-> PLAYING, some would be
++
++ + Paused -> Playing: jump back where you were in the Plan and continue
++ its execution
++
++ + Ready -> Paused: reset the cothread pointers foreach cothread in the
++ Plan (don't run)
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/metadata gstreamer-0.10.23/docs/random/metadata
+--- gstreamer-0.10.23.orig/docs/random/metadata 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/metadata 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,80 @@
++OUTDATED
++--------
++
++The point of the metadata is to provide some context for each buffer. In
++the case of audio data, for instance, it would provide the samplerate, bit
++depth, and channel count.
++
++The trick is that there may be multiple types of metadata ganged onto a
++single buffer. This is why they're going to be a GList. This does mean
++extra overhead in all cases, but I think it's minimal. The GList type
++uses a chunk allocater so we're not wasting too much memory or time when
++adding to the list.
++
++The trick is dealing with these structs as they pass through a pipeline,
++since they have potentially different mutability properties. For
++instance, if you've got a mp3 decoder connected to a tee, which sends the
++buffers off to both the decoder and a spectrum analyzer (and then a
++visualization element). The preferred setup would be where every time a
++audio/raw metadata comes down the pipe (indicating a potential change in
++audio format), the audiosink and spectrum would just save off pointers.
++
++So when exactly does this metadata go away (deallocated)? Well, that
++means metadata has to be refcounted. But that gets rather hairy. OK, in
++the simple case you create a metadata struct, it comes with refcount set
++to 1. You pass it through, it stays one, eventually someone drops the
++last reference on the buffer it's tied to, you free the metadata too.
++Easy. What if you tee? You could go through and for every metadata in
++the buffer, increment the refcount by the same as the buffer. So in the
++above case (tee'd), the audiosink and spectrum would get the buffer with a
++refcount of 2, and it'd have a metadata with refcount 2. Do they ref it
++each themselves, then unref the buffer? Or do they remove the metadata?
++Removing the metadata would require a buffer CoW, which would suck, so
++yes, they'd just ref the metadata.
++
++But.... what if they're all in different threads? Then we're off into
++the magical world of mutexes. Everything with a refcount in a threaded
++world must be mutexed, else you can do atomic increment and atomic
++dec&test. Can this be done from C easily? Perhaps it needs to be found
++from kernel includes via autoconf?
++
++
++
++
++The goal in designing the way metadata will be defined and used is to keep
++it as simple as possible. The basis for accomplishing this is the fact
++that in order to actually use (rather than just pass) the metadata, you
++have to know what the fields are, which means you have to have compiled in
++support for that metadata at build time. Therefore, if you're using
++metadata, you must have build-time access to the necessary include file
++that defines it.
++
++So, given that you've got an include file, it would be nice if the whole
++thing could be contained there. This would limit the need to be linked
++against something, or have load-time requirements as to that has to be
++loaded before you are.
++
++Given that really all metadata is is a region of memory of a given size
++with a certain signature, this isn't all that hard. First you lay out the
++struct that defines the metadata. Then you set up #defines that expand to
++the size of the struct in question, as well as the four-cc code that
++defines the type.
++
++The work is done by a few #defines, a la the #defines used in all Gtk
++objects. The first is a NEW() method that allocates the memory for the
++metadata and fills in all the normal fields (type, size, utility
++functions). Because of the way it's defined (as a #define, no less),
++you'll have to invoke it as META_NEW(meta), since it can't return()
++anything.
++
++Another #define will check to make sure a meta is indeed that type by
++verifying the type code and size. Theoretically, meta types can overlap
++with the same fourcc code, as long as they have different sizes. But I
++probably ought to have a global public registry so people writing things
++don't conflict. MSFT got that right, at least.
++
++So, a hairy problem is what to do when there are utility functions
++associated with one of these things. One option is to not bother with
++them. This is very likely a possible solution, since metadata is supposed
++to be flat memory of a given size. Not much to do to either free or copy
++it, is there?
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/mimetypes gstreamer-0.10.23/docs/random/mimetypes
+--- gstreamer-0.10.23.orig/docs/random/mimetypes 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/mimetypes 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,634 @@
++MIME types in GStreamer
++
++What is a MIME type ?
++=====================
++
++A MIME type is a combination of two (short) strings (words)---the content type
++and the content subtype. Content types are broad categories used for describing
++almost all types of files: video, audio, text, and application are common
++content types. The subtype further breaks the content type down into a more
++specific type description, for example 'application/ogg', 'audio/raw',
++'video/mpeg', or 'text/plain'.
++
++So the content type and subtype make up a pair that describes the type of
++information contained in a file. In multimedia processing, MIME types are used
++to describe the type of information carried by a media stream. In GStreamer, we
++use MIME types in the same way, to identify the types of information that are
++allowed to pass between GStreamer elements. The MIME type is part of a GstCaps
++object that describes a media stream. Besides a MIME type, a GstCaps object also
++contains a name and some stream properties (GstProps, which hold combinations of
++key/value pairs).
++
++An example of a MIME type is 'video/mpeg'. A corresponding GstCaps could be
++created using code:
++
++GstCaps *caps = gst_caps_new_simple ("video/mpeg",
++ "width", G_TYPE_INT, 384,
++ "height", G_TYPE_INT, 288,
++ NULL);
++
++MIME types and their corresponding properties are of major importance in
++GStreamer for uniquely identifying media streams. Therefore, we define them
++per media type. All GStreamer plugins should keep to this definition.
++
++Official MIME media types are assigned by the IANA. Current assignments are at
++http://www.iana.org/assignments/media-types/.
++
++The problems
++============
++
++Some streams may have MIME types or GstCaps that do not fully describe the
++stream. In most cases, this is not a problem, though. For example, if a stream
++contains Ogg/Vorbis data (which is of type 'application/ogg'), we don't need to
++know the samplerate of the raw audio stream, since we can't play the encoded
++audio anyway. The samplerate is, however, important for raw audio, so a decoder
++would need to retrieve the samplerate from the Ogg/Vorbis stream headers (the
++headers are part of the bytestream) in order to pass it on in the GstCaps that
++belongs to the decoded audio (which becomes a type like 'audio/raw'). However,
++other plugins might want to know such properties, even for compressed streams.
++One such example is an AVI muxer, which does want to know the samplerate of an
++audio stream, even when it is compressed.
++
++Another problem is that many media types can be defined in multiple ways. For
++example, MJPEG video can be defined as 'video/jpeg', 'video/mjpeg',
++'image/jpeg', 'video/x-msvideo' with a compression of (fourcc) MJPG, etc.
++None of these is really official, since there isn't an official mimetype
++for encoded MJPEG video.
++
++The main focus of this document is to propose a standardized set of MIME types
++and properties that will be used by the GStreamer plugins.
++
++Different types of streams
++==========================
++
++There are several types of media streams. The most important distinction will be
++container formats, audio codecs and video codecs. Container formats are
++bytestreams that contain one or more substreams inside it, and don't provide any
++direct media data itself. Examples are Quicktime, AVI or MPEG System Stream.
++They mostly contain of a set of headers that define the media streams that are
++packed inside the container, along with the media data itself.
++
++Video codecs and audio codecs describe encoded audio or video data. Examples are
++MPEG-1 video, DivX video, MPEG-1 layer 3 (MP3) audio or Ogg/Vorbis audio.
++Actually, Ogg is a container format too (for Vorbis audio), but these are
++usually used in conjunction with each other.
++
++Finally, there are the somewhat obvious (but not commonly encountered as files)
++raw data formats.
++
++Container formats
++-----------------
++
++1 - AVI (Microsoft RIFF/AVI)
++ MIME type: video/x-msvideo
++ Properties:
++ Parser: avidemux, ffdemux_avi
++ Formatter: avimux
++
++2 - Quicktime (Apple)
++ MIME type: video/quicktime
++ Properties:
++ Parser: qtdemux
++ Formatter:
++
++3 - MPEG (MPEG LA)
++ MIME type: video/mpeg
++ Properties: 'systemstream' = TRUE (BOOLEAN)
++ Parser: mpegdemux, ffdemux_mpeg (PS), ffdemux_mpegts (TS), dvddemux
++ Formatter: mplex
++
++4 - ASF (Microsoft)
++ MIME type: video/x-ms-asf
++ Properties:
++ Parser: asfdemux, ffdemux_asf
++ Formatter: asfmux
++
++5 - WAV (Microsoft RIFF/WAV)
++ MIME type: audio/x-wav
++ Properties:
++ Parser: wavparse, ffdemux_wav
++ Formatter: wavenc
++
++6 - RealMedia (Real)
++ MIME type: application/vnd.rn-realmedia
++ Properties: 'systemstream' = TRUE (BOOLEAN)
++ Parser: rmdemux, ffdemux_rm
++ Formatter:
++
++7 - DV (Digital Video)
++ MIME type: video/x-dv
++ Properties: 'systemstream' = TRUE (BOOLEAN)
++ Parser: gst1394, ffdemux_dv
++ Formatter:
++
++8 - Ogg (Xiph)
++ MIME type: application/ogg
++ Properties:
++ Parser: oggdemux
++ Formatter: oggmux
++
++9 - Matroska
++ MIME type: video/x-mkv
++ Properties:
++ Parser: matroskademux, ffdemux_matroska
++ Formatter: matroskamux
++
++10 - Shockwave (Macromedia)
++ MIME type: application/x-shockwave-flash
++ Properties:
++ Parser: swfdec, ffdemux_swf
++ Formatter:
++
++11 - AU audio (Sun)
++ MIME type: audio/x-au
++ Properties:
++ Parser: auparse, ffdemux_au
++ Formatter:
++
++12 - Mod audio
++ MIME type: audio/x-mod
++ Properties:
++ Parser: modplug, mikmod
++ Formatter:
++
++13 - FLX video
++ MIME type: video/x-fli
++ Properties:
++ Parser: flxdec
++ Formatter:
++
++14 - Monkeyaudio
++ MIME type: application/x-ape
++ Properties:
++ Parser:
++ Formatter:
++
++15 - AIFF audio
++ MIME type: audio/x-aiff
++ Properties:
++ Parser:
++ Formatter:
++
++16 - SID audio
++ MIME type: audio/x-sid
++ Properties:
++ Parser: siddec
++ Formatter:
++
++Please note that we try to keep these MIME types as similar as possible to the
++MIME types used as standards in Gnome (Gnome-VFS/Nautilus) and KDE
++(Konqueror). Both will (in future) stick to a shared-mime-info database that
++is hosted on freedesktop.org, and bases itself on IANA.
++
++Also, there is a very thin line between audio codecs and audio containers
++(take mp3 vs. sid, etc.). This is just a per-case thing right now and needs to
++be documented further.
++
++Video codecs
++------------
++
++For convenience, the fourcc codes used in the AVI container format will be
++listed along with the MIME type and optional properties.
++
++Optional properties for all video formats are the following:
++
++width = 1 - MAXINT (INT)
++height = 1 - MAXINT (INT)
++pixel_width = 1 - MAXINT (INT, with pixel_height forms aspect ratio)
++pixel_height = 1 - MAXINT (INT, with pixel_width forms aspect ratio)
++framerate = 0 - MAXFLOAT (FLOAT)
++
++1 - MPEG-1, -2 and -4 video (ISO/LA MPEG)
++ MIME type: video/mpeg
++ Properties: systemstream = FALSE (BOOLEAN)
++ mpegversion = 1/2/4 (INT)
++ Known fourccs: MPEG, MPGI
++ Encoder: mpeg1enc, mpeg2enc
++ Decoder: mpeg1dec, mpeg2dec, mpeg2subt
++
++2 - DivX 3.x, 4.x and 5.x video (divx.com)
++ MIME type: video/x-divx
++ Properties:
++ Optional properties: divxversion = 3/4/5 (INT)
++ Known fourccs: DIV3, DIV4, DIV5, DIVX, DX50, DIVX, divx
++ Encoder: divxenc
++ Decoder: divxdec, ffdec_mpeg4
++
++3 - Microsoft MPEG 4.1, 4.2 and 4.3
++ MIME type: video/x-msmpeg
++ Properties:
++ Optional properties: msmpegversion = 41/42/43 (INT)
++ Known fourccs: MPG4, MP42, MP43
++ Encoder: ffenc_msmpeg4, ffenc_msmpeg4v1, ffenc_msmpeg4v2
++ Decoder: ffdec_msmpeg4, ffdec_msmpeg4v1, ffdec_msmpeg4v2
++
++4 - Motion-JPEG (official and extended)
++ MIME type: video/x-jpeg
++ Properties:
++ Known fourccs: MJPG (YUY2 MJPEG), JPEG (any), PIXL (Pinnacle/Miro), VIXL
++ Encoder: jpegenc
++ Decoder: jpegdec, ffdec_mjpeg
++
++5 - Sorensen (Quicktime - SVQ1/SVQ3)
++ MIME types: video/x-svq
++ Properties: svqversion = 1/3 (INT)
++ Encoder:
++ Decoder: ffdec_svq1, ffdec_svq3
++
++6 - H263 and related codecs
++ MIME type: video/x-h263
++ Properties:
++ Known fourccs: H263/h263, i263, L263, M263/m263, s263, x263, VDOW, VIVO
++ Encoder: ffenc_h263, ffenc_h263p
++ Decoder: ffdec_h263, ffdec_h263i
++
++7 - RealVideo (Real)
++ MIME type: video/x-pn-realvideo
++ Properties: rmversion = "1"/"2"/"3"/"4" (INT)
++ Known fourccs: RV10, RV20, RV30, RV40
++ Encoder: ffenc_rv10
++ Decoder: ffdec_rv10, ffdec_rv20
++
++8 - Digital Video (DV)
++ MIME type: video/x-dv
++ Properties: systemstream = FALSE (BOOLEAN)
++ Known fourccs: DVSD/dvsd (SDTV), dvhd (HDTV), dvsl (SDTV LongPlay)
++ Encoder: ffenc_dvvideo
++ Decoder: dvdec, ffdec_dvvideo
++
++9 - Windows Media Video 1, 2 and 3 (WMV)
++ MIME type: video/x-wmv
++ Properties: wmvversion = 1/2/3 (INT)
++ Encoder: ffenc_wmv1, ffenc_wmv2, none
++ Decoder: ffdec_wmv1, ffdec_wmv2, none
++
++10 - XviD (xvid.org)
++ MIME type: video/x-xvid
++ Properties:
++ Known fourccs: xvid, XVID
++ Encoder: xvidenc
++ Decoder: xviddec, ffdec_mpeg4
++
++11 - 3IVX (3ivx.org)
++ MIME type: video/x-3ivx
++ Properties:
++ Known fourccs: 3IV0, 3IV1, 3IV2
++ Encoder:
++ Decoder:
++
++12 - Ogg/Tarkin (Xiph)
++ MIME type: video/x-tarkin
++ Properties:
++ Encoder:
++ Decoder:
++
++13 - VP3
++ MIME type: video/x-vp3
++ Properties:
++ Encoder:
++ Decoder: ffdec_vp3
++
++14 - Ogg/Theora (Xiph, VP3-like)
++ MIME type: video/x-theora
++ Properties:
++ Encoder: theoraenc
++ Decoder: theoradec, ffdec_theora
++ This is the raw stream that comes out of an ogg file.
++
++15 - Huffyuv
++ MIME type: video/x-huffyuv
++ Properties:
++ Known fourccs: HFYU
++ Encoder:
++ Decoder: ffdec_hfyu
++
++16 - FF Video 1 (FFMPEG)
++ MIME type: video/x-ffv
++ Properties: ffvversion = 1 (INT)
++ Encoder:
++ Decoder: ffdec_ffv1
++
++17 - H264
++ MIME type: video/x-h264
++ Properties:
++ Known fourccs: VSSH
++ Encoder:
++ Decoder: ffdec_h264
++
++18 - Indeo 3 (Intel)
++ MIME type: video/x-indeo
++ Properties: indeoversion = 3 (INT)
++ Encoder:
++ Decoder: ffdec_indeo3
++
++19 - Portable Network Graphics (PNG)
++ MIME type: video/x-png
++ Properties:
++ Encoder: pngenc
++ Decoder: pngdec, gdkpixbufdec
++
++20 - Cinepak
++ MIME type: video/x-cinepak
++ Properties:
++ Encoder:
++ Decoder: ffdec_cinepak
++
++TODO: subsampling information for YUV?
++
++TODO: colorspace identifications for MJPEG? How?
++
++TODO: how to distinguish MJPEG-A/B (Quicktime) and lossless JPEG?
++
++TODO: divx4/divx5/xvid/3ivx/mpeg-4 - how to make them overlap? (all
++ ISO MPEG-4 compatible)
++
++3c) Audio Codecs
++----------------
++For convenience, the two-byte hexcodes (as used for identification in AVI files)
++are also given.
++
++Properties for all audio formats include the following:
++
++rate = 1 - MAXINT (INT, sampling rate)
++channels = 1 - MAXINT (INT, number of audio channels)
++
++1 - Alaw Raw Audio
++ MIME type: audio/x-alaw
++ Properties:
++ Encoder: alawenc
++ Decoder: alawdec
++
++2 - Mulaw Raw Audio
++ MIME type: audio/x-mulaw
++ Properties:
++ Encoder: mulawenc
++ Decoder: mulawdec
++
++3 - MPEG-1 layer 1/2/3 audio
++ MIME type: audio/mpeg
++ Properties: mpegversion = 1 (INT)
++ layer = 1/2/3 (INT)
++ Encoder: lame, ffdec_mp3
++ Decoder: mad
++
++4 - Ogg/Vorbis
++ MIME type: audio/x-vorbis
++ Encoder: rawvorbisenc (vorbisenc does rawvorbisenc+oggmux)
++ Decoder: vorbisdec
++
++5 - Windows Media Audio 1, 2 and 3 (WMA)
++ MIME type: audio/x-wma
++ Properties: wmaversion = 1/2/3 (INT)
++ Encoder:
++ Decoder: ffdec_wmav1, ffdec_wmav2, none
++
++6 - AC3
++ MIME type: audio/x-ac3
++ Properties:
++ Encoder: ffenc_ac3
++ Decoder: a52dec, ac3parse
++
++7 - FLAC (Free Lossless Audio Codec)
++ MIME type: audio/x-flac
++ Properties:
++ Encoder: flacenc
++ Decoder: flacdec, ffdec_flac
++
++8 - MACE 3/6 (Quicktime audio)
++ MIME type: audio/x-mace
++ Properties: maceversion = 3/6 (INT)
++ Encoder:
++ Decoder: ffdec_mace3, ffdec_mace6
++
++9 - MPEG-4 AAC
++ MIME type: audio/mpeg
++ Properties: mpegversion = 4 (INT)
++ Encoder: faac
++ Decoder: faad
++
++10 - (IMA) ADPCM (Quicktime/WAV/Microsoft/4XM)
++ MIME type: audio/x-adpcm
++ Properties: layout = "quicktime"/"wav"/"microsoft"/"4xm"/"g721"/"g722"/"g723_3"/"g723_5" (STRING)
++ Encoder: ffenc_adpcm_ima_[qt/wav/dk3/dk4/ws/smjpeg], ffenc_adpcm_[ms/4xm/xa/adx/ea]
++ Decoder: ffdec_adpcm_ima_[qt/wav/dk3/dk4/ws/smjpeg], ffdec_adpcm_[ms/4xm/xa/adx/ea]
++
++ Note: The difference between each of these four PCM formats is the number
++ of samples packed together per channel. For WAV, for example, each
++ sample is 4 bit, and 8 samples are packed together per channel in the
++ bytestream. For the others, refer to technical documentation. We
++ probably want to distinguish these differently, but I don't know how,
++ yet.
++
++11 - RealAudio (Real)
++ MIME type: audio/x-pn-realaudio
++ Properties: raversion ="1"/"2" (INT)
++ Known fourccs: 14_4, 28_8
++ Encoder:
++ Decoder: ffdec_real_144 / ffdec_real_288
++
++12 - DV Audio
++ MIME type: audio/x-dv
++ Properties:
++ Encoder:
++ Decoder:
++
++13 - GSM Audio
++ MIME type: audio/x-gsm
++ Properties:
++ Encoder: gsmenc, rtpgsmenc
++ Decoder: gsmdec, rtpgsmparse
++
++14 - Speex audio
++ MIME type: audio/x-speex
++ Properties:
++ Encoder: speexenc
++ Decoder: speexdec
++
++15 - QDM2
++ MIME type: audio/x-qdm2
++ Properties:
++
++16 - Sony ATRAC4 (detected inside realmedia and wave/avi streams, nothing to decode it yet)
++ MIME type: audio/x-vnd.sony.atrac3
++ Properties:
++ Encoder:
++ Decoder:
++
++17 - Ensoniq PARIS audio
++ MIME type: audio/x-paris
++ Properties:
++ Encoder:
++ Decoder:
++
++18 - Amiga IFF / SVX8 / SV16 audio
++ MIME type: audio/x-svx
++ Properties:
++ Encoder:
++ Decoder:
++
++19 - Sphere NIST audio
++ MIME type: audio/x-nist
++ Properties:
++ Encoder:
++ Decoder:
++
++20 - Sound Blaster VOC audio
++ MIME type: audio/x-voc
++ Properties:
++ Encoder:
++ Decoder:
++
++21 - Berkeley/IRCAM/CARL audio
++ MIME type: audio/x-ircam
++ Properties:
++ Encoder:
++ Decoder:
++
++22 - Sonic Foundry's 64 bit RIFF/WAV
++ MIME type: audio/x-w64
++ Properties:
++ Encoder:
++ Decoder:
++
++TODO: adpcm/dv needs confirmation from someone with knowledge...
++
++Raw formats
++-----------
++
++Raw formats contain unencoded, raw media information. These are rather rare from
++an end user point of view since raw media files have historically been
++prohibitively large ... hence the multitude of encoding formats.
++
++Raw video formats require the following common properties, in addition to
++format-specific properties:
++
++width = 1 - MAXINT (INT)
++height = 1 - MAXINT (INT)
++
++1 - Raw Video (YUV/YCbCr)
++ MIME type: video/x-raw-yuv
++ Properties: 'format' = 'XXXX' (fourcc)
++ Known fourccs: YUY2, I420, Y41P, YVYU, UYVY, etc.
++ Properties:
++
++ Some raw video formats have implicit alignment rules. We should discuss this
++ more. Also, some formats have multiple fourccs (e.g. IYUV/I420 or
++ YUY2/YUYV). For each of these, we only use one (e.g. I420 and YUY2).
++
++ Currently recognized formats:
++
++ YUY2: packed, Y-U-Y-V order, U/V hor 2x subsampled (YUV-4:2:2, 16 bpp)
++ YVYU: packed, Y-V-Y-U order, U/V hor 2x subsampled (YUV-4:2:2, 16 bpp)
++ UYVY: packed, U-Y-V-Y order, U/V hor 2x subsampled (YUV-4:2:2, 16 bpp)
++ Y41P: packed, UYVYUYVYYYYY order, U/V hor 4x subsampled (YUV-4:1:1, 12 bpp)
++ IUY2: packed, U-Y-V order, not subsampled (YUV-1:1:1, 24 bpp)
++
++ Y42B: planar, Y-U-V order, U/V hor 2x subsampled (YUV-4:2:2, 16 bpp)
++ YV12: planar, Y-V-U order, U/V hor+ver 2x subsampled (YUV-4:2:0, 12 bpp)
++ I420: planar, Y-U-V order, U/V hor+ver 2x subsampled (YUV-4:2:0, 12 bpp)
++ Y41B: planar, Y-U-V order, U/V hor 4x subsampled (YUV-4:1:1, 12bpp)
++ YUV9: planar, Y-U-V order, U/V hor+ver 4x subsampled (YUV-4:1:0, 9bpp)
++ YVU9: planar, Y-V-U order, U/V hor+ver 4x subsampled (YUV-4:1:0, 9bpp)
++
++ Y800: one-plane (Y-only, YUV-4:0:0, 8bpp)
++
++ See http://www.fourcc.org/ for more information.
++
++ Note: YUV-4:4:4 (both planar and packed, in multiple orders) are missing.
++
++2 - Raw video (RGB)
++ MIME type: video/x-raw-rgb
++ Properties: endianness = 1234/4321 (INT) <- use G_LITTLE_ENDIAN/G_BIG_ENDIAN
++ depth = 15/16/24 (INT, color depth)
++ bpp = 16/24/32 (INT, bits used to store each pixel)
++ red_mask = bitmask (0x..) (INT)
++ green_mask = bitmask (0x..) (INT)
++ blue_mask = bitmask (0x..) (INT)
++
++ 24 and 32 bit RGB should always be specified as big endian, since any little
++ endian format can be transformed into big endian by rearranging the color
++ masks. 15 and 16 bit formats should generally have the same byte order as
++ the CPU.
++
++ Color masks are interpreted by loading 'bpp' number of bits using the given
++ 'endianness', and masking and shifting by each color mask. Loading a 24-bit
++ value cannot be done directly, but one can perform an equivalent operation.
++
++ Examples:
++ msb .. lsb
++ - memory: RRRRRRRR GGGGGGGG BBBBBBBB RRRRRRRR GGGGGGGG ...
++ bpp = 24
++ depth = 24
++ endianness = 4321 (G_BIG_ENDIAN)
++ red_mask = 0xff0000
++ green_mask = 0x00ff00
++ blue_mask = 0x0000ff
++
++ - memory: xRRRRRGG GGGBBBBB xRRRRRGG GGGBBBBB xRRRRRGG ...
++ bpp = 16
++ depth = 15
++ endianness = 4321 (G_BIG_ENDIAN)
++ red_mask = 0x7c00
++ green_mask = 0x03e0
++ blue_mask = 0x003f
++
++ - memory: GGGBBBBB xRRRRRGG GGGBBBBB xRRRRRGG GGGBBBBB ...
++ bpp = 16
++ depth = 15
++ endianness = 1234 (G_LITTLE_ENDIAN)
++ red_mask = 0x7c00
++ green_mask = 0x03e0
++ blue_mask = 0x003f
++
++The raw audio formats require the following common properties, in addition to
++format-specific properties:
++
++rate = 1 - MAXINT (INT, sampling rate)
++channels = 1 - MAXINT (INT, number of audio channels)
++endianness = 1234/4321 (INT) <- use G_LITTLE_ENDIAN/G_BIG_ENDIAN/G_BYTE_ORDER
++
++3 - Raw audio (integer format)
++ MIME type: audio/x-raw-int
++ properties: width = 8/16/24/32 (INT, bits used to store each sample)
++ depth = 8 - 32 (INT, bits actually used per sample)
++ signed = TRUE/FALSE (BOOLEAN)
++
++4 - Raw audio (floating point format)
++ MIME type: audio/x-raw-float
++ Properties: width = 32/64 (INT)
++ buffer-frames: number of audio frames per buffer, 0=undefined
++
++Plugin Guidelines
++=================
++
++So, a short bit on what plugins should do. Above, I've stated that audio
++properties like 'channels' and 'rate' or video properties like 'width' and
++'height' are all optional. This doesn't mean you can just simply omit them and
++everything will still work!
++
++An example is the best way to explain all this. AVI needs the width, height,
++rate and channels for the AVI header. So if these properties are missing, the
++avimux element cannot properly create the AVI header. On the other hand, MPEG
++doesn't have such properties in its header, so the mpegdemux element would need
++to parse the separate streams in order to find them out. We don't want that
++either, because a plugin only does one job. So normally, mpegdemux and avimux
++wouldn't allow transcoding. To solve this problem, there are stream parser
++elements (such as mpegaudioparse, ac3parse and mpeg1videoparse).
++
++Conclusions to draw from here: a plugin gives info it can provide as seen from
++its own task/job. If it can't, other elements might still need it and a stream
++parser needs to be written if it doesn't already exist.
++
++On properties that can be described by one of these (properties such as 'width',
++'height', 'fps', etc.): they're forbidden and should be handled using filtered
++caps.
++
++Status of this document
++=======================
++
++Not all plugins strictly follow these guidelines yet, but these are the official
++types. Plugins not following these specs either use extensions that should be
++documented, or are buggy (and should be fixed).
++
++Blame Ronald Bultje <rbultje@ronald.bitfreak.net> aka BBB for any mistakes in
++this document.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/moving-plugins gstreamer-0.10.23/docs/random/moving-plugins
+--- gstreamer-0.10.23.orig/docs/random/moving-plugins 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/moving-plugins 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,143 @@
++Moving around plug-ins between source modules
++---------------------------------------------
++
++Last updated: 2006-09-01
++
++How to get your plug-in out of -bad and into -good or -ugly
++-----------------------------------------------------------
++
++Since GStreamer 0.9.x, we have four plugin modules: -base, -good, -ugly,
++and -bad. Plug-ins are by default added to -bad. They can only move
++to -good or -ugly if a number of conditions are met:
++
++PEOPLE
++------
++- People involved:
++ - There should be a person who is actively going to maintain this element;
++ presumably this is the person writing the plug-in in the first place
++ and opening the move request
++ - There should be a GStreamer hacker who is willing to sponsor the element;
++ this would be someone who is going to help out getting all the conditions
++ met, act as a mentor if necessary,...
++ - There should be a core developer who verifies that the checklist is
++ met
++
++ The three roles can be filled by two people, but not just one.
++
++ In addition, an admin needs to perform the actual move, which involves
++ CVS surgery.
++
++PROCESS
++-------
++- bug in bugzilla gets filed by someone requesting a move from bad
++ to good/ugly
++ This is "requesting" the move.
++- a second person reviews the request and code, and verifies that the
++ plugin meets the checklist items below, by commenting on the bug
++ and giving a rundown of what still needs to be done
++ This is "sponsoring" the move.
++- when the checklist is met, a third person can approve the move.
++ This is "approving" the move.
++- an admin performs the move.
++ This is "performing" the move. (Are you laughing yet ?)
++
++CHECKLIST
++---------
++- The plug-in's code:
++ - should descend from an applicable base class if possible
++ - make use of GST_BOILERPLATE macros
++ - conform to the GStreamer coding style
++ - use a custom debug category
++ - use GST_(DEBUG/*)_OBJECT
++ - use dashes in object property names to separate words
++ - use correct value, name, nick for enums
++ - use underscores in macros/function names/structs
++ e.g.: GST_BASE_SINK, GstBaseSink, gst_base_sink_
++ - use g_assert(), g_return_if_fail(), g_return_val_if_fail() for pre/post
++ condition checks
++ - must not have any functional code within g_assert(), g_return_if_fail() or
++ g_return_val_if_fail() statements, since those would be turned into NO-OPS
++ if the code is compiled with -DG_DISABLE_CHECKS (as is often done on
++ embedded systems).
++
++- The plug-in's build:
++ - should be correctly integrated with configure.ac
++ - files implementing elements should be named according to their class name,
++ e.g GstBaseSink -> gstbasesink.c
++ - should list libs and cflags in stack order, with lowest in the stack first
++ (so one can link against highest in the stack somewhere else without
++ picking up everything from the somewhere else)
++ e.g. $(GST_PLUGINS_BASE_CFLAGS) \
++ $(GST_BASE_CFLAGS) \
++ $(GST_CFLAGS) $(CAIRO_CFLAGS)
++
++- The compiled plug-in:
++ - should show up correct in gst-inspect output; no warnings, no unknown
++ types, ...
++
++- The plug-in should be put in the correct location inside the module:
++ sys/: plug-ins that include system headers/link to system libraries;
++ usually platform-dependent as well
++ name after whatever system "thing" they use (oss, v4l, ...)
++ gst/: plug-ins with no external dependencies, only GLib/GStreamer/liboil
++ ext/: plug-ins with external dependencies
++
++- The plug-in is documented:
++ - the compiled-in descriptions (element details) should be correct
++ - every element in the plug-in should have gtk-doc documentation:
++ - longer description of element
++ - why you would use this element
++ - example launch line OR example source code
++ (for example, see
++ http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-plugins/html/gst-plugins-base-plugins-audiotestsrc.html
++ for the first and
++ http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-level.html
++ for the second)
++ - if the element has custom messages, they should be documented
++ - signals and properties should be documented
++
++- The plug-in should come with tests:
++ - preferably, a unit test should be written, testing things like:
++ - setup and teardown
++ - push in buffers in all supported formats and verify they are handled
++ properly
++ - push in buffers that trigger error cases, and verify errors are
++ correctly thrown
++
++ for example, see gst-plugins-base/check/elements/audioconvert
++
++ The unit test should be put in check/elements/(nameofelement)
++ and be added to check_PROGRAMS and Makefile.am
++
++ - if a unit test is not appropriate (for example, device elements),
++ a test application should be written that can be run manually
++
++- The tests should be leak-free, tested with valgrind
++ - the unit tests in check/ dirs are valgrinded by default
++ - the manual tests should have a valgrind target
++ - leaks in the supporting library (and verified to be in the supporting
++ library !) can be added to suppression files
++
++- The elements should not segfault under any circumstance. This includes:
++ - wrong pipelines
++ - bad data
++
++- The plugins need to be marked correctly for translations.
++- All error conditions should be correctly handled using GST_ELEMENT_ERROR
++ and following practice outlined in
++ http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstGError.html
++ - this includes:
++ - message strings need to be marked for translation
++ - should be short, well-written, clear
++ - in particular, should *not* contain debug info, strerror, errno, ...
++ No, really ! NO STRERROR, NO ERRNO. If you are too lazy to provide
++ the user of your library with a nice experience, put your crap in
++ the debug string
++
++- Decision should be made if it should go into good (LGPL license,
++ LGPL dependencies, no patent issues) or ugly
++
++- plugin documentation needs to be added:
++ - see gstreamer/docs/README; section on adding plugins and elements
++ - "make update" in docs/plugins and commit the new file
++ - edit -docs.sgml and add an include for the file
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/mutability gstreamer-0.10.23/docs/random/mutability
+--- gstreamer-0.10.23.orig/docs/random/mutability 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/mutability 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,30 @@
++Mutability is the property of an object that defines whether or not you
++are allowed to modify it. In the context of GST, that means that if you
++want to mutilate a buffer, say to do an audio effect, you may have to do
++this on a copy of the buffer, if someone else has a reference on it.
++
++The simplest sequence of events in a decoder pipeline is as follows:
++
++1) create buffer
++2) allocate and fill data region, attach to buffer
++3) pass to next element
++4) decode the data into new buffer, free original buffer
++5) pass to next element
++6) buffer gets copied to output device (sound, video, whatever)
++
++Both of these buffers are created from malloc()'d memory, are referenced
++by one and only one element at a time, and are never modified in place.
++They have no special flags, and when ref==0, they're simply free()'d.
++
++An optimization in the case of the sound card or video double buffering,
++where the output buffer actually comes from the output device. In that
++case the element will be aware of such things.
++
++A more complex example is where the data is teed after being decoded, sent
++to an effects or visualization object.
++
++1) create buffer, fill from source
++2) hand to decoder
++3) create new buffer, decode into it, free old buffer
++4) hand to tee
++5) ref++, hand off to
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/negotiation gstreamer-0.10.23/docs/random/negotiation
+--- gstreamer-0.10.23.orig/docs/random/negotiation 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/negotiation 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,286 @@
++
++Some notes on pad negotiation
++
++
++A "pad link" is a connection between two pads. It can be in one of
++two states, "negotiated" or "not negotiated". Pad links are created
++by gst_pad_link().
++
++A "pad link" is created when two pads are linked using gst_pad_link().
++When initially created, the link only specifies a src pad, a sink pad,
++and optionally a filter caps provided by the application.
++
++In order to pass data through a link, the peer pads must decide on
++what data format to use. This is called negotiation. Pads
++describe acceptable data formats by using a combination of pad
++template caps and (optionally) a pad->getcaps function.
++
++
++Negotiation can happen in one of two forms, directed or undirected.
++Directed negotiation happens when one element has decided (usually
++during negotiation on another pad) to ask for a specific format on
++a pad. This happens when a pad calls gst_pad_try_set_caps().
++Undirected negotiation happens when the core decides to negotiate
++a link, either due to a state change or a specific application
++request.
++
++Steps in undirected negotiation (core view):
++
++ - core checks that both pad's parent elements are in the READY or
++ higher state.
++
++ - core calls gst_pad_get_caps() on each pad, intersects the two caps,
++ and intersects again with the filter caps. If the intersection is
++ empty, then the pads have no formats in common, and the link fails.
++
++ - If the intersection caps is not fixed, there are multiple possible
++ formats that the link could use. If this is the case, fixate
++ functions are called until the caps are fixed. The fixate functions
++ are called by priority -- src application fixate function, sink
++ application fixate function, src and sink fixate functions, and
++ the default core fixate function. The application fixate functions
++ are implemented by the "fixate" signal on each pad. The core
++ loops through the fixate functions until a fixed caps is decided
++ on.
++
++ - Each pad may have a pad_link function, which is called with the
++ fixed caps. The pad_link function has the option of accepting,
++ rejecting, or delaying the negotiation.
++
++ - If both pads accept the caps, the link is then negotiated.
++
++Steps in directed negotiation (gst_pad_try_set_caps):
++
++ - the originator is the pad that gst_pad_try_set_caps() is called
++ on.
++
++ - the elements owning both pads are assumed to be in a non-NULL state
++
++ - the caps argument of try_set_caps() must be fixed.
++
++ - gst_pad_get_caps() is called on the peer pad, and intersected with
++ the originating pad's pad template caps and the filter caps. The
++ caps argument is checked to be a subset of the intersection. (It's
++ important that this intersection uses the pad _template_ caps.)
++
++ - Fixate functions don't need to be called, since the caps are
++ already fixed.
++
++ - The peer's pad_link function is called.
++
++ - If the peer's pad_link function accepts the caps, the link is then
++ negotiated.
++
++ - If the peer's pad_link function refuses the caps, and the link had
++ already been negotiated, the peer's pad_link function is called
++ with the caps of the old negotiation.
++
++ - Note: the originator's pad_link function is _not_ called. The
++ originator must take appropriate alternative steps.
++
++
++Notes about renegotiation:
++
++ - same as negotiation. Note that get_caps() functions should always
++ ignore the currently negotiated caps of a link.
++
++ - if renegotiation fails, the previous negotiation is still in effect.
++ If the renegotiation fails in the last pad_link step, the pad_link
++ functions are called with the previously negotiated caps.
++
++
++Notes for sources and sinks:
++
++ - sources and sinks that talk to hardware may not be able to fully
++ describe their available formats, and thus need to rely on pad_link
++ functions to test a particular format. FIXME: currently, the core
++ completely fails negotiation if a pad_link function refuses a caps,
++ instead of attempting with an alternate caps.
++
++ Example: Assume osssink advertises rate=(int)[8000,48000], but
++ the device cannot actually handle rate=44100 (unknown to osssink).
++ Assume that the pad_link function is called with rate=44100 --
++ ideally, the pad_link function should return GST_PAD_LINK_DELAYED,
++ and future calls to getcaps should return {[8000,44099],[44101,
++ 48000]}. I don't know how to make this easy and/or work well.
++
++
++Notes for decoders/demuxers:
++
++ - Decoders will typically negotiate a sink pad, receive some data,
++ determine the output format, and call try_set_caps() with the given
++ format. If the output format is non-fixed, gst_pad_renegotiate()
++ may be used instead, in order to have the fixate functions choose
++ the optimal format. Note that this requires communication so that
++ the pad's getcaps function returns the correct caps.
++
++Notes for converters:
++
++ - Converters change one or more properties of the format of a data
++ stream. A typical converter's getcaps function will call
++ gst_pad_get_allowed_caps() for the opposite pad in the element,
++ change one or more fields in the caps, and return the result.
++
++ - getcaps function:
++
++ - call gst_pad_get_allowed_caps() on the other pad in the element
++
++ - for each possible format ("A") in the allowed caps, determine all
++ the formats ("B") that your converter could convert the original
++ format (A) to. The union of all these formats (all the B's) is
++ the caps that should be returned. (This is how to do it
++ _theoretically_, but an optimal implementation will probably be
++ quite different.)
++ For example, a simple way to do this for an element that can convert
++ a given field of the caps is to remove the field(s) from the structure,
++ then intersect with the pad template.
++
++ - As an example, videoscale can convert any sized video to any other
++ sized video. Its getcaps function iterates over each structure in
++ the caps, and replaces the width and height with the range
++ [1,MAXINT].
++
++ - pad_link function:
++
++ - the "otherpad" is the opposite pad in the element.
++
++ - extract fields from the caps that are relevant for your converter
++ handling the format. Store these in _local_ variables. (E.g,
++ things like video size, sample rate, etc.)
++
++ - If it's possible to pass buffers through without modifying them
++ (passthrough), you should call gst_try_set_caps() with the caps
++ that was specified as the parameter to the pad_link function. If
++ this is successful, save the local variables to the element
++ structure, perform whatever other setup is necessary for your
++ element, and return GST_PAD_LINK_OK.
++
++ - Otherwise, you're not not using passthrough, and may need to
++ change the caps on the otherpad to match the given format.
++
++ - If the otherpad is not negotiated (!gst_pad_is_negotiated()),
++ you shouldn't attempt to set a format on it. It will eventually
++ be negotiated. Save the local variables to the element structure,
++ perform whatever other setup is necessary, and return
++ GST_PAD_LINK_OK.
++
++ - At this point, the other pad is already negotiated, but won't
++ accept the passthrough format, so you should combine the existing
++ negotiated caps on the otherpad and the caps that was the pad link
++ argument. This can either be done using existing information in the
++ element that was saved during a previous pad_link call, or you can
++ get the information from the negotiated caps
++ (gst_pad_get_negotiated_caps()).
++
++ As an example, consider the videoscale element. Assume that
++ videoscale.src has already negotiated "video/x-raw-yuv,
++ format=(fourcc)I420, width=320, height=240", and that the sink
++ pad's link function is called with "video/x-raw-yuv,
++ format=(fourcc)YUY2, width=640, height=480". Since it's the
++ videoscale element, we can have different width and height
++ fields on the pads, but the format must be the same. So we'll
++ use the existing negotiated size (640x480), and the new format,
++ and call gst_pad_try_set_caps() with "video/x-raw-yuv,
++ format=(fourcc)I420, width=640, height=480".
++
++ This may seem overkill, but most of the time, you'll end up
++ calling try_set_caps() with the same caps that are currently
++ negotiated -- try_set_caps() just returns GST_PAD_LINK_OK in
++ this case.
++
++ - If gst_pad_try_set_caps() returns GST_PAD_LINK_OK, save the
++ local variables to the element structure. In any case, return
++ the return value of gst_pad_try_set_caps().
++
++
++Notes for filters:
++
++ - Filters can almost always use gst_pad_proxy_getcaps() as the
++ getcaps function. This just returns gst_pad_get_allowed_caps()
++ on the otherpad.
++
++ - You may be able to use gst_pad_proxy_pad_link() as the pad link
++ function, but only if you don't need to extract parameters from
++ the caps.
++
++
++Notes for encoders/muxers:
++
++ - Encoders and muxers should roughly work like converters. Many
++ converters are symmetric; encoders and muxers obvious are not,
++ thus it may make the code clearer to have separate src and sink
++ getcaps and pad_link functions.
++
++ - Encoders and muxers should handle multiple negotiations until
++ the first buffer has been passed. After this point, it's unlikely
++ that additional negotiations will happen in well-constructed
++ pipelines, but it may be wise to "lock" the caps after the
++ muxer has committed to a format. (FIXME: it's still unclear to
++ me when the caps should get "unlocked". Obviously at EOS or
++ PAUSED->READY transitions. Any others?)
++
++ - Locking caps can be done by adding (near the top) of the getcaps
++ function:
++
++ if (my_element->lock_caps) {
++ return gst_pad_get_negotiated_caps (pad);
++ }
++
++
++Explicit caps:
++
++ - There's a hack in the core to make the code for decoder elements
++ a lot simpler. This hack can be used only for src pads of elements
++ that get their srcpad capabilities directly from the data stream,
++ i.e., decoders, demuxers, and typefind. This hack overrides the
++ pad's getcaps() and pad_link() function, so that they work correctly
++ in all decoder states.
++
++ - To enable this hack on a pad, call gst_pad_use_explicit_caps().
++
++ - To indicate that a decoder has found the format of the stream, call
++ gst_pad_set_explicit_caps(pad,caps) with the caps of the stream.
++ This caps must be fixed.
++
++ - To indicate that a decoder has lost the format of the stream, i.e.,
++ there's been a NEW_MEDIA event, call gst_pad_set_explicit_caps(pad,
++ NULL).
++
++ - If the explicit caps are set, the getcaps function will return that
++ caps, and the pad_link function will return GST_PAD_LINK_OK. If
++ the explicit caps are not set, the getcaps function returns the pad
++ template caps, and the pad_link function returns GST_PAD_LINK_DELAYED.
++
++
++
++Other junk:
++
++ - negotiation can happen at any time
++
++ - negotiation can happen multiple times/often happens multiple times
++
++ - initial negotiation can lead to strange caps
++
++ - directed negotiation can happen in either direction (src to sink or
++ sink to src)
++
++ - Other considerations ignored, every pad should have a getcaps function.
++
++ - If a pad's getcaps function returns the same caps in every
++ circumstance, the getcaps function can be omitted.
++
++ - If you use gst_pad_use_explicit_caps(), the getcaps function must
++ be ommitted.
++
++ - fixate functions are a method for applications to exert influence
++ on how a format is chosen from a caps. It's also used as a hack to
++ allow elements to do the same. Element fixate functions are _not_
++ intended to give good results for applications -- they're intended
++ to give non-disgusting results in gst-launch. Don't attempt to
++ make them do more than they're capable of.
++
++ - Fixate functions should not be implemented on anything except source
++ and sink elements.
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/old/ChangeLog.gst-plugins gstreamer-0.10.23/docs/random/old/ChangeLog.gst-plugins
+--- gstreamer-0.10.23.orig/docs/random/old/ChangeLog.gst-plugins 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/old/ChangeLog.gst-plugins 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,91 @@
++2003-12-16 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac: disable pixbuf loader by default as requested
++
++2003-12-14 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * configure.ac: make pixbuf loader configurable
++
++2003-12-14 Amaury Jacquot <sxpert@esitcom.org>
++
++ * sys/xvideo/gstximage.c: remove 3 unnecessary X headers
++ * sys/xvideo/gstxvimage.c: same
++ * sys/xvideo/gstxwindow.c: same
++ these problems occur when using the X server from freedesktop.org
++
++2003-12-03 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * common/m4/gst-feature.m4: *** instead of newline when not built
++ * configure.ac: fix X detection when no X stuff present
++ * gst-libs/gst/Makefile.am: put X dependencies inside conditional
++
++2003-07-12 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst-plugins.spec.in: fix up spec file
++ * gst/debug/Makefile.am:
++ gst/realmedia/Makefile.am: use proper LD_FLAGS for plugins
++
++2003-02-14 Colin Walters <walters@verbum.org>
++
++ * ext/gnomevfs/gstgnomevfssrc.c (unicodify,
++ gst_gnomevfssrc_unicodify): New functions.
++ (audiocast_thread_run): Use them. Remove redundant if from
++ "if (foo) g_free (foo);" bits. Change fprintf to g_print.
++ (gst_gnomevfssrc_received_headers_callback): Ditto.
++ (gst_gnomevfssrc_get_icy_metadata): Ditto.
++
++2003-02-06 Colin Walters <walters@gnu.org>
++
++ * ext/gnomevfs/gstgnomevfssrc.c: Port all the fixes from
++ BRANCH-GSTREAMER-0_6.
++
++2003-01-25 Colin Walters <walters@gnu.org>
++
++ * ext/gnomevfs/gstgnomevfssrc.c (gst_gnomevfssrc_open_file): Don't
++ make a size request when in iradio mode.
++
++2002-11-25 Colin Walters <walters@debian.org>
++
++ * ext/gnomevfs/gstgnomevfssrc.c (gst_gnomevfssrc_received_headers_callback):
++ Test for url in correct variable.
++
++2002-11-17 Ken MacLeod <ken@bitsko.slc.ut.us>
++
++ * gst/modplug/modplug_types.cc: Renamed from
++ gst/modplug/modplug_types.c. Change GST_BUFFER_DATA(buf) result
++ type from 'gchar' to 'gunit8'.
++
++2002-07-07 Richard Boulton <richard@tartarus.org>
++
++ * LICENSE_readme: Mention that synaesthesia is derived from GPL
++ code.
++
++2002-06-03 Richard Boulton <richard@tartarus.org>
++
++ * m4/mpeg2dec.m4: Test for cpuaccel library as well as mpeg2dec
++ library. Add appropriate includes before test compile of mpeg2.h
++ so that compilation succeeds.
++
++2002-05-06 Thomas Vander Stichele <thomas@apestaart.org>
++
++ * GConf stuff : from http://www.gnome.org/projects/gconf/ and eog
++ - added gstreamer-gconf package
++
++2002-02-06 Thomas Vander Stichele <thomas@apestaart.org>
++
++ * more build cleanup : merging over changes from gst-player
++
++2002-01-17 Bastien Nocera <hadess@hadess.net>
++
++ * sys/Makefile.am: make the qcam plugin build only
++ only platforms using NASM, ie. x86
++
++2002-01-06 Rodney Dawes <dobey@free.fr>
++
++ * configure.ac: added -lm to cdparanoia check so it works,
++ fixed a couple typos for the libraw1394 checks
++
++2001-12-20 Thomas Vander Stichele <thomas@apestaart.org>
++
++ * opened gst-plugins module
++ * starting with sys plugins
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/old/ChangeLog.gstreamer gstreamer-0.10.23/docs/random/old/ChangeLog.gstreamer
+--- gstreamer-0.10.23.orig/docs/random/old/ChangeLog.gstreamer 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/old/ChangeLog.gstreamer 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,14867 @@
++2003-12-16 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gst.c:
++ * gst/gstplugin.c:
++ rename --enable-segfault to --disable-segtrap
++
++2003-12-15 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * gst/gst.c: (init_popt_callback):
++ * gst/gstplugin.c: (_gst_plugin_fault_handler_restore),
++ (_gst_plugin_fault_handler_sighandler),
++ (_gst_plugin_fault_handler_setup), (gst_plugin_load_file):
++ Implemented fault handlers for catching SIGSEGV while loading
++ plug-ins
++
++2003-12-02 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * fix documentation build using docbook2..., works on fc1 and rh9
++ * fix distcheck on fc1
++
++2003-11-14 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * put GST_CACHE_DIR in config.h, as ordered by iain
++
++2003-11-14 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * Slap walters back into place.
++ * remove GST_CONFIG_DIR, it isn't used anymore, and it looks like
++ GST_CACHE_DIR replaces it (which is up for fixing next)
++
++2003-06-02 Colin Walters <walters@verbum.org>
++
++ * Take over the world.
++
++2003-03-29 Martin Schulze <MHL.Schulze@t-online.de>
++
++ * gst/gstelementfactory.c: Add "g_free (dp->license)" in
++ gst_element_details_free().
++ * gst/gstevent.[ch]: Add function gst_event_get_type() to
++ support c++ language binding. Make macros gst_event_ref[_by_count]
++ return a GstEvent* instead of a GstData*.
++ * gst/gstbuffer.[ch]: Add functions gst_buffer[_pool]_get_type()
++ to support c++ language binding.
++
++2003-03-16 Christian Meyer <chrisime@gnome.org>
++
++ * tools/gst-inspect.c
++ (print_prop): Modified to make compile compile with the new introduced
++ function.
++ * tools/gst-xmlinspect.c
++ (print_prop): ditto.
++
++2003-03-16 Christian Meyer <chrisime@gnome.org>
++
++ * gst/gstprops.[ch]: Add function gst_props_get_type().
++ * gst/gstprops.[ch], gst/gstutils.c, gst/registries/gstxmlregistry.c:
++ - Rename gst_props_entry_get_type() -> gst_props_entry_get_props_type().
++ - Add gst_props_entry_get_type() (returning the GType).
++ * gst/gstcaps.[ch]: Add function gst_caps_get_type().
++
++ Applied patches from Martin Schulze.
++
++2003-01-09 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * first pass at changing _connect/_disconnect -> _link/_unlink
++ * gst/gstcompat.h: created
++
++2002-11-27 Thomas Vander Stichele <thomas at apestaart dot org>
++
++ * ChangeLog: added an entry
++ * gst/gst.*: add gst_init_check which can return TRUE or FALSE
++ make gst_init_with_popt_table do the same
++ only initialize once, like GTK does
++
++2002-04-12 Thomas Vander Stichele <thomas@apestaart.org>
++
++ * gst/gst*.[ch]: commited GUAD3C code review comments (marked CR1)
++
++ * gst/gstregistry.[ch]: added to handle registry stuff
++ gst/gst.c: changed to use new --gst-registry option
++ tools/gst-register.c: use new registry functions
++ for more info, check docs/random/thomasvs/registry
++
++2002-03-01 Michael Meeks <michael@ximian.com>
++ * docs/manual/Makefile.am: use $(wildcard) instead of
++ strange shell stuff.
++
++ * tools/Makefile.am: handle conditionals in a compatible way
++
++ * docs/manuals.mak: don't do silly things with if/else
++
++2002-01-15 Bastien Nocera <hadess@hadess.net>
++
++ * tests/Makefile.am: add all the dirs to the DIST_SUBDIRS
++
++2002-01-15 Bastien Nocera <hadess@hadess.net>
++
++ * tests/Makefile.am: dodge compiling memchunk and bufspeed
++ if NASM is not present
++
++2002-01-03 Rodney Dawes <dobey@free.fr>
++
++ * gstreamer.spec.in: Fixed the missing plug-ins problem
++
++2001-12-29 Rodney Dawes <dobey@free.fr>
++
++ * gstreamer.spec.in: Fixed up for the splitification
++
++2001-12-23 Thomas Vander Stichele <thomas@apestaart.org>
++
++ * moved plugins out of the core to gst-plugins
++ * moved some of the libs out of the core to gst-plugins
++ * moved the other libs around so headers get installed in
++ <gst/(lib)/...>
++
++2001-12-15 Thomas Vander Stichele <thomas@apestaart.org>
++
++ * configure.ac : major overhaul
++ * m4/ dir added with lots of checks in it
++
++2001-12-14 Michael Meeks <michael@ximian.com>
++
++ * gst/gst.c (gst_main, gst_main_quit): upd.
++
++ * gst/gstutils.c (gst_util_has_arg): impl.
++ (gst_util_get_int64_arg): impl.
++
++ * plugins/mpeg2/video/gstmpeg2play.c
++ (gst_mpeg2play_class_init): min frames per sec = 0.
++
++ * plugins/mikmod/gstmikmod.c (gst_mikmod_class_init):
++ s/16bit/use16bit/ properties can't begin with a non
++ alpha.
++
++ * tools/gstreamer-guilaunch.c: fresh from the ministy
++ of nasty hacks.
++
++ * tools/Makefile.am: enable gstreamer-guilaunch for
++ Gnome 2.0
++
++ * tools/gstreamer-launch.c (main): upd.
++ (idle_func): quit the mainloop.
++
++2001-12-14 Michael Meeks <michael@ximian.com>
++
++ * plugins/audiofile/gstafsrc.c (gst_afsrc_class_init): upd.
++
++ * plugins/gnomevfs/gnomevfssrc.c (gst_gnomevfssrc_class_init):
++ kill broken mess for install_std_props.
++
++ * plugins/gnomevfs/gnomevfssink.c
++ (gst_gnomevfssink_class_init): upd.
++
++ * tools/gstreamer-launch.c (main): add efence hook.
++
++ * gst/elements/gstfilesrc.c (gst_filesrc_get): use
++ a volatile pointer, don't write to the buffer.
++
++ * gst/gstelement.c (gst_element_populate_std_props):
++ add debug & robustness.
++
++ * gst/gstelement.c (gst_element_populate_std_props):
++ add debug & robustness.
++
++2001-12-13 Michael Meeks <michael@ximian.com>
++
++ * gst/elements/*.c: (..._class_init): clean to use
++ gst_populate_std_props.
++
++ * gst/gstelement.c
++ (gst_element_populate_std_props): impl, simply for now,
++ with a few standard properties.
++ (gst_element_install_std_props): impl nice helper.
++
++2001-12-13 Michael Meeks <michael@ximian.com>
++
++ * gst/gstplugin.c (_gst_plugin_initialize): g_error
++ instead of warning.
++
++ * Makefile.am: update.
++
++ * editor/gsteditorprojectview.c (view_on_element_added):
++
++ * editor/gsteditorproject.c
++ (gst_editor_project_class_init): upd.
++
++ * plugins/avi/gstavimux.c
++ (gst_avimux_request_new_pad): don't clobber name.
++
++ * libs/control/gstdparammanager.c
++ (gst_dpman_class_init): upd.
++ (gst_dpman_dispose): chain to parent.
++
++ * gst/cothreads.c (cothread_create): use guchar *'s
++ not void *'s for bytewise pointer arithmetic.
++
++ * gst/gstelement.h: kill const on get_property value.
++
++ * plugins/avi/gstavimux.c
++ (gst_avimux_request_new_pad): add name param.
++
++ * configure.ac: Add checks for libglade-2.0 and
++ gnome-vfs-2.0
++
++2001-12-13 Michael Meeks <michael@ximian.com>
++
++ * plugins/xvideosink/Makefile.am: add $(X_LIBS)
++
++ * examples/typefind/typefind.c (type_found): upd.
++ xml code.
++
++ * plugins/mikmod/gstmikmod.c
++ (gst_mikmod_set_property): same memory bug here -
++ unfixed.
++
++ * plugins/oss/gstosssrc.c
++ (gst_osssrc_set_property): fix memory issue.
++ (gst_osssrc_init): dup the string - argh; quit here -
++ such code should be stuck in a common base class not
++ cut and pasted.
++
++ * plugins/oss/gstosssink.c
++ (gst_osssink_init): manage the device allocation.
++ (gst_osssink_finalize): impl.
++ (gst_osssink_class_init): upd.
++ (gst_osssink_set_property): upd.
++
++ * acconfig.h: cover HAVE_LIBXML2
++
++ * configure.ac: update libxml checks.
++
++2001-12-11 22:10 thomasvs
++
++ * lots of build fixes for 0.3.0 release
++
++2001-08-15 23:43 cael
++
++ * gstplay/: ChangeLog, gstmediaplay.c, gstplay.c: Added hacky check
++ to make sure we have video to fullscreen, will be removed when the
++ new libgstplay lands.
++
++2001-08-15 23:32 cael
++
++ * gstplay/: ChangeLog, gstmediaplay.c, gstmediaplay.glade,
++ gstmediaplay.h, gstplay.c, main.c: Added a bunch of new stuff
++ including better fullscreen handling and some new playlist stuff
++ that's not hooked up yet.
++
++2001-08-14 20:13 thomasvs
++
++ * gstreamer-uninstalled.pc.in: changed this to work for gst-bind if
++ anyone gets into problems with this then let me know and we'll fix
++ it together ;)
++
++2001-08-14 05:11 parapraxis
++
++ * gst/: gobject2gtk.c, gobject2gtk.h: sync gobject2gtk with
++ paranormal
++
++2001-08-13 21:19 omegahacker
++
++ * gst/: gsttimecache.c, gsttimecache.h: added first pass at the
++ GstTimeCache
++
++2001-08-13 20:03 omegahacker
++
++ * gst/Makefile.am: messy hack to make sure libgst.la builds
++ properly (FIXME!)
++
++2001-08-13 20:00 sbaker3
++
++ * docs/: gst/gstreamer-sections.txt, manual/dynamic.sgml,
++ manual/helloworld2.sgml, manual/pads.sgml, manual/queues.sgml,
++ manual/threads.sgml, manual/typedetection.sgml, manual/xml.sgml:
++ sync with the current CVS glib API
++
++2001-08-13 19:55 sbaker3
++
++ * test/avi2mpg.c, test/lat.c, test/mp1tomp1.c, test/mp2toavi.c,
++ test/mp2tomp1.c, test/mp2tomp1v2.c, test/mp3.c, test/mp3parse.c,
++ test/mp3play.c, test/mp3tovorbis.c, test/pipetest.c, test/qtest.c,
++ tests/autoplug.c, tests/events.c, tests/mp1vid.c, tests/paranoia.c,
++ tests/states.c, tests/eos/case1.c, tests/eos/case2.c,
++ tests/eos/case3.c, tests/eos/case4.c, tests/eos/case5.c,
++ tests/eos/case6.c, tests/eos/case7.c, tests/muxing/case1.c,
++ tests/sched/runxml.c: sync with the current CVS glib API
++
++2001-08-13 19:50 sbaker3
++
++ * plugins/aasink/aasink.c, plugins/audiofile/gstafsink.c,
++ plugins/audiofile/gstafsrc.c, plugins/avi/gstavidecoder.c,
++ plugins/avi/wincodec/gstwinenc.cc, plugins/cdparanoia/cdparanoia.c,
++ plugins/dv/dvdec.c, plugins/filters/cutter/cutter.c,
++ plugins/gnomevfs/gnomevfssink.c, plugins/gnomevfs/gnomevfssrc.c,
++ plugins/gsm/gstgsmenc.c, plugins/jpeg/gstjpegenc.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c, plugins/oss/gstosssink.c,
++ plugins/quicktime/gstquicktimedecoder.c,
++ plugins/sdlsink/sdlvideosink.c, plugins/xvideosink/xvideosink.c,
++ examples/cutter/cutter.c, examples/helloworld/helloworld.c,
++ examples/helloworld2/helloworld2.c, examples/mixer/mixer.c,
++ examples/plugins/example.c, examples/queue2/queue2.c,
++ examples/queue3/queue3.c, examples/queue4/queue4.c,
++ examples/thread/thread.c, examples/typefind/typefind.c,
++ examples/xml/createxml.c, examples/xml/runxml.c: sync with the
++ current CVS glib API
++
++2001-08-13 19:48 omegahacker
++
++ * configure.base: Added libgst.la to the global LDFLAGS, so all
++ plugins link against it. This should help solve problems with
++ bindings and dynamic loading of libgst.
++
++2001-08-13 19:45 sbaker3
++
++ * gst/: gobject2gtk.c, gobject2gtk.h, gst.c, gstautoplug.c,
++ gstbin.c, gstelement.c, gstobject.c, gstpad.c, gstparse.c,
++ gsttypefind.c, gstxml.c, autoplug/autoplugtest.c,
++ autoplug/gstautoplugcache.c, autoplug/gstautoplugger.c,
++ autoplug/gststaticautoplug.c, autoplug/gststaticautoplugrender.c,
++ elements/gstdisksink.c, elements/gstfakesink.c,
++ elements/gstfakesrc.c, elements/gstidentity.c,
++ elements/gstmultidisksrc.c: sync with the current CVS glib API
++
++2001-08-13 14:52 thomasvs
++
++ * configure.base: added swig/Makefile.PL
++
++2001-08-12 11:09 sbaker3
++
++ * tests/.cvsignore: added more exes
++
++2001-08-12 10:48 sbaker3
++
++ * gst/gstbufferpool.c: doc update
++
++2001-08-11 23:04 omegahacker
++
++ * gst/gstbuffer.c: fixed stupid bug in buffer_span()
++
++2001-08-11 09:25 omegahacker
++
++ * gst/: gstbuffer.c, gstbuffer.h: - changed timestamps to gint64
++ (*signed* 64-bit) - updated buf->offset handling to deal with the
++ -1 (0xffffffff) case - added gst_buffer_span() and gst_buffer_merge
++ (see -devel for details)
++
++2001-08-10 22:36 wtay
++
++ * gst/elements/gstdisksrc.c: mmap returns MAP_FAILED in case of an
++ error, also do a perror in case of a failure.
++
++2001-08-10 18:45 wtay
++
++ * test/misc/: Makefile.am, gsmdec.c, gsmenc.c, mpgPlayer.c: Added
++ some test apps by Zeenix.
++
++2001-08-10 18:40 wtay
++
++ * configure.base, docs/fwg/intro.sgml, plugins/SID/gstsiddec.cc,
++ plugins/audiofile/gstafsink.c, plugins/gnomevfs/gnomevfssrc.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c, plugins/oss/gstosssink.c,
++ plugins/quicktime/gstquicktimedemux.c,
++ plugins/quicktime/gstquicktimesink.c, plugins/udp/gstudpsrc.c,
++ test/Makefile.am, test/main.c, tests/faketest.c,
++ tools/gstreamer-inspect.c: Fixes to various plugins. Removed the
++ eos/qos calls in favour of the soon to be event system. Added a
++ test app to test element reuse (doesn't work)
++
++2001-08-10 18:34 wtay
++
++ * gst/: gstobject.h, gstpad.c, gstpad.h, gstqueue.c,
++ gstscheduler.c, elements/gstdisksrc.c, elements/gstfakesrc.c,
++ elements/gstfdsrc.c, elements/gstmultidisksrc.c,
++ elements/gstpipefilter.c: Removed the old eos and qos functions.
++ Removed the functions from the elements.
++
++2001-08-10 18:02 sbaker3
++
++ * examples/launch/.cvsignore: added an exe
++
++2001-08-10 17:49 sbaker3
++
++ * examples/: mixer/.cvsignore, cutter/.cvsignore: added an exe
++
++2001-08-10 17:36 sbaker3
++
++ * tests/.cvsignore: hide new tests
++
++2001-08-07 17:14 thomasvs
++
++ * configure.base: removed libs/colorscpace again
++
++2001-08-07 17:08 thomasvs
++
++ * configure.base: do FLAC lib check against main function
++
++2001-08-07 17:06 thomasvs
++
++ * acconfig.h, configure.base, plugins/Makefile.am: changed
++ HAVE_FLAC to HAVE_FLACLIB
++
++2001-08-07 15:46 thomasvs
++
++ * configure.base: added a few dnl'd AC_CONDITIONAL's to show a bug
++ for HAVE_FLAC look for thomas in the file
++
++2001-08-06 23:16 wtay
++
++ * examples/plugins/example.c: Fixed the padtemplate definition.
++
++2001-08-06 21:40 omegahacker
++
++ * gst/gstevent.h: added gstevent.h
++
++2001-08-06 21:37 omegahacker
++
++ * gst/gstelement.c, gst/gstinfo.c, gst/gstinfo.h, gst/gstpad.c,
++ gst/gstpad.h, gst/gstplugin.c, gst/gstscheduler.c, gst/gstthread.c,
++ gst/elements/gstdisksrc.c, gst/elements/gstfakesink.c,
++ tests/Makefile.am, tests/events.c: Initial code for the event
++ system.
++
++2001-08-06 21:20 wtay
++
++ * plugins/flac/: Makefile.am, flacenc.c: Some compile fixes against
++ FLAC 1.0
++
++2001-08-06 20:52 wtay
++
++ * gst/gstbufferpool.h: Added a missing UNLOCK macro.
++
++2001-08-06 20:49 wtay
++
++ * plugins/avi/wincodec/gstwinenc.cc: Updates for CVS avifile.
++
++2001-08-06 17:46 theuraeus
++
++ * configure.base: 2001-06-08 Christian Schaller
++ <Uraeus@linuxrising.org> - Change from == to = since == only works
++ with GNU test and not the version of test shipping with Solaris
++ (and probably other Unices) - Once again a ordinary user has to
++ teach hackers to hack :)
++
++2001-08-03 01:08 omegahacker
++
++ * gst/Makefile.am: moved the object-model headers back to _HDR
++ where they belong
++
++2001-08-03 00:55 hadess
++
++ * Makefile.am: - revert location of gstreamer.pc
++
++2001-08-03 00:50 hadess
++
++ * Makefile.am: - install gstreamer.pc to the right place under
++ $(prefix)/share/pkconfig
++
++2001-08-01 23:44 dlehn
++
++ * plugins/flac/: flacdec.c, flacenc.c: Type update for FLAC 1.0
++
++2001-07-31 21:57 wtay
++
++ * gst/gstthread.c: Added a missing state change switch.
++ Uncommented a big FIXME that was needed after all. Stop now works.
++
++2001-07-30 18:50 wtay
++
++ * gstreamer-uninstalled.pc.in: Changes pcbuilddir to
++ pc_top_builddir
++
++2001-07-27 18:12 wtay
++
++ * tests/: Makefile.am, faketest.c, muxing/case1.c: Added a simple
++ thread state change app.
++
++2001-07-27 17:35 sbaker3
++
++ * tools/gstreamer-inspect.c: compile fix for glib2
++
++2001-07-27 14:12 sbaker3
++
++ * gst/gstbufferpool.c: compile fix when atomic refcounting is not
++ available
++
++2001-07-25 23:46 wtay
++
++ * plugins/festival/gstfestival.c: Added caps to the src pad to
++ properly set rate/channels for peer elements.
++
++2001-07-25 22:40 wtay
++
++ * tools/gstreamer-inspect.c: Added signal output and object
++ hierarchy output.
++
++2001-07-25 22:40 wtay
++
++ * gst/: gobject2gtk.c, gobject2gtk.h: Added shims for signal
++ introspections and g_type_parent
++
++2001-07-25 21:49 wingo
++
++ * configure.base: Fixed issue where AC_CHECK_LIB was polluting LIBS
++ with -lxml.
++
++2001-07-25 01:02 wingo
++
++ * plugins/filters/speed/Makefile.am: Removed 'README' from
++ EXTRA_DIST so that 'make dist' would work.
++
++2001-07-24 21:05 theuraeus
++
++ * tools/gstreamer-launch.1: 2001-23-07 Christian Schaller
++ <Uraeus@linuxrising.org> - Put README contents into man page and
++ fixed the Groff enconding (or whatever it is called.)
++
++2001-07-23 01:57 wtay
++
++ * plugins/ffmpeg/: gstffmpegdec.c, gstffmpegenc.c: Updated to the
++ new 0.4.4 API.
++
++2001-07-23 01:57 wtay
++
++ * tools/gstreamer-launch.c: Reverted to the old g_idle loop. too
++ many problems with xvideosink and the GtkWindow when we don't have
++ an idle loop..
++
++2001-07-20 23:10 dlehn
++
++ * plugins/: mp3decode/mpg123/letest.c, mpeg2/ac3dec/bitstream.c:
++ use glib for byte swapping
++
++2001-07-20 23:08 dlehn
++
++ * Makefile.am: Some basic deb building rules
++
++2001-07-20 23:08 dlehn
++
++ * plugins/mpeg2/parse/Makefile.am, test/Makefile.am: cosmetic
++ stuff, -O3 does inline-functions
++
++2001-07-20 22:26 wtay
++
++ * docs/gst/: Makefile.am, gstreamer.hierarchy,
++ tmpl/gstbufferpool.sgml, tmpl/gstfakesink.sgml,
++ tmpl/gstidentity.sgml, tmpl/gstreamer-unused.sgml,
++ tmpl/gsttee.sgml: Removed some stuff from the makefile until it
++ stopped complaining when building debs...
++
++2001-07-20 08:10 dlehn
++
++ * plugins/mp3encode/lame/: gstlame.c, gstlame.h: update for newer
++ LAME api
++
++2001-07-20 08:00 dlehn
++
++ * plugins/Makefile.am: Always compile avi dir. It has it's own
++ conditionals for avifile libs. Add (back?) arts dir. (was this
++ out for a reason?)
++
++2001-07-20 07:56 dlehn
++
++ * plugins/mpeg2/mpeg2dec/Makefile.am: Change lib name from
++ libmpeg2dec to libgstmpeg2dec to avoid confusion since it links to
++ another libmpeg2dec.
++
++2001-07-20 07:54 dlehn
++
++ * docs/gst/gstreamer.hierarchy: remove Gtk classes from Gst
++ hierarchy
++
++2001-07-20 07:53 dlehn
++
++ * configure.in.ac250: not used anymore
++
++2001-07-20 07:52 dlehn
++
++ * debian/: Makefile.am, README.Debian, changelog, control,
++ gstreamer-arts.files, gstreamer-artsd.files,
++ gstreamer-avifile.files, gstreamer-common.files,
++ gstreamer-festival.files, gstreamer-flac.files,
++ gstreamer-mpeg2dec.files, gstreamer-plugin-template.postinst,
++ gstreamer-plugin-template.postrm, gstreamer-plugin-template.prerm,
++ gstreamer-runtime.files, gstreamer-runtime.manpages,
++ gstreamer-runtime.postinst, gstreamer-runtime.postrm,
++ gstreamer-tools.files, gstreamer-tools.manpages, gstreamer-x.files,
++ libgst0.postinst, libgsteditor0.postinst,
++ libgstmediaplay0.postinst, rules: Update to Debian packaging files
++ to 0.2.1-2
++
++2001-07-18 23:38 richardb
++
++ * docs/fwg/: Makefile.am, buffers.sgml, checklist.sgml,
++ gst-plugin-writers-guide.sgml, srcnsink.sgml, statemanage.sgml:
++ Sort out some remaining bits of fwg which weren't valid sgml.
++
++2001-07-18 23:18 richardb
++
++ * docs/manual/: debugging.sgml, helloworld2.sgml: Fix incorrectly
++ matched tags, as found by xsltproc. ;-)
++
++2001-07-18 23:08 richardb
++
++ * REQUIREMENTS: Add instructions for getting docbook-gnome-bin
++ debian package, needed to build manual and PWG.
++
++2001-07-18 20:04 wtay
++
++ * gst/autoplug/gststaticautoplugrender.c: Make sure the autoplugger
++ doesn't try to connect elements with request pads for now.
++
++2001-07-18 18:29 wtay
++
++ * plugins/mpeg1/system_encode/: buffer.c, system_encode.c,
++ system_encode.h, systems.c: Added request pad to the muxer. Fixed
++ the object size problem by dynamically allocating the sector data.
++
++2001-07-17 23:01 richardb
++
++ * plugins/effects/volume/volume.c: Rename the GstVolume type to
++ GstVolumeOld, so that it doesn't conflict with the type registered
++ by the new volume plugin.
++
++2001-07-17 22:51 wtay
++
++ * docs/fwg/intro.sgml: Added what I think should be the basic steps
++ for writing a plugin.
++
++2001-07-16 21:18 wtay
++
++ * gst/: gstelement.h, gstscheduler.h: Added missing pad_select
++ prototypes/defs.
++
++2001-07-16 10:04 richardb
++
++ * configure.base: Change tests/muxer/Makefile to
++ tests/muxing/Makefile, since tests/muxer is now an empty dir.
++
++2001-07-15 15:24 wtay
++
++ * tools/gstreamer-launch.c: Changed the main loop to while
++ (iterate(bin))
++
++2001-07-15 14:04 wtay
++
++ * gst/gstscheduler.c: Properly set the eos flag when no elements
++ can be scheduled.
++
++2001-07-14 21:29 shitowax
++
++ * plugins/quicktime/: gstquicktimesink.c, gstquicktimesink.h:
++ initial introduction of a really basic muxer
++
++2001-07-14 21:15 thomasvs
++
++ * configure.base: added muxer Makefile
++
++2001-07-13 17:49 wtay
++
++ * plugins/gsm/: gstgsm.c, gstgsmdec.c, gstgsmenc.c: Added capsnego
++ to gsmdec/enc.
++
++2001-07-11 23:52 wtay
++
++ * gst/: gstpad.c, gstpad.h, gstscheduler.h,
++ elements/gstaggregator.c, elements/gstaggregator.h,
++ elements/gstfakesrc.c: Added prototypes for gst_pad_peek,
++ gst_pad_select and gst_pad_selectv. Added different scheduling
++ methods in aggregator. Fixed a bug in fakesrc when setting up the
++ scheduling functions.
++
++2001-07-11 20:26 wtay
++
++ * tests/: Makefile.am, muxing/.cvsignore, muxing/Makefile.am,
++ muxing/case1.c: Added a muxing test case.
++
++2001-07-11 20:23 wtay
++
++ * gst/gstscheduler.c: Added a g_assert when a filled bufpen is
++ overwritten.
++
++2001-07-11 20:22 wtay
++
++ * gst/elements/: gstfakesink.c, gstfakesrc.c, gstidentity.c,
++ gstidentity.h, gsttee.c, gsttee.h: Some cleanups in output of
++ various test plugins. Added debug output to tee. Added buffer
++ duplication to identity.
++
++2001-07-11 17:45 wtay
++
++ * gst/elements/: gstelements.c, gstfakesink.c, gstfakesink.h: Added
++ request pads to fakesink.
++
++2001-07-11 16:51 wtay
++
++ * gst/elements/: gstaggregator.c, gstelements.c, gstfakesink.c,
++ gstfakesrc.c, gstfakesrc.h, gstidentity.c, gstidentity.h, gsttee.c:
++ Added DEBUG_FUNCPTR to most plugins. Added request pads to fakesrc
++ and aggregator.
++
++2001-07-11 16:50 wtay
++
++ * tools/gstreamer-inspect.c: Print out the request pad function.
++
++2001-07-11 15:56 wtay
++
++ * gst/elements/: Makefile.am, gstaggregator.c, gstaggregator.h,
++ gstdisksink.c, gstdisksrc.c, gstelements.c, gstfakesink.c,
++ gstfakesrc.c, gstfakesrc.h, gstfdsink.c, gstfdsrc.c, gsthttpsrc.c,
++ gstidentity.c, gstsinesrc.c, gsttee.c: Some code cleanups. Added
++ printouts of the buffer timestamps in identity, fakesrc, fakesink.
++ Added an aggregator test element.
++
++2001-07-11 13:33 wtay
++
++ * gst/: gstelement.c, gstelement.h, gstelementfactory.c: Aplied the
++ patch from Andy Wingo <apwingo@eos.ncsu.edu> add padtemplates to
++ element classes without using an elementfactory. The
++ gst_element_add_padtemplate_to_class method was renamed to
++ gst_element_class_add_padtemplate to better match glib/gtk
++ conventions.
++
++2001-07-11 13:09 wtay
++
++ * docs/gst/tmpl/: gstmeta.sgml, spectrum.sgml: Removed the
++ remaining bits of MetaData.
++
++2001-07-11 02:02 omegahacker
++
++ * configure.base: added speed and volume to configure.base
++
++2001-07-11 00:47 omegahacker
++
++ * plugins/filters/Makefile.am: added speed and volume to
++ Makefile.am
++
++2001-07-08 22:02 wtay
++
++ * test/: Makefile.am, mp2tomp1v2.c, mp3play.c: Added a vob to mpeg1
++ transcoder. note that this one is only 68 lines long.
++
++2001-07-08 10:47 wtay
++
++ * plugins/effects/volume/volume.c: I'm a moron..
++
++2001-07-08 10:46 wtay
++
++ * plugins/effects/volume/volume.c: Renamed the old volume plugin to
++ volume_old.
++
++2001-07-08 10:44 wtay
++
++ * plugins/filters/: speed/Makefile.am, speed/filter.func,
++ speed/speed.c, speed/speed.h, volume/Makefile.am,
++ volume/filter.func, volume/mono-filter.func,
++ volume/stereo-filter.func, volume/volume.c, volume/volume.h: Added
++ the two plugins from Andy Wingo <apwingo@eos.ncsu.edu>
++
++2001-07-07 17:34 wtay
++
++ * docs/manual/Makefile.am: Added the init.sgml file to the makefile
++
++2001-07-07 16:30 wtay
++
++ * docs/manual/: intro.sgml, motivation.sgml: More blablah about how
++ cool GStreamer really is..
++
++2001-07-07 16:10 wtay
++
++ * docs/manual/: gstreamer-manual.sgml, init.sgml, utility.sgml:
++ Added docs on library init.
++
++2001-07-07 15:17 wtay
++
++ * docs/manual/: autoplugging.sgml, debugging.sgml,
++ gstreamer-manual.sgml, helloworld2.sgml, programs.sgml: Lots of
++ updates. Added a chapter about the autoplugcache. Updated the
++ autoplug example using the autoplugcache. Moved some stuff around.
++ Added an example app for gst_parse_launch. Updated the debug
++ info.
++
++2001-07-07 15:14 wtay
++
++ * examples/launch/mp3parselaunch.c: Add sane arg checking.
++
++2001-07-07 15:07 wtay
++
++ * examples/launch/: Makefile.am, mp3parselaunch.c: Added a
++ parse_launch example.
++
++2001-07-07 14:32 wtay
++
++ * examples/helloworld2/helloworld2.c: Updated the autoplug example.
++
++2001-07-07 12:34 wtay
++
++ * docs/manual/: bins.sgml, dynamic.sgml, factories.sgml,
++ goals.sgml, gstreamer-manual.sgml, helloworld.sgml,
++ helloworld2.sgml, pads.sgml, programs.sgml, queues.sgml,
++ threads.sgml, typedetection.sgml, utility.sgml, xml.sgml: Some
++ updates to the manual, mostly glib2 related.
++
++2001-07-07 11:55 wtay
++
++ * docs/gst/: gstreamer-docs.sgml, gstreamer-sections.txt,
++ gstreamer.hierarchy, tmpl/gstbuffer.sgml, tmpl/gstbufferpool.sgml,
++ tmpl/gstelement.sgml, tmpl/gstpad.sgml, tmpl/gstplugin.sgml,
++ tmpl/gstreamer-unused.sgml, tmpl/gstutils.sgml, tmpl/gstxml.sgml:
++ Removed the last bits of Metadata. Updated the bufferpool docs.
++
++2001-07-06 22:00 wtay
++
++ * plugins/capture/qcam/: gstqcamsrc.c, gstqcamsrc.h, qcam.h: Added
++ lots of options.
++
++2001-07-05 23:08 wtay
++
++ * configure.base: Added the qcam src
++
++2001-07-05 23:06 wtay
++
++ * plugins/capture/qcam/dark.c: Some unused file..
++
++2001-07-05 23:05 wtay
++
++ * plugins/capture/: Makefile.am, qcam/Makefile.am, qcam/exposure.c,
++ qcam/gstqcamsrc.c, qcam/gstqcamsrc.h, qcam/qcam-Linux.c,
++ qcam/qcam-Linux.h, qcam/qcam-lib.c, qcam/qcam-os.c, qcam/qcam-os.h,
++ qcam/qcam.h, qcam/qcamip.h: Added a simple bw-qcam src plugin.
++
++2001-07-05 22:53 wtay
++
++ * tools/gstreamer-launch.c: Added the xid stuff in again if
++ compiling against gtk.
++
++2001-07-04 21:49 uid21147
++
++ * gst/gstutils.c: Added arg setting for UINT types.
++
++2001-07-04 16:33 uid21147
++
++ * plugins/ffmpeg/: Makefile.am, gstffmpegdec.c, gstffmpegenc.c:
++ Lots of improvements to the ffmpeg wrappers.
++
++2001-07-02 21:38 wtay
++
++ * plugins/ffmpeg/: Makefile.am, gstffmpeg.c, gstffmpegdec.c,
++ gstffmpegdec.h, gstffmpegenc.c, gstffmpegenc.h: Added the ffmpeg
++ decoder wrappers.
++
++2001-07-01 23:19 wtay
++
++ * configure.base, plugins/ffmpeg/Makefile.am,
++ plugins/ffmpeg/gstffmpegenc.c, plugins/ffmpeg/gstffmpegenc.h: Added
++ the ffmpeg wrapper plugin. (ffmpeg.sourceforge.net). Only the
++ encoders are currently support, so no decoders or muxers yet..
++
++2001-07-01 18:52 wtay
++
++ * plugins/gsm/: Makefile.am, gstgsmdec.c, gstgsmenc.c: Fixed a bug
++ with the buffer handling.
++
++2001-07-01 17:10 sbaker3
++
++ * plugins/filters/ladspa/gstladspa.c: better property name munging
++ and added check for duplicate property names
++
++2001-07-01 17:01 sbaker3
++
++ * gst/gobject2gtk.c: return NULL from
++ g2g_object_class_find_property if gtk_object_arg_get_info returns
++ an error
++
++2001-07-01 15:05 wtay
++
++ * plugins/avi/gstavidemux.c: Added the memcpy back, we can't take
++ ownership of the riff parser chunks..
++
++2001-07-01 14:59 wtay
++
++ * libs/riff/gstriff.h: Added types and structures for AVI/DV.
++
++2001-07-01 14:58 wtay
++
++ * plugins/avi/: gstavidecoder.c, gstavidemux.c, gstavidemux.h,
++ gstavitypes.c: Added FV playback to avi. Currently only NTSC DV is
++ supported. Both type1 and type2 avi/dv formats are supported.
++
++2001-07-01 12:18 theuraeus
++
++ * gstreamer.spec.in: 2001-01-07 Christian Schaller
++ <Uraeus@linuxrising.org> - Updated SPEC file. - Splitt out GUI
++ modules - Added quicktime, flac, chart, udp modules
++
++2001-07-01 12:16 theuraeus
++
++ * LICENSE_readme, REQUIREMENTS: 2001-01-07 Christian Schaller
++ <Uraeus@linuxrising.org> - Added FLAC information
++
++2001-07-01 12:12 richardb
++
++ * configure.base: Put the back check for the FLAC library. This
++ looks to have been accidentally removed when the sidplay one was
++ added.
++
++2001-07-01 11:28 sbaker3
++
++ * plugins/filters/ladspa/gstladspa.c: gobject param fixes
++
++2001-06-30 20:41 sbaker3
++
++ * plugins/alsa/: alsasink.c, alsasrc.c: fix param problems due to
++ gobject changes
++
++2001-06-30 17:26 wtay
++
++ * plugins/SID/: gstsiddec.cc, gstsiddec.h: Added a property for
++ song selection.
++
++2001-06-30 16:22 wtay
++
++ * acinclude.m4, configure.base, plugins/Makefile.am,
++ plugins/SID/Makefile.am: Added configure checks for libsidplay.
++
++2001-06-30 15:10 wtay
++
++ * plugins/SID/gstsiddec.cc: Added a bunch of properties.
++
++2001-06-30 01:45 wtay
++
++ * configure.base: Added the SID plugin.
++
++2001-06-30 01:44 wtay
++
++ * plugins/SID/gstsiddec.cc: Some cleanups
++
++2001-06-30 01:37 wtay
++
++ * plugins/SID/: .cvsignore, Makefile.am, gstsiddec.cc, gstsiddec.h:
++ A first attempt at a SID decoder plugin.
++
++2001-06-30 01:35 wtay
++
++ * gst/elements/gstdisksrc.c: Fix an endless loop at EOS.. this is a
++ hack...
++
++2001-06-29 21:31 wtay
++
++ * plugins/xmms/: gstxmmseffect.c, gstxmmsinput.c: GObject fixes for
++ xmms plugins. Cleaner names for the generated plugins.
++
++2001-06-29 18:53 richardb
++
++ * gst/gstparse.c: Allow elements to be given custom names with []
++ syntax.
++
++ ie, gstreamer-launch disksrc[mysrc] ! ... makes a disksrc element
++ named mysrc, rather than disksrc0
++
++ Suggestion: don't name things with names with numbers at the end,
++ or they may conflict with names allocated automatically.
++
++2001-06-29 12:30 richardb
++
++ * configure.base: Put GST_CFLAGS before other CFLAGS, to ensure
++ that the correct headers get used if there's an installed copy of
++ the gst headers on the system (ie, make sure the uninstalled
++ headers are used instead).
++
++2001-06-29 11:26 richardb
++
++ * gst/Makefile.am: Prefix for marshallers should be gst_marshal,
++ rather than gst. This now actually compiles for me.
++
++2001-06-29 10:39 richardb
++
++ * gst/Makefile.am: Ensure that the marshaller code #includes
++ glib-object.h, and hence the neccessary definitions to enable it to
++ compile.
++
++ I don't pretend to understand how the marshalling stuff works - I
++ just know that it clearly needs this #include, or something
++ similar. If there's a more correct fix, someone else can do it.
++ Possibly this is a glib-genmarshal bug, but I've not got the time
++ to go into that.
++
++2001-06-29 00:58 richardb
++
++ * gst/Makefile.am: Ensure that the gstmarshal.[ch] files are
++ generated in time by generating both files in the same rule:
++ previously, only the .c would be generated in time. Don't put the
++ files in dists (add a dist-hook to take them out), and clean the
++ files when running distclean.
++
++2001-06-28 22:44 richardb
++
++ * gst/Makefile.am: Make sure conditionally compiled files are added
++ to the dist.
++
++2001-06-28 21:13 sbaker3
++
++ * plugins/alsa/: alsasink.c, alsasrc.c: compile fixes for alsasrc
++ and alsasink - params need more work (odd warning when doing
++ -inspect alsasrc)
++
++2001-06-28 20:32 wtay
++
++ * acconfig.h, configure.base, plugins/Makefile.am: Added a check
++ for the FLAC plugin.
++
++2001-06-28 19:35 richardb
++
++ * configure.base: Fix ALSA check; was overwriting the ALSA_CFLAGS
++ and ALSA_LIBS variables determined for alsa 0.5 with the ones from
++ the check that alsa 0.9 wasn't there. Now does the 0.9 check
++ first, to avoid this problem.
++
++2001-06-28 17:31 richardb
++
++ * docs/gst/Makefile.am: Remove gstreamer.html from generated files,
++ since it was just a broken copy of one of the other files. Sort
++ out cleanfiles to some extent. Note: the make dependencies in this
++ file are completely broken, but it's not clear how to fix them.
++ The docs will be built at make install / dist time, as a result.
++
++2001-06-28 17:01 richardb
++
++ * acinclude.m4: Fix a typo in a comment.
++
++2001-06-28 16:39 richardb
++
++ * acinclude.m4, configure.base: Add ACTION-IF-USE and
++ ACTION-IF-NOTUSE parameters to GST_CHECK_FEATURE. Convert glib2
++ check to use GST_CHECK_FEATURE.
++
++2001-06-28 16:11 thomasvs
++
++ * plugins/filters/cutter/README: cutter plugin now has a settable
++ pre-record buffer (using GList) README has been fleshed out a bit
++ more
++
++2001-06-28 12:56 richardb
++
++ * configure.base: Actually pass the infomessages variable into
++ config.status, so the message about plugin-builddir gets displayed.
++
++ We can use this mechanism to display lists of plugins which won't
++ be built: just add the lines to be output at the end of ./configure
++ to $infomessages
++
++2001-06-28 11:57 richardb
++
++ * configure.base: Change plugin-srcdir msg stuff near the end of
++ configure.base to -builddir.
++
++2001-06-27 21:53 thomasvs
++
++ * examples/cutter/cutter.c: implemented ring buffer
++
++2001-06-27 21:53 thomasvs
++
++ * plugins/filters/cutter/: cutter.c, cutter.h: added a GList
++ pre-record buffer
++
++2001-06-27 21:20 wtay
++
++ * test/: dvshow.c, mp2toavi.c: Some small fixes.
++
++2001-06-27 21:19 wtay
++
++ * examples/autoplug/autoplug.c: Small fixes to the autoplugger so
++ that it uses a colorspace element for video.
++
++2001-06-27 21:15 wtay
++
++ * plugins/quicktime/gstquicktimedecoder.c: Make the QT plugin
++ extend from GstBin.
++
++2001-06-27 21:14 wtay
++
++ * plugins/avi/gstavidecoder.c: Make the avidecoder plugin extend
++ from a GstBin.
++
++2001-06-27 21:14 omegahacker
++
++ * configure.base, gstreamer-config.in, gstreamer-uninstalled.pc.in,
++ gstreamer.pc.in: configure.base: changed to 0.2.1, reworked the -D
++ gathering for cflags gstreamer-config.in, gstreamer.pc.in,
++ gstreamer-uninstalled.pc.in: reworked -D gathering for cflags
++
++2001-06-27 20:45 dlehn
++
++ * plugins/arts/Makefile.am: Fix for automake 1.4 to actually build
++ the generated source. Clean up generated files. Make sure only
++ source idl gets into tarball.
++
++2001-06-27 20:22 omegahacker
++
++ * makeconfigure: added _CFLAGS and modified to allow the multiple
++ substitition to occur
++
++2001-06-27 18:22 richardb
++
++ * makeconfigure: Add a hack to ensure that automake picks up the
++ variables AC_SUBSTed in GST_CHECK_CONFIGPROG.
++
++2001-06-27 18:04 richardb
++
++ * acinclude.m4, configure.base: Add a "MODULES" parameter to
++ GST_CHECK_CONFIGPROG, to pass sets of modules to the -config
++ script. Convert gnome test to use GST_CHECK_CONFIGPROG.
++
++2001-06-27 17:56 richardb
++
++ * acconfig.h, acinclude.m4, configure.base, plugins/Makefile.am,
++ plugins/audiofile/Makefile.am: Remove HAVE_GDK_PIXBUF and
++ HAVE_LIBAUDIOFILE from acconfig.h and AC_DEFINE: nothing uses
++ these. Add GST_CHECK_CONFIGPROG macro, to check a -config script
++ and set --cflags and --libs from it. Replace audiofile and
++ gdk-pixbuf checks with calls to this macro. Change use of
++ HAVE_LIBAUDIOFILE to USE_LIBAUDIOFILE automake conditional. Change
++ use of AUDIOFILE_LIBS variable to LIBAUDIOFILE_LIBS.
++
++2001-06-27 17:06 richardb
++
++ * acinclude.m4: Fix brokenness with autoconf 2.50. *sigh*
++
++2001-06-27 16:04 richardb
++
++ * acinclude.m4, configure.base: Add DISABLE-BY-DEFAULT argument to
++ GST_CHECK_FEATURE, to allow a feature to be turned off by default.
++ Turn of XMMS check using this, rather than a hack. Fix display of
++ commandline parameters for GST_CHECK_FEATURE and
++ GST_SUBSYSTEM_DISABLE.
++
++2001-06-27 15:07 thomasvs
++
++ * plugins/filters/cutter/: cutter.c, filter.func: fixed cutter
++ plugin
++
++2001-06-27 10:59 richardb
++
++ * acinclude.m4: Add XMMS macro to acinclude.m4, since it's a
++ commonly missing macro. This joins the ALSA macro, which was
++ already in acinclude.m4 We need some more consistent scheme for
++ dealing with these... :(
++
++2001-06-26 23:26 omegahacker
++
++ * plugins/vgasink/Makefile.am: fixed vgasink Makefile.am, even
++ though vgasink is disabled
++
++2001-06-26 23:15 wtay
++
++ * configure.base, gst/Makefile.am, tools/Makefile.am: Removed the
++ GST_CONFIG_DIR from config.h and made a -D CFLAG for it instead so
++ that we can do full expansion on the sysconfdir.
++
++2001-06-26 22:49 richardb
++
++ * configure.base: Fix up configure --help output:
++ GST_DISABLE_SUBSYSTEM options were not displayed properly.
++
++2001-06-26 22:44 richardb
++
++ * configure.base, gst/elements/Makefile.am, plugins/Makefile.am:
++ Convert XMMS and LIBGHTTP checks to use GST_CHECK_FEATURE() XMMS
++ check is turned off by default (though not in a very neat way)
++
++2001-06-26 22:29 wtay
++
++ * configure.base, plugins/Makefile.am: Removed vgasink for now.
++
++2001-06-26 22:07 wtay
++
++ * plugins/udp/Makefile.am: Removed a cut&paste leftover..
++
++2001-06-26 20:56 richardb
++
++ * makeconfigure: Do hacky fix for AM_CONDITIONAL for
++ GST_SUBSYSTEM_DISABLE, too.
++
++2001-06-26 20:49 omegahacker
++
++ * configure.base: Changes to the GST_SUBSYSTEM_DISABLE macro.
++
++2001-06-26 20:06 richardb
++
++ * gst/gobject2gtk.c: Fix g2g_object_class_list_properties() so that
++ num_properties gets set.
++
++2001-06-26 19:20 richardb
++
++ * acinclude.m4, configure.base, plugins/Makefile.am: Convert artsc
++ and arts checks to use GST_CHECK_FEATURE. Extract the checks into
++ macros.
++
++2001-06-26 03:48 richardb
++
++ * acinclude.m4, configure.base, plugins/Makefile.am: Move alsa
++ check to use GST_CHECK_FEATURE macro. Fix a small bug in the
++ macro.
++
++2001-06-26 03:27 richardb
++
++ * acinclude.m4: Fixes to work properly with automake 1.4
++
++2001-06-26 02:53 richardb
++
++ * Makefile.am, acinclude.m4, autogen.sh, configure.base,
++ makeconfigure: Added feature check macro, GST_CHECK_FEATURE. Moved
++ generation of configure.{in,ac} into a separate script. Add hack
++ to the script to stop automake complaining about missing
++ AM_CONDITIONAL call. Replace ESD check by a call to
++ GST_CHECK_FEATURE.
++
++2001-06-25 22:39 richardb
++
++ * configure.base: Move config dir from /etc/gstreamer to
++ ${sysconfdir}/gstreamer by default: more portable, configurable,
++ and standard.
++
++2001-06-25 21:53 richardb
++
++ * docs/plugins/Makefile.am: Remove more generated files
++
++2001-06-25 21:41 richardb
++
++ * docs/: manuals.mak, gst/Makefile.am, libs/Makefile.am: Remove
++ many unwanted generated files from distributions.
++
++2001-06-25 21:39 richardb
++
++ * docs/Makefile.am: Added plugins to DIST_SUBDIRS
++
++2001-06-25 21:37 wtay
++
++ * plugins/oss/gstosssink.c: Don't use the trace feature when it is
++ disabled.
++
++2001-06-25 21:36 wtay
++
++ * plugins/: avi/gstavidecoder.c, quicktime/gstquicktimedecoder.c:
++ Don't use the autoplugger when it is disabled.
++
++2001-06-25 21:36 wtay
++
++ * gst/: Makefile.am, gst.c, gstautoplug.h, gstbuffer.c,
++ gstbuffer.h, gstmeta.c, gstmeta.h, gstparse.h, gstplugin.c,
++ gstplugin.h, gsttrace.h, gsttypefind.h: Removed the final bits of
++ GstMeta. Added conditional compilation of various subsystems.
++
++2001-06-25 21:09 richardb
++
++ * gst/: gobject2gtk.h, gstinfo.c, gstinfo.h: Add consts to
++ appropriate parameters in debug and info handlers. Add appropriate
++ types for some of the memebers of the GTypeInfo struct.
++
++2001-06-25 21:01 omegahacker
++
++ * gst/: .cvsignore, Makefile.am: added gstmarshal.[ch] to
++ .cvsignore, added gstmarshal.list to EXTRA_DIST
++
++2001-06-25 21:00 omegahacker
++
++ * gst/gstobject.h, plugins/Makefile.am,
++ plugins/visualization/Makefile.am: added some dirs to DIST_SUBDIRS,
++ added a comment to gstobject.h
++
++2001-06-25 20:59 omegahacker
++
++ * gst/: Makefile.am, gstmarshal.c, gstmarshal.h, gstmarshal.list:
++ removed gstmarshal.[ch], added gstmarshal.list, and a first pass at
++ generation rules
++
++2001-06-25 20:19 wtay
++
++ * configure.base, gst/Makefile.am: Added configure checks to
++ disable various major subsystems.
++
++2001-06-25 19:14 richardb
++
++ * docs/gst/: Makefile.am, gstreamer.types.in: gstreamer.types.in:
++ remove colorspace header. Makefile.am: remove comment inside rule
++ (nonportable).
++
++2001-06-25 18:22 omegahacker
++
++ * gst/: gobject2gtk.h, gst.c, gstelement.c: gobject2gtk.h: added
++ g2g_object_get_type() prototype gst.c: fixed gst_add_paths_func()
++ prototype gstelement.c: changed some prototypes, added a cast
++
++2001-06-25 18:17 wtay
++
++ * gst/gstobject.h: Added a missing #else
++
++2001-06-25 17:44 wtay
++
++ * configure.base: Removed the wine stuff.
++
++2001-06-25 13:28 richardb
++
++ * gst/gstobject.c: Fix a warning; stuff following an #endif
++
++2001-06-25 13:09 richardb
++
++ * autogen.sh: Added check for pkg-config to autogen.sh
++
++2001-06-25 07:45 omegahacker
++
++ * acconfig.h, autogen.sh, configure.base, gst/Makefile.am,
++ gst/gstbin.c, gst/gstelement.c, gst/gstelementfactory.c,
++ gst/gstinfo.c, gst/gstobject.c, gst/gstobject.h, gst/gstpad.c,
++ gst/gstprops.c, gst/gstthread.c, gst/gstxml.h: Reworked the
++ arguments for DEBUG and INFO. Removed -debug-verbose. Renamed
++ GST_DISABLE_XML to GST_DISABLE_LOADSAVE and added --disable flag.
++
++2001-06-25 04:37 omegahacker
++
++ * gst/: gobject2gtk.c, gobject2gtk.h: Changed all globally defined
++ stub functions to use the g2g_ prefix instead of g_, to avoid *any*
++ potential namespace conflicts.
++
++2001-06-25 02:20 omegahacker
++
++ * acconfig.h, configure.base, docs/random/wtay/events,
++ examples/Makefile.am, examples/cutter/cutter.c,
++ examples/helloworld/helloworld.c,
++ examples/helloworld2/helloworld2.c, examples/mixer/mixer.c,
++ examples/plugins/example.c, examples/plugins/example.h,
++ examples/queue/queue.c, examples/queue2/queue2.c,
++ examples/queue3/queue3.c, examples/queue4/queue4.c,
++ examples/thread/thread.c, examples/typefind/typefind.c,
++ examples/xml/createxml.c, examples/xml/runxml.c, gst/Makefile.am,
++ gst/gobject2gtk.c, gst/gobject2gtk.h, gst/gst.c, gst/gst.h,
++ gst/gstautoplug.c, gst/gstautoplug.h, gst/gstbin.c, gst/gstbin.h,
++ gst/gstelement.c, gst/gstelement.h, gst/gstelementfactory.c,
++ gst/gstextratypes.c, gst/gstextratypes.h, gst/gstmarshal.c,
++ gst/gstmarshal.h, gst/gstobject.c, gst/gstobject.h, gst/gstpad.c,
++ gst/gstpad.h, gst/gstparse.c, gst/gstpipeline.c, gst/gstpipeline.h,
++ gst/gstqueue.c, gst/gstqueue.h, gst/gstscheduler.c,
++ gst/gstscheduler.h, gst/gstthread.c, gst/gstthread.h,
++ gst/gsttypefind.c, gst/gsttypefind.h, gst/gstutils.c,
++ gst/gstutils.h, gst/gstxml.c, gst/gstxml.h,
++ gst/autoplug/autoplugtest.c, gst/autoplug/gstautoplugcache.c,
++ gst/autoplug/gstautoplugger.c, gst/autoplug/gststaticautoplug.c,
++ gst/autoplug/gststaticautoplug.h,
++ gst/autoplug/gststaticautoplugrender.c,
++ gst/autoplug/gststaticautoplugrender.h, gst/elements/Makefile.am,
++ gst/elements/gstdisksink.c, gst/elements/gstdisksink.h,
++ gst/elements/gstdisksrc.c, gst/elements/gstdisksrc.h,
++ gst/elements/gstelements.c, gst/elements/gstfakesink.c,
++ gst/elements/gstfakesink.h, gst/elements/gstfakesrc.c,
++ gst/elements/gstfakesrc.h, gst/elements/gstfdsink.c,
++ gst/elements/gstfdsink.h, gst/elements/gstfdsrc.c,
++ gst/elements/gstfdsrc.h, gst/elements/gsthttpsrc.c,
++ gst/elements/gsthttpsrc.h, gst/elements/gstidentity.c,
++ gst/elements/gstidentity.h, gst/elements/gstmultidisksrc.c,
++ gst/elements/gstmultidisksrc.h, gst/elements/gstpipefilter.c,
++ gst/elements/gstpipefilter.h, gst/elements/gstsinesrc.c,
++ gst/elements/gstsinesrc.h, gst/elements/gsttee.c,
++ gst/elements/gsttee.h, gstplay/gstplay.c, plugins/Makefile.am,
++ plugins/1394/dv1394src.c, plugins/1394/dv1394src.h,
++ plugins/aasink/aasink.c, plugins/aasink/aasink.h,
++ plugins/alaw/alaw-decode.c, plugins/alaw/alaw-decode.h,
++ plugins/alaw/alaw-encode.c, plugins/alaw/alaw-encode.h,
++ plugins/alsa/alsa.h, plugins/alsa/alsa_common.c,
++ plugins/alsa/alsasink.c, plugins/alsa/alsasrc.c,
++ plugins/arts/gst_arts.c, plugins/arts/gst_arts.h,
++ plugins/artsd/artsdsink.c, plugins/artsd/artsdsink.h,
++ plugins/au/gstparseau.c, plugins/au/gstparseau.h,
++ plugins/audiofile/gstafsink.c, plugins/audiofile/gstafsink.h,
++ plugins/audiofile/gstafsrc.c, plugins/audiofile/gstafsrc.h,
++ plugins/audioscale/audioscale.c, plugins/audioscale/audioscale.h,
++ plugins/avi/gstavidecoder.c, plugins/avi/gstavidecoder.h,
++ plugins/avi/gstavidemux.c, plugins/avi/gstavidemux.h,
++ plugins/avi/gstavimux.c, plugins/avi/gstavimux.h,
++ plugins/avi/gstavitypes.c, plugins/avi/gstavitypes.h,
++ plugins/avi/winaudio/aviaudiodecoder.c,
++ plugins/avi/winaudio/aviaudiodecoder.h,
++ plugins/avi/wincodec/gstwindec.cc,
++ plugins/avi/wincodec/gstwindec.h,
++ plugins/avi/wincodec/gstwinenc.cc,
++ plugins/avi/wincodec/gstwinenc.h, plugins/capture/v4l/gstv4lsrc.c,
++ plugins/capture/v4l/gstv4lsrc.h, plugins/cdparanoia/cdparanoia.c,
++ plugins/cdparanoia/cdparanoia.h, plugins/cobin/cobin.c,
++ plugins/cobin/cobin.h, plugins/cobin/spindentity.c,
++ plugins/cobin/spindentity.h, plugins/dv/dvdec.c,
++ plugins/dv/dvdec.h, plugins/dvdsrc/dvdsrc.c,
++ plugins/dvdsrc/dvdsrc.h, plugins/effects/stereo/stereo.c,
++ plugins/effects/stereo/stereo.h, plugins/effects/volume/volume.c,
++ plugins/effects/volume/volume.h, plugins/esd/esdsink/esdsink.c,
++ plugins/esd/esdsink/esdsink.h, plugins/festival/Makefile.am,
++ plugins/festival/gstfestival.c, plugins/festival/gstfestival.h,
++ plugins/filters/Makefile.am, plugins/filters/adder/adder.c,
++ plugins/filters/adder/adder.h,
++ plugins/filters/colorspace/colorspace.c,
++ plugins/filters/colorspace/colorspace.h,
++ plugins/filters/cutter/cutter.c, plugins/filters/cutter/cutter.h,
++ plugins/filters/cutter/filter.func,
++ plugins/filters/deinterlace/deinterlace.c,
++ plugins/filters/deinterlace/deinterlace.h,
++ plugins/filters/intfloatconvert/float2int.c,
++ plugins/filters/intfloatconvert/float2int.h,
++ plugins/filters/intfloatconvert/int2float.c,
++ plugins/filters/intfloatconvert/int2float.h,
++ plugins/filters/intfloatconvert/intfloatconvert.c,
++ plugins/filters/ladspa/gstladspa.c,
++ plugins/filters/ladspa/gstladspa.h,
++ plugins/filters/lav/lavencode.c, plugins/filters/lav/lavencode.h,
++ plugins/filters/level/level.c, plugins/filters/level/level.h,
++ plugins/filters/median/median.c, plugins/filters/median/median.h,
++ plugins/filters/mono2stereo/mono2stereo.c,
++ plugins/filters/mono2stereo/mono2stereo.h,
++ plugins/filters/passthrough/level.c,
++ plugins/filters/passthrough/level.h,
++ plugins/filters/passthrough/passthrough.c,
++ plugins/filters/passthrough/passthrough.h,
++ plugins/filters/smooth/smooth.c, plugins/filters/smooth/smooth.h,
++ plugins/filters/stereo2mono/stereo2mono.c,
++ plugins/filters/stereo2mono/stereo2mono.h,
++ plugins/filters/volenv/filter.func,
++ plugins/filters/volenv/volenv.c, plugins/filters/volenv/volenv.h,
++ plugins/flx/flx_decoder.c, plugins/flx/flx_decoder.h,
++ plugins/gnomevfs/gnomevfssink.c, plugins/gnomevfs/gnomevfssrc.c,
++ plugins/gsm/gstgsmdec.c, plugins/gsm/gstgsmdec.h,
++ plugins/gsm/gstgsmenc.c, plugins/gsm/gstgsmenc.h,
++ plugins/icecast/icecastsend/icecastsend.c,
++ plugins/icecast/icecastsend/icecastsend.h,
++ plugins/jpeg/gstjpegdec.c, plugins/jpeg/gstjpegdec.h,
++ plugins/jpeg/gstjpegenc.c, plugins/jpeg/gstjpegenc.h,
++ plugins/mp3decode/mad/gstmad.c, plugins/mp3decode/mad/gstmad.h,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/mpg123/gstmpg123.h,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3decode/parse/mp3parse.h,
++ plugins/mp3encode/lame/gstlame.c, plugins/mp3encode/lame/gstlame.h,
++ plugins/mpeg1/mpeg1encoder/gstmpeg1encoder.c,
++ plugins/mpeg1/mpeg1encoder/gstmpeg1encoder.h,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.h,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.c,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.h,
++ plugins/mpeg1/parse/mpeg1parse.c, plugins/mpeg1/parse/mpeg1parse.h,
++ plugins/mpeg1/system_encode/buffer.c,
++ plugins/mpeg1/system_encode/system_encode.c,
++ plugins/mpeg1/system_encode/system_encode.h,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg1video/parse/mp1videoparse.h,
++ plugins/mpeg2/ac3dec/ac3dec.c, plugins/mpeg2/ac3dec/ac3dec.h,
++ plugins/mpeg2/ac3parse/ac3parse.c,
++ plugins/mpeg2/ac3parse/ac3parse.h,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.h,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.c,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.h,
++ plugins/mpeg2/parse/mpeg2parse.c, plugins/mpeg2/parse/mpeg2parse.h,
++ plugins/mpeg2/subtitles/mpeg2subt.c,
++ plugins/mpeg2/subtitles/mpeg2subt.h,
++ plugins/mpeg2/video/gstmpeg2play.c,
++ plugins/mpeg2/video/gstmpeg2play.h,
++ plugins/mpeg2/videoparse/mp2videoparse.c,
++ plugins/mpeg2/videoparse/mp2videoparse.h,
++ plugins/mulaw/mulaw-decode.c, plugins/mulaw/mulaw-decode.h,
++ plugins/mulaw/mulaw-encode.c, plugins/mulaw/mulaw-encode.h,
++ plugins/oss/gstossgst.c, plugins/oss/gstossgst.h,
++ plugins/oss/gstosssink.c, plugins/oss/gstosssink.h,
++ plugins/oss/gstosssrc.c, plugins/oss/gstosssrc.h,
++ plugins/quicktime/gstquicktimedecoder.c,
++ plugins/quicktime/gstquicktimedecoder.h,
++ plugins/quicktime/gstquicktimedemux.c,
++ plugins/quicktime/gstquicktimedemux.h,
++ plugins/quicktime/gstquicktimetypes.c,
++ plugins/quicktime/gstquicktimetypes.h, plugins/rtjpeg/rtjpegdec.c,
++ plugins/rtjpeg/rtjpegdec.h, plugins/rtjpeg/rtjpegenc.c,
++ plugins/rtjpeg/rtjpegenc.h, plugins/rtp/rtpsend/rtpsend.c,
++ plugins/rtp/rtpsend/rtpsend.h, plugins/sdlsink/sdlvideosink.c,
++ plugins/sdlsink/sdlvideosink.h, plugins/udp/.cvsignore,
++ plugins/udp/Makefile.am, plugins/udp/gstudp.c,
++ plugins/udp/gstudpsink.c, plugins/udp/gstudpsink.h,
++ plugins/udp/gstudpsrc.c, plugins/udp/gstudpsrc.h,
++ plugins/vcdsrc/vcdsrc.c, plugins/vcdsrc/vcdsrc.h,
++ plugins/videoscale/videoscale.c, plugins/videoscale/videoscale.h,
++ plugins/visualization/Makefile.am,
++ plugins/visualization/chart/gstchart.c,
++ plugins/visualization/smoothwave/smoothwave.c,
++ plugins/visualization/smoothwave/smoothwave.h,
++ plugins/visualization/spectrum/gstspectrum.c,
++ plugins/visualization/spectrum/gstspectrum.h,
++ plugins/visualization/synaesthesia/core.h,
++ plugins/visualization/synaesthesia/synaesthesia.c,
++ plugins/visualization/synaesthesia/synaesthesia.h,
++ plugins/visualization/vumeter/vumeter.c,
++ plugins/visualization/vumeter/vumeter.h,
++ plugins/vorbis/vorbisdec.c, plugins/vorbis/vorbisdec.h,
++ plugins/vorbis/vorbisenc.c, plugins/vorbis/vorbisenc.h,
++ plugins/wav/gstparsewav.c, plugins/wav/gstparsewav.h,
++ plugins/xmms/gstxmms.h, plugins/xmms/gstxmmseffect.c,
++ plugins/xmms/gstxmmseffect.h, plugins/xmms/gstxmmsinput.c,
++ plugins/xmms/gstxmmsinput.h, plugins/xmms/pluginenum.c,
++ plugins/xmms/xmms.h, plugins/xvideosink/Makefile.am,
++ plugins/xvideosink/xvideosink.c, plugins/xvideosink/xvideosink.h,
++ test/ac3parse.c, test/ac3play.c, test/avi2mpg.c, test/aviparse.c,
++ test/dvdcat.c, test/lat.c, test/mp1parse.c, test/mp1tomp1.c,
++ test/mp2toavi.c, test/mp2tomp1.c, test/mp3.c, test/mp3mad.c,
++ test/mp3parse.c, test/mp3play.c, test/mp3tovorbis.c,
++ test/mpeg2parse.c, test/pipetest.c, test/qtest.c, test/record.c,
++ test/vidcapture.c, test/vidcapture2.c, test/videotest.c,
++ test/wave.c, test/xmmstest.c, tests/autoplug.c, tests/autoplug3.c,
++ tests/case4.c, tests/incsched.c, tests/mp1vid.c, tests/mp3encode.c,
++ tests/paranoia.c, tests/queue.c, tests/rip.c, tests/states.c,
++ tests/threadlock.c, tests/eos/case1.c, tests/eos/case2.c,
++ tests/eos/case3.c, tests/eos/case4.c, tests/eos/case5.c,
++ tests/eos/case6.c, tests/eos/case7.c, tests/sched/runxml.c,
++ tools/gstreamer-compprep.c, tools/gstreamer-inspect.c,
++ tools/gstreamer-launch.c: Merged from GOBJECT1 to HEAD at 200106241
++
++2001-06-25 01:07 omegahacker
++
++ * gst/gobject2gtk.c, gst/gobject2gtk.h, tools/gstreamer-compprep.c,
++ tools/gstreamer-inspect.c: added shim for
++ g_object_class_list_properties and converted -inspect and -compprep
++ to use it
++
++2001-06-25 00:50 omegahacker
++
++ * examples/plugins/: example.c, example.h: ported example plugin to
++ gobject
++
++2001-06-25 00:25 omegahacker
++
++ * examples/cutter/cutter.c: ported to gobject
++
++2001-06-24 23:56 omegahacker
++
++ * plugins/visualization/chart/gstchart.c: ported chart to gobject
++
++2001-06-24 23:44 omegahacker
++
++ * LICENSE_readme, REQUIREMENTS, acconfig.h, autogen.sh,
++ configure.base, gstreamer.spec.in, idiottest.mak,
++ docs/gst/gstreamer-sections.txt, docs/manual/advanced.sgml,
++ docs/manual/bins.sgml, docs/manual/factories.sgml,
++ docs/manual/helloworld.sgml, docs/manual/helloworld2.sgml,
++ docs/manual/pads.sgml, docs/manual/states.sgml, docs/random/eos,
++ examples/Makefile.am, examples/cutter/Makefile.am,
++ examples/cutter/cutter.c, examples/cutter/cutter.h,
++ gst/Makefile.am, gst/gst.c, gst/gstautoplug.c, gst/gstbin.c,
++ gst/gstbuffer.c, gst/gstbufferpool.c, gst/gstbufferpool.h,
++ gst/gstcaps.c, gst/gstelement.c, gst/gstelementfactory.c,
++ gst/gstobject.c, gst/gstobject.h, gst/gstpad.c, gst/gstparse.c,
++ gst/gstplugin.c, gst/gstprops.c, gst/gstscheduler.c,
++ gst/gstthread.c, gst/elements/gstdisksink.c,
++ gst/elements/gstdisksrc.c, gstplay/ChangeLog, gstplay/Makefile.am,
++ gstplay/callbacks.c, gstplay/full-screen.c, gstplay/full-screen.h,
++ gstplay/gstmediaplay.c, gstplay/gstmediaplay.glade,
++ gstplay/gstmediaplay.h, gstplay/gstplay.c, gstplay/gstplay.h,
++ gstplay/main.c, include/Makefile.am, libs/audio/gstaudio.c,
++ libs/audio/gstaudio.h, libs/riff/gstriffencode.c,
++ plugins/Makefile.am, plugins/audiofile/gstafsink.c,
++ plugins/audiofile/gstafsrc.c, plugins/audiofile/gstafsrc.h,
++ plugins/filters/Makefile.am,
++ plugins/filters/colorspace/Makefile.am,
++ plugins/filters/colorspace/colorspace.c,
++ plugins/filters/colorspace/colorspace.h,
++ plugins/filters/cutter/README, plugins/filters/cutter/cutter.c,
++ plugins/filters/cutter/cutter.h,
++ plugins/filters/deinterlace/.cvsignore,
++ plugins/filters/deinterlace/Makefile.am,
++ plugins/filters/deinterlace/deinterlace.c,
++ plugins/filters/deinterlace/deinterlace.h,
++ plugins/filters/intfloatconvert/float2int.c,
++ plugins/filters/intfloatconvert/float2int.h,
++ plugins/filters/intfloatconvert/int2float.c,
++ plugins/filters/intfloatconvert/int2float.h,
++ plugins/filters/median/median.c, plugins/filters/median/median.h,
++ plugins/filters/smooth/smooth.c, plugins/filters/smooth/smooth.h,
++ plugins/flac/.cvsignore, plugins/flac/Makefile.am,
++ plugins/flac/flac.c, plugins/flac/flacdec.c,
++ plugins/flac/flacdec.h, plugins/flac/flacenc.c,
++ plugins/flac/flacenc.h, plugins/jpeg/gstjpegdec.c,
++ plugins/mp3decode/mad/gstmad.c, plugins/mp3decode/mad/gstmad.h,
++ plugins/mpeg1/parse/mpeg1parse.c, plugins/mpeg1/parse/mpeg1parse.h,
++ plugins/quicktime/Makefile.am,
++ plugins/quicktime/gstquicktimedecoder.c,
++ plugins/quicktime/gstquicktimedecoder.h,
++ plugins/quicktime/gstquicktimedemux.c,
++ plugins/quicktime/gstquicktimedemux.h,
++ plugins/quicktime/gstquicktimetypes.c,
++ plugins/quicktime/gstquicktimetypes.h, plugins/vgasink/.cvsignore,
++ plugins/vgasink/Makefile.am, plugins/vgasink/vgavideosink.c,
++ plugins/vgasink/vgavideosink.h, plugins/videoscale/videoscale.h,
++ plugins/visualization/Makefile.am,
++ plugins/visualization/chart/.cvsignore,
++ plugins/visualization/chart/Makefile.am,
++ plugins/visualization/chart/gstchart.c, tools/README,
++ tools/gstreamer-compprep.1, tools/gstreamer-launch.c: Merge from
++ HEAD to BRANCH-GOBJECT1 at 200106241
++
++2001-06-24 22:21 wtay
++
++ * tools/gstreamer-launch.c: Commented out the Gtk widget stuff.
++
++2001-06-24 22:18 omegahacker
++
++ * gst/: Makefile.am, gst.c, gstautoplug.c, gstbin.c, gstcaps.c,
++ gstelement.c, gstelementfactory.c, gstobject.c, gstobject.h,
++ gstpad.c, gstprops.c, gstthread.c: initial pass at #ifdef'ing xml
++ load/save
++
++2001-06-24 22:15 wtay
++
++ * gstplay/gstplay.c: Some compile fixes.
++
++2001-06-24 22:14 wtay
++
++ * configure.base: Added the festival plugin and udp.
++
++2001-06-24 22:10 wtay
++
++ * plugins/: festival/gstfestival.c, oss/gstosssink.c,
++ oss/gstosssink.h, oss/gstosssrc.c, udp/gstudpsink.c,
++ udp/gstudpsrc.c, udp/gstudpsrc.h, xvideosink/Makefile.am: Added an
++ arg to set the fragment size in oss plugins. Use a TCP stream
++ connection to do caps nego over the wire in UDP. More pending
++ changes to some plugins.
++
++2001-06-24 22:06 omegahacker
++
++ * configure.base, plugins/Makefile.am: New check for libesd, a
++ model for all the other checks I hope. Need to convert all the
++ other checks to operate like this.
++
++2001-06-24 16:20 wtay
++
++ * plugins/: Makefile.am, udp/.cvsignore, udp/Makefile.am,
++ udp/gstudp.c, udp/gstudpsink.c, udp/gstudpsink.h, udp/gstudpsrc.c,
++ udp/gstudpsrc.h: Added the beginnings of an udp send/receive
++ plugin.
++
++2001-06-24 16:20 wtay
++
++ * plugins/udp/gstudpsink.h: file gstudpsink.h was initially added
++ on branch BRANCH-GOBJECT1.
++
++2001-06-24 16:20 wtay
++
++ * plugins/udp/Makefile.am: file Makefile.am was initially added on
++ branch BRANCH-GOBJECT1.
++
++2001-06-24 16:20 wtay
++
++ * plugins/udp/gstudpsrc.c: file gstudpsrc.c was initially added on
++ branch BRANCH-GOBJECT1.
++
++2001-06-24 16:20 wtay
++
++ * plugins/udp/gstudp.c: file gstudp.c was initially added on branch
++ BRANCH-GOBJECT1.
++
++2001-06-24 16:20 wtay
++
++ * plugins/udp/gstudpsink.c: file gstudpsink.c was initially added
++ on branch BRANCH-GOBJECT1.
++
++2001-06-24 16:20 wtay
++
++ * plugins/udp/.cvsignore: file .cvsignore was initially added on
++ branch BRANCH-GOBJECT1.
++
++2001-06-24 16:20 wtay
++
++ * plugins/udp/gstudpsrc.h: file gstudpsrc.h was initially added on
++ branch BRANCH-GOBJECT1.
++
++2001-06-24 15:55 wtay
++
++ * docs/random/wtay/events: file events was initially added on
++ branch BRANCH-GOBJECT1.
++
++2001-06-24 15:55 wtay
++
++ * docs/random/wtay/events: Added some random ramblings about a the
++ design of an event system.
++
++2001-06-24 02:02 wtay
++
++ * gst/gobject2gtk.c: Removed some debug noise.
++
++2001-06-24 01:55 wtay
++
++ * test/: aviparse.c, mp1parse.c, mpeg2parse.c, videotest.c, wave.c:
++ Compile fixes for gtk.
++
++2001-06-23 13:23 wtay
++
++ * plugins/festival/gstfestival.c: Make sure we don't send more data
++ than the buffersize.
++
++2001-06-23 13:12 wtay
++
++ * plugins/festival/gstfestival.c: file gstfestival.c was initially
++ added on branch BRANCH-GOBJECT1.
++
++2001-06-23 13:12 wtay
++
++ * plugins/festival/Makefile.am: file Makefile.am was initially
++ added on branch BRANCH-GOBJECT1.
++
++2001-06-23 13:12 wtay
++
++ * plugins/: Makefile.am, festival/Makefile.am,
++ festival/gstfestival.c, festival/gstfestival.h: Added the festival
++ text-to-speech plugin. It will currently only work by contacting
++ the festival server on localhost. The output is WAV so it needs to
++ be parsed with parsewav before connecting it to an audiosink:
++
++ ./gstreamer-launch disksrc location=/etc/motd ! festival ! parsewav
++ ! osssink
++
++ Latency is terrible because we don't process uterances individually
++ yet.
++
++2001-06-23 13:12 wtay
++
++ * plugins/festival/gstfestival.h: file gstfestival.h was initially
++ added on branch BRANCH-GOBJECT1.
++
++2001-06-22 02:14 wtay
++
++ * examples/: Makefile.am, helloworld/helloworld.c,
++ helloworld2/helloworld2.c, mixer/mixer.c, queue/queue.c,
++ queue2/queue2.c, queue3/queue3.c, queue4/queue4.c, thread/thread.c,
++ typefind/typefind.c, xml/createxml.c, xml/runxml.c: Fixed the
++ examples for glib2 Removed plugins for now (need to run the script
++ on it)
++
++2001-06-22 02:05 wtay
++
++ * tests/: autoplug.c, autoplug3.c, case4.c, incsched.c, mp1vid.c,
++ mp3encode.c, paranoia.c, queue.c, rip.c, states.c, threadlock.c,
++ eos/case1.c, eos/case2.c, eos/case3.c, eos/case4.c, eos/case5.c,
++ eos/case6.c, eos/case7.c, sched/runxml.c: Lots of compile fixes for
++ glib2.0
++
++2001-06-22 01:43 wtay
++
++ * test/: ac3parse.c, ac3play.c, avi2mpg.c, dvdcat.c, lat.c,
++ mp1tomp1.c, mp2toavi.c, mp2tomp1.c, mp3.c, mp3mad.c, mp3parse.c,
++ mp3play.c, mp3tovorbis.c, pipetest.c, qtest.c, record.c,
++ vidcapture.c, vidcapture2.c, xmmstest.c: Lots of compile fixes
++ against glib2.0
++
++2001-06-22 01:14 wtay
++
++ * configure.base: Disable most of the gnome/gtk stuff when
++ compiling with glib2
++
++2001-06-22 00:11 wtay
++
++ * plugins/capture/v4l/: gstv4lsrc.c, gstv4lsrc.h: Added the option
++ to set the format and the output size.
++
++2001-06-21 23:48 omegahacker
++
++ * gst/gstqueue.c: marked up the function pointers with
++ GST_DEBUG_FUNCPTR
++
++2001-06-21 20:44 wtay
++
++ * configure.base: Added vgasink.
++
++2001-06-21 20:43 wtay
++
++ * plugins/vgasink/: .cvsignore, Makefile.am, vgavideosink.c,
++ vgavideosink.h: Added the vgasink by sienap.
++
++2001-06-21 16:29 wtay
++
++ * tools/gstreamer-compprep.c: Compile fixes for GObject.
++
++2001-06-21 15:39 wtay
++
++ * tools/gstreamer-inspect.c: Fixed a compileation error for
++ GObject.
++
++2001-06-21 15:22 wtay
++
++ * gst/: gobject2gtk.h, gstqueue.c: Compile fixes for gobject.
++
++2001-06-21 13:21 sbaker3
++
++ * docs/gst/gstreamer-sections.txt: added refcounting and
++ _get_default
++
++2001-06-21 12:50 wtay
++
++ * plugins/flx/flx_decoder.h: Removed the colorspace dependency.
++
++2001-06-21 12:50 wtay
++
++ * plugins/Makefile.am: Removed the videoscaler for now until it's
++ fixed.
++
++2001-06-21 12:49 wtay
++
++ * plugins/videoscale/: gstscale_x86.c, gstscale_x86.h,
++ gstscale_x86_asm.s, gstvideoscale.c, gstvideoscale.h, videoscale.h:
++ Added some files for future use.
++
++2001-06-21 12:42 wtay
++
++ * libs/Makefile.am: Removed old unused libs.
++
++2001-06-21 12:35 wtay
++
++ * configure.base: Removed the winloader
++
++2001-06-21 12:34 wtay
++
++ * libs/Makefile.am: Removed the wine loader.
++
++2001-06-21 12:32 wtay
++
++ * include/Makefile.am: Removed the winelibs.
++
++2001-06-21 12:19 sbaker3
++
++ * gst/: gstbufferpool.c, gstbufferpool.h: added ref counting to the
++ buffer pool. also _destroy will clean up the buffer pool mem_chunk
++ if it is the default implementation
++
++2001-06-21 03:03 omegahacker
++
++ * plugins/Makefile.am: fixed spelling of xvideosink
++
++2001-06-21 00:43 wtay
++
++ * gst/: gobject2gtk.h, gstqueue.c: Added some signal shims. Fixed
++ the queue state_change stuff.
++
++2001-06-20 23:52 wtay
++
++ * plugins/Makefile.am: Added the xvideosink to the dirs.
++
++2001-06-20 23:33 wtay
++
++ * plugins/: dv/dvdec.c, xmms/xmms.h: All pending changes I still
++ have
++
++2001-06-20 23:21 wtay
++
++ * plugins/aasink/aasink.c: Compile fixes for aasink.
++
++2001-06-20 23:21 wtay
++
++ * gst/gobject2gtk.h: Added a shim for a marshaller.
++
++2001-06-20 22:56 wtay
++
++ * gst/gobject2gtk.h: Added som shims for GTypeFlags and GParamFlags
++
++2001-06-20 22:55 wtay
++
++ * plugins/avi/wincodec/: gstwindec.cc, gstwinenc.cc: Compile fixes
++ against gtk.
++
++2001-06-20 22:40 wtay
++
++ * plugins/arts/gst_arts.c: compile fixes for GTK1.2.
++
++2001-06-20 22:40 wtay
++
++ * gst/gobject2gtk.h: Fixed an arg called "class", it's a C++
++ reserved word..
++
++2001-06-20 22:30 wtay
++
++ * gst/gobject2gtk.h: Added g_type_from_name to the shims.
++
++2001-06-20 22:29 wtay
++
++ * plugins/filters/ladspa/gstladspa.c: Some compile fixes for gtk1.2
++
++2001-06-20 21:58 wtay
++
++ * gst/gobject2gtk.c: Renamed the shortname field in GParamSpec to
++ name to match the glib2.0 implementation.
++
++2001-06-20 21:49 wtay
++
++ * tools/gstreamer-inspect.c: Added object properties introspection.
++
++2001-06-20 21:48 wtay
++
++ * gst/gobject2gtk.h: Added a better shim for g_object_get_property
++
++2001-06-20 15:53 sbaker3
++
++ * gst/gstbuffer.c: fixed operator precedence bug which caused 32
++ times too much memory to be allocated for each GstBuffer struct
++
++2001-06-20 00:17 omegahacker
++
++ * gst/: gobject2gtk.c, gobject2gtk.h, elements/gstfakesrc.c: fixed
++ signal registration problem in gobject2gtk shim
++
++2001-06-19 22:14 omegahacker
++
++ * gst/gobject2gtk.c, gst/gobject2gtk.h, gst/gstpad.c,
++ gst/autoplug/gstautoplugger.c, gst/elements/gstfdsrc.c,
++ plugins/aasink/aasink.c, plugins/effects/stereo/stereo.c,
++ plugins/effects/volume/volume.c,
++ plugins/filters/mono2stereo/mono2stereo.c,
++ plugins/mp3encode/lame/gstlame.c, plugins/sdlsink/sdlvideosink.c:
++ More GObject updates, cleanups to some of the elements to make the
++ port correct.
++
++2001-06-19 19:32 wtay
++
++ * gst/elements/gstdisksink.c: Changed the bytes_written to a gint
++ to avoid overflow...
++
++2001-06-19 13:53 richardb
++
++ * idiottest.mak: idiottest was failing because of change of
++ PLUGIN_USE_SRCDIR to PLUGIN_USE_BUILDDIR - fixed.
++
++2001-06-19 11:34 richardb
++
++ * tools/gstreamer-launch.c: Add -o option argument to
++ gstreamer-launch, to specify a file to output the pipeline to,
++ instead of running it.
++
++2001-06-19 08:57 omegahacker
++
++ * autogen.sh: updated autogen.sh to use --enable-plugin-builddir
++
++2001-06-19 08:57 omegahacker
++
++ * gst/gstplugin.c, acconfig.h, configure.base: changed
++ plugin-srcdir to plugin-builddir, which is what it should be
++
++2001-06-18 23:33 richardb
++
++ * gst/gstprops.c: Simplify properties which contain lists of
++ integer and integer range entries to minimal combination of ints
++ and ranges that is equivalent. eg, (1,2,3,7-12,13) becomes
++ (1-3,7-13)
++
++ Don't bother with floats for the moment, though it would be easy to
++ add an equivalent, which would simplify overlapping ranges.
++
++2001-06-18 21:14 richardb
++
++ * plugins/visualization/chart/gstchart.c: Fix memory leak, thanks
++ wtay.
++
++2001-06-18 20:20 wtay
++
++ * plugins/flac/: Makefile.am, flacdec.c, flacenc.c, flacenc.h:
++ Updated the flac decoder/encode to the latest CVS version. I had
++ to increase the cothread stack in cothread.c (8 threads max) to get
++ the encoder working :(
++
++2001-06-18 12:27 richardb
++
++ * plugins/filters/Makefile.am: Add a DIST_SUBDIRS line
++
++2001-06-18 12:12 richardb
++
++ * configure.base, plugins/visualization/Makefile.am: Add chart
++ plugin to build system.
++
++2001-06-18 12:09 richardb
++
++ * plugins/visualization/chart/: .cvsignore, Makefile.am,
++ gstchart.c: Initial commit of chart plugin. Draws charts of data
++ streams. Currently has no settable framerate, draws inefficiently,
++ has no settable size and looks fairly ugly. Needs data parsing to
++ be split into a separate plugin.
++
++2001-06-18 05:56 dlehn
++
++ * configure.base: ALSA checks use alsa_save_* names and gst attempt
++ to save flags fails when using the same names. Prefixed with gst_.
++
++2001-06-17 23:14 wtay
++
++ * plugins/flac/: flacenc.c, flacenc.h: More work on the encoder..
++ it still segfaults inside the flac lib for some reason..
++
++2001-06-17 20:44 wtay
++
++ * plugins/flac/: .cvsignore, Makefile.am, flac.c, flacdec.c,
++ flacdec.h, flacenc.c, flacenc.h: Added a FLAC decoder. The encoder
++ does not work yet.
++
++2001-06-17 16:06 wtay
++
++ * gst/elements/gstsinesrc.c: Updated the params a bit.
++
++2001-06-17 16:03 wtay
++
++ * gst/: gstutils.c, gstutils.h: Fixed the utils for getting
++ properties again. Added come const directives to the arguments
++ again. Check for non exiting properties.
++
++2001-06-17 15:35 sbaker3
++
++ * gst/gstbufferpool.h: added _gst_buffer_pool_initialize
++
++2001-06-17 15:12 wtay
++
++ * tools/gstreamer-inspect.c: Print out the enum values too.
++
++2001-06-17 14:58 sbaker3
++
++ * plugins/filters/intfloatconvert/: float2int.c, int2float.c: uses
++ default bufferpool factory
++
++2001-06-17 14:55 sbaker3
++
++ * gst/: gst.c, gstbufferpool.c, gstbufferpool.h: added a default
++ bufferpool factory function. it reuses existing instances of
++ bufferpool if requests are made for existing buffer sizes
++
++2001-06-17 09:55 omegahacker
++
++ * gst/gstobject.c, gst/gstobject.h, gst/gsttypefind.c,
++ gst/autoplug/gstautoplugcache.c, plugins/aasink/aasink.c,
++ plugins/audiofile/gstafsink.c, plugins/audiofile/gstafsrc.c,
++ plugins/cdparanoia/cdparanoia.c, plugins/esd/esdsink/esdsink.c,
++ plugins/filters/cutter/cutter.c, plugins/gnomevfs/gnomevfssink.c,
++ plugins/gnomevfs/gnomevfssrc.c, plugins/gsm/gstgsmenc.c,
++ plugins/jpeg/gstjpegenc.c, plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/sdlsink/sdlvideosink.c, plugins/xmms/gstxmmseffect.c,
++ plugins/xvideosink/xvideosink.c: Mostly went around converting
++ G_OBJECT_TYPE(klass) to G_TYPE_FROM_CLASS(klass)
++
++2001-06-17 09:52 omegahacker
++
++ * configure.ac, configure.in: removed configure.ac and configure.in
++
++2001-06-17 05:07 omegahacker
++
++ * plugins/1394/: dv1394src.c, dv1394src.h: ported 1394 plugin to
++ gobject, somehow forget that one...
++
++2001-06-17 04:17 wtay
++
++ * tools/gstreamer-inspect.c: Added enums to inspect.
++
++2001-06-17 04:10 omegahacker
++
++ * gst/gobject2gtk.h: file gobject2gtk.h was initially added on
++ branch BRANCH-GOBJECT1.
++
++2001-06-17 04:10 omegahacker
++
++ * gst/gobject2gtk.c: file gobject2gtk.c was initially added on
++ branch BRANCH-GOBJECT1.
++
++2001-06-17 04:10 omegahacker
++
++ * acconfig.h, configure.base, gst/Makefile.am, gst/gobject2gtk.c,
++ gst/gobject2gtk.h, gst/gst.c, gst/gst.h, gst/gstextratypes.c,
++ gst/gstextratypes.h, gst/gstobject.c, gst/gstobject.h,
++ gst/gstparse.c, gst/gstqueue.c, gst/gstthread.c, gst/gstutils.c,
++ gst/gstutils.h: Added gobject to gtkobject bridge
++ (gobject2gtk.[ch]) and configure-time support for selecting between
++ glib and gtk (--enable-glib2 to build with gobject).
++
++2001-06-17 04:05 wtay
++
++ * plugins/mp3encode/lame/gstlame.c: Fixed the get and set functions
++ for enum properties.
++
++2001-06-17 04:03 wtay
++
++ * docs/manual/helloworld.sgml: Fixed the audiosink in the example
++ with osssink.
++
++2001-06-17 03:47 wtay
++
++ * gst/: gstutils.c, gstutils.h: Fixed the utils for getting
++ properties. Added come const directives to the arguments.
++
++2001-06-17 03:39 wtay
++
++ * tools/gstreamer-inspect.c: Figured out how to get a property from
++ an object.
++
++2001-06-16 18:35 wtay
++
++ * tools/gstreamer-inspect.c: Pff, this doesn't seem to work... Can
++ someone try to get a property from a GObject?
++
++2001-06-16 18:25 wtay
++
++ * tools/gstreamer-inspect.c: Somewhat fixed -inspect
++
++2001-06-16 15:36 wtay
++
++ * configure.base: Removed the obsolete libs.
++
++2001-06-16 15:35 wtay
++
++ * plugins/Makefile.am: Added the avi stuff to the makefile again.
++
++2001-06-16 15:29 wtay
++
++ * plugins/avi/: Makefile.am, codectest.c, gstavidecoder.c,
++ gstavidecoder.h, gstavidemux.c, gstavidemux.h, gstaviencoder.c,
++ gstaviencoder.h, gstavimux.c, gstavimux.h, gstavitypes.c,
++ gstavitypes.h, playcodecs.c, videoheader.c: Updated the avi decoder
++ to gobject.
++
++2001-06-16 14:46 wtay
++
++ * plugins/avi/winaudio/: aviaudiodecoder.c, aviaudiodecoder.h:
++ Updated the audiodecoder to gobject.
++
++2001-06-16 14:24 wtay
++
++ * gstplay/gstplay.c: Removed a check (see that the file exists
++ locally ??) to enable network streaming with gnomevfssrc again.
++
++2001-06-16 14:17 wtay
++
++ * plugins/avi/wincodec/: Makefile.am, gstwincodec.c,
++ gstwincodec.cc, gstwindec.c, gstwindec.cc, gstwindec.h,
++ gstwinenc.c, gstwinenc.cc, gstwinenc.h: Merged from HEAD on
++ 20010616 (13:00 GMT). Compile fixes for GObject.
++
++2001-06-16 01:43 wtay
++
++ * plugins/Makefile.am: Updated the makefile.
++
++2001-06-16 01:32 wtay
++
++ * plugins/arts/gst_arts.c: Fixed arts
++
++2001-06-16 01:26 wtay
++
++ * plugins/filters/Makefile.am: Added LADSPA back in the Makefile.
++
++2001-06-16 01:25 wtay
++
++ * plugins/filters/ladspa/gstladspa.c: LADSPA compiles.
++
++2001-06-16 01:14 wtay
++
++ * plugins/xmms/: gstxmmseffect.c, gstxmmsinput.c, pluginenum.c:
++ Fixed some stuff in xmms, removed the args for now.
++
++2001-06-16 00:49 wtay
++
++ * plugins/flx/flx_decoder.h: Removed the dependency on colorspace.
++
++2001-06-16 00:48 wtay
++
++ * plugins/filters/: Makefile.am, ladspa/gstladspa.c: Removed ladspa
++ from the Makefile until it compiles. Removed the dependency on OSS
++ from ladspa.
++
++2001-06-16 00:36 wtay
++
++ * plugins/visualization/: Makefile.am, synaesthesia/core.h,
++ synaesthesia/synaesthesia.c, synaesthesia/synaesthesia.h: Removed
++ old, non functional code out of the makefile.
++
++2001-06-16 00:23 omegahacker
++
++ * configure.ac, configure.in, gst/gst.c, gst/gstmarshal.c,
++ gst/gstmarshal.h, gst/autoplug/autoplugtest.c,
++ plugins/aasink/aasink.c, plugins/aasink/aasink.h,
++ plugins/alaw/alaw-decode.c, plugins/alaw/alaw-decode.h,
++ plugins/alaw/alaw-encode.c, plugins/alaw/alaw-encode.h,
++ plugins/alsa/alsa.h, plugins/alsa/alsa_common.c,
++ plugins/alsa/alsasink.c, plugins/alsa/alsasrc.c,
++ plugins/arts/gst_arts.c, plugins/arts/gst_arts.h,
++ plugins/artsd/artsdsink.c, plugins/artsd/artsdsink.h,
++ plugins/au/gstparseau.c, plugins/au/gstparseau.h,
++ plugins/audiofile/gstafsink.c, plugins/audiofile/gstafsink.h,
++ plugins/audiofile/gstafsrc.c, plugins/audiofile/gstafsrc.h,
++ plugins/audioscale/audioscale.c, plugins/audioscale/audioscale.h,
++ plugins/capture/v4l/gstv4lsrc.c, plugins/capture/v4l/gstv4lsrc.h,
++ plugins/cdparanoia/cdparanoia.c, plugins/cdparanoia/cdparanoia.h,
++ plugins/cobin/cobin.c, plugins/cobin/cobin.h,
++ plugins/cobin/spindentity.c, plugins/cobin/spindentity.h,
++ plugins/dv/dvdec.c, plugins/dv/dvdec.h, plugins/dvdsrc/dvdsrc.c,
++ plugins/dvdsrc/dvdsrc.h, plugins/effects/stereo/stereo.c,
++ plugins/effects/stereo/stereo.h, plugins/effects/volume/volume.c,
++ plugins/effects/volume/volume.h, plugins/esd/esdsink/esdsink.c,
++ plugins/esd/esdsink/esdsink.h, plugins/filters/adder/adder.c,
++ plugins/filters/adder/adder.h,
++ plugins/filters/colorspace/colorspace.c,
++ plugins/filters/colorspace/colorspace.h,
++ plugins/filters/cutter/cutter.c, plugins/filters/cutter/cutter.h,
++ plugins/filters/cutter/filter.func,
++ plugins/filters/intfloatconvert/float2int.c,
++ plugins/filters/intfloatconvert/float2int.h,
++ plugins/filters/intfloatconvert/int2float.c,
++ plugins/filters/intfloatconvert/int2float.h,
++ plugins/filters/intfloatconvert/intfloatconvert.c,
++ plugins/filters/ladspa/gstladspa.c,
++ plugins/filters/ladspa/gstladspa.h,
++ plugins/filters/lav/lavencode.c, plugins/filters/lav/lavencode.h,
++ plugins/filters/level/level.c, plugins/filters/level/level.h,
++ plugins/filters/median/median.c, plugins/filters/median/median.h,
++ plugins/filters/mono2stereo/mono2stereo.c,
++ plugins/filters/mono2stereo/mono2stereo.h,
++ plugins/filters/passthrough/level.c,
++ plugins/filters/passthrough/level.h,
++ plugins/filters/passthrough/passthrough.c,
++ plugins/filters/passthrough/passthrough.h,
++ plugins/filters/smooth/smooth.c, plugins/filters/smooth/smooth.h,
++ plugins/filters/stereo2mono/stereo2mono.c,
++ plugins/filters/stereo2mono/stereo2mono.h,
++ plugins/filters/volenv/filter.func,
++ plugins/filters/volenv/volenv.c, plugins/filters/volenv/volenv.h,
++ plugins/flx/flx_decoder.c, plugins/flx/flx_decoder.h,
++ plugins/gnomevfs/gnomevfssink.c, plugins/gnomevfs/gnomevfssrc.c,
++ plugins/gsm/gstgsmdec.c, plugins/gsm/gstgsmdec.h,
++ plugins/gsm/gstgsmenc.c, plugins/gsm/gstgsmenc.h,
++ plugins/icecast/icecastsend/icecastsend.c,
++ plugins/icecast/icecastsend/icecastsend.h,
++ plugins/jpeg/gstjpegdec.c, plugins/jpeg/gstjpegdec.h,
++ plugins/jpeg/gstjpegenc.c, plugins/jpeg/gstjpegenc.h,
++ plugins/mp3decode/mad/gstmad.c, plugins/mp3decode/mad/gstmad.h,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/mpg123/gstmpg123.h,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3decode/parse/mp3parse.h,
++ plugins/mp3encode/lame/gstlame.c, plugins/mp3encode/lame/gstlame.h,
++ plugins/mpeg1/mpeg1encoder/gstmpeg1encoder.c,
++ plugins/mpeg1/mpeg1encoder/gstmpeg1encoder.h,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.h,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.c,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.h,
++ plugins/mpeg1/parse/mpeg1parse.c, plugins/mpeg1/parse/mpeg1parse.h,
++ plugins/mpeg1/system_encode/buffer.c,
++ plugins/mpeg1/system_encode/system_encode.c,
++ plugins/mpeg1/system_encode/system_encode.h,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg1video/parse/mp1videoparse.h,
++ plugins/mpeg2/ac3dec/ac3dec.c, plugins/mpeg2/ac3dec/ac3dec.h,
++ plugins/mpeg2/ac3parse/ac3parse.c,
++ plugins/mpeg2/ac3parse/ac3parse.h,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.h,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.c,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.h,
++ plugins/mpeg2/parse/mpeg2parse.c, plugins/mpeg2/parse/mpeg2parse.h,
++ plugins/mpeg2/subtitles/mpeg2subt.c,
++ plugins/mpeg2/subtitles/mpeg2subt.h,
++ plugins/mpeg2/video/gstmpeg2play.c,
++ plugins/mpeg2/video/gstmpeg2play.h,
++ plugins/mpeg2/videoparse/mp2videoparse.c,
++ plugins/mpeg2/videoparse/mp2videoparse.h,
++ plugins/mulaw/mulaw-decode.c, plugins/mulaw/mulaw-decode.h,
++ plugins/mulaw/mulaw-encode.c, plugins/mulaw/mulaw-encode.h,
++ plugins/quicktime/gstquicktimedecoder.c,
++ plugins/quicktime/gstquicktimedecoder.h,
++ plugins/rtjpeg/rtjpegdec.c, plugins/rtjpeg/rtjpegdec.h,
++ plugins/rtjpeg/rtjpegenc.c, plugins/rtjpeg/rtjpegenc.h,
++ plugins/rtp/rtpsend/rtpsend.c, plugins/rtp/rtpsend/rtpsend.h,
++ plugins/sdlsink/sdlvideosink.c, plugins/sdlsink/sdlvideosink.h,
++ plugins/vcdsrc/vcdsrc.c, plugins/vcdsrc/vcdsrc.h,
++ plugins/videoscale/videoscale.c, plugins/videoscale/videoscale.h,
++ plugins/visualization/smoothwave/smoothwave.c,
++ plugins/visualization/smoothwave/smoothwave.h,
++ plugins/visualization/spectrum/gstspectrum.c,
++ plugins/visualization/spectrum/gstspectrum.h,
++ plugins/visualization/synaesthesia/synaesthesia.c,
++ plugins/visualization/synaesthesia/synaesthesia.h,
++ plugins/visualization/vumeter/vumeter.c,
++ plugins/visualization/vumeter/vumeter.h,
++ plugins/vorbis/vorbisdec.c, plugins/vorbis/vorbisdec.h,
++ plugins/vorbis/vorbisenc.c, plugins/vorbis/vorbisenc.h,
++ plugins/wav/gstparsewav.c, plugins/wav/gstparsewav.h,
++ plugins/xmms/gstxmms.h, plugins/xmms/gstxmmseffect.c,
++ plugins/xmms/gstxmmseffect.h, plugins/xmms/gstxmmsinput.c,
++ plugins/xmms/gstxmmsinput.h, plugins/xmms/xmms.h,
++ plugins/xvideosink/xvideosink.c, plugins/xvideosink/xvideosink.h:
++ Mega patch updates almost all the plugins to GObject. This was
++ done with a Perl script, with only a few minor manual tweaks where
++ the perl didn't catch the code just right. There may be a few
++ minor issues remaining from this, but they should be easy to catch
++ (plugin doesn't work).
++
++ There are several plugins that have GDK/GTK code in them that
++ shouldn't, these need to be dealt with next.
++
++2001-06-16 00:15 wtay
++
++ * plugins/filters/smooth/: smooth.c, smooth.h: Added caps to the
++ smooth filter.
++
++2001-06-16 00:15 wtay
++
++ * plugins/filters/median/median.c: copy timestamps too.
++
++2001-06-15 23:48 wtay
++
++ * plugins/filters/median/: median.c, median.h: Added an option to
++ only filter the luminance plane.
++
++2001-06-15 23:38 wtay
++
++ * plugins/filters/median/: median.c, median.h: Added caps to the
++ median filter.
++
++2001-06-15 23:03 wtay
++
++ * plugins/videoscale/gstscale_x86_asm.s: file gstscale_x86_asm.s
++ was initially added on branch BRANCH-GOBJECT1.
++
++2001-06-15 23:03 wtay
++
++ * plugins/videoscale/: gstscale_x86.c, gstscale_x86.h,
++ gstscale_x86_asm.s, gstvideoscale.c, gstvideoscale.h, videoscale.h:
++ Just added some files I will need soon.
++
++2001-06-15 23:03 wtay
++
++ * plugins/videoscale/gstscale_x86.h: file gstscale_x86.h was
++ initially added on branch BRANCH-GOBJECT1.
++
++2001-06-15 23:03 wtay
++
++ * plugins/videoscale/gstvideoscale.h: file gstvideoscale.h was
++ initially added on branch BRANCH-GOBJECT1.
++
++2001-06-15 23:03 wtay
++
++ * plugins/videoscale/gstscale_x86.c: file gstscale_x86.c was
++ initially added on branch BRANCH-GOBJECT1.
++
++2001-06-15 23:03 wtay
++
++ * plugins/videoscale/gstvideoscale.c: file gstvideoscale.c was
++ initially added on branch BRANCH-GOBJECT1.
++
++2001-06-15 23:00 wtay
++
++ * libs/Makefile.am: Removed old unused libs.
++
++2001-06-15 22:46 wtay
++
++ * docs/manual/: advanced.sgml, bins.sgml, factories.sgml,
++ helloworld.sgml, helloworld2.sgml, pads.sgml, states.sgml: Small
++ updates to the manual.
++
++2001-06-15 20:49 sbaker3
++
++ * plugins/filters/intfloatconvert/: float2int.c, float2int.h: takes
++ multiple float pads and converts to interleaved int data. Different
++ sized and out-of-order buffer support is in place but not tested.
++
++2001-06-15 20:48 sbaker3
++
++ * plugins/filters/intfloatconvert/: int2float.c, int2float.h: now
++ converts interleaved ints to mono floats in seperate pads. Also
++ now has a _request_new_pad func
++
++2001-06-15 20:46 wtay
++
++ * tools/README: Updated the README file with some cool
++ gstreamer-launch cmd lines by Matthew McClintock
++ <mattsm@mail.utexas.edu>
++
++2001-06-15 20:13 wtay
++
++ * gst/: gstelement.c, gstpad.c, gstparse.c, gstparse.h,
++ gstscheduler.c, elements/gstdisksrc.c: Changed a stupid assert in
++ request_pad. Some fixes for pullregion and EOS conditions. Remove
++ an unneeded check in the scheduler (check for NULL buffer) some EOS
++ fixes for pullregion in disksrc. Removed the macro in the
++ gstparse.h header 'cause it's internal to gstparse.c Added a check
++ in gstparse for NULL element.
++
++2001-06-15 17:42 thomasvs
++
++ * examples/cutter/cutter.c: added some minor stuff
++
++2001-06-15 17:22 wtay
++
++ * plugins/avi/wincodec/gstwindec.cc: A fix for latest CVS avifile.
++
++2001-06-15 16:44 richardb
++
++ * configure.base: Fix mistake with saved CPPFLAGS for sdl test and
++ libdv test: was unsaving the value before saving... :(
++
++2001-06-15 16:42 richardb
++
++ * configure.base: Fix bug #433398, by putting GLIB_CFLAGS
++
++2001-06-15 07:33 sbaker3
++
++ * gst/gstparse.c: should restore dynamic connection of pads
++ (couldn't really test it though)
++
++2001-06-14 22:02 omegahacker
++
++ * plugins/oss/: gstossgst.c, gstossgst.h, gstosssink.c,
++ gstosssink.h, gstosssrc.c, gstosssrc.h: ported to gobject
++
++2001-06-14 22:02 omegahacker
++
++ * gst/: gstpad.c, elements/Makefile.am, elements/gstdisksink.c,
++ elements/gstdisksrc.c, elements/gstfakesrc.c,
++ elements/gstsinesrc.c, elements/gsttee.c: various fixes needed to
++ get to sinesrc ! osssink
++
++2001-06-14 21:39 wtay
++
++ * gst/autoplug/: gstautoplugcache.c, gstautoplugger.c,
++ gststaticautoplug.c, gststaticautoplugrender.c: Fixed some minor
++ compiler warnings.
++
++2001-06-14 21:23 omegahacker
++
++ * configure.base: added gmodule to glib-2.0 stuff
++
++2001-06-14 21:19 omegahacker
++
++ * gst/gstmarshal.h: file gstmarshal.h was initially added on branch
++ BRANCH-GOBJECT1.
++
++2001-06-14 21:19 omegahacker
++
++ * gst/: gstmarshal.c, gstmarshal.h: new files that need to be
++ removed at some point because they are to be autogenerated
++
++2001-06-14 21:19 omegahacker
++
++ * gst/gstmarshal.c: file gstmarshal.c was initially added on branch
++ BRANCH-GOBJECT1.
++
++2001-06-14 19:04 thomasvs
++
++ * examples/cutter/cutter.c: changed cutter example to use a thread
++
++2001-06-14 04:14 omegahacker
++
++ * gst/: Makefile.am, gst.c, gstautoplug.c, gstbin.c, gstelement.c,
++ gstobject.c, gstpad.c, gstparse.c, gsttypefind.c, gstxml.c,
++ autoplug/autoplugtest.c, autoplug/gstautoplugcache.c,
++ autoplug/gstautoplugger.c, autoplug/gststaticautoplug.c,
++ autoplug/gststaticautoplug.h, autoplug/gststaticautoplugrender.c,
++ autoplug/gststaticautoplugrender.h, elements/gstdisksink.c,
++ elements/gstdisksink.h, elements/gstdisksrc.c,
++ elements/gstdisksrc.h, elements/gstelements.c,
++ elements/gstfakesink.c, elements/gstfakesink.h,
++ elements/gstfakesrc.c, elements/gstfakesrc.h, elements/gstfdsink.c,
++ elements/gstfdsink.h, elements/gstfdsrc.c, elements/gstfdsrc.h,
++ elements/gsthttpsrc.c, elements/gsthttpsrc.h,
++ elements/gstidentity.c, elements/gstidentity.h,
++ elements/gstmultidisksrc.c, elements/gstmultidisksrc.h,
++ elements/gstpipefilter.c, elements/gstpipefilter.h,
++ elements/gstsinesrc.c, elements/gstsinesrc.h, elements/gsttee.c,
++ elements/gsttee.h: Bring all the other stuff in gst/ up to match
++ libgst.la's GObject port. Fixed some minor problems with the
++ signalling stuff in the core.
++
++ IT WORKS!
++
++2001-06-13 23:09 thomasvs
++
++ * examples/cutter/cutter.c: cutter now uses afsink to write out
++ wavs we will add a queue next to handle latency problems
++
++2001-06-13 23:03 thomasvs
++
++ * plugins/audiofile/gstafsink.c: afsink now closes and reopens
++ files when you change the location
++
++2001-06-13 22:59 omegahacker
++
++ * configure.base: new configure check for glib 2.0, now requires
++ pkg-config to be installed
++
++2001-06-13 22:52 thomasvs
++
++ * configure.base, examples/Makefile.am: added cutter example
++
++2001-06-13 22:52 omegahacker
++
++ * gst/: gstautoplug.c, gstautoplug.h, gstbin.c, gstbin.h,
++ gstelement.c, gstelement.h, gstelementfactory.c, gstextratypes.c,
++ gstextratypes.h, gstobject.c, gstobject.h, gstpad.c, gstpad.h,
++ gstparse.c, gstpipeline.c, gstpipeline.h, gstqueue.c, gstqueue.h,
++ gstscheduler.c, gstscheduler.h, gstthread.c, gstthread.h,
++ gsttypefind.c, gsttypefind.h, gstutils.c, gstutils.h, gstxml.c,
++ gstxml.h: First round of changes to port to GObject. libgst.la
++ compiles, though there are a few things commented out.
++ Specifically object destruction is probably broken, but wtay gets
++ to fix that because he researched the problem of glib 2.0 object
++ destruction while doing the first round. Some of the XML stuff is
++ commented out, but that's an easy fix.
++
++ Next is the rest of the gst/ directory, then on to the plugins.
++
++2001-06-13 22:45 wtay
++
++ * plugins/quicktime/: gstquicktimedecoder.c, gstquicktimedecoder.h,
++ gstquicktimedemux.c, gstquicktimedemux.h, gstquicktimetypes.c:
++ Fixed the quicktime plugin. things now work with mjpeg.
++
++2001-06-13 22:35 thomasvs
++
++ * plugins/audiofile/gstafsink.c: afsink now handles eos and closes
++ off file
++
++2001-06-13 22:33 wtay
++
++ * gst/gstpad.c: Loop in pullregion until the desired buffer has
++ been pulled.
++
++2001-06-13 22:08 thomasvs
++
++ * plugins/filters/cutter/cutter.c: check for buffer's framedness
++
++2001-06-13 22:08 thomasvs
++
++ * libs/audio/: gstaudio.c, gstaudio.h: added a function to check if
++ the buffer's data is framed
++
++2001-06-13 22:02 wtay
++
++ * plugins/avi/wincodec/: gstwindec.cc, gstwinenc.cc: fixed a small
++ fix in the type init function that makes some C++ compilers
++ complain.
++
++2001-06-13 21:26 thomasvs
++
++ * configure.base: added deinterlace
++
++2001-06-13 18:39 wtay
++
++ * plugins/mp3decode/mad/gstmad.c: Removed the debug output.
++
++2001-06-13 17:20 thomasvs
++
++ * examples/cutter/: Makefile.am, cutter.c, cutter.h: added example
++ program to show how cutter plugin works
++
++2001-06-13 17:16 thomasvs
++
++ * plugins/filters/cutter/cutter.c: some code clean-ups and sensible
++ default values
++
++2001-06-13 17:13 thomasvs
++
++ * plugins/filters/cutter/README: added a better description of the
++ cutter plugin
++
++2001-06-13 17:04 thomasvs
++
++ * plugins/filters/cutter/: cutter.c, cutter.h, filter.func: added
++ threshold level and runlength arguments stopped copying buffer used
++ audio lib functions for some stuff
++
++2001-06-13 16:33 thomasvs
++
++ * libs/audio/: gstaudio.c, gstaudio.h: added helper function to
++ calculate maximum possible sample value based on caps
++
++2001-06-13 10:51 thomasvs
++
++ * docs/random/eos: added two more cases of eos reasoning
++
++2001-06-13 02:18 cael
++
++ * gstplay/: ChangeLog, Makefile.am, callbacks.c, full-screen.c,
++ full-screen.h, gstmediaplay.c, gstmediaplay.glade, gstmediaplay.h,
++ gstplay.c, gstplay.h, main.c: Hmm, added working (if hacked)
++ full-screen play, shuffled things around, added error checking so
++ we don't crash on file not found, added the beginnings of a
++ preferences dialog.
++
++2001-06-12 22:35 wtay
++
++ * plugins/filters/deinterlace/Makefile.am: Removed the leftover
++ filter.func file and README in the makefile.
++
++2001-06-12 22:35 wtay
++
++ * plugins/filters/Makefile.am: Added the deinterlace filter
++
++2001-06-12 22:33 wtay
++
++ * plugins/filters/deinterlace/: .cvsignore, Makefile.am,
++ deinterlace.c, deinterlace.h: Added a deinterlace filter.
++
++2001-06-12 22:27 wtay
++
++ * plugins/filters/colorspace/Makefile.am: Add libHermes too of
++ course..
++
++2001-06-12 21:19 wtay
++
++ * plugins/filters/Makefile.am: Still compile colorspace when Hermes
++ was not found.
++
++2001-06-12 21:19 wtay
++
++ * plugins/filters/colorspace/: Makefile.am, colorspace.c,
++ colorspace.h: ifdef out the Hermes code when the library was not
++ found.
++
++2001-06-12 20:47 wtay
++
++ * libs/riff/gstriffencode.c: Fixed a bug in the avi encoder with
++ wrong alignment.
++
++2001-06-12 20:45 wtay
++
++ * plugins/jpeg/gstjpegdec.c: Don't push a buffer when the pad is
++ not connected.
++
++2001-06-12 20:44 wtay
++
++ * plugins/mpeg1/parse/: mpeg1parse.c, mpeg1parse.h: Added a sync
++ arg to turn off syncing on the timestamps.
++
++2001-06-12 20:42 wtay
++
++ * plugins/avi/: Makefile.am, codectest.c, gstaviencoder.c,
++ gstaviencoder.h, gstavimux.c, gstavimux.h, videoheader.c,
++ wincodec/gstwindec.cc, wincodec/gstwinenc.cc, wincodec/gstwinenc.h:
++ Removed old code. Enhanced the avi decoder. The encoder now sorta
++ works. For big input frames it segfaults though inside a libavifile
++ function. Renamed the aviencoder to avimux.
++
++2001-06-12 15:35 thomasvs
++
++ * plugins/audiofile/: gstafsrc.c, gstafsrc.h: added timestamps to
++ afsrc element
++
++2001-06-12 14:42 thomasvs
++
++ * plugins/mp3decode/mad/gstmad.h: added framestamp
++
++2001-06-12 11:12 thomasvs
++
++ * plugins/mp3decode/mad/gstmad.c: added a different way of
++ generating timestamps; activate by uncommenting #define
++ DEBUG_TIMESTAMP
++
++2001-06-12 11:11 thomasvs
++
++ * libs/audio/: gstaudio.c, gstaudio.h: added some function to
++ support framestamps & timestamps
++
++2001-06-11 23:04 shitowax
++
++ * plugins/quicktime/: Makefile.am, gstquicktimedecoder.c,
++ gstquicktimedecoder.h: Transformation of the quicktime plugin into
++ version 0.2.0 style
++
++2001-06-11 23:02 shitowax
++
++ * plugins/quicktime/: gstquicktimedemux.c, gstquicktimedemux.h,
++ gstquicktimetypes.c, gstquicktimetypes.h: Intitial CVS introduction
++
++2001-06-11 21:19 thomasvs
++
++ * plugins/Makefile.am: fixed AVIFILE dependency check
++
++2001-06-11 20:09 omegahacker
++
++ * gst/gstelement.h: changed indent and argnames to trigger
++ gtk2gobject.sh
++
++2001-06-10 22:13 richardb
++
++ * tools/gstreamer-compprep.1: Some formatting updates, thanks to
++ using manedit
++
++2001-06-10 19:50 theuraeus
++
++ * LICENSE_readme: 2001-10-06 Christian Schaller
++ <Uraeus@linuxrising.org> - Moved a couple of libs from GPL to LGPL
++ since they had been mistakenly branded as GPL.
++
++2001-06-10 12:57 sbaker3
++
++ * gst/gstparse.c: can now take comma delimited list of pads. eg
++ gstreamer-launch disksrc location=~/mp3/gnome.mp3 ! mad ! int2float
++ src%d,src%d\!sink%d,sink%d float2int ! osssink
++
++2001-06-10 02:18 theuraeus
++
++ * gstreamer.spec.in: 2001-10-06 Christian Schaller
++ <Uraeus@linuxrising.org> - Updated the SPEC file as per Erik's
++ wishes - Split out the mpeg stuff - Silenced gstreamer-register
++ when run after each package
++
++2001-06-09 22:48 theuraeus
++
++ * gstreamer.spec.in: 2001-09-06 Christian Schaller
++ <Uraeus@linuxrising.org> - Added gstreamer-register to all plugins
++
++2001-06-09 20:23 theuraeus
++
++ * gstreamer.spec.in: 2001-09-06 Christian Schaller
++ <Uraeus@linuxrising.org> - moved the visualisations plugins out
++
++ TODO: 1. the mpeg plugins need sorting out. currently they are all
++ just placed inside the main package. Need help with this since I am
++ unsure about what files belongs where with what dependency 2.
++ Cross-dependencies probably should be added to the plugins 3.
++ License information should be added to the plugins 4.
++ GStreamer-register needs to be added for each plugin
++
++2001-06-09 19:50 theuraeus
++
++ * gstreamer.spec.in: 2001-09-06 Christian Schaller
++ <Uraeus@linuxrising.org> - Finally the SPEC file works again, now
++ only polishing it remains
++
++2001-06-09 17:44 theuraeus
++
++ * gstreamer.spec.in: 2001-09-06 Christian Schaller
++ <Uraeus@linuxrising.org> - More SPEC fixes, not perfect yet, but
++ maybe it actually works now
++
++2001-06-09 12:43 sbaker3
++
++ * gst/: gstparse.c, gstparse.h: store src and sink pads in slists
++ to get ready for the src1,src2\!sink1,sink2 syntax
++
++2001-06-09 11:16 sbaker3
++
++ * gst/gstparse.c: if a named pad doesn't exist, try creating a new
++ pad using the padtemplate name. eg int2float src%d!sink%d float2int
++
++2001-06-09 03:33 theuraeus
++
++ * gstreamer.spec.in: 2001-09-06 Christian Schaller
++ <Uraeus@linuxrising.org> - More fixes to the SPEC file, still not
++ verfied that it works, but I need sleep and it is guaranteed closer
++ to working than the current one. More testing and SPEC file hacking
++ tommorow(aka later today).
++
++2001-06-09 01:16 wtay
++
++ * plugins/avi/wincodec/: Makefile.am, gstwincodec.c,
++ gstwincodec.cc, gstwindec.c, gstwindec.cc, gstwindec.h,
++ gstwinenc.c, gstwinenc.cc: The windows decoder now uses the dll
++ loader from avifile, significantly simplyfying the codec.
++
++2001-06-09 01:14 wtay
++
++ * REQUIREMENTS, configure.base: Added a check for avifile.
++
++2001-06-08 23:17 theuraeus
++
++ * gstreamer.spec.in: 2001-08-06 Christian Schaller
++ <Uraeus@linuxrising.org> - Added ALSA plugin (commented out since I
++ don't have alsa installed)
++
++2001-06-08 22:56 theuraeus
++
++ * REQUIREMENTS, gstreamer.spec.in: 2001-08-06 Christian Schaller
++ <Uraeus@linuxrising.org> - Updated GStreamer SPEC which sorts out
++ plugins into separate plugins, needs more work to support all
++ plugins.
++
++2001-06-07 22:45 ajmitch
++
++ * plugins/esd/esdsink/Makefile.am: Added README to EXTRA_DIST
++
++2001-06-07 22:43 wtay
++
++ * plugins/avi/Makefile.am: Added README to dist
++
++2001-06-07 22:02 ajmitch
++
++ * plugins/esd/esdsink/README: Added README for esdsink. Someone
++ please give it some TLC before 0.2.0 release :)
++
++2001-06-07 19:31 wtay
++
++ * plugins/avi/: README, wincodec/gstwindec.c: Added a README file
++ about the innner working of the avi decoder.
++
++2001-06-07 17:56 dlehn
++
++ * debian/changelog, debian/gstreamer-tools.manpages,
++ gst/autoplug/.cvsignore: Added manpage Ignore built autoplugtest
++ binary Bump debian version to 0.2.0
++
++2001-06-07 11:58 richardb
++
++ * tools/: Makefile.am, gstreamer-complete.1, gstreamer-compprep.1,
++ gstreamer-register.1: Add gstreamer-compprep man page.
++
++2001-06-07 09:18 ajmitch
++
++ * AUTHORS: Credited 'ALSA plugins' to Thomas Nydberg in AUTHORS
++
++2001-06-07 07:38 dlehn
++
++ * debian/gstreamer-common.files: latest plugins updates
++
++2001-06-07 07:06 cael
++
++ * gstplay/: ChangeLog, gstmediaplay.glade: dissabled full-screen
++ for the time being till i have time to fix it.
++
++2001-06-07 01:08 omegahacker
++
++ * tools/: gstreamer-inspect.1, gstreamer-launch.1,
++ gstreamer-register.1: added --gst-mask to the man pages
++
++2001-06-06 20:31 wtay
++
++ * plugins/avi/Makefile.am: Added the REAME_win32dll to extra dist
++
++2001-06-06 20:23 dlehn
++
++ * debian/: Makefile.am, changelog, control, gstreamer-artsd.files,
++ gstreamer-audiofile.files, gstreamer-common.files,
++ gstreamer-gnomevfs.files, gstreamer-gsm.files,
++ gstreamer-jpeg.files, gstreamer-oss.files, gstreamer-sdl.files,
++ gstreamer-tools.files, gstreamer-tools.manpages, libgst-dev.files,
++ rules: Added new plugin packages and synced up to a late pre2 CVS
++ base.
++
++2001-06-06 20:21 dlehn
++
++ * .cvsignore: Added configure.{ac,in} to .cvsignore since they are
++ autogenerated from configure.base now.
++
++2001-06-06 20:20 dlehn
++
++ * docs/gst/Makefile.am: Added .o and .lo to clean-local target
++
++2001-06-06 20:15 wtay
++
++ * gst/gstelement.c: Removed a warning.
++
++2001-06-06 20:12 wtay
++
++ * plugins/filters/lav/Makefile.am: Removed the README file from
++ extra dist.
++
++2001-06-06 20:07 wtay
++
++ * plugins/filters/Makefile.am: Added the lavencoder
++
++2001-06-06 19:33 wtay
++
++ * docs/: gst/tmpl/gstreamer-unused.sgml, random/NOTES-0.2.0: Some
++ minor docs updates.
++
++2001-06-06 19:31 wtay
++
++ * configure.base: Added the lav encoder Makefile.am
++
++2001-06-06 19:29 wtay
++
++ * gst/: cothreads.c, gstparse.c: Changed the maxcothreads to 16.
++ connect to the new_ghost_pad signal in parse.
++
++2001-06-06 17:21 wtay
++
++ * plugins/gsm/gstgsmdec.c: Small fix to initialize a counter.
++
++2001-06-06 17:20 wtay
++
++ * plugins/avi/: gstavidecoder.c, gstavitypes.c: Fixes for different
++ PCM audio formats.
++
++2001-06-06 17:09 wtay
++
++ * plugins/avi/: gstavidecoder.c, gstavitypes.c: More fixes for
++ audio. Only send buffers if the pad is connected.
++
++2001-06-06 17:08 wtay
++
++ * plugins/jpeg/gstjpegdec.c: Some fixes for various jpeg formats.
++
++2001-06-06 15:24 thomasvs
++
++ * configure.base, plugins/filters/Makefile.am: added cutter plugin
++ to config stuff
++
++2001-06-06 15:21 thomasvs
++
++ * plugins/filters/cutter/: Makefile.am, README, cutter.c, cutter.h,
++ filter.func: cutter plugin; emits signals when audio RMS level
++ falls below or rises above threshold value for a given consecutive
++ run of buffers
++
++2001-06-06 15:14 thomasvs
++
++ * configure.base, libs/Makefile.am: added Makefile generation for
++ gstaudio library
++
++2001-06-06 15:13 thomasvs
++
++ * libs/audio/: Makefile.am, gstaudio.c, gstaudio.h: first try at a
++ general gstreamer audio library with helper functions
++
++2001-06-06 13:47 richardb
++
++ * docs/manual/quotes.sgml: Add an important quote from Omega.
++
++2001-06-06 00:39 theuraeus
++
++ * plugins/avi/README_win32dll: 2001-06-06 Christian Schaller
++ <Uraeus@linuxrising.org> * Add small textfile with some information
++ on win32 dll situation
++
++2001-06-05 20:44 sbaker3
++
++ * plugins/filters/ladspa/: gstladspa.c, gstladspa.h: mono _get and
++ _chain should now work.Many other changes including: all immutable
++ info is in the class struct, activate/deactivate should work, and a
++ bunch of other stuff
++
++2001-06-05 18:45 wtay
++
++ * tools/gstreamer-inspect.c: Somewhat improve the layout of args in
++ inspect.
++
++2001-06-05 18:26 sbaker3
++
++ * plugins/filters/intfloatconvert/: float2int.c, float2int.h,
++ int2float.c, int2float.h: use proxying for caps
++
++2001-06-05 02:27 richardb
++
++ * gst/: Makefile.am, gstelementfactory.c: Revert accidentally
++ applied changes. Time for bed.
++
++2001-06-05 02:26 richardb
++
++ * gst/: Makefile.am, gstelementfactory.c, gstplugin.c: FIx memleak
++ in save-thyself introduced by changing plugin_get_list to copy.
++
++2001-06-05 02:15 richardb
++
++ * gst/gstplugin.c: Simple fix to stop gstreamer-compprep crashing
++ when the registry is in use.
++
++2001-06-04 22:52 wtay
++
++ * plugins/xvideosink/: xvideosink.c, xvideosink.h: Added an option
++ to disable Xv images. It's not pretty but it works.
++
++2001-06-04 22:02 wtay
++
++ * tools/gstreamer-launch.c: Fixed the xid stuff and some cleanups.
++
++2001-06-04 21:16 wtay
++
++ * plugins/mp3encode/lame/gstlame.c: Set the src caps to audio/mp3
++
++2001-06-04 20:20 wtay
++
++ * plugins/mp3encode/lame/gstlame.c: Removed the MPG_MD* defines
++ bacause they seem to be undefined with some versions of lame.
++
++2001-06-04 20:00 wtay
++
++ * plugins/oss/README: Added a little info about the ossgst hack.
++
++2001-06-04 19:59 wtay
++
++ * plugins/oss/gstosssrc.c: Some osssrc fixes
++
++2001-06-04 17:55 wtay
++
++ * plugins/mp3encode/lame/gstlame.c: Small updates.
++
++2001-06-04 17:33 wtay
++
++ * plugins/vorbis/vorbisenc.c: Fixed a bug for mono input.
++
++2001-06-04 17:02 wtay
++
++ * gst/cothreads.c: Use the STACKSIZE and number of cothreads to
++ calculate the cothread stack space (easier to change the number of
++ cothreads).
++
++2001-06-04 16:59 thomasvs
++
++ * plugins/oss/gstosssrc.c: set default format to 44100/16/stereo
++
++2001-06-04 16:38 thomasvs
++
++ * gst/gstparse.c: added an eos handler so that gstreamer-launch
++ quits when the first element fires it
++
++2001-06-04 15:52 wtay
++
++ * plugins/mpeg1/mpegaudio/gstmpegaudio.c: Fixes to do proper caps
++ negotiation.
++
++2001-06-04 15:50 wtay
++
++ * tools/gstreamer-inspect.c: Print out the default values.
++
++2001-06-04 14:51 sbaker3
++
++ * plugins/alsa/: alsasink.c, alsasrc.c: removed MAKE_ARG macro (it
++ didn't seem to work)\nAttempted to make the element name consist
++ only of alphanumeric and _ (eg ESS_AudioDrive_ES1688_0_0_src)
++
++2001-06-04 12:25 richardb
++
++ * docs/gst/Makefile.am: Nasty hack enabling docs/gst/ to build with
++ unpatched versions of gtkdoc-scanobj which don't understand
++ libtool.
++
++2001-06-04 02:26 wtay
++
++ * plugins/xmms/: gstxmmseffect.c, gstxmmseffect.h: Added capsnego
++ to the xmms effects.
++
++2001-06-04 01:51 richardb
++
++ * gst/gst.c: Replace NO_X conditional compilation with testing
++ whether DISPLAY env variable is set, and doing gtk_type_init()
++ instead of gtk_init() if not.
++
++2001-06-04 01:38 richardb
++
++ * autogen.sh: Don't ever run if we know automake isn't patched:
++ people keep complaining that their machine crashed while trying to
++ build...
++
++2001-06-04 00:40 wtay
++
++ * plugins/xmms/gstxmmsinput.c: Added capsnego to the xmms input
++ plugin.
++
++2001-06-03 23:30 wtay
++
++ * tools/README: More info about the other tools.
++
++2001-06-03 20:49 richardb
++
++ * tools/: Makefile.am, gstreamer-complete.1, gstreamer-launch.1:
++ Add man page for gstreamer-complete
++
++2001-06-03 20:26 wtay
++
++ * docs/gst/tmpl/gstreamer-unused.sgml: Docs updates
++
++2001-06-03 20:24 wtay
++
++ * plugins/flx/flx_decoder.c: More cleanups
++
++2001-06-03 20:20 wtay
++
++ * plugins/flx/flx_decoder.c: Small cleanups
++
++2001-06-03 20:19 wtay
++
++ * gst/gst.c: optionally call gtk_type_init() instead of gtk_init()
++ if NO_X is defined. This avoids the X dependency of GStreamer.
++
++2001-06-03 20:14 wtay
++
++ * plugins/au/: gstparseau.c, gstparseau.h: Cleanups to the au
++ parser.
++
++2001-06-03 20:13 wtay
++
++ * plugins/mp3decode/mad/gstmad.c: Small caps updates.
++
++2001-06-03 20:11 wtay
++
++ * plugins/xvideosink/: gstxwindow.c, xvideosink.c: Don't fail when
++ an X-connection could not be made.
++
++2001-06-03 20:09 wtay
++
++ * docs/random/NOTES-0.2.0: small changes
++
++2001-06-03 20:06 wtay
++
++ * Makefile.am: Removed the components dir from since it doesn't
++ work/build anyway.
++
++2001-06-03 16:30 wtay
++
++ * docs/random/NOTES-0.2.0: More small updates.:
++
++2001-06-03 16:29 wtay
++
++ * docs/random/NOTES-0.2.0: Added first desciption of the changes
++ for 0.2.0
++
++2001-06-03 13:08 wtay
++
++ * gstplay/gstplay.c: Find the seeking properties in GstBin objects
++ too.
++
++2001-06-03 13:06 wtay
++
++ * plugins/avi/: gstavidecoder.c, gstavitypes.c,
++ wincodec/gstwindec.c: Added the seeking args to the avi decoder.
++ Set the buffer flush flag in windec.
++
++2001-06-03 12:28 wtay
++
++ * plugins/cdparanoia/cdparanoia.c: Set the pad caps in _init time.
++
++2001-06-03 12:28 wtay
++
++ * gst/gstpad.c: Set the caps on a proxied pad when the pad is not
++ connected.
++
++2001-06-03 12:20 richardb
++
++ * plugins/arts/Makefile.am: Add dependency so that gst_artsio.cc
++ gets generated in time, and change rule to generate it into a
++ suffix rule. Register suffix so that automake can set _OBJECTS
++ appropriately.
++
++2001-06-03 02:45 wtay
++
++ * plugins/avi/: gstavidecoder.c, gstavidemux.c, gstavitypes.c:
++ Added support for mjpeg and PCM audio.
++
++2001-06-03 02:00 wtay
++
++ * plugins/jpeg/: gstjpeg.c, gstjpegenc.c: Removed the caps that are
++ not used.
++
++2001-06-03 00:36 richardb
++
++ * configure.base, plugins/arts/Makefile.am: Fix arts check, with
++ artsc-config hackery.
++
++2001-06-02 22:57 wtay
++
++ * plugins/cdparanoia/: cdparanoia.c, cdparanoia.h: Applied the
++ patch from Apoc: ?? _ Add properties cur_sector read only ( get
++ current sector ) ?? _ Add properties last_track read only ( last
++ track of the cd ) ?? _ Add properties cur_track read only ( get the
++ current track ) ?? _ Properties end_track writeable ( last track to
++ rip/play )
++
++2001-06-02 22:52 wtay
++
++ * plugins/cdparanoia/cdparanoia.c: Set the caps of the srcpad right
++ before sending a buffer instead of in the _init function.
++
++2001-06-02 19:26 omegahacker
++
++ * tools/gstreamer-launch.c: added check to make sure there's a
++ pipeline desc before building
++
++2001-06-02 19:11 wtay
++
++ * configure.base: Added the avi makefiles.
++
++2001-06-02 19:08 wtay
++
++ * plugins/avi/: Makefile.am, gstavidecoder.c, gstavidecoder.h,
++ gstavidemux.c, gstavidemux.h, gstavitypes.c, gstavitypes.h,
++ winaudio/Makefile.am, winaudio/aviaudiodecoder.c,
++ winaudio/aviaudiodecoder.h: More rework on the avi decoder. The
++ avi decoder is now a bin that manages the avidemuxer and the
++ codecs. It uses the autoplugger and avitypes to convert avi types
++ into mime/types and select gstreamer codecs to create an element.
++
++2001-06-02 19:06 richardb
++
++ * autogen.sh: Clarify the messages about the patched automake one
++ more time. If it's not clear now, and people continue to complain
++ about automake eating their resources, I'm mysteriously unable to
++ hear them.
++
++2001-06-02 17:38 wtay
++
++ * examples/helloworld/helloworld.c: Fixed the helloworld example by
++ using a pipeline as the toplevel element.
++
++2001-06-02 16:33 ajmitch
++
++ * configure.base: Let's just say I have a better understanding of
++ autoconf now (I should really have read the manual first). It helps
++ to remember that yes != no ;)
++
++2001-06-02 14:42 ajmitch
++
++ * configure.base: Automake is picky about white space...
++
++2001-06-02 14:38 ajmitch
++
++ * Makefile.am, configure.base: Added options --disable-tests and
++ --disable-examples for quicker builds for the impatient...
++
++2001-06-02 13:45 wtay
++
++ * gst/gstpad.c: Copy the padtemplate to the ghostpad.
++
++2001-06-02 13:21 richardb
++
++ * configure.base, plugins/gsm/Makefile.am, plugins/gsm/gstgsmdec.h,
++ plugins/gsm/gstgsmenc.h: Fix gsm to check for "gsm.h" as well as
++ "gsm/gsm.h".
++
++2001-06-02 11:42 richardb
++
++ * plugins/sdlsink/Makefile.am: Fix a typoe in sdlsink Makefile.am
++
++2001-06-02 11:40 theuraeus
++
++ * gstreamer.spec.in: 2001-02-06 Christian Schaller
++ <Uraeus@linuxrising.org> * Doh, forgot to update the Changelog
++ inside the SPEC file
++
++2001-06-02 11:38 theuraeus
++
++ * gstreamer.spec.in: 2001-02-06 Christian Schaller
++ <Uraeus@linuxrising.org> * Small fix to group statement for
++ GStreamer
++
++ My work on the SPEC file making the RPM make one package for all
++ non-core plugins is underway, but I am not ready with it yet.
++
++2001-06-02 03:21 richardb
++
++ * configure.base: Oops: fixed SDL header check: put flags in
++ CPPFLAGS rather than CFLAGS. We should really filter the
++ SDL_CFLAGS and only pass appropriate options through, but this
++ works well enough for now.
++
++2001-06-02 03:05 richardb
++
++ * configure.base: Improve SDL check: use correct CFLAGS when
++ searching for header.
++
++2001-06-01 23:56 wtay
++
++ * plugins/avi/: Makefile.am, gstavidecoder.c, gstavidecoder.h,
++ playcodecs.c, wincodec/gstwincodec.c, wincodec/gstwindec.c,
++ wincodec/gstwindec.h: Reworked the avi decoder. it works again now
++ (but no sound yet).
++
++2001-06-01 23:36 thomasvs
++
++ * tests/reconnect.c: ok, this works now
++
++2001-06-01 23:23 thomasvs
++
++ * tests/: Makefile.am, reconnect.c: test for disconnect and
++ reconnect of elements
++
++2001-06-01 22:26 theuraeus
++
++ * gstreamer.spec.in: 2001-01-06 Christian Schaller
++ <Uraeus@linuxrising.org> - First batch of upgrades to the SPEC
++ file, this one from Dennis Bjorklund. Thanks Dennis.
++
++2001-06-01 19:52 wtay
++
++ * configure.base: Added a better SDL_createYUVOverlay check.
++
++2001-06-01 19:30 wtay
++
++ * gst/: gstbin.c, gstpad.c, gstqueue.c, gstscheduler.c,
++ autoplug/autoplugtest.c, autoplug/gststaticautoplugrender.c: Fixed
++ some warnings.
++
++2001-06-01 19:24 wtay
++
++ * tests/: Makefile.am, autoplug.c, capsconnect.c, incsched.c,
++ load.c, loadall.c, mp1vid.c, mp3encode.c, paranoia.c, reaping.c,
++ registry.c, threadlock.c, nego/nego1.c, sched/runxml.c: Fixed a
++ couple of compiler warnings.
++
++2001-06-01 19:09 wtay
++
++ * test/: ac3parse.c, ac3play.c, buffer.c, cobin.c, dvdcat.c,
++ dvshow.c, fake.c, mem.c, mp1tomp1.c, mp2tomp1.c, mp3mad.c,
++ mp3play.c, record.c, teardown.c, vidcapture.c, vidcapture2.c,
++ video2mp1.c: Fixed some compile warnings.
++
++2001-06-01 18:55 hadess
++
++ * REQUIREMENTS: - added url to openquicktime
++
++2001-06-01 18:42 hadess
++
++ * REQUIREMENTS: - added some more urls
++
++2001-06-01 18:42 wtay
++
++ * gstplay/gstplay.c: Print out a warning when the colorspace plugin
++ is not found and try to do without it...
++
++2001-06-01 18:32 theuraeus
++
++ * LICENSE_readme, REQUIREMENTS: 2001-01-06 Christian Schaller
++ <Uraeus@linuxrising.org> * A few URL additions to the REQUIREMENTS
++ file * LICENCE readme containing licensing details on our plugins
++
++2001-06-01 17:57 wtay
++
++ * README, REQUIREMENTS: Slightly changed the README, we are not
++ really tied to GNOME. Added more optional libs to REQUIREMENTS.
++ someone should complete the URLS.
++
++2001-06-01 17:46 wtay
++
++ * plugins/effects/volume/volume.c: Removed the soundcard.h include
++ line.
++
++2001-06-01 16:29 thomasvs
++
++ * gst/elements/gstdisksink.c: coded small bit in to allow changing
++ of output location
++
++2001-06-01 14:27 richardb
++
++ * tools/README: Add a note about gstreamer-complete
++
++2001-06-01 14:03 richardb
++
++ * configure.base: More tidyup to SDL check.
++
++2001-06-01 13:36 richardb
++
++ * configure.base: Fix SDL check Check for Overlay stuff, which
++ isn't in SDL version 1.0
++
++2001-05-31 23:57 hadess
++
++ * REQUIREMENTS: - added urls to the required libs, with a lot of
++ added libs
++
++2001-05-31 21:20 richardb
++
++ * REQUIREMENTS, configure.base: Add comments to many (but not all
++ :( ) AC_DEFINES in configure scripts. Add note about debian
++ packages for building documentation.
++
++2001-05-31 21:14 richardb
++
++ * plugins/esd/esdsink/Makefile.am: Add a CFLAGS line: just luck
++ that it's not been needed so far.
++
++2001-05-31 21:13 richardb
++
++ * plugins/artsd/Makefile.am: Remove a redundant line, and add a
++ comment about one which will become redundant in future.
++
++2001-05-31 20:52 wtay
++
++ * testsuite/refcounting/Makefile.am: Removed the thread test so
++ make distcheck works.
++
++2001-05-31 20:18 wtay
++
++ * testsuite/refcounting/Makefile.am: Added the mem.h file in
++ noinst_HEADERS.
++
++2001-05-31 20:16 richardb
++
++ * plugins/arts/Makefile.am: Remove generated files from the dist.
++
++2001-05-31 20:08 richardb
++
++ * configure.base, idiottest.mak: Fix a couple of formatting errors
++ in idiottest, and add plugin-srcdir warning to configure.base.
++
++2001-05-31 19:42 wtay
++
++ * plugins/avi/Makefile.am: Fixed the codectest.
++
++2001-05-31 19:35 richardb
++
++ * Makefile.am, idiottest.mak, include/Makefile.am: Abstract the
++ plugin-srcdir installation idiottest into a separate file, and
++ include it from the include Makefile.am, to ensure that it gets
++ called at the start of a make install process, not after the whole
++ thing has happened.
++
++2001-05-31 19:31 wtay
++
++ * include/Makefile.am: Added gstaudio.h to noinst_HEADERS.
++
++2001-05-31 19:03 richardb
++
++ * docs/gst/Makefile.am: Add rules to ensure that the libgst.la and
++ libgstelements.la exist when trying to link the scanner with them.
++ Fix mkdirs so that they don't fall over if directories already
++ exist.
++
++2001-05-31 18:32 richardb
++
++ * plugins/arts/Makefile.am: Put gst_artsio.idl in
++ libgst_arts_la_SOURCES instead of gst_artsio.cc (which is generated
++ from it). This ensures that the original source is present, and
++ also allows make dist to work on machines which don't have mcopidl
++ and the arts idl stuff installed.
++
++ It is possible that gst_artsio.cc should be put in EXTRA_DIST, but
++ I argue against it since as far as I can tell it can be generated
++ on any system which has arts installed (mcopidl is in the libarts
++ package on debian), and putting it in EXTRA_DIST requires that
++ mcopidl is present in order to run make dist.
++
++2001-05-31 15:19 richardb
++
++ * configure.base: Add AS and ASFLAGS to configure.base, fixing the
++ build with automake 1.4g AS is defined in a hacky way: I've asked
++ on the automake list for help doing this properly.
++
++2001-05-31 10:53 thomasvs
++
++ * plugins/oss/gstosssrc.c: some small cleanups before maybe doing
++ some real work on this
++
++2001-05-30 23:06 thomasvs
++
++ * plugins/oss/gstosssrc.c: The weird thing only happens on one of
++ my sound cards.
++
++2001-05-30 22:35 thomasvs
++
++ * include/gstaudio.h: header file for standard audio stuff for
++ plugins
++
++2001-05-30 22:27 omegahacker
++
++ * configure.base: added no-alsa warning and made 0.9 check
++ conditional on alsa existing at all
++
++2001-05-30 22:15 wtay
++
++ * plugins/wav/gstparsewav.c: Major cleanups so that it actually
++ works.
++
++2001-05-30 22:14 wtay
++
++ * gst/gstprops.c: Fixed a bug so that gst_props_new (NULL) == NULL
++
++2001-05-30 21:54 omegahacker
++
++ * plugins/sdlsink/sdlvideosink.c: added SDL_INIT_NOPARACHUTE flag
++ to SDL_Init, to disable one of the most annoying features IMO of
++ SDL
++
++2001-05-30 21:36 omegahacker
++
++ * gst/gstpad.c: stupid mistake, I put != instead of == in the
++ g_return_if's
++
++2001-05-30 21:13 omegahacker
++
++ * gst/gstpad.c: added sanity checks to make sure _push and _pull
++ don't get called on pads of the wrong direction
++
++2001-05-30 20:07 sbaker3
++
++ * plugins/filters/ladspa/: gstladspa.c, gstladspa.h: beginnings of
++ inplace mono chain func
++
++2001-05-30 17:37 thomasvs
++
++ * plugins/oss/gstosssrc.c: switched some lines around
++
++2001-05-30 17:10 thomasvs
++
++ * plugins/oss/gstosssrc.c: added caps to osssrc found a weird
++ thing, don't know yet what to do about it
++
++2001-05-30 16:16 richardb
++
++ * README, autogen.sh: Automatically generate a patched automake if
++ needed, and put instructions in the README about how to use such a
++ patched automake.
++
++2001-05-30 15:39 richardb
++
++ * Makefile.am: Add configure.base and autogen.sh to distributions.
++ Add rules to keep configure.in and configure.ac up-to-date.
++
++2001-05-30 15:22 richardb
++
++ * autogen.sh, configure.ac, configure.base, configure.in: * create
++ a configure.base file, containing the contents of
++ configure.{in,ac}, with those lines specific to one file
++ prepended by
++ "SUBSTFOR configure.in:" or "SUBSTFOR configure.ac:"
++ appropriately.
++
++ * Add lines to autogen.sh to generate configure.in and
++ configure.ac
++ automatically from this file. (Very simple sed scripts)
++
++ * Remove configure.in and configure.ac
++
++ This shouldn't cause any problems to anyone, and should make it
++ easy to do work on configure scripts by just working on
++ configure.base.
++
++2001-05-30 14:54 thomasvs
++
++ * plugins/filters/passthrough/passthrough.c: added signed support
++ implemented include/gstaudio.h use
++
++2001-05-30 14:25 richardb
++
++ * configure.ac, configure.in: More small changes to bring the two
++ scripts closer together. Turned off building docs by default in
++ configure.ac. Only diffs are now essential due to changes from
++ autoconf 2.13 to 2.50.
++
++2001-05-30 13:56 richardb
++
++ * autogen.sh: Deal more gracefully with being either unable to
++ check that automake is patched (will now just give a small
++ warning), or finding that automake definitely isn't patched (will
++ give a big loud warning recommend stopping the build and sleep
++ briefly to give the user a chance to read the message). Will
++ eventually try to do the build anyway though.
++
++ Also, don't abort if autoconf or automake return error codes: they
++ both seem able to do so even when having produced viable results.
++
++2001-05-29 23:10 wtay
++
++ * plugins/filters/colorspace/: Makefile.am, colorspace.c,
++ colorspace.h, yuv2rgb.c, yuv2rgb.h: Added more colorspace functions
++ for YUV->RGB
++
++2001-05-29 17:40 richardb
++
++ * autogen.sh: Add checks for appropriate versions of automake. Add
++ check that automake has been patched if it is a version which
++ requires a patch. Please check that this doesn't cause problems:
++ it's a bit of a hairy test, so I might well have mucked it up and
++ broken some people's build systems. Hope not, though. ;-)
++
++2001-05-29 17:39 hadess
++
++ * plugins/gnomevfs/gnomevfssrc.c: - fix for when size can't be
++ acquired (fixes icecast streaming)
++
++2001-05-29 17:38 richardb
++
++ * Makefile.am, configure.ac, configure.in: Add idiot test to stop
++ the installing of versions with plugin srcdir enabled.
++
++2001-05-29 16:19 richardb
++
++ * configure.ac, configure.in: Fix differences between configure.in
++ and configure.ac which were trivial or due merely to formatting
++ differences. diff can now be used to see only the significant
++ differences, which should be helpful in keeping these two files in
++ sync.
++
++2001-05-29 13:43 richardb
++
++ * gst/Makefile.am.future: Update Makefile.am.future - a replacement
++ for Makefile.am which uses features present in recent versions of
++ automake (>1.4d) to avoid horrendous hackery.
++
++2001-05-29 13:31 richardb
++
++ * acinclude.m4, configure.ac, configure.in: Simplify alsa checking:
++ we can use the standard AM_PATH_ALSA macro to check that we don't
++ have alsa 0.9.x: we just need to specify something for
++ ACTION_NOT_FOUND to override the default AC_MSG_ERROR behaviour, so
++ I've put a colon for ACTION_NOT_FOUND. ;-) Also, update the alsa
++ macro in acinclude with the latest from the alsa project CVS.
++
++2001-05-28 23:23 omegahacker
++
++ * gst/gstsparc.h: fixed #define line continuation in gstsparc.h
++
++2001-05-28 23:02 wtay
++
++ * configure.ac, configure.in: Added a check for gsm/gsm.h
++
++2001-05-28 22:41 omegahacker
++
++ * gst/gstinfo.c: changed debug so it always prints pid and cid in
++ color
++
++2001-05-28 22:02 wtay
++
++ * configure.ac: Removed the -pre0
++
++2001-05-28 22:00 wtay
++
++ * plugins/Makefile.am: Added gsm to subds.
++
++2001-05-28 21:47 wtay
++
++ * configure.ac: Added the refcounting to the output targets.
++
++2001-05-28 21:36 wtay
++
++ * acconfig.h, configure.ac, configure.in: Added a check for libgsm
++
++2001-05-28 21:22 wtay
++
++ * configure.ac: Updated to match configure.in
++
++2001-05-28 21:05 wtay
++
++ * configure.ac: The configure file for autoconf 2.50
++
++2001-05-28 20:59 omegahacker
++
++ * ABOUT-NLS: added blank file to keep autoconf happy, fill it in
++ later
++
++2001-05-28 20:34 omegahacker
++
++ * plugins/avi/Makefile.am: changed srcdir to builddir for .la
++
++2001-05-28 20:33 omegahacker
++
++ * configure.in: attempt at a fixed alsa check to guarantee 0.5.x
++
++2001-05-28 20:09 omegahacker
++
++ * libs/getbits/Makefile.am, libs/idct/Makefile.am,
++ plugins/xvideosink/Makefile.am: distcheck cleanups
++
++2001-05-28 08:46 omegahacker
++
++ * configure.in, gstreamer-uninstalled.pc.in, gstreamer.pc.in,
++ gst/Makefile.am: some fixes to handle builddirs, which distcheck
++ uses, along with complete .pc files
++
++2001-05-28 01:07 hadess
++
++ * plugins/gnomevfs/gnomevfssrc.c: - cleanups
++
++2001-05-28 00:57 omegahacker
++
++ * gst/gstpad.c, gst/gstthread.c, gst/elements/gstidentity.c,
++ plugins/xvideosink/xvideosink.c, tools/gstreamer-inspect.c: Added
++ some caps != NULL checks. Patched up a problem with the thread
++ handling when the iteration fails. Cleaned up the output of
++ -inspect a tiny bit.
++
++2001-05-28 00:52 omegahacker
++
++ * configure.in: removed a spare alsa check, and made sure it fails
++ for alsa 0.9.x
++
++2001-05-28 00:12 wtay
++
++ * examples/mixer/Makefile.am: Added the headers
++
++2001-05-28 00:01 wtay
++
++ * plugins/arts/Makefile.am: Add more hardcoded paths for includes.
++
++2001-05-27 23:55 wtay
++
++ * tests/nego/nego1.c: Updated for new API calls.
++
++2001-05-27 23:45 wtay
++
++ * plugins/sdlsink/Makefile.am: Added the header file.
++
++2001-05-27 23:26 wtay
++
++ * configure.in.ac250: Added refcounting to the targets.
++
++2001-05-27 23:25 wtay
++
++ * testsuite/: Makefile.am, capsnego/Makefile.am,
++ refcounting/Makefile.am: Makfeile updates.
++
++2001-05-27 22:56 omegahacker
++
++ * Makefile.am, acconfig.h, configure.in, gst/autoplug/Makefile.am,
++ plugins/1394/Makefile.am, plugins/aasink/Makefile.am,
++ plugins/alaw/Makefile.am, plugins/filters/level/Makefile.am,
++ plugins/filters/passthrough/Makefile.am,
++ plugins/filters/volenv/Makefile.am, plugins/mulaw/Makefile.am,
++ plugins/oss/Makefile.am, plugins/xvideosink/Makefile.am,
++ tests/Makefile.am, testsuite/Makefile.am: various build fixes
++
++2001-05-27 21:52 wtay
++
++ * plugins/Makefile.am: Only build the quiktime plugin if the
++ openquicktime library was found.
++
++2001-05-27 21:52 wtay
++
++ * configure.in, configure.in.ac250: Added a check for
++ openquicktime.
++
++2001-05-27 18:02 sbaker3
++
++ * tools/gstreamer-complete.c: now builds for those who are too lazy
++ to upgrade their xml libraries
++
++2001-05-27 16:13 hadess
++
++ * plugins/gnomevfs/gnomevfssrc.c: - added eos-hack signal to the
++ source, and fix the seek segfaults
++
++2001-05-27 15:41 hadess
++
++ * gstplay/gstmediaplay.glade: - changed the Alt shortcuts to Ctrl
++ shortcuts (like in all proper GTK+ apps)
++
++2001-05-27 15:38 wtay
++
++ * tests/: mp3encode.c, rip.c: Updated for remove methods.
++
++2001-05-27 15:38 wtay
++
++ * test/mp2toavi.c, test/mp2tomp1.c, test/mpeg2parse.c,
++ examples/autoplug/autoplug.c, examples/queue/queue.c: Updated for
++ removed methods.
++
++2001-05-27 15:37 wtay
++
++ * gst/: cothreads.c, cothreads.h, gstbin.c, gstbin.h, gstinfo.c,
++ gstobject.c, gstpad.c, gstplugin.c, gstscheduler.h: Docs updates
++ Changed the cothread to use sigjmp_buf removed some unused methods.
++ Some code cleanups.
++
++2001-05-27 15:33 wtay
++
++ * docs/gst/: gstreamer-docs.sgml, gstreamer-sections.txt,
++ tmpl/cothreads.sgml, tmpl/gstbin.sgml, tmpl/gstelement.sgml,
++ tmpl/gstfakesink.sgml, tmpl/gstfakesrc.sgml, tmpl/gstinfo.sgml,
++ tmpl/gstobject.sgml, tmpl/gstpad.sgml, tmpl/gstplugin.sgml,
++ tmpl/gstqueue.sgml, tmpl/gstreamer-unused.sgml,
++ tmpl/gstscheduler.sgml, tmpl/gsttrace.sgml: API docs updates.
++
++2001-05-27 01:04 omegahacker
++
++ * gst/gstscheduler.h: fixed up and turned back on
++ GST_SCHEDULE_SAFETY
++
++2001-05-26 23:58 omegahacker
++
++ * gst/: cothreads.c, gstelement.c, gstscheduler.c: fixed cothread
++ locking and set_arg/get_arg safety, and switched to 64 cothreads of
++ 32KB
++
++2001-05-26 20:47 hadess
++
++ * plugins/gnomevfs/gnomevfssrc.c: - gnome-vfs seek works, cleaned
++ up
++
++2001-05-26 19:46 hadess
++
++ * plugins/gnomevfs/gnomevfssrc.c: - really use mmap this time for
++ local files, first try at seek in remote files
++
++2001-05-26 18:17 hadess
++
++ * plugins/gnomevfs/gnomevfssrc.c: - added local file fallback with
++ mmap support
++
++2001-05-26 17:41 wtay
++
++ * gst/gstelement.h: Removed redundant prototypes.
++
++2001-05-26 17:33 wtay
++
++ * gst/gstpad.h: Fixed a bug in the typecast macros for
++ padtemplates.
++
++2001-05-26 13:17 wtay
++
++ * gst/elements/Makefile.am: don't link against libgst.la because it
++ seems to fail on some libtool versions.
++
++2001-05-26 06:36 omegahacker
++
++ * tests/threadlock.c: shut up fakesrc and fakesink, changed
++ sleeping a little
++
++2001-05-26 06:26 omegahacker
++
++ * tests/threadlock.c: moved debug to before _init so cmdline can
++ override, and put sleep(1)'s in while(1) to increase chance of
++ contention (I think)
++
++2001-05-26 06:19 omegahacker
++
++ * tests/threadlock.c: updated threadlock to actually be a thread
++ locking test
++
++2001-05-26 00:36 dlehn
++
++ * test/lat.c: Elements must have different names.
++
++2001-05-25 23:08 hadess
++
++ * gstplay/.cvsignore: - more generic files to exclude: *~ and ~.bak
++
++2001-05-25 23:02 hadess
++
++ * gstplay/.cvsignore: - added gstmediaplay.glade.bak to the files
++ to ignore
++
++2001-05-25 23:01 hadess
++
++ * gstplay/gstmediaplay.glade: - updated (c) date, and added WMClass
++ and WMName to the gstmediaplay windows
++
++2001-05-25 22:42 wtay
++
++ * gst/gstplugin.c: Removed a stupid printf.
++
++2001-05-25 22:39 wtay
++
++ * gst/: gstbuffer.h, gstelement.c, gstpipeline.c, gstplugin.c: Some
++ cleanups. Removed some bogus code from element and pipeline
++ elements. Fixed a typo.
++
++2001-05-25 22:38 wtay
++
++ * gst/elements/Makefile.am: Added GST_LIBS to LIBADD.
++
++2001-05-25 22:35 omegahacker
++
++ * gst/gstbuffer.c: fixed rather heinous bug in gst_buffer_copy
++
++2001-05-25 22:31 omegahacker
++
++ * gst/autoplug/gstautoplugcache.c: removed some more noise,
++ converted to GST_DEBUG
++
++2001-05-25 22:25 omegahacker
++
++ * gst/gstelement.c: removed annoying debug message during state
++ change (made GST_DEBUG)
++
++2001-05-25 22:13 hadess
++
++ * autogen.sh: - added a line for busy application developers, it's
++ shorter this time
++
++2001-05-25 22:00 omegahacker
++
++ * .cvsignore, AUTHORS, Makefile.am, autogen.sh, configure.in,
++ gstreamer-uninstalled.pc.in, gstreamer.pc.in, gstreamer.spec.in,
++ docs/gst/tmpl/cothreads.sgml, docs/gst/tmpl/gstelement.sgml,
++ docs/gst/tmpl/gstfakesrc.sgml, docs/gst/tmpl/gstthread.sgml,
++ docs/random/matth/scheduling.txt, examples/Makefile.am,
++ examples/autoplug/autoplug.c, examples/mixer/mixer.c,
++ gst/Makefile.am, gst/cothreads.c, gst/cothreads.h, gst/gst.c,
++ gst/gst.h, gst/gstbin.c, gst/gstbin.h, gst/gstbuffer.c,
++ gst/gstcaps.c, gst/gstclock.c, gst/gstelement.c, gst/gstelement.h,
++ gst/gstelementfactory.c, gst/gstinfo.c, gst/gstinfo.h,
++ gst/gstobject.c, gst/gstobject.h, gst/gstpad.c, gst/gstpad.h,
++ gst/gstpipeline.c, gst/gstprops.c, gst/gstqueue.c, gst/gstqueue.h,
++ gst/gstscheduler.c, gst/gstscheduler.h, gst/gstthread.c,
++ gst/gstthread.h, gst/gsttype.c, gst/gsttypefind.c, gst/gsttypes.h,
++ gst/gstxml.c, gst/autoplug/Makefile.am,
++ gst/autoplug/autoplugtest.c, gst/autoplug/gstautoplugcache.c,
++ gst/autoplug/gstautoplugger.c, gst/autoplug/gststaticautoplug.c,
++ gst/autoplug/gststaticautoplugrender.c, gst/elements/gstfakesrc.c,
++ gst/elements/gstfakesrc.h, gst/elements/gstsinesrc.c,
++ gstplay/Makefile.am, gstplay/gstmediaplay.c,
++ gstplay/gstmediaplay.glade, gstplay/gstplay.c, gstplay/gstplay.h,
++ gstplay/gstplayprivate.h, libs/idct/gstidct.c,
++ plugins/1394/dv1394src.c, plugins/alaw/alaw-conversion.c,
++ plugins/arts/Makefile.am, plugins/arts/gst_arts.c,
++ plugins/esd/esdsink/esdsink.c, plugins/filters/Makefile.am,
++ plugins/filters/adder/adder.c,
++ plugins/filters/colorspace/colorspace.c,
++ plugins/filters/ladspa/gstladspa.c,
++ plugins/filters/stereo2mono/stereo2mono.c,
++ plugins/gnomevfs/gnomevfssrc.c, plugins/mp3decode/mad/gstmad.c,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3decode/types/mp3types.c,
++ plugins/mp3encode/lame/gstlame.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/video.c, plugins/mpeg1/mpegaudio/common.c,
++ plugins/mpeg1/mpegaudio/musicin.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c, plugins/oss/gstosssink.c,
++ plugins/videoscale/videoscale.c, plugins/vorbis/vorbis.c,
++ plugins/vorbis/vorbisdec.c, plugins/xmms/gstxmmsinput.c,
++ test/.cvsignore, test/Makefile.am, test/avi2mpg.c, test/cobin.c,
++ test/dvshow.c, test/fake.c, test/mpeg2parse2.c, test/mpeg2parse3.c,
++ test/mpeg2parse4.c, test/video2mp1.c, test/videotest2.c,
++ tests/Makefile.am, tests/incsched.c, tests/mp1vid.c,
++ tests/reaping.c, tests/states.c, tests/threadlock.c,
++ testsuite/refcounting/Makefile.am, testsuite/refcounting/bin.c,
++ testsuite/refcounting/element.c,
++ testsuite/refcounting/element_pad.c, testsuite/refcounting/mem.c,
++ testsuite/refcounting/mem.h, testsuite/refcounting/object.c,
++ testsuite/refcounting/pad.c, testsuite/refcounting/thread.c,
++ tools/.cvsignore, tools/Makefile.am, tools/gstreamer-complete.c,
++ tools/gstreamer-compprep.c, tools/gstreamer-inspect.c: Merged from
++ INCSCHED on 200505251!!!
++
++2001-05-25 21:50 omegahacker
++
++ * autogen.sh, configure.in.ac250, docs/manual/autoplugging.sgml,
++ gst/elements/gstfakesink.h, gst/elements/gstfakesrc.h,
++ plugins/audiofile/Makefile.am, plugins/audiofile/README,
++ plugins/audiofile/gstafsink.c, plugins/audiofile/gstafsink.h,
++ plugins/audiofile/gstafsrc.c, plugins/audiofile/gstafsrc.h,
++ plugins/filters/level/level.c,
++ plugins/filters/passthrough/filter.func,
++ plugins/filters/passthrough/passthrough.c,
++ plugins/filters/passthrough/passthrough.h,
++ plugins/gnomevfs/gnomevfssrc.c, plugins/gsm/Makefile.am,
++ plugins/gsm/gstgsm.c, plugins/gsm/gstgsmdec.c,
++ plugins/gsm/gstgsmdec.h, plugins/gsm/gstgsmenc.c,
++ plugins/gsm/gstgsmenc.h, plugins/oss/gstossgst.c,
++ plugins/wav/gstparsewav.c, test/dv2mp1.c, test/dvshow.c: Merged
++ from HEAD into INCSCHED on 200105251
++
++2001-05-25 21:41 wtay
++
++ * docs/manual/autoplugging.sgml: More docs updates.
++
++2001-05-25 21:41 wtay
++
++ * test/: dv2mp1.c, dvshow.c: some minor fixes..
++
++2001-05-25 21:39 wtay
++
++ * plugins/gnomevfs/gnomevfssrc.c: Fix a leak on EOS.
++
++2001-05-25 20:53 wtay
++
++ * test/Makefile.am: Cleaned up the makefile a bit.
++
++2001-05-25 20:36 wtay
++
++ * test/: cobin.c, fake.c: Remove deprecated methods.
++
++2001-05-25 20:19 wtay
++
++ * gst/: gstbin.c, gstbin.h, gstpad.c: Removed some unused functions
++ in gstbin Fixed a compiler warning.
++
++2001-05-25 20:16 omegahacker
++
++ * gst/gstthread.c: forgot to unset SPINNING, no idea how it worked
++ before, maybe this will fix wtay's case
++
++2001-05-25 19:07 wtay
++
++ * plugins/filters/ladspa/gstladspa.c: Adjusted for state
++ reorderings.
++
++2001-05-25 18:35 omegahacker
++
++ * gst/gstbin.c, gst/gstelement.c, gst/gstelement.h, gst/gstinfo.c,
++ gst/gstqueue.c, gst/gstscheduler.c, gst/gstthread.c,
++ plugins/1394/dv1394src.c, plugins/arts/gst_arts.c,
++ plugins/esd/esdsink/esdsink.c, plugins/gnomevfs/gnomevfssrc.c,
++ plugins/mp3decode/types/mp3types.c, plugins/oss/gstosssink.c,
++ plugins/xmms/gstxmmsinput.c: Swapped PAUSED and PLAYING states,
++ reworked thread interlocking. States are now: NULL <-> READY <->
++ PAUSED <-> PLAYING.
++
++ Had do update dv1394src, gst_arts, and xmmsinput, please test these
++ out!
++
++ Cleaned up DEBUG output in several places to by much much less
++ verbose but still just as useful (denser).
++
++2001-05-25 17:21 thomasvs
++
++ * plugins/filters/passthrough/: filter.func, passthrough.c,
++ passthrough.h: Cleaned out level code from passthrough plugin added
++ silent argument, defaults to false
++
++2001-05-25 17:19 thomasvs
++
++ * plugins/audiofile/gstafsink.c: cleaned up output info
++
++2001-05-25 17:17 thomasvs
++
++ * plugins/filters/level/level.c: cleaned up level plugin output
++
++2001-05-25 15:02 thomasvs
++
++ * plugins/audiofile/: gstafsink.c, gstafsrc.c: cleaned up output
++ got rate and signedness to work on afsrc
++
++2001-05-25 14:42 thomasvs
++
++ * plugins/audiofile/README: a little info
++
++2001-05-25 11:43 wtay
++
++ * test/: avi2mpg.c, dvshow.c, fake.c, videotest2.c: Small fixes to
++ various test apps.
++
++2001-05-25 11:43 wtay
++
++ * gstplay/gstplay.c: If the arg looks like a URI, gnomevfs is used,
++ if gnomevfs is not found and the URI starts with file:/, disksrc is
++ used.
++
++2001-05-25 11:10 thomasvs
++
++ * plugins/filters/passthrough/passthrough.c: changed passthrough to
++ print out signed/unsigned and endianness
++
++2001-05-25 10:47 thomasvs
++
++ * plugins/audiofile/: Makefile.am, gstafsrc.c, gstafsrc.h: Added an
++ audiofile src element, doesn't work yet
++
++2001-05-25 05:42 dlehn
++
++ * configure.in.ac250: automake 1.4-p1 doesn't support
++ AC_CONFIG_FILES. revert to AC_OUTPUT until the fix in the just
++ released 1.4-p2 gets debianized. ;)
++
++2001-05-25 02:28 hadess
++
++ * plugins/gnomevfs/gnomevfssrc.c: - check result of open() now
++
++2001-05-25 01:35 wtay
++
++ * plugins/mpeg2/mpeg2dec/gstmpeg2dec.c: Only accept mpeg1 data for
++ mpeg2dec until we figure out what's wrong.
++
++2001-05-25 01:29 omegahacker
++
++ * gst/: gstpad.c, gstqueue.c, gstqueue.h, gstscheduler.h,
++ gstthread.c: fixed some interruptability problems with thread and
++ queue
++
++2001-05-25 01:14 wtay
++
++ * plugins/vorbis/: vorbis.c, vorbisdec.c: Added the
++ COTHREAD_STOPPING hack.
++
++2001-05-25 01:09 wtay
++
++ * gstplay/: gstmediaplay.c, gstplay.c, gstplayprivate.h: Fixed the
++ media player so that it works with incsched. Removed the thread
++ and add the _iterate to the g_idle_loop, this makes the GUI very
++ cluncky but is needed because we cannot chance the state of a
++ thread inside the threads context yet.
++
++2001-05-24 23:38 thomasvs
++
++ * plugins/audiofile/gstafsink.c: mental note to self: doublecheck
++ own code before sending mail to library author asking why sample
++ rate setting on output doesn't work... note to others: afsink now
++ handles samplerate right
++
++2001-05-24 23:24 thomasvs
++
++ * plugins/audiofile/: gstafsink.c, gstafsink.h: added more support
++ for endianness, you can set it through an arg until I figure out
++ what it is supposed to do
++
++2001-05-24 23:23 thomasvs
++
++ * plugins/oss/gstossgst.c: one of my OSS's doesn't have FMT_AC3
++ defined
++
++2001-05-24 22:46 omegahacker
++
++ * gst/: gstinfo.h, gstthread.c, gstthread.h: added better thread id
++ debugging support
++
++2001-05-24 21:36 omegahacker
++
++ * gst/gstthread.c: fixed thread lock mis-merge
++
++2001-05-24 21:20 wtay
++
++ * gst/autoplug/gststaticautoplugrender.c: Added the queue to the
++ thread
++
++2001-05-24 12:24 wtay
++
++ * configure.in.ac250: Added the autoconf file for version 2.50
++
++2001-05-24 12:22 wtay
++
++ * plugins/: gnomevfs/gnomevfssrc.c, gsm/Makefile.am, gsm/gstgsm.c,
++ gsm/gstgsmdec.c, gsm/gstgsmdec.h, gsm/gstgsmenc.c, gsm/gstgsmenc.h,
++ wav/gstparsewav.c: Small fixes for EOS in gnomevfssrc. Added a gsm
++ decoder/encoder element.
++
++2001-05-24 01:55 thomasvs
++
++ * plugins/audiofile/: gstafsink.c, gstafsink.h: audiofile now
++ handles endianness right, and also allows for choosing the output
++ file format to write (next/aiff/wav/aiffc/raw) aiff and next might
++ not work yet though
++
++2001-05-24 01:46 omegahacker
++
++ * AUTHORS, README, REQUIREMENTS, acconfig.h, autogen.sh,
++ configure.in, components/bonobo-media/Makefile.am,
++ components/bonobo-media/bonobo-media-gstreamer-factory.c,
++ components/bonobo-media/bonobo-media-gstreamer.gob,
++ components/bonobo-media/bonobo-media-gstreamer.oafinfo,
++ components/bonobo-media/bonobo-media-gstreamervideo.gob,
++ debian/Makefile.am, debian/changelog, debian/control,
++ debian/gstreamer-aa.files, debian/gstreamer-arts.files,
++ debian/gstreamer-colorspace.files, debian/gstreamer-common.files,
++ debian/gstreamer-mad.files, debian/rules,
++ docs/fwg/gst-plugin-writers-guide.sgml,
++ docs/gst/gstreamer-sections.txt, docs/gst/gstreamer.hierarchy,
++ docs/gst/tmpl/gstbuffer.sgml, docs/gst/tmpl/gstcaps.sgml,
++ docs/gst/tmpl/gstinfo.sgml, docs/gst/tmpl/gstpad.sgml,
++ docs/gst/tmpl/gstprops.sgml, docs/gst/tmpl/gstreamer-unused.sgml,
++ docs/manual/Makefile.am, docs/manual/autoplugging.sgml,
++ docs/manual/bins.sgml, docs/manual/buffers.sgml,
++ docs/manual/elements.sgml, docs/manual/gstreamer-manual.sgml,
++ docs/manual/helloworld.sgml, docs/manual/pads.sgml,
++ docs/manual/xml.sgml, docs/random/autoplug2,
++ editor/gsteditorproperty.c, examples/autoplug/autoplug.c,
++ examples/plugins/example.c, gst/cothreads.c, gst/cothreads.h,
++ gst/gst.h, gst/gstbin.c, gst/gstcaps.c, gst/gstcaps.h,
++ gst/gstinfo.h, gst/gstpad.c, gst/gstpad.h, gst/gstparse.c,
++ gst/gstpipeline.c, gst/gstplugin.c, gst/gstprops.c, gst/gstprops.h,
++ gst/gstscheduler.c, gst/gstthread.c, gst/gsttrace.c,
++ gst/gsttrace.h, gst/gsttypefind.c, gst/gstutils.c,
++ gst/autoplug/Makefile.am, gst/elements/gstdisksrc.c,
++ gst/elements/gstelements.c, gst/elements/gstfakesink.c,
++ gst/elements/gstfakesrc.c, gst/elements/gstfakesrc.h,
++ gst/elements/gstpipefilter.c, gst/elements/gstsinesrc.c,
++ gst/elements/gstsinesrc.h, gstplay/AUTHORS, gstplay/ChangeLog,
++ gstplay/Makefile.am, gstplay/callbacks.c, gstplay/callbacks.h,
++ gstplay/full-screen.c, gstplay/full-screen.h,
++ gstplay/gstmediaplay.c, gstplay/gstmediaplay.glade,
++ gstplay/gstmediaplay.h, gstplay/gstplay.c, gstplay/gstplay.h,
++ gstplay/gstplayprivate.h, gstplay/gststatusarea.c,
++ gstplay/gststatusarea.h, gstplay/main.c, libs/idct/ieeetest.c,
++ plugins/Makefile.am, plugins/alsa/alsa.h,
++ plugins/alsa/alsa_common.c, plugins/alsa/alsasink.c,
++ plugins/alsa/alsasrc.c, plugins/arts/gst_artsio_impl.h,
++ plugins/audiofile/Makefile.am, plugins/audiofile/gstafsink.c,
++ plugins/audiofile/gstafsink.h, plugins/capture/v4l/gstv4lsrc.c,
++ plugins/capture/v4l/gstv4lsrc.h, plugins/cdparanoia/cdparanoia.c,
++ plugins/dv/dvdec.c, plugins/effects/volume/volume.c,
++ plugins/esd/esdsink/esdsink.c, plugins/filters/Makefile.am,
++ plugins/filters/filterstamp.sh, plugins/filters/adder/Makefile.am,
++ plugins/filters/adder/adder.c,
++ plugins/filters/colorspace/Makefile.am,
++ plugins/filters/colorspace/colorspace.c,
++ plugins/filters/colorspace/colorspace.h,
++ plugins/filters/colorspace/yuv2yuv.c,
++ plugins/filters/intfloatconvert/Makefile.am,
++ plugins/filters/intfloatconvert/float2int.c,
++ plugins/filters/intfloatconvert/float2int.h,
++ plugins/filters/intfloatconvert/int2float.c,
++ plugins/filters/intfloatconvert/int2float.h,
++ plugins/filters/intfloatconvert/intfloatconvert.c,
++ plugins/filters/intfloatconvert/intfloatconvert.h,
++ plugins/filters/ladspa/gstladspa.c,
++ plugins/filters/ladspa/ladspa.h, plugins/filters/lav/.cvsignore,
++ plugins/filters/lav/Makefile.am, plugins/filters/lav/lavencode.c,
++ plugins/filters/lav/lavencode.h, plugins/filters/level/Makefile.am,
++ plugins/filters/level/README, plugins/filters/level/filter.func,
++ plugins/filters/level/level.c, plugins/filters/level/level.h,
++ plugins/filters/mono2stereo/Makefile.am,
++ plugins/filters/mono2stereo/mono2stereo.c,
++ plugins/filters/mono2stereo/mono2stereo.h,
++ plugins/filters/passthrough/README,
++ plugins/filters/passthrough/filter.func,
++ plugins/filters/passthrough/level.c,
++ plugins/filters/passthrough/level.h,
++ plugins/filters/passthrough/passthrough.c,
++ plugins/filters/passthrough/passthrough.h,
++ plugins/filters/stereo2mono/Makefile.am,
++ plugins/filters/volenv/Makefile.am,
++ plugins/filters/volenv/volenv.c, plugins/gnomevfs/Makefile.am,
++ plugins/gnomevfs/gnomevfssink.c, plugins/gnomevfs/gnomevfssrc.c,
++ plugins/jpeg/Makefile.am, plugins/mp3decode/mad/gstmad.c,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3encode/lame/gstlame.c, plugins/mpeg1/mpegaudio/common.c,
++ plugins/mpeg1/mpegaudio/common.h, plugins/mpeg1/mpegaudio/encode.c,
++ plugins/mpeg1/mpegaudio/encoder.h,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.c,
++ plugins/mpeg1/mpegaudio/musicin.c,
++ plugins/mpeg1/mpegaudio/musicin.h, plugins/mpeg1/mpegaudio/psy.c,
++ plugins/mpeg1/mpegaudio/subs.c,
++ plugins/mpeg1/mpegaudio/table_absthr.h,
++ plugins/mpeg1/mpegaudio/table_cb.h,
++ plugins/mpeg1/mpegaudio/table_enwindow.h,
++ plugins/mpeg1/mpegaudio/table_th.h,
++ plugins/mpeg1/mpegaudio/tables.c, plugins/mpeg1/mpegaudio/tonal.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c, plugins/oss/Makefile.am,
++ plugins/oss/gstossaudio.c, plugins/oss/gstossgst.c,
++ plugins/oss/gstossgst.h, plugins/oss/gstosshelper.c,
++ plugins/oss/gstosshelper.h, plugins/oss/gstosssink.c,
++ plugins/quicktime/Makefile.am, plugins/quicktime/README,
++ plugins/quicktime/gstquicktimedecoder.c,
++ plugins/quicktime/gstquicktimedecoder.h,
++ plugins/sdlsink/Makefile.am, plugins/sdlsink/sdlvideosink.c,
++ plugins/sdlsink/sdlvideosink.h, plugins/videoscale/videoscale.c,
++ plugins/vorbis/vorbis.c, plugins/vorbis/vorbisdec.c,
++ plugins/vorbis/vorbisenc.c, plugins/vorbis/vorbisenc.h,
++ plugins/wav/gstparsewav.c, plugins/xvideosink/gstximage.c,
++ test/.cvsignore, test/Makefile.am, test/lat.c, test/mp3mad.c,
++ test/videotest.c, test/wave.c, tests/autoplug2.c,
++ tests/sched/runxml.c, tools/gstreamer-inspect.c,
++ tools/gstreamer-launch.c: Merge from HEAD into INCSCHED1 at
++ 200105231.
++
++2001-05-24 00:24 dlehn
++
++ * gst/elements/: gstfakesink.h, gstfakesrc.h: Update some signal
++ func vars.
++
++2001-05-24 00:23 dlehn
++
++ * autogen.sh: libtool check fix... copy & paste error msgs code
++ could be improved.
++
++2001-05-23 21:35 wtay
++
++ * test/video2mp1.c: Some small modifications.
++
++2001-05-23 20:53 omegahacker
++
++ * plugins/oss/gstosssink.c: default settings are intenionally very
++ wrong (make it obvious when the capsnego didn't work) and it checks
++ for NULL props
++
++2001-05-23 20:52 omegahacker
++
++ * plugins/filters/stereo2mono/stereo2mono.c: 'fixed' the caps and
++ the _init function
++
++2001-05-23 20:50 omegahacker
++
++ * plugins/cdparanoia/cdparanoia.c: fixed caps on cdparanoia
++
++2001-05-23 20:49 omegahacker
++
++ * gst/gstscheduler.c, plugins/mp3decode/mad/gstmad.c: fixed problem
++ where mad wasn't an entry (it is now HACK HACK!!) and the scheduler
++ wasn't catching the no entry case
++
++2001-05-23 20:48 omegahacker
++
++ * examples/autoplug/autoplug.c: added have_size handler so the
++ window matches the video size
++
++2001-05-23 20:09 omegahacker
++
++ * gst/: gstqueue.c, gstqueue.h: reworked internal parameters a bit,
++ added leaky-queue semantics
++
++2001-05-23 10:18 thomasvs
++
++ * plugins/filters/level/README: some more info on how to plot the
++ level using gnuplot it would be nice if the output from level
++ plugin could serve as input to a gstreamer plotting plugin (I'm not
++ kidding)
++
++2001-05-23 09:49 thomasvs
++
++ * plugins/audiofile/: gstafsink.c, gstafsink.h: afsink now handles
++ channels and sample rate
++
++2001-05-23 09:48 thomasvs
++
++ * configure.in: added level Makefile deleted one of two instances
++ of adder Makefile
++
++2001-05-23 09:47 thomasvs
++
++ * plugins/filters/Makefile.am: added level plugin to Makefile.am
++
++2001-05-23 09:47 thomasvs
++
++ * plugins/filters/level/: Makefile.am, README, filter.func,
++ level.c, level.h: Added level detection plugin; prints out RMS
++ values calculated over buffer size to stdout
++
++2001-05-22 21:11 omegahacker
++
++ * tests/states.c: fixed references to _gst_print_statename
++
++2001-05-22 20:22 hadess
++
++ * gst/elements/gstdisksrc.c: - it is now possible to change the
++ opened file when state is PAUSED
++
++2001-05-22 19:57 hadess
++
++ * plugins/gnomevfs/gnomevfssrc.c: - removed warnings
++
++2001-05-22 19:44 hadess
++
++ * plugins/gnomevfs/gnomevfssrc.c: - adding possibility to change
++ the src file if the state is PAUSED
++
++2001-05-22 17:48 thomasvs
++
++ * plugins/audiofile/: gstafsink.c, gstafsink.h: still trying to add
++ caps to gstafsink
++
++2001-05-22 14:48 richardb
++
++ * autogen.sh: autogen.sh now fails if aclocal fails.
++
++2001-05-22 13:56 hadess
++
++ * autogen.sh: - added a line to autogen.sh for the busy application
++ developers
++
++2001-05-22 02:42 omegahacker
++
++ * gst/: gstpad.c, autoplug/gstautoplugger.c: Added ability for
++ caps_nego_failed signal to indicate that it's solved the problem,
++ via a gboolean * argument that's FALSE, and can be set to TRUE if
++ the handler has fixed things up.
++
++ Updated the autoplugger so it now works in both the unknown and
++ known cases with and without other issues like a crippled
++ (mono-only) osssink.
++
++2001-05-22 00:23 omegahacker
++
++ * gst/: gstbin.c, gstelement.c, gstelement.h, gstinfo.c, gstpad.c,
++ gstthread.c: Updates to DEBUG system: moved statename into
++ gstelement.c, colorized the states:
++
++ NULL: white READY: read PAUSED: yellow PLAYING: green
++
++2001-05-21 22:35 omegahacker
++
++ * gst/autoplug/gstautoplugger.c: fixed up pausing system, and added
++ src_caps_nego_failed body
++
++2001-05-21 21:17 wtay
++
++ * acconfig.h, configure.in: Updates to the audiofile detection
++ stuff.
++
++2001-05-21 21:17 wtay
++
++ * plugins/audiofile/Makefile.am: Some minor changes to the makefile
++
++2001-05-21 20:48 thomasvs
++
++ * plugins/audiofile/: Makefile.am, gstafsink.c, gstafsink.h: first
++ pass at an audiofile sink this sink uses the SGI audiofile library
++ to write audio files
++
++2001-05-21 20:42 thomasvs
++
++ * plugins/Makefile.am: trying to add a check for libaudiofile
++
++2001-05-21 20:40 thomasvs
++
++ * configure.in: trying to add a check for libaudiofile (->
++ plugins/audiofile/afsink)
++
++2001-05-21 03:41 omegahacker
++
++ * gst/autoplug/: gstautoplugcache.c, gstautoplugger.c:
++ gstautoplugcache.c: Set default for cache's caps_proxy to FALSE
++ again. gstautoplugger.c: Fixed with strategic positioning of
++ gst_pad_set_caps()
++
++2001-05-21 03:40 omegahacker
++
++ * gst/: gstcaps.c, gstpad.c, gstprops.c: Updated some debug
++ statements. Added specific debug for int props.
++
++2001-05-21 03:35 hadess
++
++ * test/mp3mad.c: - removed the parse factory, it's unused
++
++2001-05-21 02:37 cael
++
++ * gstplay/: ChangeLog, gstmediaplay.glade: Added a ChangeLog as per
++ hadess' sugesstion, and added myself as an author.
++
++2001-05-21 02:19 cael
++
++ * gstplay/: Makefile.am, callbacks.c, callbacks.h, full-screen.c,
++ full-screen.h, gstmediaplay.c, gstmediaplay.glade, gstmediaplay.h,
++ gstplay.c, gstplay.h, gstplayprivate.h, gststatusarea.c,
++ gststatusarea.h, main.c: added the begninnings of full-screen
++ support (crashes atm), playing at double size, general code cleanup
++ and what not.
++
++2001-05-20 22:24 wtay
++
++ * tools/gstreamer-inspect.c: Fixed a problem with -inspect where
++ some args would not show up correctly
++
++2001-05-20 22:24 thomasvs
++
++ * plugins/filters/adder/adder.c: fixed caps stuff
++
++2001-05-20 21:12 wtay
++
++ * tools/gstreamer-inspect.c: Better output of element flags.
++
++2001-05-20 21:06 wtay
++
++ * tools/gstreamer-launch.c: Escape spaces in the cmdline args with
++ "\\ " so that parse can handle it.
++
++2001-05-20 21:05 wtay
++
++ * gst/gstparse.c: Added the possibility to escape chars in
++ gstparse. You can now give it a cmdline like disksrc location=some\
++ sort\ of.mp3 ! .... and it does the right thing.
++
++2001-05-20 19:59 wtay
++
++ * plugins/quicktime/: Makefile.am, gstquicktimedecoder.c,
++ gstquicktimedecoder.h: Updated the plugin to the current CVS.
++
++2001-05-20 19:24 wtay
++
++ * plugins/quicktime/: Makefile.am, README, gstquicktimedecoder.c,
++ gstquicktimedecoder.h: Added a quicktime decoder by yann@3ivx.com.
++
++2001-05-20 19:17 thomasvs
++
++ * plugins/filters/passthrough/passthrough.c: changed pad templates
++
++2001-05-20 19:05 thomasvs
++
++ * plugins/filters/passthrough/: passthrough.c, passthrough.h:
++ updating passthrough to handle caps
++
++2001-05-20 19:01 thomasvs
++
++ * plugins/filters/volenv/volenv.c: updating caps handling
++
++2001-05-20 16:45 thomasvs
++
++ * plugins/filters/passthrough/passthrough.c: trying to add caps
++ detection to passthrough
++
++2001-05-20 15:55 thomasvs
++
++ * gst/gstparse.c: reinstated exit(-1) when gstparse.c doesn't find
++ the plugin mentioned
++
++2001-05-20 15:16 thomasvs
++
++ * plugins/wav/gstparsewav.c: parsewav now does src pad setting of
++ width, depth, channels, frequency
++
++2001-05-20 15:12 wtay
++
++ * gst/elements/gstpipefilter.c: Made pipefilter a DECOUPLED
++ element.
++
++2001-05-20 15:03 thomasvs
++
++ * plugins/wav/gstparsewav.c: parsewav sets channel capability now
++
++2001-05-20 14:56 thomasvs
++
++ * plugins/wav/gstparsewav.c: First try at updating parsewav and
++ setting caps on src pad
++
++2001-05-20 11:31 wtay
++
++ * components/bonobo-media/: Makefile.am,
++ bonobo-media-gstreamer-factory.c, bonobo-media-gstreamer.gob,
++ bonobo-media-gstreamer.oafinfo, bonobo-media-gstreamervideo.gob:
++ Added the code for the bonobo media component. It doesn't really
++ work yet because bonobo-media doesn't show video.
++
++2001-05-20 06:48 cael
++
++ * gstplay/AUTHORS: finally managed to get the AUTHORS file added.
++ big things are coming allright ;-)
++
++2001-05-20 01:16 hadess
++
++ * AUTHORS: - added myself to the AUTHORS file
++
++2001-05-19 19:17 wtay
++
++ * plugins/: oss/gstosssink.c, vorbis/vorbis.c, vorbis/vorbisdec.c,
++ vorbis/vorbisenc.c, vorbis/vorbisenc.h, xvideosink/gstximage.c:
++ More updates to caps in vorbisenc. it now correctly sets up the
++ encoder based on the input audio type.
++
++2001-05-19 15:16 wtay
++
++ * plugins/: mp3decode/mad/gstmad.c, mpeg1/mpegaudio/common.c,
++ mpeg1/mpegaudio/common.h, mpeg1/mpegaudio/encode.c,
++ mpeg1/mpegaudio/encoder.h, mpeg1/mpegaudio/gstmpegaudio.c,
++ mpeg1/mpegaudio/musicin.c, mpeg1/mpegaudio/musicin.h,
++ mpeg1/mpegaudio/psy.c, mpeg1/mpegaudio/subs.c,
++ mpeg1/mpegaudio/table_absthr.h, mpeg1/mpegaudio/table_cb.h,
++ mpeg1/mpegaudio/table_enwindow.h, mpeg1/mpegaudio/table_th.h,
++ mpeg1/mpegaudio/tables.c, mpeg1/mpegaudio/tonal.c: More mp3
++ updates. Make mpegaudio use a sane namespace for all exported
++ symbols. the mad element can now play mpeg audio comming is as
++ frames.
++
++2001-05-19 07:39 omegahacker
++
++ * .cvsignore, Makefile.am, configure.in,
++ gstreamer-uninstalled.pc.in: Added gstreamer-uninstalled.pc.in in
++ prep for future changes to pkg-config. Disabled docs building by
++ default (--enable-docs-build to turn it on). Added more visible
++ warning messages for lacking libraries, listing the plugins that
++ won't build (not complete!).
++
++2001-05-19 07:39 omegahacker
++
++ * gstreamer-uninstalled.pc.in: file gstreamer-uninstalled.pc.in was
++ initially added on branch BRANCH-INCSCHED1.
++
++2001-05-19 01:33 wtay
++
++ * plugins/: mp3decode/mad/gstmad.c, mp3decode/mpg123/gstmpg123.c,
++ mp3decode/parse/mp3parse.c, mp3encode/lame/gstlame.c,
++ mpeg1/mpegaudio/common.h, mpeg1/mpegaudio/encoder.h,
++ mpeg1/mpegaudio/gstmpegaudio.c, mpeg1/mpegaudio/musicin.c,
++ mpeg1/mpegaudio/musicin.h, mpeg1/mpegaudio/psy.c, oss/gstosssink.c:
++ Updates to various mp3 related plugins. Added args and capsnego to
++ mpegaudio.
++
++2001-05-18 19:11 wtay
++
++ * plugins/esd/esdsink/esdsink.c: Added newcaps functions to esdsink
++ to sync with the provided caps.
++
++2001-05-18 18:58 wtay
++
++ * plugins/cdparanoia/cdparanoia.c: Updated to the new caps.
++
++2001-05-17 23:00 omegahacker
++
++ * gst/autoplug/gstautoplugger.c: update to latest code, includes
++ caps_fail handlers that kinda work
++
++2001-05-17 06:20 dlehn
++
++ * docs/gst/gstreamer-sections.txt: Pesky nightly doc build failure
++ emails exposing my forgetfulness...
++
++2001-05-17 01:18 hadess
++
++ * plugins/gnomevfs/: Makefile.am, gnomevfssink.c: - gnomevfssink
++ committed
++
++2001-05-16 23:42 wtay
++
++ * acconfig.h: Added SDL.
++
++2001-05-16 23:40 wtay
++
++ * configure.in: Added a check for SDL
++
++2001-05-16 23:09 wtay
++
++ * testsuite/refcounting/thread.c: file thread.c was initially added
++ on branch BRANCH-INCSCHED1.
++
++2001-05-16 23:09 wtay
++
++ * testsuite/refcounting/thread.c: Added thread refcounting and
++ module test case
++
++2001-05-16 23:08 wtay
++
++ * testsuite/refcounting/: Makefile.am, bin.c: More testsuite
++ updates
++
++2001-05-16 23:08 wtay
++
++ * gst/: gstbin.c, gstelement.c, gstthread.c: Slighly take a
++ different approach for object destruction, using the real _remove
++ functions so that the scheduler has a chance to destroy its state
++ too. This breaks the thread with ghostpads destruction case for
++ now.
++
++2001-05-16 22:42 omegahacker
++
++ * plugins/filters/stereo2mono/stereo2mono.c: fixed
++ stereo2mono_init, it was fragging its src pad
++
++2001-05-16 22:21 omegahacker
++
++ * plugins/filters/stereo2mono/stereo2mono.c: fixed up caps so
++ autoplug can do something with it
++
++2001-05-16 22:19 omegahacker
++
++ * gst/autoplug/gstautoplugcache.c: added first_buffer signal, and
++ default to caps_proxy true
++
++2001-05-16 22:18 omegahacker
++
++ * gst/autoplug/gstautoplugger.c: up to latest (broken) autoplugger)
++
++2001-05-16 21:41 wtay
++
++ * plugins/: Makefile.am, jpeg/Makefile.am, sdlsink/Makefile.am,
++ sdlsink/sdlvideosink.c, sdlsink/sdlvideosink.h: Added an SDL video
++ sink by Ronald Bultje (BBB) some cleanups and added more caps to
++ the template. some name changes to the jpeg decoder.
++
++2001-05-16 20:32 wtay
++
++ * plugins/: Makefile.am, gnomevfs/Makefile.am,
++ gnomevfs/gnomevfssrc.c: Added the gnomevfssrc by hadess
++
++2001-05-16 20:32 wtay
++
++ * configure.in: Added gnomevfs checks.
++
++2001-05-16 08:16 dlehn
++
++ * gst/: cothreads.c, gstscheduler.c: - Fix cothread pointers and
++ allocation so full 2M stack space available: - Double maximums to
++ use full stack space: - COTHREAD_STACKSIZE = 16k -
++ COTHREAD_MAXTHREADS = 128 - cothread changes only verified on x86 -
++ cothread_create returns NULL if nthreads == MAXTHREADS though not
++ yet handled by gstschedule caller
++
++2001-05-16 06:04 dlehn
++
++ * acconfig.h, configure.in, gst/gsttrace.c, gst/gsttrace.h,
++ libs/idct/ieeetest.c, test/lat.c: - basic arch check for HAVE_RDTSC
++ - use common gst_trace_read_tsc() for RDTSC call - add untested
++ function to do ascii dump of trace data
++
++2001-05-16 05:07 dlehn
++
++ * test/: videotest.c, wave.c: fix a couple warnings
++
++2001-05-15 22:04 wtay
++
++ * plugins/mp3decode/mad/gstmad.c: Make the mad decoder output the
++ samples in the native endianness.
++
++2001-05-15 20:25 wtay
++
++ * gst/: gstobject.c, gstpad.c, gstthread.c: Added ghostpad
++ destruction.
++
++2001-05-15 10:40 omegahacker
++
++ * plugins/mpeg2/mpeg2dec/gstmpeg2dec.c: added the detail that
++ mpeg2dec can play mpeg1 streams too
++
++2001-05-15 10:04 omegahacker
++
++ * gstplay/: gstplay.c, main.c: added ability to write out xml copy
++ of pipeline
++
++2001-05-15 05:13 omegahacker
++
++ * gst/autoplug/gstautoplugger.c: IT WORKS\!\!\!
++
++2001-05-15 02:45 omegahacker
++
++ * gst/: gstinfo.c, gstpad.c, gsttypefind.c,
++ autoplug/gstautoplugcache.c, autoplug/gstautoplugger.c: gstinfo.c:
++ one more check to make sure DEBUG_FUNCPTR_NAME doesn't go south
++ gstpad.c: debugging changes gsttypefind.c: moved gst_pad_set_caps
++ to *before* the caps_changed signal gstautoplugcache.c: added
++ refcounting around signal_emit, and debug updates gstautoplugger.c:
++ added code to remove the autoplugcache when done
++
++2001-05-14 23:42 wtay
++
++ * gst/gsttypefind.c: Added a reference to typefind.
++
++2001-05-14 23:21 omegahacker
++
++ * gst/gstpad.c: enhanced debug and minor code cleanup (no
++ functional changes)
++
++2001-05-14 22:57 wtay
++
++ * gst/gstelement.c: Refcounting fixes
++
++2001-05-14 22:22 wtay
++
++ * gst/gstelement.c: fixed a mem leak in the destroy code.
++
++2001-05-14 22:20 wtay
++
++ * gst/: gstelement.c, gstpad.c, gstthread.c: slightly different
++ refcount handling. the pad shutdown function doesn't remove the pad
++ from the parent because the parent is needed in the destroy
++ function.
++
++2001-05-14 21:08 omegahacker
++
++ * gst/: cothreads.c, gstbin.h, gstelement.c, gstobject.c, gstpad.c,
++ gstpad.h, gstscheduler.c, gsttypefind.c,
++ autoplug/gstautoplugcache.c, autoplug/gstautoplugger.c:
++ cothreads.c: added a comment on one of the tests gstbin.h: added
++ the GST_BIN_SELF_SCHEDULABLE flag gstelement.c: cleaned up the
++ _change_state function a little gstobject.c: improved the
++ refcounting DEBUGs gstpad.c: moved the connected signal to after
++ capsnego, added the caps_nego_failed signal gstpad.h:
++ added the caps_nego_failed signal funcptr gstscheduler.c: added the
++ GST_BIN_SELF_SCHEDULABLE exception gsttypefind.c: added check code
++ around signal_emit to deal with the case where the
++ signal's handler shuts down the element gstautoplugcache.c: added
++ the first_buffer signal and caps_proxy arg gstautoplugger.c:
++ significant rework, it functions quite nicely actually
++
++2001-05-14 09:51 omegahacker
++
++ * docs/gst/gstreamer-sections.txt: removed the COTHREAD_STACKSIZE
++ and friends, since they're now private to cothreads.c
++
++2001-05-13 16:29 wtay
++
++ * testsuite/refcounting/: bin.c, element_pad.c: More testsuite
++ updates
++
++2001-05-13 16:29 wtay
++
++ * gst/: gstbin.c, gstelement.c, gstpad.c: More housekeeping
++ updates. _destroying an element or a pad properly removes if from
++ the parent.
++
++2001-05-13 08:49 omegahacker
++
++ * plugins/effects/volume/volume.c: hacked up volume plugin to do
++ S16_LE no matter what. FIXME\!
++
++2001-05-12 19:04 wtay
++
++ * gst/: gstbin.c, gstelement.c, gstelementfactory.c, gstthread.c,
++ gstthread.h: Fixed a leak in bin destruction More refcounting fixes
++
++2001-05-12 19:03 wtay
++
++ * testsuite/refcounting/bin.c: file bin.c was initially added on
++ branch BRANCH-INCSCHED1.
++
++2001-05-12 19:03 wtay
++
++ * testsuite/refcounting/: Makefile.am, bin.c, element_pad.c: More
++ refcounting test cases
++
++2001-05-12 15:07 wtay
++
++ * testsuite/refcounting/: element.c, element_pad.c, object.c,
++ pad.c: More testcases
++
++2001-05-12 15:07 wtay
++
++ * gst/: gstelement.c, gstelement.h, gstobject.c: Added
++ gst_element_remove_pad. more refcounting stuff (object unparent on
++ destroy)
++
++2001-05-12 01:04 wtay
++
++ * gst/: gstelement.c, gstinfo.c, gstinfo.h, gstobject.c, gstpad.c,
++ gstpad.h: Refcounting fixes to make the testsuite succeed. Added a
++ ne w category for REFCOUNTING.
++
++2001-05-12 01:03 wtay
++
++ * testsuite/refcounting/element_pad.c: file element_pad.c was
++ initially added on branch BRANCH-INCSCHED1.
++
++2001-05-12 01:03 wtay
++
++ * testsuite/refcounting/pad.c: file pad.c was initially added on
++ branch BRANCH-INCSCHED1.
++
++2001-05-12 01:03 wtay
++
++ * testsuite/refcounting/: Makefile.am, element_pad.c, pad.c: More
++ testsuite updates
++
++2001-05-11 20:36 wtay
++
++ * examples/autoplug/autoplug.c: Updated the autoplugger example to
++ use the new cache.
++
++2001-05-11 19:44 wtay
++
++ * configure.in: Added the refcounting testsuite dir to configure.in
++
++2001-05-11 19:44 wtay
++
++ * testsuite/refcounting/Makefile.am: file Makefile.am was initially
++ added on branch BRANCH-INCSCHED1.
++
++2001-05-11 19:44 wtay
++
++ * testsuite/refcounting/: Makefile.am, element.c, mem.c, mem.h,
++ object.c: Added a testsuite for refcounting.
++
++2001-05-11 19:44 wtay
++
++ * testsuite/refcounting/element.c: file element.c was initially
++ added on branch BRANCH-INCSCHED1.
++
++2001-05-11 19:44 wtay
++
++ * testsuite/refcounting/mem.c: file mem.c was initially added on
++ branch BRANCH-INCSCHED1.
++
++2001-05-11 19:44 wtay
++
++ * testsuite/refcounting/object.c: file object.c was initially added
++ on branch BRANCH-INCSCHED1.
++
++2001-05-11 19:44 wtay
++
++ * testsuite/refcounting/mem.h: file mem.h was initially added on
++ branch BRANCH-INCSCHED1.
++
++2001-05-11 19:41 wtay
++
++ * gst/: cothreads.c, gstbin.c, gstelement.c, gstobject.c,
++ gstobject.h, gsttypefind.c: Work on refcounting and proper object
++ destruction.
++
++2001-05-11 15:42 dlehn
++
++ * plugins/filters/ladspa/ladspa.h: LADSPA header now LGPL.
++
++2001-05-11 00:43 omegahacker
++
++ * gst/gstpad.h: some minor updates with a hair more speed
++
++2001-05-10 23:35 omegahacker
++
++ * gst/: cothreads.c, cothreads.h: move cothread_context definition
++ over to the .c
++
++2001-05-10 23:30 omegahacker
++
++ * gst/gstpad.h: fixed up macros to match new RealPad stuff, change
++ #if 1 to #if 0 to use, beware you must rebuild all plugins after
++ change
++
++2001-05-10 23:10 omegahacker
++
++ * gst/: cothreads.c, cothreads.h: moved cothread parameters into .c
++ to avoid rebuilding libgst.la every time
++
++2001-05-10 22:44 omegahacker
++
++ * test/lat.c: corrected the rdtsc code, it actually, um, works now
++ ;-)
++
++2001-05-10 21:30 dlehn
++
++ * test/: .cvsignore, Makefile.am, lat.c: Added simple latency
++ tester.
++
++2001-05-10 21:28 dlehn
++
++ * gst/elements/gstfakesink.c, gst/elements/gstfakesrc.c,
++ tests/sched/runxml.c: Pass buffer in handoff signal
++
++2001-05-10 21:25 dlehn
++
++ * tests/autoplug2.c: just call exit() once
++
++2001-05-10 09:22 omegahacker
++
++ * tools/gstreamer-inspect.c: minor updates to ouptut, added section
++ for meta-elements' children
++
++2001-05-10 09:21 omegahacker
++
++ * plugins/mpeg1/mpeg_play/: gstmpeg_play.c, video.c: more debug
++ output tweaks
++
++2001-05-10 09:18 omegahacker
++
++ * plugins/filters/adder/adder.c: added comment to make the adder
++ compliant (don't set COTHREAD_STOPPING)
++
++2001-05-10 09:17 omegahacker
++
++ * libs/idct/gstidct.c: minor cleanup of some debug strings
++
++2001-05-10 09:16 omegahacker
++
++ * gst/autoplug/gstautoplugger.c: file gstautoplugger.c was
++ initially added on branch BRANCH-INCSCHED1.
++
++2001-05-10 09:16 omegahacker
++
++ * gst/: gst.h, gstbin.c, gstbuffer.c, gstelement.c, gstelement.h,
++ gstinfo.c, gstqueue.c, gstthread.c, gstxml.c, autoplug/Makefile.am,
++ autoplug/autoplugtest.c, autoplug/gstautoplugcache.c,
++ autoplug/gstautoplugger.c, elements/gstfakesrc.c: - Fixed up a
++ bunch of warnings. - Fixed buffer_copy (alloc correct size) -
++ Added start of autoplugger meta-element
++
++2001-05-09 07:20 wtay
++
++ * plugins/filters/colorspace/yuv2yuv.c: Forgot to add a convertor..
++
++2001-05-09 05:12 dlehn
++
++ * gst/elements/: gstfakesrc.c, gstfakesrc.h: Added "silent" arg.
++
++2001-05-08 21:52 wtay
++
++ * plugins/: capture/v4l/gstv4lsrc.c, capture/v4l/gstv4lsrc.h,
++ dv/dvdec.c, filters/colorspace/Makefile.am,
++ filters/colorspace/colorspace.c, filters/colorspace/colorspace.h,
++ filters/lav/.cvsignore, filters/lav/Makefile.am,
++ filters/lav/lavencode.c, filters/lav/lavencode.h, oss/gstossgst.c,
++ videoscale/videoscale.c, vorbis/vorbis.c: Various changes to the
++ plugins. Added a lav encoder, this one just adds a header in front
++ YUV data so that the lav tools can operate on it.
++
++2001-05-08 21:44 omegahacker
++
++ * gst/: gstpad.c, gstpad.h: added the caps_changed signals, changed
++ a few other things around a littleto clean up warnings
++
++2001-05-07 23:10 wtay
++
++ * plugins/alsa/: alsa.h, alsa_common.c, alsasink.c, alsasrc.c:
++ Applied the alsa patch from Thomas Nyberg.
++
++2001-05-07 22:57 wtay
++
++ * examples/mixer/mixer.c: Added a WITH_BUG2 define to show the
++ livelock we're trying to fix.
++
++2001-05-07 22:46 omegahacker
++
++ * gst/: gstelement.c, gstscheduler.c, autoplug/autoplugtest.c,
++ autoplug/gstautoplugcache.c: updated autoplugcache so it can be
++ removed mid-signal, now autoplugtest works
++
++2001-05-06 23:48 omegahacker
++
++ * gst/autoplug/gstautoplugcache.c: fixed bug in datastructure usage
++
++2001-05-06 23:12 omegahacker
++
++ * gst/: gstbin.c, gstelement.c, gstpipeline.c, gstprops.c,
++ gstscheduler.c, gstthread.c: fixed gst_scheduler_pad_disconnect
++ (never ignore compiler warnings\!) and updated a few INFO lines
++
++2001-05-06 23:12 omegahacker
++
++ * gst/autoplug/autoplugtest.c: fixed up some things, added vorbis
++
++2001-05-06 19:03 wtay
++
++ * gst/autoplug/: Makefile.am, autoplugtest.c: Adjusted the Makefile
++ so that it builds here...
++
++2001-05-06 18:57 wtay
++
++ * plugins/mpeg1/mpegaudio/common.c: Forgot to update a symbol..
++
++2001-05-06 18:33 omegahacker
++
++ * gst/autoplug/autoplugtest.c: file autoplugtest.c was initially
++ added on branch BRANCH-INCSCHED1.
++
++2001-05-06 18:33 omegahacker
++
++ * gst/autoplug/: Makefile.am, autoplugtest.c, gstautoplugcache.c:
++ initial checkin of autoplugcache and a test program to simulate
++ dynamic autoplugging
++
++2001-05-06 18:33 omegahacker
++
++ * gst/autoplug/gstautoplugcache.c: file gstautoplugcache.c was
++ initially added on branch BRANCH-INCSCHED1.
++
++2001-05-06 15:27 wtay
++
++ * plugins/mpeg1/mpegaudio/: common.c, common.h, musicin.c, tonal.c:
++ Fixed a namespace issue with lame.
++
++2001-05-06 15:22 wtay
++
++ * plugins/oss/: gstossgst.c, gstosshelper.c: Fixed a bug in format
++ passing. Some cleanups.
++
++2001-05-06 14:53 wtay
++
++ * plugins/oss/gstossgst.c: Use setenv/getenv to manipulate the
++ environment of the child process.
++
++2001-05-06 14:52 wtay
++
++ * plugins/mp3encode/lame/gstlame.c: Setup the encoder based on the
++ caps of the sinkpad.
++
++2001-05-06 09:16 omegahacker
++
++ * tools/gstreamer-complete.c: file gstreamer-complete.c was
++ initially added on branch BRANCH-INCSCHED1.
++
++2001-05-06 09:16 omegahacker
++
++ * tools/gstreamer-compprep.c: file gstreamer-compprep.c was
++ initially added on branch BRANCH-INCSCHED1.
++
++2001-05-06 09:16 omegahacker
++
++ * tools/: .cvsignore, Makefile.am, gstreamer-complete.c,
++ gstreamer-compprep.c: added initial bash commandline completion
++ code
++
++2001-05-06 04:06 omegahacker
++
++ * plugins/mpeg2/mpeg2dec/gstmpeg2dec.c: oops, that was wrong, but
++ somehow it worked
++
++2001-05-06 03:47 omegahacker
++
++ * plugins/mpeg2/mpeg2dec/gstmpeg2dec.c: since mpeg2dec can handle
++ mpeg1 video streams, update caps to show that
++
++2001-05-05 20:01 wtay
++
++ * plugins/oss/: gstossgst.c, gstosshelper.c, gstosshelper.h: A
++ little cleanup (more defines) Better arg parsing.
++
++2001-05-05 18:22 wtay
++
++ * plugins/oss/gstosshelper.h: The inter process protocol layout
++ header.
++
++2001-05-05 18:21 wtay
++
++ * plugins/oss/: gstossgst.c, gstosshelper.c: Properly negotiate the
++ format set by the OSS app.
++
++2001-05-05 05:07 dlehn
++
++ * plugins/filters/: adder/Makefile.am, colorspace/Makefile.am,
++ intfloatconvert/Makefile.am, mono2stereo/Makefile.am,
++ stereo2mono/Makefile.am, volenv/Makefile.am: Remove EXTRA_DIST =
++ README from dirs with a README.
++
++2001-05-05 03:16 wtay
++
++ * gst/gstplugin.c: Make sure the plugin filaname is set before
++ calling the init function.
++
++2001-05-05 03:05 wtay
++
++ * plugins/oss/: Makefile.am, gstossaudio.c, gstossgst.c,
++ gstossgst.h, gstosshelper.c: A first attempt at hijacking /dev/dsp
++ and feeding the audio of an OSS app into GStreamer.
++
++2001-05-05 02:50 dlehn
++
++ * debian/changelog: update version
++
++2001-05-05 01:45 dlehn
++
++ * debian/: Makefile.am, changelog, control, gstreamer-aa.files,
++ gstreamer-arts.files, gstreamer-colorspace.files,
++ gstreamer-common.files, gstreamer-mad.files, rules: Sync with
++ current code - add more and more plugins.
++
++2001-05-04 23:14 omegahacker
++
++ * gst/gstelement.h, gst/gstscheduler.c,
++ plugins/mp3decode/mad/gstmad.c: Add the GST_ELEMENT_NO_ENTRY flag,
++ which when set will force the scheduler to skip over an element as
++ an option for the first cothread jump. This is needed because
++ libraries like mad don't ever seem to want to quit. Thus they
++ ignore COTHREAD_STOPPING and can't be trusted to be the entry.
++
++2001-05-04 21:43 omegahacker
++
++ * gst/: gstinfo.c, gstpad.c, gstscheduler.c: Some minor DEBUG
++ cleanups, renamed the various scheduler-specific routines to
++ actually be called gst_schedule_ instead of gst_bin_.
++
++2001-05-04 21:41 omegahacker
++
++ * plugins/mp3decode/mad/gstmad.c: added GST_DEBUG_FUNCPTR to
++ gst_mad_loop instance
++
++2001-05-04 00:21 omegahacker
++
++ * gst/gstparse.c: fixed spelling mistake in user-visible output
++
++2001-05-03 23:29 wtay
++
++ * gst/gstprops.c: Created a macro of the va_arg parsing function
++ because some systems (PPC) cannot handle passing a va_list by
++ reference.
++
++2001-05-03 22:44 wtay
++
++ * gst/gstparse.c: Added dynamic pads to the command line parser.
++
++ ./gstreamer-launch disksrc location=/some/systemstream.mpg !
++ mpeg1parse video_00!
++ queue ! \{ mp1videoparse ! mpeg_play ! aasink \}
++
++ will now work.
++
++2001-05-03 21:06 wtay
++
++ * docs/gst/: gstreamer-sections.txt, gstreamer.hierarchy,
++ tmpl/gstbuffer.sgml, tmpl/gstcaps.sgml, tmpl/gstdisksink.sgml,
++ tmpl/gstinfo.sgml, tmpl/gstprops.sgml, tmpl/gstreamer-unused.sgml:
++ API docs updates
++
++2001-05-03 18:49 wtay
++
++ * REQUIREMENTS: Added Hermes to the required libs for gstplay.
++
++2001-05-03 11:16 thomasvs
++
++ * examples/mixer/mixer.c, plugins/filters/adder/adder.c: * made a
++ quick hack in adder to set GST_ELEMENT_COTHREAD_STOPPING after
++ one interation to force return to main program; should probably be
++ fixed in a better way * cleaned mixer up, it now works with
++ delayed start. Drinks are in order.
++
++2001-05-03 00:46 wtay
++
++ * docs/manual/: Makefile.am, autoplugging.sgml, bins.sgml,
++ buffers.sgml, elements.sgml, gstreamer-manual.sgml,
++ helloworld.sgml, pads.sgml: Small manual changes. Added a section
++ about autoplugging.
++
++2001-05-03 00:44 wtay
++
++ * gst/gstinfo.h: Added and extra whitespace before ## args
++ (remember it eats all non whitespace chars to the left if it's
++ empty).
++
++2001-05-03 00:12 wtay
++
++ * examples/plugins/example.c: We don't want to teach you bad
++ habbits, so here's a fix for a memleak in the example plugin.
++
++2001-05-02 21:27 omegahacker
++
++ * gst/gstinfo.h: re-enabled the funcptr hash table
++
++2001-05-02 21:16 wtay
++
++ * examples/mixer/mixer.c: Added a WITH_BUG flag to trigger the
++ scheduling error we're trying to chase.
++
++2001-05-02 21:12 thomasvs
++
++ * examples/mixer/mixer.c: delayed second song
++
++2001-05-02 21:01 omegahacker
++
++ * examples/mixer/mixer.c: added two debugging things: xml pipelie
++ output, and schedule dump
++
++2001-05-02 20:20 omegahacker
++
++ * gst/: gst.c, gstcaps.c, gstelement.c, gstelementfactory.c,
++ gstinfo.c, gstinfo.h, gstpad.c, gstprops.c, gstqueue.c: Converted
++ the DEBUG system to look like the INFO system, with a function
++ pointer that can be replaced. Not done with everything, since it
++ seems that we need an ERROR system plus a FATAL error, or maybe
++ just an ERROR system with a severity, and depending on this the
++ DEBUG system might again be changed to have a single or at least
++ fewer handlers.
++
++ Also did a bit of work fixing up the actual DEBUG and INFO commands
++ scattered throughout the code. We still have over 500 of these in
++ gst/*.c alone...
++
++2001-05-02 20:11 thomasvs
++
++ * examples/mixer/mixer.c: trying to adapt to incsched
++
++2001-05-02 09:52 thomasvs
++
++ * plugins/filters/Makefile.am: added volenv and adder
++
++2001-05-02 09:51 thomasvs
++
++ * examples/Makefile.am: added mixer
++
++2001-05-02 00:00 omegahacker
++
++ * gst/gstscheduler.c: /me is an idiot
++
++2001-05-01 23:58 thomasvs
++
++ * plugins/filters/passthrough/: README, filter.func, level.c,
++ level.h: Basic level detection/printing plugin; calculates RMS over
++ data block and prints this out along with time in secs through
++ plugin needs more work
++
++2001-05-01 23:45 wtay
++
++ * gstplay/: gstplay.c, gstplayprivate.h: Changed the pipeline setup
++ for incremental scheduling.
++
++2001-05-01 23:43 wtay
++
++ * gst/gstprops.c: Removed the assert on an unknown propertytype and
++ print useful info.
++
++2001-05-01 22:41 omegahacker
++
++ * test/mpeg2parse4.c: file mpeg2parse4.c was initially added on
++ branch BRANCH-INCSCHED1.
++
++2001-05-01 22:41 omegahacker
++
++ * configure.in, gstreamer.pc.in, gst/Makefile.am, gst/gstbin.c,
++ gst/gstinfo.c, gst/gstinfo.h, gst/gstqueue.c, gst/gstscheduler.c,
++ gst/gstscheduler.h, test/.cvsignore, test/Makefile.am,
++ test/mpeg2parse3.c, test/mpeg2parse4.c, tests/mp1vid.c: - fixed
++ configure.in %VAR stuff - fixed gstreamer.pc.in description string
++ - fixed up incremental scheduling some more - updated the
++ GST_DEBUG_FUNCPTR code to no longer need a hash - minor updates to
++ DEBUG colorization - new test/mpeg2parse4.c
++
++2001-05-01 22:35 omegahacker
++
++ * gstplay/main.c: added code to save the pipeline to xml
++
++2001-05-01 14:54 richardb
++
++ * docs/fwg/gst-plugin-writers-guide.sgml: Update documentation for
++ audio/raw properties to cover format=float case. Please check this
++ for correctness.
++
++2001-05-01 14:16 thomasvs
++
++ * gst/autoplug/: gststaticautoplug.c, gststaticautoplugrender.c:
++ added newlines to debug output
++
++2001-05-01 00:35 wtay
++
++ * gstplay/gstplay.c: Implemented the function to get the pipeline
++ of gstplay.
++
++2001-05-01 00:20 wtay
++
++ * docs/random/autoplug2: Added an explanation of the innner
++ workings of the current autoplugger.
++
++2001-04-30 21:40 richardb
++
++ * configure.in: Tighten some library checks (check for header files
++ as well as libraries) Also, clean up structure slightly: put all
++ AC_DEFINEs for feature checks into the appropriate section at end.
++ This structure allows user parameter code which overrides the
++ feature selection to be kept together in a section after the
++ feature checks but before the AC_DEFINES and AM_CONDITIONALs.
++
++2001-04-30 20:51 thomasvs
++
++ * examples/mixer/mixer.c: cleared naming issues, still doesn't play
++
++2001-04-30 15:34 thomasvs
++
++ * plugins/filters/Makefile.am: added volenv, passthrough and adder
++ to Makefile.am
++
++2001-04-30 11:22 richardb
++
++ * configure.in: Add explicit check for <artsc.h>, in case
++ artsc-config lies to us.
++
++2001-04-29 23:46 sbaker3
++
++ * plugins/filters/: intfloatconvert/float2int.h,
++ intfloatconvert/int2float.h, mono2stereo/mono2stereo.h: remove
++ bogus reference to audioraw.h
++
++2001-04-29 23:27 wtay
++
++ * examples/mixer/mixer.c: Changed the way the typefind function
++ works by creating a little pipeline as the toplevel bin..
++
++2001-04-29 22:56 thomasvs
++
++ * examples/mixer/mixer.c: trying to convert mixer to incsched, not
++ working yet
++
++2001-04-29 18:59 richardb
++
++ * README: Add detailed note (and patch) about automake problem.
++
++2001-04-29 08:54 sbaker3
++
++ * plugins/filters/ladspa/gstladspa.c: sync ladspa plugin with
++ recent api changes - still not functional
++
++2001-04-29 08:41 sbaker3
++
++ * configure.in: added mono2stereo and intfloatconvert plugin
++
++2001-04-29 08:39 sbaker3
++
++ * plugins/filters/: Makefile.am, intfloatconvert/Makefile.am,
++ intfloatconvert/float2int.c, intfloatconvert/float2int.h,
++ intfloatconvert/int2float.c, intfloatconvert/int2float.h,
++ intfloatconvert/intfloatconvert.c,
++ intfloatconvert/intfloatconvert.h, mono2stereo/Makefile.am,
++ mono2stereo/mono2stereo.c, mono2stereo/mono2stereo.h: added
++ mono2stereo and intfloatconvert plugins
++
++2001-04-28 20:16 sbaker3
++
++ * editor/gsteditorproperty.c, tools/gstreamer-inspect.c: added
++ output of float properties
++
++2001-04-28 19:59 wtay
++
++ * gst/: gstinfo.c, gstprops.c: Added more colors for
++ props/caps/clock/negotiation.
++
++2001-04-28 19:58 sbaker3
++
++ * gst/elements/: gstsinesrc.c, gstsinesrc.h: update sinesrc to
++ latest caps
++
++2001-04-28 19:57 sbaker3
++
++ * gst/elements/gstelements.c: add factory init for sinesrc
++
++2001-04-28 19:56 sbaker3
++
++ * gst/: gstcaps.h, gstprops.c, gstprops.h: add gst_props_get_float
++ function
++
++2001-04-28 08:17 omegahacker
++
++ * test/mpeg2parse3.c: now fully correct within incsched1 world
++
++2001-04-28 05:23 omegahacker
++
++ * test/: Makefile.am, mpeg2parse2.c, mpeg2parse3.c: brought in
++ mpeg2parse3.c from HEAD and fixed it up so it works
++
++2001-04-28 05:23 omegahacker
++
++ * gst/: cothreads.c, gstinfo.c, gstqueue.c: - Updated colorization
++ some more (pthread and cothread id is in color) - Added some minor
++ debug to help trace mp1vid segfaults
++
++2001-04-28 04:38 dlehn
++
++ * test/: .cvsignore, Makefile.am, mpeg2parse3.c: mpeg2parse2.c +
++ audio = mpeg2parse3.c = a simple .vob player
++
++2001-04-28 03:54 omegahacker
++
++ * gst/: gstbin.c, gstclock.c, gstelement.c, gstelementfactory.c,
++ gstinfo.c, gstpad.c, gstpipeline.c, gstthread.c, gsttype.c,
++ gstutils.c: Updated the colorization a bit more, and did a
++ significant pass through all the other code to change categories on
++ DEBUG and INFO statements to be correct, and not simply zero.
++ There are still more, but this is a good first pass.
++
++2001-04-28 02:46 mhowell
++
++ * gst/: gstelement.c, gstscheduler.c, gstthread.c: fixed another
++ thread synch case... better debug
++
++2001-04-28 02:06 omegahacker
++
++ * gst/: gst.c, gstinfo.c, gstinfo.h: another update to the
++ colorization code
++
++2001-04-27 22:14 wtay
++
++ * gst/gstutils.c: Added enum parsing...
++
++2001-04-27 22:09 omegahacker
++
++ * gst/: gstinfo.c, gstinfo.h: fixes to colorization
++
++2001-04-27 22:01 thomasvs
++
++ * plugins/filters/filterstamp.sh: changed "rename" command to
++ something using sed in one line having the same effect
++
++2001-04-27 21:58 omegahacker
++
++ * gst/gstinfo.c: syntax error fixed (s/;/,/)
++
++2001-04-27 21:54 mhowell
++
++ * gst/: gstelement.c, gstscheduler.c, gstthread.c, gstqueue.h,
++ gstqueue.c: initial fix of thread synch for queues and state change
++
++2001-04-27 21:47 omegahacker
++
++ * acconfig.h, configure.in, gst/gst.c, gst/gstelement.h,
++ gst/gstinfo.c, gst/gstinfo.h: added colorization of DEBUG and INFO,
++ and a comment in gstelement.h
++
++2001-04-27 21:45 wtay
++
++ * gst/autoplug/gststaticautoplugrender.c: Tried to get the
++ autoplugger working by setting the pipeline to PAUSED before
++ attempting to connect pads...
++
++2001-04-27 21:31 omegahacker
++
++ * acconfig.h, configure.in, gst/gst.c, gst/gstinfo.c,
++ gst/gstinfo.h: Added colorization to DEBUG and INFO. Colors are
++ based on categories, with the strings in _gst_category_colors[] in
++ gstinfo.c See wiki node GstDebugColors for the actual colors, or
++ /etc/DIR_COLORS works too.
++
++ Please comment on the colorization style and ideas in the above
++ wiki node.
++
++2001-04-27 20:35 wtay
++
++ * docs/gst/gstreamer.hierarchy, docs/gst/tmpl/cothreads.sgml,
++ docs/gst/tmpl/gstbuffer.sgml, docs/gst/tmpl/gstdisksink.sgml,
++ docs/gst/tmpl/gstelement.sgml, docs/gst/tmpl/gstfakesrc.sgml,
++ docs/gst/tmpl/gstpad.sgml, docs/gst/tmpl/gstreamer-unused.sgml,
++ docs/gst/tmpl/gstthread.sgml, examples/autoplug/autoplug.c,
++ gstplay/gstplay.c, tests/mp1vid.c: A commit of pending (small)
++ changes...
++
++2001-04-27 20:17 wtay
++
++ * examples/autoplug/autoplug.c: Fixed the autoplugger
++
++2001-04-27 02:46 omegahacker
++
++ * gst/: cothreads.c, cothreads.h: fixed cothread_current_main so
++ it, um, works.
++
++2001-04-27 02:42 omegahacker
++
++ * gst/: cothreads.c, cothreads.h: added cothread_current_main with
++ (void) args
++
++2001-04-27 00:34 omegahacker
++
++ * tests/mp1vid.c: latest variant of mp1vid causes lockup, solution
++ is interruptibility
++
++2001-04-26 23:32 omegahacker
++
++ * tests/mp1vid.c: updated to working state
++
++2001-04-26 23:32 omegahacker
++
++ * gst/: gstbin.c, gstthread.c: gstbin.c: commented out the
++ requirement that a bin be !PLAYING to add gstthread.c: fixed an old
++ failed merge that locked the same mutex twice ...in a row
++
++2001-04-26 06:47 dlehn
++
++ * configure.in: fix typos: %VAR -> $VAR
++
++2001-04-26 02:53 omegahacker
++
++ * autogen.sh, configure.in, docs/gst/gstreamer-docs.sgml,
++ docs/gst/gstreamer-sections.txt, docs/gst/gstreamer.hierarchy,
++ docs/gst/tmpl/gst.sgml, docs/gst/tmpl/gstautoplug.sgml,
++ docs/gst/tmpl/gstbin.sgml, docs/gst/tmpl/gstbuffer.sgml,
++ docs/gst/tmpl/gstbufferpool.sgml, docs/gst/tmpl/gstcaps.sgml,
++ docs/gst/tmpl/gstcpu.sgml, docs/gst/tmpl/gstdisksink.sgml,
++ docs/gst/tmpl/gstfakesink.sgml, docs/gst/tmpl/gstidentity.sgml,
++ docs/gst/tmpl/gstpad.sgml, docs/gst/tmpl/gstparse.sgml,
++ docs/gst/tmpl/gstpipeline.sgml, docs/gst/tmpl/gstplugin.sgml,
++ docs/gst/tmpl/gstprops.sgml, docs/gst/tmpl/gstreamer-unused.sgml,
++ docs/libs/Makefile.am, examples/Makefile.am,
++ examples/autoplug/autoplug.c, examples/mixer/.cvsignore,
++ examples/mixer/Makefile.am, examples/mixer/mixer.c,
++ examples/mixer/mixer.h, examples/plugins/example.c, gst/.cvsignore,
++ gst/Makefile.am, gst/Makefile.am.future, gst/gst.h,
++ gst/gstbuffer.c, gst/gstbuffer.h, gst/gstcaps.c, gst/gstcaps.h,
++ gst/gstobject.c, gst/gstpad.c, gst/gstpad.h, gst/gstplugin.c,
++ gst/gstplugin.h, gst/gstprops.h, gst/gstqueue.c, gst/gstutils.c,
++ gst/gstversion.h.in, gst/autoplug/Makefile.am,
++ gst/autoplug/gststaticautoplug.c,
++ gst/autoplug/gststaticautoplugrender.c, gst/elements/Makefile.am,
++ gst/elements/gstdisksink.c, gst/elements/gstdisksink.h,
++ gst/elements/gstdisksrc.c, gst/elements/gstelements.c,
++ gst/elements/gstfakesink.c, gst/elements/gstfakesink.h,
++ gst/elements/gstidentity.c, gst/elements/gstidentity.h,
++ gst/types/Makefile.am, gst/types/gsttypes.c,
++ libs/putbits/gstputbits.c, plugins/Makefile.am,
++ plugins/1394/.cvsignore, plugins/1394/Makefile.am,
++ plugins/1394/dv1394src.c, plugins/1394/dv1394src.h,
++ plugins/1394/gst1394.c, plugins/aasink/.cvsignore,
++ plugins/aasink/Makefile.am, plugins/aasink/aasink.c,
++ plugins/aasink/aasink.h, plugins/alaw/alaw.c,
++ plugins/alsa/alsasink.c, plugins/alsa/alsasrc.c,
++ plugins/arts/.cvsignore, plugins/arts/Makefile.am,
++ plugins/arts/gst_arts.c, plugins/arts/gst_arts.h,
++ plugins/arts/gst_artsio.idl, plugins/arts/gst_artsio_impl.cc,
++ plugins/artsd/artsdsink.c, plugins/au/gstparseau.c,
++ plugins/audioscale/audioscale.c, plugins/avi/gstavidecoder.c,
++ plugins/avi/gstaviencoder.c, plugins/avi/wincodec/gstwincodec.c,
++ plugins/avi/wincodec/gstwindec.c, plugins/avi/wincodec/gstwindec.h,
++ plugins/avi/wincodec/gstwinenc.c, plugins/capture/v4l/gstv4lsrc.c,
++ plugins/cdparanoia/cdparanoia.c, plugins/cobin/cobin.c,
++ plugins/cobin/spindentity.c, plugins/dv/Makefile.am,
++ plugins/dv/NOTES, plugins/dv/dvdec.c, plugins/dv/dvdec.h,
++ plugins/dvdsrc/dvdsrc.c, plugins/effects/stereo/stereo.c,
++ plugins/effects/volume/volume.c, plugins/esd/esdsink/esdsink.c,
++ plugins/filters/adder/.cvsignore,
++ plugins/filters/adder/Makefile.am, plugins/filters/adder/adder.c,
++ plugins/filters/adder/adder.h,
++ plugins/filters/colorspace/colorspace.c,
++ plugins/filters/colorspace/colorspace.h,
++ plugins/filters/ladspa/gstladspa.c,
++ plugins/filters/median/median.c,
++ plugins/filters/passthrough/passthrough.c,
++ plugins/filters/smooth/smooth.c,
++ plugins/filters/stereo2mono/stereo2mono.c,
++ plugins/filters/volenv/filter.func,
++ plugins/filters/volenv/volenv.c, plugins/flx/flx_decoder.c,
++ plugins/icecast/icecastsend/icecastsend.c, plugins/jpeg/gstjpeg.c,
++ plugins/jpeg/gstjpegdec.c, plugins/jpeg/gstjpegenc.c,
++ plugins/mp3decode/mad/gstmad.c, plugins/mp3decode/mad/gstmad.h,
++ plugins/mp3decode/mpg123/Makefile.am,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3decode/types/mp3types.c, plugins/mp3decode/xa/gstxa.c,
++ plugins/mp3decode/xing/gstxing.c, plugins/mp3encode/lame/gstlame.c,
++ plugins/mpeg1/mpeg1encoder/gstmpeg1encoder.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.c,
++ plugins/mpeg1/mpegtypes/mpeg1types.c,
++ plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1/system_encode/buffer.c,
++ plugins/mpeg1/system_encode/system_encode.c,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg2/ac3dec/ac3dec.c, plugins/mpeg2/ac3parse/ac3parse.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.h,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.c,
++ plugins/mpeg2/mpegtypes/mpeg2types.c,
++ plugins/mpeg2/parse/mpeg2parse.c,
++ plugins/mpeg2/subtitles/mpeg2subt.c,
++ plugins/mpeg2/video/gstmpeg2play.c,
++ plugins/mpeg2/videoparse/mp2videoparse.c, plugins/mulaw/mulaw.c,
++ plugins/oss/gstossaudio.c, plugins/oss/gstosssink.c,
++ plugins/oss/gstosssrc.c, plugins/rtjpeg/rtjpeg.c,
++ plugins/rtp/rtpsend/rtpsend.c, plugins/vcdsrc/vcdsrc.c,
++ plugins/videoscale/videoscale.c,
++ plugins/visualization/smoothwave/smoothwave.c,
++ plugins/visualization/spectrum/gstspectrum.c,
++ plugins/visualization/synaesthesia/synaesthesia.c,
++ plugins/visualization/vumeter/vumeter.c, plugins/vorbis/vorbis.c,
++ plugins/wav/gstparsewav.c, plugins/xmms/gstxmms.c,
++ plugins/xmms/gstxmmseffect.c, plugins/xvideosink/gstximage.c,
++ plugins/xvideosink/gstximage.h, plugins/xvideosink/gstxvimage.c,
++ plugins/xvideosink/gstxvimage.h, plugins/xvideosink/xvideosink.c,
++ plugins/xvideosink/xvideosink.h, test/.cvsignore, test/Makefile.am,
++ test/dv2mp1.c, test/dvshow.c, test/mp2tomp1.c, test/mp3.c,
++ test/mp3mad.c, test/video2mp1.c, test/xmmstest.c,
++ tests/Makefile.am, tests/autoplug3.c, tests/autoplug4.c,
++ tests/padfactory.c, testsuite/capsnego/capsnego.c,
++ testsuite/capsnego/converter.c, testsuite/capsnego/converter2.c,
++ testsuite/capsnego/enum.c: Merged from HEAD to INCSCHED1 on
++ 200104251
++
++2001-04-26 02:43 omegahacker
++
++ * plugins/arts/gst_artsio_impl.h: oops, need to have this file in
++ CVS
++
++2001-04-26 01:25 omegahacker
++
++ * tests/mp1vid.c: file mp1vid.c was initially added on branch
++ BRANCH-INCSCHED1.
++
++2001-04-26 01:25 omegahacker
++
++ * tests/mp1vid.c: added mp1vid to CVS
++
++2001-04-26 01:20 omegahacker
++
++ * test/dvshow.c: set the video window size up front for NTSC, as a
++ timesaver
++
++2001-04-26 01:19 omegahacker
++
++ * plugins/dv/dvdec.c: cleanup of the dvdec stuff, somewhat
++
++2001-04-26 00:56 omegahacker
++
++ * configure.in: turn off optimization when profiling (ackcvs diff
++ configure.in) because something segfaults if we don't
++
++2001-04-26 00:30 omegahacker
++
++ * gst/cothreads.c: fixed a locking issue
++
++2001-04-25 23:32 omegahacker
++
++ * gst/: cothreads.c, cothreads.h, gstelement.c, gstelement.h,
++ gstscheduler.c, gstscheduler.h: Added element-level locking
++ support, implemented for cothreads with a mutex held whenever an
++ element is actually currently running. This should be done with
++ atomic variables eventually, but the best I can find is to use
++ <asm/spinlock.h> from the kernel, which brings in too much for my
++ taste.
++
++ Also increased cothread stack size to 32KB and max cothread count
++ to 64, which fits within the default pthread 2MB stack. It would
++ probably be good to do a pthread_attr_getstacksize() to verify that
++ it's 2MB, and if linuxthreads had a pthread_attr_setstacksize(), we
++ could remove these limits.
++
++2001-04-25 12:49 richardb
++
++ * examples/Makefile.am, test/Makefile.am, test/mp3.c,
++ test/xmmstest.c: Remove #include <gnome.h> from some tests which
++ don't actually need it, and make the other tests and the autoplug
++ example only compile if gnome headers are present.
++
++2001-04-24 22:28 omegahacker
++
++ * gst/gstbuffer.c: I will successfully compile code before I check
++ it in. I will successfully compile code before I check it in. I
++ will successfully compile code before I check it in. I will
++ successfully compile code before I check it in. I will
++ successfully compile code before I check it in. I will
++ successfully compile code before I check it in. I will
++ successfully compile code before I check it in. I will
++ successfully compile code before I check it in. I will
++ successfully compile code before I check it in. I will
++ successfully compile code before I check it in.
++
++2001-04-24 20:20 omegahacker
++
++ * gst/: gstbuffer.c, gstbuffer.h: - commented out remainder of Meta
++ stuff - enhanced mem_chunk allocation to round up to nearest 32
++ bytes this helps ensure that GstBuffers are more likely to be on
++ cache-lines - added free() and copy() function pointers to
++ GstBuffer - added code in _destroy and _copy to use above routines
++ if !NULL - fixed up _copy code to suck less
++
++2001-04-24 20:04 omegahacker
++
++ * plugins/: avi/wincodec/gstwinenc.c, filters/median/median.c,
++ filters/smooth/smooth.c, jpeg/gstjpegenc.c: Commented out most of
++ the remaining bits of Meta stuff
++
++2001-04-24 00:16 omegahacker
++
++ * autogen.sh, gst/elements/gstfakesink.c, plugins/Makefile.am,
++ plugins/arts/gst_artsio_impl.cc, plugins/oss/gstosssrc.c:
++ Collection of minor changes:
++
++ * autogen.sh - remove config.cache before running ./configure
++ * gst/elements/gstfakesink.c - print out the size of the buffer,
++ too
++ * plugins/Makefile.am - removed a spare trailing backslash
++ * plugins/arts/gst_artsio_impl.cc - change the scale back to 0.5
++ * plugins/oss/gstosssrc.c - change name slightly to match osssink
++
++2001-04-23 23:04 wtay
++
++ * plugins/aasink/: aasink.c, aasink.h: Final fixes to the aasink
++
++2001-04-23 16:16 omegahacker
++
++ * test/dvshow.c: updated dvshow to use dv1394src instead of
++ gst1394src
++
++2001-04-23 16:16 omegahacker
++
++ * plugins/1394/: Makefile.am, dv1394src.c, dv1394src.h, gst1394.c,
++ gst1394.h: renamed 1394src to dv1394src, set up to handle *1394* in
++ 1394 dir
++
++2001-04-23 00:28 wtay
++
++ * configure.in: Added a check for aalib
++
++2001-04-23 00:18 wtay
++
++ * plugins/: Makefile.am, aasink/.cvsignore, aasink/Makefile.am,
++ aasink/aasink.c, aasink/aasink.h, mp3decode/mpg123/Makefile.am,
++ xvideosink/xvideosink.c, xvideosink/xvideosink.h: Some small mpg123
++ Makefile changes. Added an aasink, draw graphics with aalib :-)
++
++2001-04-22 17:34 wtay
++
++ * plugins/: avi/wincodec/gstwindec.c, avi/wincodec/gstwindec.h,
++ dv/dvdec.c: Added bufferpools to windec. updated dvdec to the new
++ plugin version system.
++
++2001-04-22 17:06 wtay
++
++ * docs/gst/tmpl/gstdisksink.sgml: Added the disksink template
++
++2001-04-22 17:05 wtay
++
++ * test/.cvsignore: Updates
++
++2001-04-22 17:04 wtay
++
++ * test/dv2mp1.c: Added a non functional dv to mpeg1 encoder.
++
++2001-04-22 17:04 wtay
++
++ * docs/gst/gstreamer-docs.sgml, docs/gst/gstreamer-sections.txt,
++ docs/gst/gstreamer.hierarchy, docs/gst/tmpl/gstbuffer.sgml,
++ docs/gst/tmpl/gstidentity.sgml, docs/gst/tmpl/gstplugin.sgml,
++ docs/gst/tmpl/gstprops.sgml, docs/gst/tmpl/gstreamer-unused.sgml,
++ docs/libs/Makefile.am, gst/gstcaps.h, gst/gstpad.h, gst/gstutils.c,
++ gst/elements/gstdisksink.c, gst/elements/gstdisksink.h,
++ gst/elements/gstdisksrc.c, plugins/alsa/alsasink.c,
++ plugins/alsa/alsasrc.c, plugins/dv/dvdec.c, plugins/dv/dvdec.h,
++ plugins/filters/colorspace/colorspace.c, test/Makefile.am,
++ tests/padfactory.c: API docs updates. Properly implemented the
++ disksink. Fixed a compile problem with alsa. Added bufferpool
++ handling to dvdec Some compiler warning fixes
++
++2001-04-22 13:30 richardb
++
++ * examples/plugins/example.c, gst/gstplugin.c, gst/gstplugin.h,
++ gst/autoplug/gststaticautoplug.c,
++ gst/autoplug/gststaticautoplugrender.c, gst/elements/gstelements.c,
++ gst/types/gsttypes.c, plugins/1394/gst1394.c, plugins/alaw/alaw.c,
++ plugins/alsa/alsasink.c, plugins/alsa/alsasrc.c,
++ plugins/arts/gst_arts.c, plugins/artsd/artsdsink.c,
++ plugins/au/gstparseau.c, plugins/audioscale/audioscale.c,
++ plugins/avi/gstavidecoder.c, plugins/avi/gstaviencoder.c,
++ plugins/avi/wincodec/gstwincodec.c,
++ plugins/capture/v4l/gstv4lsrc.c, plugins/cdparanoia/cdparanoia.c,
++ plugins/cobin/cobin.c, plugins/cobin/spindentity.c,
++ plugins/dvdsrc/dvdsrc.c, plugins/effects/stereo/stereo.c,
++ plugins/effects/volume/volume.c, plugins/esd/esdsink/esdsink.c,
++ plugins/filters/adder/adder.c,
++ plugins/filters/colorspace/colorspace.c,
++ plugins/filters/ladspa/gstladspa.c,
++ plugins/filters/median/median.c,
++ plugins/filters/passthrough/passthrough.c,
++ plugins/filters/smooth/smooth.c,
++ plugins/filters/stereo2mono/stereo2mono.c,
++ plugins/filters/volenv/volenv.c, plugins/flx/flx_decoder.c,
++ plugins/icecast/icecastsend/icecastsend.c, plugins/jpeg/gstjpeg.c,
++ plugins/mp3decode/mad/gstmad.c,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3decode/types/mp3types.c, plugins/mp3decode/xa/gstxa.c,
++ plugins/mp3decode/xing/gstxing.c, plugins/mp3encode/lame/gstlame.c,
++ plugins/mpeg1/mpeg1encoder/gstmpeg1encoder.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.c,
++ plugins/mpeg1/mpegtypes/mpeg1types.c,
++ plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1/system_encode/system_encode.c,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg2/ac3dec/ac3dec.c, plugins/mpeg2/ac3parse/ac3parse.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.c,
++ plugins/mpeg2/mpegtypes/mpeg2types.c,
++ plugins/mpeg2/parse/mpeg2parse.c,
++ plugins/mpeg2/subtitles/mpeg2subt.c,
++ plugins/mpeg2/video/gstmpeg2play.c,
++ plugins/mpeg2/videoparse/mp2videoparse.c, plugins/mulaw/mulaw.c,
++ plugins/oss/gstossaudio.c, plugins/rtjpeg/rtjpeg.c,
++ plugins/rtp/rtpsend/rtpsend.c, plugins/vcdsrc/vcdsrc.c,
++ plugins/videoscale/videoscale.c,
++ plugins/visualization/smoothwave/smoothwave.c,
++ plugins/visualization/spectrum/gstspectrum.c,
++ plugins/visualization/synaesthesia/synaesthesia.c,
++ plugins/visualization/vumeter/vumeter.c, plugins/vorbis/vorbis.c,
++ plugins/wav/gstparsewav.c, plugins/xmms/gstxmms.c,
++ plugins/xmms/gstxmmseffect.c, plugins/xvideosink/xvideosink.c:
++ Merged from BRANCH-PLUGINVER1
++
++2001-04-22 13:06 richardb
++
++ * plugins/mpeg2/mpeg2enc/gstmpeg2enc.c: Fix bad merge with head.
++
++2001-04-22 11:16 richardb
++
++ * configure.in, examples/autoplug/autoplug.c, gst/gstbuffer.c,
++ gst/gstbuffer.h, gst/gstcaps.h, gst/gstprops.h,
++ gst/autoplug/gststaticautoplugrender.c, libs/putbits/gstputbits.c,
++ plugins/Makefile.am, plugins/dv/Makefile.am, plugins/dv/NOTES,
++ plugins/dv/dvdec.c, plugins/dv/dvdec.h,
++ plugins/filters/colorspace/colorspace.c, plugins/jpeg/gstjpegdec.c,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.c,
++ plugins/mpeg1/system_encode/buffer.c,
++ plugins/mpeg1/system_encode/system_encode.c,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.c, plugins/oss/gstosssink.c,
++ plugins/videoscale/videoscale.c, test/Makefile.am, test/dvshow.c,
++ test/mp2tomp1.c, test/video2mp1.c: Merged from trunk
++
++2001-04-22 05:38 omegahacker
++
++ * gst/: gstbuffer.c, gstbuffer.h, gstcaps.h: fixes for gstbuffer,
++ and removed ## from gstcaps.h that was causing all that warning
++ noise
++
++2001-04-22 02:41 omegahacker
++
++ * gst/gstbuffer.c: completed gst_buffer_copy, added API comments
++
++2001-04-22 02:40 omegahacker
++
++ * test/: Makefile.am, dvshow.c: added test program for dv decoder
++
++2001-04-22 02:32 omegahacker
++
++ * gst/gstprops.h: added GST_STR_FOURCC, which takes strings like
++ "YUY2" instead of 'Y','U','Y','2'. better, I think <g>
++
++2001-04-22 02:30 wtay
++
++ * configure.in: Add -lm and the glib libs too for the dv_init check
++
++2001-04-22 02:30 omegahacker
++
++ * gst/: gstbuffer.c, gstbuffer.h: Added gst_buffer_copy(). It's
++ not complete, it should copy more stuff like flags and such.
++ FIXME.
++
++2001-04-22 02:28 omegahacker
++
++ * plugins/Makefile.am: fixed caps error in path for dv
++
++2001-04-22 00:48 omegahacker
++
++ * configure.in, plugins/Makefile.am, plugins/dv/Makefile.am,
++ plugins/dv/NOTES, plugins/dv/dvdec.c, plugins/dv/dvdec.h: added
++ initial DV (smpte314m) decoder plugin
++
++2001-04-21 18:45 wtay
++
++ * examples/autoplug/autoplug.c,
++ gst/autoplug/gststaticautoplugrender.c, libs/putbits/gstputbits.c,
++ plugins/filters/colorspace/colorspace.c, plugins/jpeg/gstjpegdec.c,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.c,
++ plugins/mpeg1/system_encode/buffer.c,
++ plugins/mpeg1/system_encode/system_encode.c,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.c, plugins/oss/gstosssink.c,
++ plugins/videoscale/videoscale.c, test/Makefile.am, test/mp2tomp1.c,
++ test/video2mp1.c: Fixed a few plugins so that mpeg1 encoding sorta
++ works. Added an mpeg1 encoder example, it uses the autoplugger to
++ convert the stream to audio/video, which is then fed to the
++ encoders.
++
++2001-04-21 13:43 richardb
++
++ * gst/gstplugin.c, gst/gstplugin.h, plugins/1394/gst1394.c,
++ plugins/alaw/alaw.c, plugins/alsa/alsasink.c,
++ plugins/alsa/alsasrc.c, plugins/arts/gst_arts.c,
++ plugins/artsd/artsdsink.c, plugins/au/gstparseau.c,
++ plugins/audioscale/audioscale.c, plugins/avi/gstavidecoder.c,
++ plugins/avi/gstaviencoder.c, plugins/avi/wincodec/gstwincodec.c,
++ plugins/capture/v4l/gstv4lsrc.c, plugins/cdparanoia/cdparanoia.c,
++ plugins/cobin/cobin.c, plugins/cobin/spindentity.c,
++ plugins/dvdsrc/dvdsrc.c, plugins/effects/stereo/stereo.c,
++ plugins/effects/volume/volume.c, plugins/esd/esdsink/esdsink.c,
++ plugins/filters/adder/adder.c,
++ plugins/filters/colorspace/colorspace.c,
++ plugins/filters/ladspa/gstladspa.c,
++ plugins/filters/median/median.c,
++ plugins/filters/passthrough/passthrough.c,
++ plugins/filters/smooth/smooth.c,
++ plugins/filters/stereo2mono/stereo2mono.c,
++ plugins/filters/volenv/volenv.c, plugins/flx/flx_decoder.c,
++ plugins/icecast/icecastsend/icecastsend.c, plugins/jpeg/gstjpeg.c,
++ plugins/mp3decode/mad/gstmad.c,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3decode/types/mp3types.c, plugins/mp3decode/xa/gstxa.c,
++ plugins/mp3decode/xing/gstxing.c, plugins/mp3encode/lame/gstlame.c,
++ plugins/mpeg1/mpeg1encoder/gstmpeg1encoder.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.c,
++ plugins/mpeg1/mpegtypes/mpeg1types.c,
++ plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1/system_encode/system_encode.c,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg2/ac3dec/ac3dec.c, plugins/mpeg2/ac3parse/ac3parse.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.c,
++ plugins/mpeg2/mpegtypes/mpeg2types.c,
++ plugins/mpeg2/parse/mpeg2parse.c,
++ plugins/mpeg2/subtitles/mpeg2subt.c,
++ plugins/mpeg2/video/gstmpeg2play.c,
++ plugins/mpeg2/videoparse/mp2videoparse.c, plugins/mulaw/mulaw.c,
++ plugins/oss/gstossaudio.c, plugins/rtjpeg/rtjpeg.c,
++ plugins/rtp/rtpsend/rtpsend.c, plugins/vcdsrc/vcdsrc.c,
++ plugins/videoscale/videoscale.c,
++ plugins/visualization/smoothwave/smoothwave.c,
++ plugins/visualization/spectrum/gstspectrum.c,
++ examples/plugins/example.c, gst/autoplug/gststaticautoplug.c,
++ gst/autoplug/gststaticautoplugrender.c, gst/elements/gstelements.c,
++ gst/types/gsttypes.c,
++ plugins/visualization/synaesthesia/synaesthesia.c,
++ plugins/visualization/vumeter/vumeter.c, plugins/vorbis/vorbis.c,
++ plugins/wav/gstparsewav.c, plugins/xmms/gstxmms.c,
++ plugins/xmms/gstxmmseffect.c, plugins/xvideosink/xvideosink.c: Use
++ plugin descriptions, which start with the major and minor version
++ numbers, instead of relying on each plugin to call gst_plugin_new
++ appropriately, and check the return value, and tidy up if there's a
++ failure. This seems to work fine, and factors out some code common
++ to all plugins.
++
++2001-04-21 10:30 richardb
++
++ * examples/plugins/example.c, gst/gstplugin.c, gst/gstplugin.h,
++ gst/autoplug/gststaticautoplug.c,
++ gst/autoplug/gststaticautoplugrender.c, gst/elements/gstelements.c,
++ gst/types/gsttypes.c, plugins/1394/gst1394.c, plugins/alaw/alaw.c,
++ plugins/alsa/alsasink.c, plugins/alsa/alsasrc.c,
++ plugins/arts/gst_arts.c, plugins/artsd/artsdsink.c,
++ plugins/au/gstparseau.c, plugins/audioscale/audioscale.c,
++ plugins/avi/gstavidecoder.c, plugins/avi/gstaviencoder.c,
++ plugins/avi/wincodec/gstwincodec.c,
++ plugins/capture/v4l/gstv4lsrc.c, plugins/cdparanoia/cdparanoia.c,
++ plugins/cobin/cobin.c, plugins/cobin/spindentity.c,
++ plugins/dvdsrc/dvdsrc.c, plugins/effects/stereo/stereo.c,
++ plugins/effects/volume/volume.c, plugins/esd/esdsink/esdsink.c,
++ plugins/filters/adder/adder.c,
++ plugins/filters/colorspace/colorspace.c,
++ plugins/filters/ladspa/gstladspa.c,
++ plugins/filters/median/median.c,
++ plugins/filters/passthrough/passthrough.c,
++ plugins/filters/smooth/smooth.c,
++ plugins/filters/stereo2mono/stereo2mono.c,
++ plugins/filters/volenv/volenv.c, plugins/flx/flx_decoder.c,
++ plugins/icecast/icecastsend/icecastsend.c, plugins/jpeg/gstjpeg.c,
++ plugins/mp3decode/mad/gstmad.c,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3decode/types/mp3types.c, plugins/mp3decode/xa/gstxa.c,
++ plugins/mp3decode/xing/gstxing.c, plugins/mp3encode/lame/gstlame.c,
++ plugins/mpeg1/mpeg1encoder/gstmpeg1encoder.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.c,
++ plugins/mpeg1/mpegtypes/mpeg1types.c,
++ plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1/system_encode/system_encode.c,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg2/ac3dec/ac3dec.c, plugins/mpeg2/ac3parse/ac3parse.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.c,
++ plugins/mpeg2/mpegtypes/mpeg2types.c,
++ plugins/mpeg2/parse/mpeg2parse.c,
++ plugins/mpeg2/subtitles/mpeg2subt.c,
++ plugins/mpeg2/video/gstmpeg2play.c,
++ plugins/mpeg2/videoparse/mp2videoparse.c, plugins/mulaw/mulaw.c,
++ plugins/oss/gstossaudio.c, plugins/rtjpeg/rtjpeg.c,
++ plugins/rtp/rtpsend/rtpsend.c, plugins/vcdsrc/vcdsrc.c,
++ plugins/videoscale/videoscale.c,
++ plugins/visualization/smoothwave/smoothwave.c,
++ plugins/visualization/spectrum/gstspectrum.c,
++ plugins/visualization/synaesthesia/synaesthesia.c,
++ plugins/visualization/vumeter/vumeter.c, plugins/vorbis/vorbis.c,
++ plugins/wav/gstparsewav.c, plugins/xmms/gstxmms.c,
++ plugins/xvideosink/xvideosink.c: Added first attempt at plugin
++ versioning.
++
++2001-04-21 00:20 wtay
++
++ * plugins/filters/colorspace/colorspace.c: Added more verbose
++ output for debugging purposes.
++
++2001-04-20 23:50 wtay
++
++ * plugins/xvideosink/: gstximage.c, gstxvimage.c, xvideosink.c,
++ xvideosink.h: Added proper locking around the bufferpool and the X
++ connection
++
++2001-04-20 22:41 wtay
++
++ * plugins/mp3decode/mad/gstmad.c: Removed a g_print statement
++
++2001-04-20 22:40 wtay
++
++ * plugins/mp3decode/mad/: gstmad.c, gstmad.h: Added Mad didn't take
++ the number of channels into account. Added propper TIMESTAMPS to
++ output buffers.
++
++2001-04-20 21:36 wtay
++
++ * plugins/oss/gstosssink.c: Added a sync when the device is opened
++ so that the caps negotiated parmams are set.
++
++2001-04-20 20:21 wtay
++
++ * gst/elements/: gstidentity.c, gstidentity.h: Added caps proxying
++ and bufferpool passing to identity so that -launch disksrc ! mad !
++ identity ! osssink works.
++
++2001-04-20 15:42 richardb
++
++ * plugins/oss/gstosssink.c: #ifdef out bit about AFMT_AC3, since
++ this isn't defined by the header files for older linux kernels
++ (2.0.36) (and its just INFO code, anyway)
++
++2001-04-20 13:04 thomasvs
++
++ * gst/elements/: Makefile.am, gstelements.c: update to take new
++ gstdisksink element into account
++
++2001-04-20 12:56 richardb
++
++ * gst/Makefile.am.future: Update the alternative Makefile.am for
++ gst/, which depends on automake
++ >1.4d
++
++2001-04-20 12:14 thomasvs
++
++ * gst/elements/: gstdisksink.c, gstdisksink.h: * first stab at a
++ disk sink element * no optimization, is it necessary ? * basic
++ error checking * seems to work; you can copy files by typing
++ gstreamer-launch disksrc location=test.in ! disksink
++ location=test.out * decode of mp3 to raw pcm also tested
++
++2001-04-20 00:47 omegahacker
++
++ * plugins/arts/: .cvsignore, Makefile.am, gst_arts.c, gst_arts.h,
++ gst_artsio.cc, gst_artsio.h, gst_artsio.idl, gst_artsio.mcopclass,
++ gst_artsio.mcoptype, gst_artsio_impl.cc: updated to a mostly
++ working aRts wrapper plugin, just caps issues left
++
++2001-04-19 23:25 wtay
++
++ * docs/gst/gstreamer.hierarchy, docs/gst/tmpl/gstcaps.sgml,
++ docs/gst/tmpl/gstcpu.sgml, docs/gst/tmpl/gsthttpsrc.sgml,
++ docs/gst/tmpl/gstpad.sgml, docs/gst/tmpl/gstparse.sgml,
++ docs/gst/tmpl/gstpipeline.sgml, docs/gst/tmpl/gstplugin.sgml,
++ docs/gst/tmpl/gstprops.sgml, docs/gst/tmpl/gstreamer-unused.sgml,
++ gst/gstpad.c: More API docs updates
++
++2001-04-19 23:03 omegahacker
++
++ * plugins/arts/gst_artsio_impl.cc: minor updates
++
++2001-04-19 21:42 omegahacker
++
++ * configure.in, plugins/Makefile.am, plugins/1394/.cvsignore,
++ plugins/1394/Makefile.am, plugins/1394/gst1394.c,
++ plugins/1394/gst1394.h: First pass at 1394 source. Arguments need
++ to be added, etc. But it works.
++
++2001-04-19 17:40 omegahacker
++
++ * plugins/arts/gst_arts.c: updated to latest padtemplate code
++
++2001-04-19 10:27 thomasvs
++
++ * plugins/filters/adder/adder.c: * a little cleanup
++
++2001-04-19 01:23 omegahacker
++
++ * configure.in, plugins/Makefile.am: better (not complete, afaict)
++ checking for arts
++
++2001-04-19 00:25 omegahacker
++
++ * plugins/arts/: Makefile.am, gst_arts.c, gst_arts.h,
++ gst_artsio.cc, gst_artsio.h, gst_artsio.idl, gst_artsio.mcopclass,
++ gst_artsio.mcoptype, gst_artsio_impl.cc: first pass at a gstreamer
++ arts plugin doesn't compile yet
++
++2001-04-18 23:00 wtay
++
++ * plugins/xvideosink/xvideosink.c: Removed stupid g_print
++ statements.
++
++2001-04-18 22:59 wtay
++
++ * plugins/: mpeg2/mpeg2dec/gstmpeg2dec.c, xvideosink/xvideosink.c:
++ Fixed a stupid bug in the mpeg2dec bufferpool handling. Make an
++ XvImage and XImage pool in xvideosink. Together these changes give
++ an 80% speedup on mpeg2 playback (rough estimate)
++
++2001-04-18 21:16 wtay
++
++ * docs/gst/tmpl/: gstbin.sgml, gstbuffer.sgml, gstbufferpool.sgml,
++ gstcaps.sgml, gstreamer-unused.sgml: Added more API docs to
++ Autoplug, Buffer, Bin, BufferPool. Fixed some compile problems
++ with videosink
++
++2001-04-18 17:08 thomasvs
++
++ * examples/mixer/mixer.c: * mixer now works with variable inputs *
++ mixer creates custom volume envelopes allowing each song to play
++ alone and end with a mix of all of them, undistorted
++
++2001-04-18 15:50 thomasvs
++
++ * plugins/filters/volenv/filter.func: made errors more descriptive
++
++2001-04-18 15:04 thomasvs
++
++ * examples/mixer/mixer.c: * cleaned up some code and integrated
++ with new adder (mixer now works with different types of files)
++
++2001-04-18 15:03 thomasvs
++
++ * plugins/filters/adder/: adder.c, adder.h: changed adder to work
++ with variable length input data buffers
++
++2001-04-17 22:17 thomasvs
++
++ * examples/mixer/: mixer.c, mixer.h: changed mixer to work by
++ autoplugging the input channels (not very useful yet, since the
++ input buffers to volenv have different sizes)
++
++2001-04-17 22:14 wtay
++
++ * configure.in, docs/gst/gstreamer-sections.txt,
++ docs/gst/gstreamer.hierarchy, docs/gst/tmpl/gst.sgml,
++ docs/gst/tmpl/gstautoplug.sgml, docs/gst/tmpl/gstbin.sgml,
++ docs/gst/tmpl/gstbuffer.sgml, docs/gst/tmpl/gstcaps.sgml,
++ docs/gst/tmpl/gstfakesink.sgml, docs/gst/tmpl/gsthttpsrc.sgml,
++ docs/gst/tmpl/gstpad.sgml, docs/gst/tmpl/gstprops.sgml,
++ docs/gst/tmpl/gstreamer-unused.sgml, gst/gstcaps.c,
++ gst/gstobject.c, gst/gstpad.c, testsuite/capsnego/capsnego.c,
++ testsuite/capsnego/converter.c, testsuite/capsnego/converter2.c,
++ testsuite/capsnego/enum.c: The first wave of docs updates Added a
++ little more comments about the API usage in the api docs. Some
++ fixes for the capsnego testsuite.
++
++2001-04-17 22:03 wtay
++
++ * tests/: Makefile.am, autoplug3.c, autoplug4.c: Autoplug3 shows an
++ example of an autoplugged mp3 player. Autoplug4 shows various
++ static autoplugger examples.
++
++2001-04-17 18:48 thomasvs
++
++ * examples/mixer/mixer.h: header for mixer.c, containing
++ input_pipe_t
++
++2001-04-17 18:47 thomasvs
++
++ * examples/mixer/mixer.c: added a struct to set up input channels
++
++2001-04-17 16:32 thomasvs
++
++ * plugins/filters/volenv/: filter.func, volenv.c: * fixed problem
++ with starting rise calculation * cleaned up some debug info *
++ started wondering if it really is a good idea to #include the
++ actual filter now that's it's grown so large, but decided it
++ wasn't worth the effort now anyway
++
++2001-04-17 14:36 thomasvs
++
++ * configure.in: added mixer example and adder plugin to
++ configure.in
++
++2001-04-17 06:24 omegahacker
++
++ * gst/: Makefile.am, autoplug/Makefile.am, elements/Makefile.am,
++ types/Makefile.am: finished change to GST_ macros
++
++2001-04-17 03:19 omegahacker
++
++ * configure.in, gst/.cvsignore, gst/Makefile.am, gst/gst.h,
++ gst/gstversion.h.in: added gstversion.h
++
++2001-04-17 02:32 omegahacker
++
++ * gstreamer.pc.in: file gstreamer.pc.in was initially added on
++ branch BRANCH-INCSCHED1.
++
++2001-04-17 02:32 omegahacker
++
++ * gstreamer.pc.in: added pkg-config file
++
++2001-04-17 00:17 omegahacker
++
++ * gst/autoplug/: Makefile.am, gststaticautoplug.c,
++ gststaticautoplug.h, gststaticautoplugrender.c,
++ gststaticautoplugrender.h: brought in autoplug dir from HEAD after
++ screwed up merge
++
++2001-04-17 00:17 wtay
++
++ * plugins/: filters/colorspace/colorspace.c,
++ filters/colorspace/colorspace.h, mpeg2/mpeg2dec/gstmpeg2dec.c,
++ mpeg2/mpeg2dec/gstmpeg2dec.h, xvideosink/gstximage.h,
++ xvideosink/gstxvimage.h, xvideosink/xvideosink.c,
++ xvideosink/xvideosink.h: Added bufferpools to mpeg2dec and
++ xvideosink. Modified colorspace to draw straight into a bufferpool
++ buffer when possible.
++
++2001-04-16 22:48 wtay
++
++ * tests/: Makefile.am, padfactory.c: Updated the padfactory test
++ code.
++
++2001-04-16 22:45 wtay
++
++ * gst/: gstbuffer.h, gstcaps.c, gstcaps.h, gstpad.c, gstpad.h,
++ gstqueue.c: Added 1337 macros to create padtemplates and
++ capstemplates. Added some code for bufferpools
++
++2001-04-16 22:43 omegahacker
++
++ * AUTHORS, Makefile.am, REQUIREMENTS, acconfig.h, configure.in,
++ gstreamer-config.1, gstreamer-config.in, gstreamer.m4,
++ gstreamer.spec.in, components/bonobo-gstmediaplay/Makefile.am,
++ components/bonobo-gstmediaplay/bonobo-gstmediaplay.c,
++ debian/.cvsignore, debian/Makefile.am, debian/README.Debian,
++ debian/changelog, debian/control, debian/copyright,
++ debian/gsteditor.files, debian/gsteditor.manpages,
++ debian/gsteditor.menu, debian/gstmediaplay.files,
++ debian/gstmediaplay.manpages, debian/gstmediaplay.menu,
++ debian/gstreamer-alsa.files, debian/gstreamer-cdparanoia.files,
++ debian/gstreamer-common.files, debian/gstreamer-doc.files,
++ debian/gstreamer-elements.files, debian/gstreamer-esd.files,
++ debian/gstreamer-lame.files, debian/gstreamer-mpeg2dec.files,
++ debian/gstreamer-mpg123.files,
++ debian/gstreamer-plugin-template.postinst,
++ debian/gstreamer-plugin-template.prerm,
++ debian/gstreamer-runtime.files, debian/gstreamer-runtime.manpages,
++ debian/gstreamer-runtime.postinst, debian/gstreamer-tools.files,
++ debian/gstreamer-tools.manpages, debian/gstreamer-vorbis.files,
++ debian/libgst-dev.files, debian/libgst-dev.manpages,
++ debian/libgst0.files, debian/libgst0.postinst,
++ debian/libgsteditor-dev.files, debian/libgsteditor0.files,
++ debian/libgsteditor0.postinst, debian/libgstmediaplay-dev.files,
++ debian/libgstmediaplay0.files, debian/libgstmediaplay0.postinst,
++ debian/rules, docs/Makefile.am, docs/fwg/Makefile.am,
++ docs/fwg/concepts.sgml, docs/fwg/firstplugin.sgml,
++ docs/fwg/gst-plugin-writers-guide.sgml, docs/fwg/testapp.sgml,
++ docs/fwg/titlepage.sgml, docs/fwg/typesnprops.sgml,
++ docs/gst/Makefile.am, docs/gst/gstreamer-docs.sgml,
++ docs/gst/gstreamer-sections.txt, docs/gst/gstreamer.hierarchy,
++ docs/gst/gstreamer.types.in, docs/gst/tmpl/audioraw.sgml,
++ docs/gst/tmpl/gstarch.sgml, docs/gst/tmpl/gstasyncdisksrc.sgml,
++ docs/gst/tmpl/gstaudiosink.sgml, docs/gst/tmpl/gstaudiosrc.sgml,
++ docs/gst/tmpl/gstautoplug.sgml, docs/gst/tmpl/gstbuffer.sgml,
++ docs/gst/tmpl/gstcaps.sgml, docs/gst/tmpl/gstcpu.sgml,
++ docs/gst/tmpl/gstdisksrc.sgml, docs/gst/tmpl/gstelement.sgml,
++ docs/gst/tmpl/gstmultidisksrc.sgml, docs/gst/tmpl/gstobject.sgml,
++ docs/gst/tmpl/gstpad.sgml, docs/gst/tmpl/gstpipeline.sgml,
++ docs/gst/tmpl/gstplugin.sgml, docs/gst/tmpl/gstprops.sgml,
++ docs/gst/tmpl/gstreamer-unused.sgml, docs/gst/tmpl/gstsinesrc.sgml,
++ docs/gst/tmpl/gststaticautoplug.sgml,
++ docs/gst/tmpl/gststaticautoplugrender.sgml,
++ docs/gst/tmpl/gstutils.sgml, docs/gst/tmpl/videoraw.sgml,
++ docs/libs/.cvsignore, docs/manual/Makefile.am,
++ docs/manual/bins.sgml, docs/manual/debugging.sgml,
++ docs/manual/dynamic.sgml, docs/manual/gstreamer-manual.sgml,
++ docs/manual/helloworld.sgml, docs/manual/helloworld2.sgml,
++ docs/manual/pads.sgml, docs/manual/plugins.sgml,
++ docs/manual/queues.sgml, docs/manual/quotes.sgml,
++ docs/manual/threads.sgml, docs/manual/typedetection.sgml,
++ docs/manual/xml.sgml, docs/plugins/Makefile.am,
++ docs/plugins/gstdoc-scanobj, docs/plugins/tmpl/ac3parse.sgml,
++ docs/plugins/tmpl/audioscale.sgml,
++ docs/plugins/tmpl/gstaviencoder.sgml,
++ docs/plugins/tmpl/gstmpeg2enc.sgml,
++ docs/plugins/tmpl/gstmpeg2play.sgml,
++ docs/plugins/tmpl/gstmpeg_play.sgml,
++ docs/plugins/tmpl/gstreamer-plugins-unused.sgml,
++ docs/plugins/tmpl/gstspectrum.sgml,
++ docs/plugins/tmpl/gstv4lsrc.sgml, docs/plugins/tmpl/gstwindec.sgml,
++ docs/plugins/tmpl/gstwinenc.sgml, docs/plugins/tmpl/median.sgml,
++ docs/plugins/tmpl/mp3parse.sgml, docs/plugins/tmpl/mpeg1parse.sgml,
++ docs/plugins/tmpl/mpeg2parse.sgml,
++ docs/plugins/tmpl/mpeg2subt.sgml, docs/plugins/tmpl/smooth.sgml,
++ docs/plugins/tmpl/smoothwave.sgml, docs/plugins/tmpl/stereo.sgml,
++ docs/plugins/tmpl/synaesthesia.sgml,
++ docs/plugins/tmpl/system_encode.sgml,
++ docs/plugins/tmpl/videoscale.sgml,
++ docs/plugins/tmpl/videosink.sgml, docs/plugins/tmpl/volume.sgml,
++ docs/plugins/tmpl/vumeter.sgml, docs/random/NOTES-0.1.1,
++ docs/random/caps.dia, docs/random/hierarchy,
++ docs/random/plugins.dia, docs/random/omega/eos,
++ docs/random/omega/eos.old, docs/random/wtay/autoplug2,
++ docs/random/wtay/caps-negociation, docs/random/wtay/capsnego-cases,
++ editor/Makefile.am, editor/gsteditor.1, editor/gsteditor.h,
++ editor/gsteditorproperty.c, examples/Makefile.am,
++ examples/autoplug/.cvsignore, examples/autoplug/autoplug.c,
++ examples/helloworld/helloworld.c,
++ examples/helloworld2/helloworld2.c, examples/launch/mp3play,
++ examples/plugins/example.c, examples/plugins/example.h,
++ examples/queue/queue.c, examples/queue2/queue2.c,
++ examples/queue3/queue3.c, examples/queue4/queue4.c,
++ examples/thread/thread.c, examples/typefind/.cvsignore,
++ examples/xml/createxml.c, examples/xml/runxml.c, gst/Makefile.am,
++ gst/Makefile.am.future, gst/cothreads.c, gst/gst.c, gst/gst.h,
++ gst/gstarch.h, gst/gstautoplug.c, gst/gstautoplug.h, gst/gstbin.c,
++ gst/gstbuffer.c, gst/gstcaps.c, gst/gstcaps.h, gst/gstcpu.c,
++ gst/gstcpu.h, gst/gstelement.c, gst/gstelement.h,
++ gst/gstelementfactory.c, gst/gstinfo.c, gst/gstinfo.h,
++ gst/gstobject.c, gst/gstpad.c, gst/gstpad.h, gst/gstparse.c,
++ gst/gstpipeline.c, gst/gstpipeline.h, gst/gstplugin.c,
++ gst/gstplugin.h, gst/gstprops.c, gst/gstprops.h,
++ gst/gstpropsprivate.h, gst/gstqueue.c, gst/gstscheduler.c,
++ gst/gstsparc.h, gst/gstthread.c, gst/gsttype.c, gst/gsttype.h,
++ gst/gsttypefind.c, gst/gstutils.c, gst/gstutils.h,
++ gst/elements/Makefile.am, gst/elements/gstaudiosink.c,
++ gst/elements/gstaudiosink.h, gst/elements/gstaudiosrc.c,
++ gst/elements/gstaudiosrc.h, gst/elements/gstdisksrc.c,
++ gst/elements/gstelements.c, gst/elements/gstmultidisksrc.c,
++ gst/elements/gstmultidisksrc.h, gst/elements/gstsinesrc.c,
++ gst/elements/gstsinesrc.h, gst/elements/gsttee.c,
++ gst/types/gsttypes.c, gstplay/Makefile.am, gstplay/callbacks.c,
++ gstplay/gstmediaplay.1, gstplay/gstmediaplay.c,
++ gstplay/gstmediaplay.glade, gstplay/gstplay.c, gstplay/gstplay.h,
++ gstplay/gstplayprivate.h, include/Makefile.am, include/avifmt.h,
++ include/default.h, include/registry.h, libs/Makefile.am,
++ libs/getbits/gstgetbits.c, libs/getbits/gstgetbits.h,
++ libs/getbits/gstgetbits_inl.h, libs/idct/gstidct.c,
++ plugins/Makefile.am, plugins/alaw/Makefile.am,
++ plugins/alaw/alaw-conversion.c, plugins/alaw/alaw-conversion.h,
++ plugins/alaw/alaw-decode.c, plugins/alaw/alaw-decode.h,
++ plugins/alaw/alaw-encode.c, plugins/alaw/alaw-encode.h,
++ plugins/alaw/alaw.c, plugins/alaw/mulaw-conversion.c,
++ plugins/alaw/mulaw-conversion.h, plugins/alsa/.cvsignore,
++ plugins/alsa/Makefile.am, plugins/alsa/README, plugins/alsa/alsa.h,
++ plugins/alsa/alsa_common.c, plugins/alsa/alsainfo.c,
++ plugins/alsa/alsasink.c, plugins/alsa/alsasrc.c,
++ plugins/artsd/.cvsignore, plugins/artsd/Makefile.am,
++ plugins/artsd/REQUIREMENTS, plugins/artsd/artsdsink.c,
++ plugins/artsd/artsdsink.h, plugins/au/gstparseau.c,
++ plugins/au/gstparseau.h, plugins/audioscale/audioscale.c,
++ plugins/audioscale/audioscale.h, plugins/avi/audiocodecs.c,
++ plugins/avi/gstavidecoder.c, plugins/avi/gstavidecoder.h,
++ plugins/avi/gstaviencoder.c, plugins/avi/gstaviencoder.h,
++ plugins/avi/playcodecs.c, plugins/avi/wincodec/Makefile.am,
++ plugins/avi/wincodec/gstwincodec.c,
++ plugins/avi/wincodec/gstwincodec.h,
++ plugins/avi/wincodec/gstwindec.c, plugins/avi/wincodec/gstwindec.h,
++ plugins/avi/wincodec/gstwinenc.c, plugins/avi/wincodec/gstwinenc.h,
++ plugins/capture/v4l/grab.h, plugins/capture/v4l/gstv4lsrc.c,
++ plugins/capture/v4l/gstv4lsrc.h, plugins/cdparanoia/cdparanoia.c,
++ plugins/effects/stereo/stereo.c, plugins/effects/stereo/stereo.h,
++ plugins/effects/volume/volume.c, plugins/effects/volume/volume.h,
++ plugins/esd/esdsink/esdsink.c, plugins/filters/Makefile.am,
++ plugins/filters/filterstamp.README, plugins/filters/filterstamp.sh,
++ plugins/filters/colorspace/.cvsignore,
++ plugins/filters/colorspace/Makefile.am,
++ plugins/filters/colorspace/colorspace.c,
++ plugins/filters/colorspace/colorspace.h,
++ plugins/filters/colorspace/yuv2rgb.c,
++ plugins/filters/colorspace/yuv2rgb.h,
++ plugins/filters/colorspace/yuv2rgb_mmx16.s,
++ plugins/filters/ladspa/gstladspa.c,
++ plugins/filters/median/median.c, plugins/filters/median/median.h,
++ plugins/filters/passthrough/.cvsignore,
++ plugins/filters/passthrough/Makefile.am,
++ plugins/filters/passthrough/filter.func,
++ plugins/filters/passthrough/passthrough.c,
++ plugins/filters/passthrough/passthrough.h,
++ plugins/filters/smooth/smooth.c, plugins/filters/smooth/smooth.h,
++ plugins/filters/stereo2mono/Makefile.am,
++ plugins/filters/stereo2mono/stereo2mono.c,
++ plugins/filters/stereo2mono/stereo2mono.h,
++ plugins/filters/volenv/.cvsignore,
++ plugins/filters/volenv/Makefile.am,
++ plugins/filters/volenv/filter.func,
++ plugins/filters/volenv/volenv.c, plugins/filters/volenv/volenv.h,
++ plugins/flx/Makefile.am, plugins/flx/flx_color.c,
++ plugins/flx/flx_color.h, plugins/flx/flx_decoder.c,
++ plugins/flx/flx_decoder.h, plugins/flx/flx_fmt.h,
++ plugins/icecast/icecastsend/icecastsend.c, plugins/jpeg/gstjpeg.c,
++ plugins/jpeg/gstjpegdec.c, plugins/jpeg/gstjpegdec.h,
++ plugins/jpeg/gstjpegenc.c, plugins/jpeg/gstjpegenc.h,
++ plugins/mp3decode/Makefile.am, plugins/mp3decode/mad/.cvsignore,
++ plugins/mp3decode/mad/Makefile.am, plugins/mp3decode/mad/gstmad.c,
++ plugins/mp3decode/mad/gstmad.h,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/mpg123/gstmpg123.h,
++ plugins/mp3decode/mpg123/layer1.c,
++ plugins/mp3decode/mpg123/layer3.c,
++ plugins/mp3decode/mpg123/mpg123.c,
++ plugins/mp3decode/mpg123/tabinit.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3decode/types/mp3types.c,
++ plugins/mp3encode/lame/gstlame.c, plugins/mp3encode/lame/gstlame.h,
++ plugins/mpeg1/mpeg1encoder/gstmpeg1encoder.c,
++ plugins/mpeg1/mpeg1encoder/gstmpeg1encoder.h,
++ plugins/mpeg1/mpeg_play/Makefile.am,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.h,
++ plugins/mpeg1/mpeg_play/recon_mmxe.s,
++ plugins/mpeg1/mpeg_play/recon_sse.s,
++ plugins/mpeg1/mpeg_play/video.c,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.h,
++ plugins/mpeg1/mpegtypes/mpeg1types.c,
++ plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg2/Makefile.am, plugins/mpeg2/ac3dec/ac3dec.c,
++ plugins/mpeg2/ac3dec/ac3dec.h, plugins/mpeg2/ac3dec/cpu_accel.c,
++ plugins/mpeg2/ac3dec/decode.c, plugins/mpeg2/ac3parse/ac3parse.c,
++ plugins/mpeg2/mpeg2dec/Makefile.am,
++ plugins/mpeg2/mpeg2dec/attributes.h,
++ plugins/mpeg2/mpeg2dec/decode.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.h,
++ plugins/mpeg2/mpeg2dec/header.c, plugins/mpeg2/mpeg2dec/header.h,
++ plugins/mpeg2/mpeg2dec/idct.c, plugins/mpeg2/mpeg2dec/idct.h,
++ plugins/mpeg2/mpeg2dec/idct_mlib.c,
++ plugins/mpeg2/mpeg2dec/idct_mmx.c,
++ plugins/mpeg2/mpeg2dec/idct_mmx.h,
++ plugins/mpeg2/mpeg2dec/mm_accel.h,
++ plugins/mpeg2/mpeg2dec/motion_comp.c,
++ plugins/mpeg2/mpeg2dec/motion_comp.h,
++ plugins/mpeg2/mpeg2dec/motion_comp_mlib.c,
++ plugins/mpeg2/mpeg2dec/motion_comp_mmx.c,
++ plugins/mpeg2/mpeg2dec/motion_comp_sse.s,
++ plugins/mpeg2/mpeg2dec/mpeg2.h,
++ plugins/mpeg2/mpeg2dec/mpeg2_internal.h,
++ plugins/mpeg2/mpeg2dec/output_video.h,
++ plugins/mpeg2/mpeg2dec/slice.c, plugins/mpeg2/mpeg2dec/slice.h,
++ plugins/mpeg2/mpeg2dec/stats.c, plugins/mpeg2/mpeg2dec/vlc.h,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.c,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.h,
++ plugins/mpeg2/mpegtypes/mpeg2types.c,
++ plugins/mpeg2/parse/mpeg2parse.c, plugins/mpeg2/video/Makefile.am,
++ plugins/mpeg2/video/gstmpeg2play.c,
++ plugins/mpeg2/video/gstmpeg2play.h, plugins/mpeg2/video/recon.c,
++ plugins/mpeg2/video/recon_mmxe.s, plugins/mpeg2/video/recon_sse.s,
++ plugins/mpeg2/videoparse/mp2videoparse.c,
++ plugins/mulaw/Makefile.am, plugins/mulaw/mulaw-conversion.c,
++ plugins/mulaw/mulaw-conversion.h, plugins/mulaw/mulaw-decode.c,
++ plugins/mulaw/mulaw-decode.h, plugins/mulaw/mulaw-encode.c,
++ plugins/mulaw/mulaw-encode.h, plugins/mulaw/mulaw.c,
++ plugins/oss/.cvsignore, plugins/oss/Makefile.am,
++ plugins/oss/gstossaudio.c, plugins/oss/gstosssink.c,
++ plugins/oss/gstosssink.h, plugins/oss/gstosssrc.c,
++ plugins/oss/gstosssrc.h, plugins/rtjpeg/RTjpeg.h,
++ plugins/rtp/Makefile.am, plugins/rtp/rtpsend/.cvsignore,
++ plugins/rtp/rtpsend/Makefile.am, plugins/rtp/rtpsend/rtp.c,
++ plugins/rtp/rtpsend/rtp.h, plugins/rtp/rtpsend/rtpsend.c,
++ plugins/rtp/rtpsend/rtpsend.h, plugins/videoscale/videoscale.c,
++ plugins/videoscale/videoscale.h,
++ plugins/visualization/smoothwave/smoothwave.h,
++ plugins/visualization/spectrum/gstspectrum.c,
++ plugins/visualization/spectrum/gstspectrum.h,
++ plugins/visualization/synaesthesia/synaesthesia.c,
++ plugins/visualization/synaesthesia/synaesthesia.h,
++ plugins/visualization/vumeter/vumeter.c,
++ plugins/visualization/vumeter/vumeter.h, plugins/vorbis/vorbis.c,
++ plugins/vorbis/vorbisdec.c, plugins/wav/Makefile.am,
++ plugins/wav/gstparsewav.c, plugins/wav/gstparsewav.h,
++ plugins/wav/gstriff.c, plugins/xmms/.cvsignore,
++ plugins/xmms/Makefile.am, plugins/xmms/effect.h,
++ plugins/xmms/general.h, plugins/xmms/gstxmms.c,
++ plugins/xmms/gstxmms.h, plugins/xmms/gstxmmseffect.c,
++ plugins/xmms/gstxmmseffect.h, plugins/xmms/gstxmmsinput.c,
++ plugins/xmms/gstxmmsinput.h, plugins/xmms/input.h,
++ plugins/xmms/main.h, plugins/xmms/output.h,
++ plugins/xmms/pluginenum.c, plugins/xmms/pluginenum.h,
++ plugins/xmms/visualization.h, plugins/xmms/xmms.h,
++ plugins/xvideosink/.cvsignore, plugins/xvideosink/Makefile.am,
++ plugins/xvideosink/gstximage.c, plugins/xvideosink/gstximage.h,
++ plugins/xvideosink/gstxvimage.c, plugins/xvideosink/gstxvimage.h,
++ plugins/xvideosink/gstxwindow.c, plugins/xvideosink/gstxwindow.h,
++ plugins/xvideosink/imagetest.c, plugins/xvideosink/xvideosink.c,
++ plugins/xvideosink/xvideosink.h, test/.cvsignore, test/Makefile.am,
++ test/a.c, test/ac3play.c, test/aviparse.c, test/m.c, test/mcut.c,
++ test/mp1parse.c, test/mp1tomp1.c, test/mp2toavi.c, test/mp2tomp1.c,
++ test/mp3.c, test/mp3play.c, test/mpeg2parse.c, test/mpeg2parse2.c,
++ test/mpg123.c, test/p.c, test/qtest.c, test/r.c, test/record.c,
++ test/s.c, test/spectrum.c, test/typefind.c, test/vidcapture.c,
++ test/vidcapture2.c, test/videotest.c, test/videotest2.c, test/w.c,
++ test/xmmstest.c, test/xml/readreg.c, tests/.cvsignore,
++ tests/Makefile.am, tests/autoplug.c, tests/autoplug2.c,
++ tests/autoplug3.c, tests/caps.c, tests/capsconnect.c,
++ tests/paranoia.c, tests/props.c, tests/nego/.cvsignore,
++ tests/nego/Makefile.am, tests/nego/nego1.c, testsuite/Makefile.am,
++ testsuite/test_gst_init.c, testsuite/capsnego/.cvsignore,
++ testsuite/capsnego/Makefile.am, testsuite/capsnego/capsnego.c,
++ testsuite/capsnego/converter.c, testsuite/capsnego/converter2.c,
++ testsuite/capsnego/enum.c, tools/Makefile.am, tools/README,
++ tools/gstreamer-inspect.1, tools/gstreamer-inspect.c,
++ tools/gstreamer-launch.1, tools/gstreamer-launch.c,
++ tools/gstreamer-register.1: Merged HEAD from
++ BRANCH-INCSCHED1-200104161 into BRANCH-INCSCHED1.
++
++2001-04-16 22:33 wtay
++
++ * test/: Makefile.am, mp3mad.c: Added an test program for the mad
++ mp3 decoder.
++
++2001-04-16 20:41 thomasvs
++
++ * plugins/filters/adder/adder.c: commented some debug info to get a
++ clean output
++
++2001-04-16 20:38 thomasvs
++
++ * examples/mixer/mixer.c: changed volume envelope; should do a nice
++ transition between both songs now
++
++2001-04-16 20:11 thomasvs
++
++ * plugins/filters/volenv/volenv.c: removed example volume envelope
++ registration plugin now accepts both a volume envelope (before
++ start) or direct argument setting
++
++2001-04-16 18:36 omegahacker
++
++ * plugins/mp3decode/mad/gstmad.c: added code to deal with either
++ 0.12 or 0.13 of libmad
++
++2001-04-16 17:45 wtay
++
++ * gst/elements/: gstfakesink.c, gstfakesink.h: Added an arg to
++ fakesink so that it doesn't printf.
++
++2001-04-16 17:34 wtay
++
++ * examples/: autoplug/autoplug.c, mixer/.cvsignore,
++ mixer/Makefile.am, mixer/mixer.c: Added an example audio mixer.
++
++2001-04-16 17:30 wtay
++
++ * plugins/filters/: adder/.cvsignore, adder/Makefile.am,
++ adder/adder.c, adder/adder.h, colorspace/colorspace.c: Added the
++ audio mixer from Thomas Vander Stichele
++
++2001-04-16 11:55 wtay
++
++ * examples/autoplug/autoplug.c: Add the xvideosink to the example.
++
++2001-04-16 01:59 wtay
++
++ * plugins/filters/volenv/: filter.func, volenv.c: More volenv
++ updates
++
++2001-04-16 00:59 omegahacker
++
++ * gst/gstbin.c, gst/gstscheduler.c, gst/gstthread.c,
++ gst/elements/gstidentity.c, tests/threadlock.c: latest updates,
++ things are very close to working
++
++2001-04-16 00:44 wtay
++
++ * plugins/filters/colorspace/: Makefile.am, colorspace.c,
++ yuv2rgb.h: Don't compile the asm on non x86 machines. Added a
++ header file that will soon be part of the C fallback code..
++
++2001-04-16 00:12 wtay
++
++ * gst/gstinfo.c: Added missing category strings...
++
++2001-04-16 00:05 wtay
++
++ * plugins/esd/esdsink/esdsink.c: fixed the audio caps to the latest
++ standard.
++
++2001-04-15 23:54 omegahacker
++
++ * tools/gstreamer-launch.c: save xml file of the launch cmdline
++
++2001-04-15 23:54 omegahacker
++
++ * gst/gstelement.h: added comment about missing flag
++
++2001-04-15 23:53 omegahacker
++
++ * gstreamer.spec.in: run gstreamer-register on postinstall
++
++2001-04-15 23:52 omegahacker
++
++ * gst/autoplug/: gststaticautoplug.c, gststaticautoplugrender.c:
++ changed some INFOs to DEBUGs
++
++2001-04-15 23:29 wtay
++
++ * configure.in: Added the volenv/passthrough plugin Makefiles
++
++2001-04-15 23:20 wtay
++
++ * plugins/filters/: passthrough/.cvsignore,
++ passthrough/passthrough.c, volenv/.cvsignore, volenv/Makefile.am,
++ volenv/filter.func, volenv/volenv.c, volenv/volenv.h: Modified the
++ passthrough filter with the new caps API Added the volume envelope
++ filter
++
++2001-04-15 16:30 wtay
++
++ * plugins/filters/: filterstamp.README, filterstamp.sh,
++ passthrough/Makefile.am, passthrough/filter.func,
++ passthrough/passthrough.c, passthrough/passthrough.h: Added a
++ little script to create an audio filter plugin template (provided
++ by Thomas Vander Stichele)
++
++2001-04-15 15:42 wtay
++
++ * plugins/icecast/icecastsend/icecastsend.c: Updated the icecast
++ plugin
++
++2001-04-15 15:29 wtay
++
++ * acconfig.h, configure.in, plugins/filters/Makefile.am,
++ plugins/filters/colorspace/colorspace.c,
++ plugins/mp3decode/Makefile.am, plugins/mp3decode/mad/.cvsignore,
++ plugins/mp3decode/mad/Makefile.am, plugins/mp3decode/mad/gstmad.c,
++ plugins/mp3decode/mad/gstmad.h, plugins/vorbis/vorbisdec.c,
++ test/xmmstest.c: Added the mad mp3 decoder. Added flushing to the
++ vorbis decoder. Updated configure.in to check for Hermes and
++ libmad
++
++2001-04-15 02:02 wtay
++
++ * gst/gstprops.c: Fixed the gfloat error in the va_arg code.
++
++2001-04-14 19:56 wtay
++
++ * docs/gst/gstreamer-sections.txt, docs/gst/tmpl/gstcaps.sgml,
++ docs/gst/tmpl/gstpad.sgml, docs/gst/tmpl/gstprops.sgml,
++ docs/gst/tmpl/gstreamer-unused.sgml, docs/gst/tmpl/videoraw.sgml,
++ editor/gsteditorproperty.c, examples/plugins/example.c,
++ gst/gstcaps.c, gst/gstcaps.h, gst/gstpad.c, gst/gstpad.h,
++ gst/gstplugin.c, gst/gstprops.c, gst/gstprops.h,
++ gst/elements/gsttee.c, gstplay/Makefile.am, gstplay/gstplay.c,
++ plugins/alaw/alaw.c, plugins/alsa/alsa.h,
++ plugins/alsa/alsa_common.c, plugins/alsa/alsasink.c,
++ plugins/alsa/alsasrc.c, plugins/artsd/artsdsink.c,
++ plugins/au/gstparseau.c, plugins/audioscale/audioscale.c,
++ plugins/avi/audiocodecs.c, plugins/avi/gstavidecoder.c,
++ plugins/avi/gstaviencoder.c, plugins/avi/wincodec/gstwincodec.c,
++ plugins/avi/wincodec/gstwindec.c, plugins/capture/v4l/gstv4lsrc.c,
++ plugins/cdparanoia/cdparanoia.c, plugins/esd/esdsink/esdsink.c,
++ plugins/filters/colorspace/colorspace.c,
++ plugins/filters/colorspace/yuv2rgb.c,
++ plugins/filters/stereo2mono/stereo2mono.c,
++ plugins/flx/flx_decoder.c, plugins/jpeg/gstjpeg.c,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3decode/types/mp3types.c,
++ plugins/mp3encode/lame/gstlame.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpegtypes/mpeg1types.c,
++ plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg2/ac3dec/ac3dec.c, plugins/mpeg2/ac3parse/ac3parse.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c,
++ plugins/mpeg2/mpegtypes/mpeg2types.c,
++ plugins/mpeg2/parse/mpeg2parse.c,
++ plugins/mpeg2/video/gstmpeg2play.c,
++ plugins/mpeg2/videoparse/mp2videoparse.c, plugins/mulaw/mulaw.c,
++ plugins/oss/gstosssink.c, plugins/rtp/rtpsend/rtpsend.c,
++ plugins/visualization/synaesthesia/synaesthesia.c,
++ plugins/visualization/vumeter/vumeter.c, plugins/vorbis/vorbis.c,
++ plugins/vorbis/vorbisdec.c, plugins/wav/gstriff.c,
++ plugins/xmms/gstxmmseffect.c, plugins/xmms/gstxmmsinput.c,
++ plugins/xvideosink/gstxvimage.c, plugins/xvideosink/xvideosink.c,
++ tests/autoplug.c, tests/autoplug2.c, tests/autoplug3.c,
++ tests/caps.c, tests/props.c, tools/gstreamer-inspect.c: A rather
++ large patch: - changed the API for the padtemplates: - remove
++ the factories (array of pointers) for the padtemplates,
++ properties and caps. The static array was a nice idea but
++ converting all the property values to a gpointer was not a
++ good idea. float properties were not possible, and casting
++ a gint to a pointer is not very portable. The new API just
++ uses the _padtemplate_new, _caps_new and _props_new
++ functions to create the templates. This has the added
++ benefit that the API is now uniform for static and dynamic
++ templates and that the code can be made cleaner. - lots of
++ cleanups in the way the capabilities are constructed (va_list)
++ - lots of updates for all the plugins (new API) - docs updates
++ (new API) - removed the videoraw docs.
++
++2001-04-12 19:11 wtay
++
++ * components/bonobo-gstmediaplay/Makefile.am,
++ components/bonobo-gstmediaplay/bonobo-gstmediaplay.c,
++ docs/gst/Makefile.am, docs/gst/gstreamer-sections.txt,
++ docs/gst/tmpl/gstpad.sgml, docs/gst/tmpl/gstreamer-unused.sgml,
++ examples/helloworld/helloworld.c, gst/gstcaps.h, gst/gstinfo.h,
++ gst/gstpad.c, gst/gstpad.h, gst/gstprops.c, gst/gstqueue.c,
++ gst/autoplug/gststaticautoplugrender.c, gstplay/gstplay.c,
++ gstplay/gstplayprivate.h, libs/idct/gstidct.c,
++ plugins/artsd/Makefile.am, plugins/avi/gstavidecoder.c,
++ plugins/avi/playcodecs.c, plugins/avi/wincodec/gstwincodec.c,
++ plugins/avi/wincodec/gstwindec.c, plugins/filters/Makefile.am,
++ plugins/filters/colorspace/Makefile.am,
++ plugins/filters/colorspace/colorspace.c,
++ plugins/filters/colorspace/colorspace.h,
++ plugins/filters/colorspace/yuv2rgb_mmx16.s,
++ plugins/filters/stereo2mono/stereo2mono.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/video.c, plugins/mpeg2/ac3dec/ac3dec.c,
++ plugins/mpeg2/ac3dec/decode.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c, plugins/oss/gstosssink.c,
++ plugins/xvideosink/gstxvimage.c, plugins/xvideosink/gstxwindow.c,
++ plugins/xvideosink/gstxwindow.h, plugins/xvideosink/xvideosink.c,
++ plugins/xvideosink/xvideosink.h, test/mpeg2parse2.c: Lots of
++ updates to the plugins for caps negotiation. Added YUY2 output to
++ the win32 dlls. Added a colorspace converter in gstplay
++
++2001-04-10 20:46 wtay
++
++ * docs/gst/: gstreamer-docs.sgml, gstreamer-sections.txt,
++ tmpl/gstcaps.sgml, tmpl/gstprops.sgml, tmpl/gstreamer-unused.sgml:
++ Fixed the doc build warnings
++
++2001-04-09 20:56 mhowell
++
++ * docs/random/matth/scheduling.txt: added incremental scheduling
++ notes
++
++2001-04-09 20:56 mhowell
++
++ * docs/random/matth/scheduling.txt: file scheduling.txt was
++ initially added on branch BRANCH-INCSCHED1.
++
++2001-04-06 17:29 scavenger
++
++ * configure.in, plugins/Makefile.am, plugins/alaw/Makefile.am,
++ plugins/alaw/alaw-conversion.c, plugins/alaw/alaw-conversion.h,
++ plugins/alaw/alaw-decode.c, plugins/alaw/alaw-decode.h,
++ plugins/alaw/alaw-encode.c, plugins/alaw/alaw-encode.h,
++ plugins/alaw/alaw.c, plugins/alaw/mulaw-conversion.c,
++ plugins/alaw/mulaw-conversion.h: Added ALaw encoder and decoder
++
++2001-04-06 15:20 scavenger
++
++ * plugins/wav/Makefile.am: Makefile.am forgot to include gstriff.c
++
++2001-04-03 17:25 scavenger
++
++ * plugins/au/gstparseau.c: Updated parseau to use caps nego
++
++2001-04-03 05:56 richardb
++
++ * gst/Makefile.am.future: Add a proposed makefile to use in place
++ of Makefile.am. This depends on automake 1.4d or later, but is
++ much neater, avoiding horrible hacks to pass special flags in.
++
++ I put it here for safekeeping until automake 1.5 is released, at
++ which point we can reasonably require it.
++
++2001-04-03 05:53 richardb
++
++ * configure.in, plugins/Makefile.am, plugins/artsd/.cvsignore,
++ plugins/artsd/Makefile.am, plugins/artsd/REQUIREMENTS,
++ plugins/artsd/artsdsink.c, plugins/artsd/artsdsink.h: Add artsdsink
++ plugin. Worked first time for me. :)
++
++2001-04-03 05:52 richardb
++
++ * plugins/alsa/Makefile.am: Remove weird characters from alsa
++ Makefile.am (Had some 240's there. Uh?) Also, remove some
++ unwanted CFLAGS which had been added.
++
++2001-04-03 05:38 richardb
++
++ * gst/gstplugin.c: Fix obscure segfault I just got: perhaps due to
++ running with libxml 1.8.11 (prerelease version), but a worthwhile
++ fix anyway.
++
++2001-04-03 02:30 scavenger
++
++ * plugins/mulaw/mulaw-decode.c: fixed bug passing outbuf size
++ instead of in buf size to mulaw decode function
++
++2001-04-03 02:18 scavenger
++
++ * plugins/mulaw/mulaw-decode.c: typo mistaked src_template with
++ sink_template
++
++2001-04-03 02:01 wtay
++
++ * plugins/mulaw/mulaw.c: Use capstemplates to create the
++ padtemplates for the two elements in the mulaw plugin.
++
++2001-04-03 01:46 wtay
++
++ * plugins/xvideosink/xvideosink.c: Don't try to initialize Xv if it
++ is not available.
++
++2001-04-03 01:43 scavenger
++
++ * plugins/mulaw/mulaw-decode.h: fixed typo in get_type
++
++2001-04-03 01:38 scavenger
++
++ * plugins/mulaw/: mulaw-decode.c, mulaw-encode.c, mulaw.c: moved
++ details of mulawencode and mulawdecode to mulaw.c
++
++2001-04-03 01:33 scavenger
++
++ * plugins/mulaw/: mulaw-decode.c, mulaw-encode.c: removed a
++ redundant caps=NULL statement
++
++2001-04-03 01:30 scavenger
++
++ * plugins/mulaw/: mulaw-decode.c, mulaw-encode.c: fixed stupid bug
++ where srcpads were being created twice, second time around
++ wrongly!!!!
++
++2001-04-03 01:25 scavenger
++
++ * plugins/mulaw/: Makefile.am, mulaw-conversion.c,
++ mulaw-conversion.h, mulaw-decode.c, mulaw-decode.h, mulaw-encode.c,
++ mulaw.c: added mulaw decoder
++
++2001-04-02 21:03 wtay
++
++ * plugins/filters/colorspace/: .cvsignore, Makefile.am,
++ colorspace.c, colorspace.h: Added a non functional colorspace
++ converter
++
++2001-04-02 20:56 wtay
++
++ * configure.in, docs/libs/.cvsignore,
++ examples/helloworld/helloworld.c, gst/gstprops.c, gst/gstprops.h,
++ gst/gstpropsprivate.h: Merged the float property patch from Steve
++ Baker. This patch doesn't really work yet...
++
++2001-04-02 19:29 wtay
++
++ * plugins/mulaw/mulaw-encode.c: This is how I see the caps
++ negotiation for the mulaw element. In the sink negotiate pad it
++ copies the caps and modifies it according to what it is going to
++ ouput. It then tries to set the caps on the src pad, if that
++ succeeds, negotiation succeeds, else it fails.
++
++2001-04-02 18:54 scavenger
++
++ * configure.in, plugins/Makefile.am, plugins/mulaw/Makefile.am,
++ plugins/mulaw/mulaw-conversion.c, plugins/mulaw/mulaw-conversion.h,
++ plugins/mulaw/mulaw-encode.c, plugins/mulaw/mulaw-encode.h: Start
++ of the mulaw plugin...needs finishing off
++
++2001-04-02 16:09 richardb
++
++ * configure.in: Add configure support for detecting artsc: if this
++ is found, its okay to build an artsdsink plugin. Now, someone just
++ needs to write an artsdsink.
++
++2001-04-02 16:08 richardb
++
++ * plugins/oss/gstosssink.c: Correct tiny typo.
++
++2001-04-02 15:21 wtay
++
++ * gst/gstcaps.c, gst/gstprops.c, gstplay/gstplay.c,
++ plugins/Makefile.am, plugins/avi/audiocodecs.c,
++ plugins/avi/gstavidecoder.c, plugins/avi/gstavidecoder.h,
++ plugins/avi/gstaviencoder.h, plugins/avi/playcodecs.c,
++ plugins/avi/wincodec/Makefile.am,
++ plugins/avi/wincodec/gstwincodec.c,
++ plugins/avi/wincodec/gstwincodec.h,
++ plugins/avi/wincodec/gstwindec.c, plugins/avi/wincodec/gstwindec.h,
++ plugins/avi/wincodec/gstwinenc.c, plugins/avi/wincodec/gstwinenc.h,
++ plugins/capture/v4l/gstv4lsrc.c, plugins/filters/median/median.c,
++ plugins/filters/median/median.h, plugins/filters/smooth/smooth.c,
++ plugins/filters/smooth/smooth.h, plugins/flx/flx_decoder.c,
++ plugins/flx/flx_decoder.h, plugins/jpeg/gstjpeg.c,
++ plugins/jpeg/gstjpegdec.c, plugins/jpeg/gstjpegdec.h,
++ plugins/jpeg/gstjpegenc.c, plugins/jpeg/gstjpegenc.h,
++ plugins/mpeg1/mpeg1encoder/gstmpeg1encoder.c,
++ plugins/mpeg1/mpeg1encoder/gstmpeg1encoder.h,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.h,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.h,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.c,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.h,
++ plugins/mpeg2/parse/mpeg2parse.c,
++ plugins/mpeg2/video/gstmpeg2play.c,
++ plugins/mpeg2/video/gstmpeg2play.h,
++ plugins/videoscale/videoscale.c, plugins/videoscale/videoscale.h,
++ plugins/xvideosink/Makefile.am, plugins/xvideosink/gstximage.c,
++ plugins/xvideosink/gstximage.h, plugins/xvideosink/gstxvimage.c,
++ plugins/xvideosink/gstxvimage.h, plugins/xvideosink/xvideosink.c,
++ test/Makefile.am, test/mpeg2parse2.c, test/videotest2.c: A rather
++ large update: - a new videosink using plain X windows
++ (xvideosink). It uses capsnego to set up it's formats. -
++ gstplay uses the new xvideosink and a gtk_socket. The initial
++ window size is set to 0x0 so you need to resize it before you
++ see something. - got rid of the video metadata include file in
++ favour of properties and caps negotiation - adjusted most
++ plugins to not use the metadata.
++
++2001-04-02 15:08 omegahacker
++
++ * gst/gstinfo.c: added PID and cID to INFO lines when DEBUG is
++ turned on
++
++2001-04-01 15:09 wtay
++
++ * gstplay/: callbacks.c, gstmediaplay.glade: Small change to load
++ the .glade file from the current dir too when pressing the about
++ menu item.
++
++2001-04-01 15:01 wtay
++
++ * gstplay/: gstmediaplay.glade, gstplay.c: This patch is now The
++ Right Way(tm) to handle the stop button but at least it doesn't
++ crash...
++
++2001-04-01 14:51 wtay
++
++ * gstplay/gstplay.c: Slightly modified the _stop handling so that
++ gstmediaplay crashes less viontly. The real problem is that going
++ to the NULL state does not clean up the scheduling structures I
++ think..
++
++2001-03-31 15:35 wtay
++
++ * plugins/capture/v4l/gstv4lsrc.c: Make sure the endianness is
++ correct when we agree to yuv formats in capsnego.
++
++2001-03-31 15:22 wtay
++
++ * plugins/capture/v4l/gstv4lsrc.c: Only agree to the caps
++ negotiation if the format is supported by the driver.
++
++2001-03-31 15:10 wtay
++
++ * plugins/xvideosink/gstxvimage.c: Corrected a endianness bug in
++ the format print code.
++
++2001-03-31 14:47 wtay
++
++ * plugins/capture/v4l/gstv4lsrc.c: Added a little debug info in the
++ capsnego process.
++
++2001-03-31 02:08 wtay
++
++ * plugins/filters/stereo2mono/stereo2mono.c: Some cleanups. Added
++ the padtemplates to the elementfactory.
++
++2001-03-31 01:56 scavenger
++
++ * configure.in, plugins/filters/Makefile.am: Added stereo2mono
++ plugin
++
++2001-03-31 01:47 scavenger
++
++ * plugins/filters/stereo2mono/: Makefile.am, stereo2mono.c,
++ stereo2mono.h: stereo2mono plugin with caps negotiation code
++ started and working
++
++2001-03-31 01:13 wtay
++
++ * tests/: caps.c, props.c: Adjust the test cases to the new FOURCC
++ API.
++
++2001-03-31 00:56 wtay
++
++ * examples/helloworld/helloworld.c, gst/gstprops.h,
++ plugins/avi/gstavidecoder.c, plugins/avi/wincodec/gstwincodec.c,
++ plugins/capture/v4l/gstv4lsrc.c, plugins/jpeg/gstjpeg.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c,
++ plugins/mpeg2/video/gstmpeg2play.c: Simplified the FOURCC API to
++ the caps, add a GST_MAKE_FOURCC macro to create a fourcc. Adjusted
++ the plugins to use the new FOURCC API
++
++2001-03-31 00:51 wtay
++
++ * plugins/xvideosink/: gstximage.c, gstxvimage.c, gstxvimage.h,
++ xvideosink.c: Check for Xv support before trying to get caps.
++
++2001-03-30 21:10 wtay
++
++ * docs/gst/tmpl/gstmultidisksrc.sgml, examples/autoplug/.cvsignore,
++ examples/typefind/.cvsignore, plugins/xvideosink/.cvsignore: Small
++ updates to the .cvsignore files.
++
++2001-03-30 21:08 wtay
++
++ * acconfig.h, configure.in, plugins/Makefile.am,
++ plugins/filters/Makefile.am, plugins/filters/ladspa/gstladspa.c,
++ plugins/mp3decode/mpg123/mpg123.c, plugins/oss/gstosssink.c,
++ plugins/rtjpeg/RTjpeg.h: Applied the FreeBSD patch from Orion with
++ some minor modifications to the configure.in patch.
++
++2001-03-30 20:52 wtay
++
++ * gst/gstthread.c: This hopefully fixes a slight thread sync issue.
++
++2001-03-30 01:06 omegahacker
++
++ * AUTHORS, Makefile.am, configure.in, gstreamer.spec.in,
++ gst/gstbin.c, gst/gstelement.c, gst/gstpad.c, gst/gstscheduler.c,
++ gst/gstscheduler.h, gst/gstthread.c, tests/incsched.c,
++ tests/threadlock.c, tools/gstreamer-launch.c: snapshot for matth to
++ work with while I fly over to Europe....
++
++2001-03-29 23:33 wtay
++
++ * test/videotest2.c: Added a test program to test v4lsrc and
++ xvideosink doing capsnego.
++
++2001-03-29 23:31 wtay
++
++ * configure.in, gst/gstcaps.c, gst/gstpad.c, gst/gstprops.c,
++ gst/types/gsttypes.c, plugins/capture/v4l/grab.h,
++ plugins/capture/v4l/gstv4lsrc.c, plugins/capture/v4l/gstv4lsrc.h,
++ plugins/xvideosink/.cvsignore, plugins/xvideosink/Makefile.am,
++ plugins/xvideosink/gstximage.c, plugins/xvideosink/gstximage.h,
++ plugins/xvideosink/gstxvimage.c, plugins/xvideosink/gstxvimage.h,
++ plugins/xvideosink/gstxwindow.c, plugins/xvideosink/gstxwindow.h,
++ plugins/xvideosink/imagetest.c, plugins/xvideosink/xvideosink.c,
++ plugins/xvideosink/xvideosink.h, test/Makefile.am: Added a plain X
++ videosink, the videosink uses capsnego. adjusted the v4lsrc so
++ that it uses capsnego on the src pad Small fixed to capsnego and
++ the properties/caps.
++
++2001-03-29 18:27 richardb
++
++ * docs/gst/: Makefile.am, gstreamer.types.in: Remove references to
++ audiosink, audiosrc, and audioraw. Documentation at least _starts_
++ to get built, now.
++
++2001-03-27 18:34 wtay
++
++ * docs/gst/: gstreamer-sections.txt, tmpl/gstcaps.sgml,
++ tmpl/gstprops.sgml, tmpl/gstreamer-unused.sgml: More docs updates
++
++2001-03-27 18:33 wtay
++
++ * plugins/wav/gstparsewav.c: Removed the oss dependency
++
++2001-03-27 17:25 wtay
++
++ * docs/gst/: gstreamer-docs.sgml, gstreamer-sections.txt,
++ gstreamer.hierarchy, tmpl/audioraw.sgml, tmpl/gstaudiosink.sgml,
++ tmpl/gstaudiosrc.sgml, tmpl/gstcaps.sgml, tmpl/gstprops.sgml,
++ tmpl/gstreamer-unused.sgml: Removed the audiosink/src from the
++ docs. Removed the audioraw metadata file from the docs.
++
++2001-03-26 12:12 richardb
++
++ * plugins/mp3decode/Makefile.am: Fix makefile.am so that SUBDIRS is
++ not defined both conditionally and unconditionally - broke some
++ versions of automake.
++
++2001-03-24 18:50 wtay
++
++ * plugins/: alsa/alsa.h, alsa/alsa_common.c, alsa/alsasink.c,
++ alsa/alsasrc.c, au/gstparseau.c, effects/stereo/stereo.c,
++ effects/stereo/stereo.h, effects/volume/volume.c,
++ effects/volume/volume.h, esd/esdsink/esdsink.c,
++ visualization/smoothwave/smoothwave.h,
++ visualization/spectrum/gstspectrum.c,
++ visualization/spectrum/gstspectrum.h,
++ visualization/synaesthesia/synaesthesia.c,
++ visualization/synaesthesia/synaesthesia.h,
++ visualization/vumeter/vumeter.c, visualization/vumeter/vumeter.h,
++ wav/gstparsewav.c, wav/gstparsewav.h: Commented out the references
++ to the old metadata handling in various plugins. They need to be
++ converted to the new audio properties before they will work again.
++ esdsink and alsasrc/sink are seriously damaged now.. :(
++
++2001-03-24 18:28 wtay
++
++ * plugins/oss/gstosssink.c: Correctly set up the OSS format based
++ on the caps.
++
++2001-03-24 17:22 wtay
++
++ * configure.in, examples/autoplug/autoplug.c,
++ examples/helloworld/helloworld.c,
++ examples/helloworld2/helloworld2.c, examples/launch/mp3play,
++ examples/queue/queue.c, examples/queue2/queue2.c,
++ examples/queue3/queue3.c, examples/queue4/queue4.c,
++ examples/thread/thread.c, examples/xml/createxml.c,
++ gst/Makefile.am, gst/gstcaps.c, gst/gstcaps.h, gst/gstprops.c,
++ gst/gstprops.h, gst/gstpropsprivate.h, gst/elements/Makefile.am,
++ gst/elements/gstaudiosink.c, gst/elements/gstaudiosink.h,
++ gst/elements/gstaudiosrc.c, gst/elements/gstaudiosrc.h,
++ gst/elements/gstelements.c, gst/elements/gstmultidisksrc.c,
++ gst/elements/gstmultidisksrc.h, gst/elements/gstsinesrc.c,
++ gst/elements/gstsinesrc.h, gstplay/gstplay.c, plugins/Makefile.am,
++ plugins/au/gstparseau.c, plugins/au/gstparseau.h,
++ plugins/audioscale/audioscale.c, plugins/audioscale/audioscale.h,
++ plugins/avi/audiocodecs.c, plugins/avi/gstavidecoder.c,
++ plugins/avi/gstavidecoder.h, plugins/avi/gstaviencoder.h,
++ plugins/flx/flx_decoder.c, plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/mpg123/gstmpg123.h,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.h,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg2/ac3dec/ac3dec.c, plugins/mpeg2/ac3dec/ac3dec.h,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c,
++ plugins/mpeg2/parse/mpeg2parse.c, plugins/oss/.cvsignore,
++ plugins/oss/Makefile.am, plugins/oss/gstossaudio.c,
++ plugins/oss/gstosssink.c, plugins/oss/gstosssink.h,
++ plugins/oss/gstosssrc.c, plugins/oss/gstosssrc.h,
++ plugins/vorbis/vorbis.c, plugins/vorbis/vorbisdec.c, test/a.c,
++ test/ac3play.c, test/aviparse.c, test/m.c, test/mcut.c,
++ test/mp1parse.c, test/mp1tomp1.c, test/mp2toavi.c, test/mp2tomp1.c,
++ test/mp3.c, test/mp3play.c, test/mpeg2parse.c, test/mpg123.c,
++ test/p.c, test/qtest.c, test/r.c, test/record.c, test/s.c,
++ test/spectrum.c, test/typefind.c, test/vidcapture.c,
++ test/vidcapture2.c, test/w.c, test/xmmstest.c, tests/autoplug.c,
++ tests/autoplug3.c, tests/paranoia.c, tools/README,
++ tools/gstreamer-inspect.c: Modified a lot of plugins to use the
++ caps system. Modified the caps of audio/raw to our agreed
++ properties. Added the multidisksrc plugin of Dominic Ludlam
++ Renamed audiosink/src to osssink/src and updated all the examples
++ using the old name. Moved oss specific plugins in an oss directory.
++ removed the old audiosink from the elements/ dir. removed
++ audioraw.h metadata header files since we now use the properties.
++ There are still a few plugins that won't build because they include
++ the old audioraw.h header file. This will be fixed soon. Make sure
++ the caps are set in the plugins as described by their padtemplates
++ (this should solve problems with gstmediaplay with various media
++ files).
++
++ *please don't panic when some plugins won't build, just cd manually
++ into the plugin dirs* This will be fixed soon.
++
++2001-03-22 16:05 dlehn
++
++ * debian/: Makefile.am, changelog, control, gsteditor.manpages,
++ gstmediaplay.manpages, gstreamer-alsa.files,
++ gstreamer-common.files, gstreamer-elements.files,
++ gstreamer-mpeg2dec.files, gstreamer-runtime.manpages,
++ gstreamer-tools.manpages, libgst-dev.manpages, rules: Debian
++ updates: * add manpages * split off mpeg2dec and alsa packages *
++ use latest doc build flags
++
++2001-03-22 00:03 wtay
++
++ * plugins/flx/flx_decoder.c: unref the header buffer too.
++
++2001-03-22 00:00 wtay
++
++ * docs/gst/tmpl/: gststaticautoplug.sgml,
++ gststaticautoplugrender.sgml: Added the templates for the
++ autoplugger docs
++
++2001-03-21 23:59 wtay
++
++ * configure.in, plugins/Makefile.am, plugins/flx/Makefile.am,
++ plugins/flx/flx_color.c, plugins/flx/flx_color.h,
++ plugins/flx/flx_decoder.c, plugins/flx/flx_decoder.h,
++ plugins/flx/flx_fmt.h: Added the FLX decoder of Sepp Wijnands
++ <mrrazz@garbage-coderz.net>
++
++2001-03-21 21:43 wtay
++
++ * docs/gst/gstreamer-docs.sgml, docs/gst/gstreamer-sections.txt,
++ docs/gst/tmpl/gstarch.sgml, docs/gst/tmpl/gstautoplug.sgml,
++ docs/gst/tmpl/gstcaps.sgml, docs/gst/tmpl/gstcpu.sgml,
++ docs/gst/tmpl/gstelement.sgml, docs/gst/tmpl/gstpad.sgml,
++ docs/gst/tmpl/gstplugin.sgml, docs/gst/tmpl/gstprops.sgml,
++ docs/gst/tmpl/gstreamer-unused.sgml, docs/gst/tmpl/gstsinesrc.sgml,
++ docs/gst/tmpl/gstutils.sgml, gst/gstautoplug.c, gst/gstcaps.c,
++ gst/gstpad.c, gst/gstpad.h, gst/gstplugin.c, gst/gstprops.c,
++ gst/gstprops.h, gst/gstutils.c: API docs updates
++
++2001-03-20 23:12 richardb
++
++ * configure.in, docs/Makefile.am, docs/manual/typedetection.sgml,
++ examples/plugins/example.c: Added --enable-plugin-docs configure
++ option, to enable build of the plugin documentation (currently
++ broken). This defaults to off. Changed --enable-docs-build to
++ default to on, since all other documentation should build
++ correctly.
++
++ Also, correct typo in manual, and fix up a couple of things in
++ example.c
++
++2001-03-20 18:29 wtay
++
++ * testsuite/capsnego/.cvsignore: Added the new enum testcase to
++ .cvsignore
++
++2001-03-20 18:29 wtay
++
++ * gst/gst.c, gst/gstbuffer.c, gst/gstcaps.c, gst/gstcaps.h,
++ gst/gstpad.c, gst/gstpad.h, gst/gstplugin.c, gst/gstprops.c,
++ gst/gstprops.h, gst/gstqueue.c, testsuite/capsnego/Makefile.am,
++ testsuite/capsnego/converter2.c, testsuite/capsnego/enum.c: More
++ work on capsnego proxying. It should be OK now. Added another
++ testcase enum that shows various capsnego algorithms. Warn about
++ pads that try to set a capability incompatible with their
++ padtemplate. Implemented refcounting and copy_on_write for
++ caps/props.
++
++2001-03-18 16:17 wtay
++
++ * gst/gstpad.c, gst/gstqueue.c,
++ gst/autoplug/gststaticautoplugrender.c,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1video/parse/mp1videoparse.c, plugins/vorbis/vorbis.c,
++ plugins/vorbis/vorbisdec.c, testsuite/capsnego/.cvsignore,
++ testsuite/capsnego/Makefile.am, testsuite/capsnego/converter2.c:
++ More work on capsnego, mostly proxying Added another testsuite for
++ capsnego Added caps to vorbisdec, mp3parse, mp1videoparse Redid the
++ queue proxy handling a bit.
++
++2001-03-18 14:41 richardb
++
++ * docs/fwg/gst-plugin-writers-guide.sgml: Another incremental piece
++ of work on the PWG.
++
++2001-03-18 06:24 richardb
++
++ * docs/fwg/gst-plugin-writers-guide.sgml: Commit a final couple of
++ modifications before going to bed.
++
++2001-03-18 06:16 richardb
++
++ * docs/fwg/: Makefile.am, firstplugin.sgml,
++ gst-plugin-writers-guide.sgml: Some further modifications to the
++ PWG.
++
++2001-03-18 05:21 richardb
++
++ * docs/fwg/gst-plugin-writers-guide.sgml: Added many more details
++ about types.
++
++2001-03-18 03:57 richardb
++
++ * docs/fwg/: Makefile.am, concepts.sgml,
++ gst-plugin-writers-guide.sgml, typesnprops.sgml: Various updates to
++ PWG; mainly adding information about types and properties. Removed
++ concepts.sgml and typesnprops.sgml; merged into main file. I was
++ finding that having all the separate subfiles simply stopped me
++ from finding what I wanted to edit. Maybe I'll split it up again
++ later, but this is much better for now.
++
++2001-03-18 02:42 wtay
++
++ * configure.in, docs/plugins/tmpl/gstreamer-plugins-unused.sgml,
++ docs/random/wtay/capsnego-cases, examples/helloworld/helloworld.c,
++ examples/queue/queue.c, examples/xml/runxml.c, gst/gstcaps.c,
++ gst/gstcaps.h, gst/gstpad.c, gst/gstpad.h, gst/gstprops.c,
++ gst/gstprops.h, gst/gstqueue.c, gst/elements/gstaudiosink.c,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mpeg2/ac3dec/ac3dec.c, plugins/mpeg2/ac3dec/ac3dec.h,
++ tests/props.c, testsuite/capsnego/.cvsignore,
++ testsuite/capsnego/Makefile.am, testsuite/capsnego/capsnego.c,
++ testsuite/capsnego/converter.c: Reworked the capsnegotiation
++ function audiosink now uses capsnego to set its parameters
++ mpg123/ac3dec use capsnego instead of metadata Added the beginnings
++ of a testsuite for capsnego.
++
++2001-03-17 17:50 richardb
++
++ * docs/manual/plugins.sgml: Update to note that plugins can also
++ contain autopluggers.
++
++2001-03-17 17:16 richardb
++
++ * docs/fwg/: concepts.sgml, firstplugin.sgml,
++ gst-plugin-writers-guide.sgml: Some miscellaneous small changes.
++
++2001-03-17 03:15 omegahacker
++
++ * docs/random/omega/: eos, eos.old: move eos to eos.old, to reflect
++ its age and to aid ailing OS's like Windoze <g>
++
++2001-03-16 01:06 dlehn
++
++ * Makefile.am, gstreamer-config.1, editor/Makefile.am,
++ editor/gsteditor.1, gstplay/Makefile.am, gstplay/gstmediaplay.1,
++ tools/Makefile.am, tools/gstreamer-inspect.1,
++ tools/gstreamer-launch.1, tools/gstreamer-register.1: Added man
++ pages.
++
++2001-03-16 00:49 scavenger
++
++ * gst/gstthread.c: Fixed locking issue when PLAYING to READY
++
++2001-03-15 20:08 wtay
++
++ * docs/random/wtay/capsnego-cases: Added the first part of a uses
++ case doc on caps nego
++
++2001-03-14 21:56 omegahacker
++
++ * configure.in: fixed issue with the xmlDocGetRootElement test and
++ non-/usr/lib installs of libxml
++
++2001-03-14 07:54 dlehn
++
++ * gstreamer.m4: Use of system() in test programs needs an #include
++ <stdlib.h>.
++
++2001-03-14 06:46 dlehn
++
++ * gstreamer.m4: Fix --with-gstreamer-prefix via s/glib/gstreamer/
++
++2001-03-13 22:21 wtay
++
++ * tools/gstreamer-inspect.c: Adjusted -inspect to the new GstCaps
++ structure
++
++2001-03-13 22:13 wtay
++
++ * gst/gsttypefind.c: The typefind element now sets the caps on its
++ sink pad when the type has been detected.
++
++2001-03-13 20:26 wtay
++
++ * gst/: gstcaps.c, gstpad.c: Small fixes to the caps compatibility
++ check. Small changes to the pad negotiation and proxy functions
++
++2001-03-13 18:57 wtay
++
++ * examples/autoplug/autoplug.c: Updated the autoplug example with
++ the new autoplugger. there still is a scheduling issue though.
++
++2001-03-13 18:45 wtay
++
++ * configure.in: Applied the patch from hadess/ajmitch to add
++ --disable-alsasink and --disable-esdsink (the latter one being
++ untested) to configure.in
++
++2001-03-13 02:20 omegahacker
++
++ * gst/gstthread.c: fixed READY_TO_NULL bug
++
++2001-03-13 01:44 scavenger
++
++ * gst/: gstthread.c, gstthread.h: removed fine grained locking and
++ added simultaneous waiting for 2 states
++
++2001-03-13 01:24 scavenger
++
++ * gst/gstthread.c: exactly opposite check needed in wait_thread
++
++2001-03-13 01:08 scavenger
++
++ * gst/gstthread.c: made wait_thread check for logical true rather
++ than check equality with gboolean
++
++2001-03-13 00:57 scavenger
++
++ * gst/gstthread.c: changed debug to print unsigned not signed
++
++2001-03-13 00:46 scavenger
++
++ * gst/gstthread.c: TYPO: ISSET should be IS_SET
++
++2001-03-13 00:45 scavenger
++
++ * gst/gstthread.c: added debug to signal noting the result of the
++ flag after being set
++
++2001-03-13 00:39 scavenger
++
++ * gst/: gstthread.c, gstthread.h: Made locks more granular, one
++ lock for each state
++
++2001-03-13 00:09 scavenger
++
++ * gst/gstthread.c: made cond_wait into cond_timedwait
++
++2001-03-12 23:51 omegahacker
++
++ * tests/threadlock.c: file threadlock.c was initially added on
++ branch BRANCH-INCSCHED1.
++
++2001-03-12 23:51 omegahacker
++
++ * tests/: Makefile.am, threadlock.c: added threadlock test
++
++2001-03-12 23:39 scavenger
++
++ * gst/gstthread.c: repositioning of debug after mutex in
++ wait_thread and signal_thread
++
++2001-03-12 23:28 scavenger
++
++ * gst/gstthread.c: typo in GST_DEBUG in signal_thread
++
++2001-03-12 23:27 scavenger
++
++ * gst/gstthread.c: Changed GST_DEBUG in signal_thread and
++ wait_thread to reveal more info
++
++2001-03-12 21:02 wtay
++
++ * configure.in, docs/random/wtay/caps-negociation,
++ editor/gsteditorproperty.c, gst/gstautoplug.c, gst/gstautoplug.h,
++ gst/gstcaps.c, gst/gstcaps.h, gst/gstelement.c, gst/gstelement.h,
++ gst/gstelementfactory.c, gst/gstpad.c, gst/gstpad.h,
++ gst/gstqueue.c, gst/autoplug/gststaticautoplug.c,
++ gst/autoplug/gststaticautoplugrender.c,
++ gst/elements/gstaudiosink.c, gstplay/gstplay.c,
++ plugins/jpeg/gstjpeg.c, plugins/vorbis/vorbis.c,
++ plugins/xmms/pluginenum.c, tests/.cvsignore, tests/Makefile.am,
++ tests/autoplug.c, tests/capsconnect.c, tests/nego/.cvsignore,
++ tests/nego/Makefile.am, tests/nego/nego1.c: Merged the CAPSNEGO1
++ branch..
++
++2001-03-12 20:04 wtay
++
++ * Makefile.am, REQUIREMENTS, configure.in, docs/manual/xml.sgml,
++ gst/gst.c, gst/gstpipeline.c, gst/gstpipeline.h,
++ gst/elements/gstsinesrc.c, gst/elements/gstsinesrc.h,
++ plugins/Makefile.am, plugins/alsa/.cvsignore,
++ plugins/alsa/Makefile.am, plugins/alsa/README, plugins/alsa/alsa.h,
++ plugins/alsa/alsa_common.c, plugins/alsa/alsainfo.c,
++ plugins/alsa/alsasink.c, plugins/alsa/alsasrc.c,
++ plugins/capture/v4l/gstv4lsrc.c, plugins/jpeg/gstjpegenc.c,
++ plugins/jpeg/gstjpegenc.h, plugins/rtp/Makefile.am,
++ plugins/rtp/rtpsend/.cvsignore, plugins/rtp/rtpsend/Makefile.am,
++ plugins/rtp/rtpsend/rtp.c, plugins/rtp/rtpsend/rtp.h,
++ plugins/rtp/rtpsend/rtpsend.c, plugins/rtp/rtpsend/rtpsend.h,
++ tests/autoplug.c, testsuite/Makefile.am, testsuite/test_gst_init.c:
++ Another merge from HEAD into CAPSNEGO1
++
++2001-03-12 02:44 scavenger
++
++ * gst/gstthread.c: added a set flag to end of
++ gst_thread_signal_thread and gst_signal_wait_thread to indicate
++ whether signal should set flag or unset flag, and whether wait
++ should wait for flag to be set or to be unset. this is needed for
++ PLAYING_TO_PAUSE where STATE_SPINNING needs to be signalled to be
++ unset
++
++2001-03-12 02:30 omegahacker
++
++ * tests/: Makefile.am, reaping.c: added thread REAPING test
++
++2001-03-12 02:30 omegahacker
++
++ * tests/reaping.c: file reaping.c was initially added on branch
++ BRANCH-INCSCHED1.
++
++2001-03-12 01:55 scavenger
++
++ * gst/gstthread.c: making wait for REAPING state when
++ gst_bin_iterate returns non zero
++
++2001-03-12 01:37 scavenger
++
++ * gst/gstthread.c: added debug statement
++
++2001-03-12 01:13 omegahacker
++
++ * gst/gsttypes.h: /me is an idiot. cvs add gsttypes.h
++
++2001-03-12 01:13 omegahacker
++
++ * gst/gsttypes.h: file gsttypes.h was initially added on branch
++ BRANCH-INCSCHED1.
++
++2001-03-12 00:37 omegahacker
++
++ * gst/: gstthread.c, gstthread.h: some cleanup and compile fixes
++
++2001-03-12 00:28 scavenger
++
++ * gst/: gstthread.c, gstthread.h: Start of merging syncflags in
++ with states
++
++2001-03-11 22:45 omegahacker
++
++ * configure.in: added check for version 1.8.1 or better of libxml
++
++2001-03-11 19:51 wtay
++
++ * plugins/jpeg/: gstjpegenc.c, gstjpegenc.h: Added a signal that
++ gets emited when a frame has been encoded..
++
++2001-03-11 19:31 wtay
++
++ * gst/gstpad.c, gst/gstpad.h,
++ gst/autoplug/gststaticautoplugrender.c, tests/.cvsignore: Small
++ fixes, most notably the GST_PAD_CONNECTED macro that didn't work
++ for ghostpads.
++
++2001-03-11 18:47 wtay
++
++ * tests/capsconnect.c: file capsconnect.c was initially added on
++ branch BRANCH-CAPSNEGO1.
++
++2001-03-11 18:47 wtay
++
++ * tests/capsconnect.c: Added a little test program for caps
++ negotiation proxying.
++
++2001-03-11 18:34 wtay
++
++ * gst/elements/: gstsinesrc.c, gstsinesrc.h: Applied the sinesrc
++ patch from Steve Baker.
++
++2001-03-11 16:29 wtay
++
++ * AUTHORS, Makefile.am, REQUIREMENTS, acconfig.h, configure.in,
++ gstreamer-config.in, gstreamer.m4, debian/.cvsignore,
++ debian/Makefile.am, debian/README.Debian, debian/changelog,
++ debian/control, debian/copyright, debian/gsteditor.files,
++ debian/gsteditor.menu, debian/gstmediaplay.files,
++ debian/gstmediaplay.menu, debian/gstreamer-cdparanoia.files,
++ debian/gstreamer-common.files, debian/gstreamer-doc.files,
++ debian/gstreamer-elements.files, debian/gstreamer-esd.files,
++ debian/gstreamer-lame.files, debian/gstreamer-mpg123.files,
++ debian/gstreamer-plugin-template.postinst,
++ debian/gstreamer-plugin-template.prerm,
++ debian/gstreamer-runtime.files, debian/gstreamer-runtime.postinst,
++ debian/gstreamer-tools.files, debian/gstreamer-vorbis.files,
++ debian/libgst-dev.files, debian/libgst0.files,
++ debian/libgst0.postinst, debian/libgsteditor-dev.files,
++ debian/libgsteditor0.files, debian/libgsteditor0.postinst,
++ debian/libgstmediaplay-dev.files, debian/libgstmediaplay0.files,
++ debian/libgstmediaplay0.postinst, debian/rules, docs/Makefile.am,
++ docs/fwg/testapp.sgml, docs/fwg/titlepage.sgml,
++ docs/gst/Makefile.am, docs/gst/gstreamer-docs.sgml,
++ docs/gst/gstreamer-sections.txt, docs/gst/gstreamer.hierarchy,
++ docs/gst/gstreamer.types.in, docs/gst/tmpl/gstasyncdisksrc.sgml,
++ docs/gst/tmpl/gstautoplug.sgml, docs/gst/tmpl/gstbuffer.sgml,
++ docs/gst/tmpl/gstcaps.sgml, docs/gst/tmpl/gstdisksrc.sgml,
++ docs/gst/tmpl/gstobject.sgml, docs/gst/tmpl/gstpad.sgml,
++ docs/gst/tmpl/gstpipeline.sgml, docs/gst/tmpl/gstplugin.sgml,
++ docs/gst/tmpl/gstreamer-unused.sgml, docs/manual/Makefile.am,
++ docs/manual/bins.sgml, docs/manual/debugging.sgml,
++ docs/manual/dynamic.sgml, docs/manual/gstreamer-manual.sgml,
++ docs/manual/helloworld.sgml, docs/manual/helloworld2.sgml,
++ docs/manual/pads.sgml, docs/manual/plugins.sgml,
++ docs/manual/queues.sgml, docs/manual/quotes.sgml,
++ docs/manual/threads.sgml, docs/manual/typedetection.sgml,
++ docs/manual/xml.sgml, docs/plugins/Makefile.am,
++ docs/plugins/gstdoc-scanobj, docs/plugins/tmpl/ac3parse.sgml,
++ docs/plugins/tmpl/audioscale.sgml,
++ docs/plugins/tmpl/gstaviencoder.sgml,
++ docs/plugins/tmpl/gstmpeg2enc.sgml,
++ docs/plugins/tmpl/gstmpeg2play.sgml,
++ docs/plugins/tmpl/gstmpeg_play.sgml,
++ docs/plugins/tmpl/gstreamer-plugins-unused.sgml,
++ docs/plugins/tmpl/gstspectrum.sgml,
++ docs/plugins/tmpl/gstv4lsrc.sgml, docs/plugins/tmpl/gstwindec.sgml,
++ docs/plugins/tmpl/gstwinenc.sgml, docs/plugins/tmpl/median.sgml,
++ docs/plugins/tmpl/mp3parse.sgml, docs/plugins/tmpl/mpeg1parse.sgml,
++ docs/plugins/tmpl/mpeg2parse.sgml,
++ docs/plugins/tmpl/mpeg2subt.sgml, docs/plugins/tmpl/smooth.sgml,
++ docs/plugins/tmpl/smoothwave.sgml, docs/plugins/tmpl/stereo.sgml,
++ docs/plugins/tmpl/synaesthesia.sgml,
++ docs/plugins/tmpl/system_encode.sgml,
++ docs/plugins/tmpl/videoscale.sgml,
++ docs/plugins/tmpl/videosink.sgml, docs/plugins/tmpl/volume.sgml,
++ docs/plugins/tmpl/vumeter.sgml, docs/random/NOTES-0.1.1,
++ docs/random/hierarchy, docs/random/wtay/autoplug2,
++ editor/gsteditor.h, examples/Makefile.am,
++ examples/autoplug/autoplug.c, examples/helloworld2/helloworld2.c,
++ examples/launch/mp3play, examples/plugins/example.c,
++ examples/plugins/example.h, examples/queue2/queue2.c,
++ examples/thread/thread.c, gst/Makefile.am, gst/cothreads.c,
++ gst/gst.c, gst/gst.h, gst/gstarch.h, gst/gstautoplug.c,
++ gst/gstautoplug.h, gst/gstbin.c, gst/gstcaps.c, gst/gstcaps.h,
++ gst/gstcpu.c, gst/gstcpu.h, gst/gstelement.c, gst/gstelement.h,
++ gst/gstelementfactory.c, gst/gstinfo.h, gst/gstobject.c,
++ gst/gstpad.c, gst/gstpad.h, gst/gstparse.c, gst/gstpipeline.c,
++ gst/gstpipeline.h, gst/gstplugin.c, gst/gstplugin.h,
++ gst/gstprops.c, gst/gstqueue.c, gst/gstsparc.h, gst/gstthread.c,
++ gst/gsttype.c, gst/gsttype.h, gst/gsttypefind.c, gst/gstutils.c,
++ gst/gstutils.h, gst/autoplug/Makefile.am,
++ gst/autoplug/gststaticautoplug.c, gst/autoplug/gststaticautoplug.h,
++ gst/autoplug/gststaticautoplugrender.c,
++ gst/autoplug/gststaticautoplugrender.h,
++ gst/elements/gstaudiosink.c, gst/elements/gstdisksrc.c,
++ gst/elements/gstelements.c, gstplay/Makefile.am, gstplay/gstplay.c,
++ gstplay/gstplay.h, gstplay/gstplayprivate.h, include/Makefile.am,
++ include/avifmt.h, include/default.h, include/registry.h,
++ libs/Makefile.am, libs/getbits/gstgetbits.c,
++ libs/getbits/gstgetbits.h, libs/getbits/gstgetbits_inl.h,
++ plugins/Makefile.am, plugins/avi/gstavidecoder.c,
++ plugins/avi/playcodecs.c, plugins/avi/wincodec/gstwincodec.c,
++ plugins/avi/wincodec/gstwindec.c, plugins/avi/wincodec/gstwinenc.c,
++ plugins/capture/v4l/gstv4lsrc.c, plugins/capture/v4l/gstv4lsrc.h,
++ plugins/jpeg/gstjpeg.c, plugins/jpeg/gstjpegdec.c,
++ plugins/mp3decode/mpg123/layer1.c,
++ plugins/mp3decode/mpg123/layer3.c,
++ plugins/mp3decode/mpg123/tabinit.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3encode/lame/gstlame.c, plugins/mp3encode/lame/gstlame.h,
++ plugins/mpeg1/mpeg_play/Makefile.am,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/recon_mmxe.s,
++ plugins/mpeg1/mpeg_play/recon_sse.s,
++ plugins/mpeg1/mpeg_play/video.c, plugins/mpeg2/Makefile.am,
++ plugins/mpeg2/ac3dec/cpu_accel.c,
++ plugins/mpeg2/mpeg2dec/Makefile.am,
++ plugins/mpeg2/mpeg2dec/attributes.h,
++ plugins/mpeg2/mpeg2dec/decode.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.h,
++ plugins/mpeg2/mpeg2dec/header.c, plugins/mpeg2/mpeg2dec/header.h,
++ plugins/mpeg2/mpeg2dec/idct.c, plugins/mpeg2/mpeg2dec/idct.h,
++ plugins/mpeg2/mpeg2dec/idct_mlib.c,
++ plugins/mpeg2/mpeg2dec/idct_mmx.c,
++ plugins/mpeg2/mpeg2dec/idct_mmx.h,
++ plugins/mpeg2/mpeg2dec/mm_accel.h,
++ plugins/mpeg2/mpeg2dec/motion_comp.c,
++ plugins/mpeg2/mpeg2dec/motion_comp.h,
++ plugins/mpeg2/mpeg2dec/motion_comp_mlib.c,
++ plugins/mpeg2/mpeg2dec/motion_comp_mmx.c,
++ plugins/mpeg2/mpeg2dec/motion_comp_sse.s,
++ plugins/mpeg2/mpeg2dec/mpeg2.h,
++ plugins/mpeg2/mpeg2dec/mpeg2_internal.h,
++ plugins/mpeg2/mpeg2dec/output_video.h,
++ plugins/mpeg2/mpeg2dec/slice.c, plugins/mpeg2/mpeg2dec/slice.h,
++ plugins/mpeg2/mpeg2dec/stats.c, plugins/mpeg2/mpeg2dec/vlc.h,
++ plugins/mpeg2/video/Makefile.am, plugins/mpeg2/video/recon.c,
++ plugins/mpeg2/video/recon_mmxe.s, plugins/mpeg2/video/recon_sse.s,
++ plugins/vorbis/vorbis.c, plugins/xmms/.cvsignore,
++ plugins/xmms/Makefile.am, plugins/xmms/effect.h,
++ plugins/xmms/general.h, plugins/xmms/gstxmms.c,
++ plugins/xmms/gstxmms.h, plugins/xmms/gstxmmseffect.c,
++ plugins/xmms/gstxmmseffect.h, plugins/xmms/gstxmmsinput.c,
++ plugins/xmms/gstxmmsinput.h, plugins/xmms/input.h,
++ plugins/xmms/main.h, plugins/xmms/output.h,
++ plugins/xmms/pluginenum.c, plugins/xmms/pluginenum.h,
++ plugins/xmms/visualization.h, plugins/xmms/xmms.h, test/.cvsignore,
++ test/Makefile.am, test/mp1parse.c, test/mpeg2parse2.c,
++ test/videotest.c, test/xmmstest.c, test/xml/readreg.c,
++ tests/.cvsignore, tests/Makefile.am, tests/autoplug.c,
++ tests/autoplug2.c, tests/autoplug3.c, tools/README,
++ tools/gstreamer-inspect.c: Merge the HEAD branch into AUTOPLUG2.
++ More work on the negotiation process to allow for proxied
++ negotiation which is needed in the queue. gst_pad_connect perform
++ a negotiation and returns a gboolean indicating successfull
++ connection. The pads are disconnected when negotiation fails. I'm
++ not satisfied/sure about the implementation yet, needs some more
++ investigation.
++
++2001-03-10 09:03 omegahacker
++
++ * gst/: gstpipeline.c, gstpipeline.h: added tool-man's patch for
++ g++ compilation, const guchar for pipeline_new
++
++2001-03-09 22:03 wtay
++
++ * REQUIREMENTS: Added librtp as a REQUIREMENT for the rtp plugin
++
++2001-03-09 22:02 wtay
++
++ * configure.in, plugins/Makefile.am: Added a check for librtp.
++
++2001-03-09 20:50 wtay
++
++ * REQUIREMENTS, configure.in, plugins/rtp/Makefile.am,
++ plugins/rtp/rtpsend/.cvsignore, plugins/rtp/rtpsend/Makefile.am,
++ plugins/rtp/rtpsend/rtp.c, plugins/rtp/rtpsend/rtp.h,
++ plugins/rtp/rtpsend/rtpsend.c, plugins/rtp/rtpsend/rtpsend.h: Added
++ the RTP sink, added libasound to the REQUIREMENTS, configure.in is
++ not yet detecting librtp...
++
++2001-03-09 20:35 wtay
++
++ * plugins/xmms/pluginenum.c: Fixed some minor compile warnings
++
++2001-03-09 20:24 wtay
++
++ * configure.in, plugins/Makefile.am, plugins/alsa/Makefile.am: Only
++ build alsa when detected by configure
++
++2001-03-09 20:05 wtay
++
++ * plugins/alsa/: .cvsignore, README: Some more files.
++
++2001-03-09 20:04 wtay
++
++ * plugins/alsa/: Makefile.am, alsa.h, alsa_common.c, alsainfo.c,
++ alsasink.c, alsasrc.c: Added the alsasrc and alsasink elements. The
++ build system is not yet done, we're working on it now.
++
++2001-03-09 18:50 omegahacker
++
++ * gst/cothreads.c, gst/gstbin.c, gst/gstelement.c, gst/gstpad.c,
++ gst/gstscheduler.c, gst/gstthread.h, tests/incsched.c: update to
++ latest copy
++
++2001-03-09 18:33 omegahacker
++
++ * gst/gstthread.c: commit to broken code that needs inspecting
++
++2001-03-09 12:31 richardb
++
++ * gst/gst.c: Fix gst_init() so that it doesn't fail when passed two
++ NULLs as parameters. Was dereferencing the argv pointer to get
++ progname: now defaults to "gstprog".
++
++2001-03-09 12:29 richardb
++
++ * testsuite/test_gst_init.c: Updated test to have a comment
++ explaining its purpose (very important this, especially for
++ regression tests), and to actually test what I meant it to.
++
++2001-03-09 12:08 richardb
++
++ * Makefile.am, configure.in, testsuite/Makefile.am,
++ testsuite/test_gst_init.c: Added a testsuite. This currently only
++ has one test, which replicates a problem just submitted to the
++ list.
++
++ I hope noone disagrees that we need a testsuite. Also, hopefully
++ we all think that a tiny testsuite which is easy to add tests to is
++ much better than a huge project to create a complete testsuite,
++ which never gets started because its too big and scary.
++
++ I suggest that tests get created whenever someone has a spare
++ moment, or whenever a bug is reported (to replicate the problem,
++ and thus be sure that when fixed it stays fixed), and before making
++ a change to a piece of code to ensure that it remains working.
++
++ If we all add little tests occasionally, then we'll have a good
++ useful testsuite before we know it. All you need to do is make a
++
++2001-03-08 21:28 wtay
++
++ * configure.in: Removed the libxmms check until they fix their m4
++ script..
++
++2001-03-08 19:26 wtay
++
++ * plugins/capture/v4l/gstv4lsrc.c: A very stupid patch to issue a
++ warninh when the device could not be opened.
++
++2001-03-07 22:20 wtay
++
++ * configure.in: Added a check for libxmms
++
++2001-03-07 21:52 wtay
++
++ * configure.in, docs/gst/tmpl/gstautoplug.sgml,
++ docs/gst/tmpl/gstpad.sgml, docs/gst/tmpl/gstpipeline.sgml,
++ docs/gst/tmpl/gstplugin.sgml, docs/gst/tmpl/gstreamer-unused.sgml,
++ docs/random/hierarchy, docs/random/wtay/autoplug2,
++ editor/gsteditor.h, examples/autoplug/autoplug.c,
++ examples/helloworld2/helloworld2.c, examples/queue2/queue2.c,
++ examples/thread/thread.c, gst/Makefile.am, gst/gstautoplug.c,
++ gst/gstautoplug.h, gst/gstbin.c, gst/gstcaps.c, gst/gstcaps.h,
++ gst/gstelement.c, gst/gstelement.h, gst/gstelementfactory.c,
++ gst/gstobject.c, gst/gstpad.c, gst/gstpad.h, gst/gstpipeline.c,
++ gst/gstpipeline.h, gst/gstplugin.c, gst/gstplugin.h,
++ gst/gstprops.c, gst/gstthread.c, gst/gsttype.c, gst/gsttype.h,
++ gst/gsttypefind.c, gst/autoplug/Makefile.am,
++ gst/autoplug/gststaticautoplug.c, gst/autoplug/gststaticautoplug.h,
++ gst/autoplug/gststaticautoplugrender.c,
++ gst/autoplug/gststaticautoplugrender.h, gst/elements/gstdisksrc.c,
++ gst/elements/gstelements.c, gstplay/gstplay.c, gstplay/gstplay.h,
++ gstplay/gstplayprivate.h, plugins/Makefile.am,
++ plugins/avi/gstavidecoder.c, plugins/avi/playcodecs.c,
++ plugins/avi/wincodec/gstwincodec.c,
++ plugins/avi/wincodec/gstwindec.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c, plugins/xmms/Makefile.am,
++ plugins/xmms/plugin.h, test/mp1parse.c, tests/.cvsignore,
++ tests/Makefile.am, tests/autoplug.c, tests/autoplug2.c,
++ tests/autoplug3.c, tools/gstreamer-inspect.c: Merged the AUTOPLUG2
++ branch
++
++2001-03-06 22:32 wtay
++
++ * gst/gstbin.c, gst/gstpipeline.c, gst/gstutils.c, test/.cvsignore,
++ test/Makefile.am, test/videotest.c, test/xmmstest.c: Small fixes to
++ pipeline and gstbin. Fixed the xmmstest makefile entry Removed the
++ plugin_load statements in videotest Applied the patch from Steve
++ Baker for float args parsing
++
++2001-03-06 21:39 wtay
++
++ * AUTHORS, REQUIREMENTS, acconfig.h, configure.in, gstreamer.m4,
++ docs/manual/xml.sgml, examples/helloworld2/helloworld2.c,
++ examples/launch/mp3play, gst/Makefile.am, gst/cothreads.c,
++ gst/gstarch.h, gst/gstbin.c, gst/gstcpu.c, gst/gstelement.c,
++ gst/gstpad.c, gst/gstparse.c, gst/gstplugin.c, gst/gstsparc.h,
++ gst/gstutils.c, gst/gstutils.h, gstplay/Makefile.am,
++ plugins/capture/v4l/gstv4lsrc.c, plugins/capture/v4l/gstv4lsrc.h,
++ plugins/mpeg2/Makefile.am, plugins/mpeg2/mpeg2dec/Makefile.am,
++ plugins/mpeg2/mpeg2dec/attributes.h,
++ plugins/mpeg2/mpeg2dec/decode.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.h,
++ plugins/mpeg2/mpeg2dec/header.c, plugins/mpeg2/mpeg2dec/header.h,
++ plugins/mpeg2/mpeg2dec/idct.c, plugins/mpeg2/mpeg2dec/idct.h,
++ plugins/mpeg2/mpeg2dec/idct_mlib.c,
++ plugins/mpeg2/mpeg2dec/idct_mmx.c,
++ plugins/mpeg2/mpeg2dec/idct_mmx.h,
++ plugins/mpeg2/mpeg2dec/mm_accel.h,
++ plugins/mpeg2/mpeg2dec/motion_comp.c,
++ plugins/mpeg2/mpeg2dec/motion_comp.h,
++ plugins/mpeg2/mpeg2dec/motion_comp_mlib.c,
++ plugins/mpeg2/mpeg2dec/motion_comp_mmx.c,
++ plugins/mpeg2/mpeg2dec/motion_comp_sse.s,
++ plugins/mpeg2/mpeg2dec/mpeg2.h,
++ plugins/mpeg2/mpeg2dec/mpeg2_internal.h,
++ plugins/mpeg2/mpeg2dec/output_video.h,
++ plugins/mpeg2/mpeg2dec/slice.c, plugins/mpeg2/mpeg2dec/slice.h,
++ plugins/mpeg2/mpeg2dec/stats.c, plugins/mpeg2/mpeg2dec/vlc.h,
++ plugins/xmms/.cvsignore, plugins/xmms/Makefile.am,
++ plugins/xmms/effect.h, plugins/xmms/general.h,
++ plugins/xmms/gstxmms.c, plugins/xmms/gstxmms.h,
++ plugins/xmms/gstxmmseffect.c, plugins/xmms/gstxmmseffect.h,
++ plugins/xmms/gstxmmsinput.c, plugins/xmms/gstxmmsinput.h,
++ plugins/xmms/input.h, plugins/xmms/main.h, plugins/xmms/output.h,
++ plugins/xmms/plugin.h, plugins/xmms/pluginenum.c,
++ plugins/xmms/pluginenum.h, plugins/xmms/visualization.h,
++ plugins/xmms/xmms.h, test/.cvsignore, test/Makefile.am,
++ test/mpeg2parse2.c, test/videotest.c, test/xmmstest.c,
++ test/xml/readreg.c, tests/autoplug3.c: Synced with the HEAD branch
++ again... amazing how many changes we have in only a week time...
++
++2001-03-06 20:06 wtay
++
++ * examples/launch/mp3play: Added quotes around the command line mp3
++ player
++
++2001-03-06 20:04 wtay
++
++ * gst/gstparse.c: Applied Dominic Ludlam's patch to allow quoted
++ args in gstreamer-launch
++
++2001-03-05 23:06 wtay
++
++ * plugins/xmms/: gstxmmsinput.c, gstxmmsinput.h: Added state
++ changes to the input plugins. Added all of the xmms calls/info as
++ properties.
++
++2001-03-05 21:24 wtay
++
++ * test/xmmstest.c: Added an effect to the example
++
++2001-03-05 21:24 wtay
++
++ * plugins/xmms/: Makefile.am, gstxmms.c, gstxmmseffect.c,
++ gstxmmseffect.h, gstxmmsinput.c: Added a wrapper for the xmms
++ plugins.
++
++2001-03-05 19:37 wtay
++
++ * plugins/capture/v4l/: gstv4lsrc.c, gstv4lsrc.h: Added an option
++ to set the device
++
++2001-03-05 18:55 wtay
++
++ * plugins/mpeg2/mpeg2dec/gstmpeg2dec.c: Removed the sliced property
++ of the sink caps because this plugin can take random data.
++
++2001-03-04 23:40 wtay
++
++ * plugins/mpeg2/mpeg2dec/gstmpeg2dec.c: Adjusted the credits...
++ Changed the loop function so that it can stop.
++
++2001-03-04 22:37 dlehn
++
++ * plugins/mpeg2/mpeg2dec/: header.c, header.h, idct.c, idct.h,
++ idct_mmx.c, idct_mmx.h, motion_comp.c, motion_comp.h, slice.c,
++ slice.h: Whoops, remove the rest of the old mpeg2dec files.
++
++2001-03-04 22:26 dlehn
++
++ * test/mpeg2parse2.c: Use g_return_val_if_fail() instead of
++ g_return_if_fail() where needed.
++
++2001-03-04 22:22 dlehn
++
++ * acconfig.h, configure.in, plugins/mpeg2/Makefile.am,
++ plugins/mpeg2/mpeg2dec/Makefile.am,
++ plugins/mpeg2/mpeg2dec/attributes.h,
++ plugins/mpeg2/mpeg2dec/decode.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.h,
++ plugins/mpeg2/mpeg2dec/idct_mlib.c,
++ plugins/mpeg2/mpeg2dec/mm_accel.h,
++ plugins/mpeg2/mpeg2dec/motion_comp_mlib.c,
++ plugins/mpeg2/mpeg2dec/motion_comp_mmx.c,
++ plugins/mpeg2/mpeg2dec/motion_comp_sse.s,
++ plugins/mpeg2/mpeg2dec/mpeg2.h,
++ plugins/mpeg2/mpeg2dec/mpeg2_internal.h,
++ plugins/mpeg2/mpeg2dec/output_video.h,
++ plugins/mpeg2/mpeg2dec/stats.c, plugins/mpeg2/mpeg2dec/vlc.h,
++ test/.cvsignore: Update mpeg2dec plugin. Now depends on mpeg2dec
++ 0.2.0.
++
++2001-03-04 21:59 wtay
++
++ * test/: Makefile.am, xmmstest.c: Added a test program for xmms
++
++2001-03-04 21:58 wtay
++
++ * configure.in: Added makefile for xmms. libxmms detection is not
++ done yet.
++
++2001-03-04 21:57 wtay
++
++ * plugins/xmms/: .cvsignore, Makefile.am, effect.h, general.h,
++ gstxmms.c, gstxmms.h, gstxmmsinput.c, gstxmmsinput.h, input.h,
++ main.h, output.h, plugin.h, pluginenum.c, pluginenum.h,
++ visualization.h, xmms.h: Added an XMMS input filter plugin. MikMod,
++ mpg123, tonegen, vorbis are tested. Not everything works yet most
++ notably lots of properties are missing and the vis plugin pads are
++ not created. State changes are not yet handled as they should.
++
++2001-03-03 19:09 wtay
++
++ * tests/autoplug3.c: file autoplug3.c was initially added on branch
++ BRANCH-AUTOPLUG2.
++
++2001-03-03 19:09 wtay
++
++ * tests/: .cvsignore, autoplug3.c: Added a test program for the
++ autopluggers
++
++2001-03-03 19:08 wtay
++
++ * gst/autoplug/gststaticautoplugrender.c: file
++ gststaticautoplugrender.c was initially added on branch
++ BRANCH-AUTOPLUG2.
++
++2001-03-03 19:08 wtay
++
++ * gst/gstautoplug.c, gst/gstautoplug.h, gst/autoplug/Makefile.am,
++ gst/autoplug/gststaticautoplug.c,
++ gst/autoplug/gststaticautoplugrender.c,
++ gst/autoplug/gststaticautoplugrender.h, gstplay/gstplay.c,
++ gstplay/gstplayprivate.h, tests/Makefile.am, tests/autoplug.c,
++ tests/autoplug2.c: Added an API for element construction and
++ renderer autopluggers. Added another autoplugger to render things.
++ Updated the player to use the new autoplugger.
++
++2001-03-03 19:08 wtay
++
++ * gst/autoplug/gststaticautoplugrender.h: file
++ gststaticautoplugrender.h was initially added on branch
++ BRANCH-AUTOPLUG2.
++
++2001-03-03 18:19 wtay
++
++ * gst/gstutils.c: And the gst_utit_set_object_arg function too of
++ course...
++
++2001-03-03 17:38 wtay
++
++ * gst/gstelement.c: Added gstutils.h to #include
++
++2001-03-03 17:09 wtay
++
++ * configure.in: Added a comma to fix ./configure as found by Steve
++ Baker
++
++2001-03-03 16:30 wtay
++
++ * gst/: gstelement.c, gstparse.c, gstutils.h: Added a utility
++ function in gstutils to set an object argument as a string.
++ gstparse.c and gstelement.c now use this function.
++
++2001-03-02 18:30 omegahacker
++
++ * acconfig.h, configure.in, gst/Makefile.am, gst/cothreads.c,
++ gst/gstarch.h, gst/gstsparc.h: added sparc cothreads
++
++2001-03-02 17:56 wtay
++
++ * examples/helloworld2/helloworld2.c: Make the autoplugging example
++ work again with an ugly hack until we have autoplug2 merged...
++
++2001-03-02 17:03 richardb
++
++ * test/xml/readreg.c: Include compatability defines for libxml: use
++ xmlChildrenNode instead of childs.
++
++2001-03-02 16:50 richardb
++
++ * gst/gstplugin.c: Add advice to run gstreamer-register when
++ warning that registry needs rebuild.
++
++2001-03-02 16:49 richardb
++
++ * REQUIREMENTS: Mention that libxml is also known as gnome-xml
++
++2001-03-01 23:47 wtay
++
++ * AUTHORS: Updated the authors file.
++
++2001-03-01 23:25 wtay
++
++ * gstreamer.m4, gstplay/Makefile.am, test/videotest.c: Added the
++ .m4 script of Thomas Nyberg <thomas@codefactory.se>
++
++2001-03-01 22:36 wtay
++
++ * Makefile.am, configure.in, gstreamer-config.in,
++ debian/.cvsignore, debian/Makefile.am, debian/README.Debian,
++ debian/changelog, debian/control, debian/copyright,
++ debian/gsteditor.files, debian/gsteditor.menu,
++ debian/gstmediaplay.files, debian/gstmediaplay.menu,
++ debian/gstreamer-cdparanoia.files, debian/gstreamer-common.files,
++ debian/gstreamer-doc.files, debian/gstreamer-elements.files,
++ debian/gstreamer-esd.files, debian/gstreamer-lame.files,
++ debian/gstreamer-mpg123.files,
++ debian/gstreamer-plugin-template.postinst,
++ debian/gstreamer-plugin-template.prerm,
++ debian/gstreamer-runtime.files, debian/gstreamer-runtime.postinst,
++ debian/gstreamer-tools.files, debian/gstreamer-vorbis.files,
++ debian/libgst-dev.files, debian/libgst0.files,
++ debian/libgst0.postinst, debian/libgsteditor-dev.files,
++ debian/libgsteditor0.files, debian/libgsteditor0.postinst,
++ debian/libgstmediaplay-dev.files, debian/libgstmediaplay0.files,
++ debian/libgstmediaplay0.postinst, debian/rules, docs/Makefile.am,
++ docs/fwg/testapp.sgml, docs/fwg/titlepage.sgml,
++ docs/gst/Makefile.am, docs/gst/gstreamer-docs.sgml,
++ docs/gst/gstreamer-sections.txt, docs/gst/tmpl/gstbuffer.sgml,
++ docs/gst/tmpl/gstcaps.sgml, docs/gst/tmpl/gstdisksrc.sgml,
++ docs/gst/tmpl/gstobject.sgml, docs/gst/tmpl/gstpad.sgml,
++ docs/gst/tmpl/gstplugin.sgml, docs/gst/tmpl/gstreamer-unused.sgml,
++ docs/manual/Makefile.am, docs/manual/bins.sgml,
++ docs/manual/debugging.sgml, docs/manual/dynamic.sgml,
++ docs/manual/gstreamer-manual.sgml, docs/manual/helloworld.sgml,
++ docs/manual/helloworld2.sgml, docs/manual/pads.sgml,
++ docs/manual/plugins.sgml, docs/manual/queues.sgml,
++ docs/manual/quotes.sgml, docs/manual/threads.sgml,
++ docs/manual/typedetection.sgml, docs/manual/xml.sgml,
++ docs/plugins/Makefile.am, docs/plugins/gstdoc-scanobj,
++ docs/plugins/tmpl/ac3parse.sgml, docs/plugins/tmpl/audioscale.sgml,
++ docs/plugins/tmpl/gstaviencoder.sgml,
++ docs/plugins/tmpl/gstmpeg2enc.sgml,
++ docs/plugins/tmpl/gstmpeg2play.sgml,
++ docs/plugins/tmpl/gstmpeg_play.sgml,
++ docs/plugins/tmpl/gstreamer-plugins-unused.sgml,
++ docs/plugins/tmpl/gstspectrum.sgml,
++ docs/plugins/tmpl/gstv4lsrc.sgml, docs/plugins/tmpl/gstwindec.sgml,
++ docs/plugins/tmpl/gstwinenc.sgml, docs/plugins/tmpl/median.sgml,
++ docs/plugins/tmpl/mp3parse.sgml, docs/plugins/tmpl/mpeg1parse.sgml,
++ docs/plugins/tmpl/mpeg2parse.sgml,
++ docs/plugins/tmpl/mpeg2subt.sgml, docs/plugins/tmpl/smooth.sgml,
++ docs/plugins/tmpl/smoothwave.sgml, docs/plugins/tmpl/stereo.sgml,
++ docs/plugins/tmpl/synaesthesia.sgml,
++ docs/plugins/tmpl/system_encode.sgml,
++ docs/plugins/tmpl/videoscale.sgml,
++ docs/plugins/tmpl/videosink.sgml, docs/plugins/tmpl/volume.sgml,
++ docs/plugins/tmpl/vumeter.sgml, docs/random/NOTES-0.1.1,
++ docs/random/caps.dia, docs/random/wtay/caps-negociation,
++ examples/Makefile.am, examples/plugins/example.c,
++ examples/plugins/example.h, gst/Makefile.am, gst/gst.c, gst/gst.h,
++ gst/gstbin.c, gst/gstcaps.c, gst/gstcaps.h, gst/gstcpu.c,
++ gst/gstcpu.h, gst/gstelement.h, gst/gstinfo.h, gst/gstpad.c,
++ gst/gstpad.h, gst/gstplugin.c, gst/gstplugin.h, gst/gstprops.c,
++ gst/gstqueue.c, gst/gstscheduler.c, gst/gstthread.c, gst/gsttype.c,
++ gst/gstutils.h, gst/autoplug/gststaticautoplug.c,
++ gst/elements/gstdisksrc.c, gst/elements/gstelements.c,
++ gstplay/gstmediaplay.c, gstplay/gstplay.c, include/Makefile.am,
++ include/avifmt.h, include/default.h, include/registry.h,
++ libs/Makefile.am, libs/getbits/gstgetbits.c,
++ libs/getbits/gstgetbits.h, libs/getbits/gstgetbits_inl.h,
++ plugins/avi/audiocodecs.c, plugins/avi/gstavidecoder.c,
++ plugins/avi/playcodecs.c, plugins/avi/wincodec/gstwincodec.c,
++ plugins/avi/wincodec/gstwindec.c, plugins/avi/wincodec/gstwinenc.c,
++ plugins/capture/v4l/gstv4lsrc.c, plugins/jpeg/gstjpeg.c,
++ plugins/jpeg/gstjpegdec.c, plugins/mp3decode/mpg123/layer1.c,
++ plugins/mp3decode/mpg123/layer3.c,
++ plugins/mp3decode/mpg123/tabinit.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3encode/lame/gstlame.c, plugins/mp3encode/lame/gstlame.h,
++ plugins/mpeg1/mpeg_play/Makefile.am,
++ plugins/mpeg1/mpeg_play/recon_mmxe.s,
++ plugins/mpeg1/mpeg_play/recon_sse.s,
++ plugins/mpeg1/mpeg_play/video.c, plugins/mpeg2/ac3dec/cpu_accel.c,
++ plugins/mpeg2/mpeg2dec/motion_comp.c,
++ plugins/mpeg2/video/Makefile.am, plugins/mpeg2/video/recon.c,
++ plugins/mpeg2/video/recon_mmxe.s, plugins/mpeg2/video/recon_sse.s,
++ test/videotest.c, tools/README: Merge with the main trunk. GstPlay
++ needed some changes for the dynamic pads in the avidecoder since
++ the new autoplugger doesn't know about the outher elements. The
++ next version of the autoplugger will also handle the
++ audfio/videosink connections and will do a complete end-to-end
++ autoplugging.
++
++2001-03-01 19:43 wtay
++
++ * plugins/capture/v4l/gstv4lsrc.c: Hopefully fixed some more color
++ conversion issues
++
++2001-03-01 19:11 wtay
++
++ * plugins/capture/v4l/gstv4lsrc.c: Added more LE<->BE stuff
++
++2001-02-28 21:40 wtay
++
++ * gst/gstbin.c: Make sure a cothreaded element is selected as the
++ first one to start the cothread_switch
++
++2001-02-28 20:32 wtay
++
++ * gst/gstcpu.c: Redid the cpu detection with a little help from
++ mpeg2decs code..
++
++2001-02-27 22:43 wtay
++
++ * test/mpeg2parse2.c: Xv enabled, mpeg2dec is the decoder..
++
++2001-02-27 22:38 wtay
++
++ * test/Makefile.am: and the updated makefile...
++
++2001-02-27 22:27 wtay
++
++ * test/mpeg2parse2.c: Added a simple mpeg2 player for testing
++ mpeg2dec (later)
++
++2001-02-27 21:08 wtay
++
++ * docs/gst/: Makefile.am, gstreamer.hierarchy, gstreamer.types.in,
++ tmpl/gstasyncdisksrc.sgml, tmpl/gstautoplug.sgml, tmpl/gstpad.sgml,
++ tmpl/gstpipeline.sgml, tmpl/gstplugin.sgml,
++ tmpl/gstreamer-unused.sgml: Small compile fixes
++
++2001-02-27 20:34 wtay
++
++ * gst/autoplug/gststaticautoplug.c: file gststaticautoplug.c was
++ initially added on branch BRANCH-AUTOPLUG2.
++
++2001-02-27 20:34 wtay
++
++ * docs/random/plugins.dia, gst/gstbin.c, gst/gstcaps.c,
++ gst/gstthread.c, gst/autoplug/Makefile.am,
++ gst/autoplug/gststaticautoplug.c, gst/autoplug/gststaticautoplug.h:
++ Added the missing autoplugger, doh
++
++2001-02-27 20:34 wtay
++
++ * gst/autoplug/gststaticautoplug.h: file gststaticautoplug.h was
++ initially added on branch BRANCH-AUTOPLUG2.
++
++2001-02-27 20:34 wtay
++
++ * gst/autoplug/Makefile.am: file Makefile.am was initially added on
++ branch BRANCH-AUTOPLUG2.
++
++2001-02-27 19:44 wtay
++
++ * gst/gstcpu.c, gst/gstcpu.h, plugins/mpeg1/mpeg_play/Makefile.am,
++ plugins/mpeg1/mpeg_play/recon_mmxe.s,
++ plugins/mpeg1/mpeg_play/recon_sse.s,
++ plugins/mpeg1/mpeg_play/video.c, plugins/mpeg2/ac3dec/cpu_accel.c,
++ plugins/mpeg2/video/Makefile.am, plugins/mpeg2/video/recon.c,
++ plugins/mpeg2/video/recon_mmxe.s, plugins/mpeg2/video/recon_sse.s,
++ test/videotest.c: CPU detection of MMXEXT and probably 3DNOW (not
++ on Athlon yet) Renamed the mmxe motion compentation files.
++ disabled SSE optimisation in ac3dec because it apparently faults..
++ enable MMXEXT motion compensation on non SSE CPUs (AMD)
++
++2001-02-27 00:05 wtay
++
++ * docs/gst/Makefile.am, docs/gst/tmpl/gstcaps.sgml,
++ docs/gst/tmpl/gstreamer-unused.sgml, docs/plugins/Makefile.am,
++ docs/plugins/gstdoc-scanobj, docs/plugins/tmpl/ac3parse.sgml,
++ docs/plugins/tmpl/audioscale.sgml,
++ docs/plugins/tmpl/gstaviencoder.sgml,
++ docs/plugins/tmpl/gstmpeg2enc.sgml,
++ docs/plugins/tmpl/gstmpeg2play.sgml,
++ docs/plugins/tmpl/gstmpeg_play.sgml,
++ docs/plugins/tmpl/gstreamer-plugins-unused.sgml,
++ docs/plugins/tmpl/gstspectrum.sgml,
++ docs/plugins/tmpl/gstv4lsrc.sgml, docs/plugins/tmpl/gstwindec.sgml,
++ docs/plugins/tmpl/gstwinenc.sgml, docs/plugins/tmpl/median.sgml,
++ docs/plugins/tmpl/mp3parse.sgml, docs/plugins/tmpl/mpeg1parse.sgml,
++ docs/plugins/tmpl/mpeg2parse.sgml,
++ docs/plugins/tmpl/mpeg2subt.sgml, docs/plugins/tmpl/smooth.sgml,
++ docs/plugins/tmpl/smoothwave.sgml, docs/plugins/tmpl/stereo.sgml,
++ docs/plugins/tmpl/synaesthesia.sgml,
++ docs/plugins/tmpl/system_encode.sgml,
++ docs/plugins/tmpl/videoscale.sgml,
++ docs/plugins/tmpl/videosink.sgml, docs/plugins/tmpl/volume.sgml,
++ docs/plugins/tmpl/vumeter.sgml, plugins/avi/gstavidecoder.c,
++ plugins/jpeg/gstjpegdec.c: A hopeless attempt at fixing the plugin
++ docs Makefiles... Make the jpeg decoder a bit more aware about the
++ different YUV colorspaces.
++
++2001-02-25 23:11 dlehn
++
++ * debian/changelog: Oops... wrong email address
++
++2001-02-25 23:08 dlehn
++
++ * debian/: changelog, rules: Updated version and build fix.
++
++2001-02-25 03:42 bbradburn
++
++ * gst/: gst.h, gstcaps.h, gstinfo.h, gstutils.h: Patched .h files
++ for C++ support.
++
++2001-02-25 03:40 omegahacker
++
++ * gst/gstplugin.c: swapped ordering of plugin dirs so srcdir
++ plugins load first
++
++2001-02-25 03:36 omegahacker
++
++ * configure.in, gst/gstbin.c, libs/getbits/gstgetbits.c,
++ plugins/mp3decode/mpg123/layer1.c,
++ plugins/mp3decode/mpg123/layer3.c,
++ plugins/mp3decode/mpg123/tabinit.c: commented out some printfs that
++ went to stdout
++
++2001-02-24 21:07 dlehn
++
++ * debian/rules: Call configure instead of autogen.sh.
++
++2001-02-24 20:06 wtay
++
++ * configure.in, include/default.h: Remove some unneeded files Added
++ a fix for broken libglade-config in configure.in
++
++2001-02-24 19:33 dlehn
++
++ * Makefile.am, configure.in, debian/Makefile.am: Add Debian files
++ to distribution.
++
++2001-02-24 19:28 wtay
++
++ * include/Makefile.am: Make dist now works
++
++2001-02-24 17:49 wtay
++
++ * include/avifmt.h, include/registry.h,
++ plugins/avi/wincodec/gstwinenc.c: Moved some win32 files around
++ small fixes to wincodec
++
++2001-02-24 16:56 wtay
++
++ * Makefile.am, configure.in, docs/Makefile.am,
++ examples/Makefile.am: Added directories to Makefiles for DIST
++
++2001-02-24 00:23 wtay
++
++ * gst/gst.c, plugins/capture/v4l/gstv4lsrc.c, test/videotest.c:
++ slightly changed the Makefile.am in videoscale libs. v4lsrc works
++ again A little modification to the videotest programm to use a tee
++ element. added support for multiple paths in --gst-plugin_path=.
++ added ab ENV variable GST_PLUGIN_PATH to specify extra directories
++ to look for plugins.
++
++2001-02-23 19:22 wtay
++
++ * docs/gst/gstreamer-sections.txt, docs/gst/tmpl/gstplugin.sgml,
++ docs/gst/tmpl/gstreamer-unused.sgml, docs/manual/debugging.sgml,
++ gst/gstplugin.c: Updated the docs for gst_pluging_add_path Updated
++ the manual with the new --gst-plugin-path/spew options
++
++2001-02-23 19:09 wtay
++
++ * docs/gst/tmpl/: gstasyncdisksrc.sgml, gstreamer-unused.sgml:
++ Removed the asyncdisksrc again...
++
++2001-02-23 19:09 omegahacker
++
++ * gst/: gst.c, gstplugin.c, gstplugin.h, gstthread.c: Added two
++ options: --gst-plugin-spew will print errors when plugins fail to
++ load. --gst-plugin-path= will add a directory to the path searched
++ for plugins.
++
++2001-02-23 01:57 omegahacker
++
++ * gst/gstplugin.c: always include the installed plugin directories
++ in the path
++
++2001-02-23 00:55 omegahacker
++
++ * configure.in, gstreamer-config.in: updates to configure.in and
++ -config to help with cross compiling
++
++2001-02-22 23:19 wtay
++
++ * docs/random/NOTES-0.1.1: Added the current notes for the 0.1.1
++ release
++
++2001-02-22 23:18 wtay
++
++ * docs/gst/gstreamer-sections.txt, docs/gst/tmpl/gstbuffer.sgml,
++ docs/gst/tmpl/gstdisksrc.sgml, docs/gst/tmpl/gstobject.sgml,
++ docs/gst/tmpl/gstpad.sgml, docs/gst/tmpl/gstreamer-unused.sgml,
++ docs/manual/Makefile.am, docs/manual/debugging.sgml,
++ docs/manual/gstreamer-manual.sgml, docs/manual/pads.sgml,
++ docs/manual/quotes.sgml, docs/manual/xml.sgml,
++ examples/plugins/example.c, examples/plugins/example.h, gst/gst.c,
++ gst/gstpad.c, gst/gstpad.h, plugins/mp3decode/parse/mp3parse.c:
++ More doc updates Manual additions: xml/load save of custom XML,
++ debugging, request pads added a signal to the example plugin fixed
++ a bug in mp3parse (ifdef 1)
++
++2001-02-22 17:13 wtay
++
++ * examples/plugins/example.c: Fixed an unclosed comment
++
++2001-02-22 01:53 omegahacker
++
++ * plugins/mp3decode/parse/mp3parse.c: beginnings of a loop-based
++ seek-capable mp3parse
++
++2001-02-22 01:36 bbradburn
++
++ * plugins/mp3decode/parse/mp3parse.c: Improved robustness of MP3
++ seeking by validating the NEXT frame header.
++
++2001-02-22 01:34 omegahacker
++
++ * examples/plugins/: example.c, example.h: significant commenting
++ of the example plugin
++
++2001-02-22 00:47 omegahacker
++
++ * gst/gstelement.h: minor change: changed case of the strings for
++ states
++
++2001-02-21 23:01 wtay
++
++ * configure.in, docs/gst/tmpl/gstasyncdisksrc.sgml,
++ docs/gst/tmpl/gstpad.sgml, docs/gst/tmpl/gstreamer-unused.sgml,
++ plugins/jpeg/gstjpeg.c, plugins/jpeg/gstjpegdec.c,
++ plugins/mp3encode/lame/gstlame.c, plugins/mp3encode/lame/gstlame.h:
++ Fixed the jpeg decoder Modifications for lame >=3.86
++
++2001-02-21 22:32 dlehn
++
++ * debian/: .cvsignore, README.Debian, changelog, control,
++ copyright, gsteditor.files, gsteditor.menu, gstmediaplay.files,
++ gstmediaplay.menu, gstreamer-cdparanoia.files,
++ gstreamer-common.files, gstreamer-doc.files,
++ gstreamer-elements.files, gstreamer-esd.files,
++ gstreamer-lame.files, gstreamer-mpg123.files,
++ gstreamer-plugin-template.postinst,
++ gstreamer-plugin-template.prerm, gstreamer-runtime.files,
++ gstreamer-runtime.postinst, gstreamer-tools.files,
++ gstreamer-vorbis.files, libgst-dev.files, libgst0.files,
++ libgst0.postinst, libgsteditor-dev.files, libgsteditor0.files,
++ libgsteditor0.postinst, libgstmediaplay-dev.files,
++ libgstmediaplay0.files, libgstmediaplay0.postinst, rules: Initial
++ Debian packaging.
++
++2001-02-21 20:58 dlehn
++
++ * libs/getbits/: gstgetbits.h, gstgetbits_inl.h: Use glib macros
++ for byte order conversion.
++
++2001-02-21 20:57 dlehn
++
++ * gst/elements/gstelements.c: Remove alias for asyncdisksrc
++ backwards compatability.
++
++2001-02-21 20:45 dlehn
++
++ * docs/gst/: Makefile.am, gstreamer-docs.sgml,
++ gstreamer-sections.txt, gstreamer.hierarchy, gstreamer.types.in,
++ tmpl/gstasyncdisksrc.sgml: Removed asyncdisksrc references from
++ docs.
++
++2001-02-21 20:28 dlehn
++
++ * gst/elements/gstdisksrc.c: Fixed typo in element details.
++
++2001-02-21 20:27 dlehn
++
++ * gst/gstqueue.c: Added parameter checking to gst_queue_get().
++
++2001-02-21 00:57 omegahacker
++
++ * gst/gstscheduler.c: Fixed bug with reconfig, where switching back
++ into an element landed it in code that still thought it was
++ connected to the previous element. It now checks to see if the
++ peer's peer has changed, and deal accordingly.
++
++2001-02-20 08:19 omegahacker
++
++ * gst/gstbin.c, gst/gstelement.c, tests/incsched.c,
++ gst/gstscheduler.c, gst/gstscheduler.h, gst/elements/gstfakesrc.c,
++ gst/elements/gstfakesrc.h: Significant progress. Now able to do
++ most operations live, without any failure. tests/incsched.c
++ currently faults at the last iteration, not yet sure why.
++
++2001-02-19 22:15 wtay
++
++ * tests/nego/nego1.c: file nego1.c was initially added on branch
++ BRANCH-CAPSNEGO1.
++
++2001-02-19 22:15 wtay
++
++ * tests/nego/Makefile.am: file Makefile.am was initially added on
++ branch BRANCH-CAPSNEGO1.
++
++2001-02-19 22:15 wtay
++
++ * tests/nego/.cvsignore: file .cvsignore was initially added on
++ branch BRANCH-CAPSNEGO1.
++
++2001-02-19 22:15 wtay
++
++ * tests/nego/: .cvsignore, Makefile.am, nego1.c: Added the caps
++ negotiation test program
++
++2001-02-19 20:20 wtay
++
++ * configure.in, docs/random/wtay/caps-negociation,
++ editor/gsteditorproperty.c, gst/gstautoplug.c, gst/gstcaps.c,
++ gst/gstpad.c, gst/gstpad.h, gst/gstpipeline.c: A first attempt at
++ pad negotiation. - _renegotiate can be called by a plugin to
++ negotiate the caps - _renegotiate is called whenever a pad
++ changes its caps - the caps cannot contain lists or ranges -
++ the pad caps are now only set explicitly using gst_pad_set_caps,
++ the padtemplate caps are not transfered to the pad caps.
++
++ missing: - no notification when negotiation fails - autoplugging
++ is broken - the editor doesn't show correct caps
++
++2001-02-19 00:07 wtay
++
++ * libs/Makefile.am: The BPB has been put over my head... this time
++ it's right I think
++
++2001-02-18 23:58 wtay
++
++ * libs/Makefile.am: Also build the videoscaler on non-I386 because
++ we now have have a plain C version too.
++
++2001-02-18 10:00 omegahacker
++
++ * gst/gstbin.c, gst/gstscheduler.c, gst/gstscheduler.h,
++ tests/incsched.c: More incsched progress. Should be able to get
++ itereration going again tomorrow.
++
++2001-02-17 07:11 omegahacker
++
++ * gst/Makefile.am, gst/gst.h, gst/gstbin.c, gst/gstbin.h,
++ gst/gstelement.c, gst/gstelement.h, gst/gstobject.h, gst/gstpad.c,
++ gst/gstpad.h, gst/gstpipeline.c, gst/gstscheduler.c,
++ gst/gstscheduler.h, gst/gstthread.c, tests/incsched.c: Yes!,
++ incsched is getting closer.
++
++2001-02-17 04:43 mhowell
++
++ * plugins/mp3decode/parse/mp3parse.c: added test for emphasis to
++ check_head
++
++2001-02-17 00:00 omegahacker
++
++ * plugins/mpeg2/mpeg2dec/motion_comp.c: fixed an issue relating to
++ macros and ##arg## syntax
++
++2001-02-16 23:54 richardb
++
++ * gst/gstprops.c: Redo patch using _NUM rather than converting one
++ way and then back again, as wtay suggested. Ho hum.
++
++2001-02-16 23:52 omegahacker
++
++ * docs/manual/quotes.sgml: more interesting than a 40K user
++ program...
++
++2001-02-16 23:45 richardb
++
++ * gst/gstprops.c: Fix missing GPOINTER_TO_INT()'s on case values.
++
++2001-02-16 23:39 omegahacker
++
++ * docs/manual/quotes.sgml: added groupie quote
++
++2001-02-16 16:48 richardb
++
++ * docs/: fwg/testapp.sgml, manual/bins.sgml, manual/dynamic.sgml,
++ manual/helloworld.sgml, manual/helloworld2.sgml, manual/pads.sgml,
++ manual/plugins.sgml, manual/queues.sgml, manual/threads.sgml,
++ manual/typedetection.sgml, manual/xml.sgml: Fix a few more issues
++ shown up by gnome-db2html2 - %'s should be written as % (was
++ causing gnome-db2html2 to segfault, though I've a patch for them to
++ fix that). Also correct an id which appeared twice.
++
++2001-02-16 13:13 richardb
++
++ * gst/gstpad.h: Include compatability defines for old versions of
++ libxml1
++
++2001-02-16 12:15 richardb
++
++ * tools/README: Trivial fix: change launch to gstreamer-launch in
++ README.
++
++2001-02-16 12:14 richardb
++
++ * docs/: fwg/titlepage.sgml, manual/Makefile.am,
++ manual/gstreamer-manual.sgml: Fix a few irregularities, to make
++ things closer to the Gnome standard guidelines for SGML
++ documentation. One change in particular is to change the book name
++ for the manual from gstreamer to index; a change to the link to the
++ manual on the website will thus be needed when the online version
++ of the manual is next updated.
++
++ These changes should make it possible to view the GStreamer
++ documentation directly from SGML in Nautilus: anyone with a working
++ copy of Nautilus should try this out and report ... ;-)
++
++2001-02-15 18:42 richardb
++
++ * gst/gstpad.c: Fix a couple of instances of childs, which should
++ be xmlChildrenNode. We need to be careful to stop these creeping
++ back in... ;-)
++
++2001-02-14 23:23 omegahacker
++
++ * gst/gstpad.c, gst/gstpad.h, gst/gstscheduler.c,
++ gst/gstscheduler.h, tests/incsched.c: More incsched updates. Now
++ need to get the headers redone...
++
++2001-02-14 10:34 richardb
++
++ * configure.in: Innocuous little change to fix a warning with newer
++ versions of automake - shouldn't cause any backwards compatibility
++ problems.
++
++2001-02-13 20:48 wtay
++
++ * docs/random/wtay/caps-negociation: Latest begotiation doc
++
++2001-02-13 02:40 omegahacker
++
++ * gst/gstscheduler.c, gst/gstscheduler.h, tests/incsched.c: Minor
++ changes to incsched stuff, need to make more major modifications to
++ manager concept now, so I'm checkpointing.
++
++2001-02-12 23:08 omegahacker
++
++ * gst/cothreads.c, gst/gstbin.c, gst/gstbin.h, gst/gstelement.c,
++ gst/gstelement.h, gst/gstobject.c, gst/gstobject.h, gst/gstpad.c,
++ gst/gstpipeline.c, gst/gstqueue.c, gst/gstscheduler.c,
++ gst/gstscheduler.h, gst/gstthread.c, gst/gstthread.h,
++ tests/Makefile.am, tests/incsched.c: First round of incremental
++ scheduling. Manager setting and managed_elements lists are now
++ handled at bin_add/remove time. Scheduling chains can be created
++ incrementally as well, though there are still some pieces missing.
++
++2001-02-12 23:08 omegahacker
++
++ * tests/incsched.c: file incsched.c was initially added on branch
++ BRANCH-INCSCHED1.
++
++2001-02-11 22:22 wtay
++
++ * docs/random/: caps.dia, wtay/caps-negociation: Corrected the
++ associations on the UML diagrams
++
++2001-02-11 18:29 wtay
++
++ * docs/random/: caps.dia, plugins.dia, wtay/caps-negociation: Added
++ .dia UML of GstCaps Added the autoplugger factory to plugins.dia
++ Added a first draft for caps-negotiation
++
++2001-02-10 14:46 wtay
++
++ * gst/gstprops.c, gst/gstscheduler.c, gstplay/gstmediaplay.c,
++ plugins/avi/audiocodecs.c, plugins/avi/gstavidecoder.c,
++ plugins/avi/playcodecs.c: - backported the xml load bug in the
++ properties - backported the videosink bug - make sure the
++ regiontype is set to NONE after a getregion - an ugly fix (copy the
++ chainfunction outselves) to make the avidecoder work again.
++
++2001-02-08 19:52 wtay
++
++ * docs/random/wtay/autoplug2: Updated the doc with more accurate
++ implementation details
++
++2001-02-08 19:37 wtay
++
++ * tests/autoplug2.c: file autoplug2.c was initially added on branch
++ BRANCH-AUTOPLUG2.
++
++2001-02-08 19:37 wtay
++
++ * configure.in, editor/gsteditor.h, gst/Makefile.am,
++ gst/gstautoplug.c, gst/gstautoplug.h, gst/gstelementfactory.c,
++ gst/gstpipeline.c, gst/gstplugin.c, gst/gstplugin.h,
++ gst/gstprops.c, gst/gsttype.c, gst/elements/gstdisksrc.c,
++ gst/elements/gstelements.c, gstplay/gstplay.c, tests/Makefile.am,
++ tests/autoplug.c, tests/autoplug2.c, tools/gstreamer-inspect.c:
++ Implemented the plugable autopluggers. - one can aad an
++ autoplugger to a plugin with gst_plugin_add_autoplugger - the
++ autopluggers can be queried using _get_list - save/load
++ autoplugger descriptions in the XML registry - load the
++ autoplugger only when needed - a signal can be attached to the
++ autoplugger to be notified of new objects. - improved the
++ media player to use the new autoplugger - updated
++ gstreamer-inspect for the autoplugger and types added EOS to the
++ disksrc fixed two bugs in properties loading (min/max, comment
++ tags)
++
++2001-02-07 22:48 omegahacker
++
++ * configure.in: removed intl and po from configure.in, until we
++ have gettext working
++
++2001-02-07 22:23 omegahacker
++
++ * Makefile.am, configure.in: added configure option to turn on
++ building of docs, else they aren't built
++
++2001-02-07 22:07 omegahacker
++
++ * gst/Makefile.am: Fixed cothreads.c problems with make dist. This
++ still sucks badly.
++
++2001-02-06 20:42 wtay
++
++ * docs/gst/tmpl/gstreamer-unused.sgml,
++ examples/autoplug/autoplug.c, examples/helloworld2/helloworld2.c,
++ examples/queue2/queue2.c, examples/thread/thread.c,
++ gst/gstautoplug.c, gst/gstautoplug.h, gst/gstbin.c, gst/gstcaps.h,
++ gst/gstelement.c, gst/gstelement.h, gst/gstobject.c, gst/gstpad.c,
++ gst/gstpad.h, gst/gstpipeline.c, gst/gstpipeline.h,
++ gst/gstplugin.h, gst/gsttype.h, gst/gsttypefind.c,
++ gst/elements/gstdisksrc.c, gstplay/gstplay.c, gstplay/gstplay.h,
++ gstplay/gstplayprivate.h, plugins/avi/gstavidecoder.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c, test/mp1parse.c,
++ tests/.cvsignore, tests/Makefile.am, tests/autoplug.c: Updated the
++ autoplugger: - moved all of the code out of gstpipeline.c to
++ autoplug.c - The autoplugger now creates a GstElement based on
++ the given src and sink caps. The API now is: GstElement*
++ gst_autoplug_caps_list (GList *srcpad, GList *sinkpad, ...); -
++ the typefind function is moved from gstpipeline.c to gstplay.c. Not
++ sure if this is right behaviour but we need at least a bin in
++ order to run the typedetect functions. - fixed a bug in
++ gstbin.c where the MANAGER flag of the bin was not cleared
++ when going to the NULL state. - a bug in the videosink was
++ fixed. It was possible that more instances of the video widget
++ were created, causing major errors. - commented out most of the
++ 'old' autoplug examples. - added the new autoplugger to
++ gstplay.c. There still is a bit of hacking needed to insert a
++ queue into the autogenerated element. This will be fixed when
++ the autoplugger can also create the video/audio elements. Fixed
++ some more extranous spaces problems in various files.
++
++2001-02-06 20:06 wtay
++
++ * docs/random/: .cvsignore, wtay/CORBA, wtay/autoplug2: Added CVS
++ ignore, and two documents..
++
++2001-02-06 19:39 omegahacker
++
++ * test/ac3play.c: updated ac3play to work with latest libgst
++
++2001-02-05 17:17 omegahacker
++
++ * plugins/avi/gstavidecoder.c: Updated for new getregion setup
++
++2001-02-05 17:16 omegahacker
++
++ * gst/: gstinfo.h, gstpad.c, gstpad.h, gstscheduler.c,
++ elements/gstdisksrc.c: Reworked getregion/pullregion stuff. Region
++ is now specified by a type (OFFSET_LEN, TIME_LEN, etc.) and two
++ guint64's. They are offset and len, where offset can be used for
++ the time field, and len would be zero or the time unit (say, 33ms
++ for video).
++
++2001-02-04 21:38 omegahacker
++
++ * gstplay/gstplay.c, test/mp1parse.c, test/qtest.c: fixed all
++ in-use instances of asyncdisksrc
++
++2001-02-04 21:37 omegahacker
++
++ * gst/elements/: Makefile.am, gstasyncdisksrc.c, gstasyncdisksrc.h,
++ gstdisksrc.c, gstdisksrc.h, gstelements.c: moved asyncdisksrc to
++ disksrc, no point in having a distinction
++
++2001-02-03 07:25 omegahacker
++
++ * configure.in: fixed up the Alpha and ARM processor checks
++
++2001-02-01 17:42 omegahacker
++
++ * plugins/mpeg2/video/recon.c: added ifdef around the x86 code,
++ specifically SSE
++
++2001-02-01 17:39 omegahacker
++
++ * plugins/mpeg1/mpeg_play/video.c: added ifdef around the x86 code,
++ specifically SSE
++
++2001-01-31 22:54 omegahacker
++
++ * acconfig.h, configure.in, gst/gstarm.h: ARM works!
++
++2001-01-31 20:27 wtay
++
++ * docs/gst/gstreamer-docs.sgml, docs/gst/gstreamer-sections.txt,
++ docs/gst/gstreamer.hierarchy, docs/gst/gstreamer.types.in,
++ docs/gst/tmpl/gstbin.sgml, docs/gst/tmpl/gstelement.sgml,
++ docs/gst/tmpl/gstobject.sgml, docs/gst/tmpl/gstreamer-unused.sgml,
++ docs/gst/tmpl/gstxml.sgml, gst/gstelement.c, gst/gstobject.c,
++ gst/gstxml.c, gst/gstxml.h: Documentation updates.
++
++2001-01-30 23:53 wtay
++
++ * examples/xml/createxml.c, examples/xml/runxml.c,
++ gst/gstelement.c, gst/gstobject.c, gst/gstobject.h, gst/gstxml.c,
++ gst/gstxml.h: Added a first attempt for XML embedding in the main
++ core XML. Objects will emit a signal that a user app can connect
++ to in order to insert its XML into the tree. You can catch the
++ object_loaded signal in GstXML to parse the user supplied XML data
++ in the stream. The object_loaded signal is implemented with a
++ custom made class signal. All GstObject classes now automatically
++ create a GstSignalObject that serves as a proxy to the user app
++ when an object is loaded. All objects are currently responsible to
++ emit the class signal themselves. runxml and createxml serve as an
++ example how the XML hooks can be used to insert and retrieve custom
++ XML tags.
++
++2001-01-29 23:51 wtay
++
++ * docs/random/wtay/qos: The early beginnings of a doc about QoS :-)
++
++2001-01-29 23:50 wtay
++
++ * examples/plugins/example.c, examples/plugins/example.h,
++ gst/gstxml.c, plugins/audioscale/audioscale.c,
++ plugins/avi/gstavidecoder.c, plugins/avi/gstaviencoder.c,
++ plugins/avi/wincodec/gstwindec.c, plugins/avi/wincodec/gstwinenc.c,
++ plugins/cdparanoia/cdparanoia.c,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3encode/lame/gstlame.c: Lots of plugins fixes where the
++ parentage macros were replaced with the correct gst_*_get_parent.
++ Updated the example. 'gstreamer' now is the doc type instead of
++ GST-Pipeline
++
++2001-01-29 23:32 wtay
++
++ * docs/random/wtay/namespaces: Added ramblings about the XML
++ load/save
++
++2001-01-29 00:06 wtay
++
++ * docs/gst/tmpl/gstelement.sgml, docs/gst/tmpl/gstpad.sgml,
++ docs/gst/tmpl/gstreamer-unused.sgml, docs/gst/tmpl/gstxml.sgml,
++ editor/gsteditorpad.c, editor/gsteditorproject.c,
++ examples/plugins/example.c, examples/xml/createxml.c,
++ examples/xml/runxml.c, gst/gstbin.c, gst/gstbin.h, gst/gstclock.c,
++ gst/gstelement.c, gst/gstelement.h, gst/gstelementfactory.c,
++ gst/gstinfo.c, gst/gstinfo.h, gst/gstobject.c, gst/gstobject.h,
++ gst/gstpad.c, gst/gstpad.h, gst/gstparse.c, gst/gstparse.h,
++ gst/gstpipeline.c, gst/gstplugin.c, gst/gstqueue.c,
++ gst/gstscheduler.c, gst/gstthread.c, gst/gsttypefind.c,
++ gst/gstxml.c, gst/gstxml.h, gst/elements/gstasyncdisksrc.c,
++ gst/elements/gstaudiosink.c, gst/elements/gstaudiosrc.c,
++ gst/elements/gstdisksrc.c, gst/elements/gstfakesink.c,
++ gst/elements/gstfakesrc.c, gst/elements/gstfdsink.c,
++ gst/elements/gstfdsrc.c, gst/elements/gsthttpsrc.c,
++ gst/elements/gstidentity.c, gst/elements/gstpipefilter.c,
++ gst/elements/gstsinesrc.c, gst/elements/gsttee.c,
++ gstplay/gstmediaplay.c, plugins/au/gstparseau.c,
++ plugins/audioscale/audioscale.c, plugins/avi/gstavidecoder.c,
++ plugins/avi/gstaviencoder.c, plugins/avi/wincodec/gstwindec.c,
++ plugins/avi/wincodec/gstwinenc.c, plugins/capture/v4l/gstv4lsrc.c,
++ plugins/capture/v4l/gstv4lsrc.h, plugins/cdparanoia/cdparanoia.c,
++ plugins/cdparanoia/cdparanoia.h, plugins/effects/stereo/stereo.c,
++ plugins/effects/stereo/stereo.h, plugins/effects/volume/volume.c,
++ plugins/effects/volume/volume.h, plugins/esd/esdsink/esdsink.c,
++ plugins/filters/ladspa/gstladspa.c,
++ plugins/filters/median/median.c, plugins/filters/median/median.h,
++ plugins/filters/smooth/smooth.c, plugins/filters/smooth/smooth.h,
++ plugins/icecast/icecastsend/icecastsend.c,
++ plugins/jpeg/Makefile.am, plugins/jpeg/gstjpeg.c,
++ plugins/jpeg/gstjpeg.h, plugins/jpeg/gstjpegdec.c,
++ plugins/jpeg/gstjpegdec.h, plugins/jpeg/gstjpegenc.c,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3encode/lame/gstlame.c, plugins/mp3encode/lame/gstlame.h,
++ plugins/mpeg1/mpeg1encoder/gstmpeg1encoder.c,
++ plugins/mpeg1/mpeg1encoder/gstmpeg1encoder.h,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.c,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.h,
++ plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1/system_encode/system_encode.c,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg2/ac3dec/ac3dec.c, plugins/mpeg2/ac3dec/ac3dec.h,
++ plugins/mpeg2/ac3parse/ac3parse.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.c,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.h,
++ plugins/mpeg2/parse/mpeg2parse.c, plugins/mpeg2/parse/mpeg2parse.h,
++ plugins/mpeg2/subtitles/mpeg2subt.c,
++ plugins/mpeg2/video/gstmpeg2play.c,
++ plugins/mpeg2/video/gstmpeg2play.h,
++ plugins/mpeg2/videoparse/mp2videoparse.c,
++ plugins/rtjpeg/rtjpegdec.c, plugins/rtjpeg/rtjpegenc.c,
++ plugins/rtjpeg/rtjpegenc.h, plugins/vcdsrc/vcdsrc.c,
++ plugins/vcdsrc/vcdsrc.h, plugins/videoscale/videoscale.c,
++ plugins/visualization/smoothwave/smoothwave.c,
++ plugins/visualization/smoothwave/smoothwave.h,
++ plugins/visualization/spectrum/gstspectrum.c,
++ plugins/visualization/synaesthesia/synaesthesia.c,
++ plugins/visualization/vumeter/vumeter.c,
++ plugins/visualization/vumeter/vumeter.h,
++ plugins/vorbis/vorbisenc.c, plugins/wav/gstparsewav.c,
++ plugins/wav/gstparsewav.h, test/record.c, tests/sched/runxml.c,
++ tools/gstreamer-inspect.c: This is a megapatch with the following
++ changes:
++
++ - moved the gchar *name to GstObject, removed the ones in
++ GstElement and
++ GstPad.
++ - moved the parent handling completely into GstObject. This cause
++ *all* of
++ the plugins to fail (except those that used gst_pad_get_parent)
++ - rearanged the XML save handling.
++ - GstObject now has a class function save/restore_thyself.
++ - GstObject has a generic method gst_object_save_thyself, this
++ makes it
++ possible to fire a signal wehever a new object is loaded. This
++ is needed
++ so we can add XML save hooks.
++ - GstXML API has changed slightly. You now have to create a
++ GstXML object
++ first before you can actually load something. This makes it
++ possible to
++ attach a signal to GstXML whenever an object is loaded. I'm
++ not sure we
++ will keep this interface.
++ - GstObject can now print the path_string without knowing about
++ the GstPad and
++ GstElement types.
++ - Added gst_bin_get_by_name_recurse_up to lookup an element in the
++ current
++ element hierarchy.
++ - added XML namespaces to the saved pipelines the namespace is:
++ http://gstreamer.net/gst-core/1.0/
++ namespaces are needed to distinguish user generated XML from the
++ core XML.
++
++ Note that the plugins still contain a macro GST_OBJECT_PARENT that
++ will be replaced with gst_pad_get_parent shortly.
++
++2001-01-26 23:35 wtay
++
++ * REQUIREMENTS: Added the requirement for libshout
++
++2001-01-26 23:33 wtay
++
++ * configure.in: For the icecast sender
++
++2001-01-26 23:33 wtay
++
++ * plugins/: Makefile.am, icecast/Makefile.am,
++ icecast/icecastsend/.cvsignore, icecast/icecastsend/Makefile.am,
++ icecast/icecastsend/icecastsend.c,
++ icecast/icecastsend/icecastsend.h: Added an icecast send plugin
++ based on libshout
++
++2001-01-26 18:15 richardb
++
++ * plugins/esd/esdsink/esdsink.c: Fix memory leak: wasn't unreffing
++ the buffer.
++
++2001-01-23 20:03 wtay
++
++ * docs/gst/gstreamer-sections.txt, docs/gst/tmpl/gstelement.sgml,
++ docs/gst/tmpl/gstreamer-unused.sgml, gst/gstelement.c,
++ gst/gstelement.h, gstplay/gstmediaplay.c: Updated the docs with the
++ new _request methods
++
++2001-01-23 18:42 richardb
++
++ * gst/gstelement.c, gst/gstelement.h, tests/tee.c: Add
++ gst_element_request_compatible_pad and remove
++ gst_element_request_pad. Implemented something reasonable for
++ gst_element_request_compatible_pad, but havn't tested much: it
++ won't work for tee because the pad templates have no caps, and
++ negotiation is not yet written, so it is assumed that the tee pads
++ can't connect to anything.
++
++2001-01-22 23:39 richardb
++
++ * examples/launch/mp3play: Fix launch so that it can play a list of
++ files, now that EOS works enough. (It needs to not have to restart
++ gstreamer each time, but good enough for now ;-) )
++
++2001-01-21 23:20 wtay
++
++ * docs/gst/gstreamer-docs.sgml, docs/gst/gstreamer-sections.txt,
++ docs/gst/tmpl/gstbin.sgml, docs/gst/tmpl/gstelement.sgml,
++ docs/gst/tmpl/gstinfo.sgml, docs/gst/tmpl/gstpad.sgml,
++ docs/gst/tmpl/gstparse.sgml, docs/gst/tmpl/gstqueue.sgml,
++ docs/gst/tmpl/gstreamer-unused.sgml, docs/gst/tmpl/gstxml.sgml,
++ gst/gstautoplug.c, gst/gstbin.c, gst/gstelement.h, gst/gstpad.c,
++ gst/gstpad.h, gst/gstparse.c, gst/gstqueue.c, gst/gstthread.c,
++ gst/gstxml.c, gst/gstxml.h, tools/gstreamer-inspect.c: Docs updates
++ Added XML load from memory functionality Undid the videosink patch,
++ something else is wrong now on my machine: no MMX acceleration :-(
++
++2001-01-21 17:36 wtay
++
++ * docs/random/wtay/eos-19012001: An overview of the current EOS
++ handling algorithm.
++
++2001-01-21 16:19 wtay
++
++ * docs/random/dynpads: Ramblings about dynamic pads
++
++2001-01-21 16:18 wtay
++
++ * docs/random/omega/testing/.cvsignore: [no log message]
++
++2001-01-21 16:10 wtay
++
++ * docs/gst/.cvsignore: updated to exclude various docs formats
++ (.ps, .dvi,...)
++
++2001-01-21 16:08 wtay
++
++ * tests/eos/: .cvsignore, case7.c: Added another test case, a bin
++ in a thread, to test EOS. still hangs because gtk_main hangs in a
++ __poll somewhere.
++
++2001-01-21 16:06 wtay
++
++ * gst/gstbin.c, gst/gstbin.h, gst/gstelement.c, gst/gstthread.c,
++ tests/eos/Makefile.am, tests/eos/case4.c, tests/eos/case5.c,
++ tools/gstreamer-launch.c: More eos handling, bin in bin is handled
++ correctly now. Updated gstreamer-launch to loop while !EOS.
++
++2001-01-21 01:20 omegahacker
++
++ * docs/random/omega/testing/framework: more complete(?) XML
++ description of example
++
++2001-01-21 01:03 omegahacker
++
++ * docs/random/omega/testing/framework: initial thoughts on
++ framework
++
++2001-01-21 00:57 wtay
++
++ * gst/elements/gstaudiosink.c: Applied the patch from Sepp Wijnands
++ <mrrazz@garbage-coderz.net> that solves the 'OSS hangs when opening
++ the device when in use' bug.
++
++2001-01-20 20:08 omegahacker
++
++ * docs/design/: part-conventions.txt, part-gstelement.txt,
++ part-gstobject.txt, part-standards.txt: current set of design docs,
++ in .txt format
++
++2001-01-20 19:20 omegahacker
++
++ * docs/random/omega/testing/: Makefile, gstobject.c, gstobject.txt:
++ added first hack at testing suite design
++
++2001-01-20 18:20 wtay
++
++ * gst/: gstbin.c, gstscheduler.c: Check for NULL buffers before
++ chaining/pushing them to the next element. NULL buffers happen on
++ EOS. gst_bin_iterate now returns a gboolean indicating something
++ useful happened. It the bin is EOS, it returns FALSE.
++
++2001-01-20 17:59 wtay
++
++ * gst/: gstbin.c, gstbin.h, gstelement.c, gstqueue.c,
++ gstscheduler.c, gstthread.c: More EOS changes. When a bin2 is
++ found inside a bin1, we add the bin2 to the EOS providers of the
++ bin1. When there is nothing more to schedule in bin1 and bin2 has
++ fired EOS, bin1 is in EOS. The queue overrides the EOS
++ notification and calls EOS on the src pad when the queue is empty
++ and the sink pad is in EOS.
++
++2001-01-20 17:53 wtay
++
++ * tests/eos/: .cvsignore, Makefile.am, case3.c, case4.c, case5.c,
++ case6.c: More test cases for EOS handling
++
++2001-01-20 03:36 omegahacker
++
++ * tests/: paranoia.c, queue.c, states.c: updated tests code to new
++ ghostpad API
++
++2001-01-20 03:33 omegahacker
++
++ * test/: ac3play.c, avi2mpg.c, aviparse.c, mp1parse.c, mp1tomp1.c,
++ mp2toavi.c, mp2tomp1.c, mpeg2parse.c, qtest.c, vidcapture.c,
++ vidcapture2.c: updated test programs to new ghostpad API
++
++2001-01-20 03:28 wtay
++
++ * gst/: gstelement.c, elements/gstfakesrc.c: Make sure the
++ loopfunction ends when an element goes to EOS. Fixed the fakesrc
++ bug found by taaz.
++
++2001-01-20 03:10 wtay
++
++ * gst/: cothreads.c, gstbin.c, gstbin.h, gstelement.c,
++ gstelement.h, gstpad.c, gstscheduler.c: A very small change to make
++ eos somewhat work. no inner bins are checked. When an element
++ fires EOS, the chain with that element is removed from the
++ scheduler (marked inactive). If all chains are inactive, the bin
++ fires EOS.
++
++2001-01-20 03:02 wtay
++
++ * tests/eos/: case2.c, case3.c: Two more test cases
++
++2001-01-20 02:57 omegahacker
++
++ * gst/: gstelement.c, gstelement.h, gstinfo.h, gstpad.c, gstpad.h,
++ gstparse.c: Got ghostpads to work, even in -launch. Needs more
++ testing still.
++
++2001-01-19 23:34 wtay
++
++ * plugins/mp3decode/mpg123/Makefile.am: Added non x86 code to extra
++ dist
++
++2001-01-19 22:15 wtay
++
++ * docs/gst/Makefile.am, docs/gst/gstreamer-docs.sgml,
++ docs/gst/gstreamer-sections.txt, docs/gst/tmpl/gstarch.sgml,
++ docs/gst/tmpl/gstelement.sgml, docs/gst/tmpl/gstfakesrc.sgml,
++ docs/gst/tmpl/gstidentity.sgml, docs/gst/tmpl/gstpad.sgml,
++ docs/gst/tmpl/gstparse.sgml, docs/gst/tmpl/gstqueue.sgml,
++ docs/gst/tmpl/gstreamer-unused.sgml, docs/gst/tmpl/gsttee.sgml,
++ gst/cothreads.h, gst/gstelement.c, gst/gstelement.h,
++ gst/gstelementfactory.c, gst/gstpad.c, gst/gstpad.h,
++ plugins/mpeg2/ac3dec/downmix.c, test/mp1parse.c, tests/props.c,
++ tests/tee.c: API docs updates
++
++2001-01-19 09:37 omegahacker
++
++ * editor/gsteditorelement.c, editor/gsteditorimage.c,
++ editor/gsteditorpad.c, editor/gsteditorpalette.c, gst/gstalpha.h,
++ gst/gstbin.c, gst/gsti386.h, gst/gstinfo.h, gst/gstpad.c,
++ gst/gstpad.h, gst/gstppc.h, gst/gstscheduler.c, test/qtest.c,
++ tests/eos/Makefile.am: Major cleanup of the latest ghostpad
++ changes. Fixed everything that broke, correctly. Someone will
++ want to go update the API doc templates.
++
++2001-01-19 09:14 omegahacker
++
++ * gst/: Makefile.am, cothreads.c, cothreads.h, gstarch.h, gstarm.h:
++ more cothreads cleanup, and first pass at ARM code
++
++2001-01-19 07:48 omegahacker
++
++ * gst/cothreads.c: ALPHA COTHREADS WORK! Worked around a nasty
++ stack issue that probably can't be solved anyway. Tomorrow the UDB
++ build will commence, and let the best guess win!
++
++2001-01-19 02:23 omegahacker
++
++ * gst/cothreads.c, gst/gstautoplug.c, gst/gstbin.c, gst/gstpad.c,
++ gst/gstpad.h, gst/gstpipeline.c, gst/gstscheduler.c,
++ plugins/avi/audiocodecs.c, plugins/effects/volume/volume.c,
++ tools/gstreamer-inspect.c: First pass at updating to new ghostpad
++ system. The objects are in place, I now need to go and get all the
++ Bin end of things worked out. Testing should be fairly easy, at
++ least for verification.
++
++ Everything I've tried so far works with no changes, with is
++ amazing. That's just cool. Once again we rewrite an entire
++ subsystem, and nothing else notices anything but the new features
++ ;-)
++
++2001-01-19 02:10 richardb
++
++ * docs/manual/: pads.sgml, states.sgml: Fix some typos, and grammar
++ errors.
++
++2001-01-19 02:06 richardb
++
++ * docs/fwg/: Makefile.am, firstplugin.sgml,
++ gst-plugin-writers-guide.sgml, loopbased.sgml, testapp.sgml,
++ typesnprops.sgml: Wrote a little more text, and did more of the
++ work on making the sections. When this manual has text in all
++ these sections its going to be pretty impressive...
++
++2001-01-19 00:07 wtay
++
++ * tests/: .cvsignore, Makefile.am, tee.c, eos/Makefile.am: Added a
++ little tee test program.
++
++2001-01-19 00:07 wtay
++
++ * tools/gstreamer-inspect.c: Updated -inspect to display the new
++ pad presence REQUEST.
++
++2001-01-19 00:02 wtay
++
++ * gst/: gstqueue.c, gstqueue.h, gsttypefind.c, gsttypefind.h,
++ elements/gstqueue.c, elements/gstqueue.h, elements/gsttypefind.c,
++ elements/gsttypefind.h: And here they are....
++
++2001-01-19 00:01 wtay
++
++ * gst/: Makefile.am, gst.c, gstbin.c, elements/Makefile.am,
++ elements/gstelements.c: Moved queue and typefind elements to the
++ core since they are referenced by name.
++
++2001-01-18 23:46 wtay
++
++ * gst/: Makefile.am, gst.c, gst.h, gstelement.c, gstelement.h,
++ gstpad.c, gstpad.h, gsttee.c, gsttee.h, elements/Makefile.am,
++ elements/gstelements.c, elements/gsttee.c, elements/gsttee.h: Added
++ mthodes to request an element to create pads:
++ gst_element_request_pad* This can be used to construct a tee and a
++ muxer/mixer/aggregator element. Moved the tee element to elements/
++ because it can now be handled with the new pad request features.
++ The padfactory also has some changes: a pad can now be of presence
++ REQUEST, which means that the pad can be requested from this plugin
++ (doh).
++
++2001-01-18 15:29 richardb
++
++ * plugins/esd/esdsink/esdsink.c,
++ plugins/visualization/synaesthesia/core.c,
++ plugins/visualization/synaesthesia/core.h,
++ plugins/visualization/synaesthesia/synaesthesia.c,
++ plugins/visualization/synaesthesia/synaesthesia.h,
++ plugins/visualization/vumeter/vumeter.c, tests/caps.c,
++ tests/padfactory.c, tests/props.c, tests/registry.c: Some more
++ fixes for libxml. Also, some code formatting changes in esdsink,
++ some further fixes to vumeter, and some work on synaesthesia to
++ make it closer to working (it doesn't fully work yet, though. :( )
++
++2001-01-18 11:16 richardb
++
++ * gst/gstbin.c, tools/gstreamer-register.c, gst/gstcaps.c,
++ gst/gstcaps.h, gst/gstelement.c, gst/gstelement.h,
++ gst/gstelementfactory.c, gst/gstpad.c, gst/gstpad.h,
++ gst/gstplugin.c, gst/gstplugin.h, gst/gstprops.c, gst/gstprops.h,
++ gst/gsttype.c, gst/gstxml.c, gst/gstxml.h: Fixes to work with
++ libxml2. Also improved a couple of debugging messagse.
++
++2001-01-18 08:54 omegahacker
++
++ * gst/: Makefile.am, cothreads.c, gstalpha.h, gstarch.h, gsti386.h,
++ gstppc.h: Updates to cothreads code, including non-working alpha.
++ Changed things a bit, including PPC. Not having a PPC machine, I
++ need someone to test these changes and report back whether they
++ worked or not.
++
++2001-01-18 02:25 richardb
++
++ * plugins/visualization/vumeter/: vumeter.c, vumeter.h: Fix vumeter
++ so that it compiles and runs. It doesn't do much of use though:
++ simply produces some debug output, and has a set of arguments which
++ report the volume. It might be more useful if it produced its
++ output from a source pad, in an appropriate format, so that another
++ plugin could graphically display this.
++
++2001-01-17 07:43 wtay
++
++ * examples/typefind/: Makefile, Makefile.am: Oops
++
++2001-01-17 01:59 richardb
++
++ * tools/gstreamer-register.c: Fix permissions problems: the
++ directory will now always be created mode 2755. In addition, the
++ temporary file is given restricted permissions, and the permissions
++ on the registry file are preserved if one already exists, or 666
++ (and modified by the umask) if one doesn't already exist.
++
++2001-01-17 00:02 wtay
++
++ * configure.in: Added typefind example to configure.in
++
++2001-01-17 00:01 wtay
++
++ * examples/: autoplug/autoplug.c, typefind/Makefile,
++ typefind/typefind.c: Added the typefind example from the manual
++
++2001-01-16 23:35 wtay
++
++ * docs/manual/: dynamic.sgml, programs.sgml, typedetection.sgml,
++ utility.sgml: Manual updates and additions
++
++2001-01-15 21:10 richardb
++
++ * plugins/esd/esdsink/esdsink.c: Correct the pads for esdsink
++ plugin, after I realised they were wrong during a conversation
++ about pads with wtay. ;-)
++
++2001-01-15 19:25 wtay
++
++ * gst/: gstbin.c, gstelement.c: Fixed the state change code in
++ gstelement that broke with the conversion of the states to a
++ bitfield.
++
++2001-01-15 00:53 richardb
++
++ * plugins/mp3decode/mpg123/: layer3.c, mpg123.h: Added some
++ conditionals to ensure that the i486 stuff is used only in x86
++ architectures. Now links on PPC.
++
++2001-01-15 00:53 wtay
++
++ * docs/manual/: dynamic.sgml, pads.sgml, quotes.sgml: Updated docs
++ with dynamic pads Fixed quotes
++
++2001-01-14 22:28 wtay
++
++ * gstplay/Makefile.am: Added gst_libs to Makefile
++
++2001-01-14 22:25 richardb
++
++ * docs/manuals.mak: Fix build problem when don't have db2html, or a
++ directory to put the manual in: was trying to make a symlink in the
++ non-existant directory, and causing the build to stop.
++
++2001-01-14 22:24 richardb
++
++ * gst/Makefile.am: Adding nasty hack to rules to generate
++ cothreads.{o,lo}, to get dependencies right. Rules copied from
++ automake, and therefore a bit dependent on automake keeping doing
++ dependency things the same kind of way, but it should work as long
++ as automake puts dependencies into .deps/*.P
++
++2001-01-14 22:23 wtay
++
++ * tests/sched/Makefile.am: Fixed a Makefile error
++
++2001-01-14 21:55 omegahacker
++
++ * Makefile.am, acconfig.h, configure.in,
++ components/bonobo-gstmediaplay/Makefile.am, docs/gst/Makefile.am,
++ docs/plugins/Makefile.am, docs/random/omega/build/TODO,
++ editor/Makefile.am, examples/autoplug/Makefile.am,
++ examples/helloworld/Makefile.am, examples/helloworld2/Makefile.am,
++ examples/plugins/Makefile.am, examples/queue/Makefile.am,
++ examples/queue2/Makefile.am, examples/queue3/Makefile.am,
++ examples/queue4/Makefile.am, examples/thread/Makefile.am,
++ examples/xml/Makefile.am, gst/Makefile.am, gst/gst.h,
++ gst/gst_private.h, gst/gstcaps.h, gst/gstelement.h, gst/gstpad.h,
++ gst/gstplugin.h, gst/gstprops.h, gst/elements/Makefile.am,
++ gst/types/Makefile.am, gstplay/Makefile.am,
++ libs/getbits/Makefile.am, libs/idct/Makefile.am,
++ libs/putbits/Makefile.am, libs/riff/Makefile.am,
++ plugins/au/Makefile.am, plugins/audioscale/Makefile.am,
++ plugins/avi/Makefile.am, plugins/avi/gstavidecoder.h,
++ plugins/avi/gstaviencoder.h, plugins/avi/wincodec/Makefile.am,
++ plugins/capture/v4l/Makefile.am, plugins/cdparanoia/Makefile.am,
++ plugins/cobin/Makefile.am, plugins/dvdsrc/Makefile.am,
++ plugins/effects/stereo/Makefile.am,
++ plugins/effects/volume/Makefile.am,
++ plugins/esd/esdsink/Makefile.am,
++ plugins/filters/ladspa/Makefile.am,
++ plugins/filters/median/Makefile.am,
++ plugins/filters/smooth/Makefile.am, plugins/jpeg/Makefile.am,
++ plugins/mp3decode/mpg123/Makefile.am,
++ plugins/mp3decode/parse/Makefile.am,
++ plugins/mp3decode/types/Makefile.am,
++ plugins/mp3decode/xa/Makefile.am,
++ plugins/mp3decode/xing/Makefile.am,
++ plugins/mp3encode/lame/Makefile.am,
++ plugins/mpeg1/mpeg1encoder/Makefile.am,
++ plugins/mpeg1/mpeg_play/Makefile.am,
++ plugins/mpeg1/mpegaudio/Makefile.am,
++ plugins/mpeg1/mpegtypes/Makefile.am,
++ plugins/mpeg1/parse/Makefile.am,
++ plugins/mpeg1/system_encode/Makefile.am,
++ plugins/mpeg1video/parse/Makefile.am,
++ plugins/mpeg2/ac3dec/Makefile.am,
++ plugins/mpeg2/ac3parse/Makefile.am,
++ plugins/mpeg2/mpeg2dec/Makefile.am,
++ plugins/mpeg2/mpeg2enc/Makefile.am,
++ plugins/mpeg2/mpegtypes/Makefile.am,
++ plugins/mpeg2/parse/Makefile.am,
++ plugins/mpeg2/subtitles/Makefile.am,
++ plugins/mpeg2/video/Makefile.am,
++ plugins/mpeg2/videoparse/Makefile.am, plugins/rtjpeg/Makefile.am,
++ plugins/vcdsrc/Makefile.am, plugins/videoscale/Makefile.am,
++ plugins/visualization/smoothwave/Makefile.am,
++ plugins/visualization/spectrum/Makefile.am,
++ plugins/visualization/synaesthesia/Makefile.am,
++ plugins/visualization/vumeter/Makefile.am,
++ plugins/vorbis/Makefile.am, plugins/wav/Makefile.am,
++ test/Makefile.am, test/bindings/Makefile.am, test/xml/Makefile.am,
++ tests/Makefile.am, tests/eos/Makefile.am, tests/sched/Makefile.am:
++ Massive build fixup. Will send message to -devel list later with
++ details on the changes and what they mean for Makefile.am writers.
++ Check docs/random/omega/build/TODO for a list of things that I had
++ to make sure of.
++
++ NOTE: this requires a complete rebuild of all plugins, since I also
++ changed the STATE enum to a bitfield instead of sequential numbers.
++
++2001-01-14 21:38 omegahacker
++
++ * tools/: Makefile.am, gstreamer-launch.c: fixed an odd case with
++ the launcher, didn't deal with argc properly
++
++2001-01-14 14:57 wtay
++
++ * gst/cothreads.c: Change MAP_ANONYMOUS to MAP_ANON in the mmap for
++ BSD compatibility
++
++2001-01-14 14:43 wtay
++
++ * gst/elements/: gstfakesink.c, gstfakesrc.c, gstfakesrc.h,
++ gstidentity.c, gstqueue.c: Added an extra signal_cond to queue to
++ make sure that the waiting thread is woken up. Can somebody with
++ queue problems verifify that this does improve the situation a bit.
++ I'm suspecting that something else is going on, like a pthreads bug
++ or something. Small updates to the fake elements.
++
++2001-01-14 12:42 richardb
++
++ * REQUIREMENTS: Added a couple of lines about debian packages.
++
++2001-01-14 04:45 wtay
++
++ * docs/manual/quotes.sgml: Updated quotes :-)
++
++2001-01-13 19:04 wtay
++
++ * docs/random/wtay/eos5: Antoher way of dealing with EOS. This
++ proposal does not use the recursion to propagate the EOS signal.
++ This implies that an element cannot deny an EOS signal anymore but
++ since the signal is generated when a NULL buffer is pushed,
++ somebody did something wrong anyway.
++
++2001-01-13 15:47 wtay
++
++ * docs/random/wtay/eos4: Added an updated use case for EOS
++ handling.
++
++2001-01-13 14:45 wtay
++
++ * docs/random/TODO-post-0.1.0: Updated the TODO list...
++
++2001-01-13 14:25 wtay
++
++ * tools/gstreamer-register.c: Fixed the directory permission Bug
++ #128637
++
++2001-01-13 13:51 wtay
++
++ * gst/: gstbin.c, gstbin.h, gstcaps.h, gstelement.c, gstelement.h,
++ gstpad.c, gstpad.h, gstplugin.h, gstprops.h, gstxml.h: include
++ parser.h instead of gnome-xml/parser.h untill xml-config is
++ fixed...
++
++2001-01-13 02:55 omegahacker
++
++ * configure.in: turned static library build back off for
++ development
++
++2001-01-13 02:12 wtay
++
++ * docs/random/wtay/eos3: Added case6: a multithreaded audio mixer
++ setup.
++
++2001-01-13 00:14 wtay
++
++ * plugins/mp3decode/mpg123/mpg123.c: Use glib function to convert
++ be->le
++
++2001-01-12 23:37 wtay
++
++ * libs/getbits/gstgetbits.c: Added config.h as an include to make
++ sure BE/LE stuff works
++
++2001-01-12 22:44 wtay
++
++ * docs/random/wtay/eos3: Added a simple mp3 mixer pipeline setup
++ with an explanation of how EOS could be handled with it.
++
++2001-01-12 20:54 wtay
++
++ * ChangeLog: Updated ChangeLog :-)
++
++2001-01-12 20:48 wtay
++
++ * plugins/mpeg2/mpeg2dec/: idct.c, motion_comp.c: Make sure the
++ mmx/sse code is not used on non i386
++
++2001-01-12 20:44 wtay
++
++ * configure.in: Check for more atomic operations
++
++2001-01-12 20:25 wtay
++
++ * plugins/mpeg2/mpeg2dec/decode.c: Removed include from mpeg2dec
++ for mmx.h
++
++2001-01-12 20:15 wtay
++
++ * plugins/mpeg2/mpeg2dec/Makefile.am: Made sure mmx compilation is
++ not performed on non intel
++
++2001-01-12 18:51 wtay
++
++ * docs/random/wtay/: eos2, eos3: While typing on eos2 about the EOS
++ handling, I got an idea and started eos3. eos3 takes a different
++ approach by merging the eos detection and the scheduling in a quite
++ elegant way. I'm not sure we handle the scheduling like this
++ though...
++
++2001-01-11 23:20 wtay
++
++ * plugins/mpeg1/mpeg_play/recon_sse.s: Removed /* */ comments and
++ replaced them with a # comment as suggested by Peter Weilbacher
++
++2001-01-11 23:15 wtay
++
++ * plugins/mpeg2/mpeg2enc/: bdist1_mmx.s, bdist1_sse.s,
++ bdist2_mmx.s, dist1_00_mmx.s, dist1_00_sse.s, dist1_01_mmx.s,
++ dist1_01_sse.s, dist1_10_mmx.s, dist1_10_sse.s, dist1_11_mmx.s,
++ dist1_11_sse.s, dist2_mmx.s, variance_mmx.s: Fixed the comments in
++ the asm sources from /* */ to #, it seems to confuse some compilers
++
++2001-01-11 22:09 omegahacker
++
++ * gst/: gstpad.c, gstpad.h: renamed private to element_private, to
++ make obvious its usage restrictions
++
++2001-01-11 22:03 omegahacker
++
++ * gst/: gstpad.c, gstpad.h: added gpointer private to pads, so
++ elements can store ints or pointers for their own use
++
++2001-01-11 21:53 wtay
++
++ * Makefile.am: Added the REQUIREMENTS file to distdir
++
++2001-01-11 09:42 omegahacker
++
++ * docs/random/omega/: IDEAS, TODO-0.1.0, TYPE_FOURCC, caps2, caps3,
++ debug-commit, eos, filterfactory, output_policies, pad-negotiation,
++ padtemplates, plan-generation, sched-case, sched-commit1, sched2,
++ scheduling, type-properties, EOS/chain-walkthrough, sched/chains,
++ sched/walkthrough-72: added all of my un-committed random doc
++ files, as backup <g>
++
++2001-01-11 00:35 omegahacker
++
++ * gstreamer.spec.in: updated spec file to create -devel package too
++
++2001-01-11 00:33 omegahacker
++
++ * gst/gstinfo.c: removed some spare newlines
++
++2001-01-10 21:28 omegahacker
++
++ * docs/manual/programs.sgml: updated -launch examples
++
++2001-01-10 09:14 omegahacker
++
++ * gst/gstxml.c, docs/gst/tmpl/gstxml.sgml: minor docs fix
++
++2001-01-09 21:19 wtay
++
++ * configure.in: Added --with-win32-libdir to configure
++
++2001-01-09 21:06 omegahacker
++
++ * acconfig.h, configure.in: added config option for win32 dll and
++ re-enabled static building
++
++2001-01-09 20:54 omegahacker
++
++ * docs/manual/quotes.sgml: latest irc insanity
++
++2001-01-09 20:53 wtay
++
++ * REQUIREMENTS: Added /usr/lib/win32/ windows libraries in the
++ REQUIREMENTS
++
++2001-01-09 20:45 omegahacker
++
++ * tools/gstreamer-register.c: added unlink() of registry file, and
++ moved info enable up
++
++2001-01-09 06:48 omegahacker
++
++ * tools/gstreamer-launch.c: typo fix
++
++2001-01-09 04:42 omegahacker
++
++ * acconfig.h, plugins/cdparanoia/cdparanoia.c: added HAVE_GNOME to
++ acconfig.h and added debugging output to cdparanoia
++
++2001-01-09 04:39 omegahacker
++
++ * tools/: Makefile.am, gstreamer-inspect.c, gstreamer-launch.c,
++ gstreamer-register.c: various changes, including making -launch use
++ the library version
++
++2001-01-09 04:36 omegahacker
++
++ * gst/gstplugin.c: fixed a leak
++
++2001-01-08 23:57 richardb
++
++ * docs/gst/.cvsignore: cvsignore gstreamer-scan{,.c}
++
++2001-01-08 23:55 richardb
++
++ * configure.in, docs/manuals.mak, docs/fwg/Makefile.am,
++ docs/fwg/firstplugin.sgml, docs/fwg/gst-plugin-writers-guide.sgml,
++ docs/fwg/titlepage.sgml, docs/manual/quotes.sgml,
++ examples/Makefile.am, examples/plugins/.cvsignore,
++ examples/plugins/Makefile.am, examples/plugins/example.c,
++ examples/plugins/example.h, plugins/example.c, plugins/example.h:
++ Move plugin example code to new location, and put it into build
++ system. Add work on firstplugin chapter of pwg. Fix typo in
++ quotes. Add @'s before commands in manuals.mak
++
++2001-01-08 22:08 wtay
++
++ * docs/Makefile.am, docs/manual/components.sgml,
++ docs/manual/queues.sgml, docs/manual/quotes.sgml,
++ docs/manual/states.sgml, docs/manual/xml.sgml,
++ docs/plugins/Makefile.am, docs/plugins/gstdoc-scanobj,
++ docs/random/testing/syntax, examples/xml/runxml.c, gst/gstxml.c,
++ tests/sched/testcases1.tc: Manual updates. fixes to gstxml.c
++ gst_xml_get_element was broken
++
++2001-01-08 22:04 richardb
++
++ * gst/: gstelement.c, gstelement.h: Correct typo in comment, and
++ make another comment more helpful.
++
++2001-01-08 22:03 richardb
++
++ * plugins/esd/esdsink/esdsink.c: Move esdsink into the sink/
++ position in the heirarchy.
++
++2001-01-08 20:15 richardb
++
++ * editor/gsteditorproperty.c: Display what the type of an element
++ is, as the first thing in the properties box.
++
++2001-01-08 08:32 omegahacker
++
++ * docs/manual/quotes.sgml: added another, um, exchange
++
++2001-01-08 01:43 richardb
++
++ * tools/gstreamer-launch.c: Fix typo in error message.
++
++2001-01-08 01:27 richardb
++
++ * docs/manual/: Makefile.am, gstreamer-manual.sgml, quotes.sgml:
++ Add a "quotes" section to the gstreamer manual. This may not be an
++ appropriate place to have this - feel free to remove it. But I
++ think this should live _somewhere_.
++
++2001-01-08 01:23 richardb
++
++ * docs/random/filter-writers-guide: Remove text version of headings
++ for fwg. This is now contained in the SGML
++
++2001-01-08 01:21 richardb
++
++ * docs/fwg/: .cvsignore, Makefile.am,
++ gst-filter-writers-guide.sgml, gst-plugin-writers-guide.sgml:
++ Renamed the filter writers guide to plugin writers guide. Added in
++ the planned section headings.
++
++2001-01-07 22:59 wtay
++
++ * tests/sched/testcases1.tc: Added a sample tescase file
++
++2001-01-07 22:36 wtay
++
++ * docs/random/testing/syntax: Added iterations
++
++2001-01-07 22:34 wtay
++
++ * docs/random/testing/syntax: Added a plan for regression test plan
++ definitions
++
++2001-01-07 18:36 wtay
++
++ * gst/: gst.c, gsttee.c, gsttee.h: Handle the tee element like bin,
++ thread, pipeline, so that it can be used in gstreamer-inspect and
++ gstreamer-launch...
++
++2001-01-07 17:09 wtay
++
++ * configure.in, docs/gst/tmpl/gstasyncdisksrc.sgml,
++ docs/gst/tmpl/gstaudiosink.sgml, docs/gst/tmpl/gstaudiosrc.sgml,
++ docs/gst/tmpl/gstbin.sgml, docs/gst/tmpl/gstdisksrc.sgml,
++ docs/gst/tmpl/gstelement.sgml, docs/gst/tmpl/gstfakesink.sgml,
++ docs/gst/tmpl/gstfakesrc.sgml, docs/gst/tmpl/gstfdsink.sgml,
++ docs/gst/tmpl/gstfdsrc.sgml, docs/gst/tmpl/gsthttpsrc.sgml,
++ docs/gst/tmpl/gstidentity.sgml, docs/gst/tmpl/gstobject.sgml,
++ docs/gst/tmpl/gstpad.sgml, docs/gst/tmpl/gstpipefilter.sgml,
++ docs/gst/tmpl/gstqueue.sgml, docs/gst/tmpl/gstreamer-unused.sgml,
++ docs/gst/tmpl/gstsinesrc.sgml, docs/gst/tmpl/gstthread.sgml,
++ docs/gst/tmpl/gsttypefind.sgml, gstplay/gstmediaplay.c,
++ gstplay/gstmediaplay.glade: Made sure -g is not used when no
++ --enable-debug Updated AUTHORS in gstmediaplay
++
++2001-01-07 16:48 richardb
++
++ * tools/gstreamer-register.c: Fix typos in save_regsitry()
++
++2001-01-07 16:14 richardb
++
++ * tools/gstreamer-register.c: Folling wtays suggestion, I was going
++ to start using xmlDocDump, to avoid a symlink attack on the
++ temporary registry file. Unfortunately, xmlDocDump doesn't give
++ any indication whether its successful, so I've #ifdefed this out
++ and left the original in place. Since the tmp file is in
++ /etc/gstreamer, this should be okay for the moment, but I shall ask
++ the libxml people to add some way of getting the success value of
++ DocDump so we can use that in future.
++
++2001-01-07 15:31 richardb
++
++ * acinclude.m4: Slight tweak: now I just need to send the modified
++ version off to the alsa people.
++
++2001-01-07 15:25 richardb
++
++ * acinclude.m4: New macro for testing for ALSA libraries.
++ Understands the ACTION_IF_FOUND and ACTION_IF_NOT_FOUND arguments.
++
++2001-01-07 15:20 richardb
++
++ * gst/cothreads.c, gst/gstplugin.c, tools/gstreamer-register.c:
++ gstreamer-register will now never cause the ** WARNING **:
++ gstplugin: registry needs rebuild warning to appear - sets a hidden
++ global in gstplugin.c to turn the warning off. Fix a warning in
++ gst/cothreads.c (function was declared extern, defined static)
++
++2001-01-07 14:55 richardb
++
++ * plugins/esd/esdsink/esdsink.c: FIx a tiny memory leak.
++
++2001-01-07 14:49 wtay
++
++ * gst/elements/: gstqueue.c, gstqueue.h: Greatly simplyfied queue
++ locking by only using the elements mutex. This should fix the
++ locking problems we had...
++
++2001-01-07 14:32 richardb
++
++ * plugins/esd/esdsink/esdsink.c: And another tiny warning.
++
++2001-01-07 14:29 richardb
++
++ * plugins/esd/esdsink/esdsink.c: Fix a couple of warnings.
++
++2001-01-07 14:16 richardb
++
++ * acinclude.m4: Don't add -lasound etc to LIBS if ALSA turns out
++ not to be installed.
++
++2001-01-07 14:05 richardb
++
++ * acinclude.m4: Add an acinclude containing AM_PATH_ALSA, so wtay
++ can compile. Will shortly update this with a slightly better
++ macro.
++
++2001-01-07 13:58 richardb
++
++ * configure.in, docs/manuals.mak: Add tests for -L png and -L eps
++ arguments to fig2dev. Correct slip in docs/manuals.mak which used
++ HAVE_DB2PS instead of HAVE_PS2PDF.
++
++2001-01-07 08:40 omegahacker
++
++ * configure.in: added check for libasound, and fixed check for
++ cdparanoia
++
++2001-01-07 08:01 omegahacker
++
++ * plugins/filters/ladspa/gstladspa.c: fixed a bug: in an
++ over-zealous attempt to squash leaks, I put the g_free too early
++
++2001-01-07 07:46 omegahacker
++
++ * plugins/filters/ladspa/: gstladspa.c, search.c: some leak fixes
++ to both the plugin and the ladspa-provided code
++
++2001-01-07 07:45 omegahacker
++
++ * gst/: gstcaps.c, gstcpu.c, gstelementfactory.c, gstpad.c,
++ gstparse.c, gstplugin.c, gstprops.c, gsttype.c: more leak fixes
++
++2001-01-07 07:01 richardb
++
++ * gst/gstplugin.c, tools/gstreamer-register.c: Check plugin
++ repository up-to-dateness by scanning through all directories on
++ path, and checking that they and all their files are older than the
++ repository. Give warning message if not.
++
++2001-01-07 05:54 richardb
++
++ * tools/gstreamer-register.c: Test xmlSaveFile return value
++ correctly (had to get source to find out what it meant...)
++ gstreamer-register now seems to work fine, even in a non-standard
++ location.
++
++2001-01-07 05:35 richardb
++
++ * configure.in: Fix tiny slip which made configdir still always be
++ /etc/gstreamer/
++
++2001-01-07 05:30 richardb
++
++ * acconfig.h, configure.in, docs/manual/factories.sgml,
++ gst/gstplugin.c, tools/gstreamer-register.c: Config directory
++ (which currently just holds the registry)ecan now be set by
++ configure --with-configdir=<directory path>
++
++2001-01-07 04:51 richardb
++
++ * tools/gstreamer-register.c: Almost completely rewritten
++ gstreamer-register. Now checks most errors that can happen, and
++ displays a useful message.
++
++2001-01-07 04:28 omegahacker
++
++ * gst/: gstbin.c, gstinfo.h, gstscheduler.c: removed a leak
++
++2001-01-07 04:00 omegahacker
++
++ * gst/: Makefile.am, gst.h, gstparse.c, gstparse.h: turned -launch
++ capabilities into gst_parse_launch()
++
++2001-01-07 03:42 wtay
++
++ * gst/elements/: gstidentity.c, gstidentity.h, gstqueue.c,
++ gstqueue.h: Added sleep time to identity Added timeout value in
++ queue (not activated yet)
++
++2001-01-07 03:06 omegahacker
++
++ * tools/gstreamer-launch.c: fixed a bug with NULL args, but need to
++ fix the parser that created them
++
++2001-01-07 02:30 wtay
++
++ * docs/random/queue: Added a deadlock case for the queue
++
++2001-01-07 02:23 richardb
++
++ * docs/fwg/: Makefile.am, concepts.sgml,
++ gst-filter-writers-guide.sgml, intro.sgml: More updates: now have
++ headings for the second section too, and some text for it... ;-)
++
++2001-01-07 00:12 richardb
++
++ * docs/fwg/: gst-filter-writers-guide.sgml, intro.sgml,
++ titlepage.sgml: Wrote introduction, and changed name to plugin
++ writers guide (though files still need rename). I'll leave the
++ filenames as is for now, since the name might still change again...
++
++2001-01-06 22:05 omegahacker
++
++ * docs/gst/tmpl/cothreads.sgml, docs/gst/tmpl/gstasyncdisksrc.sgml,
++ docs/gst/tmpl/gstaudiosink.sgml, docs/gst/tmpl/gstaudiosrc.sgml,
++ docs/gst/tmpl/gstautoplug.sgml, docs/gst/tmpl/gstbin.sgml,
++ docs/gst/tmpl/gstbuffer.sgml, docs/gst/tmpl/gstcaps.sgml,
++ docs/gst/tmpl/gstdisksrc.sgml, docs/gst/tmpl/gstelement.sgml,
++ docs/gst/tmpl/gstesdsink.sgml, docs/gst/tmpl/gstfakesink.sgml,
++ docs/gst/tmpl/gstfakesrc.sgml, docs/gst/tmpl/gstfdsink.sgml,
++ docs/gst/tmpl/gstfdsrc.sgml, docs/gst/tmpl/gsthttpsrc.sgml,
++ docs/gst/tmpl/gstidentity.sgml, docs/gst/tmpl/gstmeta.sgml,
++ docs/gst/tmpl/gstobject.sgml, docs/gst/tmpl/gstpad.sgml,
++ docs/gst/tmpl/gstpipefilter.sgml, docs/gst/tmpl/gstpipeline.sgml,
++ docs/gst/tmpl/gstprops.sgml, docs/gst/tmpl/gstqueue.sgml,
++ docs/gst/tmpl/gstreamer-unused.sgml, docs/gst/tmpl/gstsinesrc.sgml,
++ docs/gst/tmpl/gstthread.sgml, docs/gst/tmpl/gsttype.sgml,
++ docs/gst/tmpl/gsttypefind.sgml, gst/gstautoplug.c, gst/gstbin.c,
++ gst/gstbuffer.c, gst/gstbufferpool.c, gst/gstcaps.c,
++ gst/gstelement.c, gst/gstelementfactory.c, gst/gstmeta.c,
++ gst/gstpad.c, gst/gstpipeline.c, gst/gstprops.c, gst/gsttee.c,
++ gst/gstthread.c, gst/gsttype.c, gst/gstutils.c: Cleaned up the docs
++ a bit.
++
++2001-01-06 19:09 wtay
++
++ * gst/elements/gstqueue.c: Rearranged the mutex locking, still have
++ to think about it though...
++
++2001-01-06 18:08 wtay
++
++ * gst/gstbuffer.c: Added a mutex around the mem_chunck alloc
++ routines
++
++2001-01-06 16:56 wtay
++
++ * tests/: .cvsignore, eos/.cvsignore: Added/updated .cvsignore
++
++2001-01-06 16:52 wtay
++
++ * docs/manual/dynamic.sgml, plugins/mpeg2/parse/mpeg2parse.c,
++ test/mp2tomp1.c: Fixed the MPEG2 to MPEG1 recoder, we need cannot
++ create dangling elements with the current scheduler. Remove the
++ subtitle parser because it's not possible with the current
++ scheduler. Added a padtemplate for MPEG2 subtitles.
++
++2001-01-06 10:42 omegahacker
++
++ * configure.in: removed xing and added AM_CONDITIONAL for
++ HAVE_GNOME
++
++2001-01-06 09:49 omegahacker
++
++ * autogen.sh: added --enable-debug to autogen.sh, duh...
++
++2001-01-06 02:35 wtay
++
++ * docs/manuals.mak, docs/gst/gstreamer-sections.txt,
++ docs/gst/tmpl/gstasyncdisksrc.sgml,
++ docs/gst/tmpl/gstaudiosink.sgml, docs/gst/tmpl/gstaudiosrc.sgml,
++ docs/gst/tmpl/gstbin.sgml, docs/gst/tmpl/gstcaps.sgml,
++ docs/gst/tmpl/gstdisksrc.sgml, docs/gst/tmpl/gstelement.sgml,
++ docs/gst/tmpl/gstfakesink.sgml, docs/gst/tmpl/gstfakesrc.sgml,
++ docs/gst/tmpl/gstfdsink.sgml, docs/gst/tmpl/gstfdsrc.sgml,
++ docs/gst/tmpl/gsthttpsrc.sgml, docs/gst/tmpl/gstidentity.sgml,
++ docs/gst/tmpl/gstobject.sgml, docs/gst/tmpl/gstpad.sgml,
++ docs/gst/tmpl/gstpipefilter.sgml, docs/gst/tmpl/gstplugin.sgml,
++ docs/gst/tmpl/gstqueue.sgml, docs/gst/tmpl/gstreamer-unused.sgml,
++ docs/gst/tmpl/gstsinesrc.sgml, docs/gst/tmpl/gstthread.sgml,
++ docs/gst/tmpl/gsttypefind.sgml, docs/manual/Makefile.am,
++ docs/manual/bins.sgml, docs/manual/connections.sgml,
++ docs/manual/elements.sgml, docs/manual/ghostpads.sgml,
++ docs/manual/gstreamer-manual.sgml, docs/manual/helloworld.sgml,
++ docs/manual/pads.sgml, docs/manual/plugins.sgml, gst/gstbin.c,
++ gst/gstbin.h, gst/gstcaps.c, gst/gstcaps.h, gst/gstelement.c,
++ gst/gstelement.h, gst/gstelementfactory.c, gst/gstplugin.c,
++ gst/gstplugin.h, gst/gsttype.c, gst/gsttype.h,
++ gst/elements/gstesdsink.c, gst/elements/gstesdsink.h: Updated the
++ manual and the docs. Removed the esdsink in gst/elements/ we have
++ a real one not in the plugins dir. Added more APIs to query the
++ plugins, types and caps. more fields now have a getter and a
++ setter. This is needed to make gstreamer wrapper fiendly. Added
++ gst_element_disconnect beacuse we also have a gst_element_connect
++
++2001-01-05 18:50 wtay
++
++ * docs/manual/: cothreads.sgml, factories.sgml, helloworld.sgml,
++ helloworld2.sgml, mime-world.fig, pads.sgml, programs.sgml,
++ queues.sgml, threads.sgml: Docs updates
++
++2001-01-05 00:28 omegahacker
++
++ * gst/cothreads.c: fixed missing comment noticed by David Lehn
++
++2001-01-04 23:35 wtay
++
++ * docs/manual/: Makefile.am, bin-element-ghost.fig, bins.sgml,
++ elements.sgml, factories.sgml, goals.sgml, gstreamer-manual.sgml,
++ helloworld.sgml, intro.sgml, motivation.sgml, pads.sgml,
++ states.sgml, threads.sgml: Updates and additions to the manual
++
++2001-01-04 22:15 omegahacker
++
++ * gst/cothreads.c, gst/gstinfo.c,
++ docs/gst/tmpl/gstasyncdisksrc.sgml,
++ docs/gst/tmpl/gstaudiosink.sgml, docs/gst/tmpl/gstaudiosrc.sgml,
++ docs/gst/tmpl/gstbin.sgml, docs/gst/tmpl/gstdisksrc.sgml,
++ docs/gst/tmpl/gstelement.sgml, docs/gst/tmpl/gstfakesink.sgml,
++ docs/gst/tmpl/gstfakesrc.sgml, docs/gst/tmpl/gstfdsink.sgml,
++ docs/gst/tmpl/gstfdsrc.sgml, docs/gst/tmpl/gsthttpsrc.sgml,
++ docs/gst/tmpl/gstidentity.sgml, docs/gst/tmpl/gstinfo.sgml,
++ docs/gst/tmpl/gstobject.sgml, docs/gst/tmpl/gstpad.sgml,
++ docs/gst/tmpl/gstpipefilter.sgml, docs/gst/tmpl/gstqueue.sgml,
++ docs/gst/tmpl/gstreamer-unused.sgml, docs/gst/tmpl/gstsinesrc.sgml,
++ docs/gst/tmpl/gstthread.sgml, docs/gst/tmpl/gsttypefind.sgml:
++ updated API docs
++
++2001-01-04 20:34 omegahacker
++
++ * tools/gstreamer-launch.c: fixed problems with -launch
++
++2001-01-04 20:17 omegahacker
++
++ * plugins/vorbis/vorbisenc.c: changed OGG to Ogg, to match decoder
++
++2001-01-04 19:22 wtay
++
++ * examples/launch/mp3play: Fixed mp3play
++
++2001-01-04 19:16 wtay
++
++ * tools/gstreamer-inspect.c: Added printout of the capabilities of
++ the pads
++
++2001-01-04 18:57 wtay
++
++ * tools/: Makefile.am, gstreamer-inspect.c: Added enum values with
++ default removed debugging -g from Makefile
++
++2001-01-04 17:44 richardb
++
++ * examples/launch/mp3play: Undo accidental commit of debugging
++ version.
++
++2001-01-04 16:46 richardb
++
++ * tools/gstreamer-launch.c: Replace Wim's fix after Erik dropped
++ it. ;-)
++
++2001-01-04 10:54 omegahacker
++
++ * gst/: cothreads.c, gstpad.c, gstpad.h, gstplugin.c, gstplugin.h,
++ elements/gstfakesink.c, elements/gstfakesink.h: Rearranged
++ cothreads sources a bit, added some API docs. Added some functions
++ needed for gstreamer-inspect. Added num_sources to fakesink.
++
++2001-01-04 10:53 omegahacker
++
++ * plugins/filters/ladspa/: gstladspa.c, gstladspa.h: More updates
++ to ladspa wrapper, closer to data movement
++
++2001-01-04 10:47 omegahacker
++
++ * tools/: gstreamer-inspect.c, gstreamer-launch.c: Updated -inspect
++ to list elements and plugin info too
++
++2001-01-04 07:19 wtay
++
++ * tools/gstreamer-launch.c: A little fix for parameter parsing
++
++2001-01-04 00:15 richardb
++
++ * examples/launch/mp3play: Updated to supply argument as
++ "name=value" rather than just "value"
++
++2001-01-04 00:15 richardb
++
++ * tools/gstreamer-launch.c: Added partial fix so that arguments can
++ be set.
++
++2001-01-03 23:08 wtay
++
++ * test/mp3play.c: Make sure the plugin is loaded only once
++
++2001-01-03 22:58 richardb
++
++ * examples/: helloworld2/helloworld2.c, launch/mp3play,
++ queue/queue.c, queue2/queue2.c, queue3/queue3.c, queue4/queue4.c,
++ thread/thread.c, xml/createxml.c: Do gst_init first, so we can
++ supply debugging options to libgst
++
++2001-01-03 20:55 wtay
++
++ * tools/gstreamer-inspect.c: Added the previous changes back in
++
++2001-01-03 20:44 omegahacker
++
++ * gst/: gstelement.c, gstelement.h, gstelementfactory.c: debug
++ updates and a padtemplate counter added
++
++2001-01-03 20:40 omegahacker
++
++ * gst/: gstpad.c, gstpad.h: Made gst_pad_eos_func a non-static
++ function
++
++2001-01-03 20:21 wtay
++
++ * gst/gstprops.c, gst/gstprops.h, tools/Makefile.am,
++ tools/gstreamer-inspect.c: Made the GstProps a GList instead of a
++ GSList Some fixes to inspect: added the mime type
++
++2001-01-03 19:54 wtay
++
++ * configure.in, tools/gstreamer-inspect.c: Added proper comment for
++ the bonobo component fix a compile bug in inspect... Erik, have
++ pending changes to gstpad.h?
++
++2001-01-03 19:12 richardb
++
++ * examples/helloworld/helloworld.c, plugins/esd/esdsink/esdsink.c:
++ Do gst_init first in helloworld, so you can supply gst parameters.
++ Correct name of frequency cap to rate, in esdsink. Now connects
++ properly.
++
++2001-01-03 18:55 richardb
++
++ * gst/elements/gstaudiosink.c: Various small fixes.
++
++2001-01-03 18:51 richardb
++
++ * plugins/esd/esdsink/: esdsink.c, esdsink.h: Should cope with
++ updating of parameters now.
++
++2001-01-03 18:15 richardb
++
++ * plugins/esd/esdsink/: esdsink.c, esdsink.h: EsdSink now
++ functions! Wheeeee! Still needs to have a few things sorted out
++ though, such as parameter setting / syncing.
++
++2001-01-03 16:25 richardb
++
++ * configure.in, plugins/Makefile.am, plugins/example.c,
++ plugins/esd/Makefile.am, plugins/esd/esdsink/.cvsignore,
++ plugins/esd/esdsink/Makefile.am, plugins/esd/esdsink/esdsink.c,
++ plugins/esd/esdsink/esdsink.h: Added auto detection of libesd.
++ Added nearly complete esdsink: all structure in place, just need to
++ add actaul links to libesd. ;-)
++
++2001-01-03 08:48 omegahacker
++
++ * tools/gstreamer-inspect.c: Updates, it prints a lot more stuff
++ now, like padtemplates, caps/props, and arguments. More stuff can
++ be done, but not now, I must sleep.
++
++2001-01-03 07:38 omegahacker
++
++ * tools/: .cvsignore, Makefile.am, gstreamer-inspect.c,
++ gstreamer-launch.c: Updates to -launch, added -inspect.
++
++2001-01-02 23:33 wtay
++
++ * plugins/: example.c, example.h: Updated the example plugin
++ template
++
++2001-01-02 22:52 richardb
++
++ * docs/Makefile.am: Don't delete CVS directories from working
++ directory: delete from distdir. Also, delete backup files, while
++ you're at it. :)
++
++2001-01-02 20:50 wtay
++
++ * gstreamer.spec.in: Datafiles in share should go in to RPM too
++
++2001-01-02 19:46 wtay
++
++ * examples/autoplug/Makefile.am, examples/helloworld/Makefile.am,
++ examples/helloworld2/Makefile.am, examples/launch/Makefile.am,
++ examples/queue/Makefile.am, examples/queue2/Makefile.am,
++ examples/queue3/Makefile.am, examples/queue4/Makefile.am,
++ examples/thread/Makefile.am, examples/xml/Makefile.am,
++ plugins/avi/Makefile.am, plugins/mpeg2/ac3parse/Makefile.am,
++ test/bindings/Makefile.am: The examples must not be installed
++ Removed debugging from Makefiles for avidecoder/ac3parse
++ /test/bindings/dummy.h cannot be installed
++
++2001-01-02 18:40 wtay
++
++ * docs/gst/gstreamer-docs.sgml, plugins/au/gstparseau.c,
++ plugins/au/gstparseau.h, plugins/audioscale/Makefile.am,
++ plugins/audioscale/audioscale.c,
++ plugins/filters/median/Makefile.am,
++ plugins/filters/smooth/Makefile.am, plugins/jpeg/Makefile.am,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.h,
++ plugins/mpeg1/mpegtypes/Makefile.am,
++ plugins/mpeg2/mpegtypes/Makefile.am,
++ plugins/visualization/spectrum/fix_fft.c,
++ plugins/visualization/spectrum/gstspectrum.c,
++ plugins/visualization/spectrum/gstspectrum.h: Remove esdsink from
++ the docs more fixes for symbols collisions
++
++2001-01-02 16:39 wtay
++
++ * plugins/visualization/synaesthesia/core.c: Fixed a symbol
++ conflict with mpeg_audio
++
++2001-01-02 16:29 wtay
++
++ * plugins/mpeg2/video/: Makefile.am, gethdr.c, getpic.c,
++ mpeg2dec.c, mpeg2dec.h, recon.c, recon_mmx.c, recon_sse.s: Fixed a
++ symbol conflict with mpeg_play
++
++2001-01-02 15:18 richardb
++
++ * docs/gst/Makefile.am: Remove gstesdsink
++
++2001-01-02 14:35 richardb
++
++ * docs/Makefile.am: Add dist-hook to stop CVS/ directories being
++ put into distribution.
++
++2001-01-02 14:34 richardb
++
++ * configure.in: Add GST_HTTPSRC_GET_TYPE back into configure.in:
++ documentation fails to build correctly when libhttp isn't present
++ without this.
++
++2001-01-02 13:23 richardb
++
++ * autogen.sh: Correct ftp urls for libtool.
++
++2001-01-02 12:07 wtay
++
++ * autogen.sh: Fixed a typo
++
++2001-01-02 12:04 wtay
++
++ * acconfig.h, autogen.sh, configure.in,
++ gst/elements/gstasyncdisksrc.c, gstplay/callbacks.c,
++ gstplay/gstmediaplay.c, plugins/Makefile.am: Added a check for
++ libjpeg Added and action for the load menu in gstplay Fixed drag
++ and drop in gstplay More verbose errors in gstasyndisksrc
++
++2001-01-02 08:13 omegahacker
++
++ * acconfig.h, autogen.sh, configure.in,
++ docs/random/TODO-post-0.1.0, examples/autoplug/Makefile.am,
++ gst/gstplugin.c, gst/elements/Makefile.am,
++ gst/elements/gstasyncdisksrc.c, include/registry.h,
++ libs/getbits/Makefile.am, libs/getbits/gstgetbits.c,
++ libs/getbits/gstgetbits.h, libs/getbits/gstgetbits_generic.c,
++ libs/idct/Makefile.am, libs/riff/gstriffencode.c,
++ libs/riff/gstriffparse.c, plugins/Makefile.am,
++ plugins/au/gstparseau.c, plugins/audioscale/audioscale.c,
++ plugins/avi/Makefile.am, plugins/avi/codectest.c,
++ plugins/avi/gstavidecoder.c, plugins/avi/gstaviencoder.c,
++ plugins/avi/videoheader.c, plugins/avi/wincodec/gstwindec.c,
++ plugins/avi/wincodec/gstwinenc.c, plugins/capture/v4l/grab-v4l.c,
++ plugins/capture/v4l/gstv4lsrc.c, plugins/cobin/cobin.c,
++ plugins/cobin/cobin.h, plugins/dvdsrc/dvdsrc.c,
++ plugins/effects/stereo/stereo.c, plugins/effects/volume/volume.c,
++ plugins/filters/ladspa/gstladspa.c,
++ plugins/filters/median/median.c, plugins/filters/smooth/smooth.c,
++ plugins/jpeg/gstjpeg.c, plugins/jpeg/gstjpegdec.c,
++ plugins/jpeg/gstjpegenc.c, plugins/mp3decode/Makefile.am,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mpeg1/mpeg1encoder/globals.h,
++ plugins/mpeg1/mpeg1encoder/gstmpeg1encoder.c,
++ plugins/mpeg1/mpeg1encoder/marker.c,
++ plugins/mpeg1/mpeg1encoder/mem.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.c,
++ plugins/mpeg1/mpegaudio/psy.c, plugins/mpeg1/mpegaudio/subs.c,
++ plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1/system_encode/buffer.c,
++ plugins/mpeg1/system_encode/system_encode.c,
++ plugins/mpeg1/system_encode/systems.c,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg2/ac3dec/ac3dec.c, plugins/mpeg2/ac3parse/ac3parse.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.c,
++ plugins/mpeg2/mpeg2enc/mpeg2enc.h,
++ plugins/mpeg2/parse/mpeg2parse.c,
++ plugins/mpeg2/subtitles/mpeg2subt.c, plugins/mpeg2/video/getpic.c,
++ plugins/mpeg2/video/gstmpeg2play.c, plugins/mpeg2/video/mpeg2dec.c,
++ plugins/mpeg2/videoparse/mp2videoparse.c, plugins/rtjpeg/rtjpeg.c,
++ plugins/rtjpeg/rtjpegdec.c, plugins/rtjpeg/rtjpegdec.h,
++ plugins/rtjpeg/rtjpegenc.c, plugins/rtjpeg/rtjpegenc.h,
++ plugins/vcdsrc/vcdsrc.c, plugins/videoscale/videoscale.c,
++ plugins/visualization/smoothwave/smoothwave.c,
++ plugins/visualization/spectrum/gstspectrum.c,
++ plugins/visualization/synaesthesia/synaesthesia.c,
++ plugins/visualization/vumeter/vumeter.c,
++ plugins/vorbis/vorbisdec.c, plugins/vorbis/vorbisenc.c,
++ plugins/wav/gstparsewav.c: Massive, massive update of most source
++ files. I went through and cleaned up all the warnings that I
++ could, which involved fixing some of the plugins.
++
++ The configure.in script was re-arranged and cleaned up so, and a
++ check for libtool 1.3.5 was added to autogen.sh. Added checks for
++ Gtk and GNOME.
++
++ Some plugins were removed from the list of things to build for
++ various reasons.
++
++ Added GST_DEBUG_FORCE_DISABLE in gstgetbits, since that's time
++ critical and even an if() from a DEBUG can significantly increase
++ runtimes.
++
++2001-01-02 02:18 wtay
++
++ * tests/Makefile.am: ooops, eos is a dir
++
++2001-01-02 02:16 wtay
++
++ * docs/gst/Makefile.am, docs/gst/gstreamer-sections.txt,
++ editor/pixmaps/Makefile.am, tests/Makefile.am,
++ tests/eos/Makefile.am, tests/eos/case1.c: Fixed makefiles for docs
++ Added eos test programs
++
++2001-01-02 01:44 wtay
++
++ * configure.in, docs/random/eos, editor/Makefile.am,
++ editor/gsteditorimage.c, editor/gsteditorpalette.c,
++ editor/gsteditorprojectview.c, editor/gsteditorproperty.c,
++ gst/gstpad.c, gst/elements/gstfakesrc.c, gst/elements/gstfakesrc.h,
++ gstplay/Makefile.am, gstplay/gstmediaplay.c: Fixes for
++ gsteditor/gstplay install/build fixed typo in random/eos added
++ num_buffers property to fakesrc
++
++2001-01-02 01:33 richardb
++
++ * Makefile.am, configure.in, docs/Makefile.am, docs/manuals.mak,
++ docs/gst/Makefile.am, docs/libs/Makefile.am: Added checking for all
++ the tools used to make documentation. If documentation cannot be
++ generated, whatever is available will still be installed.
++ videosink/imagetest is now a check_PROGRAM
++
++2001-01-02 01:00 omegahacker
++
++ * REQUIREMENTS: updated requirements
++
++2001-01-02 00:35 omegahacker
++
++ * REQUIREMENTS: added list of requrements
++
++2001-01-02 00:31 richardb
++
++ * configure.in, examples/Makefile.am: Added launch back into make
++ system. The Makefile wasn't being generated, resulting in make
++ dist failing when the directory was entered for make dist.
++
++2001-01-01 23:50 wtay
++
++ * examples/Makefile.am: Added directories to DIST_SUBDIRS
++
++2001-01-01 23:20 omegahacker
++
++ * examples/autoplug/Makefile.am: somehow Makefile.am went
++ zero-bytes
++
++2001-01-01 22:44 omegahacker
++
++ * examples/: Makefile.am, thread/Makefile.am: updated examples
++ build stuff
++
++2001-01-01 21:21 omegahacker
++
++ * Makefile.am, configure.in, examples/xml/Makefile.am,
++ gst/Makefile.am, plugins/dvdsrc/Makefile.am: More build fixes
++
++2001-01-01 19:54 wtay
++
++ * docs/random/: TODO-post-0.1.0, eos: Added some more TODOs Added a
++ proposition for eos propagation
++
++2001-01-01 17:25 wtay
++
++ * docs/gst/gstreamer-sections.txt, docs/gst/tmpl/gstelement.sgml,
++ docs/gst/tmpl/gstinfo.sgml, docs/gst/tmpl/gstpad.sgml,
++ docs/gst/tmpl/gstreamer-unused.sgml, gst/gstelement.c,
++ gst/gstpad.c: Documentation updates
++
++2001-01-01 14:34 richardb
++
++ * examples/launch/Makefile.am: Add one more file to dist.
++
++2001-01-01 14:06 richardb
++
++ * docs/: gst/Makefile.am, libs/Makefile.am: Fix a couple of files
++ not being put into distributions. make dist now appears to create
++ a fully functional distribution. make rpm should now produce an
++ rpm. Whether that rpm is any good is another matter...
++
++2001-01-01 13:41 richardb
++
++ * Makefile.am, configure.in, examples/Makefile.am,
++ examples/launch/Makefile.am, examples/xml/Makefile.am: Fix broken
++ build system for examples.
++
++2001-01-01 08:43 omegahacker
++
++ * gstplay/Makefile.am, plugins/avi/Makefile.am,
++ plugins/avi/wincodec/Makefile.am: More build changes
++
++2001-01-01 08:37 omegahacker
++
++ * Makefile.am, autogen.sh, configure.in,
++ docs/code-reviews/gstbin.c-1.41, examples/autoplug/Makefile,
++ examples/autoplug/Makefile.am, examples/autoplug/autoplug.c,
++ examples/helloworld/Makefile, examples/helloworld/Makefile.am,
++ examples/helloworld2/Makefile, examples/helloworld2/Makefile.am,
++ examples/queue/Makefile, examples/queue/Makefile.am,
++ examples/queue2/Makefile, examples/queue2/Makefile.am,
++ examples/queue3/Makefile, examples/queue3/Makefile.am,
++ examples/queue4/Makefile, examples/queue4/Makefile.am,
++ examples/thread/Makefile, examples/thread/Makefile.am,
++ examples/xml/Makefile, examples/xml/Makefile.am, gst/gstpad.c,
++ gst/gstplugin.c: Re-arranged the build a bit to try to make it more
++ sane. Added some debug.
++
++2001-01-01 07:47 omegahacker
++
++ * gstplay/Makefile.am: added headers and such to Makefile.am for
++ dist
++
++2001-01-01 07:44 omegahacker
++
++ * test/: mp3.c, qtest.c: added the category number to DEBUG
++
++2001-01-01 07:42 omegahacker
++
++ * plugins/filters/ladspa/Makefile.am: missed utils.h
++
++2001-01-01 07:30 omegahacker
++
++ * configure.in: updated version number from 0.9.2 (huh???) to 0.1.0
++
++2001-01-01 06:59 wtay
++
++ * configure.in, docs/gst/tmpl/gstinfo.sgml,
++ docs/gst/tmpl/gstplugin.sgml, docs/gst/tmpl/gstreamer-unused.sgml,
++ examples/autoplug/autoplug.c: Added -Wall to configure.in
++
++2001-01-01 06:57 omegahacker
++
++ * gst/Makefile.am: fixed a nasty bug where at -O6 teh compiler
++ optimized cothreads.c beyond the point of functioning
++
++2001-01-01 06:23 wtay
++
++ * plugins/vorbis/: Makefile.am, vorbis.c, vorbisdec.c, vorbisdec.h,
++ vorbisenc.c, vorbisenc.h: Some compile cleanups
++
++2001-01-01 05:26 wtay
++
++ * gst/gstpipeline.c: Fixed a very bad error with autoplugging.
++
++2001-01-01 05:18 omegahacker
++
++ * gst/: gst.c, gstinfo.c, gstinfo.h: updated the debug system so it
++ works nicely now
++
++2001-01-01 04:53 omegahacker
++
++ * gst/: gst.c, gstinfo.c, gstinfo.h: Added API to control DEBUG
++ level, updated cmdline code
++
++2001-01-01 04:41 omegahacker
++
++ * gst/: gst.c, gstpad.c: modified cmdlien code to take both 0xHEX
++ and dec, and added an INFO line in gst_pad_connect()
++
++2001-01-01 04:11 omegahacker
++
++ * plugins/filters/ladspa/: Makefile, search.c: removed accidentally
++ checked in Makefile and added .cvsignore
++
++2001-01-01 04:10 wtay
++
++ * test/mp3.c, test/qtest.c, tests/case4.c, tests/markup.c,
++ tests/paranoia.c, tests/rip.c, tests/simplefake.c: Updated test
++ programs
++
++2001-01-01 04:04 wtay
++
++ * gst/gst.c: Fixed a typo
++
++2001-01-01 04:02 wtay
++
++ * plugins/filters/ladspa/: Makefile, gstladspa.c: Added the boolean
++ properties back
++
++2001-01-01 03:59 omegahacker
++
++ * plugins/filters/ladspa/: gstladspa.c, gstladspa.h: fixed ladpsa
++ filter up to compile
++
++2001-01-01 03:57 omegahacker
++
++ * plugins/filters/Makefile.am: added ladspa
++
++2001-01-01 03:57 omegahacker
++
++ * gst/gstautoplug.c: set categories for all INFOs
++
++2001-01-01 03:44 omegahacker
++
++ * tests/sched/.cvsignore: added .cvsignore
++
++2001-01-01 03:43 wtay
++
++ * gst/: Makefile.am, gst.c, gstcpu.c, gstinfo.c: Added command line
++ parsing for --gst-info-mask, --gst-debug-mask and --help Dump the
++ FLAGS and options on --help
++
++2001-01-01 03:22 omegahacker
++
++ * tests/.cvsignore: updated .cvsignore
++
++2001-01-01 03:20 omegahacker
++
++ * configure.in: added directories to configure.in
++
++2001-01-01 03:19 omegahacker
++
++ * plugins/filters/ladspa/: Makefile, Makefile.am, gstladspa.c,
++ gstladspa.h, ladspa.h, load.c, search.c, utils.h: New LADSPA plugin
++ wrapper
++
++2001-01-01 03:18 omegahacker
++
++ * examples/Makefile.am: fixed stupid spelling mistake
++
++2001-01-01 03:18 omegahacker
++
++ * gstplay/: .cvsignore, Makefile.am: gstplay now builds from
++ build-directory, doesn't require a make install
++
++2001-01-01 03:16 omegahacker
++
++ * plugins/: audioscale/audioscale.c, avi/audiocodecs.c,
++ avi/gstavidecoder.c, avi/gstaviencoder.c, avi/wincodec/gstwindec.c,
++ avi/wincodec/gstwinenc.c, capture/v4l/gstv4lsrc.c,
++ cdparanoia/cdparanoia.c, dvdsrc/dvdsrc.c, filters/median/median.c,
++ filters/smooth/smooth.c, jpeg/gstjpegdec.c, jpeg/gstjpegenc.c,
++ mp3decode/mpg123/gstmpg123.c, mp3decode/parse/mp3parse.c,
++ mp3decode/types/mp3types.c, mp3encode/lame/gstlame.c,
++ mpeg1/mpeg1encoder/gstmpeg1encoder.c,
++ mpeg1/mpeg_play/gstmpeg_play.c, mpeg1/mpeg_play/util.c,
++ mpeg1/mpeg_play/video.c, mpeg1/mpegaudio/gstmpegaudio.c,
++ mpeg1/parse/mpeg1parse.c, mpeg1/system_encode/buffer.c,
++ mpeg1/system_encode/system_encode.c,
++ mpeg1video/parse/mp1videoparse.c, mpeg2/ac3parse/ac3parse.c,
++ mpeg2/mpeg2enc/gstmpeg2enc.c, mpeg2/parse/mpeg2parse.c,
++ mpeg2/subtitles/mpeg2subt.c, mpeg2/video/gethdr.c,
++ mpeg2/video/gstmpeg2play.c, mpeg2/video/mpeg2dec.c,
++ mpeg2/videoparse/mp2videoparse.c, videoscale/videoscale.c,
++ visualization/smoothwave/smoothwave.c,
++ visualization/synaesthesia/synaesthesia.c, vorbis/vorbisdec.c:
++ Updated all plugins to use new GST_DEBUG and GST_INFO systems.
++
++2001-01-01 03:16 omegahacker
++
++ * libs/: getbits/gstgetbits_generic.c, riff/gstriffencode.c,
++ riff/gstriffparse.c: Updated libraries to use new GST_DEBUG instead
++ of DEBUG.
++
++2001-01-01 03:14 omegahacker
++
++ * gst/: cothreads.c, gst.c, gstautoplug.c, gstbin.c, gstbuffer.c,
++ gstbufferpool.c, gstcaps.c, gstclock.c, gstcpu.c, gstelement.c,
++ gstelementfactory.c, gstinfo.c, gstinfo.h, gstobject.c, gstpad.c,
++ gstpipeline.c, gstplugin.c, gstprops.c, gstscheduler.c,
++ gstthread.c, gsttype.c, gstxml.c, elements/gstasyncdisksrc.c,
++ elements/gstaudiosink.c, elements/gstaudiosrc.c,
++ elements/gstdisksrc.c, elements/gstfdsink.c,
++ elements/gstpipefilter.c, elements/gstqueue.c,
++ elements/gstsinesrc.c, elements/gsttypefind.c: Mega update of INFO,
++ DEBUG, and ERROR subsystems, renamed with GST_ prefix. GST_DEBUG
++ now takes a category parameter, which is the same as GST_INFO
++ system. They are now called GST_CAT_*. All the GST_DEBUGs are set
++ to 0 for now, we need to go and fix all these eventually.
++
++2001-01-01 02:46 omegahacker
++
++ * gst/gstcpu.c: fixed stupid (brown paper bag) bug with missing
++ NULL on g_strconcat
++
++2001-01-01 02:34 omegahacker
++
++ * gst/gstcpu.c: fixed the segfault
++
++2001-01-01 01:56 wtay
++
++ * acconfig.h, configure.in, gst/gstinfo.c: Added --enable-info and
++ --disable-info-system nothing specified = INFO enabled, mask to
++ 0x00000001 --enable-info = INFO enabled, mask to 0xffffffff
++ --disable-info = INFO compiled into a nop and thus disabled
++
++2001-01-01 00:44 omegahacker
++
++ * examples/: autoplug/.cvsignore, helloworld/.cvsignore,
++ helloworld2/.cvsignore, launch/Makefile, queue/.cvsignore,
++ queue2/.cvsignore, queue3/.cvsignore, queue4/.cvsignore,
++ thread/.cvsignore, xml/.cvsignore: hopefully one last update to the
++ examples .cvsignores
++
++2001-01-01 00:44 wtay
++
++ * acconfig.h, configure.in, gst/gstinfo.h, plugins/avi/Makefile.am,
++ plugins/avi/gstavidecoder.c: Added GST_INFO_ENABLED flags Added
++ --enable-debug-info A little fix for the avidecoder
++
++2001-01-01 00:42 omegahacker
++
++ * examples/: helloworld/helloworld.c, helloworld2/helloworld2.c,
++ queue/queue.c, queue2/queue2.c, queue3/queue3.c, queue4/queue4.c,
++ thread/thread.c, xml/Makefile, xml/createxml.c, xml/runxml.c:
++ cleaned up the examples, added Makefiles, etc
++
++2001-01-01 00:34 omegahacker
++
++ * examples/: Makefile.am, autoplug/Makefile, autoplug/autoplug.c,
++ helloworld/Makefile, helloworld2/Makefile, launch/Makefile,
++ queue/Makefile, queue2/Makefile, queue3/Makefile, queue4/Makefile,
++ thread/Makefile, xml/Makefile: Updated makefiles for examples
++
++2001-01-01 00:17 omegahacker
++
++ * gst/: gstcpu.c, gstinfo.c, gstinfo.h, elements/gstelements.c:
++ Cleaned up INFO system some more, added API to select categories,
++ modified the printout function to print cleanly for GST_INIT info
++ (the default min) and spew function:line debug_string [element] for
++ everything else. Eventually could make even that configurable
++ easily enough, just check against another bitmap instead of
++ checking for == GST_INIT.
++
++2000-12-31 23:31 wtay
++
++ * gst/: Makefile.am, gstbin.c, gstpad.c, elements/gstfakesrc.c: Fix
++ some compile warnings
++
++2000-12-31 22:49 omegahacker
++
++ * gstplay/gstmediaplay.c: Added ability to use .glade file in cwd
++
++2000-12-31 22:18 omegahacker
++
++ * gst/: gstelement.c, gstelement.h, gstinfo.c, gstinfo.h, gstpad.c,
++ gstpad.h, gstplugin.c, gstplugin.h, gstscheduler.c, gsttype.c,
++ types/gsttypes.c: Started work on better ghostpad management, and
++ started to build the low- level EOS mechanism.
++
++ Also removed a couple of printouts that aren't needed any more.
++
++2000-12-31 22:16 omegahacker
++
++ * plugins/: mp3decode/types/mp3types.c,
++ mpeg1/mpegtypes/mpeg1types.c, mpeg2/mpegtypes/mpeg2types.c:
++ Commented out some extra output that we don't need right now.
++
++2000-12-31 22:15 omegahacker
++
++ * tools/gstreamer-register.c: Added stdlib.h to clean up exit()
++ warnings
++
++2000-12-31 22:14 omegahacker
++
++ * tests/: load.c, markup.c: New test programs.
++
++2000-12-31 22:13 omegahacker
++
++ * tests/Makefile.am: [no log message]
++
++2000-12-31 22:11 omegahacker
++
++ * tests/sched/: Makefile, Makefile.am, runxml.c, testcases:
++ Converted to a Makefile.am, fixed up the GstSrc thing, and removed
++ a set to READY state before PLAYING that isn't necessary.
++
++2000-12-31 18:06 richardb
++
++ * plugins/mpeg2/mpeg2dec/Makefile.am: Add a final header file to
++ noinst_HEADERS
++
++2000-12-31 17:49 richardb
++
++ * plugins/mpeg2/: ac3dec/Makefile.am, mpeg2dec/Makefile.am: A
++ couple more fixes to make dist.
++
++2000-12-31 17:37 richardb
++
++ * plugins/mpeg2/mpeg2dec/Makefile.am: Add new files to dist.
++
++2000-12-31 17:34 wtay
++
++ * plugins/mpeg2/mpeg2dec/: attributes.h, idct_mlib.c, mm_accel.h,
++ motion_comp_mlib.c, output_video.h, stats.c: Added missing files,
++ It should compile now, but doesn't work
++
++2000-12-31 17:32 richardb
++
++ * plugins/: mp3decode/Makefile.am, mpeg1/mpeg_play/Makefile.am,
++ mpeg1/mpegaudio/Makefile.am, mpeg2/ac3dec/Makefile.am,
++ mpeg2/mpeg2enc/Makefile.am, wav/Makefile.am: Various fixes to
++ ensure that appropriate files are included in make dist. Make dist
++ now produces a nearly functioning distribution.
++
++2000-12-31 17:32 wtay
++
++ * editor/gsteditorproperty.c, plugins/cdparanoia/cdparanoia.c:
++ Updated the editor to use the capslist Added change state in
++ cdparanoia
++
++2000-12-31 17:02 wtay
++
++ * docs/gst/gstreamer-sections.txt, docs/gst/tmpl/gstautoplug.sgml,
++ docs/gst/tmpl/gstcaps.sgml, docs/gst/tmpl/gstelement.sgml,
++ docs/gst/tmpl/gstpad.sgml, docs/gst/tmpl/gstprops.sgml,
++ docs/gst/tmpl/gstreamer-unused.sgml, gst/Makefile.am,
++ gst/gstautoplug.c, gst/gstcaps.h, gst/gstpad.c, tests/.cvsignore:
++ Updated the docs Updated gst/Makefile.am to add CFLAGS Added test
++ programs to tests/.cvsignore
++
++2000-12-31 16:15 wtay
++
++ * tests/padfactory.c: Test program for the pad factory
++
++2000-12-31 16:12 wtay
++
++ * examples/autoplug/autoplug.c, gst/gst.h, gst/gstautoplug.c,
++ gst/gstautoplug.h, gst/gstcaps.c, gst/gstcaps.h, gst/gstelement.h,
++ gst/gstelementfactory.c, gst/gstinfo.c, gst/gstpad.c, gst/gstpad.h,
++ gst/gstpipeline.c, gst/gstplugin.c, gst/gstprops.c, gst/gstprops.h,
++ gst/elements/gstaudiosink.c, plugins/avi/gstavidecoder.c,
++ plugins/avi/gstaviencoder.c, plugins/avi/wincodec/gstwincodec.c,
++ plugins/cdparanoia/cdparanoia.c,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3decode/types/mp3types.c,
++ plugins/mp3encode/lame/gstlame.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpegtypes/mpeg1types.c,
++ plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg2/ac3dec/ac3dec.c, plugins/mpeg2/ac3parse/ac3parse.c,
++ plugins/mpeg2/mpegtypes/mpeg2types.c,
++ plugins/mpeg2/parse/mpeg2parse.c,
++ plugins/mpeg2/video/gstmpeg2play.c,
++ plugins/mpeg2/videoparse/mp2videoparse.c, plugins/vorbis/vorbis.c,
++ tests/Makefile.am, tests/autoplug.c, tests/caps.c, tests/case4.c,
++ tests/init.c, tests/queue.c, tests/simplefake.c, tests/states.c:
++ Added multiple caps to the pads Extended the padfactory for the
++ multiple caps GstCaps now have a name so that future manipulations
++ on them can be done by name Updated the plugins for the new caps
++ list
++
++2000-12-31 16:07 richardb
++
++ * Makefile.am, configure.in, include/Makefile.am: Add files in
++ include to distributions.
++
++2000-12-31 15:53 richardb
++
++ * gst/Makefile.am: Add gstpropsprivate.h to dist.
++
++2000-12-31 15:19 richardb
++
++ * docs/Makefile.am: Add docs/fwg to DIST_SUBDIRS
++
++2000-12-31 15:18 richardb
++
++ * configure.in: Add docs/fwg/Makefile to things to be built.
++
++2000-12-31 14:22 richardb
++
++ * docs/manuals.mak: Fix another bug in make install for fwg
++ (complained becuase there were no pngs to install). I should have
++ got up more slowly today...
++
++2000-12-31 14:02 richardb
++
++ * docs/: fwg/.cvsignore, libs/tmpl/.cvsignore, manual/.cvsignore,
++ manual/images/.cvsignore: Fix .cvsignores
++
++2000-12-31 13:55 richardb
++
++ * docs/: manuals.mak, fwg/.cvsignore: Fix bug in make install for
++ manuals. Added stuff to .cvsignore in fwg
++
++2000-12-31 10:46 omegahacker
++
++ * tools/gstreamer-launch.c: Complete rewrite of the launcher. Now
++ supports pretty arbitrary pipelines. Try '((fakesrc) ! identity !
++ (fakesink))' out. Doesn't seem to recognize pad names yet for some
++ reason, so it goes with the first sink/src pad it finds in a given
++ element. Other problems still remain, but the hard part is done
++ with.
++
++2000-12-30 19:51 wtay
++
++ * plugins/mpeg2/mpegtypes/mpeg2types.c: Removed elementary mpeg2
++ video detection because we simply don't know if it's mpeg1 or mpeg2
++
++2000-12-30 19:41 wtay
++
++ * plugins/avi/gstavidecoder.c: removed debugging
++
++2000-12-30 19:40 wtay
++
++ * plugins/mpeg1/parse/Makefile.am: removed debugging info again
++
++2000-12-30 19:39 wtay
++
++ * plugins/mpeg1/parse/: Makefile.am, mpeg1parse.c: Removed ac3 and
++ other private streams until autoplug can figure it out
++
++2000-12-30 19:37 wtay
++
++ * libs/getbits/: gstgetbits.c, gstgetbits.h: Disabled MMX optimized
++ versions until they get fixed
++
++2000-12-30 19:04 wtay
++
++ * gst/cothreads.c, gst/gstplugin.c, plugins/avi/audiocodecs.c,
++ plugins/avi/gstavidecoder.c, plugins/avi/gstavidecoder.h,
++ plugins/avi/playcodecs.c, plugins/avi/wincodec/gstwincodec.c,
++ plugins/avi/wincodec/gstwindec.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c: Fixed autoplugging for avi
++ Fixed a bug in multiple typefind function loading: when a typefind
++ is requested for a mimetype, all plugins with a typefind function
++ should be loaded.
++
++2000-12-30 17:42 wtay
++
++ * gst/gst.c, gst/gstautoplug.c, gst/gstcaps.c, gst/gstplugin.c,
++ gst/gstprops.c, gst/gstthread.c, plugins/mpeg2/ac3dec/ac3dec.c,
++ plugins/mpeg2/mpegtypes/mpeg2types.c,
++ plugins/mpeg2/parse/mpeg2parse.c,
++ plugins/mpeg2/video/gstmpeg2play.c,
++ plugins/mpeg2/videoparse/mp2videoparse.c: Fixed MPEG2 autoplugging
++ Added some more INFO to gstthread
++
++2000-12-30 17:13 wtay
++
++ * docs/gst/: Makefile.am, tmpl/gstreamer-unused.sgml: Updated the
++ makefile for new files
++
++2000-12-30 16:13 wtay
++
++ * docs/gst/.cvsignore, docs/gst/gstreamer-decl.txt,
++ docs/gst/gstreamer-docs.sgml, docs/gst/gstreamer-sections.txt,
++ docs/gst/gstreamer.hierarchy, docs/gst/gstreamer.types.in,
++ docs/gst/tmpl/gst.sgml, docs/gst/tmpl/gstautoplug.sgml,
++ docs/gst/tmpl/gstbuffer.sgml, docs/gst/tmpl/gstcaps.sgml,
++ docs/gst/tmpl/gstconnection.sgml, docs/gst/tmpl/gstelement.sgml,
++ docs/gst/tmpl/gstfilter.sgml, docs/gst/tmpl/gstinfo.sgml,
++ docs/gst/tmpl/gstobject.sgml, docs/gst/tmpl/gstprops.sgml,
++ docs/gst/tmpl/gstreamer-unused.sgml,
++ docs/gst/tmpl/gstscheduler.sgml, docs/gst/tmpl/gstsink.sgml,
++ docs/gst/tmpl/gstsrc.sgml, gst/gstautoplug.c, gst/gstelement.c,
++ gst/gstobject.c, gst/gstplugin.c, gst/elements/Makefile.am,
++ gst/elements/gstqueue.c, gst/elements/gsttypefind.c: Docs updates:
++ remove sink, src, filter, connection added gstinfo to docs.
++ Updated some core files for the docs gsttypefind did not include
++ gst_private Added CFlags to Makefile.am in gst/elements
++
++2000-12-30 15:36 richardb
++
++ * docs/: Makefile.am, manuals.mak, fwg/Makefile.am,
++ fwg/gst-filter-writers-guide.sgml, manual/Makefile.am: Added
++ framework for writing filter writers guide. Extracted much of the
++ makefile from docs/manual into a shared file which is included, so
++ it can be re-used.
++
++2000-12-30 14:46 richardb
++
++ * docs/: libs/.cvsignore, manual/.cvsignore, manual/Makefile.am,
++ libs/Makefile.am: Fix a bug in manual/Makefile.am: bad shell script
++ for make disting .ps files. Couple of final fixes to
++ libs/Makefile.am, too. Add a few things to cvsignores.
++
++2000-12-30 14:40 richardb
++
++ * plugins/: dvdsrc/Makefile.am, mpeg2/video/getvlc.h,
++ mpeg2/video/mpeg2dec.h, mpeg2/videoparse/Makefile.am: Change ERROR
++ to VLC_ERROR in mpeg2. Fix a couple of makefiles so that make dist
++ works.
++
++2000-12-30 13:54 richardb
++
++ * docs/libs/: Makefile.am, tmpl/.cvsignore: Makefile cleaned muchly
++ - make should now cause gstreamer-libs docs to be created. Make
++ dist may work too - untested. No longer store tmpls in CVS,
++ either. Only thing missing is make dependencies on the source
++ files used to extract the docs.
++
++2000-12-30 13:14 richardb
++
++ * docs/libs/tmpl/: dct.sgml, externals.sgml, gstcolorspace.sgml,
++ gstgetbits.sgml, gstgetbits_inl.sgml, gstidct.sgml,
++ gstputbits.sgml, gstriff.sgml, gstvideoscale.sgml, wineacm.sgml:
++ Remove template files from CVS: they're autogenerated better.
++
++2000-12-30 05:05 richardb
++
++ * docs/manual/Makefile.am: Makefile can now be used for a different
++ manual by simply changing the initial variables
++
++2000-12-30 04:40 richardb
++
++ * docs/manual/images/: .cvsignore, Makefile.am: Remove old
++ directories and files
++
++2000-12-30 04:36 richardb
++
++ * docs/manual/: Makefile.am, bin-element.fig,
++ connected-elements.fig, filter-element-multi.fig,
++ filter-element.fig, hello-world.fig, mime-world.fig, queue.fig,
++ sink-element.fig, src-element.fig, state-diagram.fig, thread.fig:
++ Misc tweaks to makefile for manual. Moved .figs into same
++ directory so we can have them built appropriately without having to
++ hack makefiles horribly. Nearly have a core makefile which can be
++ reused for other manuals.
++
++2000-12-30 03:28 wtay
++
++ * docs/manual/images/Makefile.am: Scaled down the eps images to
++ half their size
++
++2000-12-30 02:47 wtay
++
++ * gst/elements/: gstelements.c, gstfakesrc.c: Added some INFO in
++ gstelements Reverted pad names in gstfakesrc back to what they were
++
++2000-12-30 02:41 omegahacker
++
++ * gst/: cothreads.c, gst.c, gst_private.h, gstbin.c, gstbuffer.c,
++ gstelement.c, gstinfo.c, gstinfo.h, gstpad.c, gstplugin.c,
++ gsttype.c, elements/gsttypefind.c: Updated more files to use INFO.
++
++2000-12-30 02:25 richardb
++
++ * docs/manual/Makefile.am: Minor neaten to makefile.
++
++2000-12-30 01:53 richardb
++
++ * test/: a.c, avi2mpg.c, aviparse.c, mp1parse.c, mp1tomp1.c,
++ mp2toavi.c, mp2tomp1.c, mp3.c, mp3parse.c, mp3play.c,
++ mp3tovorbis.c, mpeg2parse.c, pipetest.c, qtest.c: Convert GstSrc's
++ to GstElements.
++
++2000-12-30 01:06 richardb
++
++ * configure.in, plugins/Makefile.am, plugins/mp3encode/Makefile.am:
++ Added configure test for liblame.
++
++2000-12-30 00:46 richardb
++
++ * configure.in, plugins/Makefile.am: Add configure tests for
++ cdparanoia
++
++2000-12-30 00:17 richardb
++
++ * plugins/mpeg1/system_encode/Makefile.am: Include "include/"
++
++2000-12-29 22:36 richardb
++
++ * plugins/: mpeg2/parse/Makefile.am, mpeg1/parse/Makefile.am:
++ Include "include/" when compiling.
++
++2000-12-29 21:58 richardb
++
++ * gst/elements/gsttypefind.c: Remove reference to gstdebug.h which
++ doesn't exist.
++
++2000-12-29 21:56 richardb
++
++ * libs/getbits/: gstgetbits.c, gstgetbits.h: Fix a couple of MMX
++ issues.
++
++2000-12-29 21:50 richardb
++
++ * libs/getbits/Makefile.am: Include libgst.la when linking gbtest
++ so it compiles.
++
++2000-12-29 21:44 richardb
++
++ * plugins/mpeg1/mpeg_play/: decoders.c, decoders.h: Use VLC_ERROR
++ instead of ERROR_VAL, at Erik's suggestion. :)
++
++2000-12-29 21:40 richardb
++
++ * plugins/mpeg1/mpeg_play/: decoders.c, decoders.h: Rename #define
++ ERROR to #define ERROR_VAL to avoid conflict with gstinfo.h
++
++2000-12-29 19:45 wtay
++
++ * gst/Makefile.am, gst/gstautoplug.c, gst/gstbin.c,
++ gst/gstbuffer.c, gst/gstbuffer.h, gst/gstpipeline.c,
++ gst/gstprops.c, gst/gstscheduler.c, gst/elements/gstasyncdisksrc.c,
++ gstplay/gstplay.c, plugins/capture/v4l/gstv4lsrc.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3encode/lame/gstlame.h,
++ plugins/mpeg1/mpeg_play/decoders.c,
++ plugins/mpeg1/mpeg_play/decoders.h,
++ plugins/mpeg1video/parse/mp1videoparse.c: Fixed buffer flag
++ handling gstplay used old flag handling updated some plugins for
++ the new objects/error handling Fixed a serious buffer error in
++ gst_buffer_append
++
++2000-12-29 18:31 wtay
++
++ * tests/: caps.c, props.c: Updated some test programs
++
++2000-12-29 18:23 wtay
++
++ * gst/: gstautoplug.c, gstbin.c, gstbuffer.h, gstpipeline.c,
++ gstplugin.c, gstprops.c, gstprops.h, gstscheduler.c,
++ elements/gstasyncdisksrc.c: Fixed a serious bug in gst_props_new:
++ properties with a 0 value causes a segfault Fixed a possible bug in
++ gstautoplug when one of the constructed paths was empty Commented
++ out a too liberal assert in gstscheduler.c Added
++ GST_BUFFER_DISCONTINUOUS tried to fix asyndisksrc
++
++2000-12-29 10:02 omegahacker
++
++ * gst/: Makefile.am, gst.c, gst.h, gst_private.h, gstdebug.h,
++ gstelement.c, gstelement.h, gstinfo.c, gstinfo.h, gstobject.c,
++ gstobject.h, gstplugin.c, gstscheduler.c: Added DEBUG, INFO, and
++ ERROR systems. Very little code is converted yet. Policy
++ decisions need to be made as to what kinds of cases get what kind
++ of response, and what the default ERROR response should be. Right
++ now it will print out all the information, then have gdb spew a
++ stack trace.
++
++2000-12-29 05:38 omegahacker
++
++ * gst/elements/: gstasyncdisksrc.c, gstasyncdisksrc.h,
++ gstaudiosink.c, gstaudiosink.h, gstaudiosrc.c, gstaudiosrc.h,
++ gstdisksrc.c, gstdisksrc.h, gstelements.c, gstesdsink.c,
++ gstesdsink.h, gstfakesink.c, gstfakesink.h, gstfakesrc.c,
++ gstfakesrc.h, gstfdsink.c, gstfdsink.h, gstfdsrc.c, gstfdsrc.h,
++ gsthttpsrc.c, gsthttpsrc.h, gstidentity.c, gstidentity.h,
++ gstpipefilter.c, gstpipefilter.h, gstqueue.c, gstqueue.h,
++ gstsinesrc.c, gstsinesrc.h, gsttypefind.c, gsttypefind.h: Updated
++ copyright notices.
++
++2000-12-29 04:36 wtay
++
++ * gstplay/gstplay.c: Add the pipeline to the thread after
++ autoplugging.
++
++2000-12-29 03:05 wtay
++
++ * editor/gsteditorpadtemplate.c: Added a missing file...
++
++2000-12-29 02:50 omegahacker
++
++ * plugins/: example.c, example.h, au/gstparseau.c, au/gstparseau.h,
++ audioscale/audioscale.c, audioscale/audioscale.h,
++ avi/gstavidecoder.c, avi/gstavidecoder.h, avi/gstaviencoder.c,
++ avi/gstaviencoder.h, avi/wincodec/gstwindec.c,
++ avi/wincodec/gstwindec.h, avi/wincodec/gstwinenc.c,
++ avi/wincodec/gstwinenc.h, capture/v4l/gstv4lsrc.c,
++ capture/v4l/gstv4lsrc.h, cdparanoia/cdparanoia.c,
++ cdparanoia/cdparanoia.h, cobin/cobin.c, cobin/spindentity.c,
++ cobin/spindentity.h, dvdsrc/Makefile.am, dvdsrc/dvdsrc.c,
++ dvdsrc/dvdsrc.h, effects/stereo/stereo.c, effects/stereo/stereo.h,
++ effects/volume/volume.c, effects/volume/volume.h,
++ filters/median/median.c, filters/median/median.h,
++ filters/smooth/smooth.c, filters/smooth/smooth.h,
++ jpeg/gstjpegdec.c, jpeg/gstjpegdec.h, jpeg/gstjpegenc.c,
++ jpeg/gstjpegenc.h, mp3decode/mpg123/gstmpg123.c,
++ mp3decode/mpg123/gstmpg123.h, mp3decode/parse/mp3parse.c,
++ mp3decode/parse/mp3parse.h, mp3decode/xa/gstxa.c,
++ mp3decode/xa/gstxa.h, mp3decode/xing/gstxing.c,
++ mp3decode/xing/gstxing.h, mpeg1/mpeg1encoder/gstmpeg1encoder.c,
++ mpeg1/mpeg1encoder/gstmpeg1encoder.h,
++ mpeg1/mpeg_play/gstmpeg_play.c, mpeg1/mpeg_play/gstmpeg_play.h,
++ mpeg1/mpegaudio/gstmpegaudio.c, mpeg1/mpegaudio/gstmpegaudio.h,
++ mpeg1/parse/mpeg1parse.c, mpeg1/parse/mpeg1parse.h,
++ mpeg1/system_encode/system_encode.c,
++ mpeg1/system_encode/system_encode.h,
++ mpeg1video/parse/mp1videoparse.c, mpeg1video/parse/mp1videoparse.h,
++ mpeg2/ac3dec/ac3dec.c, mpeg2/ac3dec/ac3dec.h,
++ mpeg2/ac3parse/ac3parse.c, mpeg2/ac3parse/ac3parse.h,
++ mpeg2/mpeg2dec/gstmpeg2dec.c, mpeg2/mpeg2dec/gstmpeg2dec.h,
++ mpeg2/mpeg2enc/gstmpeg2enc.c, mpeg2/mpeg2enc/gstmpeg2enc.h,
++ mpeg2/parse/mpeg2parse.c, mpeg2/parse/mpeg2parse.h,
++ mpeg2/subtitles/mpeg2subt.c, mpeg2/subtitles/mpeg2subt.h,
++ mpeg2/video/gstmpeg2play.c, mpeg2/video/gstmpeg2play.h,
++ mpeg2/video/mpeg2dec.c, mpeg2/videoparse/mp2videoparse.c,
++ mpeg2/videoparse/mp2videoparse.h, rtjpeg/rtjpegdec.c,
++ rtjpeg/rtjpegdec.h, rtjpeg/rtjpegenc.c, rtjpeg/rtjpegenc.h,
++ vcdsrc/vcdsrc.c, vcdsrc/vcdsrc.h, videoscale/videoscale.c,
++ videoscale/videoscale.h, visualization/smoothwave/smoothwave.c,
++ visualization/smoothwave/smoothwave.h,
++ visualization/spectrum/gstspectrum.c,
++ visualization/spectrum/gstspectrum.h,
++ visualization/synaesthesia/synaesthesia.c,
++ visualization/synaesthesia/synaesthesia.h,
++ visualization/vumeter/vumeter.c, visualization/vumeter/vumeter.h,
++ vorbis/vorbisdec.c, vorbis/vorbisdec.h, vorbis/vorbisenc.c,
++ vorbis/vorbisenc.h, wav/gstparsewav.c, wav/gstparsewav.h: MEGA
++ reparenting of all the elements to GstElement.
++
++2000-12-29 02:28 omegahacker
++
++ * gst/: Makefile.am, gst.h, gstbin.c, gstclock.c, gstconnection.c,
++ gstconnection.h, gstelement.c, gstelement.h, gstfilter.c,
++ gstfilter.h, gstpipeline.c, gstsink.c, gstsink.h, gstsrc.c,
++ gstsrc.h, gsttee.c, gsttee.h, elements/gstasyncdisksrc.c,
++ elements/gstasyncdisksrc.h, elements/gstaudiosink.c,
++ elements/gstaudiosink.h, elements/gstaudiosrc.c,
++ elements/gstaudiosrc.h, elements/gstdisksrc.c,
++ elements/gstdisksrc.h, elements/gstelements.c,
++ elements/gstfakesink.c, elements/gstfakesink.h,
++ elements/gstfakesrc.c, elements/gstfakesrc.h, elements/gstfdsink.c,
++ elements/gstfdsink.h, elements/gstfdsrc.c, elements/gstfdsrc.h,
++ elements/gsthttpsrc.c, elements/gsthttpsrc.h,
++ elements/gstidentity.c, elements/gstidentity.h,
++ elements/gstpipefilter.c, elements/gstpipefilter.h,
++ elements/gstqueue.c, elements/gstqueue.h, elements/gstsinesrc.c,
++ elements/gstsinesrc.h, elements/gsttypefind.c,
++ elements/gsttypefind.h: Reparented everything to GstElement,
++ removing GstSrc, GstSink, GstFilter, and GstConnection. Also fixed
++ a bug in gst_bin_iterate_func.
++
++2000-12-28 22:13 omegahacker
++
++ * gst/gstcaps.h: missed one file for copyright
++
++2000-12-28 22:12 omegahacker
++
++ * gst/: Makefile.am, cothreads.c, cothreads.h, gst.c, gst.h,
++ gst_private.h, gstarch.h, gstautoplug.c, gstautoplug.h, gstbin.c,
++ gstbin.h, gstbuffer.c, gstbuffer.h, gstbufferpool.c,
++ gstbufferpool.h, gstcaps.c, gstclock.c, gstclock.h,
++ gstconnection.c, gstconnection.h, gstcpu.c, gstcpu.h, gstdebug.h,
++ gstelement.c, gstelement.h, gstelementfactory.c, gstextratypes.c,
++ gstextratypes.h, gstfilter.c, gstfilter.h, gsti386.h, gstlog.h,
++ gstmeta.c, gstmeta.h, gstobject.c, gstobject.h, gstpad.c, gstpad.h,
++ gstpipeline.c, gstpipeline.h, gstplugin.c, gstplugin.h, gstppc.h,
++ gstprops.c, gstprops.h, gstpropsprivate.h, gstscheduler.c,
++ gstscheduler.h, gstsink.c, gstsink.h, gstsrc.c, gstsrc.h, gsttee.c,
++ gsttee.h, gstthread.c, gstthread.h, gsttrace.c, gsttrace.h,
++ gsttype.c, gsttype.h, gstutils.c, gstutils.h, gstxml.c, gstxml.h,
++ elements/gstasyncdisksrc.h, elements/gstqueue.c: Updated copyright
++ in all the libgst files. Created gst_private.h, set up all files
++ to use it.
++
++2000-12-28 21:42 wtay
++
++ * docs/gst/Makefile.am, docs/gst/gstreamer-decl.txt,
++ docs/gst/gstreamer-docs.sgml, docs/gst/gstreamer-sections.txt,
++ docs/gst/tmpl/cothreads.sgml, docs/gst/tmpl/gst.sgml,
++ docs/gst/tmpl/gstasyncdisksrc.sgml, docs/gst/tmpl/gstbin.sgml,
++ docs/gst/tmpl/gstbuffer.sgml, docs/gst/tmpl/gstdisksrc.sgml,
++ docs/gst/tmpl/gstelement.sgml, docs/gst/tmpl/gstfakesink.sgml,
++ docs/gst/tmpl/gstfakesrc.sgml, docs/gst/tmpl/gstfilter.sgml,
++ docs/gst/tmpl/gstidentity.sgml, docs/gst/tmpl/gstobject.sgml,
++ docs/gst/tmpl/gstpad.sgml, docs/gst/tmpl/gstplugin.sgml,
++ docs/gst/tmpl/gstqueue.sgml, docs/gst/tmpl/gstreamer-unused.sgml,
++ docs/gst/tmpl/gstsink.sgml, docs/gst/tmpl/gstsrc.sgml,
++ docs/gst/tmpl/gstthread.sgml, docs/gst/tmpl/gsttype.sgml,
++ docs/gst/tmpl/gsttypefind.sgml, docs/gst/tmpl/gstutils.sgml,
++ docs/gst/tmpl/gstxml.sgml, docs/gst/tmpl/videoraw.sgml,
++ gst/gstbin.c, gst/gstbin.h, gst/gstcaps.c, gst/gstcaps.h,
++ gst/gstelement.c, gst/gstelement.h, gst/gstelementfactory.c,
++ gst/gstpad.c, gst/gstpad.h, gst/gstpipeline.h, gst/gstprops.c,
++ gst/gstprops.h, gst/gstscheduler.c, gst/gstsrc.h, gst/gstthread.c,
++ gst/elements/gsttypefind.c: Updated the API docs.
++
++2000-12-28 21:12 omegahacker
++
++ * gst/gstpad.c: removed some dead pad_pull/push code
++
++2000-12-28 03:17 wtay
++
++ * plugins/mpeg1/parse/mpeg1parse.c: Remove stupid printf
++
++2000-12-28 03:00 wtay
++
++ * gst/elements/gsttypefind.c: fix a bug for multiple includes
++
++2000-12-28 02:51 wtay
++
++ * editor/Makefile.am, editor/editor.c, editor/gsteditor.h,
++ editor/gsteditorbin.c, editor/gsteditorelement.c,
++ editor/gsteditorpad.c, editor/gsteditorpalette.c,
++ editor/gsteditorpalette.h, editor/gsteditorprojectview.c,
++ editor/gsteditorproperty.c, gst/gstbin.c, gst/gstpipeline.c,
++ gst/gstscheduler.c, gst/elements/gstqueue.c,
++ gst/elements/gsttypefind.c, plugins/cdparanoia/cdparanoia.c,
++ plugins/mp3decode/Makefile.am, test/mp3tovorbis.c,
++ tests/registry.c: Pending editor changes. fixes for autoplug of
++ elementary MPEG1 video streams make sure mp3 types get compiled
++ videosink changes for xml loading
++
++2000-12-28 00:18 wtay
++
++ * gst/: gstautoplug.c, gstbin.c, gstelement.c, gstelement.h,
++ gstelementfactory.c, gstpad.c, gstpad.h, gstpipeline.c,
++ gstplugin.c, gstscheduler.c, gsttype.c, elements/gstfakesrc.c,
++ elements/gstfakesrc.h: Fixes for the new scheduler. Autoplug works
++ again with mp3/mpeg1/ogg
++
++2000-12-27 23:42 omegahacker
++
++ * gst/: gstbin.c, gstbin.h, gstscheduler.c: Added some cleanup, so
++ create_plan can be called multiple times.
++
++2000-12-27 22:49 wtay
++
++ * plugins/vorbis/Makefile.am: Added libvorbisenc too
++
++2000-12-27 22:39 wtay
++
++ * test/: Makefile.am, ac3parse.c, avi2mpg.c, aviparse.c, dvdcat.c,
++ mp1parse.c, mp1tomp1.c, mp2toavi.c, mp2tomp1.c, mp3.c, mp3parse.c,
++ mp3play.c, mp3tovorbis.c, mpeg2parse.c, pipetest.c, record.c,
++ spectrum.c, vidcapture.c, vidcapture2.c, videotest.c, wave.c,
++ xml/createreg.c, xml/readreg.c: Updates for the gst_pad_push
++ changes
++
++2000-12-27 20:41 wtay
++
++ * plugins/vorbis/: vorbisdec.c, vorbisenc.c, vorbisenc.h: Updated
++ vorbis encoder/decoder to latest CVS version
++
++2000-12-27 04:16 wtay
++
++ * gst/elements/: gstfakesrc.c, gstfakesrc.h: Added loop_based
++ option Added multiple pad output
++
++2000-12-27 03:13 omegahacker
++
++ * gst/: Makefile.am, cothreads.c, gstpipeline.c, gstthread.c,
++ elements/Makefile.am, types/Makefile.am: Mostly minor little
++ changes, but two interesting things:
++
++ 1) removed a pthread_join from the gst_thread_main_loop. commented
++ out because the thread isn't supposed to run pthread_join, the main
++ process is.
++
++ 2) Fixed a major bug with cothreads in threads. Had to add
++ MAP_FIXED to the mmap() of the cothread stack. Presumably the
++ gilbc that ships with redhat 7.0 now places these mmap requests
++ somewhat randomly. Since they *must* be exactly where we expect
++ them, it was failing. MAP_FIXED forces it to put it where we say.
++
++2000-12-27 00:46 omegahacker
++
++ * gst/: gstbin.c, gstbin.h, gstscheduler.c: Added code to attempt
++ the scheduling of chained cases. Very simply right now. Also
++ added code to allow the use_cothread flag of a bin to force all the
++ chains to use cothreads as well.
++
++2000-12-27 00:01 omegahacker
++
++ * tests/: Makefile.am, case4.c: added case4
++
++2000-12-26 23:51 omegahacker
++
++ * gst/: Makefile.am, gstbin.c, gstbin.h, gstdebug.h, gstelement.h,
++ gstscheduler.c, gstscheduler.h, gstthread.c,
++ elements/gstidentity.c, elements/gstqueue.c, elements/gstqueue.h:
++ More massive changes to the scheduling system. Moved the
++ scheduling code to gstscheduler.[ch], so an child bin can replace
++ the scheduler. Introduced the concept of chains, which are subsets
++ of the list of managed elements for a given manager bin, which get
++ scheduled as separate entities. gst_bin_iterate_func should be
++ pretty much fixed now, the scheduling code gets to do all the hard
++ work.
++
++ Cothreaded case work in the couple tests I've tried, chained is
++ next.
++
++2000-12-26 20:49 omegahacker
++
++ * gst/gstthread.c: Changed "bin" to "thread" in get_thread_new.
++
++2000-12-26 20:24 wtay
++
++ * docs/random/usecases: This file will contain several use cases to
++ reason through
++
++2000-12-25 01:33 wtay
++
++ * editor/editor.glade, editor/editor.ts, editor/gsteditor.c,
++ editor/gsteditor.h, editor/gsteditorbin.c,
++ editor/gsteditorcanvas.c, editor/gsteditorconnection.c,
++ editor/gsteditorconnection.h, editor/gsteditorcreate.c,
++ editor/gsteditorcreate.h, editor/gsteditorelement.c,
++ editor/gsteditorpad.c, editor/gsteditorproject.c,
++ editor/gsteditorproject.h, editor/gsteditorprojectview.c,
++ editor/gsteditorproperty.c, editor/gsteditorproperty.h,
++ gst/gstbin.h, gst/gstelement.h, gst/gstutils.c, gst/gstutils.h,
++ gst/gstxml.c, gst/elements/gstaudiosink.c: Lots of editor changes:
++ - restucturing of object creation - loading of xml files - visual
++ eye candy: color changes on mouseover - active object is indicated
++ - property box changes for boolean and enum types - property box:
++ create properties per element - show pads/caps in propertybox
++ added gst_util_get_bool_arg in gstutils.c added default properties
++ for audiosink
++
++2000-12-23 03:17 wtay
++
++ * gst/: gstbin.c, gstelement.c, gstelement.h, gstelementfactory.c,
++ gstpipeline.c, gstthread.c, elements/gstasyncdisksrc.c,
++ elements/gstdisksrc.c, elements/gstfakesrc.c,
++ elements/gstidentity.c: Added handoff signals to fakesrc and
++ fakesink Added scheduling property to identity Added
++ GST_STATE_TRANSITION macro to check for state changes. Modified
++ gstbin and gstthread to the new state change macros
++
++2000-12-22 23:23 wtay
++
++ * gst/gstbin.c, gst/gstelementfactory.c, gst/gstpad.c,
++ gst/gstpipeline.c, gst/gstthread.c, gst/elements/gstfakesrc.c,
++ gst/elements/gstfakesrc.h, tests/sched/runxml.c,
++ tests/sched/cases/(fs-i-i-fs).xml: Fixed a bug in gstbin.c the
++ manager was not detected. Some other testcases bin, thread,
++ pipeline use the elementfactory on gst_*_new
++
++2000-12-22 16:14 wtay
++
++ * gst/gstautoplug.c, gst/gstautoplug.h, gst/gstpipeline.c,
++ gst/gstxml.c, gst/elements/gstfakesink.c,
++ gst/elements/gstfakesink.h, gst/elements/gstidentity.c,
++ gst/elements/gstidentity.h, gstplay/main.c, tests/sched/Makefile,
++ tests/sched/runtestcases, tests/sched/runxml.c,
++ tests/sched/testcases, tests/sched/cases/(fs-fs).xml,
++ tests/sched/cases/(fs-i-fs).xml, tests/sched/cases/(fs-i-i-fs).xml,
++ tests/sched/cases/(fs-i-q[i-fs]).xml: Implemented some test
++ cases... they all fail :-( Added a flag to identity to for
++ loop_based behaviour. Added a signal to fakesink when a buffer is
++ consumed.
++
++2000-12-21 20:21 wtay
++
++ * tests/sched/testcases: More testcases
++
++2000-12-21 19:53 wtay
++
++ * tests/: autoplug.c, sched/testcases: 70+ testcases to start with
++
++2000-12-21 07:10 omegahacker
++
++ * gst/gstbin.c: Some fixes to the non-chained case, it works in a
++ very basic way. More use cases will hopefully provide some sanity.
++
++2000-12-21 01:27 omegahacker
++
++ * gst/elements/gstqueue.c: Fixing two bugs:
++
++ 1) I had commented out an unlock. duh. 2) changed the _get
++ function to return the buffer rather than call _push
++
++ Also uncommented some debugging I'd turned off. Need to solve the
++ verbosity problem somehow, I think by way of debug levels as well
++ as info levels...
++
++2000-12-20 09:39 omegahacker
++
++ * gst/: gstbin.c, gstbin.h, gstelement.c, gstelement.h, gstpad.h,
++ gstpipeline.c, gstthread.c, elements/gstasyncdisksrc.c,
++ elements/gstaudiosrc.c, elements/gstdisksrc.c,
++ elements/gstfakesrc.c, elements/gstfakesrc.h, elements/gstfdsrc.c,
++ elements/gsthttpsrc.c, elements/gstqueue.c, elements/gstsinesrc.c:
++ Massive scheduling changes (again). Not entirely complete, but
++ getting closer. Need to think about various scheduling plans that
++ we might want to produce, and figure out the rules for what is
++ legal, and how to get the results we need as far as the plan.
++
++2000-12-20 00:55 wtay
++
++ * docs/random/autoplug1: Added explanation for current autoplugging
++
++2000-12-19 16:38 wtay
++
++ * tests/: .cvsignore, props.c: Small test program for the property
++ system
++
++2000-12-19 16:36 wtay
++
++ * gst/gstcaps.c, gst/gstcaps.h, gst/gstprops.c, gst/gstprops.h,
++ plugins/mpeg1/mpegtypes/mpeg1types.c, tests/Makefile.am: Added API
++ to dynamically create GstCaps and GstProps Changed typefind of
++ mpeg1 to set the GstProps. autoplugging now works again for mpeg1,
++ whoohoo!
++
++2000-12-19 13:44 wtay
++
++ * docs/random/plugins.dia, editor/editor.dia, gst/gstautoplug.c,
++ gst/gstautoplug.h, tests/autoplug.c: Added the autoplugger. some
++ .dia drawings of the objects the autoplug test program.
++
++2000-12-19 13:41 wtay
++
++ * gst/Makefile.am, gst/gst.c, gst/gstbin.c, gst/gstcaps.c,
++ gst/gstelement.h, gst/gstelementfactory.c, gst/gstpipeline.c,
++ gst/gstplugin.c, gst/gstprops.c, gst/gstthread.c, gst/gsttype.c,
++ gst/gsttype.h, plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1video/parse/mp1videoparse.c, tests/Makefile.am,
++ tests/registry.c: Cleanup in gsttypes.c: removed the crazy GList
++ of GHashTables, since the autoplugger will use the GstCaps and
++ elementfactories instead of the type system. We don't maintain a
++ list anymore of the elements for the specific removed unused
++ code in XML loading/saving.
++
++ Cleanup in gstelementfactory: removed the register/unregister
++ methods, register is now implicit when gst_elementfactory_new is
++ called. _unregister is now _destroy. Removed logic to
++ register/unregister the types in gsttypes. added methods to
++ query if the factory can src/sink a GstCaps Make sure the
++ elementfactory is set in the element_class when a new element is
++ registered with gst_elementfactory_new.
++
++ gst.c: properly register the basic bins gst_pipeline: use new
++ gstautoplug (next checkin) gstprops: fixed an error in
++ compatibility check registry test program changes plugins: misc
++ changes for the new caps system.
++
++2000-12-19 05:48 omegahacker
++
++ * plugins/cdparanoia/cdparanoia.c: safety issue: turned off the
++ code the requires a patch to cdparanoia to avoid a segfault
++
++2000-12-17 16:24 wtay
++
++ * gst/gstbin.c, gst/gstcaps.c, gst/gstpad.c, gst/gstpipeline.c,
++ gst/gstprops.c, gst/gsttype.c, gst/gsttype.h,
++ gst/elements/gsttypefind.c, gst/elements/gsttypefind.h,
++ plugins/avi/gstavidecoder.c, plugins/avi/gstaviencoder.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3decode/types/mp3types.c,
++ plugins/mpeg1/mpegtypes/mpeg1types.c,
++ plugins/mpeg2/mpegtypes/mpeg2types.c, plugins/vorbis/vorbis.c: The
++ typefind function now returns a GstCaps structure instead of a
++ gboolean. modified some plugins to this new behaviour Fixed
++ autoplugging for the mpg123 case. When an element is selected in
++ autoplugging and the caps do not match, another element is selected
++ until the caps match. only examples/autoplug works because
++ gstmediaplay uses a threaded setup that does not seem to work with
++ the current scheduling.
++
++2000-12-17 06:26 omegahacker
++
++ * docs/code-reviews/: README, gstbin.c-1.41: README and the
++ beginning of the first code-review. Here's the README:
++
++ Code reviews: =============
++
++ Files are to be named by file or subsystem, and CVS revision number
++ or date:
++
++ gstbin.c-1.41 editor-20001216
++
++ A file should look something like the following:
++
++ -------------------------------------------------------------------
++ --- Code Review =========== File: gst/gstbin.c Revision: 1.41 Date:
++ Dec 16, 2000 Reviewer: Erik Walthinsen <omega@cse.ogi.edu>
++
++ ----- Line 20: #define GST_DEBUG_ENABLED
++
++ Shouldn't be here, DEBUG should be enabled globally. May leave
++ until scheduling changes are done.
++
++ ----- Line 117: (gst_bin_class_init)
++ gstelement_class->elementfactory =
++ gst_elementfactory_find("bin");
++
++ Not sure this is such a great idea. I thought the GstElement code
++ did this kind of stuff?
++
++ -------------------------------------------------------------------
++ ---
++
++ The format will evolve as we do more stuff, such as putting in
++ fields for recommended actions, comments regarding any later
++ changes made and when, etc.
++
++2000-12-17 04:54 omegahacker
++
++ * gst/gstbin.c, gst/gstbuffer.h, gst/gstdebug.h,
++ gst/elements/gsttypefind.c, tools/gstreamer-register.c: Some minor
++ compilation fixes...
++
++2000-12-16 17:12 wtay
++
++ * editor/editor.c, editor/editor.glade, editor/editor.ts,
++ editor/gsteditor.c, editor/gsteditorbin.c,
++ editor/gsteditorelement.c, editor/gsteditorproject.c,
++ editor/gsteditorproject.h, editor/gsteditorprojectview.c,
++ gst/gstbin.c, gst/gstbuffer.h, gst/gstdebug.h, gst/gstpad.c,
++ gst/gstprops.c, gst/gstthread.c, gst/gstxml.c, gst/gstxml.h,
++ tests/registry.c: some editor changes= loading of save pipelines
++ (not working) added include in gstdebug.h for getpid property
++ loading implemented GstXML can now be queried for the toplevel
++ elements.
++
++2000-12-16 10:18 omegahacker
++
++ * docs/random/sources, examples/autoplug/Makefile,
++ examples/helloworld/Makefile, examples/queue4/Makefile,
++ examples/xml/Makefile, gst/gst.c, gst/gstbin.c, gst/gstbuffer.h,
++ gst/gstdebug.h, gst/gstpad.c, gst/gstpad.h, gst/gstpipeline.c,
++ gst/gstthread.c, gst/elements/gstasyncdisksrc.c,
++ gst/elements/gstaudiosrc.c, gst/elements/gstdisksrc.c,
++ gst/elements/gstfakesink.c, gst/elements/gstfakesrc.c,
++ gst/elements/gstfdsrc.c, gst/elements/gsthttpsrc.c,
++ gst/elements/gstidentity.c, gst/elements/gstqueue.c,
++ gst/elements/gstsinesrc.c, plugins/cdparanoia/cdparanoia.c,
++ plugins/cdparanoia/cdparanoia.h, plugins/cobin/spindentity.c,
++ plugins/mp3encode/lame/gstlame.c, plugins/mp3encode/lame/gstlame.h,
++ tests/Makefile.am, tests/mp3encode.c, tests/pad-active.c,
++ tests/paranoia.c, tests/queue.c, tests/rip.c, tests/simplefake.c,
++ tests/states.c: WARNING: Don't grab this updated unless you're
++ really, REALLY sure. WARNING: Wait for the next one.
++
++ Whole lotta changes here, including a few random bits:
++
++ examples/*/Makefile: updated to use `libtool gcc`, not just `gcc`
++ gst/ gstbuffer.h: updated to new flag style gst.c, gstdebug.h:
++ added new debugging for function ptrs gstpipeline.c: set type of
++ parent_class to the class, not the object gstthread.c: ditto
++ plugins/ cdparanoia/cdparanoia.c: added an argument type, updated
++ some defaults cobin/spindentity.c: updated to new do/while
++ loopfunction style mp3encode/lame/gstlame.c: argument types,
++ whole lotta lame options tests/: various changes
++
++ Now, for the big changes: Once again, the scheduling system has
++ changed. And once again, it broke a whole bunch of things. The
++ gist of the change is that there is now a function pointer for
++ gst_pad_push and gst_pad_pull, instead of a hard-wired function.
++ Well, currently they are functions, but that's for debugging
++ purposes only, they just call the function pointer after spewing
++ lots of DEBUG().
++
++ This changed the GstPad structure a bit, and the GstPad API as
++ well. Where elements used to provide chain() and pull() functions,
++ they provide chain() and get() functions.
++ gst_pad_set_pull[region]_function has been changed to
++ get_pad_set_get[region]_function. This means all the elements out
++ there that used to have pull functions need to be updated. The
++ calls to that function have been changed in the normal elements,
++ but the names of the functions passed is still _pull[region](),
++ which is an aesthetic issue more than anything.
++
++ As for what doesn't work yet, just about anything dealing with
++ Connections is hosed, meaning threaded stuff won't work. This will
++ be fixed about 12 hours from now, after I've slept, etc. The
++ simplefake.c test works in both cothreaded and chained cases, but
++ not much else will work due to the Connection problem. Needless to
++ say, don't grab this unless you *need* these features *now*, else
++ wait to update this stuff until tomorrow.
++
++ I'm going to sleep now.
++
++2000-12-15 16:43 wtay
++
++ * examples/queue/queue.c, examples/queue2/queue2.c, gst/gstbin.c,
++ gst/gstcaps.c, gst/gstpipeline.c, gst/gstplugin.c, gst/gsttype.c,
++ gst/elements/gsttypefind.c, plugins/mpeg1/mpegtypes/mpeg1types.c,
++ plugins/mpeg2/mpegtypes/mpeg2types.c, plugins/vorbis/vorbis.c: Move
++ a step closer to autoplugging. The element selection in the
++ pipeline works. Slight modification to the typefind function
++ handling. removed the stupid mime types in the mpeg decoders.
++ Adjust videosink for the new caps handling. Modified the queue
++ example to show an error in plan creation; Erik can you solve this?
++ This is the type of pipelines autoplugging uses.
++
++2000-12-15 01:57 wtay
++
++ * gst/Makefile.am, gst/cothreads.c, gst/cothreads.h, gst/gst.c,
++ gst/gst.h, gst/gstarch.h, gst/gstbin.c, gst/gstbin.h,
++ gst/gstbuffer.c, gst/gstbuffer.h, gst/gstbufferpool.c,
++ gst/gstbufferpool.h, gst/gstcaps.c, gst/gstcaps.h, gst/gstclock.c,
++ gst/gstclock.h, gst/gstconnection.c, gst/gstcpu.c, gst/gstcpu.h,
++ gst/gstdebug.h, gst/gstelement.c, gst/gstelement.h,
++ gst/gstelementfactory.c, gst/gstextratypes.c, gst/gstextratypes.h,
++ gst/gstfilter.c, gst/gstfilter.h, gst/gstmeta.c, gst/gstmeta.h,
++ gst/gstobject.c, gst/gstobject.h, gst/gstpad.c, gst/gstpad.h,
++ gst/gstpipeline.c, gst/gstpipeline.h, gst/gstplugin.c,
++ gst/gstplugin.h, gst/gstprops.c, gst/gstprops.h, gst/gstsink.c,
++ gst/gstsink.h, gst/gstsrc.c, gst/gstsrc.h, gst/gsttee.c,
++ gst/gstthread.c, gst/gstthread.h, gst/gsttrace.c, gst/gsttrace.h,
++ gst/gsttype.c, gst/gstutils.c, gst/gstxml.c, gst/gstxml.h,
++ gst/elements/gstasyncdisksrc.c, gst/elements/gstasyncdisksrc.h,
++ gst/elements/gstaudiosink.h, gst/elements/gstaudiosrc.h,
++ gst/elements/gstdisksrc.h, gst/elements/gstelements.c,
++ gst/elements/gsthttpsrc.h, gst/elements/gstpipefilter.h,
++ gst/types/gsttypes.c, gstplay/gstmediaplay.c,
++ plugins/capture/v4l/gstv4lsrc.c, plugins/capture/v4l/gstv4lsrc.h,
++ plugins/cdparanoia/cdparanoia.h, plugins/dvdsrc/dvdsrc.c,
++ plugins/dvdsrc/dvdsrc.h, plugins/mp3decode/mpg123/gstmpg123.h,
++ plugins/mp3encode/lame/gstlame.h,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c,
++ plugins/mpeg2/mpeg2dec/idct.c, plugins/vcdsrc/vcdsrc.h,
++ plugins/vorbis/vorbis.c, tests/.cvsignore, tests/rip.c,
++ tools/gstreamer-register.c: Header cleanup: try to include as
++ little as possible; this will probably speed up compilation a bit.
++ changed the .c files to use #include "..." Fix for the 'plugins are
++ loaded twice' bug. Fix 22186: GstObject flags are now used
++ everywhere. Added *_FLAG_LAST so elements do not use the same
++ flags. Added some padding in the flag enum for future expansion.
++
++2000-12-14 17:21 wtay
++
++ * gst/gstpad.c, gst/gstplugin.c, plugins/cdparanoia/cdparanoia.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg2/ac3dec/ac3dec.c, plugins/mpeg2/ac3parse/ac3parse.c,
++ plugins/vorbis/vorbis.c, plugins/vorbis/vorbisdec.c,
++ plugins/vorbis/vorbisenc.c: Some plugins are adjusted to the new
++ pad template mechanisms.
++
++2000-12-14 12:30 wtay
++
++ * plugins/mp3encode/lame/gstlame.c: Fixed a memory leak
++
++2000-12-13 21:42 omegahacker
++
++ * docs/random/TODO-post-0.1.0: First few TODO items to be done
++ after 0.1.0 (i.e. in 2001)
++
++2000-12-13 19:35 wtay
++
++ * plugins/mp3encode/lame/gstlame.c: Update to the lame encoder
++
++2000-12-13 19:29 wtay
++
++ * docs/gst/gstreamer-decl.txt, docs/gst/gstreamer-sections.txt,
++ docs/gst/tmpl/gstconnection.sgml, docs/gst/tmpl/gstelement.sgml,
++ docs/gst/tmpl/gstpad.sgml, docs/gst/tmpl/gstreamer-unused.sgml,
++ docs/gst/tmpl/gstsrc.sgml, docs/gst/tmpl/gsttype.sgml,
++ gst/gstcaps.c, gst/gstcaps.h, gst/gstelement.h,
++ gst/gstelementfactory.c, gst/gstpad.c, gst/gstpad.h, gst/gsttype.c,
++ gst/elements/gstaudiosink.c, gst/elements/gsthttpsrc.c,
++ plugins/cdparanoia/cdparanoia.c,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/parse/mp3parse.c: Changed the GstPadFactory and
++ added the GstPadTemplate.
++
++ The GstPadFactory is an easy way to define a pad with capabilities.
++ The GstPadFactory is converted into a GstPadTemplate. The template
++ is used to create new pads and to expose the possible pads used in
++ an element to the plugin system.
++
++ updated mp3parse, mpg123, cdparanoia to the new API. Rerun
++ gstreamer-register because the XML definition has changed.
++
++2000-12-12 19:31 wtay
++
++ * docs/random/plugins: Added a document about how we handle plugins
++ and dynamic loading.
++
++2000-12-12 19:29 wtay
++
++ * gst/gstcaps.c, gst/gstcaps.h, gst/gstelement.h,
++ gst/gstelementfactory.c, gst/gstpad.c, gst/gstpad.h,
++ gst/gstpipeline.c, gst/gsttype.c, plugins/au/gstparseau.c,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/parse/mp3parse.c, tests/.cvsignore, tests/caps.c,
++ tests/registry.c: More Caps changes, this change introduces the
++ padfactory. the GstPadFactory will be used to describe the pads
++ that an element will contain during its lifetime. mpg123 and
++ mp3parse serve as an example. More XML changes to incorporate the
++ padfactories.
++
++2000-12-12 09:40 omegahacker
++
++ * configure.in, plugins/Makefile.am, plugins/mp3encode/Makefile.am,
++ tests/Makefile.am, gst/gstbin.c, gst/gstplugin.c,
++ gst/elements/gstfdsink.c, plugins/mp3encode/lame/Makefile.am,
++ plugins/mp3encode/lame/gstlame.c, plugins/mp3encode/lame/gstlame.h,
++ tests/rip.c: Added LAME encoder. Wow.
++
++2000-12-12 06:49 omegahacker
++
++ * configure.in, editor/gstelementselect.c, plugins/Makefile.am,
++ plugins/cdparanoia/Makefile.am, plugins/cdparanoia/cdparanoia.c,
++ plugins/cdparanoia/cdparanoia.h, tests/Makefile.am,
++ tests/paranoia.c: Brand new source, the cdparanoia source. Reads
++ audio data from a CD, writes out raw audio. The tests/paranoia.c
++ program will simply hook this up to a sound card. It works
++ perfectly.
++
++ Next step is to flesh out the rest of the element, including pad
++ caps, better seek and playout control, signals, and whatever else
++ comes up.
++
++ A minor patch to the editor is included here, the GstElementFactory
++ details struct has a name change from 'class' to 'klass' that
++ wasn't reflected in the elementselect widget. Fixd.
++
++2000-12-11 00:25 omegahacker
++
++ * tests/queue.c: Updated to latest code for testing scheduling.
++
++2000-12-11 00:24 omegahacker
++
++ * gst/: gstbin.c, gstdebug.h, gstelement.c, gstpad.c,
++ elements/gstqueue.c: Implemented the hybrid scheduling system for
++ sources and connections outside the current Bin. Is a bit hackish
++ in one place, but I'll work out a way to make that cleaner soon.
++ queue.c in tests now works nicely in all cases. More to come
++ later.
++
++2000-12-11 00:06 wtay
++
++ * tests/registry.c: Test program to check the registry handling
++
++2000-12-11 00:04 wtay
++
++ * gst/Makefile.am, gst/gstbin.c, gst/gstcaps.c, gst/gstcaps.h,
++ gst/gstelement.h, gst/gstelementfactory.c, gst/gstpad.c,
++ gst/gstpad.h, gst/gstpipeline.c, gst/gstplugin.c, gst/gstplugin.h,
++ gst/gstprops.c, gst/gstprops.h, gst/gsttype.c, gst/gsttype.h,
++ gst/elements/gstaudiosink.c, gst/elements/gsttypefind.c,
++ gstplay/main.c, plugins/au/gstparseau.c,
++ plugins/avi/gstavidecoder.c, plugins/avi/gstaviencoder.c,
++ plugins/avi/wincodec/gstwincodec.c,
++ plugins/capture/v4l/gstv4lsrc.c, plugins/effects/stereo/stereo.c,
++ plugins/effects/volume/volume.c, plugins/filters/median/median.c,
++ plugins/filters/smooth/smooth.c, plugins/jpeg/gstjpeg.c,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/mpg123/gstmpg123.h,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3decode/xing/gstxing.c,
++ plugins/mpeg1/mpeg1encoder/gstmpeg1encoder.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.c,
++ plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg2/ac3dec/ac3dec.c, plugins/mpeg2/ac3parse/ac3parse.c,
++ plugins/mpeg2/mpeg2dec/decode.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.h,
++ plugins/mpeg2/mpeg2dec/header.c, plugins/mpeg2/mpeg2dec/idct.c,
++ plugins/mpeg2/mpeg2dec/idct_mmx.c,
++ plugins/mpeg2/mpeg2dec/motion_comp.c,
++ plugins/mpeg2/mpeg2dec/motion_comp_mmx.c,
++ plugins/mpeg2/mpeg2dec/motion_comp_sse.s,
++ plugins/mpeg2/mpeg2dec/mpeg2.h,
++ plugins/mpeg2/mpeg2dec/mpeg2_internal.h,
++ plugins/mpeg2/mpeg2dec/perftest.c, plugins/mpeg2/mpeg2dec/slice.c,
++ plugins/mpeg2/mpeg2dec/vlc.h, plugins/mpeg2/mpeg2enc/gstmpeg2enc.c,
++ plugins/mpeg2/parse/mpeg2parse.c,
++ plugins/mpeg2/subtitles/mpeg2subt.c,
++ plugins/mpeg2/video/gstmpeg2play.c,
++ plugins/mpeg2/videoparse/mp2videoparse.c, plugins/rtjpeg/rtjpeg.c,
++ plugins/vcdsrc/vcdsrc.c, plugins/videoscale/videoscale.c,
++ plugins/visualization/smoothwave/smoothwave.c,
++ plugins/visualization/spectrum/gstspectrum.c,
++ plugins/visualization/synaesthesia/synaesthesia.c,
++ plugins/visualization/vumeter/vumeter.c, plugins/vorbis/vorbis.c,
++ plugins/wav/gstparsewav.c, tests/Makefile.am, tests/caps.c,
++ tests/queue.c: First attempt at rebuilding the type/plugin system
++ - make sure caps/props are saved in the registry autoplugging is
++ completely broken. removed the typefactories and typeids from all
++ the pads in the plugins XML load/save is ok (be sure to rerun
++ gstreamer-register)
++
++2000-12-09 09:13 omegahacker
++
++ * gst/: gstbin.c, gstbin.h, gstelement.c, gstpad.h: Snapshot of
++ work-in-progress do deal with out-of-bin elements. Current system
++ is very likely going to be ditched due to its complexity and the
++ fact that it doesn't work right now. More than that, it's
++ generating some really odd results in my test program, which aren't
++ readily explainable.
++
++ If you want to keep a working copy of your working copy (heh),
++ don't update until this is replaced with a hybrid approach. This
++ approach will be the beginning of a plan generator that can
++ construct full hybrid schedules given hints from various places.
++
++ Hybrid means that cothreads are used, but there are chunks of the
++ pipeline that are actually dealt with by chaining. This can improve
++ speed by reducing cothread switches (which are much cheaper than
++ thread switches, but still far from free, about 570 cycles on my
++ PIII), but does carry a complexity burden. Luckily, the structure
++ of GStreamer allows that burden to live entirely in create_plan.
++ Luck? I think not ;-)
++
++2000-12-08 23:38 omegahacker
++
++ * gst/: gstbin.c, gstthread.c: Mostly debugging changes. What's in
++ CVS seems to work rather well, actually.
++
++ Next is the work on task 23098...
++
++2000-12-08 20:31 omegahacker
++
++ * tests/: Makefile.am, queue.c: Test program for simple queue
++ operations. Good for testing thread/cothread interations.
++
++2000-12-08 18:24 wtay
++
++ * gst/: gstbin.c, gstdebug.h, gstpad.c, gstpad.h: Added pullregion
++ in again, it got removed with the previous commit.
++
++2000-12-08 10:33 omegahacker
++
++ * gst/: gstbin.c, gstconnection.c, gstconnection.h, gstdebug.h,
++ gstelement.c, gstpad.c, elements/gstqueue.c: Another big set of
++ changes. Connections are now also pullfunc based. gstqueue has
++ been updated, I don't know of any other connections offhand.
++
++ There are still a few things that need doing, specifically the
++ concept of a source or connection with connections to multiple
++ thread contexts is not dealt with. This may force us to move the
++ threadstate from the element to the pad, maybe keeping the
++ element's copy for simple cases. Then the Bin would create a
++ structure to pass to the cothreaded _wrappers of any such elements,
++ which would detail the pads that are to be dealt with by this
++ particular cothread context.
++
++ That will speed things up to, since we don't have to look through
++ the list of all pads for every Src or Connection element for every
++ iteration, we can simply step through the list provided by the
++ plan. Special case might even have a single pad pointer sitting
++ there to trump the list, if there's only one (the common case
++ anyway).
++
++ Task 23098 is tracking these changes. The main task 22588 depends
++ on that subtask, as well as 22240, which is a consistency check on
++ PAD_DISABLED.
++
++2000-12-07 18:38 wtay
++
++ * tests/: .cvsignore, Makefile.am, caps.c: Updated the test program
++
++2000-12-07 18:37 wtay
++
++ * gst/: Makefile.am, gst.h, gstcaps.c, gstcaps.h, gstcapsprivate.h,
++ gstprops.c, gstprops.h, gstpropsprivate.h: separated the properties
++ from the capabilities as we might use the properties for metadata
++ too.
++
++2000-12-06 23:04 wtay
++
++ * gst/: gstbin.c, gstcaps.c, gstcaps.h, gstpad.c,
++ elements/gstasyncdisksrc.c: Added pulregion handling. Added
++ GstCapsListFactory in headers
++
++2000-12-05 18:08 wtay
++
++ * gst/: Makefile.am, gstbin.c, gstpad.c, gstpipeline.c,
++ elements/gstasyncdisksrc.c: Fixed autoplugging.
++
++2000-12-04 19:24 wtay
++
++ * docs/random/caps: Added some capability options
++
++2000-12-04 10:52 omegahacker
++
++ * gst/: gstbin.c, gstelement.h, gstpad.c, gstpad.h, gstpipeline.c,
++ gstsrc.c, gstsrc.h, elements/gstasyncdisksrc.c,
++ elements/gstaudiosrc.c, elements/gstdisksrc.c,
++ elements/gstfakesrc.c, elements/gstfdsrc.c, elements/gsthttpsrc.c,
++ elements/gstsinesrc.c: Changed the way things are scheduled,
++ especially sources. A Src used to have a push() function, and
++ optionally a pushregion() to deal with async reads, etc. That
++ whole thing has gone away, in favor of providing a pull() function
++ for the output (Src) pad instead, ala chain functions. This makes
++ constructing cothreaded schedules out of non-loop elements somewhat
++ easier. Basically there was always a question as to which pad was
++ being dealt with. In the pullregion case, cothread-specific data
++ was used to try to pass the region struct to the right place, which
++ is a slow hack. And in general, the push function severely limited
++ the kind of tricks that could be played when there's more than one
++ output pad, such as a multi-out file reader with async capabilities
++ on each pad independently.
++
++ This changes the way cothread scheduling occurs. Instead of the
++ hack to deal with Src's by calling their push() function (or
++ optionally the pushregion(), in certain cases), we now are working
++ towards a general mechanism where pads are the only thing that are
++ dealt with directly.
++
++ An optimization was made in the process of doing this: the
++ loopfunction actually run as the outer [stack] frame of the
++ cothread is now set more intelligently in create_plan() based on
++ what kind of element it is. We now have:
++
++ loopfunc_wrapper: used for loop-based elements, it simply calls the
++ loopfunc in a loop, paying attention to COTHREAD_STOPPING (see
++ below). It currently does other, soon to be depracated, stuff.
++
++ pullsrc_wrapper: wraps a Src that's not loop-based (since your
++ options are now loop- or pull-based)
++
++ There will be a couple more to deal with other cases, such as
++ Connections and chain-based elements. The general idea is that
++ it's a lot more efficient to make the decisions once in create_plan
++ than to keep doing this huge if/else chain in the wrapper. Just
++ choose the right wrapper up front. It'll be most apparent
++ performance-wise in the case of whichever element context is
++ switched to first for each iteration, since the whole wrapper setup
++ is done for every iteration.
++
++ The tricky part is that there is now a bit of overloading of the
++ function pointers in a pad. The current meanings (possibly to
++ change a bit more soon) are:
++
++ chainfunc: as always, chainfunc pointer is mirrored between peer
++ pads (this may change, and the chain func may end up in
++ pushfunc) pushfunc: SrcPad: gst_pad_pushfunc_proxy, cothread_switch
++ to peer SinkPad: none (may take over chainfunc, see
++ below) pullfunc: SrcPad: Src or Connection's function to construct
++ buffers SinkPad: gst_pad_pullfunc_proxy, cothread_switch
++ to peer
++
++ There are a number of issues remaining with the scheduling, not the
++ least of which is the fact that Connections are still dealt with
++ the old way, with _push() functions and such. I'm trying to figure
++ out a way to unify the system so it makes sense. Following the
++ scheduling system is hard enough, trying to change it is murder.
++
++ Another useful scheduling addition, mentioned above, is
++ COTHREAD_STOPPING. It's an element flag that's used to signal
++ whatever code is running in cothread context that it should be
++ finishing up and exiting soon. An example of this is in
++ plugins/cobin/spindentity.c. All the loops should now be composed
++ of do/while loops, rather than while(1) loops:
++
++ do {
++ buf = gst_pad_pull(spindentity->sinkpad);
++ gst_pad_push(spindentity->srcpad,buf);
++ } while (!GST_ELEMENT_IS_COTHREAD_STOPPING(element));
++
++ The reason for this is that COTHREAD_STOPPING may be set before the
++ above loop ever gets started. It wouldn't do for the body of the
++ loop to never once get called, that would simply stall the
++ pipeline. Note that only the core library code is ever responsible
++ for setting and unsetting this flag. All elements have to do is
++ respond to it by cleanly exiting the loop and the function holding
++ it.
++
++ This is needed primarily to allow iterations to occur properly.
++ Basically, there's a single entry point in the cothread scheduling
++ loop, gst_bin_iterate_func() simply switches to this cothread. If
++ the element in this context is allowed to loop infinitely, nothing
++ would even switch back to the context from which the iterate() was
++ originally called. This is a bit of a problem. The solution is
++ for there to be an implicit switch back to the originating context.
++ Now, even I'm not sure exactly how this works, but if the cothread
++ that's switched to actually returns, execution returns back to the
++ calling context, i.e. iterate_func().
++
++ COTHREAD_STOPPING is therefore set just before switching into this
++ (currently randomly chosen) context, on the assumption that it will
++ return promptly after finishing its duties. The burden of clearing
++ the flag falls to the various wrapper functions provided by the Bin
++ code, thus element writers don't have to worry about doing that at
++ all (and simply shouldn't).
++
++ Related changes: All the sources in elements/ have been changed to
++ reflect the new system.
++
++ FIXMEs: 1) gstpipeline.c calls gst_src_push at some point, dunno
++ why, it's commented out now. 2) any other sources, including
++ vcdsrc, dvdsrc, and v4lsrc will break badly and need to be modified
++ to work as pull-based sources.
++
++2000-12-04 09:35 omegahacker
++
++ * acconfig.h, configure.in, gst/Makefile.am, gst/cothreads.c,
++ gst/gst.h, gst/gstbuffer.c, gst/gstdebug.h: Changes made to the
++ DEBUG system. New header file gstdebug.h holds the stuff to keep
++ it out of gst.h's hair. DEBUG prints out the process id, cothread
++ id, source filename and line number. Two new macros DEBUG_ENTER
++ and DEBUG_LEAVE are used to show the entry and exit of a given
++ function. This eventually might be used to construct call trace
++ graphs, even taking cothreads into account. This would be quite
++ useful in visualizing the scheduling mechanism.
++
++ Minor changes to various debug messages.
++
++ Also sitting in gstdebug.h is a prototypical DEBUG_ENTER that's
++ capable of performing DEBUG_LEAVE automatically. It does this by
++ utilizing a little-known GCC extension that allows one to call a
++ function with the same parameters as the current function. The
++ macro uses this to basically call itself. A boolean is used to
++ ensure that when it calls itself it actually runs the body of the
++ function. In the meantime it prints stuff out before and after the
++ real function, as well as constructing a debugging string. This
++ can be used eventually to provide call-wide data on the DEBUG
++ lines, instead of having to replicate data on each call to DEBUG.
++ More research is needed into how this would most cleanly be fit
++ into some other chunk of code, like GStreamer (I think of this
++ DEBUG trick as a separate project, sorta).
++
++ Unfortunately, the aforementioned DEBUG trick interacts quite
++ poorly with cothreads. Almost any time it's used in a function
++ that has anything remotely to do with a cothread context (as in, it
++ runs in one), a segfault results from the __builtin_apply call,
++ which is the heart of the whole thing. If someone who really knows
++ assembly could analyze the resulting code to see what's really
++ going on, we might find a way to fix either the macro or the
++ cothreads (I'm thinking that there's something we missed in
++ constructing the cothreads themselves) so this works in all cases.
++
++ In the meantime, please insert both DEBUG_ENTER and DEBUG_LEAVE in
++ your functions. Be sure to put DEBUG_ENTER after your variable
++ declarations and before any functional code, not to put the
++ function name in any DEBUG strings (it's already there, trust me),
++ and put a DEBUG_LEAVE if you care enough.
++
++ Changes are going to happen in the way DEBUGs and other printouts
++ occur, so stay tuned.
++
++2000-12-04 09:32 omegahacker
++
++ * gst/gstplugin.c: Added a check to see if the plugin actually
++ exists before even bothering to try to load it. Saves a fair
++ amount of debugging spew with _gst_plugin_spew enabled.
++
++2000-12-04 09:14 omegahacker
++
++ * plugins/mp3decode/parse/mp3parse.c: Minor change to the
++ head_check function: DEBUG pretty much assumes there's a newline
++ (\n) at the end, things get messy otherwise. Might add a
++ DEBUG_NOPREFIX to deal with this problem later, but I think this is
++ a good cleanup anyway.
++
++2000-12-03 20:15 wtay
++
++ * tests/caps.c: More test cases.
++
++2000-12-03 20:15 wtay
++
++ * gst/: gstcaps.c, gstcaps.h: Implemented real Caps checking.
++
++2000-12-03 17:52 wtay
++
++ * tests/: Makefile.am, caps.c, states.c: Added a test program for
++ the capabilities
++
++2000-12-03 17:51 wtay
++
++ * gst/: Makefile.am, gst.h, gstcaps.c, gstcaps.h, gstcapsprivate.h,
++ gstpad.c, gstpad.h, gstpipeline.c: Added multiple types to the
++ pads. Added first preview of the capabilities system.
++ Autoplugging is seriously broken with these (and other) changes.
++
++2000-12-03 15:02 richardb
++
++ * test/cothreads/: Makefile.am, cothreads.c, cothreads.h: Remove
++ cothreads.[ch] from tests/cothreads/ and replace then with a rule
++ in the Makefile.am to generate symlinks to the live versions of the
++ code in gst/ : fixes a compile error, and should keep things
++ cleaner.
++
++2000-12-03 00:17 omegahacker
++
++ * gst/: cothreads.c, cothreads.h, gst.h: Enhanced debugging by
++ making DEBUG() print out the cothread ID as well as the process ID.
++ cothread_getcurrent returns the current cothread ID, or -1 if
++ cothreads aren't set up in this process context.
++
++2000-12-02 10:07 omegahacker
++
++ * docs/random/filter-writers-guide: First pass at an outline for
++ the Filter Writer's Guide. Mostly complete, though the structure
++ needs some work. Just need someone to write it ;-)
++
++2000-11-30 20:30 wtay
++
++ * docs/random/types3: Another type system proposal.
++
++2000-11-29 10:05 omegahacker
++
++ * gst/cothreads.c: Rearranged cothread_switch a bit to move all the
++ code for error conditions to the end, using goto's to get there.
++ This has the presumed advantage of consolidating all the normally
++ run code into one chunk, reducing jumps (and the associated
++ penalties in any modern processor) and limiting cache- line usage.
++ It may be instructive to look at the generated assembly for this
++ revision and the previous, to see if gcc is smart enough to do this
++ for us anyway.
++
++ If you want to turn off some of the checks (they are all checks for
++ NULL pointers, if you're curious) for a speed gain, disable the
++ #define of COTHREAD_PARANOID at the top.
++
++2000-11-26 19:11 wtay
++
++ * docs/random/types2: Added the type system design.
++
++2000-11-25 18:13 wtay
++
++ * docs/random/sources: More ramblings..
++
++2000-11-25 16:45 wtay
++
++ * docs/random/sources: Another alternative to the src. Please
++ correct.
++
++2000-11-25 16:00 wtay
++
++ * docs/random/sources: Added asci art control flow diagrams
++
++2000-11-25 14:18 wtay
++
++ * docs/random/sources, gst/gstpipeline.c,
++ gst/elements/gstasyncdisksrc.h, gst/elements/gstaudiosink.c,
++ gst/elements/gstaudiosrc.c, gst/elements/gstaudiosrc.h,
++ gst/elements/gstelements.c, gst/elements/gstesdsink.h,
++ gst/elements/gstfakesink.c, gst/elements/gstfakesink.h,
++ gst/elements/gstfakesrc.c, gst/elements/gstfakesrc.h,
++ gst/elements/gstfdsink.c, gst/elements/gstfdsink.h,
++ gst/elements/gstfdsrc.c, gst/elements/gstfdsrc.h,
++ gst/elements/gsthttpsrc.c, gst/elements/gsthttpsrc.h,
++ gst/elements/gstidentity.c, gst/elements/gstidentity.h,
++ gst/elements/gstqueue.c, gst/elements/gstqueue.h,
++ gst/elements/gstsinesrc.h, gst/elements/gsttypefind.c,
++ gst/elements/gsttypefind.h, plugins/mpeg2/mpeg2dec/Makefile.am,
++ plugins/mpeg2/mpeg2dec/decode.c, plugins/mpeg2/mpeg2dec/idct.c,
++ plugins/mpeg2/mpeg2dec/motion_comp_sse.s,
++ plugins/mpeg2/mpeg2dec/mpeg2_internal.h,
++ plugins/mpeg2/mpeg2dec/slice.c, plugins/mpeg2/parse/Makefile.am,
++ plugins/mpeg2/parse/mpeg2parse.c: Code Cleanups Added use cases for
++ the source elements.
++
++2000-11-25 07:43 omegahacker
++
++ * gst/elements/gstelements.c: Added code to force the gsttypes
++ plugin to load before gstelements, by simply having gstelements.c
++ request the plugin. Solves some dependency problems. This is the
++ correct method of doing this for now, though I had a thought:
++
++ Have a static list of hard dependencies that the plugin system is
++ responsible for satisfying before even trying to load the plugin.
++ Makes plugin design easier.
++
++2000-11-25 07:02 omegahacker
++
++ * gst/: gstpad.c, gstpad.h: added the ability to disable pads, not
++ quite complete but sufficient for now
++
++2000-11-24 22:28 omegahacker
++
++ * gst/gstelement.c: Fixed a dumb mistake: in
++ gst_element_set_loop_function, it was forcing the cothread's entry
++ function to change. This is totally wrong, the create_plan function
++ in GstBin is responsible for setting that to its own internal
++ helper function. Code removed outright...
++
++2000-11-23 21:49 omegahacker
++
++ * gst/: gstelement.c, gstelement.h: Closed 22145 - gstelement.c:
++ support hotswapping of loopfunc
++
++ Added a flag GST_ELEMENT_NEW_LOOPFUNC that's set when a new
++ loopfunc is set, which needs to be obeyed by the loopfuncs
++ themselves. The assumption is that only a loopfunc or an element
++ that knows what it's doing will ever change the loopfunc pointer,
++ so they can be responsible for exitting the loopfunc itself
++ appropriately.
++
++ The loopfunc_wrapper function has been changed to call the loopfunc
++ pointer itself in a loop. If the loopfunc changes, the current
++ loop is supposed to exit, which causes the loopfunc_wrapper to
++ start up the new loopfunc.
++
++2000-11-23 20:39 omegahacker
++
++ * gst/gstelement.c: Closed task 22143 - gstelemnt.c: complete
++ gst_element_connect
++
++ SImple matter of cleaning up the conflicting checks and actually
++ connecting the pads in question.
++
++2000-11-23 08:13 omegahacker
++
++ * gst/: gstbin.c, gstelement.c: gstbin.c: modified so create_plan
++ occurs after the state change of all the child elements.
++ gstelement.c: set_state now loops such that each element only deals
++ with one state change at a time, i.e.
++ NULL->READY,READY->PLAYING, instead of a single NULL->PLAYING.
++
++2000-11-20 22:05 wtay
++
++ * gstplay/Makefile.am, plugins/mpeg2/mpeg2dec/Makefile.am,
++ plugins/mpeg2/mpeg2dec/idct.c, plugins/mpeg2/mpeg2dec/idct_mmx.c,
++ plugins/mpeg2/mpeg2dec/perftest.c: Something was wrong with SSE
++ initialisation in mpeg2dec Added little performance test (compile
++ with gprof)
++
++2000-11-20 19:04 wtay
++
++ * configure.in,
++ components/bonobo-gstmediaplay/bonobo-gstmediaplay.c,
++ docs/manual/gstreamer-manual.sgml, gst/elements/gstdisksrc.c,
++ gstplay/gstmediaplay.c, gstplay/gstplay.c,
++ plugins/dvdsrc/Makefile.am, plugins/dvdsrc/dvdsrc.c,
++ plugins/dvdsrc/dvdsrc.h, plugins/mpeg2/ac3dec/Makefile.am,
++ plugins/mpeg2/ac3dec/ac3.h, plugins/mpeg2/ac3dec/ac3_internal.h,
++ plugins/mpeg2/ac3dec/ac3dec.c, plugins/mpeg2/ac3dec/ac3dec.h,
++ plugins/mpeg2/ac3dec/audio_out.h,
++ plugins/mpeg2/ac3dec/bit_allocate.c,
++ plugins/mpeg2/ac3dec/bit_allocate.h,
++ plugins/mpeg2/ac3dec/bitstream.c, plugins/mpeg2/ac3dec/bitstream.h,
++ plugins/mpeg2/ac3dec/bswap.h, plugins/mpeg2/ac3dec/cmplx.h,
++ plugins/mpeg2/ac3dec/coeff.c, plugins/mpeg2/ac3dec/coeff.h,
++ plugins/mpeg2/ac3dec/cpu_accel.c, plugins/mpeg2/ac3dec/crc.c,
++ plugins/mpeg2/ac3dec/crc.h, plugins/mpeg2/ac3dec/debug.c,
++ plugins/mpeg2/ac3dec/debug.h, plugins/mpeg2/ac3dec/decode.c,
++ plugins/mpeg2/ac3dec/decode.h, plugins/mpeg2/ac3dec/dither.c,
++ plugins/mpeg2/ac3dec/dither.h, plugins/mpeg2/ac3dec/downmix.c,
++ plugins/mpeg2/ac3dec/downmix.h, plugins/mpeg2/ac3dec/downmix_c.c,
++ plugins/mpeg2/ac3dec/downmix_c.h,
++ plugins/mpeg2/ac3dec/downmix_i386.S,
++ plugins/mpeg2/ac3dec/downmix_i386.h,
++ plugins/mpeg2/ac3dec/downmix_kni.S,
++ plugins/mpeg2/ac3dec/downmix_kni.h,
++ plugins/mpeg2/ac3dec/exponent.c, plugins/mpeg2/ac3dec/exponent.h,
++ plugins/mpeg2/ac3dec/imdct.c, plugins/mpeg2/ac3dec/imdct.h,
++ plugins/mpeg2/ac3dec/imdct512_kni.S,
++ plugins/mpeg2/ac3dec/imdct_c.c, plugins/mpeg2/ac3dec/imdct_c.h,
++ plugins/mpeg2/ac3dec/imdct_kni.c, plugins/mpeg2/ac3dec/imdct_kni.h,
++ plugins/mpeg2/ac3dec/mantissa.c, plugins/mpeg2/ac3dec/mantissa.h,
++ plugins/mpeg2/ac3dec/oms_accel.h, plugins/mpeg2/ac3dec/output.c,
++ plugins/mpeg2/ac3dec/output.h, plugins/mpeg2/ac3dec/parse.c,
++ plugins/mpeg2/ac3dec/parse.h, plugins/mpeg2/ac3dec/rematrix.c,
++ plugins/mpeg2/ac3dec/rematrix.h,
++ plugins/mpeg2/ac3dec/sanity_check.c,
++ plugins/mpeg2/ac3dec/sanity_check.h, plugins/mpeg2/ac3dec/srfft.c,
++ plugins/mpeg2/ac3dec/srfft.h, plugins/mpeg2/ac3dec/srfft_kni.S,
++ plugins/mpeg2/ac3dec/srfft_kni.h,
++ plugins/mpeg2/ac3dec/srfft_kni_c.c, plugins/mpeg2/ac3dec/srfftp.h,
++ plugins/mpeg2/ac3dec/stats.c, plugins/mpeg2/ac3dec/stats.h,
++ plugins/mpeg2/ac3dec/uncouple.c, plugins/mpeg2/ac3dec/uncouple.h,
++ plugins/mpeg2/mpeg2dec/Makefile.am,
++ plugins/mpeg2/mpeg2dec/decode.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.h,
++ plugins/mpeg2/mpeg2dec/motion_comp.c,
++ plugins/mpeg2/mpeg2dec/motion_comp.h,
++ plugins/mpeg2/mpeg2dec/motion_comp_sse.s,
++ plugins/mpeg2/mpeg2dec/slice.c, plugins/mpeg2/parse/mpeg2parse.c,
++ plugins/mpeg2/parse/mpeg2parse.h, test/dvdcat.c: Reworked AC3
++ decoder. No seeking yet but at least we do not need ac3parse
++ anymore. Reworked dvdsrc to read scrambled data (DeCSS not
++ included). I have modified DeCSS a bit to work in GStreamer. Can I
++ release the code or is there some lawyer that's going to sue me?
++ MPEG2 SSE motion compensation. Tried to add PTS to the MPEG
++ decoder but failed.
++
++2000-11-12 20:34 wtay
++
++ * components/bonobo-gstmediaplay/: Makefile.am,
++ bonobo-gstmediaplay.c, gstmediaplay.oafinfo: The bonobo component
++ now works on audio only (mp3/vorbis). Video is broken because
++ bonobo does not handle multithreading yet. Added Bonobo toolbar
++ and menu.
++
++2000-11-11 15:13 wtay
++
++ * configure.in, components/bonobo-gstmediaplay/.cvsignore,
++ components/bonobo-gstmediaplay/Makefile.am,
++ components/bonobo-gstmediaplay/bonobo-gstmediaplay-ui.xml,
++ components/bonobo-gstmediaplay/bonobo-gstmediaplay.c,
++ components/bonobo-gstmediaplay/gstmediaplay.oafinfo,
++ docs/gst/tmpl/cothreads.sgml, docs/gst/tmpl/gstmeta.sgml,
++ docs/gst/tmpl/gstreamer-unused.sgml, docs/gst/tmpl/gsttype.sgml,
++ docs/gst/tmpl/gstutils.sgml, docs/libs/tmpl/gstidct.sgml,
++ docs/manual/components.sgml, docs/manual/cothreads.sgml,
++ docs/manual/helloworld2.sgml, docs/manual/programs.sgml,
++ gst/cothreads.c, gst/cothreads.h, gst/gstarch.h, gst/gstbin.c,
++ gst/gstbuffer.c, gst/gstbufferpool.c, gst/gstclock.c,
++ gst/gstconnection.c, gst/gstcpu.c, gst/gstelement.c,
++ gst/gstelement.h, gst/gstextratypes.c, gst/gstfilter.c,
++ gst/gsti386.h, gst/gstmeta.c, gst/gstppc.h, gst/gstsink.c,
++ gst/gstsrc.c, gst/gstthread.c, gst/gsttype.c,
++ gst/elements/gstqueue.c, gstplay/Makefile.am,
++ plugins/avi/gstavidecoder.c: Docs updates. Added LICENSE info to
++ headers/code where missing in gst directory Added a bonobo wrapper
++ for the media player (it shows up in gshell but locks up when
++ activating the component, anyone?) Fixed some XML save/load
++ problems with arguments.
++
++2000-11-08 19:53 wtay
++
++ * gstplay/: gstmediaplay.c, gstmediaplay.glade, gstmediaplay.h,
++ gststatusarea.c, gststatusarea.h, main.c: Fix for the new gnome
++ libraries. It looks like glade does not like empty dockitems...
++
++2000-11-07 21:38 wtay
++
++ * docs/libs/: gstreamer-libs-sections.txt, tmpl/dct.sgml,
++ tmpl/gstidct.sgml, tmpl/gstriff.sgml: Library docs update
++
++2000-11-07 21:24 wtay
++
++ * docs/gst/tmpl/: cothreads.sgml, gstbufferpool.sgml,
++ gstelement.sgml, gstpad.sgml: [no log message]
++
++2000-11-07 21:18 wtay
++
++ * docs/gst/: Makefile.am, gstreamer-decl.txt, gstreamer-docs.sgml,
++ gstreamer-sections.txt: Updated docs
++
++2000-11-06 00:15 wtay
++
++ * gst/cothreads.c, gst/cothreads.h, gst/gstbin.c, gst/gstpad.c,
++ gst/gstpad.h, gst/gstutils.c, gst/elements/Makefile.am,
++ gst/elements/gstasyncdisksrc.c, gst/elements/gstasyncdisksrc.h,
++ gst/elements/gstdisksrc.c, gstplay/gstplay.c,
++ gstplay/gstplayprivate.h, libs/riff/gstriff.h,
++ libs/riff/gstriffparse.c, plugins/avi/gstavidecoder.c,
++ plugins/avi/gstavidecoder.h: Added seeking to the avi decoder by
++ implementing pull_region. Fixes to the asyncdisksrc. Added thread
++ specific data to the cothreads.
++
++2000-11-04 18:55 wtay
++
++ * include/sse.h: [no log message]
++
++2000-11-04 18:54 wtay
++
++ * configure.in, gst/Makefile.am, gst/cothreads.c, gst/cothreads.h,
++ gst/gst.c, gst/gst.h, gst/gstbin.c, gst/gstbin.h, gst/gstbuffer.h,
++ gst/gstbufferpool.h, gst/gstclock.h, gst/gstconnection.h,
++ gst/gstcpu.h, gst/gstelement.h, gst/gstfilter.h, gst/gstmeta.h,
++ gst/gstobject.h, gst/gstpipeline.h, gst/gstplugin.h, gst/gstsink.h,
++ gst/gstsrc.h, gst/gsttee.h, gst/gstthread.c, gst/gstthread.h,
++ gst/gsttrace.h, gst/gsttype.h, gst/gstutils.h, gst/gstxml.h,
++ gst/types/gsttypes.c, libs/idct/Makefile.am, libs/idct/dct.h,
++ libs/idct/gstidct.c, libs/idct/gstidct.h, libs/idct/sseidct.S,
++ plugins/mpeg2/Makefile.am, plugins/mpeg2/mpeg2dec/.cvsignore,
++ plugins/mpeg2/mpeg2dec/Makefile.am,
++ plugins/mpeg2/mpeg2dec/decode.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.c,
++ plugins/mpeg2/mpeg2dec/gstmpeg2dec.h,
++ plugins/mpeg2/mpeg2dec/header.c, plugins/mpeg2/mpeg2dec/header.h,
++ plugins/mpeg2/mpeg2dec/idct.c, plugins/mpeg2/mpeg2dec/idct.h,
++ plugins/mpeg2/mpeg2dec/idct_mmx.c,
++ plugins/mpeg2/mpeg2dec/idct_mmx.h,
++ plugins/mpeg2/mpeg2dec/motion_comp.c,
++ plugins/mpeg2/mpeg2dec/motion_comp.h,
++ plugins/mpeg2/mpeg2dec/motion_comp_mmx.c,
++ plugins/mpeg2/mpeg2dec/mpeg2.h,
++ plugins/mpeg2/mpeg2dec/mpeg2_internal.h,
++ plugins/mpeg2/mpeg2dec/slice.c, plugins/mpeg2/mpeg2dec/slice.h,
++ plugins/mpeg2/mpeg2dec/vlc.h, plugins/vorbis/vorbisdec.c: Added the
++ excellent mpeg2dec decoder. Not 100% optimized but allready very
++ fast. More cleanup.
++
++2000-11-02 20:10 wtay
++
++ * gst/gst.c, gstplay/gstmediaplay.c, gstplay/main.c: Make sure the
++ Gdk thread lock is not held inside the gstreamer pipeline. Fix the
++ videosink to not hold the Gdk lock when emitting a signal. All Gtk
++ GUI apps using GStreamer should now handle the Gdk locks when
++ handling signals from the pipeline (as it should be)
++
++2000-11-01 22:11 wtay
++
++ * examples/helloworld2/helloworld2.c, gst/cothreads.c,
++ gst/cothreads.h, gst/gstbin.c, gst/gstthread.c,
++ gst/elements/Makefile.am, gst/elements/gstqueue.c,
++ gstplay/gststatusarea.c, plugins/avi/gstavidecoder.c,
++ plugins/avi/gstavidecoder.h, plugins/mp3decode/mpg123/gstmpg123.c:
++ Some code cleanup Let the parent GstBin decide when to do a
++ create_plan (bin inside a thread)
++
++2000-11-01 13:49 wtay
++
++ * gst/gstelement.h, gst/gstpad.c, gst/gstpad.h, gst/gstplugin.c,
++ gst/gstthread.c, gst/gsttype.c, gstplay/Makefile.am,
++ gstplay/callbacks.c, gstplay/gstmediaplay.c,
++ gstplay/gstmediaplay.glade, gstplay/gstmediaplay.h,
++ gstplay/gstplay.c, gstplay/gstplay.h, gstplay/gstplayprivate.h,
++ gstplay/gststatusarea.c, gstplay/interface.c, gstplay/interface.h,
++ plugins/avi/Makefile.am, plugins/avi/audiocodecs.c,
++ plugins/avi/gstavidecoder.c, plugins/avi/gstavidecoder.h,
++ plugins/avi/gstaviencoder.c, plugins/avi/gstparseavi.c,
++ plugins/avi/gstparseavi.h, plugins/avi/playcodecs.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3decode/parse/mp3parse.h,
++ plugins/mpeg1/parse/mpeg1parse.c, plugins/mpeg1/parse/mpeg1parse.h,
++ plugins/mpeg2/parse/mpeg2parse.c, plugins/mpeg2/parse/mpeg2parse.h:
++ Code cleanup, make it adhere to the Gnome/Gtk+ code formatting,
++ which is quite clean and more readable. Renamed parseavi to
++ avidecoder Implemented seeking/time display/pause/play/stop/clean
++ exit to gstmediaplay Added an element flag to indicate that it
++ cannot deal with noncontigous buffers. If such an element is found
++ in the pipeline, seeking is disabled for the complete stream
++ (avidecoder cannot deal with seeking until we convert it to a loop
++ based element with pull_region to fetch the indeces etc...)
++
++2000-10-30 21:10 wtay
++
++ * docs/plugins/: .cvsignore, gstreamer-plugins.types.in: Missing
++ files..
++
++2000-10-30 21:08 wtay
++
++ * plugins/mpeg1/mpegaudio/: table_absthr.h, table_alloc.h,
++ table_cb.h, table_enwindow.h, table_th.h, tables.c: forgot the
++ tables...
++
++2000-10-30 21:06 wtay
++
++ * plugins/mpeg2/mpeg2enc/: Makefile.am, fdct_mmx.s, fdctdata.c: A
++ nonworking forward DCT with MMX
++
++2000-10-30 21:02 wtay
++
++ * gst/gstbin.c, gst/gstthread.c, gst/elements/gstqueue.c,
++ gstplay/.cvsignore, gstplay/Makefile.am, gstplay/callbacks.c,
++ gstplay/callbacks.h, gstplay/codecs.h, gstplay/gstmediaplay.c,
++ gstplay/gstmediaplay.glade, gstplay/gstmediaplay.h,
++ gstplay/gstplay.c, gstplay/gstplay.glade, gstplay/gstplay.h,
++ gstplay/gstplayprivate.h, gstplay/gststatusarea.c,
++ gstplay/gststatusarea.h, gstplay/interface.c, gstplay/interface.h,
++ gstplay/main.c, plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpegaudio/Makefile.am,
++ plugins/mpeg1/mpegaudio/common.c, plugins/mpeg1/mpegaudio/encode.c,
++ plugins/mpeg1/mpegaudio/musicin.c, plugins/mpeg1/mpegaudio/psy.c,
++ plugins/mpeg1/mpegaudio/tonal.c, plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg2/mpeg2enc/Makefile.am,
++ plugins/mpeg2/mpeg2enc/motion.c, plugins/mpeg2/mpeg2enc/mpeg2enc.c,
++ plugins/mpeg2/mpeg2enc/mpeg2enc.h,
++ plugins/mpeg2/mpeg2enc/quant_mmx.s,
++ plugins/mpeg2/mpeg2enc/quantize.c, test/avi2mpg.c, test/mp2tomp1.c:
++ Misc fixes and cleanups A reworked gstplay. Now it is called
++ gstmediaplay. gstplay is a custom widget that can display media and
++ is to become a bonobo component soon. put the tables of the mpeg
++ audio encoder in a header file. maybe faster quantisation for the
++ mpeg encoder.
++
++2000-10-25 20:09 wtay
++
++ * configure.in, docs/plugins/Makefile.am, docs/plugins/gstdoc-mkdb,
++ docs/plugins/gstdoc-mktmpl, docs/plugins/gstdoc-scanobj,
++ docs/plugins/gstreamer-plugins-docs.sgml,
++ docs/plugins/gstreamer-plugins-sections.txt,
++ docs/plugins/tmpl/ac3dec.sgml, docs/plugins/tmpl/ac3parse.sgml,
++ docs/plugins/tmpl/audioscale.sgml, docs/plugins/tmpl/cobin.sgml,
++ docs/plugins/tmpl/dvdsrc.sgml, docs/plugins/tmpl/example.sgml,
++ docs/plugins/tmpl/gstaviencoder.sgml,
++ docs/plugins/tmpl/gstjpeg.sgml, docs/plugins/tmpl/gstjpegdec.sgml,
++ docs/plugins/tmpl/gstjpegenc.sgml,
++ docs/plugins/tmpl/gstmpeg1encoder.sgml,
++ docs/plugins/tmpl/gstmpeg2enc.sgml,
++ docs/plugins/tmpl/gstmpeg2play.sgml,
++ docs/plugins/tmpl/gstmpeg_play.sgml,
++ docs/plugins/tmpl/gstmpegaudio.sgml,
++ docs/plugins/tmpl/gstmpg123.sgml,
++ docs/plugins/tmpl/gstparseau.sgml,
++ docs/plugins/tmpl/gstparseavi.sgml,
++ docs/plugins/tmpl/gstparsewav.sgml,
++ docs/plugins/tmpl/gstreamer-plugins-unused.sgml,
++ docs/plugins/tmpl/gstspectrum.sgml,
++ docs/plugins/tmpl/gstv4lsrc.sgml,
++ docs/plugins/tmpl/gstwincodec.sgml,
++ docs/plugins/tmpl/gstwindec.sgml, docs/plugins/tmpl/gstwinenc.sgml,
++ docs/plugins/tmpl/gstxa.sgml, docs/plugins/tmpl/gstxing.sgml,
++ docs/plugins/tmpl/median.sgml,
++ docs/plugins/tmpl/mp1videoparse.sgml,
++ docs/plugins/tmpl/mp2videoparse.sgml,
++ docs/plugins/tmpl/mp3parse.sgml, docs/plugins/tmpl/mpeg1parse.sgml,
++ docs/plugins/tmpl/mpeg2parse.sgml,
++ docs/plugins/tmpl/mpeg2subt.sgml, docs/plugins/tmpl/rtjpegdec.sgml,
++ docs/plugins/tmpl/rtjpegenc.sgml, docs/plugins/tmpl/smooth.sgml,
++ docs/plugins/tmpl/smoothwave.sgml,
++ docs/plugins/tmpl/spindentity.sgml, docs/plugins/tmpl/stereo.sgml,
++ docs/plugins/tmpl/synaesthesia.sgml,
++ docs/plugins/tmpl/system_encode.sgml,
++ docs/plugins/tmpl/vcdsrc.sgml, docs/plugins/tmpl/videoscale.sgml,
++ docs/plugins/tmpl/videosink.sgml, docs/plugins/tmpl/volume.sgml,
++ docs/plugins/tmpl/vorbisdec.sgml, docs/plugins/tmpl/vorbisenc.sgml,
++ docs/plugins/tmpl/vumeter.sgml, gst/gstbufferpool.c,
++ gst/gstconnection.c, gst/gstcpu.c, gst/gstcpu.h, gst/gstelement.c,
++ gst/gstelement.h, gst/gstelementfactory.c, gst/gstmeta.c,
++ gst/gstmeta.h, gst/gstpad.c, gst/gstplugin.c, gst/gstthread.c,
++ gst/gstthread.h, gst/gstutils.c, gst/gstxml.c,
++ gst/elements/gstasyncdisksrc.c, gst/elements/gstaudiosink.c,
++ gst/elements/gsttypefind.c, gst/elements/gsttypefind.h,
++ libs/idct/gstidct.h, libs/riff/gstriff.h, test/ac3play.c,
++ test/qtest.c: More Docs updates. Added plugin documentation. I
++ fear we need a gstdoc implementation that loads plugins and does
++ introspection on them. I think we should automatically create the
++ docs for the pads and mime types the plugins provide. Does anyone
++ have enough perl knowledge to add these features? I allready
++ changed the C code to output the pad definitions but my perl
++ knowledge is too limited, for now, to implement the rest of the
++ needed functionality...
++
++2000-10-22 17:30 wtay
++
++ * docs/gst/tmpl/: audioraw.sgml, cothreads.sgml,
++ gstasyncdisksrc.sgml, gstaudiosink.sgml, gstbuffer.sgml,
++ gstbufferpool.sgml, gstclock.sgml, gstcpu.sgml, gstdisksrc.sgml,
++ gstelement.sgml, gstextratypes.sgml, gstmeta.sgml, gstpad.sgml,
++ gstplugin.sgml, gstreamer-unused.sgml, gstsrc.sgml, gstthread.sgml,
++ gsttrace.sgml, gsttype.sgml, gsttypefind.sgml, gstxml.sgml,
++ spectrum.sgml, videoraw.sgml: More docs updates
++
++2000-10-22 17:27 wtay
++
++ * docs/: Makefile.am, gst/Makefile.am, gst/gstreamer-decl.txt,
++ gst/gstreamer-docs.sgml, gst/gstreamer-sections.txt,
++ gst/gstreamer.hierarchy, gst/gstreamer.types.in, libs/.cvsignore,
++ libs/Makefile.am, libs/gstreamer-libs-docs.sgml,
++ libs/gstreamer-libs-sections.txt, libs/tmpl/.cvsignore,
++ libs/tmpl/dct.sgml, libs/tmpl/externals.sgml,
++ libs/tmpl/gstcolorspace.sgml, libs/tmpl/gstgetbits.sgml,
++ libs/tmpl/gstgetbits_inl.sgml, libs/tmpl/gstidct.sgml,
++ libs/tmpl/gstputbits.sgml, libs/tmpl/gstriff.sgml,
++ libs/tmpl/gstvideoscale.sgml, libs/tmpl/wineacm.sgml: Documentation
++ updates documented the libraries
++
++2000-10-21 13:04 wtay
++
++ * configure.in, docs/manual/gstreamer-manual.sgml, gst/Makefile.am,
++ gst/cothreads.c, gst/gstbin.c, gst/gstpad.c, gst/gstpad.h,
++ gst/gstpipeline.c, gst/elements/gstdisksrc.c,
++ plugins/avi/gstparseavi.c,
++ plugins/mpeg1/mpeg1encoder/gstmpeg1encoder.c,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg2/Makefile.am, plugins/mpeg2/mpegtypes/.cvsignore,
++ plugins/mpeg2/mpegtypes/Makefile.am,
++ plugins/mpeg2/mpegtypes/mpeg2types.c,
++ plugins/mpeg2/parse/mpeg2parse.c,
++ plugins/mpeg2/video/gstmpeg2play.c,
++ plugins/mpeg2/videoparse/.cvsignore,
++ plugins/mpeg2/videoparse/Makefile.am,
++ plugins/mpeg2/videoparse/mp2videoparse.c,
++ plugins/mpeg2/videoparse/mp2videoparse.h: MPEG2 types added for
++ better autoplugging. MPEG2 works more or less. fix in
++ autoplugging. avi now works.
++
++2000-10-12 20:41 wtay
++
++ * editor/gsteditorconnection.c, editor/gsteditorpad.c,
++ gst/gstpipeline.c, gstplay/Makefile.am, gstplay/avi.c,
++ gstplay/gstplay.c, gstplay/mpeg1.c, gstplay/mpeg2.c: Removed the
++ hardcoded pipeline setup is gstplay in favor of the autoplugging
++ features. Still in a rought shape...
++
++2000-10-12 09:43 richardb
++
++ * docs/manual/: BUILD, Makefile.am, images/Makefile.am: Manual now
++ gets installed correctly by make install. Problems: clean /
++ uninstall don't work. make dist not tested. pdf manual doesn't
++ have images.
++
++2000-10-11 20:30 wtay
++
++ * editor/gsteditorproperty.c, gst/Makefile.am, gst/gst.h,
++ gst/gstextratypes.c, gst/gstextratypes.h,
++ gst/elements/gstasyncdisksrc.c, gst/elements/gstaudiosink.c,
++ gst/elements/gstdisksrc.c, gst/elements/gstfdsrc.c: Added extra Gtk
++ types for better editor properties (FILENAME, enums) The disksrcs
++ location property can now be set in the editor: we can now make our
++ first working mp3 player with gsteditor!!
++
++2000-10-09 21:01 wtay
++
++ * examples/autoplug/autoplug.c, gst/Makefile.am, gst/gstpipeline.c,
++ gst/elements/gstaudiosink.c, gst/elements/gstqueue.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c: Fixed a severe timestamp
++ bug in mpeg_play. Create a new thread upon a multisrc element in
++ autoplugging: the autoplug example now correctly sets up 5 threads
++ for an mpeg player.
++
++2000-10-09 01:34 richardb
++
++ * configure.in, docs/Makefile.am, docs/manual/.cvsignore,
++ docs/manual/Makefile.am, docs/manual/images/.cvsignore,
++ docs/manual/images/Makefile.am: Added building of the manual to the
++ build system. Currently in a rudimentary state - will not
++ gracefully give up if tools not available, will not uninstall /
++ clean, and may not install / make dist properly. Documentation
++ does not have dependencies on images, so won't rebuild if they're
++ altered either.
++
++2000-10-08 23:23 wtay
++
++ * examples/autoplug/.cvsignore, examples/autoplug/Makefile,
++ examples/autoplug/autoplug.c, plugins/mp3decode/types/.cvsignore,
++ plugins/mp3decode/types/Makefile.am,
++ plugins/mp3decode/types/mp3types.c,
++ plugins/mpeg1/mpegtypes/.cvsignore,
++ plugins/mpeg1/mpegtypes/Makefile.am,
++ plugins/mpeg1/mpegtypes/mpeg1types.c: Added an autoplug example.
++ This little program (30 relevant lines) is able to play
++ MPEG1(system)/MPEG2(system)/AVI(DIVX)/Vorbis/AC3 and whatever codec
++ you write. Separated the mp3 and mpeg1 types for better reuse.
++
++2000-10-08 23:17 wtay
++
++ * configure.in, editor/editor.glade, editor/gsteditor.h,
++ editor/gsteditorbin.c, editor/gsteditorcanvas.c,
++ editor/gsteditorconnection.c, editor/gsteditorconnection.h,
++ editor/gsteditorcreate.c, editor/gsteditorpad.c,
++ editor/gsteditorproperty.c, editor/gstelementselect.c,
++ gst/gstbin.c, gst/gstelement.h, gst/gstelementfactory.c,
++ gst/gstfilter.c, gst/gstpad.c, gst/gstpipeline.c, gst/gstplugin.c,
++ gst/gstsink.c, gst/gstthread.c, gst/gsttype.c,
++ gst/elements/gstaudiosink.c, gst/elements/gsttypefind.c,
++ gst/types/gsttypes.c, plugins/avi/gstparseavi.c,
++ plugins/capture/v4l/gstv4lsrc.c,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3decode/xing/gstxing.c, plugins/mpeg1/Makefile.am,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/video.c,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.c,
++ plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg2/parse/mpeg2parse.c: Fixed a bug in the typeloading.
++ Fixes to various elements so that correct types are returned.
++ Fixed flag collision with GtkObject. Elements can now suggest a
++ thread. not sure if this is the right way to handle automatic
++ thread creation. Autoplugging now works with multiple sinks and
++ thread setup. No threads are created for intermediate elements yet,
++ so MPEG may still be choppy.
++
++2000-10-06 23:52 richardb
++
++ * plugins/: capture/v4l/Makefile.am, mpeg1/mpeg_play/Makefile.am,
++ mpeg1/mpegaudio/Makefile.am, mpeg2/mpeg2enc/Makefile.am,
++ mpeg2/video/Makefile.am: Remove from EXTRA_DIST various files which
++ don't exist (these looked like copy and paste typos).
++
++2000-10-06 03:38 richardb
++
++ * Makefile.am: Don't compile editor if havn't got libglade-gnome.
++
++2000-10-01 22:46 wtay
++
++ * editor/: Makefile.am, editor.c, editor.glade, editor.ts,
++ gsteditor.c, gsteditor.h, gsteditorcanvas.c, gsteditorelement.c,
++ gsteditorimage.c, gsteditorimage.h, gsteditorpad.h,
++ gsteditorpalette.c, gsteditorpalette.h, gsteditorproject.c,
++ gsteditorproject.h, gsteditorprojectview.c, gsteditorproperty.c,
++ gsteditorproperty.h, pixmaps/bin.xpm, pixmaps/element.xpm,
++ pixmaps/pipeline.xpm, pixmaps/selector.xpm, pixmaps/tee.xpm,
++ pixmaps/thread.xpm: Initial work for the new editor.
++
++2000-09-27 20:33 wtay
++
++ * examples/xml/createxml.c, examples/xml/runxml.c, gst/Makefile.am,
++ gst/gstbin.c, gst/gstelement.c, gst/gstelement.h,
++ gst/gstelementfactory.c, gst/gstpad.c, gst/gstpad.h,
++ gst/gstthread.c, gst/gstxml.c, gst/gstxml.h,
++ gst/elements/gstaudiosink.c: Loading and saving of XML pipeline
++ descriptions. GladeXML like operation implemented (you can
++ retrieve parts of a pipeline)
++
++2000-09-24 23:47 wtay
++
++ * examples/xml/.cvsignore: better .cvsignore
++
++2000-09-24 23:45 wtay
++
++ * examples/xml/.cvsignore, examples/xml/Makefile,
++ examples/xml/createxml.c, examples/xml/runxml.c, gst/gstbin.c,
++ gst/gstconnection.h, gst/gstelementfactory.c, gst/gstpipeline.c,
++ gst/gsttee.h, gst/gstthread.c, gst/gstthread.h, gst/gstxml.c,
++ gst/gstxml.h: Cleanups. The first steps to a Glade like XML
++ handling. A first example of what is to come...
++
++2000-09-24 15:31 wtay
++
++ * examples/queue4/: .cvsignore, Makefile, queue4.c: An example of
++ two threads and two queues.
++
++2000-09-24 15:29 wtay
++
++ * gst/cothreads.c, gst/gstbin.c, gst/gstpad.c, gst/gstthread.c,
++ gst/elements/gstqueue.c, gst/elements/gstqueue.h,
++ plugins/mp3decode/mpg123/gstmpg123.c: The cothreads were not
++ initialized in its thread context resulting in severe stack
++ corruption. This was very hard to track down. We should be able
++ now to modify some plugins to a loop based setup so that we can get
++ rid of the mp3parse and mp1videoparse elements. Modified the GList
++ to a GSList in the queue.
++
++2000-09-23 00:35 wtay
++
++ * gstreamer-config.in, examples/helloworld/helloworld.c,
++ examples/helloworld2/helloworld2.c, examples/queue/.cvsignore,
++ examples/queue/queue.c, examples/queue2/.cvsignore,
++ examples/queue2/queue2.c, examples/queue3/.cvsignore,
++ examples/queue3/queue3.c, examples/thread/thread.c,
++ gst/cothreads.c, gst/cothreads.h, gst/gstbin.c, gst/gstpad.c,
++ gst/gstpipeline.c, gst/gstthread.c, gst/elements/Makefile.am,
++ gst/elements/gstqueue.c, gstplay/Makefile.am, gstplay/avi.c,
++ gstplay/gstplay.c, gstplay/mpeg1.c, gstplay/mpeg2.c,
++ plugins/mp3decode/mpg123/gstmpg123.c, test/mp2tomp1.c: A first
++ attempt to fix the queues in a cothreaded pipeline. Some fixes to
++ the thread handling. Fix a bug in gstreamer-config : gthread was
++ not included. gst_bin_create_plan() is now done in the READY
++ state. a bin with only another bin in it will now work with
++ gst_bin_iterate. Added some examples for the queues.
++
++2000-09-21 18:54 richardb
++
++ * plugins/mp3decode/mpg123/Makefile.am: If using decode.c, compile
++ dct64.c as well. Fixes link error on PPC.
++
++2000-09-21 02:42 richardb
++
++ * libs/idct/ieeetest.c: IDCT works, and ieeetest not complains
++ nicely if attempt to run a test with an unsupported DCT type.
++
++2000-09-21 02:34 richardb
++
++ * gst/Makefile.am, libs/Makefile.am, libs/idct/Makefile.am,
++ libs/idct/dct.h, libs/idct/gstidct.c: Make libs/idct only build mmx
++ support if available - hopefully makes it compile on PPC.
++
++2000-09-21 01:57 richardb
++
++ * AUTHORS, gst/cothreads.c, gst/gsti386.h, gst/gstppc.h,
++ test/cothreads/cothreads.c: Patch from Chris Emerson for PPC.
++ cothreads stuff was causing segfaults, because the stack needs to
++ be initialised with a particular structure on PPC, unlike x86 where
++ it simply has items pushed or popped. Added Chris to AUTHORS, for
++ his trouble.
++
++2000-09-18 23:19 richardb
++
++ * autogen.sh, docs/manual/helloworld2.sgml, gstplay/gstplay.glade,
++ libs/getbits/Makefile.am, libs/getbits/gstgetbits.h, test/wave.c:
++ Fix compile problem due to DEBUG being redefined in
++ libs/getbits/gstgetbits.h. Also fix several small typos in the
++ docs and examples.
++
++2000-09-17 23:08 wtay
++
++ * docs/gst/gstreamer-decl.txt, docs/gst/gstreamer-sections.txt,
++ docs/gst/tmpl/gstpipeline.sgml, docs/manual/helloworld2.sgml,
++ examples/helloworld2/helloworld2.c, examples/thread/thread.c,
++ gst/Makefile.am, gst/cothreads.c, gst/gstbin.c, gst/gstpipeline.c,
++ gst/gstpipeline.h, gst/elements/gstdisksrc.c,
++ libs/getbits/gstgetbits.c, plugins/mpeg2/ac3dec/ac3dec.c,
++ plugins/mpeg2/ac3parse/ac3parse.c,
++ plugins/mpeg2/parse/mpeg2parse.c, plugins/vorbis/vorbisdec.c: Added
++ gst_pipeline_add_sink/src to allow multiple sink cases and more
++ complex autoplugging. Update docs too. Simplified the pipeline
++ autoplugging code. Changed the cothread case: One iteration is now
++ a push from the src element. The disk source does not change its
++ state anymore on eof. Better type setting for the ac3
++ parser/decoder and mpeg2parse.
++
++2000-09-17 15:06 wtay
++
++ * acconfig.h, configure.in, gst/gstbin.c,
++ gst/elements/gstdisksrc.c: Added check for vorbis. Really compile
++ with Xv extension if the library is found. Changed the disksrc so
++ that is goes to the PAUSE state if eof.
++
++2000-09-17 13:32 wtay
++
++ * plugins/mpeg2/mpeg2enc/transfrm_mmx.s: more asm...
++
++2000-09-17 13:32 wtay
++
++ * docs/manual/components.sgml: Information about the bonobo
++ components and capplets we are going to make :-)
++
++2000-09-17 13:31 wtay
++
++ * libs/getbits/Makefile.am, libs/getbits/gstgetbits.h,
++ plugins/mpeg1/mpeg_play/parseblock.c,
++ plugins/mpeg2/mpeg2enc/Makefile.am,
++ plugins/mpeg2/mpeg2enc/bdist1_mmx.s,
++ plugins/mpeg2/mpeg2enc/bdist1_sse.s,
++ plugins/mpeg2/mpeg2enc/bdist2_mmx.s,
++ plugins/mpeg2/mpeg2enc/dist1_00_mmx.s,
++ plugins/mpeg2/mpeg2enc/dist1_00_sse.s,
++ plugins/mpeg2/mpeg2enc/dist1_01_mmx.s,
++ plugins/mpeg2/mpeg2enc/dist1_01_sse.s,
++ plugins/mpeg2/mpeg2enc/dist1_10_mmx.s,
++ plugins/mpeg2/mpeg2enc/dist1_10_sse.s,
++ plugins/mpeg2/mpeg2enc/dist1_11_mmx.s,
++ plugins/mpeg2/mpeg2enc/dist1_11_sse.s,
++ plugins/mpeg2/mpeg2enc/dist2_mmx.s,
++ plugins/mpeg2/mpeg2enc/motion.c, plugins/mpeg2/mpeg2enc/mpeg2enc.c,
++ plugins/mpeg2/mpeg2enc/mpeg2enc.h,
++ plugins/mpeg2/mpeg2enc/predict.c,
++ plugins/mpeg2/mpeg2enc/predict_mmx.s,
++ plugins/mpeg2/mpeg2enc/predict_sse.s,
++ plugins/mpeg2/mpeg2enc/ratectl.c,
++ plugins/mpeg2/mpeg2enc/transfrm.c,
++ plugins/mpeg2/mpeg2enc/variance_mmx.s, test/.cvsignore: Converted
++ the mpeg2 encoder asm to gnu asm, removing the dependency of nasm
++ Added cpu detection in the mpeg2 encoder removed the inlined mmx
++ asembler to seperate files.
++
++2000-09-17 00:11 richardb
++
++ * acconfig.h, configure.in, libs/Makefile.am, plugins/Makefile.am,
++ plugins/avi/Makefile.am, plugins/avi/playcodecs.c,
++ plugins/avi/wincodec/Makefile.am, plugins/avi/wincodec/gstwindec.c,
++ plugins/avi/wincodec/gstwinenc.c,
++ plugins/mpeg1/mpeg1encoder/Makefile.am,
++ plugins/mpeg1/mpeg1encoder/putbits.c,
++ plugins/mpeg1/mpeg_play/Makefile.am,
++ plugins/mpeg1/mpeg_play/parseblock.c,
++ plugins/mpeg1/mpeg_play/video.c, plugins/mpeg1/mpeg_play/video.h,
++ plugins/mpeg1/mpegaudio/Makefile.am: More work porting to PPC.
++ libs/winloader is disabled on PPC - I doubt this can be made to
++ work. libs/videoscale and libs/idct are also disabled - they
++ should be fixable though.
++
++ Sorted out most of the plugins - avi is disabled for now on PPC;
++ can be worked on later if there's any chance of getting it to work.
++
++ Also provide an automake conditional for compiling vorbis, based on
++ a configure test for the needed libraries: currently the test isn't
++ implemented and defaults to "no" so you'll have to fiddle it to
++ compile vorbis. I shall get hold of vorbis and implement an
++ appropriate test some other time (if noone else beats me to it).
++
++2000-09-16 23:03 richardb
++
++ * libs/getbits/: gstgetbits.c, gstgetbits.h, gstgetbits_generic.c:
++ Moved generic function implementations into gstgetbits_generic.c,
++ and tidy up a bit.
++
++2000-09-16 11:58 wtay
++
++ * docs/gst/gstreamer.types.in, gst/cothreads.c, gst/gstbin.c,
++ gst/gstcpu.c, gst/gstpad.c, gst/gsttype.c,
++ gst/elements/gstdisksrc.c, gst/elements/gstqueue.c,
++ libs/getbits/gstgetbits.c, plugins/vorbis/vorbisdec.c: Added a
++ quick hack to allow loop based elements to finish intead of looping
++ till infinity. Added compile time i386 or plain C getbits
++ implementation selection. The vorbis decoder now is our first loop
++ based element!
++
++2000-09-16 01:59 richardb
++
++ * gst/Makefile.am, gst/gstarch.h, gst/gstcpu.c, gst/gstppc.h,
++ libs/getbits/Makefile.am, libs/getbits/gstgetbits_generic.c,
++ plugins/mp3decode/mpg123/Makefile.am, plugins/mpeg2/Makefile.am,
++ plugins/mpeg2/ac3dec/Makefile.am,
++ plugins/mpeg2/mpeg2enc/Makefile.am,
++ plugins/mpeg2/mpeg2enc/motion.c,
++ plugins/mpeg2/subtitles/Makefile.am,
++ plugins/mpeg2/video/Makefile.am, plugins/mpeg2/video/getpic.c,
++ plugins/mpeg2/video/gstmpeg2play.c: More work towards a powerPC
++ port, and towards generic portability.
++
++2000-09-16 00:04 richardb
++
++ * .cvsignore, autogen.sh, configure.in, gst/Makefile.am,
++ gst/gstarch.h, gst/gsti386.h: Fix on x86 architectures - was just
++ checking for 386, D'oh. Fix autogen to run autoheader _before_
++ autoconf, since it generates a required file (config.h.in, which I
++ just removed from CVS since its an autogenerated one). Also fix
++ messed up variables in gst/Makefile.am
++
++2000-09-15 23:44 richardb
++
++ * AUTHORS, acconfig.h, config.h.in, configure.in, gst/Makefile.am,
++ gst/cothreads.c, gst/gstarch.h, gst/gsti386.h, gst/gstppc.h,
++ libs/getbits/Makefile.am, plugins/mp3decode/xing/libxing/config.h:
++ Begun to add support for non i386 architectures, with the help of
++ Chris Emerson. Added bits to configure to figure out architecture,
++ and added some alternatives for PPC. Should cause no problems on
++ i386, but I'll check after this commit, but doesn't yet work on PPC
++ by a fair way...
++
++2000-09-14 23:18 wtay
++
++ * gst/gstelementfactory.c, plugins/vorbis/vorbisdec.c,
++ plugins/vorbis/vorbisdec.h, plugins/vorbis/vorbisenc.c,
++ plugins/vorbis/vorbisenc.h, test/Makefile.am, test/mp3tovorbis.c:
++ The vorbis encoder A test program to convert an mp3 to a vorbis
++ file. A fix for the dynamic plugin loader factory_find was not
++ working. Don't forget to run gstreamer-register after installing
++ the plugins!
++
++2000-09-14 21:31 wtay
++
++ * configure.in, gst/Makefile.am, gst/gst.c, gst/gstbin.c,
++ gst/gstbuffer.c, gst/gstcpu.c, gst/gstelement.c,
++ gst/gstelementfactory.c, gst/gstpad.c, gst/gstpipeline.c,
++ plugins/Makefile.am, plugins/rtjpeg/rtjpegdec.c,
++ plugins/vorbis/.cvsignore, plugins/vorbis/Makefile.am,
++ plugins/vorbis/vorbis.c, plugins/vorbis/vorbisdec.c,
++ plugins/vorbis/vorbisdec.h, plugins/vorbis/vorbisenc.c,
++ plugins/vorbis/vorbisenc.h: Due to popular demand :-), I added a
++ vorbis decoder. The encoder is not yet functional. Small cosmetic
++ changes to gstcpu.c
++
++ Beware: You *need* to install libvorbis.a from the main vorbis CVS.
++ you *have* to change the line in libtool to
++ deplibs_check_method="pass_all" because else the plugin shared
++ library refuses to link against the static libvorbis.a library.
++ This is a hack. I have no intention in including libvorbis into the
++ gstreamer CVS tree and making it libtool compatible.
++
++2000-09-13 20:04 wtay
++
++ * docs/: gst/gstreamer-decl.txt, gst/gstreamer-docs.sgml,
++ gst/gstreamer-sections.txt, gst/gstreamer.hierarchy,
++ gst/gstreamer.types.in, gst/tmpl/gst.sgml,
++ gst/tmpl/gstaudiosink.sgml, gst/tmpl/gstbuffer.sgml,
++ gst/tmpl/gstbufferpool.sgml, gst/tmpl/gstclock.sgml,
++ gst/tmpl/gstconnection.sgml, gst/tmpl/gstcpu.sgml,
++ gst/tmpl/gstdisksrc.sgml, gst/tmpl/gstelement.sgml,
++ gst/tmpl/gstpad.sgml, gst/tmpl/gstpipefilter.sgml,
++ gst/tmpl/gstpipeline.sgml, gst/tmpl/gstplugin.sgml,
++ gst/tmpl/gstreamer-unused.sgml, gst/tmpl/gstsrc.sgml,
++ gst/tmpl/gsttype.sgml, gst/tmpl/gstutils.sgml,
++ manual/gstreamer-manual.sgml: Bring the low level API docs up to
++ date.
++
++2000-09-12 19:15 wtay
++
++ * plugins/mpeg2/video/: recon_mmx.c, recon_sse.s: SSE optimisation
++ MMX optimisation split out in seperate file.
++
++2000-09-12 19:13 wtay
++
++ * gst/Makefile.am, gst/gst.c, gst/gst.h, gst/gstcpu.c,
++ gst/gstcpu.h, gst/gstcpuid_i386.s, libs/idct/gstidct.c,
++ plugins/mpeg1/mpeg_play/Makefile.am,
++ plugins/mpeg1/mpeg_play/parseblock.c,
++ plugins/mpeg1/mpeg_play/proto.h, plugins/mpeg1/mpeg_play/recon.c,
++ plugins/mpeg1/mpeg_play/recon_mmx.c,
++ plugins/mpeg1/mpeg_play/recon_sse.s,
++ plugins/mpeg1/mpeg_play/util.c, plugins/mpeg1/mpeg_play/util.h,
++ plugins/mpeg1/mpeg_play/video.c, plugins/mpeg1/mpeg_play/video.h,
++ plugins/mpeg2/video/Makefile.am, plugins/mpeg2/video/gethdr.c,
++ plugins/mpeg2/video/mpeg2dec.c, plugins/mpeg2/video/mpeg2dec.h,
++ plugins/mpeg2/video/recon.c, plugins/mpeg2/video/tables.c: Added
++ CPU detection. Added SSE optimisation to mpeg_play Modified the
++ mpeg2 decoder and gstidct to use cpu detection. Cleanups in the
++ mpeg1 and mpeg2 decoders.
++
++2000-09-09 17:39 wtay
++
++ * examples/: launch/.cvsignore, launch/mp3play, thread/.cvsignore,
++ thread/Makefile, thread/thread.c: A thread example. An example of
++ gstreamer-launch: an mp3 player
++
++2000-09-09 17:36 wtay
++
++ * gstreamer-config.in, docs/manual/gstreamer-manual.sgml,
++ docs/manual/helloworld.sgml, docs/manual/helloworld2.sgml,
++ docs/manual/programs.sgml, docs/manual/queues.sgml,
++ docs/manual/threads.sgml, editor/editor.c, editor/gsteditor.c,
++ editor/gsteditor.h, editor/gstelementselect.c,
++ examples/helloworld/Makefile, examples/helloworld/helloworld.c,
++ examples/helloworld2/Makefile, examples/helloworld2/helloworld2.c,
++ gst/gst.c, gst/gst.h, gst/gstbin.h, gst/gstelementfactory.c,
++ gst/gstpipeline.c, gst/gstpipeline.h, gst/gstplugin.c,
++ gst/gstsrc.c, gst/gstthread.c, gst/gstthread.h,
++ gst/elements/gstdisksrc.h, gst/elements/gstelements.c,
++ gstplay/mpeg1.c, gstplay/mpeg2.c, plugins/mpeg2/ac3dec/ac3dec.c,
++ plugins/mpeg2/ac3dec/ac3dec.h, plugins/mpeg2/ac3dec/downmix.c,
++ plugins/mpeg2/ac3parse/Makefile.am,
++ plugins/mpeg2/ac3parse/ac3parse.c, tools/gstreamer-launch.c:
++ Changes to gstreamer-config to include gtk+ libs manual changes:
++ queues, threads, programs gsteditor does not crash anymore.
++ gstpipline new should return a GstElement * fixed ac3dec for new
++ getbits fixes to gstreamer-launch more efficient startup for
++ gstplay.
++
++2000-09-07 21:35 wtay
++
++ * gst/Makefile.am, gst/cothreads.c, gst/gstbin.c,
++ gst/elements/gstaudiosink.c, libs/getbits/.cvsignore,
++ libs/getbits/Makefile.am, libs/getbits/gbtest.c,
++ libs/getbits/gstgetbits.c, libs/getbits/gstgetbits.h,
++ libs/getbits/gstgetbits_i386.s, libs/getbits/gstgetbits_inl.h,
++ plugins/mp3decode/mpg123/Makefile.am,
++ plugins/mp3decode/mpg123/common.c,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/mpg123/layer1.c,
++ plugins/mp3decode/mpg123/layer2.c,
++ plugins/mp3decode/mpg123/layer3.c,
++ plugins/mp3decode/mpg123/mpg123.c,
++ plugins/mp3decode/mpg123/mpg123.h, plugins/mpeg1/mpeg_play/util.c,
++ plugins/mpeg1/mpeg_play/video.c, plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1/system_encode/buffer.c,
++ plugins/mpeg2/parse/mpeg2parse.c, plugins/mpeg2/video/gethdr.c,
++ plugins/mpeg2/video/mpeg2dec.c, test/cothreads/cothreads.c,
++ test/cothreads/test.c: Faster and modular getbits implementation.
++ Fixed a bug in the audiosink that could lock up your box on bad MB.
++ Modified the plugins to use the new getbits functions.
++
++2000-08-28 21:20 wtay
++
++ * examples/helloworld2/helloworld2.c, gst/gst.c, gst/gstelement.h,
++ gst/gstelementfactory.c, gst/gstplugin.c, gst/gstplugin.h,
++ gst/gsttype.c, gst/gsttype.h, gst/elements/gsttypefind.c,
++ gst/types/gsttypes.c, gstplay/gstplay.c, plugins/Makefile.am,
++ plugins/au/gstparseau.c, plugins/audioscale/audioscale.c,
++ plugins/avi/gstaviencoder.c, plugins/avi/gstparseavi.c,
++ plugins/avi/wincodec/gstwincodec.c,
++ plugins/avi/wincodec/gstwindec.c, plugins/capture/v4l/gstv4lsrc.c,
++ plugins/cobin/cobin.c, plugins/cobin/spindentity.c,
++ plugins/effects/stereo/stereo.c, plugins/effects/volume/volume.c,
++ plugins/filters/median/median.c, plugins/filters/smooth/smooth.c,
++ plugins/jpeg/gstjpeg.c, plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3decode/xing/gstxing.c,
++ plugins/mpeg1/mpeg1encoder/gstmpeg1encoder.c,
++ plugins/mpeg1/mpeg_play/decoders.c,
++ plugins/mpeg1/mpeg_play/decoders.h,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.c,
++ plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1/system_encode/system_encode.c,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg2/ac3dec/ac3dec.c, plugins/mpeg2/ac3parse/ac3parse.c,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.c,
++ plugins/mpeg2/parse/mpeg2parse.c,
++ plugins/mpeg2/subtitles/mpeg2subt.c,
++ plugins/mpeg2/video/gstmpeg2play.c, plugins/rtjpeg/rtjpeg.c,
++ plugins/vcdsrc/vcdsrc.c, plugins/videoscale/videoscale.c,
++ plugins/visualization/smoothwave/smoothwave.c,
++ plugins/visualization/spectrum/gstspectrum.c,
++ plugins/visualization/synaesthesia/synaesthesia.c,
++ plugins/visualization/vumeter/vumeter.c, plugins/wav/gstparsewav.c,
++ tools/.cvsignore, tools/Makefile.am, tools/gstreamer-launch.c,
++ tools/gstreamer-register.c, tools/launch.c: Externalized the plugin
++ information in /etc/gstreamer/reg.xml - no need to do a
++ plugin_load_all() - plugins are loaded when needed - typedetect
++ functions are loaded when needed (still buggy) - no need to check
++ for the existance of the plugin in the codecs - added
++ gstreamer-register to create the reg.xml file - renamed launch to
++ gstreamer-launch - plugins need to register the typefactory they
++ provide modified the plugins to meet the new design modified the
++ plugins to correctly set their pad types autoplugging can be done
++ without loading the plugins now
++
++2000-08-22 22:18 wtay
++
++ * docs/manual/advanced.sgml, docs/manual/cothreads.sgml,
++ docs/manual/dynamic.sgml, docs/manual/factories.sgml,
++ docs/manual/ghostpads.sgml, docs/manual/gstreamer-manual.sgml,
++ docs/manual/helloworld2.sgml, docs/manual/outline.txt,
++ docs/manual/plugins.sgml, docs/manual/programs.sgml,
++ docs/manual/queues.sgml, docs/manual/threads.sgml,
++ docs/manual/typedetection.sgml, docs/manual/utility.sgml,
++ docs/manual/xml.sgml, examples/helloworld2/helloworld2.c,
++ gst/gstpipeline.c, gst/gsttype.c,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mpeg1/parse/mpeg1parse.c: More docs (most of them just
++ empty...) Added automatic pad plugging. Added automatic dynamic
++ pad plugging. Changed some codecs to correctly set their pad
++ types.
++
++2000-08-21 22:57 wtay
++
++ * examples/: helloworld/.cvsignore, helloworld2/.cvsignore: ..
++
++2000-08-21 22:23 wtay
++
++ * examples/helloworld2/: Makefile, helloworld2.c: An example using
++ autoplug. Works for mp3 files only for now.
++
++2000-08-21 22:20 wtay
++
++ * docs/manual/outline.txt, gst/gstbin.c, gst/gstbin.h,
++ gst/gstelement.c, gst/gstelement.h, gst/gstelementfactory.c,
++ gst/gstpipeline.c, gst/gstpipeline.h, gst/gsttype.c, gst/gsttype.h,
++ gst/elements/gstaudiosink.c, gst/elements/gstaudiosink.h,
++ gst/elements/gstelements.c, gst/elements/gsttypefind.c,
++ gst/elements/gsttypefind.h, plugins/filters/median/median.c,
++ plugins/filters/smooth/smooth.c, plugins/mp3decode/xing/gstxing.c,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.c,
++ plugins/mpeg1/parse/mpeg1parse.c, plugins/wav/gstparsewav.c: A
++ first (rude) attempt at autoplug. Autoplugging selects appropriate
++ codecs to connect src to sink, adds them to the pipeline and
++ connect pads. Autoplugging will run the typedetect plugin if the
++ src pad has no MIME type. No autoplugging is done on the src and
++ sink pads, it's hardcoded: connect 'src to sink'. No attempt at
++ creating threads. No attempt at dynamically autoplugging not yet
++ existing pads. Changes to (some) plugins to properly set their
++ MIME types.
++
++2000-08-19 17:36 wtay
++
++ * docs/manual/: factories.sgml, gstreamer-manual.sgml,
++ helloworld.sgml, outline.txt: More manual about MIME types and
++ factories...
++
++2000-08-19 01:34 richardb
++
++ * plugins/mp3decode/xing/libxing/: stamp-h, stamp.h: I'm pretty
++ sure that these are generated files which have no right to be in
++ the CVS. If I'm wrong, and things break, then we'll just have to
++ put them back again.
++
++2000-08-19 01:29 richardb
++
++ * Makefile.am, config.h.in, configure.in, gstplay/Makefile.am,
++ test/Makefile.am: libXv is now linked against by test/* and gstplay
++ if it is present. -lXv isn't leaked all over the place due to
++ AC_CHECK_LIB test. This is still messy though - we shouldn't have
++ to link explicitly with extra things just because we use certain
++ plugins.
++
++ Build Makefile in tests, but don't recurse into tests when doing
++ the build (tests no longer in SUBDIRS).
++
++2000-08-19 00:31 richardb
++
++ * Makefile.am, configure.in: Test for a working libglade-gnome, and
++ compile gstplay only if there is one.
++
++2000-08-18 23:54 wtay
++
++ * AUTHORS, gstplay/gstplay.glade: Richard has been promoted to
++ makefile hacker :-)
++
++2000-08-18 23:17 wtay
++
++ * libs/idct/ieeetest.c: Remove rdts until a better fix for the bad
++ asm is found...
++
++2000-08-18 23:15 wtay
++
++ * gst/gsttrace.c: Removed bad asm call for rdts. Need to fix
++ this...
++
++2000-08-18 23:07 richardb
++
++ * configure.in, plugins/mpeg2/mpeg2enc/Makefile.am: If nasm isn't
++ present, mpeg2enc plugin just ignores the .s files, C equivalents
++ will be used.
++
++2000-08-18 22:57 wtay
++
++ * plugins/mpeg2/mpeg2enc/motion.c: check #ifdef HAVE_NASM to avoid
++ using uncompiled code.
++
++2000-08-18 22:30 richardb
++
++ * acconfig.h, config.h.in, configure.in: Test for nasm - define
++ HAVE_NASM in config.h if we have it, and AC_SUBST NASM_PATH for use
++ when using nasm.
++
++2000-08-18 21:38 wtay
++
++ * docs/manual/helloworld.sgml, examples/helloworld/Makefile,
++ examples/helloworld/helloworld.c: helloworld example. and docs
++
++2000-08-18 21:35 wtay
++
++ * README, gstreamer-config.in, docs/gst/Makefile.am,
++ docs/manual/gstreamer-manual.sgml, editor/editor.c,
++ editor/gsteditorelement.c, gst/Makefile.am, gst/gstbin.c,
++ gst/gstelement.c, gst/gstelement.h, gst/gstobject.h, gst/gstpad.c,
++ gst/gstpipeline.c, gst/gstplugin.c, gst/gstplugin.h, gst/gsttee.c,
++ gst/gstthread.c, gst/elements/gsttypefind.c, gstplay/Makefile.am,
++ gstplay/callbacks.c, gstplay/gstplay.c, libs/getbits/Makefile.am,
++ libs/idct/Makefile.am, libs/putbits/Makefile.am,
++ libs/riff/Makefile.am, plugins/avi/Makefile.am,
++ plugins/avi/gstparseavi.c, plugins/cobin/cobin.c,
++ plugins/mp3decode/mpg123/Makefile.am,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/visualization/smoothwave/smoothwave.c,
++ plugins/visualization/spectrum/gstspectrum.c,
++ plugins/visualization/synaesthesia/synaesthesia.c, tools/launch.c:
++ Various fixes for the build/install problems update to the
++ docs/manual. Added a simple helloworld example.
++
++2000-08-17 07:18 wtay
++
++ * docs/manual/gstreamer-manual.sgml: The book is not published
++ yet... :-)
++
++2000-08-16 22:40 wtay
++
++ * docs/manual/images/.cvsignore: Ignore the png images; they are
++ supposed to be build by the Makefile.
++
++2000-08-16 22:38 wtay
++
++ * docs/manual/: .cvsignore, BUILD, bins.sgml, buffers.sgml,
++ connections.sgml, elements.sgml, goals.sgml, gstreamer-manual.sgml,
++ intro.sgml, motivation.sgml, outline.txt, states.sgml: First draft
++ of Chapter 1 (introduction) and Chapter 2 (basic concepts) of the
++ GStreamer manual.
++
++2000-08-14 16:18 wtay
++
++ * libs/idct/.cvsignore: ignore the test program
++
++2000-08-14 16:17 wtay
++
++ * Makefile.am, autogen.sh, configure.in, docs/Makefile.am,
++ plugins/cobin/cobin.c, plugins/mpeg2/mpeg2enc/gstmpeg2enc.c,
++ plugins/vcdsrc/vcdsrc.c,
++ plugins/visualization/synaesthesia/synaesthesia.c, test/.cvsignore,
++ test/Makefile.am, test/ac3parse.c, test/ac3play.c, test/avi2mpg.c,
++ test/aviparse.c, test/dvdcat.c, test/mp1parse.c, test/mp1tomp1.c,
++ test/mp2toavi.c, test/mp2tomp1.c, test/mp3.c, test/mp3parse.c,
++ test/mp3play.c, test/mpeg2parse.c, test/pipetest.c, test/qtest.c,
++ test/record.c, test/spectrum.c, test/vidcapture.c,
++ test/vidcapture2.c, test/videotest.c, test/wave.c,
++ test/bindings/Makefile.am, test/cothreads/Makefile.am: Build fixes.
++ Adapted the test directory to the new state management added an
++ mpeg2 to avi encoder. added a v4l to divx capture example.
++
++2000-08-14 11:59 wtay
++
++ * configure.in, include/avifmt.h, include/registry.h: The include
++ files for the windows codec loader. top level configure file.
++
++2000-08-14 11:57 wtay
++
++ * gst/: gstbufferpool.c, gstbufferpool.h: Added the bufferpool
++ handler. This object is able to generate buffers and is passed
++ between elements to exchange buffers. Elements can also use this
++ pool to efficiently generate output buffers.
++
++2000-08-14 11:55 wtay
++
++ * gst/: Makefile.am, gstbin.c, gstbin.h, gstbuffer.c, gstbuffer.h,
++ gstelement.h, gstpad.c, gstpipeline.c, gstthread.c,
++ elements/gstaudiosink.c, elements/gstaudiosrc.c,
++ elements/gstdisksrc.c, elements/gstpipefilter.c: State change fixes
++ in the threading element. Added bufferpools.
++
++2000-08-14 11:54 wtay
++
++ * plugins/: mp3decode/mpg123/layer1.c, mp3decode/mpg123/layer3.c,
++ mp3decode/mpg123/tabinit.c, mpeg2/Makefile.am,
++ mpeg2/ac3dec/parse.c, mpeg2/subtitles/.cvsignore,
++ mpeg2/subtitles/Makefile.am, mpeg2/subtitles/Notes.txt,
++ mpeg2/subtitles/mpeg2subt.c, mpeg2/subtitles/mpeg2subt.h,
++ videoscale/videoscale.c: fixes in the mp3 tables. Use subbuffers
++ is possible. Added MPEG2 subtitles.
++
++2000-08-14 11:49 wtay
++
++ * plugins/mpeg2/video/: IEEE1180, Makefile.am, getblk.c, gethdr.c,
++ getpic.c, getvlc.c, gstmpeg2play.c, idct.c, idctref.c, mmxidct.S,
++ mpeg2dec.c, mpeg2dec.h, recon.c, tables.c, test.m2v: Removed IDCT
++ and used the IDCT library.
++
++2000-08-14 11:42 wtay
++
++ * plugins/mpeg2/parse/: mpeg2parse.c, mpeg2parse.h: Use subbufers.
++
++2000-08-14 11:41 wtay
++
++ * plugins/mpeg2/mpeg2enc/: Makefile.am, bdist1_mmx.s, bdist1_sse.s,
++ bdist2_mmx.s, dist1_00_mmx.s, dist1_00_sse.s, dist1_01_mmx.s,
++ dist1_01_sse.s, dist1_10_mmx.s, dist1_10_sse.s, dist1_11_mmx.s,
++ dist1_11_sse.s, dist2_mmx.s, fdist1_00.s, fdist1_mmx.s,
++ gstmpeg2enc.c, idct.c, motion.c, mpeg2enc.c, mpeg2enc.h,
++ predict_mmx.s, qdist1_mmx.s, qdist1_sse.s, quant_mmx.s,
++ quant_non_i_sse.s, quantize.c, ratectl.c, rcdist_mmx.s, tables.c,
++ transfrm.c, variance_mmx.s: Better rate control with different
++ complexity measurement. Merge from mjpeg_beta asm for mmx and sse
++ optimisations. Use the IDCT library.
++
++2000-08-14 11:33 wtay
++
++ * plugins/mpeg2/ac3parse/ac3parse.c: Use subbuffers instead of
++ memcpy.
++
++2000-08-14 11:32 wtay
++
++ * plugins/mpeg1video/parse/: Makefile.am, README, mp1videoparse.c:
++ Use subbufers.
++
++2000-08-14 11:31 wtay
++
++ * plugins/mpeg1/system_encode/: buffer.c, buffer.h,
++ system_encode.c, system_encode.h: Added statup delay. Added
++ padding.
++
++2000-08-14 11:30 wtay
++
++ * plugins/mpeg1/parse/: mpeg1parse.c, mpeg1parse.h: Use subbuffers.
++
++2000-08-14 11:28 wtay
++
++ * plugins/mpeg1/mpeg_play/: Makefile.am, decoders.c, decoders.h,
++ floatdct.c, gstmpeg_play.c, jrevdct.c, mmxidct.S, parseblock.c,
++ util.c, video.c, video.h: Use subbufers and bufferpools. Use the
++ idct library.
++
++2000-08-14 11:25 wtay
++
++ * plugins/mp3decode/parse/mp3parse.c: use subbuffers
++
++2000-08-14 11:23 wtay
++
++ * plugins/capture/v4l/: gstv4lsrc.c, gstv4lsrc.h: Changes for the
++ new state management.
++
++2000-08-14 11:21 wtay
++
++ * plugins/avi/: Makefile.am, audiocodecs.c, gstaviencoder.c,
++ gstparseavi.c, gstparseavi.h, playcodecs.c, videoheader.c,
++ wincodec/.cvsignore, wincodec/Makefile.am, wincodec/gstwincodec.c,
++ wincodec/gstwincodec.h, wincodec/gstwindec.c, wincodec/gstwindec.h,
++ wincodec/gstwinenc.c, wincodec/gstwinenc.h: Separate
++ encoder/decoder plugins for windows codecs.
++
++2000-08-14 11:17 wtay
++
++ * gstplay/gstplay.glade: The UI
++
++2000-08-14 11:16 wtay
++
++ * gstplay/: Makefile.am, avi.c, callbacks.c, codecs.h, gstplay.c,
++ interface.c, interface.h, mpeg1.c, mpeg2.c, pause.xpm, play.xpm,
++ stop.xpm, support.c, support.h: glade based gstplay version.
++ better avi/mpeg support. nice about dialog :-) Drag and drop
++ should work.
++
++2000-08-14 11:12 wtay
++
++ * libs/idct/.cvsignore: ..
++
++2000-08-14 11:11 wtay
++
++ * libs/: Makefile.am, getbits/gstgetbits.c,
++ getbits/gstgetbits_inl.h, idct/Makefile.am, idct/README,
++ idct/dct.h, idct/doieee, idct/fastintidct.c, idct/floatidct.c,
++ idct/gstidct.c, idct/gstidct.h, idct/ieeetest.c, idct/intidct.c,
++ idct/mmx32idct.c, idct/mmxidct.S, putbits/gstputbits.c,
++ riff/gstriff.h, riff/gstriffencode.c: Added general IDCT library.
++ Added IEEE testbed. Update to the windows codec loader. fixes in
++ the riff parser/encoder. cleanup in the getbits/putbits API.
++
++2000-08-05 04:53 omegahacker
++
++ * LICENSE, Makefile.am: Adding explicit license information, since
++ quite a large number of source files don't have the LGPL header.
++ This is something we need to fix. GNOME has a script to run around
++ and fix things, maybe we should snag a copy and let it loose in a
++ sandbox.
++
++2000-07-21 04:57 omegahacker
++
++ * gst/elements/: gstasyncdisksrc.c, gstaudiosink.c, gstaudiosink.h,
++ gstaudiosrc.c, gstaudiosrc.h, gstdisksrc.c, gstdisksrc.h,
++ gstfdsrc.c, gsthttpsrc.c, gsthttpsrc.h, gstpipefilter.c,
++ gstpipefilter.h: Brought standard elements in line with new state
++ management system.
++
++2000-07-17 18:14 omegahacker
++
++ * Makefile.am, autogen.sh, configure.in, docs/Makefile.am,
++ docs/gst/gstreamer-decl.txt, gst/Makefile.am, gst/gstbin.c,
++ gst/gstbin.h, gst/gstclock.c, gst/gstelement.c, gst/gstelement.h,
++ gst/gstpad.c, gst/gstpad.h, gst/gstpipeline.c, gst/gstthread.c,
++ gst/gstthread.h, gst/elements/gstelements.c,
++ gst/elements/gstfakesink.c, gst/elements/gstfakesrc.c,
++ plugins/dvdsrc/.cvsignore, plugins/effects/volume/volume.c,
++ test/fake.c, tests/.cvsignore, tests/Makefile.am, tests/README,
++ tests/init.c, tests/loadall.c, tests/simplefake.c, tests/states.c:
++ Megapatch, changes which states are available, how they're used,
++ and how they're set. Also modifies the scheduling system, breaking
++ pulled buffers. Check mail archives for more details.
++
++2000-07-15 14:26 wtay
++
++ * gst/gstutils.c, gst/gstutils.h, libs/riff/gstriffparse.c,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/mpg123/layer3.c: Fixed a bug in the riff parser
++ with the allignment of the chunks. This should solve the errors
++ with avi playback.
++
++2000-07-15 13:06 wtay
++
++ * configure.in, gstplay/avi.c, gstplay/gstplay.c, gstplay/mpeg1.c,
++ gstplay/mpeg2.c, include/.cvsignore, include/avifmt.h,
++ include/default.h, include/registry.h, libs/Makefile.am,
++ libs/riff/gstriff.h, libs/riff/gstriffparse.c,
++ plugins/avi/.cvsignore, plugins/avi/Makefile.am,
++ plugins/avi/audiocodecs.c, plugins/avi/codectest.c,
++ plugins/avi/gstparseavi.c, plugins/avi/gstparseavi.h,
++ plugins/avi/playcodecs.c, plugins/mp3decode/mpg123/Makefile.am,
++ plugins/mp3decode/mpg123/layer3.c,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg2/parse/mpeg2parse.c: Added DivX ;-) support by using
++ the wine .dll loader. you must unzip binaries.zip from
++ http://divx.euro.ru/binaries.zip into the win32 directory **of the
++ source tree**. Extended and bugfixed thr riff parser to support
++ DivX ;-) Extended the avi parser to support DivX ;-) and MPEG Layer
++ 3. Fixed a bug in mpg123. Sound still is seriously wrong with
++ layer 3. Fixed MPEG2 playback in gstplay. Time indication in
++ gstplay is temporarly broken.
++
++2000-07-13 20:49 wtay
++
++ * gst/gstclock.c, gst/gstthread.c, gst/elements/gstaudiosink.c,
++ gstplay/gstplay.c, gstplay/mpeg2.c, plugins/avi/gstparseavi.c,
++ plugins/mpeg1/mpeg_play/util.c, plugins/mpeg1/mpeg_play/video.c,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg1video/parse/mp1videoparse.h,
++ plugins/mpeg2/video/gethdr.c, plugins/mpeg2/video/gstmpeg2play.c,
++ plugins/mpeg2/video/mpeg2dec.h: Better error recovery in teh MPEG1
++ decoder. Removed MPEG2 stuff from the MPEG1 decoderand make it
++ ignore MPEG2 streams. Some extra framerates in the MPEG2 decoder
++ (from libmpeg2) Round image size up to the nearest multiple of 16
++ (MPEG2 decoder)
++
++2000-07-12 23:52 wtay
++
++ * configure.in, docs/random/states.new, gst/gst.h, gst/gstbin.c,
++ gst/gstbuffer.h, gst/gstclock.c, gst/gstclock.h, gst/gstelement.c,
++ gst/gstelement.h, gst/gstpad.c, gst/gstpad.h, gst/gstpipeline.c,
++ gst/gstthread.c, gst/elements/gstaudiosink.c,
++ gst/elements/gstaudiosink.h, gst/elements/gstqueue.c,
++ gst/elements/gstqueue.h, gstplay/callbacks.c, gstplay/gstplay.c,
++ gstplay/mpeg1.c, include/mmx.h, plugins/avi/playcodecs.c,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/mpg123/gstmpg123.h,
++ plugins/mp3decode/mpg123/layer3.c,
++ plugins/mp3decode/mpg123/mpg123.c,
++ plugins/mp3decode/parse/Makefile.am,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3decode/parse/mp3parse.h,
++ plugins/mp3decode/xing/libxing/Makefile.am,
++ plugins/mpeg1/mpeg_play/Makefile.am,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.h,
++ plugins/mpeg1/mpeg_play/video.c, plugins/mpeg1/mpeg_play/video.h,
++ plugins/mpeg1/parse/mpeg1parse.c, plugins/mpeg1/parse/mpeg1parse.h,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg1video/parse/mp1videoparse.h,
++ plugins/mpeg2/video/Makefile.am, plugins/mpeg2/video/recon.c: This
++ is the audio/video sync release. Changed the mpegvideoparser to
++ parse complete pictures. Added the PTS timestamps to the pictures.
++ Added PTS timestamps to the MPEG audio frames. Made the clock a
++ littlebit better. Gstplay now uses two more threads one for video,
++ one for audio playback. Added the first QoS callbacks for the
++ pads. hopefully fix an mmx compilation problem.
++
++2000-07-05 22:32 wtay
++
++ * config.h.in, configure.in, gstplay/Makefile.am: Added HW scaling
++ and YUV conversion for XFree 4.0 Need to cleanup the fallback
++ mechanism in case no suitable XvImage is found.
++
++2000-07-05 11:21 wtay
++
++ * gstplay/gstplay.h: [no log message]
++
++2000-07-05 11:21 wtay
++
++ * gst/gstbuffer.h, gst/elements/gstaudiosink.c,
++ gst/elements/gstaudiosink.h, gst/elements/gstdisksrc.c,
++ gst/elements/gstdisksrc.h, gst/elements/gstfdsrc.c,
++ gst/elements/gstqueue.c, gstplay/Makefile.am, gstplay/callbacks.c,
++ gstplay/callbacks.h, gstplay/gstplay.c, gstplay/interface.c,
++ gstplay/interface.h, gstplay/main.c, gstplay/mpeg1.c,
++ gstplay/mpeg2.c, plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mpeg1/mpeg_play/Makefile.am,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.h,
++ plugins/mpeg1/mpeg_play/parseblock.c,
++ plugins/mpeg1/mpeg_play/proto.h, plugins/mpeg1/mpeg_play/video.c,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.c,
++ plugins/mpeg1/parse/mpeg1parse.c, plugins/mpeg1/parse/mpeg1parse.h,
++ plugins/mpeg1video/parse/Makefile.am,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg1video/parse/mp1videoparse.h,
++ plugins/mpeg2/ac3dec/Makefile.am, plugins/mpeg2/ac3dec/exponent.c,
++ plugins/mpeg2/ac3parse/Makefile.am,
++ plugins/mpeg2/ac3parse/ac3parse.c, plugins/mpeg2/parse/Makefile.am,
++ plugins/mpeg2/parse/mpeg2parse.c, plugins/mpeg2/parse/mpeg2parse.h,
++ plugins/mpeg2/video/gethdr.c, plugins/mpeg2/video/getpic.c,
++ plugins/mpeg2/video/getvlc.c, plugins/mpeg2/video/recon.c,
++ test/mp2tomp1.c, test/mpeg2parse.c: Added seeking to some of the
++ plugins. some MMX speedups in the MPEG decoders. Better YUV to
++ MMX conversion implemented seeking to gstplay.
++
++2000-06-27 21:22 wtay
++
++ * plugins/mpeg1/mpeg_play/: parseblock.c, video.c: Added half pel
++ interpollation for bidirectionally predicted macroblocks.
++ (players based on mpeg_play should also implement this, as it was
++ left out from the reference decoder, probabliy for performance
++ reasons) Reduced rounding errors in the quatisation of the
++ coeficients.
++
++2000-06-25 23:23 wtay
++
++ * gstplay/.cvsignore: [no log message]
++
++2000-06-25 23:21 wtay
++
++ * gstplay/Makefile.am, gstplay/codecs.h, gstplay/main.c,
++ gstplay/mpeg2.c, plugins/mp3decode/xing/libxing/Makefile.am,
++ plugins/mpeg1/parse/mpeg1parse.c, plugins/mpeg2/parse/mpeg2parse.c:
++ Added more accurate mpeg system stream detection (MPEG1 and MPEG2)
++ Added mpeg2 playback for gstplay
++
++2000-06-25 22:37 wtay
++
++ * configure.in, gst/gstpad.c, gst/gstpad.h, gst/gsttypefind.c,
++ gst/gsttypefind.h, gst/elements/Makefile.am,
++ gst/elements/gstaudiosink.h, gst/elements/gstdisksrc.c,
++ gst/elements/gstelements.c, gst/elements/gstqueue.c,
++ gst/elements/gsttypefind.c, gst/elements/gsttypefind.h,
++ gst/types/gsttypes.c, gstplay/Makefile.am, gstplay/avi.c,
++ gstplay/callbacks.c, gstplay/callbacks.h, gstplay/codecs.h,
++ gstplay/interface.c, gstplay/interface.h, gstplay/main.c,
++ gstplay/mpeg1.c, gstplay/support.c, gstplay/support.h,
++ gstplay/pixmaps/pause.xpm, gstplay/pixmaps/play.xpm,
++ gstplay/pixmaps/stop.xpm, libs/riff/gstriffparse.c,
++ plugins/avi/Makefile.am, plugins/avi/gstaviencoder.c,
++ plugins/avi/gstparseavi.c, plugins/avi/gstparseavi.h,
++ plugins/avi/playcodecs.c, plugins/avi/videoheader.c,
++ plugins/filters/median/median.c, plugins/filters/median/median.h,
++ plugins/filters/smooth/smooth.c, plugins/filters/smooth/smooth.h,
++ plugins/jpeg/gstjpeg.c, plugins/jpeg/gstjpegdec.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.h,
++ plugins/mpeg1/mpeg_play/parseblock.c,
++ plugins/mpeg1/mpeg_play/util.c, plugins/mpeg1/mpeg_play/video.c,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.c,
++ plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1/system_encode/system_encode.c,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg2/mpeg2enc/putseq.c, plugins/mpeg2/video/mpeg2dec.c,
++ plugins/wav/gstparsewav.c, test/avi2mpg.c, test/aviparse.c,
++ test/mp1parse.c, test/vidcapture.c: Switched Cr and Cb in YUV2RGB
++ fixed the avi parser (gstriff had wrong size) the system_encoder
++ can now do video only system streams sanitized the colorspace and
++ scaler api. added fast self modifying asm scaler. worked on the
++ typefind stuff. added a cool media player (gstplay) it uses the
++ typefinder to playback avi, mpeg1 (system and video) streams. It
++ is also a testbed and a real app.
++
++2000-06-18 15:13 wtay
++
++ * plugins/mpeg1/mpeg_play/: Makefile.am, idct_block_mmx.S,
++ mmxidct.S, parseblock.c, proto.h, video.c: Fixed MMX IDCT precision
++ bug.
++
++2000-06-18 14:51 wtay
++
++ * plugins/avi/videoheader.c: Construct the avi header based on the
++ codec type.
++
++2000-06-18 14:50 wtay
++
++ * gst/elements/gstqueue.c, plugins/avi/Makefile.am,
++ plugins/avi/gstaviencoder.c, plugins/avi/gstaviencoder.h,
++ plugins/avi/gstparseavi.c, plugins/capture/v4l/gstv4lsrc.c,
++ plugins/mpeg2/parse/mpeg2parse.c, plugins/mpeg2/video/getblk.c,
++ plugins/mpeg2/video/getpic.c, plugins/mpeg2/video/mmxidct.S,
++ plugins/mpeg2/video/mpeg2dec.h, plugins/mpeg2/video/tables.c,
++ test/mp2tomp1.c, test/vidcapture.c: Fixed an MMX IDCT bug. Fixed a
++ color conversion bug. Initial work for multiply avi codecs.
++
++2000-06-16 23:58 wtay
++
++ * configure.in, libs/Makefile.am, libs/putbits/.cvsignore,
++ libs/putbits/Makefile.am, libs/putbits/gstputbits.c,
++ libs/putbits/gstputbits.h, plugins/mpeg1/mpegaudio/Makefile.am,
++ plugins/mpeg1/mpegaudio/common.c,
++ plugins/mpeg1/mpegaudio/encoder.h,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.c,
++ plugins/mpeg1/mpegaudio/gstputbits.c,
++ plugins/mpeg1/mpegaudio/gstputbits.h,
++ plugins/mpeg1/mpegaudio/musicin.h,
++ plugins/mpeg2/mpeg2enc/Makefile.am,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.c,
++ plugins/mpeg2/mpeg2enc/gstputbits.c,
++ plugins/mpeg2/mpeg2enc/gstputbits.h,
++ plugins/mpeg2/mpeg2enc/mpeg2enc.h, plugins/mpeg2/mpeg2enc/puthdr.c,
++ plugins/mpeg2/mpeg2enc/putpic.c, plugins/mpeg2/mpeg2enc/putseq.c,
++ plugins/mpeg2/mpeg2enc/ratectl.c,
++ plugins/mpeg2/video/gstmpeg2play.c: Unified putbits.
++
++2000-06-16 23:33 wtay
++
++ * plugins/mpeg1/mpegaudio/.cvsignore: [no log message]
++
++2000-06-16 23:32 wtay
++
++ * plugins/mpeg2/mpeg2enc/: gstputbits.c, gstputbits.h, putbits.c,
++ putbits.h: putbits implementation
++
++2000-06-16 23:30 wtay
++
++ * configure.in, plugins/mpeg1/Makefile.am,
++ plugins/mpeg1/mpegaudio/Makefile.am,
++ plugins/mpeg1/mpegaudio/README.crh,
++ plugins/mpeg1/mpegaudio/common.c, plugins/mpeg1/mpegaudio/common.h,
++ plugins/mpeg1/mpegaudio/encode.c,
++ plugins/mpeg1/mpegaudio/encoder.h,
++ plugins/mpeg1/mpegaudio/fixes.txt,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.c,
++ plugins/mpeg1/mpegaudio/gstmpegaudio.h,
++ plugins/mpeg1/mpegaudio/gstputbits.c,
++ plugins/mpeg1/mpegaudio/gstputbits.h,
++ plugins/mpeg1/mpegaudio/musicin.c,
++ plugins/mpeg1/mpegaudio/musicin.h, plugins/mpeg1/mpegaudio/psy.c,
++ plugins/mpeg1/mpegaudio/readme.txt,
++ plugins/mpeg1/mpegaudio/release.txt,
++ plugins/mpeg1/mpegaudio/subs.c, plugins/mpeg1/mpegaudio/tonal.c,
++ plugins/mpeg1/system_encode/buffer.c,
++ plugins/mpeg1/system_encode/system_encode.c,
++ plugins/mpeg1/system_encode/system_encode.h,
++ plugins/mpeg2/mpeg2enc/Makefile.am,
++ plugins/mpeg2/mpeg2enc/mpeg2enc.c,
++ plugins/mpeg2/mpeg2enc/mpeg2enc.h, plugins/mpeg2/mpeg2enc/puthdr.c,
++ plugins/mpeg2/mpeg2enc/putmpg.c, plugins/mpeg2/mpeg2enc/putpic.c,
++ plugins/mpeg2/mpeg2enc/putseq.c, plugins/mpeg2/mpeg2enc/putvlc.c,
++ plugins/mpeg2/mpeg2enc/ratectl.c, test/mp2tomp1.c: Added SCR and
++ mux_rate calculations in the MPEG1 multiplexer. worked toward a
++ unified putbits implementation Added an MPEG audio layer 1&2
++ encoder.
++
++2000-06-12 22:27 wtay
++
++ * plugins/capture/v4l/gstv4lsrc.c, plugins/capture/v4l/gstv4lsrc.h,
++ plugins/mpeg1/system_encode/buffer.c,
++ plugins/mpeg2/mpeg2enc/predict.c,
++ plugins/mpeg2/mpeg2enc/transfrm.c, plugins/videoscale/Makefile.am,
++ plugins/videoscale/videoscale.c, plugins/videoscale/videoscale.h,
++ test/mp1parse.c, test/mp2tomp1.c: Reworked the colorspace converter
++ and the scaler API. Fixed some MMX bugs in the mpeg encoder.
++
++2000-06-11 13:11 wtay
++
++ * configure.in, gst/elements/gstpipefilter.c,
++ plugins/audioscale/audioscale.c, plugins/audioscale/audioscale.h,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3decode/parse/mp3parse.h, plugins/mpeg1/Makefile.am,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.h,
++ plugins/mpeg1/mpeg_play/parseblock.c,
++ plugins/mpeg1/mpeg_play/video.c, plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1/system_encode/.cvsignore,
++ plugins/mpeg1/system_encode/Makefile.am,
++ plugins/mpeg1/system_encode/buffer.c,
++ plugins/mpeg1/system_encode/buffer.h,
++ plugins/mpeg1/system_encode/main.h,
++ plugins/mpeg1/system_encode/system_encode.c,
++ plugins/mpeg1/system_encode/system_encode.h,
++ plugins/mpeg1/system_encode/systems.c,
++ plugins/mpeg2/ac3parse/ac3parse.c,
++ plugins/mpeg2/ac3parse/ac3parse.h,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.c,
++ plugins/mpeg2/mpeg2enc/motion.c, plugins/mpeg2/mpeg2enc/mpeg2enc.c,
++ plugins/mpeg2/mpeg2enc/mpeg2enc.h,
++ plugins/mpeg2/mpeg2enc/predict.c, plugins/mpeg2/mpeg2enc/putpic.c,
++ plugins/mpeg2/video/gstmpeg2play.c, test/aviparse.c,
++ test/mp1parse.c, test/mp2tomp1.c: Reworked the audio resampler.
++ Added first frames skipping to the mp3 and ac3 parser (this allows
++ you to skip a number of frames before pushing them). Removed wrong
++ mmx code from the encoder. Added Macroblocks per slice to the
++ encoder. added bilinear and bicubic interpolation to the
++ videoscaler. Added a MPEG1 multiplexer (no SCR or mux rate
++ calculations yet) Added some options (framerate to the
++ encoder/decoder)
++
++2000-06-04 20:18 richardb
++
++ * include/mmx.h: Add a missing ; in the BROKEN_PAND implementation.
++
++2000-05-28 23:46 wtay
++
++ * gst/elements/gstpipefilter.c, gst/elements/gstpipefilter.h,
++ plugins/audioscale/audioscale.c, plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg2/parse/mpeg2parse.c, plugins/mpeg2/parse/mpeg2parse.h,
++ test/.cvsignore, test/mp2tomp1.c: Rewrote the mpeg2 system parser
++ like the mpeg1 parser. Added a command property to the pipefilter.
++
++2000-05-28 21:04 wtay
++
++ * gst/elements/gstpipefilter.c, gst/elements/gstpipefilter.h,
++ plugins/audioscale/.cvsignore, test/pipetest.c: Added a basic
++ element: pipefilter. This element connects the stdin/stdout of an
++ external program into the pipeline. We now have virtually all of
++ the capabilities of sox, lame, ...
++
++2000-05-28 20:59 wtay
++
++ * configure.in, gst/elements/Makefile.am,
++ gst/elements/gstelements.c, plugins/audioscale/Makefile.am,
++ plugins/audioscale/audioscale.c, plugins/audioscale/audioscale.h,
++ plugins/mpeg1/mpeg_play/parseblock.c,
++ plugins/mpeg1/mpeg_play/video.c, plugins/mpeg1/mpeg_play/video.h,
++ plugins/mpeg1/parse/mpeg1parse.c, plugins/mpeg1/parse/mpeg1parse.h,
++ plugins/mpeg2/mpeg2enc/Makefile.am,
++ plugins/mpeg2/mpeg2enc/motion.c, plugins/mpeg2/mpeg2enc/mpeg2enc.c,
++ plugins/mpeg2/mpeg2enc/predict.c, plugins/mpeg2/mpeg2enc/putpic.c,
++ plugins/mpeg2/mpeg2enc/ratectl.c,
++ plugins/mpeg2/mpeg2enc/transfrm.c, plugins/videoscale/videoscale.c,
++ plugins/videoscale/videoscale.h, test/Makefile.am, test/avi2mpg.c,
++ test/mp2tomp1.c: Rewrote the mpeg1 system stream parser. Fixed a
++ motion compensation bug (was a bug on Intels site)
++ Faster/Better/more accurate motion detection in the mpeg encoder
++ Added an audio resampler (convert 48000 kHz to 44100 for example)
++ does not work Fixed rate control in the mpeg2 encoder.
++
++2000-05-21 23:00 wtay
++
++ * docs/gst/.cvsignore: Added gstreamer.types to the .cvsignore
++
++2000-05-21 22:59 wtay
++
++ * test/mp1tomp1.c: An MPEG1 transcoder.
++
++2000-05-21 22:58 wtay
++
++ * configure.in, docs/gst/gstreamer-decl.txt,
++ docs/gst/gstreamer.hierarchy, docs/gst/tmpl/gsthttpsrc.sgml,
++ docs/gst/tmpl/gstreamer-unused.sgml, gst/gstbuffer.h,
++ gst/elements/gstqueue.c, plugins/Makefile.am,
++ plugins/capture/v4l/gstv4lsrc.c, plugins/filters/Makefile.am,
++ plugins/filters/median/.cvsignore,
++ plugins/filters/median/Makefile.am,
++ plugins/filters/median/median.c, plugins/filters/median/median.h,
++ plugins/filters/smooth/.cvsignore,
++ plugins/filters/smooth/Makefile.am,
++ plugins/filters/smooth/smooth.c, plugins/filters/smooth/smooth.h,
++ plugins/jpeg/gstjpegenc.c, plugins/mpeg1/Makefile.am,
++ plugins/mpeg1/mpeg1encoder/.cvsignore,
++ plugins/mpeg1/mpeg1encoder/CHANGES,
++ plugins/mpeg1/mpeg1encoder/Makefile.am,
++ plugins/mpeg1/mpeg1encoder/PORTABILITY,
++ plugins/mpeg1/mpeg1encoder/README,
++ plugins/mpeg1/mpeg1encoder/SETUP,
++ plugins/mpeg1/mpeg1encoder/chendct.c,
++ plugins/mpeg1/mpeg1encoder/codec.c,
++ plugins/mpeg1/mpeg1encoder/csize.h,
++ plugins/mpeg1/mpeg1encoder/ctables.h,
++ plugins/mpeg1/mpeg1encoder/dct.h,
++ plugins/mpeg1/mpeg1encoder/globals.h,
++ plugins/mpeg1/mpeg1encoder/gstmpeg1encoder.c,
++ plugins/mpeg1/mpeg1encoder/gstmpeg1encoder.h,
++ plugins/mpeg1/mpeg1encoder/htable.lex,
++ plugins/mpeg1/mpeg1encoder/huffman.c,
++ plugins/mpeg1/mpeg1encoder/huffman.h,
++ plugins/mpeg1/mpeg1encoder/io.c,
++ plugins/mpeg1/mpeg1encoder/lex.yy.c,
++ plugins/mpeg1/mpeg1encoder/lexer.c,
++ plugins/mpeg1/mpeg1encoder/lexer.l,
++ plugins/mpeg1/mpeg1encoder/marker.c,
++ plugins/mpeg1/mpeg1encoder/marker.h,
++ plugins/mpeg1/mpeg1encoder/me.c, plugins/mpeg1/mpeg1encoder/mem.c,
++ plugins/mpeg1/mpeg1encoder/mem.h,
++ plugins/mpeg1/mpeg1encoder/mpeg.c,
++ plugins/mpeg1/mpeg1encoder/param.h,
++ plugins/mpeg1/mpeg1encoder/prototypes.h,
++ plugins/mpeg1/mpeg1encoder/putbits.c,
++ plugins/mpeg1/mpeg1encoder/putbits.h,
++ plugins/mpeg1/mpeg1encoder/qtables.h,
++ plugins/mpeg1/mpeg1encoder/size.h,
++ plugins/mpeg1/mpeg1encoder/stat.c,
++ plugins/mpeg1/mpeg1encoder/stream.c,
++ plugins/mpeg1/mpeg1encoder/stream.h,
++ plugins/mpeg1/mpeg1encoder/system.h,
++ plugins/mpeg1/mpeg1encoder/tables.h,
++ plugins/mpeg1/mpeg1encoder/transform.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.h,
++ plugins/mpeg1/mpeg_play/parseblock.c,
++ plugins/mpeg1/mpeg_play/util.c, plugins/mpeg1/mpeg_play/video.h,
++ plugins/mpeg2/mpeg2enc/motion.c, plugins/mpeg2/mpeg2enc/mpeg2enc.c,
++ plugins/mpeg2/mpeg2enc/mpeg2enc.h,
++ plugins/mpeg2/mpeg2enc/predict.c, plugins/mpeg2/mpeg2enc/putpic.c,
++ plugins/mpeg2/mpeg2enc/putseq.c, plugins/mpeg2/mpeg2enc/ratectl.c,
++ plugins/mpeg2/video/mmxidct.S, plugins/mpeg2/video/mpeg2dec.h,
++ plugins/vcdsrc/vcdsrc.c, test/Makefile.am, test/avi2mpg.c,
++ test/mp2tomp1.c, test/vidcapture.c: Fixed the mpeg2 encoder. Added
++ MMX optimisations for motion estimation. Added another mpeg1
++ encoder. Added Two filters: smooth and median (a median cut
++ filter) Made the queue pull buffers.
++
++2000-05-17 23:49 richardb
++
++ * plugins/Makefile.am: Always build videosink, now that the
++ dependency on gdk_pixbuf is removed.
++
++2000-05-13 10:41 richardb
++
++ * plugins/Makefile.am: Make videosink compiled only if
++ HAVE_GDK_PIXBUF again.
++
++2000-05-12 18:41 wtay
++
++ * plugins/videoscale/.cvsignore: ...
++
++2000-05-12 18:39 wtay
++
++ * plugins/videoscale/Makefile.am, plugins/videoscale/videoscale.c,
++ plugins/videoscale/videoscale.h, test/mp2tomp1.c: A simple video
++ scaler as a library and an Element. Also a little non working mpeg2
++ to mpeg1 converter (still struggling with the quantisation).
++
++2000-05-12 18:33 wtay
++
++ * configure.in, gst/gstclock.c, libs/Makefile.am,
++ plugins/Makefile.am, plugins/capture/v4l/grab-v4l.c,
++ plugins/capture/v4l/gstv4lsrc.c, plugins/jpeg/gstjpegdec.c,
++ plugins/jpeg/gstjpegdec.h, plugins/jpeg/gstjpegenc.c,
++ plugins/jpeg/gstjpegenc.h, plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.c,
++ plugins/mpeg2/mpeg2enc/motion.c, plugins/mpeg2/mpeg2enc/mpeg2enc.c,
++ plugins/mpeg2/mpeg2enc/mpeg2enc.h, plugins/mpeg2/mpeg2enc/putpic.c,
++ plugins/mpeg2/mpeg2enc/putseq.c, plugins/mpeg2/mpeg2enc/ratectl.c,
++ plugins/mpeg2/parse/mpeg2parse.c, plugins/mpeg2/video/getpic.c,
++ plugins/mpeg2/video/gstmpeg2play.c, test/.cvsignore,
++ test/Makefile.am, test/mp1parse.c, test/mpeg2parse.c: More changes
++ to the mpeg parser and encoder. It seems like the mpeg2 decoder
++ does not like some MPEG1 videos. Use mpeg_play for now (eg.
++ AlienSong)
++
++2000-05-12 08:15 richardb
++
++ * acconfig.h, config.h.in, configure.in, docs/gst/Makefile.am,
++ docs/gst/gstreamer-decl.txt, docs/gst/gstreamer.hierarchy,
++ docs/gst/gstreamer.types, docs/gst/gstreamer.types.in,
++ docs/gst/tmpl/gsthttpsrc.sgml, docs/gst/tmpl/gstreamer-unused.sgml,
++ plugins/Makefile.am: Make GDK pixbuf optional, by compiling
++ videosink only if it is present. Make documentation generated
++ successfully even if libghttp isn't present (by skipping the
++ ghttpsrc stuff).
++
++2000-05-12 08:09 richardb
++
++ * plugins/capture/v4l/gstv4lsrc.c: Remove "stderr," from a DEBUG
++ macro call, so it compiles with debug on.
++
++2000-05-02 00:22 wtay
++
++ * docs/gst/.cvsignore, plugins/mp3decode/mpg123/mpg123.c,
++ plugins/mpeg1/mpeg_play/video.c, test/.cvsignore: Fixed some build
++ errors.
++
++2000-05-02 00:09 wtay
++
++ * configure.in, libs/getbits/gstgetbits.h,
++ libs/getbits/gstgetbits_inl.h, plugins/avi/gstaviencoder.c,
++ plugins/avi/gstparseavi.c, plugins/jpeg/gstjpegdec.c,
++ plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg2/Makefile.am, plugins/mpeg2/ac3dec/ac3dec.c,
++ plugins/mpeg2/ac3parse/ac3parse.c,
++ plugins/mpeg2/mpeg2enc/.cvsignore, plugins/mpeg2/mpeg2enc/CHANGES,
++ plugins/mpeg2/mpeg2enc/Makefile.am, plugins/mpeg2/mpeg2enc/TODO,
++ plugins/mpeg2/mpeg2enc/conform.c, plugins/mpeg2/mpeg2enc/fdctref.c,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.c,
++ plugins/mpeg2/mpeg2enc/gstmpeg2enc.h,
++ plugins/mpeg2/mpeg2enc/idct.c, plugins/mpeg2/mpeg2enc/motion.c,
++ plugins/mpeg2/mpeg2enc/mpeg2enc.c,
++ plugins/mpeg2/mpeg2enc/mpeg2enc.h,
++ plugins/mpeg2/mpeg2enc/predict.c, plugins/mpeg2/mpeg2enc/putbits.c,
++ plugins/mpeg2/mpeg2enc/putbits.h, plugins/mpeg2/mpeg2enc/puthdr.c,
++ plugins/mpeg2/mpeg2enc/putmpg.c, plugins/mpeg2/mpeg2enc/putpic.c,
++ plugins/mpeg2/mpeg2enc/putseq.c, plugins/mpeg2/mpeg2enc/putvlc.c,
++ plugins/mpeg2/mpeg2enc/quantize.c,
++ plugins/mpeg2/mpeg2enc/ratectl.c, plugins/mpeg2/mpeg2enc/readpic.c,
++ plugins/mpeg2/mpeg2enc/stats.c, plugins/mpeg2/mpeg2enc/tables.c,
++ plugins/mpeg2/mpeg2enc/transfrm.c, plugins/mpeg2/mpeg2enc/vlc.h,
++ plugins/mpeg2/parse/mpeg2parse.c, plugins/mpeg2/parse/mpeg2parse.h,
++ plugins/mpeg2/video/Makefile.am, plugins/mpeg2/video/getblk.c,
++ plugins/mpeg2/video/gethdr.c, plugins/mpeg2/video/getpic.c,
++ plugins/mpeg2/video/getvlc.c, plugins/mpeg2/video/gstmpeg2play.c,
++ plugins/mpeg2/video/mpeg2dec.c, plugins/mpeg2/video/mpeg2dec.h,
++ plugins/mpeg2/video/recon.c, plugins/mpeg2/video/store.c,
++ plugins/mpeg2/video/systems.c, test/Makefile.am, test/avi2mpg.c,
++ test/mp1parse.c, test/mpeg2parse.c: MPEG2 decoder fixes, unified
++ MPEG System stream parser. an mpeg encoder.
++
++2000-04-24 21:51 wtay
++
++ * configure.in, libs/getbits/gstgetbits_inl.h,
++ plugins/mpeg1/mpeg_play/decoders.c,
++ plugins/mpeg1/mpeg_play/decoders.h,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/parseblock.c,
++ plugins/mpeg1/mpeg_play/proto.h, plugins/mpeg1/mpeg_play/util.c,
++ plugins/mpeg1/mpeg_play/util.h, plugins/mpeg1/mpeg_play/video.c,
++ plugins/mpeg1/mpeg_play/video.h,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg2/Makefile.am, plugins/mpeg2/parse/Makefile.am,
++ plugins/mpeg2/parse/getbits.c, plugins/mpeg2/parse/getbits.h,
++ plugins/mpeg2/parse/mpeg2parse.c, plugins/mpeg2/parse/mpeg2parse.h,
++ plugins/mpeg2/video/.cvsignore, plugins/mpeg2/video/CHANGES,
++ plugins/mpeg2/video/EXAMPLES, plugins/mpeg2/video/IEEE1180,
++ plugins/mpeg2/video/Makefile.am, plugins/mpeg2/video/README,
++ plugins/mpeg2/video/SPATIAL.DOC, plugins/mpeg2/video/TODO,
++ plugins/mpeg2/video/getblk.c, plugins/mpeg2/video/gethdr.c,
++ plugins/mpeg2/video/getpic.c, plugins/mpeg2/video/getvlc.c,
++ plugins/mpeg2/video/getvlc.h, plugins/mpeg2/video/gstmpeg2play.c,
++ plugins/mpeg2/video/gstmpeg2play.h, plugins/mpeg2/video/idct.c,
++ plugins/mpeg2/video/idctref.c, plugins/mpeg2/video/mmxidct.S,
++ plugins/mpeg2/video/motion.c, plugins/mpeg2/video/mpeg2dec.c,
++ plugins/mpeg2/video/mpeg2dec.h, plugins/mpeg2/video/recon.c,
++ plugins/mpeg2/video/spatscal.c, plugins/mpeg2/video/store.c,
++ plugins/mpeg2/video/subspic.c, plugins/mpeg2/video/systems.c,
++ plugins/mpeg2/video/tables.c, plugins/mpeg2/video/test.m2v,
++ test/mp1parse.c, test/mpeg2parse.c: Added the mpeg2dec MPEG1 and
++ MPEG2 decoder.
++
++2000-04-17 00:33 wtay
++
++ * libs/getbits/gstgetbits_inl.h, plugins/mpeg2/ac3dec/exponent.c,
++ plugins/mpeg2/ac3dec/mantissa.c: Fixed a bug in the inlined
++ getbits.
++
++2000-04-17 00:25 wtay
++
++ * plugins/mpeg2/ac3dec/: Makefile.am, ac3dec.c, ac3dec.h,
++ getbits.c, getbits.h, mantissa.c, mantissa.h, parse.c, parse.h:
++ Reworked the ac3decoder for the new getbits functions. We are now
++ about 50% faster than the LIVID AC3 decoder (16% against 24% CPU
++ time)
++
++2000-04-16 19:51 wtay
++
++ * libs/getbits/.cvsignore: [no log message]
++
++2000-04-16 19:50 wtay
++
++ * libs/getbits/: Makefile.am, gstgetbits.c, gstgetbits.h,
++ gstgetbits_inl.h: I the generc getbits implementation
++
++2000-04-16 19:47 wtay
++
++ * configure.in, docs/gst/gstreamer-decl.txt,
++ docs/gst/tmpl/gstreamer-unused.sgml, libs/Makefile.am,
++ plugins/Makefile.am, plugins/mp3decode/mpg123/Makefile.am,
++ plugins/mp3decode/mpg123/common.c,
++ plugins/mp3decode/mpg123/getbits.c,
++ plugins/mp3decode/mpg123/getbits.h,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/mpg123/layer1.c,
++ plugins/mp3decode/mpg123/layer2.c,
++ plugins/mp3decode/mpg123/layer3.c,
++ plugins/mp3decode/mpg123/mpg123.c,
++ plugins/mp3decode/mpg123/mpg123.h,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3decode/parse/mp3parse.h,
++ plugins/mpeg1/mpeg_play/Makefile.am,
++ plugins/mpeg1/mpeg_play/ctrlbar.c,
++ plugins/mpeg1/mpeg_play/ctrlbar.h,
++ plugins/mpeg1/mpeg_play/decoders.c,
++ plugins/mpeg1/mpeg_play/decoders.h,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/motionvector.c,
++ plugins/mpeg1/mpeg_play/parseblock.c,
++ plugins/mpeg1/mpeg_play/util.c, plugins/mpeg1/mpeg_play/util.h,
++ plugins/mpeg1/mpeg_play/video.c, plugins/mpeg1/mpeg_play/video.h,
++ plugins/mpeg1/parse/Makefile.am, plugins/mpeg1/parse/README,
++ plugins/mpeg1/parse/getbits.c, plugins/mpeg1/parse/getbits.h,
++ plugins/mpeg1/parse/mpeg1parse.c, plugins/mpeg1/parse/mpeg1parse.h,
++ plugins/mpeg1video/parse/mp1videoparse.c, test/mp3play.c: Unified
++ getbits handling. I currently have an inline integer
++ implementation.
++
++2000-04-13 22:59 wtay
++
++ * Makefile.am, configure.in, gst/gstclock.c,
++ plugins/capture/v4l/grab-v4l.c, test/Makefile.am,
++ test/mpeg2parse.c, test/videotest.c: Makefile.am fixes
++
++2000-04-09 22:38 wtay
++
++ * gst/: gstclock.c, gstclock.h: A poor mans clock...
++
++2000-04-09 22:36 wtay
++
++ * gst/Makefile.am, gst/gstelement.c,
++ gst/elements/gstasyncdisksrc.c, gst/elements/gstaudiosink.c,
++ gst/elements/gstaudiosink.h, gst/elements/gstqueue.c,
++ plugins/capture/v4l/gstv4lsrc.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/proto.h, plugins/mpeg1/mpeg_play/util.c,
++ plugins/mpeg1/mpeg_play/video.c, test/mp1parse.c: Added MMX
++ optimized yuv2rgb (AlienSong now plays back at only 6% CPU) Added
++ mpeg1 picture skipping and fixed a buffer overflow. Added a system
++ clock. The audiosink can now adjust the clock. Fixed incorrect
++ behaviour on 8, 15, 16, 24 and 32 bits displays. Cleanup of the
++ videosink, it now uses the color conversion library when needed.
++
++2000-04-02 22:38 wtay
++
++ * libs/riff/: gstriffencode.c, gstriffparse.c, gstriffutil.c: The
++ new riff parser and encoder
++
++2000-04-02 22:36 wtay
++
++ * configure.in, libs/Makefile.am, libs/riff/Makefile.am,
++ libs/riff/gstriff.h, plugins/avi/gstaviencoder.c,
++ plugins/avi/gstaviencoder.h, plugins/avi/gstparseavi.c,
++ plugins/avi/gstparseavi.h, plugins/capture/v4l/grab-v4l.c,
++ plugins/capture/v4l/gstv4lsrc.c, plugins/capture/v4l/gstv4lsrc.h,
++ plugins/jpeg/Makefile.am, plugins/jpeg/gstjpegdec.c,
++ plugins/jpeg/gstjpegdec.h, plugins/jpeg/gstjpegenc.c,
++ plugins/jpeg/gstjpegenc.h, plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ test/Makefile.am, test/aviparse.c, test/vidcapture.c: Added a
++ colorspace library and removed yuv2rgb conversion from the
++ videosink. The aviencoder should now more or less work.
++
++2000-03-27 20:53 wtay
++
++ * docs/Makefile.am, docs/gst/Makefile.am,
++ docs/gst/gstreamer-decl.txt, docs/gst/gstreamer-docs.sgml,
++ docs/gst/gstreamer-sections.txt, docs/gst/gstreamer.hierarchy,
++ docs/gst/gstreamer.types, docs/gst/tmpl/audioraw.sgml,
++ docs/gst/tmpl/cothreads.sgml, docs/gst/tmpl/gst.sgml,
++ docs/gst/tmpl/gstasyncdisksrc.sgml,
++ docs/gst/tmpl/gstaudiosink.sgml, docs/gst/tmpl/gstaudiosrc.sgml,
++ docs/gst/tmpl/gstbin.sgml, docs/gst/tmpl/gstbuffer.sgml,
++ docs/gst/tmpl/gstconnection.sgml, docs/gst/tmpl/gstdisksrc.sgml,
++ docs/gst/tmpl/gstelement.sgml, docs/gst/tmpl/gstesdsink.sgml,
++ docs/gst/tmpl/gstfakesink.sgml, docs/gst/tmpl/gstfakesrc.sgml,
++ docs/gst/tmpl/gstfdsink.sgml, docs/gst/tmpl/gstfdsrc.sgml,
++ docs/gst/tmpl/gstfilter.sgml, docs/gst/tmpl/gsthttpsrc.sgml,
++ docs/gst/tmpl/gstidentity.sgml, docs/gst/tmpl/gstlog.sgml,
++ docs/gst/tmpl/gstmeta.sgml, docs/gst/tmpl/gstobject.sgml,
++ docs/gst/tmpl/gstpad.sgml, docs/gst/tmpl/gstpipeline.sgml,
++ docs/gst/tmpl/gstplugin.sgml, docs/gst/tmpl/gstqueue.sgml,
++ docs/gst/tmpl/gstreamer-unused.sgml, docs/gst/tmpl/gstsinesrc.sgml,
++ docs/gst/tmpl/gstsink.sgml, docs/gst/tmpl/gstsrc.sgml,
++ docs/gst/tmpl/gsttee.sgml, docs/gst/tmpl/gstthread.sgml,
++ docs/gst/tmpl/gsttrace.sgml, docs/gst/tmpl/gsttype.sgml,
++ docs/gst/tmpl/gstutils.sgml, docs/gst/tmpl/gstxml.sgml,
++ docs/gst/tmpl/plugin.sgml, docs/gst/tmpl/spectrum.sgml,
++ docs/gst/tmpl/videoraw.sgml, gst/gstbin.c, gst/gstbuffer.c,
++ gst/gstbuffer.h, gst/gstelement.c, gst/gstelement.h,
++ gst/gstfilter.h, gst/gstobject.c, gst/gstobject.h, gst/gstpad.c,
++ gst/gstpad.h, gst/gstplugin.c, gst/gstsink.c, gst/gstsink.h,
++ gst/gstsrc.c, gst/gstsrc.h, gst/gsttee.c, gst/gstthread.c,
++ gst/gstxml.c, gst/elements/gstasyncdisksrc.h,
++ gst/elements/gstaudiosink.c, gst/elements/gstaudiosink.h,
++ gst/elements/gstaudiosrc.c, gst/elements/gstaudiosrc.h,
++ gst/elements/gstdisksrc.c, gst/elements/gstesdsink.h,
++ gst/elements/gstfakesink.c, gst/elements/gstfakesink.h,
++ gst/elements/gstfakesrc.c, gst/elements/gstfakesrc.h,
++ gst/elements/gstfdsink.c, gst/elements/gstfdsink.h,
++ gst/elements/gstfdsrc.c, gst/elements/gstidentity.c,
++ gst/elements/gstidentity.h, gst/elements/gstqueue.c,
++ gst/elements/gstqueue.h, gst/elements/gstsinesrc.c,
++ gst/elements/gstsinesrc.h, gst/elements/gsttypefind.h,
++ plugins/avi/Makefile.am, plugins/avi/gstaviencoder.c,
++ plugins/avi/gstaviencoder.h, plugins/avi/gstparseavi.c,
++ plugins/avi/gstparseavi.h, plugins/capture/v4l/Makefile.am,
++ plugins/capture/v4l/grab-v4l.c, plugins/capture/v4l/gstv4lsrc.c,
++ plugins/capture/v4l/gstv4lsrc.h, plugins/jpeg/Makefile.am,
++ plugins/jpeg/gstjpeg.c, plugins/jpeg/gstjpegdec.c,
++ plugins/jpeg/gstjpegdec.h, plugins/jpeg/gstjpegenc.c,
++ plugins/jpeg/gstjpegenc.h, plugins/mpeg1/parse/mpeg1parse.c,
++ test/Makefile.am, test/vidcapture.c: Documentation updates. All
++ standard library objects and standard elements are documented.
++ Modified some of the elements to more accuratly report about their
++ arguments so the documentation builds more reasonable output.
++ Added aviencoder and jpegencoder elements (not working yet)
++
++2000-03-22 21:18 wtay
++
++ * configure.in, gst/gstpad.c, gst/types/gsttypes.c,
++ libs/riff/Makefile.am, libs/riff/gstriff.c, libs/riff/gstriff.h,
++ plugins/Makefile.am, plugins/avi/Makefile.am,
++ plugins/avi/gstparseavi.c, plugins/avi/gstparseavi.h,
++ plugins/jpeg/.cvsignore, plugins/jpeg/Makefile.am,
++ plugins/jpeg/gstjpeg.c, plugins/jpeg/gstjpeg.h: Added jpeg decoder.
++ the avi decoder now configures the jpeg codec if an MJPG encoded
++ avi is found. Fixed riff parsing. readded rgb_draw functions to the
++ videosink. jpeglib is used to decode the jpeg image.
++
++2000-03-21 20:06 omegahacker
++
++ * plugins/avi/gstparseavi.c: removed second check on riff library,
++ moved original to top so it fails out right away
++
++2000-03-21 19:54 omegahacker
++
++ * plugins/avi/gstparseavi.c: added load and check of libriff during
++ plugin init
++
++2000-03-21 19:54 omegahacker
++
++ * gst/gstplugin.c: spelling fixes to gst_library_load()
++
++2000-03-20 20:25 wtay
++
++ * configure.in, gst/gstbuffer.c, gst/gstplugin.c, gst/gstplugin.h,
++ gst/gstthread.c, gst/plugin.c, gst/plugin.h,
++ gst/elements/gstaudiosink.c, gst/elements/gstqueue.c,
++ libs/riff/gstriff.c, libs/riff/gstriff.h, plugins/avi/Makefile.am,
++ plugins/avi/gstparseavi.c, plugins/avi/gstparseavi.h,
++ test/aviparse.c, test/mp1parse.c, test/videotest.c: Implemented
++ riff parsing as a library. The avi parser can play simple PCM
++ encoded audio. some minor cleanups.
++
++2000-03-19 00:59 wtay
++
++ * AUTHORS, configure.in, gst/gstplugin.c, libs/Makefile.am,
++ libs/riff/Makefile.am, libs/riff/gstriff.c, libs/riff/gstriff.h,
++ plugins/Makefile.am, plugins/avi/.cvsignore,
++ plugins/avi/Makefile.am, plugins/avi/gstparseavi.c,
++ plugins/avi/gstparseavi.h, plugins/wav/Makefile.am,
++ plugins/wav/gstparsewav.c, test/.cvsignore, test/videotest.c: Added
++ the riff code into a seperate library in /libs dir. The plugin
++ loader also checks the /libs path. The avi parser now uses the
++ riff library. WAV is broken.
++
++2000-03-13 22:17 wtay
++
++ * test/aviparse.c: A non functional avi parser.
++
++2000-03-13 22:13 wtay
++
++ * configure.in, gst/gst.c, gst/gstbuffer.h,
++ gst/gstelementfactory.c, gst/gstmeta.c, gst/gstplugin.h,
++ gst/gstthread.c, gst/gsttype.h, gst/types/gsttypes.c,
++ plugins/Makefile.am, plugins/au/gstparseau.c,
++ plugins/capture/v4l/gstv4lsrc.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c, test/Makefile.am,
++ test/videotest.c: Various cleanups. Moved the overlay code to a
++ specialized widget. One error I cannot seem to fix: switching
++ desktops does not disable the overlay.
++
++2000-03-05 21:48 wtay
++
++ * plugins/capture/v4l/: grab-v4l.c, gstv4lsrc.c: Reworked overlay,
++ much better but still not perfect.
++
++2000-03-03 22:13 wtay
++
++ * plugins/capture/v4l/grab-v4l.c, plugins/capture/v4l/grab.h,
++ plugins/capture/v4l/gstv4lsrc.c, plugins/capture/v4l/gstv4lsrc.h,
++ test/Makefile.am, test/videotest.c: Added overlay and DGA
++ capability for the videosink. Not really good but functional.
++
++2000-02-27 23:18 wtay
++
++ * gst/Makefile.am, gst/cothreads.c, gst/gstbin.c, gst/gstbuffer.c,
++ gst/gstconnection.c, gst/gstelement.c, gst/gstmeta.c,
++ gst/gstobject.c, gst/gstpad.c, gst/gstpad.h, gst/gstpipeline.c,
++ gst/gstplugin.c, gst/gsttee.c, gst/gstthread.c, gst/gsttype.c,
++ gst/elements/Makefile.am, gst/elements/gstasyncdisksrc.c,
++ gst/elements/gstaudiosink.c, gst/elements/gstaudiosrc.c,
++ gst/elements/gstdisksrc.c, gst/elements/gstfakesink.c,
++ gst/elements/gstfakesrc.c, gst/elements/gstfdsink.c,
++ gst/elements/gstfdsrc.c, gst/elements/gsthttpsrc.c,
++ gst/elements/gstidentity.c, gst/elements/gstqueue.c,
++ gst/elements/gstsinesrc.c, gst/types/Makefile.am,
++ plugins/capture/v4l/Makefile.am, plugins/capture/v4l/grab-v4l.c,
++ plugins/capture/v4l/grab.h, plugins/capture/v4l/gstv4lsrc.c,
++ plugins/capture/v4l/gstv4lsrc.h,
++ plugins/mp3decode/mpg123/Makefile.am,
++ plugins/mp3decode/mpg123/common.c,
++ plugins/mp3decode/mpg123/decode_i386.c,
++ plugins/mp3decode/mpg123/decode_i486.c,
++ plugins/mp3decode/mpg123/getbits.c,
++ plugins/mp3decode/mpg123/getbits.h,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/mpg123/layer1.c,
++ plugins/mp3decode/mpg123/layer2.c,
++ plugins/mp3decode/mpg123/layer3.c,
++ plugins/mp3decode/mpg123/mpg123.c,
++ plugins/mp3decode/mpg123/mpg123.h, plugins/mp3decode/mpg123/test.c,
++ plugins/mpeg1/mpeg_play/Makefile.am,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/proto.h, plugins/mpeg1/mpeg_play/video.c,
++ plugins/mpeg1/parse/Makefile.am, plugins/mpeg1/parse/getbits.c,
++ plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1video/parse/Makefile.am,
++ plugins/mpeg1video/parse/mp1videoparse.c, test/videotest.c: This is
++ a rather large patch. Switched on -Wall compiler flag and fixed the
++ warnings. Made the Video for Linux more like it should be.
++
++2000-02-26 18:55 wtay
++
++ * gst/gstpad.c, gst/gstpad.h, plugins/capture/v4l/gstv4lsrc.c,
++ test/mp1parse.c, test/videotest.c: Added a pull function in the
++ gstpad. Modified the videosink to implement the pull. This function
++ allows a source element to request a buffer from the destination.
++ This is much more efficient because the videosink can then pass a
++ buffer with SHM to the element, which does not require an aditional
++ memcpy. removed scaling from the videosink. I need something
++ better.
++
++2000-02-25 23:19 wtay
++
++ * test/videotest.c: test code for the Video for linux source
++
++2000-02-25 23:18 wtay
++
++ * configure.in, plugins/Makefile.am, plugins/capture/Makefile.am,
++ plugins/capture/v4l/Makefile.am, plugins/capture/v4l/gstv4lsrc.c,
++ plugins/capture/v4l/gstv4lsrc.h, test/mp1parse.c: Added a Video 4
++ linux source. Not generic at all and may not work on any other
++ system but mine.
++
++2000-02-24 20:56 wtay
++
++ * gst/gstbuffer.c, plugins/mp3decode/mpg123/Makefile.am,
++ plugins/mp3decode/parse/Makefile.am,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mp3decode/parse/mp3parse.h,
++ plugins/mpeg1/mpeg_play/Makefile.am,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.h,
++ plugins/mpeg1/mpeg_play/idct_block_mmx.S,
++ plugins/mpeg1/mpeg_play/jrevdct.c,
++ plugins/mpeg1/mpeg_play/mmx_idct.c,
++ plugins/mpeg1/mpeg_play/parseblock.c,
++ plugins/mpeg1/mpeg_play/util.c, plugins/mpeg1/mpeg_play/util.h,
++ plugins/mpeg1/mpeg_play/video.c, plugins/mpeg1/mpeg_play/video.h,
++ plugins/mpeg1video/parse/mp1videoparse.c, test/mp1parse.c: Speedup
++ in mpg123 parsing. speedup in mp1videoparse. rearanged the MPEG
++ player got rid of some memcpy. bit handling changes. MMX code for
++ the IDCT and motion compensation in mpeg_play. Almost as fast as
++ the commercial mpeg player mtv, but with a much better video
++ quality :-)
++
++2000-02-20 16:19 wtay
++
++ * configure.in, plugins/mpeg1/mpeg_play/gstmpeg_play.c: Added
++ GdkPixbuf support and scaling (sloww...)
++
++2000-02-20 12:58 wtay
++
++ * plugins/mpeg1/mpeg_play/: 16bit.c, Makefile.am, dither.h,
++ gdith.c, gstmpeg_play.c, gstmpeg_play.h, proto.h, util.h, video.c,
++ video.h: General cleanup and speedup. removed color conversion out
++ of MPEG decoder.
++
++2000-02-19 13:37 wtay
++
++ * plugins/mpeg1/mpeg_play/: gstmpeg_play.c, gstmpeg_play.h,
++ video.c, video.h: Added timestamps for video buffers. The videosink
++ syncs to the timestamps. Added a buffer with finished frames for
++ the MPEG1 decoder.
++
++2000-02-19 10:50 wtay
++
++ * gst/elements/Makefile.am, gst/elements/gstqueue.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c, test/mp1parse.c: Fixed the
++ lockup by not calling any gtk functions in the main thread. This
++ is not good.
++
++2000-02-18 23:48 wtay
++
++ * gst/elements/gstqueue.c, test/mp1parse.c: Set the default buffer
++ size to 1 to avoid the strange lockups...
++
++2000-02-18 23:07 wtay
++
++ * plugins/mpeg1/mpeg_play/16bit.c, plugins/mpeg1/mpeg_play/2x2.c,
++ plugins/mpeg1/mpeg_play/Makefile.am,
++ plugins/mpeg1/mpeg_play/descrip.mms,
++ plugins/mpeg1/mpeg_play/dither.h, plugins/mpeg1/mpeg_play/fs2.c,
++ plugins/mpeg1/mpeg_play/fs2.h, plugins/mpeg1/mpeg_play/fs2fast.c,
++ plugins/mpeg1/mpeg_play/fs4.c, plugins/mpeg1/mpeg_play/fs4.h,
++ plugins/mpeg1/mpeg_play/gdith.c, plugins/mpeg1/mpeg_play/gray.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.h,
++ plugins/mpeg1/mpeg_play/hybrid.c,
++ plugins/mpeg1/mpeg_play/hybriderr.c,
++ plugins/mpeg1/mpeg_play/index.bt,
++ plugins/mpeg1/mpeg_play/mb_ordered.c,
++ plugins/mpeg1/mpeg_play/mono.c, plugins/mpeg1/mpeg_play/ordered.c,
++ plugins/mpeg1/mpeg_play/ordered2.c,
++ plugins/mpeg1/mpeg_play/proto.h, plugins/mpeg1/mpeg_play/util32.c,
++ plugins/mpeg1/mpeg_play/video.c, plugins/mpeg1/mpeg_play/video.h,
++ plugins/visualization/smoothwave/smoothwave.c, test/Makefile.am,
++ test/mp1parse.c: The first functional video sink... Removed all of
++ the video stuff from the MPEG video decoder. Fixed a bug in
++ smoothwave. The MPEG video decoder still does the YUV->RGB
++ conversion.
++
++2000-02-17 22:50 wtay
++
++ * configure.in, plugins/Makefile.am,
++ plugins/mpeg1/mpeg_play/Makefile.am,
++ plugins/mpeg1/mpeg_play/gdith.c, plugins/mpeg1/mpeg_play/main.c,
++ plugins/mpeg1/mpeg_play/mmx_idct.c,
++ plugins/mpeg1/mpeg_play/parseblock.c,
++ plugins/mpeg1/mpeg_play/proto.h,
++ plugins/mpeg1/mpeg_play/readfile.c, plugins/mpeg1/mpeg_play/util.c,
++ plugins/mpeg1/mpeg_play/util.h, plugins/mpeg1/mpeg_play/video.c,
++ plugins/mpeg1/mpeg_play/video.h: MPEG1 cleanup. Added first (non
++ functional) video sink.
++
++2000-02-16 23:27 wtay
++
++ * gst/gstbuffer.c, gst/gstplugin.c, gst/gsttype.c,
++ gst/elements/gstqueue.c, plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mpeg1/parse/mpeg1parse.c, test/mp1parse.c, test/mp3play.c:
++ Fixed memory leak in queue.
++
++2000-02-16 16:44 wtay
++
++ * plugins/mpeg1/mpeg_play/video.c,
++ plugins/mpeg1/parse/mpeg1parse.c, test/mp1parse.c: Cleanup, fixed
++ some bugs in the parsers, fixed memory leak (not all of them yet)
++
++2000-02-15 20:14 wtay
++
++ * gst/elements/gstqueue.c, plugins/mpeg1/mpeg_play/video.c,
++ plugins/mpeg1/mpeg_play/video.h, plugins/mpeg1/parse/mpeg1parse.c:
++ Fixed (hopfully) the last bug in MPEG1 video player. A state bug
++ caused some I-frames to be skipped.
++
++2000-02-15 00:32 omegahacker
++
++ * editor/.cvsignore, test/.cvsignore: updated .cvsignores
++
++2000-02-14 23:21 wtay
++
++ * plugins/: mpeg1/mpeg_play/parseblock.c, mpeg1/mpeg_play/util.c,
++ mpeg1/mpeg_play/util.h, mpeg1/mpeg_play/video.c,
++ mpeg1video/parse/mp1videoparse.c: Some cleanups+speedup. Still
++ looking for a bug...
++
++2000-02-14 20:42 wtay
++
++ * plugins/mp3decode/parse/mp3parse.c: Fixed a nasty mp3 parse bug.
++ Some frames were skipped if the header was on partial frames. This
++ fixes the strange invalid sync errors.
++
++2000-02-14 00:22 wtay
++
++ * plugins/mpeg1video/parse/mp1videoparse.c: fixed state error in
++ parsing.
++
++2000-02-13 22:30 wtay
++
++ * plugins/mpeg1video/parse/: mp1videoparse.c, mp1videoparse.h:
++ cleaned up the parsing code a bit.
++
++2000-02-13 15:20 wtay
++
++ * gst/elements/gstqueue.c, plugins/mp3decode/parse/mp3parse.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/util.c, plugins/mpeg1/mpeg_play/video.c,
++ plugins/mpeg1/mpeg_play/video.h, plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1video/parse/mp1videoparse.c: Made queue default
++ bigger. fixed parsing errors in mp3parse mpeg1parse mp1videoparse:
++ more than 2 zeros and a 1 is also a sync. fixed MPEG1 video
++ SKIP_PICTURE which caused a segfault. AlienSong now plays as it
++ should do. Skips are currently ignored and give some error on the
++ console, need to clean this up.
++
++2000-02-13 13:43 wtay
++
++ * gst/elements/gstqueue.c, gst/elements/gstqueue.h,
++ plugins/mpeg1/mpeg_play/gdith.c: Fixed the queue length (fixed
++ length 5 for now). fixed mpeg1 video rate control. AlienSong
++ segfaults sometimes. My other movies don't....
++
++2000-02-13 03:19 wtay
++
++ * plugins/mpeg1video/parse/mp1videoparse.c: Fixed queueing for
++ incomplede slices.
++
++2000-02-12 23:09 omegahacker
++
++ * test/mp1parse.c: Rearranged and updated mp1parse. Indentation is
++ sane again (what editor are you using, Wim?), and it now uses
++ threads. Playback is clean (at least, audio and video are running
++ smoothly. Video is still a little choppy on my test stream (first
++ 1MB from disk two of Mulan VCD), and it's still wildly out of sync,
++ but it's looking VERY COOL.
++
++2000-02-12 23:08 omegahacker
++
++ * gst/gstbin.c: Changed the way state is dealt with when a child is
++ added to the bin. The note states that the COMPLETE state should
++ probably reflect nothing more than whether or not there is a child
++ in the bin, not whether or not all children are COMPLETE. I need
++ to write out a few scenarios for complex pipeline manipulations to
++ figure out how all the states should interact. The idea is to
++ maintain the ability to dynamically recofigure the pipeline.
++
++2000-02-12 12:20 wtay
++
++ * plugins/mpeg1/mpeg_play/16bit.c,
++ plugins/mpeg1/mpeg_play/Makefile.am,
++ plugins/mpeg1/mpeg_play/ctrlbar.c, plugins/mpeg1/mpeg_play/gdith.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.h,
++ plugins/mpeg1/mpeg_play/main.c,
++ plugins/mpeg1/mpeg_play/mb_ordered.c,
++ plugins/mpeg1/mpeg_play/motionvector.c,
++ plugins/mpeg1/mpeg_play/parseblock.c,
++ plugins/mpeg1/mpeg_play/proto.h,
++ plugins/mpeg1/mpeg_play/readfile.c, plugins/mpeg1/mpeg_play/util.c,
++ plugins/mpeg1/mpeg_play/util32.c, plugins/mpeg1/mpeg_play/video.c,
++ plugins/mpeg1/mpeg_play/video.h,
++ plugins/mpeg1video/parse/mp1videoparse.c, test/mp1parse.c: The
++ first functional video MPEG1 decoder. The decoder still opens a
++ window to show the video. This is not optimised at all. Some
++ glitches and crashes due to bugs in mp1videoparse.c. I need to
++ queue incomplete slices in mp1videoparse before sending them to the
++ decoder. use test/mp1parse on your favorite video to test. No
++ audio/video sync, no QoS at all.
++
++2000-02-10 17:02 wtay
++
++ * gst/types/gsttypes.c, plugins/mp3decode/parse/mp3parse.c,
++ plugins/mpeg1/mpeg_play/gstmpeg_play.c,
++ plugins/mpeg1video/parse/mp1videoparse.c, test/mp1parse.c:
++ Optimisations to mp3decode and mp3parse (subbuffers) mp1videoparse
++ now correctly pushes buffers in complete chuncks.
++
++2000-02-08 22:36 wtay
++
++ * configure.in, gst/types/gsttypes.c,
++ plugins/mpeg1/mpeg_play/video.c, plugins/mpeg1video/Makefile.am,
++ plugins/mpeg1video/parse/Makefile.am,
++ plugins/mpeg1video/parse/README,
++ plugins/mpeg1video/parse/mp1videoparse.c,
++ plugins/mpeg1video/parse/mp1videoparse.h, test/mp1parse.c: Added
++ MPEG1 video parser.
++
++2000-02-07 19:29 wtay
++
++ * plugins/mpeg1/mpeg_play/: Makefile.am, gdith.c: Some more files.
++
++2000-02-07 19:22 wtay
++
++ * plugins/mpeg1/mpeg_play/: Makefile.am, gstmpeg_play.c,
++ gstmpeg_play.h: [no log message]
++
++2000-02-07 19:04 wtay
++
++ * configure.in, plugins/mp3decode/mpg123/Makefile.am,
++ plugins/mp3decode/mpg123/decode_i386.c,
++ plugins/mp3decode/mpg123/layer3.c, plugins/mpeg1/Makefile.am,
++ plugins/mpeg1/mpeg_play/16bit.c, plugins/mpeg1/mpeg_play/2x2.c,
++ plugins/mpeg1/mpeg_play/ANNOUNCE, plugins/mpeg1/mpeg_play/BUGS,
++ plugins/mpeg1/mpeg_play/CHANGES, plugins/mpeg1/mpeg_play/COPYRIGHT,
++ plugins/mpeg1/mpeg_play/INSTALL,
++ plugins/mpeg1/mpeg_play/Makefile.am,
++ plugins/mpeg1/mpeg_play/README,
++ plugins/mpeg1/mpeg_play/README.jpeg, plugins/mpeg1/mpeg_play/TODO,
++ plugins/mpeg1/mpeg_play/VERSION, plugins/mpeg1/mpeg_play/ctrlbar.c,
++ plugins/mpeg1/mpeg_play/ctrlbar.h,
++ plugins/mpeg1/mpeg_play/decoders.c,
++ plugins/mpeg1/mpeg_play/decoders.h,
++ plugins/mpeg1/mpeg_play/descrip.mms,
++ plugins/mpeg1/mpeg_play/dither.h,
++ plugins/mpeg1/mpeg_play/floatdct.c, plugins/mpeg1/mpeg_play/fs2.c,
++ plugins/mpeg1/mpeg_play/fs2.h, plugins/mpeg1/mpeg_play/fs2fast.c,
++ plugins/mpeg1/mpeg_play/fs4.c, plugins/mpeg1/mpeg_play/fs4.h,
++ plugins/mpeg1/mpeg_play/gray.c, plugins/mpeg1/mpeg_play/hybrid.c,
++ plugins/mpeg1/mpeg_play/hybriderr.c,
++ plugins/mpeg1/mpeg_play/index.bt,
++ plugins/mpeg1/mpeg_play/jrevdct.c, plugins/mpeg1/mpeg_play/main.c,
++ plugins/mpeg1/mpeg_play/mb_ordered.c,
++ plugins/mpeg1/mpeg_play/mono.c,
++ plugins/mpeg1/mpeg_play/motionvector.c,
++ plugins/mpeg1/mpeg_play/ordered.c,
++ plugins/mpeg1/mpeg_play/ordered2.c,
++ plugins/mpeg1/mpeg_play/parseblock.c,
++ plugins/mpeg1/mpeg_play/proto.h,
++ plugins/mpeg1/mpeg_play/readfile.c, plugins/mpeg1/mpeg_play/util.c,
++ plugins/mpeg1/mpeg_play/util.h, plugins/mpeg1/mpeg_play/util32.c,
++ plugins/mpeg1/mpeg_play/video.c, plugins/mpeg1/mpeg_play/video.h:
++ Added compiler optimistaion flags to mpg123. reverted to old
++ WRITE_SAMPLE which was much faster. Added mpeg_play, the MPEG1
++ video player. It does not work yet.
++
++2000-02-06 22:04 wtay
++
++ * gst/gstmeta.c, plugins/mp3decode/mpg123/common.c,
++ plugins/mp3decode/mpg123/gstmpg123.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mpeg1/parse/mpeg1parse.c: Added metadata to mpg123 buffers.
++ removed (disabeled) debug info.
++
++2000-02-06 18:50 wtay
++
++ * plugins/mp3decode/mpg123/common.c,
++ plugins/mp3decode/parse/mp3parse.c,
++ plugins/mpeg1/parse/mpeg1parse.c, test/mp1parse.c: Fixed the mpeg 1
++ parser. It can now be used to playback the audio stream of an MPEG1
++ movie (check out test/mp1parse.c).
++
++2000-02-06 12:33 wtay
++
++ * plugins/mpeg1/parse/mpeg1parse.c: Found mpeg1 parsing bug. My
++ videos seem to parse OK.
++
++2000-02-06 01:52 wtay
++
++ * plugins/mpeg1/parse/mpeg1parse.c, test/mp1parse.c: cleanup. Still
++ not working...
++
++2000-02-06 00:56 wtay
++
++ * test/mp1parse.c: The mpeg1 parser test program.
++
++2000-02-06 00:55 wtay
++
++ * plugins/mpeg1/parse/mpeg1parse.c,
++ plugins/mpeg1/parse/mpeg1parse.h, test/Makefile.am: Some changes to
++ the mpeg 1 parser. Does not work yet.
++
++2000-02-05 16:08 wtay
++
++ * plugins/mp3decode/mpg123/: Makefile.am, decode_i386.c,
++ decode_i486.c, decode_i586.s, layer3.c, mpg123.c, mpg123.h: Added
++ 486 optimisation. Pentium optimisation added, but does not work
++ yet.
++
++2000-02-05 14:37 wtay
++
++ * plugins/mp3decode/mpg123/: common.c, getbits.c, getbits.h,
++ layer3.c, mpg123.c, mpg123.h: Fixed a buffer problem with Layer 3.
++ moved the buffer handling to common.c, getbits should not know
++ about that.
++
++2000-02-05 01:58 wtay
++
++ * plugins/mp3decode/parse/mp3parse.c: Not worth much: fixed a
++ memory leak.
++
++2000-02-05 01:40 wtay
++
++ * plugins/mp3decode/: mpg123/gstmpg123.c, parse/mp3parse.c: Fixed
++ Layer 2 & 3 parsing. All my MPEGs play now with gstreamer !!!
++
++2000-02-05 01:20 wtay
++
++ * plugins/mp3decode/parse/mp3parse.c, test/a.c, test/mp3parse.c,
++ test/mp3play.c: Fixed a nasty bug in mp3parse (partial buffer state
++ remained) Added eos check for the test programs to stop them from
++ allocating all of your memory (had to use alt-sysreq-k a few times
++ :-( ). MPEG layer 1 plays fine now with mp3play.
++
++2000-02-04 23:27 wtay
++
++ * plugins/mp3decode/mpg123/: getbits.c, test.c: Tested with layer 1
++ & 2, no audible errors. Fixed cracks and pops in Layer 3. Still a
++ bit slow, though...
++
++2000-02-04 22:06 wtay
++
++ * plugins/mp3decode/mpg123/: common.c, getbits.c, getbits.h,
++ layer3.c, mpg123.c, mpg123.h, test.c: Attempt to get layer3
++ working. Tried with the test program included. Still some errors
++ and clicks sometime, but you can hear something. Double buffering
++ is now used (like mpg123). Can somebody test this on a layer 1 or 2
++ stream (I have none) and together with the mp3parse?
++
++2000-02-04 21:49 omegahacker
++
++ * plugins/mp3decode/parse/mp3parse.c: Fixes to the bfp calculation,
++ as well as some other stuff.
++
++2000-02-04 02:25 richardb
++
++ * configure.in, gst/gstelement.c, gst/gstplugin.c,
++ plugins/mp3decode/mpg123/mpg123.c, plugins/mp3decode/mpg123/test.c:
++ Compile a test program to ensure that we have working atomic
++ resource counting.
++
++ A few small changes (include headers, fix a cast) to stop compiler
++ warnings.
++
++2000-02-02 06:26 omegahacker
++
++ * configure.in, docs/Makefile.am, docs/gst/Makefile.am,
++ docs/gst/gstreamer-decl.txt, docs/gst/gstreamer-sections.txt,
++ docs/gst/tmpl/gstelement.sgml, docs/gst/tmpl/gstpipeline.sgml,
++ gst/gst.c, gst/gstelement.c, gst/gstelement.h, gst/gstobject.c,
++ gst/gstpipeline.c, plugins/mp3decode/xing/libxing/.cvsignore: More
++ documentation changes, a couple configure.in and Makefile.am fixes.
++
++2000-02-01 20:35 wtay
++
++ * configure.in, gst/elements/Makefile.am,
++ plugins/effects/volume/volume.c: Fixed lowercase PLUGINS_USE_SRCDIR
++ which made running test apps fail. Added GHTTP_LIBS to the
++ libraries. commented out mm_support() call, wich is not working
++ yet and causes errors.
++
++2000-02-01 19:40 wtay
++
++ * configure.in, docs/gst/Makefile.am,
++ plugins/effects/volume/Makefile.am, plugins/rtjpeg/RTjpeg.c,
++ plugins/rtjpeg/RTjpeg.h: Try to compile a little mmx program, set
++ the default value of HAVE_LIBMMX. some typos fixed. Changed
++ include path for volume.c. RTjpeg uses mmx.h
++
++2000-02-01 09:16 omegahacker
++
++ * configure.in, docs/Makefile.am, docs/gst/.cvsignore,
++ docs/gst/Makefile.am, docs/gst/gstreamer-decl.txt,
++ docs/gst/gstreamer-docs.sgml, docs/gst/gstreamer-sections.txt,
++ docs/gst/gstreamer.hierarchy, docs/gst/gstreamer.types,
++ docs/gst/tmpl/.cvsignore, docs/gst/tmpl/gst.sgml,
++ docs/gst/tmpl/gstbin.sgml, docs/gst/tmpl/gstbuffer.sgml,
++ docs/gst/tmpl/gstconnection.sgml, docs/gst/tmpl/gstdisksrc.sgml,
++ docs/gst/tmpl/gstelement.sgml, docs/gst/tmpl/gstfilter.sgml,
++ docs/gst/tmpl/gstmeta.sgml, docs/gst/tmpl/gstobject.sgml,
++ docs/gst/tmpl/gstpad.sgml, docs/gst/tmpl/gstpipeline.sgml,
++ docs/gst/tmpl/gstplugin.sgml, docs/gst/tmpl/gstqueue.sgml,
++ docs/gst/tmpl/gstsink.sgml, docs/gst/tmpl/gstsrc.sgml,
++ docs/gst/tmpl/gsttee.sgml, docs/gst/tmpl/gstthread.sgml,
++ docs/gst/tmpl/gsttrace.sgml, docs/gst/tmpl/gsttype.sgml,
++ docs/gst/tmpl/gstutils.sgml, docs/gst/tmpl/gstxml.sgml,
++ docs/gst/tmpl/plugin.sgml: Re- set up the gtk-doc system. I'd
++ managed to mutilate it a while back, but now it's fixed. I'll put
++ a copy of the HTML output somewhere on the website tonight.
++
++ In order to actually generate the docs, you'll have to install all
++ the DocBook tools, as well as gtk-doc from GNOME cvs. (see
++ http://developer.gnome.org/arch/doc/tools.html)
++
++ Notes (I'll codify these some day):
++
++ - Don't believe the Gnome page, always edit the SOURCES when
++ documenting a given function, never the tmpl file. - I'll be
++ re-arranging things a lot, but gtk-doc is smart enough to merge any
++ changes to the tmpl file. However, gtk-doc's merge and CVS's diff
++ are two entirely separate animals. We should probably have a
++ virtual mutex on the entire docs/gst/ directory, over and above
++ what CVS does. - I'm going to try to end up with a book set
++ (docbook terms), where docs/gst/ is only one book. There'd be
++ another called docs/manual/, and another docs/plugins/, etc. If
++ you have any comments as to how these should be done,
++ gstreamer-devel is the place.
++
++2000-02-01 04:10 richardb
++
++ * acconfig.h, config.h.in, configure.in, gst/gstobject.c,
++ gst/elements/Makefile.am, gst/elements/gstelements.c,
++ plugins/mp3decode/xing/libxing/ltmain.sh: Tidy up of configure
++ script. Make libghttp detection work at all. Make library
++ configuration specifiable on configure commandline. Make detection
++ of atomic resource stuff cope with 2.0 linux kernels. Fix typo
++ (HAVE_ATOMIC_T for HAVE_ATOMIC_H). Remove generated ltmain.sh file
++ from mp3decode.
++
++2000-01-31 22:53 wtay
++
++ * include/mmx.h, plugins/rtjpeg/Makefile.am,
++ plugins/rtjpeg/RTjpeg.c: Added general MMX macros.
++
++2000-01-31 17:29 wtay
++
++ * plugins/rtjpeg/: RTjpeg.c, RTjpeg.h: Added MMX optimised DCT and
++ IDCT for RTjpeg. It still doesn't do anything. This version also
++ has optimised versions for 422 and 420 YUV (de)compression. This
++ version is not compatible with the regular RTjpeg due to
++ optimisations using unrolled loops. Is *very* fast.
++
++2000-01-31 09:43 omegahacker
++
++ * Makefile.am, configure.in, gstreamer.spec.in, editor/Makefile.am,
++ gst/elements/Makefile.am, gst/types/Makefile.am,
++ plugins/mp3decode/mpg123/Makefile.am, test/bindings/Makefile.am,
++ test/cothreads/Makefile.am, test/xml/Makefile.am: More incremental
++ updates. I can now successfully produce an rpm simply by typing
++ `./autogen.sh;make rpm`. This is good ;-)
++
++2000-01-31 06:49 omegahacker
++
++ * Makefile.am: gah, missed Makefile.am of all files...
++
++2000-01-31 06:46 omegahacker
++
++ * gstreamer-config.in, gstreamer.m4, gstreamer.spec.in,
++ plugins/mp3decode/mpg123/.cvsignore,
++ plugins/mp3decode/xing/libxing/Makefile.am,
++ test/bindings/.cvsignore, test/cothreads/.cvsignore,
++ editor/Makefile.am, gst/ROADMAP, plugins/effects/stereo/README,
++ test/Makefile.am, test/xml/README: A bunch more changes to clean up
++ build/`make dist` issues, as well as a spec file, -config file,
++ .m4, etc. Next step is to build an RPM of this mess.
++
++2000-01-31 05:55 omegahacker
++
++ * .cvsignore, acconfig.h, config.h.in, configure.in,
++ plugins/Makefile.am, plugins/dvdsrc/Makefile.am,
++ plugins/mp3decode/mpg123/Makefile.am, test/Makefile.am,
++ test/cothreads/Makefile.am, test/xml/Makefile.am: Various fixes
++ that collectively allow `make dist` to work.
++
++2000-01-31 04:22 omegahacker
++
++ * .cvsignore: uh, forgot to do the root .cvsignore...
++
++2000-01-31 04:20 omegahacker
++
++ * plugins/mp3decode/Makefile.am: Fixed SUBDIRS stuff so `make dist`
++ works cleanly. Here's the trick: if DIST_SUBDIRS exists in the
++ Makefile.am, that's used as the list of things to include in the
++ distribution, regardless of whether or not something is included in
++ SUBDIRS due to conditional stuff.
++
++2000-01-31 03:36 omegahacker
++
++ * docs/.cvsignore, editor/.cvsignore, gst/.cvsignore,
++ gst/elements/.cvsignore, gst/types/.cvsignore,
++ plugins/au/.cvsignore, plugins/effects/.cvsignore,
++ plugins/effects/stereo/.cvsignore,
++ plugins/effects/volume/.cvsignore, plugins/mp3decode/.cvsignore,
++ plugins/mp3decode/mpg123/.cvsignore,
++ plugins/mp3decode/parse/.cvsignore,
++ plugins/mp3decode/xa/.cvsignore, plugins/mp3decode/xing/.cvsignore,
++ plugins/mp3decode/xing/libxing/.cvsignore,
++ plugins/visualization/spectrum/.cvsignore,
++ plugins/visualization/vumeter/.cvsignore, plugins/wav/.cvsignore,
++ plugins/.cvsignore, plugins/cobin/.cvsignore,
++ plugins/dvdsrc/.cvsignore, plugins/mpeg1/.cvsignore,
++ plugins/mpeg1/parse/.cvsignore, plugins/mpeg2/.cvsignore,
++ plugins/mpeg2/ac3dec/.cvsignore, plugins/mpeg2/ac3parse/.cvsignore,
++ plugins/mpeg2/parse/.cvsignore, plugins/rtjpeg/.cvsignore,
++ plugins/vcdsrc/.cvsignore, plugins/visualization/.cvsignore,
++ plugins/visualization/smoothwave/.cvsignore,
++ plugins/visualization/synaesthesia/.cvsignore, test/.cvsignore,
++ test/bindings/.cvsignore, test/cothreads/.cvsignore,
++ test/xml/.cvsignore, tools/.cvsignore: OK, I think I've got all the
++ .cvsignore stuff taken care of, though we'll want to fine-tune
++ things as we go, of course. Most of them are the same, with some
++ exceptions for directories that produce executables (those are
++ listed by name after the standard ones and a newline for
++ separation).
++
++2000-01-31 03:25 omegahacker
++
++ * test/README: initial checkin
++
++2000-01-31 03:22 omegahacker
++
++ * test/xml/readreg.c: - added usage info - uses first arg as
++ registry filename - any additional args are plugins to search for
++ (no change but argv base) - cleaned up output with a spare \n
++
++2000-01-31 03:02 omegahacker
++
++ * configure.in, plugins/Makefile.am, plugins/rtjpeg/.cvsignore,
++ plugins/rtjpeg/Makefile.am, plugins/rtjpeg/README,
++ plugins/rtjpeg/RTjpeg.c, plugins/rtjpeg/RTjpeg.h,
++ plugins/rtjpeg/rtjpeg.c, plugins/rtjpeg/rtjpegdec.c,
++ plugins/rtjpeg/rtjpegdec.h, plugins/rtjpeg/rtjpegenc.c,
++ plugins/rtjpeg/rtjpegenc.h: RTjpeg plugin with several elements.
++ It's currently a skeleton, doing no work at all. Need to have a
++ video display element, some kind of simulation source (read from
++ .ppm, a la what I do at work to solve the exact same problem), raw
++ video types, metadata structs, etc.
++
++ The RTjpeg.[ch] code is taken from a just-downloaded copy from
++ Justin's site, with some fixes (#include <asm/types.h> to get
++ __u64,etc). Once the aforementioned infrastructure is in place,
++ the elements can actually be set up to do the encode/decode, and
++ we'll have our first functioning video codec in place. ;-)
++
++2000-01-31 01:24 omegahacker
++
++ * gst/types/.cvsignore: .cvsignore for gst/types/, still testing
++ loginfo script(s)
++
++2000-01-31 01:11 omegahacker
++
++ * gst/elements/.cvsignore: .cvsignore for gst/elements/, also
++ testig loginfo script
++
++2000-01-31 00:16 omegahacker
++
++ * plugins/dvdsrc/.cvsignore: added .cvsignore for plugins/dvdsrc/,
++ testing loginfo script
++
++2000-01-31 00:04 omegahacker
++
++ * plugins/.cvsignore: .cvsignore for plugins/, also testing loginfo
++ script
++
++2000-01-31 00:02 omegahacker
++
++ * gst/.cvsignore: .cvsignore for gst/, also testing loginfo script
++
++2000-01-30 22:50 wtay
++
++ * acconfig.h, config.h.in, configure.in, editor/Makefile.am,
++ gst/elements/Makefile.am, gst/types/Makefile.am,
++ plugins/Makefile.am, plugins/mp3decode/Makefile.am,
++ plugins/mp3decode/xing/Makefile.am,
++ plugins/mp3decode/xing/libxing/ltmain.sh: Changed Makefiles to:
++ detect xaudio (check header xaudio/decoder.h) detect mmx.h detect
++ CSS (check if css.c is in plugins/dvdsrc), need something better.
++ some LDFLAGS had *.la dependencies which failed for libtool
++
++ The build is now 100% on my system.
++
++2000-01-30 10:58 omegahacker
++
++ * plugins/dvdsrc/: Makefile.am, dvd_udf.c, dvd_udf.h, dvdsrc.c,
++ dvdsrc.h: initial checkin
++
++2000-01-30 10:48 omegahacker
++
++ * plugins/mp3decode/xing/libxing/: cdcts.s, cwin8s.s, cwins.s,
++ mdcts.s, msiss.s, x86gas.s, x86intel.s: initial checkin
++
++2000-01-30 10:44 omegahacker
++
++ * docs/: Makefile.am, random/arch, random/buffers,
++ random/coroutines, random/design, random/example,
++ random/factoryinfo, random/gboolean, random/intro, random/metadata,
++ random/mutability, random/padarch, random/sequence,
++ random/state-transitions, random/states, random/states.old,
++ random/types, random/vis-transform, random/walkthrough,
++ slides/README, slides/abstract, slides/abstract.save,
++ slides/outline, slides/slides: initial checkin
++
++2000-01-30 10:39 omegahacker
++
++ * plugins/mp3decode/xing/: Makefile.am, README, gstxing.c,
++ gstxing.h: initial checkin
++
++2000-01-30 10:17 omegahacker
++
++ * plugins/mp3decode/xing/libxing/: AUTHORS, COPYING, ChangeLog,
++ INSTALL, L3.h, Makefile.am, NEWS, README, acconfig.h, autogen.sh,
++ cdct.c, config.h, config.h.in, configure.in, csbt.c, csbtL3.c,
++ csbtb.c, cup.c, cupL1.c, cupini.c, cupl3.c, cwin.c, cwinb.c,
++ cwinm.c, dec8.c, htable.h, hwin.c, icdct.c, install-sh, isbt.c,
++ isbtb.c, itype.h, iup.c, iupL1.c, iupini.c, iwinQ.c, iwinbQ.c,
++ iwinm.c, jdw.h, l3dq.c, l3init.c, ltmain.sh, mdct.c, mhead.c,
++ mhead.h, missing, mkinstalldirs, msis.c, port.h, stamp-h, stamp.h,
++ stamp.h.in, tableawd.h, towave.c, uph.c, upsf.c, wavep.c, wcvt.c,
++ x86intel.c: initial checkin
++
++2000-01-30 10:03 omegahacker
++
++ * plugins/mp3decode/: Makefile.am, xa/Makefile.am, xa/README,
++ xa/gstxa.c, xa/gstxa.h: initial checkin
++
++2000-01-30 09:58 omegahacker
++
++ * plugins/: effects/Makefile.am, visualization/Makefile.am: initial
++ checkin
++
++2000-01-30 09:54 omegahacker
++
++ * tools/Makefile.am, tools/README, tools/launch.c,
++ test/bindings/Makefile.am, test/bindings/dummy.c,
++ test/bindings/dummy.h, test/bindings/test.c: initial checkin
++
++2000-01-30 09:50 omegahacker
++
++ * test/: Makefile.am, a.c, ac3parse.c, ac3play.c, ac3sync.c,
++ args.c, basic.c, buffer.c, cobin.c, dvdcat.c, fake.c,
++ gsttracedump.c, jitter.c, m.c, mcut.c, mem.c, mem.h, mp3.c,
++ mp3parse.c, mp3play.c, mpeg2parse.c, mpg123.c, p.c, plugin.c,
++ push.c, qtest.c, r.c, record.c, s.c, spectrum.c, states.c,
++ teardown.c, typefind.c, types.c, w.c, wave.c,
++ cothreads/Makefile.am, cothreads/cothreads.c,
++ cothreads/cothreads.h, cothreads/looper.c, cothreads/looper.h,
++ cothreads/object.c, cothreads/object.h, cothreads/simple.c,
++ cothreads/test.c, xml/Makefile.am, xml/createreg.c, xml/readreg.c:
++ initial checkin
++
++2000-01-30 09:46 omegahacker
++
++ * editor/: Makefile.am, editor.c, editor.glade,
++ editorelement.glade, gsteditor.c, gsteditor.h, gsteditorbin.c,
++ gsteditorcanvas.c, gsteditorconnection.c, gsteditorconnection.h,
++ gsteditorcreate.c, gsteditorcreate.h, gsteditorelement.c,
++ gsteditorpad.c, gsteditorpad.h, gstelementselect.c,
++ gstelementselect.h: initial checkin
++
++2000-01-30 09:22 omegahacker
++
++ * plugins/: au/Makefile.am, au/gstparseau.c, au/gstparseau.h,
++ cobin/Makefile.am, cobin/cobin.c, cobin/cobin.h,
++ cobin/spindentity.c, cobin/spindentity.h,
++ effects/stereo/Makefile.am, effects/stereo/stereo.c,
++ effects/stereo/stereo.h, effects/volume/Makefile.am,
++ effects/volume/volume.c, effects/volume/volume.h,
++ mp3decode/mpg123/COPYING, mp3decode/mpg123/Makefile.am,
++ mp3decode/mpg123/README, mp3decode/mpg123/common.c,
++ mp3decode/mpg123/dct64.c, mp3decode/mpg123/dct64_i386.c,
++ mp3decode/mpg123/dct64_i486.c, mp3decode/mpg123/decode.c,
++ mp3decode/mpg123/decode_i386.c, mp3decode/mpg123/decode_i486.c,
++ mp3decode/mpg123/gbtest.c, mp3decode/mpg123/getbits.c,
++ mp3decode/mpg123/getbits.h, mp3decode/mpg123/gstmpg123.c,
++ mp3decode/mpg123/gstmpg123.h, mp3decode/mpg123/huffman.h,
++ mp3decode/mpg123/l2tables.h, mp3decode/mpg123/layer1.c,
++ mp3decode/mpg123/layer2.c, mp3decode/mpg123/layer3.c,
++ mp3decode/mpg123/letest.c, mp3decode/mpg123/mpg123.c,
++ mp3decode/mpg123/mpg123.h, mp3decode/mpg123/tabinit.c,
++ mp3decode/mpg123/test.c, mp3decode/parse/Makefile.am,
++ mp3decode/parse/README, mp3decode/parse/mp3parse.c,
++ mp3decode/parse/mp3parse.h, mpeg1/Makefile.am,
++ mpeg1/parse/Makefile.am, mpeg1/parse/README, mpeg1/parse/getbits.c,
++ mpeg1/parse/getbits.h, mpeg1/parse/mpeg1parse.c,
++ mpeg1/parse/mpeg1parse.h, mpeg1/parse/notes, mpeg2/Makefile.am,
++ mpeg2/ac3dec/Makefile.am, mpeg2/ac3dec/README, mpeg2/ac3dec/ac3.h,
++ mpeg2/ac3dec/ac3dec.c, mpeg2/ac3dec/ac3dec.h,
++ mpeg2/ac3dec/bit_allocate.c, mpeg2/ac3dec/bit_allocate.h,
++ mpeg2/ac3dec/bitstream.c, mpeg2/ac3dec/bitstream.h,
++ mpeg2/ac3dec/crc.c, mpeg2/ac3dec/crc.h, mpeg2/ac3dec/debug.c,
++ mpeg2/ac3dec/debug.h, mpeg2/ac3dec/decode.h, mpeg2/ac3dec/dither.c,
++ mpeg2/ac3dec/dither.h, mpeg2/ac3dec/downmix.c,
++ mpeg2/ac3dec/downmix.h, mpeg2/ac3dec/exponent.c,
++ mpeg2/ac3dec/exponent.h, mpeg2/ac3dec/getbits.c,
++ mpeg2/ac3dec/getbits.h, mpeg2/ac3dec/imdct.c, mpeg2/ac3dec/imdct.h,
++ mpeg2/ac3dec/mantissa.c, mpeg2/ac3dec/mantissa.h,
++ mpeg2/ac3dec/output.c, mpeg2/ac3dec/output.h, mpeg2/ac3dec/parse.c,
++ mpeg2/ac3dec/parse.h, mpeg2/ac3dec/rematrix.c,
++ mpeg2/ac3dec/rematrix.h, mpeg2/ac3dec/ring_buffer.c,
++ mpeg2/ac3dec/ring_buffer.h, mpeg2/ac3dec/stats.c,
++ mpeg2/ac3dec/stats.h, mpeg2/ac3dec/uncouple.c,
++ mpeg2/ac3dec/uncouple.h, mpeg2/ac3parse/Makefile.am,
++ mpeg2/ac3parse/README, mpeg2/ac3parse/ac3parse.c,
++ mpeg2/ac3parse/ac3parse.h, mpeg2/parse/Makefile.am,
++ mpeg2/parse/README, mpeg2/parse/getbits.c, mpeg2/parse/getbits.h,
++ mpeg2/parse/mpeg2parse.c, mpeg2/parse/mpeg2parse.h,
++ mpeg2/parse/notes, vcdsrc/Makefile.am, vcdsrc/vcdsrc.c,
++ vcdsrc/vcdsrc.h, visualization/smoothwave/Makefile.am,
++ visualization/smoothwave/README,
++ visualization/smoothwave/smoothwave.c,
++ visualization/smoothwave/smoothwave.h,
++ visualization/spectrum/Makefile.am, visualization/spectrum/README,
++ visualization/spectrum/fix_fft.c,
++ visualization/spectrum/gstspectrum.c,
++ visualization/spectrum/gstspectrum.h,
++ visualization/synaesthesia/Makefile.am,
++ visualization/synaesthesia/README,
++ visualization/synaesthesia/README-syna,
++ visualization/synaesthesia/core.c,
++ visualization/synaesthesia/core.h,
++ visualization/synaesthesia/synaesthesia.c,
++ visualization/synaesthesia/synaesthesia.h,
++ visualization/vumeter/Makefile.am, visualization/vumeter/README,
++ visualization/vumeter/vumeter.c, visualization/vumeter/vumeter.h,
++ wav/Makefile.am, wav/gstparsewav.c, wav/gstparsewav.h,
++ wav/gstriff.c, wav/gstriff.h: initial checkin
++
++2000-01-30 09:04 omegahacker
++
++ * plugins/: Makefile.am, example.c, example.h: initial checkin
++
++2000-01-30 09:00 omegahacker
++
++ * gst/: elements/Makefile.am, elements/gstasyncdisksrc.c,
++ elements/gstasyncdisksrc.h, elements/gstaudiosink.c,
++ elements/gstaudiosink.h, elements/gstaudiosrc.c,
++ elements/gstaudiosrc.h, elements/gstdisksrc.c,
++ elements/gstdisksrc.h, elements/gstelements.c,
++ elements/gstesdsink.c, elements/gstesdsink.h,
++ elements/gstfakesink.c, elements/gstfakesink.h,
++ elements/gstfakesrc.c, elements/gstfakesrc.h, elements/gstfdsink.c,
++ elements/gstfdsink.h, elements/gstfdsrc.c, elements/gstfdsrc.h,
++ elements/gsthttpsrc.c, elements/gsthttpsrc.h,
++ elements/gstidentity.c, elements/gstidentity.h,
++ elements/gstqueue.c, elements/gstqueue.h, elements/gstsinesrc.c,
++ elements/gstsinesrc.h, elements/gsttypefind.c,
++ elements/gsttypefind.h, types/Makefile.am, types/gsttypes.c:
++ initial checkin
++
++2000-01-30 08:57 omegahacker
++
++ * gst/: cothreads.c, cothreads.h, gst.c, gst.h, gstbin.c, gstbin.h,
++ gstbuffer.c, gstbuffer.h, gstconnection.c, gstconnection.h,
++ gstelement.c, gstelement.h, gstelementfactory.c, gstfilter.c,
++ gstfilter.h, gstlog.h, gstmeta.c, gstmeta.h, gstobject.c,
++ gstobject.h, gstpad.c, gstpad.h, gstpipeline.c, gstpipeline.h,
++ gstplugin.c, gstplugin.h, gstsink.c, gstsink.h, gstsrc.c, gstsrc.h,
++ gsttee.c, gsttee.h, gstthread.c, gstthread.h, gsttrace.c,
++ gsttrace.h, gsttype.c, gsttype.h, gsttypefind.c, gsttypefind.h,
++ gstutils.c, gstutils.h, gstxml.c, gstxml.h, plugin.c, plugin.h,
++ Makefile.am: initial checkin
++
++2000-01-30 08:51 omegahacker
++
++ * AUTHORS, COPYING, COPYING.LIB, ChangeLog, INSTALL, Makefile.am,
++ NEWS, README, acconfig.h, autogen.sh, config.h.in, configure.in,
++ install-sh, missing, mkinstalldirs, stamp.h.in: initial checkin
++
++Fri Jan 12 21:52:09 CET 2001 Wim Taymans <wim.taymans@chello.be>
++
++ * PPC compilation fixes (thanks to hadess)
++ * add eos2 and eos3 proposals
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/build/TODO gstreamer-0.10.23/docs/random/omega/build/TODO
+--- gstreamer-0.10.23.orig/docs/random/omega/build/TODO 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/build/TODO 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,7 @@
++Convert all the STREAMER_ version stuff to GSTREAMER_
++
++Convert all the --version-info lines to use GSTREAMER_LIBVERSION
++
++Fix all the masses of Makefile.am's that override CFLAGS
++
++Makefile.am's should use the library_la_CFLAGS and _LIBADD always
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/caps2 gstreamer-0.10.23/docs/random/omega/caps2
+--- gstreamer-0.10.23.orig/docs/random/omega/caps2 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/caps2 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,320 @@
++The elementfactory for a given element will contain some information about the capabilities of element's
++pads or potential pads. An indication will be provided as to whether the pad always exists, always
++exists once data is present, or *might* exist once data is present (the latter case is for things like
++the MPEG system parsers, where an audio stream might or might not exist).
++
++
++First, an entirely normal example:
++----------------------------------
++
++(-----------) (----------) (-------------)
++! disksrc ! ! mpg123 ! ! audiosink !
++! src sink src sink !
++! ! ! ! ! !
++(-----------) (----------) (-------------)
++
++We start with only the disksrc. The typefind filter is attached to the disksrc, and via typefind magic
++the properties of the disksrc are found to be:
++
++ disksrc->src->caps = {
++ "audio/mp3",
++ "layer", GST_CAPS_INT (3),
++ "bitrate", GST_CAPS_INT (128),
++ NULL
++ };
++
++A look through the plugin registry shows that we have an element called mpg123 that has the following
++caps:
++
++ static GstCapsFactory mpg123_sink_caps = {
++ "audio/mp3",
++ "layer", GST_CAPS_INT_RANGE (1, 3),
++ "bitrate", GST_CAPS_INT_RANGE (8, 320),
++ NULL
++ };
++
++The caps of the disksrc fit within those parameters, so we instantiate an mpg123 and attach it to the
++disksrc. The connection succeeds negotiation and as a result the mpg123 specifies its output caps as:
++
++ mpg123->src->caps = {
++ "audio/raw",
++ "format", GST_CAPS_BITFIELD (S16),
++ "depth", GST_CAPS_INT (16),
++ "rate", GST_CAPS_INT (44100),
++ "channels", GST_CAPS_INT (2),
++ NULL
++ };
++
++Again from the plugin registry we find an element audiosink that has appropriate caps:
++
++ static GstCapsFactory audiosink_src_caps = {
++ "audio/raw",
++ "format", GST_CAPS_BITFIELD (S16,....),
++ "depth", GST_CAPS_INT (16),
++ "rate", GST_CAPS_INT_RANGE (4000, 96000),
++ "channels", GST_CAPS_INT_RANGE (1, 2),
++ NULL
++ };
++
++A copy of the audiosink is instantiated and attached, negotiation goes smoothly, and we're done. No
++dataflow has occured, no failure found, etc. An ideal autoplug.
++
++
++Now, a slightly more convoluted example:
++----------------------------------------
++
++Start with the same graph:
++
++(-----------) (----------) (-------------)
++! disksrc ! ! mpg123 ! ! audiosink !
++! src sink src sink !
++! ! ! ! ! !
++(-----------) (----------) (-------------)
++
++Run typefind on the disksrc's output, get the same output caps:
++
++ disksrc->src->caps = {
++ "audio/mp3",
++ "layer", GST_CAPS_INT (3),
++ "bitrate", GST_CAPS_INT (128),
++ NULL
++ };
++
++Find and attach mpg123, get the following output caps this time:
++
++ mpg123->src->caps = {
++ "audio/raw",
++ "format", GST_CAPS_BITFIELD (S16),
++ "depth", GST_CAPS_INT (16),
++ "rate", GST_CAPS_INT (44100),
++ "channels", GST_CAPS_INT (1),
++ NULL
++ };
++
++Note that this time we have a mono output. A look into the audiosink caps shows that we have a match.
++So we instantiate a copy. Oops. We now find that the caps for the input pad on our audiosink have
++changed:
++
++ mpg123->src->caps = {
++ "audio/raw",
++ "format", GST_CAPS_BITFIELD (S16,...),
++ "depth", GST_CAPS_INT (16),
++ "rate", GST_CAPS_INT (11025, 48000),
++ "channels", GST_CAPS_INT (2),
++ NULL
++ };
++
++Whoops. It seems that the sound card we've got in this machine (FIXME how on earth to deal with
++multiple sound cards???) doesn't support mono output *at all*. This is a problem. We now find that we
++hae no options as far as directly matching the mpg123 to the audiosink.
++
++A look through our (ficticious) plugin registry shows at least one element that at least has audio/raw
++on both input and ouput (since both mpg123 and audiosink have open pads with this mime type). A closerlook shows that its caps are:
++
++ static GstCapsFactory mono2stereo_sink_caps = {
++ "audio/raw",
++ "channels", GST_CAPS_INT (1),
++ NULL
++ };
++ static GstCapsFactory mono2stereo_src_caps = {
++ "audio/raw",
++ "channels", GST_CAPS_INT (2),
++ NULL
++ };
++
++Wow, that's a perfect match. Instantiate, attach to mpg123, no problems. Attach to audiosink, no
++problems. Done. When we start up the pipeline, we should get absolutely no callbacks from pads saying
++"help me, I've fallen and..., er, I don't like this buffer!".
++
++
++A really messy case:
++--------------------
++
++Start with a disksrc, typefind it, get the following:
++
++ disksrc->src->caps = {
++ "audio/mp3",
++ "layer", GST_CAPS_INT (3),
++ "bitrate", GST_CAPS_INT (128),
++ NULL
++ };
++
++Look through the plugin registry, find mpg123. Instantiate it, attach it. It spits out audio
++parameters as usual:
++
++ mpg123->src->caps = {
++ "audio/raw",
++ "format", GST_CAPS_BITFIELD (S16),
++ "depth", GST_CAPS_INT (16),
++ "rate", GST_CAPS_INT (44100),
++ "channels", GST_CAPS_INT (2),
++ NULL
++ };
++
++Now we instantiate an audiosink plugin. This time, we're sunk:
++
++ mpg123->src->caps = {
++ "audio/raw",
++ "format", GST_CAPS_BITFIELD (S8,U8),
++ "depth", GST_CAPS_INT (8),
++ "rate", GST_CAPS_INT_RANGE (11025, 22050),
++ "channels", GST_CAPS_INT (1),
++ NULL
++ };
++
++ACK! It's one of those Disney Sound Source things. We've got a problem here that isn't obviously
++solvable. However, there happens to be another mp3 decoder sitting around. It's got the same
++properties as mpg123, but a lower merit value. Let's instantiate one and attach it. We get the
++following output pad caps:
++
++ mp3decoder->src->caps = {
++ "audio/raw",
++ "format", GST_CAPS_BITFIELD (S8,S16),
++ "depth", GST_CAPS_INT_RANGE (8,16),
++ "rate", GST_CAPS_INT_RANGE (8000, 44100),
++ "channels", GST_CAPS_INT (1,2),
++ NULL
++ };
++
++Well, that matches the audiosink. We try attaching it, and during negotiation the mp3decoder finds
++sufficient common ground with the castrated audiosink and sets its output pad to match the best of the
++options: S8 at 22050 KHz.
++
++
++
++Next to impossible scenario: DVD
++--------------------------------
++
++Start with a dvdsrc. It's output pad caps are:
++
++ static GstCapsFactory dvdsrc_src_caps = {
++ "video/mpeg",
++ "mpegversion", GST_CAPS_INT (2),
++ "systemstream", GST_CAPS_BOOLEAN (TRUE),
++ NULL
++ };
++
++The type would be classified as incomplete via some mechanism. This might cause the autoplug code to go
++and run the typefind function. It would flesh the type out to the following:
++
++ dvdsrc->src->caps = {
++ "video/mpeg",
++ "mpegversion", GST_CAPS_INT (2),
++ "systemstream", GST_CAPS_BOOLEAN (TRUE),
++ "videostreams", GST_CAPS_INT (1),
++ "audiostreams", GST_CAPS_INT (3),
++ "bitrate", GST_CAPS_INT (40960),
++ NULL,
++ };
++
++Wow, that helped a lot. A check through the plugin registry shows that the mpeg2parse will match those
++properties:
++
++ static GstCapsFactory mpeg2parse_sink_caps = {
++ "video/mpeg",
++ "mpegversion", GST_CAPS_INT (2),
++ "systemstream", GST_CAPS_BOOLEAN (TRUE),
++ NULL
++ };
++
++(In retrospect, it may not be necessary to run typefind if there's match this good right away. Only run
++typefind when there's no exact match.)
++Since there are no output pads yet, we have to actually push data through the pipeline. The moment a
++buffer or two get to the mpeg2parse element, it promptly goes and creates an output pad, probably of the
++following caps:
++
++ mpeg2parse_video_src_caps = {
++ "video/mpeg",
++ "mpegversion", GST_CAPS_RANGE (1,2),
++ "systemstream", GST_CAPS_BOOLEAN (FALSE),
++ NULL
++ };
++
++This seems to be a task for typefind again. But since data is flowing, we have to be careful with the
++buffers. (This is the case in any typefind maneuver, but moreso when one really can't rewind the
++source without consequences) The autoplug system attaches a special pseudo-element to mpeg2parse's new
++output pad, and attaches the typefind element to the end of that. The pseudo-element takes the buffer,
++stores it, and passes a copy off to the attached element, in this case typefind. This repeats until
++typefind has determined the type, at which point the typefind is removed, and the newly found element is
++attached instead.
++
++The pseudo-element is 'rewound' and the stored buffers flow out and into the newly attached element.
++When the cache of buffers is gone, a signal fires and the autoplug system removes the pseudo-element and
++reconnects the pipeline.
++
++In this case, the typefind function will find the following:
++
++ mpeg2parse_video_src_caps = {
++ "video/mpeg",
++ "mpegversion", GST_CAPS_INT (2),
++ "systemstream", GST_CAPS_BOOLEAN (FALSE),
++ "bitrate", GST_CAPS_INT (36864),
++ "width", GST_CAPS_INT (720),
++ "height", GST_CAPS_INT (480),
++ "framerate", GST_CAPS_FLOAT (29.97002997),
++ "chromaformat", GST_CAPS_INT (1), [GST_CAPS_STRING ("4:2:0") ?]
++ NULL
++ };
++
++Back to the plugin registry, we find our only choice is mpeg2dec, which has input caps of:
++
++ static GstCapsFactory mpeg2dec_sink_caps = {
++ "video/mpeg",
++ "mpegversion", GST_CAPS_RANGE (1,2),
++ "systemstream", GST_CAPS_BOOLEAN (FALSE),
++ NULL
++ };
++
++Once again it just so happens that we really didn't need to do the typefind at all. But it can't hurt
++unless the typefind is slow and painful, which we can guess won't be the case since the choices are
++rather limited by the fact that there's already a MIME type attached, meaning we can drastically reduce
++the number of typefind functions we try (down to one, actually).
++
++However, since we *have* run the typefind, upon attachment of the input pad of mpeg2dec, the output pad
++looks like the following:
++
++ mpeg2dec_src_caps = {
++ "video/raw",
++ "fourcc", GST_CAPS_LIST (
++ GST_CAPS_FOURCC ("YV12"), [identical...]
++ GST_CAPS_FOURCC ("IYUV"),
++ GST_CAPS_FOURCC ("I420"),
++ ),
++ "width", GST_CAPS_INT (720),
++ "height", GST_CAPS_INT (480),
++ "framerate", GST_CAPS_FLOAT (29.97002997),
++ NULL
++ };
++
++Currently only videosink supports the output of video/raw. It claims a list of FOURCCs but nothing
++more:
++
++ static GstCapsFactory videosink_sink_caps = {
++ "video/raw",
++ "fourcc", GST_CAP_LIST ( GST_CAPS_FOURCC ("YV12"),
++ GST_CAPS_FOURCC ("IYUV"), GST_CAPS_FOURCC ("I420"),
++ GST_CAPS_FOURCC ("YUY2"), GST_CAPS_FOURCC ("UYVY"),
++ [ etc... ],
++ ),
++ NULL
++ };
++
++When instantiated, we potentially have the same problem as with the audiosink: we don't necessarily know
++which hardware output to use. Somehow we have to solve the problem of setting some element arguments
++before we can get useful information out of them as to the properties. In this case anyway, if the
++videosink were to find only one output possibility, it would trim the list of FOURCCs it can deal with
++to what the hardware can handle, as well as add further properties:
++
++ videosink_sink_caps = {
++ "video/raw",
++ "fourcc", GST_CAPS_LIST (GST_CAPS_FOURCC ("YV12"),
++ GST_CAPS_FOURCC ("YUY2"),
++ ),
++ "width", GST_CAPS_INT_RANGE (4,1020),
++ "height", GST_CAPS_INT_RANGE (4,1020),
++ NULL
++ };
++
++We can now connect the mpeg2dec output to the videosink, and we now have displaying video.
++
++. . . .
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/caps3 gstreamer-0.10.23/docs/random/omega/caps3
+--- gstreamer-0.10.23.orig/docs/random/omega/caps3 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/caps3 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,20 @@
++ /* fake mp3 where bitrates 8 through 32 can't be stereo */
++static GstCapsListFactory mpg123_sink_caps = {
++ {
++ "audio/mp3",
++ "layer", GST_CAPS_INT_RANGE (1, 3),
++ "bitrate", GST_CAPS_INT_RANGE (32, 320),
++ "channels", GST_CAPS_INT_RANGE (1, 2),
++ "framed", GST_CAPS_BOOLEAN (TRUE),
++ NULL
++ },
++ {
++ "audio/mp3",
++ "layer", GST_CAPS_INT_RANGE (1, 3),
++ "bitrate", GST_CAPS_INT_RANGE (8, 32),
++ "channels", GST_CAPS_INT_RANGE (1),
++ "framed", GST_CAPS_BOOLEAN (TRUE),
++ NULL
++ },
++ NULL
++};
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/debug-commit gstreamer-0.10.23/docs/random/omega/debug-commit
+--- gstreamer-0.10.23.orig/docs/random/omega/debug-commit 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/debug-commit 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,30 @@
++Changes made to the DEBUG system. New header file gstdebug.h holds the stuff to keep it out of gst.h's
++hair. DEBUG prints out the process id, cothread id, source filename and line number. Two new macros
++DEBUG_ENTER and DEBUG_LEAVE are used to show the entry and exit of a given function. This eventually
++might be used to construct call trace graphs, even taking cothreads into account. This would be quite
++useful in visualizing the scheduling mechanism.
++
++Minor changes to various debug messages.
++
++Also sitting in gstdebug.h is a prototypical DEBUG_ENTER that's capable of performing DEBUG_LEAVE
++automatically. It does this by utilizing a little-known GCC extension that allows one to call a
++function with the same parameters as the current function. The macro uses this to basically call
++itself. A boolean is used to ensure that when it calls itself it actually runs the body of the
++function. In the meantime it prints stuff out before and after the real function, as well as
++constructing a debugging string. This can be used eventually to provide call-wide data on the DEBUG
++lines, instead of having to replicate data on each call to DEBUG. More research is needed into how this
++would most cleanly be fit into some other chunk of code, like GStreamer (I think of this DEBUG trick as
++a separate project, sorta).
++
++Unfortunately, the aforementioned DEBUG trick interacts quite poorly with cothreads. Almost any time
++it's used in a function that has anything remotely to do with a cothread context (as in, it runs in
++one), a segfault results from the __builtin_apply call, which is the heart of the whole thing. If
++someone who really knows assembly could analyze the resulting code to see what's really going on, we
++might find a way to fix either the macro or the cothreads (I'm thinking that there's something we missed
++in constructing the cothreads themselves) so this works in all cases.
++
++In the meantime, please insert both DEBUG_ENTER and DEBUG_LEAVE in your functions. Be sure to put
++DEBUG_ENTER after your variable declarations and before any functional code, not to put the function
++name in any DEBUG strings (it's already there, trust me), and put a DEBUG_LEAVE if you care enough.
++
++Changes are going to happen in the way DEBUGs and other printouts occur, so stay tuned.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/EOS/chain-walkthrough gstreamer-0.10.23/docs/random/omega/EOS/chain-walkthrough
+--- gstreamer-0.10.23.orig/docs/random/omega/EOS/chain-walkthrough 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/EOS/chain-walkthrough 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,19 @@
++disksrc -> mp3parse -> mpg123 -> audiosink
++
++disksrc reads last 4K chunk from disk. Sets EOS on the buffer, pushes buffer out to peer.
++disksrc:src sets itself to EOS and chains to mp3parse.
++
++ mp3parse takes the buffer and slices it up into several.
++ Each buffer gets chained off to mpg123.
++
++ mpg123 decoders each frame and sends it to audiosink.
++
++ audiosink dumps the audio data to the sound card.
++
++ mpg123 returns from the chain, and returns.
++
++ mp3parse returns from each of the several chains,a nd returns.
++
++disksrc:src returns from the chain, signals EOS, and sets disksrc's EOS flag
++
++At this point the pipeline state code takes over and starts to set everyone to READY
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/eos.old gstreamer-0.10.23/docs/random/omega/eos.old
+--- gstreamer-0.10.23.orig/docs/random/omega/eos.old 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/eos.old 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,52 @@
++OUTDATED
++--------
++
++
++What I propose for EOS condition is th following: As is stands, EOS is a
++flag in a buffer. However, it's also a signal from an element, which is
++odd. What I propose is that EOS become a pad thing. Here's how it would
++work:
++
++When a source has a final buffer, it marks it as EOS. It passes this on
++through the pad, and the pads set a 'pending' EOS state on the way
++through. When another push or pull happens, only then does the pad signal
++EOS. This means that EOS doesn't happen until the buffer has passed all
++the way to the end, and a request for another buffer is starting to work
++its way back. It gets stopped almost immediately.
++
++This gets a bit messy in complex cases, haven't thought them all out.
++Assuming everything is reasonably symmetric, it should work out cleanly.
++We may have to add the ability to force buffers to pass even post EOS, but
++that sounds like a hack.
++
++
++
++Example: DVD
++============
++
++
++ ------------ |-------|
++ -| mpeg2dec |-----| |
++ ------------------------ / ------------ | |
++ | video0|------/ ------------- | | -------------
++ | | -| subtitle0 |-----| merge |-------| videosink |
++ | subtitle0|------/ ------------- | | -------------
++---------- | | ------------- | |
++| dvdsrc |---| mpeg2parse subtitle1|--------| subtitle1 |-----| |
++---------- | | ------------- |-------|
++ | audio0|--------\ ----------- |----------|
++ | | -| ac3dec0 |-----| |
++ | audio1|-------\ ----------- | | -------------
++ ------------------------ \ ----------- | switcher |----| audiosink |
++ -| ac3dec1 |-----| | -------------
++ ----------- |----------|
++
++When dvdsrc reads its last buffer, it sets EOS on the buffer and passes it. The pad (probably audio1,
++since video and audio are interleaved and subtitles don't usually end up at the end of a movie) would
++set EOS pending, and pass it to mpeg2dec which would pass the EOS to the merge. Merge would then ask
++for a buffer from subtitle1, since that's the one we're showing subtitles on right now. It would then
++pull from the mpeg2parse. This would cause a switch back the parser, who's next task is to go and set
++all the output pads to EOS. It may have to accomplish this by sending a zero-byte buffer.
++
++Well, this example isn't actually very good. I'll go ahead and implement it, and we can see what
++happens. The current setup is so lacking that anything is better....
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/filterfactory gstreamer-0.10.23/docs/random/omega/filterfactory
+--- gstreamer-0.10.23.orig/docs/random/omega/filterfactory 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/filterfactory 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,3 @@
++A very useful feature would be a FilterFactory, i.e. some system whereby filter writers can avoid
++getting their hands messy with the details of building and operating a G[tk]Object. A couple of
++structures and a couple of functions should do it.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/IDEAS gstreamer-0.10.23/docs/random/omega/IDEAS
+--- gstreamer-0.10.23.orig/docs/random/omega/IDEAS 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/IDEAS 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,21 @@
++Plugin Registry:
++Have a web-accessible database of plugins from everywhere, including their merit values. gstplugin.c
++and the autoplug code (should we abstract out autoplug into a special file? I think so) can make use of
++this database via another module (gstwebregistry.c?) to look up stuff. A copy of the registry (gzip'd
++XML) could even be cached. System and user options would determine whether this registry is checked
++and/or updated automatically. The registry could simply be merged with the local machine and user
++registries, with the state bit set to "don't even have it". Autodownload/install code should be
++provided, though designed such that it's not toolkit/OS specific.
++
++Merit:
++Plugins and even type definition should carry merit values, allowing the system to determine which
++plugin or type definition is better. This can be tied into the web registry setup, where merit values
++can be updated without requiring an update of the plugins themselves. They can also be guaranteed
++unique if there's a range reserved for registered objects. Unfortunately, that might get us into some
++political wars. We could leave that up to the users via some voting system.
++
++Scheduling state:
++All the scheduling info for a Bin should be contained in a single object of some form. This can be
++saved off and restored seamlessly at some point in the future. This would be ideal for some autoplug
++cases, where the rest of the pipeline simply ceases to exist temporarily, and scheduling entry points
++may need to be modified until the autoplug stage is finished.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/output_policies gstreamer-0.10.23/docs/random/omega/output_policies
+--- gstreamer-0.10.23.orig/docs/random/omega/output_policies 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/output_policies 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,61 @@
++GStreamer polices for various forms of library output, including error cases.
++
++
++g_return_...
++============
++The parameters of a function are checked for validity (non-NULL, correct type, etc.) with g_return[_val]_if_fail, i.e.:
++
++gst_element_connect (GstElement *src, gchar *srcpadname,
++ GstElement *dest, gchar *destpadname) {
++ g_return_if_fail (src != NULL);
++ g_return_if_fail (GST_IS_ELEMENT(src));
++ g_return_if_fail (srcpadname != NULL);
++ g_return_if_fail (dest != NULL);
++ g_return_if_fail (GST_IS_ELEMENT(dest));
++ g_return_if_fail (destpadname != NULL);
++
++This will inform the user of the library of any basic problems with the arguments they pass, such as a NULL pointer.
++
++
++ERROR
++=====
++The ERROR macro will be used whenever there is some other type of flaw in the data passed, at a GStreamer-specific
++level:
++
++ srcpad = gst_element_get_pad (src, srcpadname);
++ if (srcpad == NULL) {
++ ERROR(src,"source element has no pad \"%s\"",srcpadname);
++ return;
++ }
++
++An ERROR will generally cause ceasation of the application, and ideally launch gdb.
++
++
++INFO
++====
++The INFO macro will be used to output any interesting state from the library, such as plugin loading and various events
++of interest. They will be separated into categories that can be individually enabled and disabled.
++
++Categories (first draft of list, unordered):
++
++cothreads [cothreads.c]
++gst initialization [gst.c]
++autoplug results [autoplug.c]
++autoplug attempts [autoplug.c]
++bin parentage issues [gstbin.c]
++plan generation [gstbin.c]
++schedule generation [gstschedule.c]
++schedule implementation [gstpad.c, gstbin.c, etc.]
++buffer operations [gstbuffer.h]
++caps matching [gstcaps.c]
++clock stuff [gstclock.c]
++element pad operations [gstelement.c]
++elementfactory operations [gstelementfactory.c]
++pad creation/connection [gstpad.c]
++pipeline stuff [gstpipeline.c]
++plugin loading [gstplugin.c]
++plugin loading errors [gstplugin.c]
++properties operations [gstprops.c]
++thread creation/management [gstthread.c]
++type operations [gsttype.c]
++XML load/save [gstxml.c]
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/pad-negotiation gstreamer-0.10.23/docs/random/omega/pad-negotiation
+--- gstreamer-0.10.23.orig/docs/random/omega/pad-negotiation 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/pad-negotiation 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,40 @@
++OUTDATED, EARLY IDEA
++--------------------
++
++When two pads are connected, a negotiation phase is going to have to
++happen. Ideally, the caps of the two pads will both be fully-specified,
++and match. That's the ideal case, but may rarely happen in practice.
++
++It'll work the following way:
++
++1) gst_pad_connect(pad1,pad2) is called by something
++2) pad1's negotiate() method is called, with pad2 as argument
++3) negotiate() repeatedly calls pad2's set_caps() method
++
++At some point, the two pads will agree on a set of caps, and proceed by
++returning TRUE from negotiate(), at which point gst_pad_connect()
++finishes. If it returns FALSE, gst_pad_connect() is forced to fail.
++
++Now, obviously the algorithm used to find matching caps can get
++complicated. But in some cases it'll be simple. Ideally, if there is no
++negotiate() function for pad1, there'll be a function that will go through
++the options and try to make pad1 and pad2 meet in the middle, with no
++specific knowledge of what the caps actually mean.
++
++Another detail is deciding which pads are pad1 and pad2. In the autoplug
++case, the code will sometimes know which of the pads have the more
++specific caps. In others, you may not. Either you can guess, and
++possibly lose to having the slower of the two pad's negotiate() methods do
++the work, or you might be able to actually guess at which is the most
++specific set of caps:
++
++For any given typeid in the union of both pads, look at all properties
++ For each property, find the smallest range, assign this a 1.0
++ For all other instances of this property, assign relative to 1.0
++For each pad1,pad2
++ Take the assigned value of every property, and multiply together
++
++Whichever value is lower between pad1 and pad2 is most likely to be the
++most specific set of caps. The trick is implementing the above
++efficiently, but on the surface there appear to be more than enough
++potential optimizations.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/padtemplates gstreamer-0.10.23/docs/random/omega/padtemplates
+--- gstreamer-0.10.23.orig/docs/random/omega/padtemplates 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/padtemplates 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,46 @@
++OUTDATED
++--------
++
++typedef gpointer GstCapsFactoryEntry;
++typedef GstCapsFactoryEntry GstCapsFactory[];
++typedef GstCapsFactory *GstCapsListFactory[];
++
++typedef gpointer GstPadFactoryEntry;
++typedef GstPadFactoryEntry GstPadFactory[];
++typedef GstPadFactory *GstPadListFactory[];
++
++#define GST_PADFACTORY_SRC GINT_TO_POINTER (GST_PAD_SRC)
++#define GST_PADFACTORY_ALWAYS GINT_TO_POINTER (GST_PAD_ALWAYS)
++
++typedef struct GstPadTemplate {
++ gchar *name_template;
++ gint direction;
++ gint presence;
++ GList *caps;
++};
++
++GstPadFactory mpg123_src_padfactory = {
++ "src"
++ GST_PADFACTORY_SRC,
++ GST_PADFACTORY_ALWAYS,
++
++ "audio/raw"
++ "samplerate", GST_PROPS_INT (44100),
++ . . .
++ NULL
++};
++
++static GstPadTemplate *srcpadtemplate;
++
++mpg123_new(GstMpg123 *mpg123) {
++ mpg123->srcpad = gst_pad_new_template("src", srcpadtemplate);
++ . . .
++}
++
++plugin_init() {
++ GstElementFactory *factory;
++
++ factory = gst_elementfactory_new("mpg123",. . .);
++ srcpadtemplate = gst_padfactory_new(mpg123_src_padfactory);
++ get_elementfactory_add_padtemplate (srcpadtemplate);
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/plan-generation gstreamer-0.10.23/docs/random/omega/plan-generation
+--- gstreamer-0.10.23.orig/docs/random/omega/plan-generation 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/plan-generation 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,87 @@
++OUTDATED
++--------
++
++Plan generation happens at transition from NULL to READY (and PLAYING to READY right now, need to fix
++that). By way of some logic in gst_bin_change_state(), gst_bin_create_plan() is only called for the
++outer Bin, usually a Pipeline. This keeps things from getting nasty later on.
++
++A major new concept in plan generation is that of the 'manager'. This is the element that is reponsible
++for running a given element. In general, Pipelines and Threads are the only managing-capable elements
++(have the MANAGER flag set), since they are the only ones with real scheduling authority (because they
++have a process context to play with, basically).
++
++gst_bin_set_manager() is called to set the manager element of the bin and all it's children and their
++children. However, there's one important trick: it won't recurse into child Bins that have the MANAGER
++flag set. This avoids some highly redundant recursion.
++
++When create_plan() is called on the outside Pipeline, the first thing it does is call
++set_manager(self,self). As noted above, this recursion will not proceed into child Bins that have the
++MANAGER flag set.
++
++The next step is to recursively generate the plan (yes, head-recursive). This gives child Bins the
++opportunity to generate their plan first, causing a inside-to-outside sequence. This matches the way
++the scheduling is arranged now, where the plan for a Src/Connection outside a Bin is handled by that
++Bin, not it's parent. But we must be very careful not to stomp on that plan in the parent Bin.
++
++Because create_plan() is called on all Bins, but we can only set up scheduling state in MANAGER bins,
++create_plan() must perform create_plan() recursion, but not do anything else *unless* the MANAGER bit is
++set. It shouldn't even call set_manager() unless it's a MANAGER itself, because calling it otherwise
++would waste time doing the work again. Basically, from the standpoing of setting the manager,
++create_plan() recursion starts it when the current Bin is a MANAGER, and set_manager() stops when it
++finds the next one. create_plan()'s further recursion eventually starts the process back up again
++furtuer down the hierarchy, until everything is covered.
++
++For all MANAGER Bins, the last step is to actually create the scheduling plan. This is still one of the
++nastiest chunks of code in the whole project, and probably will do nothing but get worse from now on (it
++got better recently, but only because I took a chainsaw to the code and broke everthing...). It will
++remain similar to what it is now, but with some definite differences.
++
++First task is now to find all the elements that we're responsible for. This is normally a recursive
++process, because the structure is an arbitrary tree. However, something like the following should work
++(bin is self):
++
++ GSList *elements = NULL;
++ GList *children;
++ GSList *waiting_bins = NULL;
++ GstBin *waiting_bin;
++
++ waiting_bins = g_slist_prepend (waiting_bins,bin);
++
++ while (waiting_bins) {
++ // retrieve the top of the stack and pop it
++ waiting_bin = GST_BIN (waiting_bins->data);
++ waiting_bins = g_slist_remove (waiting_bins,waiting_bin);
++
++ // walk the list of elements, and find bins
++ children = waiting_bin->children;
++ while (children) {
++ // add it to the list of elements
++ elements = g_slist_prepend (elements, children->data);
++
++ // if it's a bin and it's not a managing bin,
++ // shove it on the list of bins to recurse into
++ if (GST_IS_BIN (children->data) &&
++ !GST_FLAG_IS_SET (GST_ELEMENT (children->data)))
++ waiting_bins = g_slist_prepend (waiting_bins,children->data);
++
++ children = g_list_next (children);
++ }
++ }
++
++The code makes the assumption that the manager of every element is the same until such time as a
++different managing parent appears in the hierarchy. This is the result of the aforementioned nested
++recursion of create_plan() and set_manager(), but may not remain the case forever. The above loop
++should probably be slightly re-written to work solely on whether or not the Bin in question is the
++element's manager. This means that the child Bins are *always* recursed into, in case there's a rogue
++element inside of one of them that's supposed to be managed.
++
++At the same time all the elements managed by this bin are found (i.e. in the inner loop), we can
++determine some useful bits of information, such as testing for several cases that require the use of
++cothreads. The availability of manager information at this point may aid significantly in this
++decision.
++
++Finally, the scheduling plan is generated, based on all the elements to be managed by the Bin (the list
++of which may span several 'generations' of Bins and elements). Elements which have peers in child
++self-managed Bins are left alone on for the pad in that makes that connection. This should keep the
++parent Bins from stepping all over state set up by the child Bins, by establishing clear implicit
++ownership on the pad level, based on the managing Bins' relationship to the pad.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/sched/chains gstreamer-0.10.23/docs/random/omega/sched/chains
+--- gstreamer-0.10.23.orig/docs/random/omega/sched/chains 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/sched/chains 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,89 @@
++A new concept in scheduling is that of chains of elements that need to be schedule separately, even in the same set of
++managed elements (which is the set of elements that the Bin in question [a pipeline or thread] is responsible for).
++An example would by anywhere you have a non-blocking queue in place for buffering. This kind of element might be
++useful in cases where the scheduling on a buffer level is tight enough that deadlocks might occur.
++
++The scheduler will find chains by traversing the pipeline through the list of managed elements. A chain boundary is
++anywhere you have a 'DECOUPLED' element. A DECOUPLED element is one where there is no direct correlation between the
++activities of the various pads. A source fits this description, although the normal single-pad source is the
++degenerate case. A queue more properly fits the bill, since pushing a buffer at the sink pad doesn't trigger anything
++on the src pad, and vice versa. A multi-src async source is probably the best example, since you want to leave the
++scheduling up to the elements connected to it.
++
++Anyway, first the simple case:
++
++fakesrc -> fakesink
++
++Both of them should probably have the DECOUPLED bit set, at least to be true to the nature of the actual fake elements.
++These two end up being a chain, and scheduling has to be set up for the chain. There are no cothreaded elements in the
++chain, which means it's relatively easy. The goal is to find a single entry into the chain, which can be called in a
++loop to get things done. Since the fakesrc is DECOUPLED, and we'd be messing with the source pad, it has lower
++priority than a DECOUPLED sink pad, so the fakesrc's sink pad is the ideal entry into the chain. This can be
++simplified into saying that the fakesink is the entry.
++
++In the end, the code to do this boils down to:
++
++ buf = gst_pad_pull (fakesink->sinkpad);
++ gst_pad_push (fakesink->sinkpad, buf);
++
++Because of the way things are no implemented for scheduling, turning it around and making the source the entry has no
++effect as far as the efficiency. That's because _get no longer directly calls gst_pad_push(), so we have to do it
++outside. No big deal, it boils down to the same thing I think, modulo a cache-line of stack (i.e. one or two fewer
++this way).
++
++If we put an identity in the middle:
++
++fakesrc -> identity -> fakesink
++
++then we have the same thing, except that there's now an element that isn't DECOUPLED, so it gets higher priority. That
++means the identity is now the entry, and when we push the buffer into its chain function, the fakesink gets called.
++
++Now, we can make this much more complex, with the following elementary echo meta-filter:
++
++ |=====| -> delay1 -> |=====|
++ | | | |
++-> queue -> | tee | -> delay2 -> | mix | -> queue ->
++ | | | |
++ |=====| -> delay3 -> |=====|
++
++The tee takes a buffer in and spits three out, delay shifts the timestamps around and possibly reframes things to be
++friendly. mix takes the three buffers and simply sums them (they're all audio). The tee element takes one buffer in
++and promptly spits three out, one after another. Delay takes an element and immediately spits out a buffer (it
++zero-pads at the beginning [the duration of the delay] for the sake of argument). Mix in this case is chained, but
++assumes that buffer will arrive in order. On the last chain, it does a push of the newly mixed audio buffer.
++
++The queues are both DECOUPLED, so they have lower weight. That leaves a bunch of other elements sitting there ripe for
++entry. But if we were to take delay1, what would happen? Well we can't, since there's no _get function on the tee's
++src pads.
++
++This just re-enforces the idea that the left-most (closest to the source, for you right-to-left people) element should
++get to be the entry. But what if we have multiple left-most elements?:
++
++-> queue -> eq1 -> |=====|
++ | mix | -> queue
++-> queue -> eq2 -> |=====|
++
++If eq1 is the only entry, we call pull on the queue, then chain over to mix. Mix then doesn't do anything with it,
++since it's waiting for another buffer before doing anything. That means we have to do the same with eq2, and have it
++chain to mix, at which point mix will do its magic and chain out to the right-hand side. Figure out to actually use
++both entries is hard, because the idea at this point is that there's only a single entry to a chain.
++
++Does this mean that we should make mix a DECOUPLED element? That would fix it to some extent, giving us three chains
++in the above case. Each eq chain would be driven by the eq element, pulling from the queue and pushing into the mixer.
++The mixer -> queue chain is problematic, because there is no possibly entry. The mixer side has no _get function
++(since the push always happens upon the receipt of a buffer from the second sink pad), which means that that those two
++pads have no possible entrance.
++
++Cothreads make this case much easier, since the mix element would drive things, forcing the eq elements to pull and
++process buffers in order as needed. It may be that the best option in the case where there are any multi-sinkpad
++elements is to turn them into cothreads.
++
++
++Now, on to cothreaded cases. The simplest possible is to turn all the elements into cothreads. I may punt on this and
++do just that for the moment, but there's still the question of what to do at the ends of the chain, where the DECOUPLED
++elements are. The easiest is to simply always make then chained, so there's never any worry about who owns the
++cothread context for the element, simply because there never will be one.
++
++fakesrc -> queue -> @identity -> fakesink
++
++We just set it up so both ends of the queue are chained, and all is well.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/sched/walkthrough-72 gstreamer-0.10.23/docs/random/omega/sched/walkthrough-72
+--- gstreamer-0.10.23.orig/docs/random/omega/sched/walkthrough-72 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/sched/walkthrough-72 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,39 @@
++72)
++
++ [-pipeline---------------------------------------------------------------------------------------------]
++ ! [-bin-----------------------------] [-thread---------] !
++ ! ! [--------] [---------] ! [------] [---------] [------] ! [--------] ! !
++ ! ! !faksesrc! !identity1! ! !queue1! !identity2! !queue2! ! !fakesink! ! !
++ ! ! ! src --- sink * src --- sink n src -- sink src -- sink src -- sink ! ! !
++ ! ! [--------] [---------] ! [------] [---------] [------] ! [--------] ! !
++ ! [---------------------------------] [----------------] !
++ [------------------------------------------------------------------------------------------------------]
++
++
++-----
++Ideally, you'd end up with the following sub-pipelines
++
++pipeline:
++fakesrc -> identity1 -> queue1
++queue1 -> identity2 -> queue2
++
++thread:
++queue2 -> fakesink
++
++
++They'd be scheduled as following:
++
++fakesrc: passive chained, pulled by identity1
++identity1: loopfunc cothreaded, ENTRY
++queue1:sink: passive chained, pushed by identity1
++
++queue1:src: _get-based iteration, ENTRY
++identity2: chained by queue1
++queue2:src: passively chained, pushed by identity2
++
++queue2:sink: passively chained, pulled by fakesink
++fakesink: loopfunc cothreaded, ENTRY
++
++
++-----
++Most likely, we'd end up with the following
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/sched2 gstreamer-0.10.23/docs/random/omega/sched2
+--- gstreamer-0.10.23.orig/docs/random/omega/sched2 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/sched2 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,13 @@
++Currently, when an element wants to push or pull, they call gst_pad_*. These functions then decide what
++to do based on the selection of pointers in the pad. There are at least 2 options for each, plus some
++header stuff to do various checking of flags. Unfortunately, because of the selection of pointers in
++the pad, there is at least one case where scheduling has to be tricked, by providing a pointer to a
++function with no body.
++
++What I propse is that these functionos be replaced with macros that call a function pointer directly.
++The default functions (provided by GstPad) would be capable of chaining, that's about it. When a
++schedule is formed, these get replaced with more specific functions, provided by GstBin or a subclass.
++
++In the chain case, the pad_push_func might even be replaced brute force with the chain function, since
++they have the same prototype. In the cothreaded case, various functions would provide the ability to
++switch, deal with bufpens, etc.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/sched-case gstreamer-0.10.23/docs/random/omega/sched-case
+--- gstreamer-0.10.23.orig/docs/random/omega/sched-case 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/sched-case 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,20 @@
++Case 1:
++
++
++---------------------------------------------------
++| pipeline |
++| --------------- ---------------- |
++| | bin | | thread | |
++| | ----------- | ------------ | ------------ | |
++| | | fakesrc | | | queue | | | fakesink | | |
++| | | src>|-|--|<sink src>|--|-|<sink | | |
++| | ----------- | ------------ | ------------ | |
++| --------------- ---------------- |
++---------------------------------------------------
++
++Pipeline manages: fakesrc, queue
++Thread manages: fakesink
++Both forced to use cothreads.
++
++First thing the thread does is try to pull from the queue. Because it's a chain function, it runs in
++_chain_wrapper, which calls gst_pad_pull().
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/sched-commit1 gstreamer-0.10.23/docs/random/omega/sched-commit1
+--- gstreamer-0.10.23.orig/docs/random/omega/sched-commit1 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/sched-commit1 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,103 @@
++STATUS: pushregion/pullregion is gone
++-------------------------------------
++
++Changed the way things are scheduled, especially sources. A Src used to
++have a push() function, and optionally a pushregion() to deal with async
++reads, etc. That whole thing has gone away, in favor of providing a
++pull() function for the output (Src) pad instead, ala chain functions.
++This makes constructing cothreaded schedules out of non-loop elements
++somewhat easier. Basically there was always a question as to which pad
++was being dealt with. In the pullregion case, cothread-specific data was
++used to try to pass the region struct to the right place, which is a slow
++hack. And in general, the push function severely limited the kind of
++tricks that could be played when there's more than one output pad, such as
++a multi-out file reader with async capabilities on each pad independently.
++
++This changes the way cothread scheduling occurs. Instead of the hack to
++deal with Src's by calling their push() function (or optionally the
++pushregion(), in certain cases), we now are working towards a general
++mechanism where pads are the only thing that are dealt with directly.
++
++An optimization was made in the process of doing this: the loopfunction
++actually run as the outer [stack] frame of the cothread is now set more
++intelligently in create_plan() based on what kind of element it is. We
++now have:
++
++loopfunc_wrapper: used for loop-based elements, it simply calls the
++ loopfunc in a loop, paying attention to COTHREAD_STOPPING (see
++ below). It currently does other, soon to be depracated, stuff.
++
++pullsrc_wrapper: wraps a Src that's not loop-based (since your options
++ are now loop- or pull-based)
++
++There will be a couple more to deal with other cases, such as Connections
++and chain-based elements. The general idea is that it's a lot more
++efficient to make the decisions once in create_plan than to keep doing
++this huge if/else chain in the wrapper. Just choose the right wrapper up
++front. It'll be most apparent performance-wise in the case of whichever
++element context is switched to first for each iteration, since the whole
++wrapper setup is done for every iteration.
++
++The tricky part is that there is now a bit of overloading of the function
++pointers in a pad. The current meanings (possibly to change a bit more
++soon) are:
++
++chainfunc: as always, chainfunc pointer is mirrored between peer pads
++ (this may change, and the chain func may end up in pushfunc)
++pushfunc: SrcPad: gst_pad_pushfunc_proxy, cothread_switch to peer
++ SinkPad: none (may take over chainfunc, see below) pullfunc:
++SrcPad: Src or Connection's function to construct buffers
++ SinkPad: gst_pad_pullfunc_proxy, cothread_switch to peer
++
++There are a number of issues remaining with the scheduling, not the least
++of which is the fact that Connections are still dealt with the old way,
++with _push() functions and such. I'm trying to figure out a way to unify
++the system so it makes sense. Following the scheduling system is hard
++enough, trying to change it is murder.
++
++
++Another useful scheduling addition, mentioned above, is COTHREAD_STOPPING.
++It's an element flag that's used to signal whatever code is running in
++cothread context that it should be finishing up and exiting soon. An
++example of this is in plugins/cobin/spindentity.c. All the loops should
++now be composed of do/while loops, rather than while(1) loops:
++
++ do {
++ buf = gst_pad_pull(spindentity->sinkpad);
++ gst_pad_push(spindentity->srcpad,buf);
++ } while (!GST_ELEMENT_IS_COTHREAD_STOPPING(element));
++
++The reason for this is that COTHREAD_STOPPING may be set before the above
++loop ever gets started. It wouldn't do for the body of the loop to never
++once get called, that would simply stall the pipeline. Note that only the
++core library code is ever responsible for setting and unsetting this flag.
++All elements have to do is respond to it by cleanly exiting the loop and
++the function holding it.
++
++This is needed primarily to allow iterations to occur properly.
++Basically, there's a single entry point in the cothread scheduling loop,
++gst_bin_iterate_func() simply switches to this cothread. If the element
++in this context is allowed to loop infinitely, nothing would even switch
++back to the context from which the iterate() was originally called. This
++is a bit of a problem. The solution is for there to be an implicit switch
++back to the originating context. Now, even I'm not sure exactly how this
++works, but if the cothread that's switched to actually returns, execution
++returns back to the calling context, i.e. iterate_func().
++
++COTHREAD_STOPPING is therefore set just before switching into this
++(currently randomly chosen) context, on the assumption that it will return
++promptly after finishing its duties. The burden of clearing the flag
++falls to the various wrapper functions provided by the Bin code, thus
++element writers don't have to worry about doing that at all (and simply
++shouldn't).
++
++
++Related changes:
++All the sources in elements/ have been changed to reflect the new system.
++
++
++FIXMEs:
++1) gstpipeline.c calls gst_src_push at some point, dunno why, it's
++commented out now.
++2) any other sources, including vcdsrc, dvdsrc, and v4lsrc will break
++badly and need to be modified to work as pull-based sources.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/scheduling gstreamer-0.10.23/docs/random/omega/scheduling
+--- gstreamer-0.10.23.orig/docs/random/omega/scheduling 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/scheduling 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,66 @@
++STATUS: pull on srcpads is outdated, they use _get
++--------------------------------------------------
++
++0) definitions:
++
++All pads without further specifiers are assumed to belong to the element
++in question. The pad's peer is always denoted with ->peer. If there's
++question, pads will be prefixed with self-> and other-> as necessary.
++
++All elements in this document have at most one source and one sink pad,
++called srcpad and sinkpad. Multi-pad cases are supposed to be simple
++extrapolations except in a couple strange cases, to be covered elsewhere.
++
++
++1) loop functions:
++
++A loop function will call gst_pad_pull(sinkpad), do something, and call
++gst_pad_push(srcpad).
++
++gst_pad_pull first checks to see if there's a buffer in the pen. If not,
++it calls that pad's pullfunc handler, passing it the peer pad. When that
++finishes, we check again and return the buffer. If no buffer, we squawk.
++The pullfunc handler simply causes a cothread switch to the peer pad's
++context;
++
++gst_pad_push places the buffer in the peer pad's pen, and calls the local
++pad's pushfunc. The pushfunc simply causes a switch to the peer pad's
++context.
++
++
++2) chain functions
++
++The loopfunc constructed around a chain function starts by finding all
++sink pads. For each sink pad, it calls gst_pad_pull. This causes a
++switch to the peer pad's context and a buffer to appear, which is
++returned. The pad is the handed off to the chain function, which
++presumably does some processing and calls gst_pad_push(), which causes a
++context switch to that pad's peer.
++
++
++
++3) source
++
++The loopfunc must repeatedly call the srcpad's pull
++
++
++
++
++
++--------------------------------- ---------------------------------
++ srcpad | | sinkpad
++ | |
++ GstPad *peer; | <-p-> | GstPad *peer;
++ pointer to peer pad | | pointer to peer pad
++ | |
++ funcptr *pushfunc; | --s-> | funcptr *pushfunc;
++ causes switch to peer ctx | | element uses buffer in pen,
++ | |
++ funcptr *pullfunc; | <-s-- | funcptr *pullfunc;
++ element puts buffer in pen, | | causes switch to peer ctx
++ calls gst_pad_push() | |
++ | |
++ funcptr *pullregion func | <-s-- | funcptr *pullregionfunc;
++ element puts region in pen | | causes switch to peer ctx
++ calls gst_pad_push() | |
++--------------------------------- ---------------------------------
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/testing/framework gstreamer-0.10.23/docs/random/omega/testing/framework
+--- gstreamer-0.10.23.orig/docs/random/omega/testing/framework 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/testing/framework 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,144 @@
++Construction
++Validation
++Testing
++
++Construction will generate some state
++Validation will ensure that everything is kosher
++Tests use combinations of the above to check things
++
++##### Example:
++parent = gst_object_get_parent(object);
++
++setup:
++ create: new object
++ action: object = gst_object_new();
++ validation: object != NULL, object->parent == NULL, etc
++ [cleanup: gst_object_destroy(object);]
++ create: new parent
++ action: parent = gst_object_new();
++ validation: parent != NULL, parent->parent == NULL, etc
++ [cleanup: gst_object_destroy(parent);]
++ create: set object's parent
++ precondition: object->parent == NULL
++ action: gst_object_set_parent(object,parent);
++ validation: object->parent = parent
++preconditions:
++ nothing
++action:
++ curparent = gst_element_get_parent(object);
++validaton:
++ curparent == object->parent
++ curparent == parent
++cleanup:
++ nothing
++
++
++##### Resulting code:
++
++///// setup
++// new object
++object = gst_object_new();
++ASSERT(object != NULL);
++ASSERT(object->parent == NULL);
++// new object
++parent = gst_object_new();
++ASSERT(parent != NULL);
++ASSERT(parent->parent == NULL);
++// set object parent
++ASSERT(object->parent == NULL);
++gst_object_set_parent(object,parent);
++ASSERT(object->parent != NULL);
++
++///// preconditions
++
++///// action
++curparent = gst_element_get_parent(object);
++
++///// validation
++ASSERT(object->parent == parent);
++
++///// cleanup
++gst_object_destroy(parent);
++gst_object_destroy(object);
++
++
++
++##### XML descriptions
++
++<construct name="new object">
++ <variable>
++ GstObject *object;
++ </variabls>
++ <action>
++ object = gst_object_new();
++ </action>
++ <validation>
++ <assert>
++ object != NULL
++ </assert>
++ <assert>
++ GST_IS_OBJECT(object)
++ <assert>
++ object->parent == NULL
++ </assert>
++ </validation>
++ <cleanup>
++ <validation>
++ <assert>
++ object != NULL
++ </assert>
++ <assert>
++ GST_IS_OBJECT(object)
++ </assert>
++ </validation>
++ <action>
++ gst_object_destroy(object);
++ </action>
++ </cleanup>
++</construct>
++
++<construct name="set object parent">
++ <variable>
++ GstObject *object;
++ </variable>
++ <variable>
++ GstObject *object;
++ </variable>
++ <precondition>
++ <assert>
++ object->parent == NULL
++ </assert>
++ </precondition>
++ <action>
++ gst_object_set_parent(object,parent);
++ </action>
++ <validation>
++ <assert>
++ object->parent == parent
++ </assert>
++ </validation>
++</construct>
++
++<test name="set object parent">
++ <variable>
++ GstObject *object;
++ <variable>
++ </variable>
++ GstObject *parent;
++ <variable>
++ </variable>
++ GstObject *curparent;
++ </variable>
++ <setup>
++ object = gst_object_new();
++ parent = gst_object_new();
++ gst_object_set_parent(object,parent);
++ </setup>
++ <action>
++ curparent = gst_element_get_parent(object);
++ </action>
++ <validation>
++ curparent == object->parent
++ curparent == parent
++ </validation>
++</test>
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/testing/gstobject.c gstreamer-0.10.23/docs/random/omega/testing/gstobject.c
+--- gstreamer-0.10.23.orig/docs/random/omega/testing/gstobject.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/testing/gstobject.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,314 @@
++#include <gst/gst.h>
++
++static gchar *_subject, *_category;
++static gint _testnum = 0;
++static gboolean _passed;
++static gint _total_tests = 0, _passed_tests = 0;
++static gint _random_size;
++
++void
++tabpad (gchar * str, gint width)
++{
++ int i;
++
++ for (i = 0; i < width - strlen (str); i++)
++ fprintf (stderr, " ");
++}
++
++#define TEST_SUBJECT(subject) fprintf(stderr,"Subject: %s\n",subject),_subject = subject
++#define TEST_CATEGORY(category) fprintf(stderr,"\n\nCategory: %s\n",category)
++
++#define TEST(test) fprintf(stderr,"Test %d: %s...\n",_testnum,test),_passed = TRUE
++#define ASSERT(expr) G_STMT_START{ \
++ fprintf(stderr,"\t%s:",#expr);tabpad(#expr,50); \
++ if (!(expr)) { \
++ fprintf(stderr,"FAILED\n"); \
++ _passed = FALSE; \
++ } else { \
++ fprintf(stderr,"passed\n"); \
++ } \
++}G_STMT_END;
++#define ENDTEST() G_STMT_START{ \
++ _testnum++; \
++ if (_passed) { \
++ fprintf(stderr,"\tpassed.\n"); \
++ _passed_tests++; \
++ } else { \
++ fprintf(stderr,"\tFAILED.\n"); \
++ } \
++ _total_tests++; \
++}G_STMT_END;
++
++void
++SETUP_RANDOM_SIZE (void *random, gint size)
++{
++ int i;
++
++ if (random)
++ g_free (random);
++ _random_size = size;
++ random = g_malloc (_random_size);
++ for (i = 0; i < _random_size; i++)
++ ((unsigned char *) random)[i] = i;
++}
++
++#define SETUP_RANDOM(random,type) SETUP_RANDOM_SIZE(random,sizeof(type))
++
++gboolean
++RANDOM_OK (void *random)
++{
++ int i;
++
++ for (i = 0; i < _random_size; i++) {
++ if (((unsigned char *) random)[i] != i) {
++ SETUP_RANDOM_SIZE (random, _random_size);
++ return FALSE;
++ }
++ }
++ return TRUE;
++}
++
++int
++main (int argc, char *argv[])
++{
++ GstObject *object;
++ GstObject *parent;
++ GstObject *newparent;
++ GtkObject *gtkobject;
++ GstObject *curparent;
++
++ gst_init (&argc, &argv);
++
++ TEST_SUBJECT ("GstObject");
++
++
++ TEST_CATEGORY ("Creation");
++
++ TEST ("create object");
++ /* setup */
++ /* action */
++ object = gst_object_new ();
++ /* assertions */
++ ASSERT (object != NULL);
++ ASSERT (GST_IS_OBJECT (object));
++ /* cleanup */
++ g_free (object);
++ ENDTEST ();
++
++
++ /* new category */
++ TEST_CATEGORY ("Refcounting");
++ /* category setup */
++ object = gst_object_new ();
++
++ TEST ("new object");
++ /* setup */
++ /* action */
++ /* assertions */
++ ASSERT (object->refcount == 1);
++ ASSERT (GTK_OBJECT_FLOATING (object) == TRUE);
++ /* cleanup */
++ ENDTEST ();
++
++ TEST ("increment refcount");
++ /* setup */
++ /* action */
++ gst_object_ref (object);
++ /* assertions */
++ ASSERT (object->refcount == 2);
++ ASSERT (GTK_OBJECT_FLOATING (object) == TRUE);
++ /* cleanup */
++ ENDTEST ();
++
++ TEST ("sink object");
++ /* setup */
++ /* action */
++ gst_object_sink (object);
++ /* assertions */
++ ASSERT (object->refcount == 1);
++ ASSERT (GTK_OBJECT_FLOATING (object) == FALSE);
++ /* cleanup */
++ ENDTEST ();
++
++ TEST ("increment refcount after sink");
++ /* setup */
++ /* action */
++ gst_object_ref (object);
++ /* assertions */
++ ASSERT (object->refcount == 2);
++ ASSERT (GTK_OBJECT_FLOATING (object) == FALSE);
++ /* cleanup */
++ ENDTEST ();
++
++ TEST ("decrement refcount after sink");
++ /* setup */
++ /* action */
++ gst_object_unref (object);
++ /* assertions */
++ ASSERT (object->refcount == 1);
++ ASSERT (GTK_OBJECT_FLOATING (object) == FALSE);
++ /* cleanup */
++ ENDTEST ();
++
++ /* category cleanup */
++ g_free (object);
++
++
++
++ /* new category */
++ TEST_CATEGORY ("Parentage");
++ /* category setup */
++ object = gst_object_new ();
++ parent = gst_object_new ();
++ newparent = gst_object_new ();
++ gtkobject = gtk_type_new (gtk_object_get_type ());
++ /* category assertions */
++ ASSERT (object != NULL);
++ ASSERT (object->refcount == 1);
++ ASSERT (object->parent == NULL);
++ ASSERT (parent != NULL);
++ ASSERT (newparent != NULL);
++ ASSERT (gtkobject != NULL);
++ ASSERT (!GST_IS_OBJECT (gtkobject));
++
++ TEST ("gst_object_set_parent: null object");
++ /* setup */
++ /* action */
++ gst_object_set_parent (NULL, NULL);
++ /* assertions */
++ ASSERT (object->parent == NULL);
++ /* cleanup */
++ ENDTEST ();
++
++ TEST ("gst_object_set_parent: invalid object");
++ /* setup */
++ /* action */
++ gst_object_set_parent ((GstObject *) gtkobject, NULL);
++ /* assertions */
++ ASSERT (object->parent == NULL);
++ /* cleanup */
++ ENDTEST ();
++
++ TEST ("gst_object_set_parent: null parent");
++ /* setup */
++ /* action */
++ gst_object_set_parent (object, NULL);
++ /* assertions */
++ ASSERT (object->parent == NULL);
++ /* cleanup */
++ ENDTEST ();
++
++ TEST ("gst_object_set_parent: invalid parent");
++ /* setup */
++ /* action */
++ gst_object_set_parent (object, (GstObject *) gtkobject);
++ /* assertions */
++ ASSERT (object->parent == NULL);
++ /* cleanup */
++ ENDTEST ();
++
++ TEST ("gst_object_set_parent: valid object, parent is object");
++ /* setup */
++ /* action */
++ gst_object_set_parent (object, object);
++ /* assertions */
++ ASSERT (object->parent == NULL);
++ /* cleanup */
++ ENDTEST ();
++
++ TEST ("gst_object_set_parent: valid object and parent");
++ /* setup */
++ /* action */
++ gst_object_set_parent (object, parent);
++ /* assertions */
++ ASSERT (object->parent == parent);
++ /* cleanup */
++ ENDTEST ();
++
++ TEST ("gst_object_set_parent: parent already set");
++ /* setup */
++ /* action */
++ gst_object_set_parent (object, newparent);
++ /* assertions */
++ ASSERT (object->parent != newparent);
++ ASSERT (object->parent == parent);
++ /* cleanup */
++ g_free (object);
++ ENDTEST ();
++
++
++ TEST ("gst_object_get_parent: null object");
++ /* setup */
++ /* action */
++ curparent = gst_object_get_parent (NULL);
++ /* assertions */
++ ASSERT (curparent == NULL);
++ /* cleanup */
++ ENDTEST ();
++
++ TEST ("gst_object_get_parent: invalid object");
++ /* setup */
++ /* action */
++ curparent = gst_object_get_parent ((GstObject *) gtkobject);
++ /* assertions */
++ ASSERT (curparent == NULL);
++ /* cleanup */
++ ENDTEST ();
++
++ TEST ("gst_object_get_parent: no parent");
++ /* setup */
++ object = gst_object_new ();
++ /* action */
++ curparent = gst_object_get_parent (object);
++ /* assertions */
++ ASSERT (curparent == NULL);
++ /* cleanup */
++ ENDTEST ();
++
++ TEST ("gst_object_get_parent: valid parent");
++ /* setup */
++ gst_object_set_parent (object, parent);
++ /* action */
++ curparent = gst_object_get_parent (object);
++ /* assertions */
++ ASSERT (curparent == parent);
++ /* cleanup */
++ g_free (object);
++ ENDTEST ();
++
++
++ TEST ("gst_object_unparent: null object");
++ /* setup */
++ /* action */
++ gst_object_unparent (NULL);
++ /* assertions */
++ /* NONE - FIXME! */
++ /* cleanup */
++ ENDTEST ();
++
++ TEST ("gst_object_unparent: invalid object");
++ /* setup */
++ /* action */
++ gst_object_unparent ((GstObject *) gtkobject);
++ /* assertions */
++ /* NONE - FIXME! */
++ /* cleanup */
++ ENDTEST ();
++
++ TEST ("gst_object_unparent: no parent");
++ /* setup */
++ object = gst_object_new ();
++
++
++ /* category cleanup */
++ g_free (object);
++ g_free (parent);
++ g_free (newparent);
++ g_free (gtkobject);
++
++
++
++ fprintf (stderr, "\n\nTotal tests:\t%d\n", _total_tests);
++ fprintf (stderr, "Total passed:\t%d\n", _passed_tests);
++ fprintf (stderr, "Total FAILED:\t%d\n", _total_tests - _passed_tests);
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/testing/gstobject.txt gstreamer-0.10.23/docs/random/omega/testing/gstobject.txt
+--- gstreamer-0.10.23.orig/docs/random/omega/testing/gstobject.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/testing/gstobject.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,95 @@
++Subject: GstObject
++
++Areas to test
++=============
++
++Creation
++Refcounting
++Destruction
++Flags
++Locking
++Parentage
++Path string
++
++
++Tests
++=====
++
++Creation
++--------
++Create an object
++ Does it return !NULL
++ GST_IS_OBJECT() ?
++
++Refcounting
++-----------
++Create new object
++ object->refcount == 1, GTK_OBJECT_FLOATING(object) == TRUE
++Increment refcount
++ object->refcount == 2
++Sink object
++ object->refcount == 1, GTK_OBJECT_FLOATING(object) == FALSE
++Increment refcount
++ object->refcount == 2
++Decrement refcount
++ object->refcount == 1
++
++Destruction
++-----------
++???
++
++Flags (start with new object)
++-----
++Create new object
++ Verify that all flags are unset
++Set a flag
++ Verify it's set
++Unset a flag
++ Verify it's not set
++
++Locking (start with new object)
++-------
++Lock an object
++ Try to lock, get false
++
++Parentage (start with new object, check refcount == 1)
++---------
++gst_object_set_parent: (start with new parent object)
++ Pass NULL...
++ Pass !NULL, but not Object...
++ Pass NULL parent...
++ Pass !NULL parent, but not Object...
++ Pass valid Object, and parent == object
++ object->refcount == 1
++ GTK_OBJECT_FLOATING(object) == TRUE
++ object->parent == NULL
++ Pass valid Object
++ object->refcount == 1
++ GTK_OBJECT_FLOATING(object) == FALSE
++ object->parent == parent
++ The "parent_set" signal should fire with the object and parent as args
++ Pass Object with parent already set
++ object->parent should not equal new parent
++ object->refcount == 1
++gst_object_get_parent:
++ Pass NULL...
++ Pass !NULL, not Object...
++ Pass valid object with no parent
++ Get NULL
++ Pass valid object with parent
++ Get parent pointer
++gst_object_unparent:
++ Pass NULL, with no parent
++ no effect
++ Pass !NULL, not Object, NULL parent
++ pointer not mangled
++ Pass valid object, with no parent
++ object->parent == NULL
++ object->refcount = 1
++ Pass NULL, with valid parent
++ no effect
++ Pass !NULL, not Object, with valid object as parent
++ pointer not mangled
++ Pass valid object, with valid parent
++ object->parent == NULL
++ object->refcount == 0
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/testing/Makefile gstreamer-0.10.23/docs/random/omega/testing/Makefile
+--- gstreamer-0.10.23.orig/docs/random/omega/testing/Makefile 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/testing/Makefile 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,3 @@
++gstobject: gstobject.c
++ libtool gcc -o gstobject gstobject.c -I../../../.. ../../../../gst/libgst.la \
++`gtk-config --cflags --libs` `xml-config --cflags --libs`
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/TODO-0.1.0 gstreamer-0.10.23/docs/random/omega/TODO-0.1.0
+--- gstreamer-0.10.23.orig/docs/random/omega/TODO-0.1.0 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/TODO-0.1.0 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,54 @@
++mandatory:
++-----------
++
++(done) Fix compile warnings in gst/*
++
++Make sure all common media types work with autoplug and gstmediaplay
++
++Add interface to control the level of output, both compile- and run-time
++
++(done) Make sure the build is capable of being run without any debugging noise
++
++Make sure that the absense of any of the optional libraries will not be fatal
++
++Make sure all the old plugins don't build normally, via some configure option?
++
++Try to get more of the INFO calls worked out, removing gst_info
++
++Decide whether DEBUG should use the category system, and if so, implement it
++
++Icon for gstplay, .desktop file, etc.
++
++Build tarballs
++
++Build RPMs
++
++Figure out which docs we're going to make 'offical'
++
++UPDATE THE WEB SITE
++
++optional:
++---------
++
++Fix gstreamer-launch to do named pads
++
++Need to fix EOS subsystem so -launch can play out
++
++gstreamer-launch should play out till EOS
++
++Finish LADSPA plugin to data-moving stage
++
++
++
++things to remember for the anouncement:
++---------------------------------------
++
++Build requirements list:
++libtool 1.3.5 or patched to "pass_all"
++optional:
++libcdparanoia
++libmp3lame
++libxaudio
++libXv
++libgdk-pixbuf
++libglade
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/TYPE_FOURCC gstreamer-0.10.23/docs/random/omega/TYPE_FOURCC
+--- gstreamer-0.10.23.orig/docs/random/omega/TYPE_FOURCC 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/TYPE_FOURCC 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,3 @@
++#define GST_TYPE_FOURCC(f) \
++(((f)[0]) & ((f)[1] << 8) & ((f)[2] << 16) & ((f)[3] << 24))
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/omega/type-properties gstreamer-0.10.23/docs/random/omega/type-properties
+--- gstreamer-0.10.23.orig/docs/random/omega/type-properties 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/omega/type-properties 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,77 @@
++OUTDATED
++--------
++
++
++A type properties system might look like following:
++
++
++1) Type definition includes the properties and their ranges:
++
++audio/mp3
++ layer: 1 - 3
++ bitrate: 8 - 320
++
++audio/raw
++ format: bitfield (using asound.h definitions)
++ depth: 8 - 32
++ rate: 4000 - 96000
++ channels: 1 - n
++ interleave: boolean
++
++video/raw
++ format: 32-bit FOURCC
++ bpp: 1 - 32
++ width: 1 - n
++ height: 1 - n
++ framerate: 32-bit float
++
++etc.
++
++
++2) An element can specify what subtypes it can deal with by creating a list of property tables:
++
++mpg123: audio/mp3
++ layer: 1 - 3
++ bitrate: 8 - 320
++
++osssink:
++ format: S8, S16, etc.
++ depth: 8 - 16
++ rate: 8000 - 48000
++ channels: 1 - 2
++ interleave: true
++
++And you could list several of these, so for instance if the card only supports 8-bit at up to 22KHz in
++mono, you can remove S8 from the above list and add a second entry:
++
++osssink:
++ format: S8
++ depth: 8
++ rate: 8000 - 22050
++ channels: 1
++ interleave: false (irrelevant)
++
++The obvious problem with these examples is that the rate isn't really 8000 - 48000, it's 8000, 11025,
++16000, 22050, 44100, and 48000. However, we may be able to leave these to pad connect time.
++
++
++
++
++
++struct _type_definition {
++ char *mime_type;
++
++ ....
++
++ GData *properties;
++}
++
++gst_type_add_property_int(_type *type,gchar *propname,int min,int max) {
++ struct _type_prop_int prop_int;
++ GQuark quark = g_quark_from_string(propname);
++
++ prop_int->id = quark;
++ prop_int->min = min;
++ prop_int->max = max;
++ g_datalist_id_set_data(type->properties,quark,&prop_int);
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/phonon-gst gstreamer-0.10.23/docs/random/phonon-gst
+--- gstreamer-0.10.23.orig/docs/random/phonon-gst 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/phonon-gst 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,269 @@
++Phonon backend
++--------------
++
++ The phonon design is based around forming graphs using 3 basic components:
++
++ - a source component that generates raw audio/video/subtitle data, aka
++ MediaObject.
++ - an effect component that applies effects to raw audio/video known as
++ AudioPath/VideoPath respectively. Subtitles are routed to a VideoPath
++ - output components that render audio or video called AudioOutput and
++ VideoOutput.
++
++ there is also a special input object that allows for feeding raw data in the
++ pipeline and specialized sinks to retrieve audio samples and video frames from
++ the pipeline.
++
++ A typical graph or a source that produces an audio and a video stream that
++ need to be played. The VideoPath and AudioPath typically contain no filters
++ in this case:
++
++ +----+ +---
++ | FX | | ...
++ +----+ +---
++ V V
++ +-----------+ +-------------+
++ ----->| VideoPath |----->| VideoOutput |
++ | +-----------+ +-------------+
++ +-------------+
++ | MediaObject |
++ +-------------+
++ | +-----------+ +-------------+
++ +---->| AudioPath |----->| AudioOutput |
++ +-----------+ +-------------+
++ ^ ^
++ +----+ +---
++ | FX | | ...
++ +-+--+ +---
++
++ - This is very similar to a regular gstreamer playback pipeline.
++
++ A typical graph of playing and crosfading two sources:
++
++ +--------+
++ | volume |
++ +--------+
++ V
++ +-------------+ +-----------+
++ | MediaObject |--->| AudioPath |\
++ +-------------+ +-----------+ \ +-------------+
++ ---->| AudioOutput |
++ +-------------+ +-----------+ / +-------------+
++ | MediaObject |--->| AudioPath |/
++ +-------------+ +-----------+
++ ^
++ +--------+
++ | volume |
++ +--------+
++
++ - As soon as two audio paths are connected to one sink, the input signals are
++ mixed before sending them to the sink. The mixing is typically done in the
++ audio sink by an element such as adder.
++
++ Other types of graphs are possible too:
++
++ +-----------+
++ /| AudioPath |\
++ +-------------+ / +-----------+ \ +-------------+
++ | MediaObject |-- ---->| AudioOutput |
++ +-------------+ \ +-----------+ / +-------------+
++ \| AudioPath |/
++ +-----------+
++
++ - This graph sends the same out data to 2 effect filter graphs and then mixes
++ it to an audio output. The splitting of the graph typically happens with a
++ tee element after the media object.
++
++
++Questions
++---------
++
++ 1) do the following chains run
++
++ - synchronized with a shared clock?
++
++ +-------------+ +-----------+ +-------------+
++ | MediaObject |--->| AudioPath |--->| AudioOutput |
++ +-------------+ +-----------+ +-------------+
++
++ +-------------+ +-----------+ +-------------+
++ | MediaObject |--->| VideoPath |--->| VideoOutput |
++ +-------------+ +-----------+ +-------------+
++
++ - no API to set both MediaObjects atomically to play so it is assumed that
++ the playback starts and follows the rate of the global clock as soon as
++ the MediaObject is set to play. This makes unconnected chains run as if
++ they were in different GstPipelines.
++
++ 2) Threading:
++
++ - Can signals be emited from any thread?
++ - what operations are permited from a signal handler?
++
++ 3) Error reporting
++
++ - How does error reporting work?
++ * an audio/video device/port is busy.
++ * a fatal decoding error occured.
++ * a media type is not supported
++
++
++General
++-------
++
++ - Setting up KDE and Phonon build environment
++ - Testing, identifying test applications, building test cases
++ - Asking questions to Phonon maintainers/designers
++
++Essential classes
++-----------------
++
++These classes are essential to implement a backend and should be implemented
++first.
++
++Phonon::BackendCapabilities
++
++ Mostly exposes features in the registry like available decoders and effects.
++
++Phonon::Factory
++
++ Entry point for the GStreamer backend. Provides methods to create instances of
++ object from our backed.
++
++
++Simple playback
++---------------
++
++The following classes need to be implemented in order to have simple playback
++capabilities from the backend.
++
++Phonon::AudioOutput
++
++ - Wrapper around audiosinks. Also needs provision for rate and format
++ conversions.
++ - Mixing capabilities in the case when 2 audio paths are routed to it.
++
++ Notes:
++
++ * is the volume related to the device or to the connection to the device.
++
++Phonon::VideoWidget
++
++ - Wrapper around videosinks. Also needs provision for colorspace and size
++ conversions. Extends QWidget and probably needs to hook into the XOverlay
++ stuff to draw in the QT widget. Supports fullscreen mode with a switch.
++
++ - Needs mixing capabilities in the case when 2 video paths are routed to it.
++
++Phonon::AbstractMediaProducer
++
++ - contains stream selection
++ - play/pause/stop
++ - seeking
++ - periodically performs tick callbacks.
++
++Phonon::MediaObject:
++
++ - The object that decodes the media into raw audio/video/subtitle.
++ This object will use the GStreamer decodebin element to perform the
++ typefinding and decoding.
++
++Phonon::AudioPath/Phonon::VideoPath
++
++ - Simple container for audio/video effect plugins.
++ - Handles adding/removing of effects, making sure that the streaming is not
++ interrupted and the formats are all compatible.
++
++
++Effect support
++--------------
++
++Phonon::Visualization
++
++ Connects an AudioPath to a VideoWidget and allows for selection of a
++ visualisation plugin.
++
++Phonon::AudioEffect/Phonon::VideoEffect
++
++ Base classes
++
++Phonon::VolumeFaderEffect
++
++ Alows fade-in and fade-out with a configurable curve and time. Needs
++ GstController.
++
++Phonon::BrightnessControl
++
++ Controls the brightness of video.
++
++
++Playlist support
++----------------
++
++Phonon::MediaQueue:
++
++ ?? don't know yet where this fits in.
++
++
++Capture
++-------
++
++Phonon::AvCapture
++
++ Synchronized audio and video capture.
++
++Phonon::AudioWriter
++
++ Compress audio.
++
++
++Advanced features
++-----------------
++
++Phonon::ByteStream
++
++ Feed raw data into the pipeline. Used for streaming network access.
++
++ Implementation:
++
++ Possibly a specialized source element connected to a decodebin.
++
++ Notes:
++
++ * Phonon::ByteStream::writeData
++ - can it block?
++
++ * Phonon::ByteStream::setStreamSeekable
++ - If called before starting the ByteStream, decodebin might operate in pull
++ based mode when supported. Else the source is activated in push mode.
++ - If called after starting ByteStream, the Phonon::ByteStream::seekStream
++ signal can be called for push-based seekable streams.
++
++ * Can the signals be emited from a streaming thread?
++
++
++Phonon::AudioDataOutput/Phonon::VideoDataOutput/
++
++ Receive raw audio/video data from the pipeline. Used to allow applications to
++ deal with the raw data themselves.
++
++ Implementation:
++
++ Possibly a specialized sink element.
++
++ Notes :
++
++ * Phonon::AudioDataOutput::dataReady
++ - can this be emited from the streaming threads?
++
++ * Phonon::AudioDataOutput::endOfMedia
++ - can this be emited from the streaming threads?
++ - We need to grab this EOS message synchronously from the bus.
++ - should be emited _before_ sending the last dataReady. This means we need
++ to cache at least one dataReady.
++
++ * Phonon::AudioDataOutput::setDataSize
++ - can this be a _suggested_ data size or does every callback need to be of
++ this size?
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/plugins gstreamer-0.10.23/docs/random/plugins
+--- gstreamer-0.10.23.orig/docs/random/plugins 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/plugins 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,93 @@
++SOMEWHAT OUTDATED
++-----------------
++
++
++We describe how the plugin system works.
++
++Plugins
++-------
++
++plugins are basically shared libraries with a plugin_init
++function.
++
++they provide the GStreamer core library with the following
++information:
++
++ - element factories
++ - type factories
++ - metadata factories?
++
++ElementFactory
++--------------
++
++element factories provide the core library with elements (duh)
++
++an element factory has the following information:
++
++ - a unique name for the element factory
++ - strings describing the element (name, desciption, copyright,...)
++ - a description of the media types it accepts (as capabilities)
++ - a description of the media types it outputs (as capabilities)
++
++
++TypeFactory
++-----------
++
++has the following properties:
++
++ - a mime type
++ - file extensions that may provide a hint for this type
++ - a function to detect this type
++ - a string to detect this type (file(1) like)
++
++
++XML registry
++------------
++
++The complete plugin tree will be exported into an XML description so
++that the definitions of the factories can be obtained without having
++to load and plugin_init the plugins.
++
++Loading of plugins
++------------------
++
++at some point, the plugin will need to be read into memory before
++any elements it provides can be used. the XML description of the
++loaded plugin will need to be updated.
++
++We will have the following methods for (implicitly) loading plugins:
++
++ gst_plugin_load_all()
++
++ remove the complete XML tree and read all the plugins in the
++ paths. The plugin_init method will be called and the XML tree
++ will be rebuild in memory.
++
++ gst_plugin_load (name)
++
++ The plugin will be located in the tree and if it allready loaded, the
++ function returns. If it is not loaded, the XML entry is removed and
++ the plugin is loaded. The plugin_init is called so that the XML tree
++ is reconstructed.
++
++ gst_elementfactory_create (factory, name);
++
++ The plugin providing the element will be located, if the plugin is
++ allready loaded, an element with the given name is created.
++ if the plugin is not loaded, gst_plugin_load is called.
++ the loaded factory is located again and the element is created.
++
++ The typefind function is called
++
++ When the plugin description is read from the XML file, the typefind
++ function is hooked up to a dummy typefind function. The dummy typefind
++ function will locate the plugin it belongs to and call gst_plugin_load.
++ after the loading of the plugin, the real typefind function is called.
++
++
++
++
++
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/plugins.dia gstreamer-0.10.23/docs/random/plugins.dia
+--- gstreamer-0.10.23.orig/docs/random/plugins.dia 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/plugins.dia 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,941 @@
++<?xml version="1.0"?>
++<diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
++ <diagramdata>
++ <attribute name="background">
++ <color val="#ffffff"/>
++ </attribute>
++ <attribute name="paper">
++ <composite type="paper">
++ <attribute name="name">
++ <string>#A4#</string>
++ </attribute>
++ <attribute name="tmargin">
++ <real val="2.82"/>
++ </attribute>
++ <attribute name="bmargin">
++ <real val="2.82"/>
++ </attribute>
++ <attribute name="lmargin">
++ <real val="2.82"/>
++ </attribute>
++ <attribute name="rmargin">
++ <real val="2.82"/>
++ </attribute>
++ <attribute name="is_portrait">
++ <boolean val="true"/>
++ </attribute>
++ <attribute name="scaling">
++ <real val="1"/>
++ </attribute>
++ <attribute name="fitto">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <attribute name="grid">
++ <composite type="grid">
++ <attribute name="width_x">
++ <real val="1"/>
++ </attribute>
++ <attribute name="width_y">
++ <real val="1"/>
++ </attribute>
++ <attribute name="visible_x">
++ <int val="1"/>
++ </attribute>
++ <attribute name="visible_y">
++ <int val="1"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <attribute name="guides">
++ <composite type="guides">
++ <attribute name="hguides"/>
++ <attribute name="vguides"/>
++ </composite>
++ </attribute>
++ </diagramdata>
++ <layer name="Background" visible="true">
++ <object type="UML - Class" version="0" id="O0">
++ <attribute name="obj_pos">
++ <point val="0.85,4.15"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="0.8,4.1;12.3656,11.4"/>
++ </attribute>
++ <attribute name="elem_corner">
++ <point val="0.85,4.15"/>
++ </attribute>
++ <attribute name="elem_width">
++ <real val="11.4656"/>
++ </attribute>
++ <attribute name="elem_height">
++ <real val="7.2"/>
++ </attribute>
++ <attribute name="name">
++ <string>#GstPlugin#</string>
++ </attribute>
++ <attribute name="stereotype">
++ <string/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_attributes">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="visible_attributes">
++ <boolean val="true"/>
++ </attribute>
++ <attribute name="visible_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="attributes">
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#name#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#gchar *#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#longname#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#char *#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#filename#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#gchar *#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#loaded#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#gboolean#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#elements#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#GList *#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#types#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#GList *#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#autopluggers#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#GList *#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <attribute name="operations"/>
++ <attribute name="template">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="templates"/>
++ </object>
++ <object type="UML - Class" version="0" id="O1">
++ <attribute name="obj_pos">
++ <point val="17,9"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="16.95,8.95;31.9092,13.85"/>
++ </attribute>
++ <attribute name="elem_corner">
++ <point val="17,9"/>
++ </attribute>
++ <attribute name="elem_width">
++ <real val="14.8592"/>
++ </attribute>
++ <attribute name="elem_height">
++ <real val="4.8"/>
++ </attribute>
++ <attribute name="name">
++ <string>#GstElementFactory#</string>
++ </attribute>
++ <attribute name="stereotype">
++ <string/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_attributes">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="visible_attributes">
++ <boolean val="true"/>
++ </attribute>
++ <attribute name="visible_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="attributes">
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#name#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#gchar *#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#type#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#GtkType#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#details#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#GstElementDetails *#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#padtemplates#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#GList *#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <attribute name="operations"/>
++ <attribute name="template">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="templates"/>
++ </object>
++ <object type="UML - Association" version="0" id="O2">
++ <attribute name="obj_pos">
++ <point val="12.3156,9.25"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="10.8656,7.8;18.45,11.15"/>
++ </attribute>
++ <attribute name="orth_points">
++ <point val="12.3156,9.25"/>
++ <point val="15,9.25"/>
++ <point val="15,9.7"/>
++ <point val="17,9.7"/>
++ </attribute>
++ <attribute name="orth_orient">
++ <enum val="0"/>
++ <enum val="1"/>
++ <enum val="0"/>
++ </attribute>
++ <attribute name="name">
++ <string/>
++ </attribute>
++ <attribute name="direction">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="ends">
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string>#1#</string>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="2"/>
++ </attribute>
++ </composite>
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string>#*#</string>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="0"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <connections>
++ <connection handle="0" to="O0" connection="17"/>
++ <connection handle="1" to="O1" connection="3"/>
++ </connections>
++ </object>
++ <object type="UML - Class" version="0" id="O3">
++ <attribute name="obj_pos">
++ <point val="21,2"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="20.95,1.95;34.9396,6.85"/>
++ </attribute>
++ <attribute name="elem_corner">
++ <point val="21,2"/>
++ </attribute>
++ <attribute name="elem_width">
++ <real val="13.8896"/>
++ </attribute>
++ <attribute name="elem_height">
++ <real val="4.8"/>
++ </attribute>
++ <attribute name="name">
++ <string>#GstPadTemplate#</string>
++ </attribute>
++ <attribute name="stereotype">
++ <string/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_attributes">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="visible_attributes">
++ <boolean val="true"/>
++ </attribute>
++ <attribute name="visible_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="attributes">
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#name_template#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#gchar *#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#direction#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#GstPadDirection#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#presence#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#GstPadPresence#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#caps#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#GstCaps *#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <attribute name="operations"/>
++ <attribute name="template">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="templates"/>
++ </object>
++ <object type="UML - Association" version="0" id="O4">
++ <attribute name="obj_pos">
++ <point val="31.8592,13.3"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="30.4092,1.25;38.45,14.75"/>
++ </attribute>
++ <attribute name="orth_points">
++ <point val="31.8592,13.3"/>
++ <point val="37,13.3"/>
++ <point val="37,2.7"/>
++ <point val="34.8896,2.7"/>
++ </attribute>
++ <attribute name="orth_orient">
++ <enum val="0"/>
++ <enum val="1"/>
++ <enum val="0"/>
++ </attribute>
++ <attribute name="name">
++ <string/>
++ </attribute>
++ <attribute name="direction">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="ends">
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string>#1#</string>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="2"/>
++ </attribute>
++ </composite>
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string>#*#</string>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="0"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <connections>
++ <connection handle="0" to="O1" connection="15"/>
++ <connection handle="1" to="O3" connection="4"/>
++ </connections>
++ </object>
++ <object type="UML - Class" version="0" id="O5">
++ <attribute name="obj_pos">
++ <point val="17.1,14.85"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="17.05,14.8;32.494,18.9"/>
++ </attribute>
++ <attribute name="elem_corner">
++ <point val="17.1,14.85"/>
++ </attribute>
++ <attribute name="elem_width">
++ <real val="15.344"/>
++ </attribute>
++ <attribute name="elem_height">
++ <real val="4"/>
++ </attribute>
++ <attribute name="name">
++ <string>#GstTypeFactory#</string>
++ </attribute>
++ <attribute name="stereotype">
++ <string/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_attributes">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="visible_attributes">
++ <boolean val="true"/>
++ </attribute>
++ <attribute name="visible_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="attributes">
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#mime#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#gchar *#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#exts#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#gchar *#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#typefindfunc#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#GstTypeFindFunc#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <attribute name="operations"/>
++ <attribute name="template">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="templates"/>
++ </object>
++ <object type="UML - Association" version="0" id="O6">
++ <attribute name="obj_pos">
++ <point val="12.3156,10.05"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="10.8656,8.6;18.55,17"/>
++ </attribute>
++ <attribute name="orth_points">
++ <point val="12.3156,10.05"/>
++ <point val="15.7,10.05"/>
++ <point val="15.7,15.55"/>
++ <point val="17.1,15.55"/>
++ </attribute>
++ <attribute name="orth_orient">
++ <enum val="0"/>
++ <enum val="1"/>
++ <enum val="0"/>
++ </attribute>
++ <attribute name="name">
++ <string/>
++ </attribute>
++ <attribute name="direction">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="ends">
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string>#1#</string>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="2"/>
++ </attribute>
++ </composite>
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string>#*#</string>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="0"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <connections>
++ <connection handle="0" to="O0" connection="19"/>
++ <connection handle="1" to="O5" connection="3"/>
++ </connections>
++ </object>
++ <object type="UML - Class" version="0" id="O7">
++ <attribute name="obj_pos">
++ <point val="17.065,19.975"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="17.015,19.925;27.5201,24.025"/>
++ </attribute>
++ <attribute name="elem_corner">
++ <point val="17.065,19.975"/>
++ </attribute>
++ <attribute name="elem_width">
++ <real val="10.4051"/>
++ </attribute>
++ <attribute name="elem_height">
++ <real val="4"/>
++ </attribute>
++ <attribute name="name">
++ <string>#GstAutoplugFactory#</string>
++ </attribute>
++ <attribute name="stereotype">
++ <string/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_attributes">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="suppress_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="visible_attributes">
++ <boolean val="true"/>
++ </attribute>
++ <attribute name="visible_operations">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="attributes">
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#name#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#gchar *#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#longdesc#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#gchar *#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ <composite type="umlattribute">
++ <attribute name="name">
++ <string>#type#</string>
++ </attribute>
++ <attribute name="type">
++ <string>#GtkType#</string>
++ </attribute>
++ <attribute name="value">
++ <string/>
++ </attribute>
++ <attribute name="visibility">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="abstract">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="class_scope">
++ <boolean val="false"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <attribute name="operations"/>
++ <attribute name="template">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="templates"/>
++ </object>
++ <object type="UML - Association" version="0" id="O8">
++ <attribute name="obj_pos">
++ <point val="12.3156,10.85"/>
++ </attribute>
++ <attribute name="obj_bb">
++ <rectangle val="10.8656,9.4;18.515,22.125"/>
++ </attribute>
++ <attribute name="orth_points">
++ <point val="12.3156,10.85"/>
++ <point val="14.8,10.85"/>
++ <point val="14.8,20.675"/>
++ <point val="17.065,20.675"/>
++ </attribute>
++ <attribute name="orth_orient">
++ <enum val="0"/>
++ <enum val="1"/>
++ <enum val="0"/>
++ </attribute>
++ <attribute name="name">
++ <string/>
++ </attribute>
++ <attribute name="direction">
++ <enum val="0"/>
++ </attribute>
++ <attribute name="ends">
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string>#1#</string>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="2"/>
++ </attribute>
++ </composite>
++ <composite>
++ <attribute name="role">
++ <string/>
++ </attribute>
++ <attribute name="multiplicity">
++ <string>#*#</string>
++ </attribute>
++ <attribute name="arrow">
++ <boolean val="false"/>
++ </attribute>
++ <attribute name="aggregate">
++ <enum val="0"/>
++ </attribute>
++ </composite>
++ </attribute>
++ <connections>
++ <connection handle="0" to="O0" connection="21"/>
++ <connection handle="1" to="O7" connection="3"/>
++ </connections>
++ </object>
++ </layer>
++</diagram>
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/queue gstreamer-0.10.23/docs/random/queue
+--- gstreamer-0.10.23.orig/docs/random/queue 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/queue 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,38 @@
++ thread 1 thread2
++
++ // the queue is empty
++ while (!queue->level_buffers) {
++ STATUS("queue: %s U released lock\n");
++ GST_OBJECT_UNLOCK (queue);
++
++ // thread1 is scheduled and puts a lot of buffers
++ // in the queue
++
++ // thread1 has put the last buffer on the queue
++ // here. A signal is going to be emited
++
++ tosignal = (queue->level_buffers >= 0);
++ queue->level_buffers++;
++
++ /* we can unlock now */
++ GST_OBJECT_UNLOCK (queue);
++
++ if (tosignal) {
++ g_mutex_lock (queue->emptylock);
++ g_cond_signal (queue->emptycond);
++ g_mutex_unlock (queue->emptylock);
++ }
++
++ g_mutex_lock (queue->emptylock);
++ // wait forever
++ g_cond_wait (queue->emptycond, queue->emptylock);
++ g_mutex_unlock (queue->emptylock);
++ GST_OBJECT_LOCK (queue);
++ }
++
++
++ // thread 1 will also wait forever because the
++ // queue is filled....
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/release gstreamer-0.10.23/docs/random/release
+--- gstreamer-0.10.23.orig/docs/random/release 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/release 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,283 @@
++GStreamer Release Policies (or: why we should become a country and pass laws)
++--------------------------
++
++Development Period
++------------------
++Development period is marked by having a fourth (nano) version number of 1.
++During development anything goes short of wiping the tree.
++Just try doing a few basic things :
++- make sure it builds for you !
++- check what you're about to commit with cvs -Q diff -r
++- preferably, keep an anonymous checkout around as well so you can
++ immediately update and check if your changes work in a clean tree as well
++
++Prerelease Period
++-----------------
++After a bit of development, people want a new release. This generally happens
++when :
++- core developers get anxious to apply massive changes to the core bound
++ to break everything
++- a few important plugins decide, as if by magic, to work again (avi, mad, ...)
++- thaytan or thomasvs get tired of being lazy.
++
++Also, this should only be allowed after passing a few sanity checks :
++- make distcheck should pass
++- rpms should build
++- FIXME: should debs be built here ? If so, how ?
++
++At this time, we need to do a few prereleases for general checking by all
++interested developers. To minimize the impact on the rest of the core hacking,
++we create a new CVS branch which will go through the pre-releases and finally
++contain the definitive tarball for that version.
++
++RELEASE PROCEDURE:
++-----------------
++
++- www/bin/new-release is a release helper script. It automates a lot of the
++ tedious work. Now releasing looks like this:
++
++- before release:
++ - make sure all blocker bugs for that release are fixed or deferred
++ - make sure you have a local copy of all online files
++ - run 'make download-po' to make sure translations in CVS are up-to-date,
++ and then 'make update-po' in po/ (which will update the .pot template too
++ and merge the changes into the .po files)
++ - Make one or more prereleases
++ - Make sure you've got the latest clean CVS of the module
++ - Run bin/data-get in www/ to sync data from website
++ - Bump the nano number to > 2 (eg, first pre-release for
++ 0.10.12 is 0.10.11.2)
++ - When releasing -base/-good/-ugly/-bad/gnonlin, make sure GST_REQ and
++ GST_PBREQ are up-to-date. In particular, keep GST_REQ of the
++ to-be-released -base module in sync with the core version that is to
++ be released at the same time
++ - Re-autogen if not in maintainer-mode (which you should be)
++ - Check (and fix if necessary) make distcheck
++ - run 'make release' to build the tarballs
++ - copy tarballs+md5 sums to the data/src/$module/pre/ dir
++ - Run bin/data-put in www/ to sync the new tarballs to the website
++ - Announce the availability of the new tarballs
++ - Tell the translation project by sending an email to
++ coordinator@translationproject.org, eg:
++ Subject: gst-plugins-bad-0.10.5.2.pot available
++ Tarball is at http://gstreamer.freedesktop.org/src/gst-plugins-bad/pre/gst-plugins-bad-0.10.5.2.tar.bz2
++
++- prepare the release:
++ - Make sure your www is up to date: Run bin/data-get in www/
++ - Update the doap file to insert the new release info
++ - bin/new-release (module) (version) (checkoutdir) (release name)
++ - updates cvs
++ - allows you to update versioning in configure.ac
++ - rebuilds
++ - updates ChangeLog
++ - adds a new releases/module/version.xml file and lets you edit
++ --> here you add/fix up the features (from ChangeLog) and check
++ contributors
++ - allows you to update NEWS file with snippets from RELEASE
++ --> copy stuff
++ - rebuilds docs for plugins
++ - rolls release tarballs and puts them in the local www/data tree
++ - uploads docs to website
++ - commits changes to po files
++ - shows you a diff for evaluation
++
++ - build packages to test
++
++- release:
++ - cvs commit in the tree
++ - tag tree
++ for example for 0.6.3 :
++ cvs tag RELEASE-0_6_3
++ - bump nano number in configure.ac, commit
++ - if working in the "stable" release branch, update to this tag to freeze it:
++ cvs up -r RELEASE-0_6_3
++ - sync source and packages to website
++ + run /bin/data-put in www
++ - change versions in www/src/htdocs/entities.gst
++ - add entry on website
++ + Edit src/htdocs/news/news.xml and add a new item at the bottom.
++ - commit additions to website
++ - add versions and milestones in bugzilla
++ - upload new core, -base and -good tarballs to gnome ftp
++ + e.g:
++ scp gstreamer-0.10.42.tar.gz master.gnome.org:
++ ssh master.gnome.org
++ install-module gstreamer-0.10.42.tar.gz
++
++ - Send release announcements to:
++ gstreamer-devel@lists.sourceforge.net gstreamer-announce@lists.sourceforge.net kde-multimedia@kde.org gnome-multimedia@gnome.org
++ - Update freshmeat with new releases (get Uraeus to do it)
++
++Old release notes - superseded by the www/bin/new-release script.
++----------------------------------------------------------------
++
++TODO :
++ - Decide on the next version number (major, minor or micro upgrade ?)
++ - Get a fresh copy to do the necessary tests on
++ - If this isn't on the stable branch (like for 0.6), then create a new branch;
++ - with 0.3.3 as an example, tag is BRANCH-RELEASE-0_3_3
++ cvs tag BRANCH-RELEASE-0_3_3-ROOT
++ cvs tag -b BRANCH-RELEASE-0_3_3
++ - update your local copy to the branch:
++ cvs update -r BRANCH-RELEASE-0_3_3
++ - Set the nano to 2 (in configure.ac, AS_VERSION)
++ - If this is a release candidate for a new major version, override
++ MAJOR/MINOR in configure.ac
++ - Do all updates/patches/changes for the release tarball in this branch
++ - Think of a good codename for the release
++ - Check the bug lists:
++ - The idea is to have all bugs for this milestone listed as fixed
++ - Check all of the bug reports with this version as a milestone, and verify
++ that these bugs are fixed, or reassign to a later milestone if not
++ - Check later milestone bugs, and if any of them are fixed, reassign to
++ this milestone
++ - Check the list of bugs resolved with milestone HEAD, which should be
++ assigned to an actual milestone
++ - create a new $(version).xml file in www/src/htdocs/releases/$(module)
++ and add that to cvs
++ - Start updating the release notes on the www cvs tree
++ - create the base xml file in www/htdocs/releases/$/module)/$(version).xml
++ - grepping ChangeLog for contributors:
++ grep "<.*>" ChangeLog | perl -i -p -e 's@\d*-\d*-\d*\s*(.*)\s*<.*$@$1@' | sort | uniq
++ - use www/bin/bugzilla (module) (version) to get an xml list of the
++ bugs fixed in this version, and add it to the release .xml
++ - depending on how the API has changed update the libtool versioning
++ in configure.ac, AS_LIBTOOL
++ (Look at the libtool info page about versioning for guidelines)
++ (if MAJOR/MINOR version has changed, however, you can reset all to 0)
++ - FIXME: autotools have latest config.{guess,sub}
++ This is needed in order to support newer platforms.
++ On Debian install the autotools-dev package to get these.
++ Someone please add some more useful info here on how to do this
++ - while (IS_PRERELEASE)
++ {
++ - increase the nano number (starting with 2)
++ - check out a fresh anonymous copy
++ cvs -d:pserver:anonymous@cvs.gstreamer.sf.net:/cvsroot/gstreamer \
++ co -rBRANCH-RELEASE-0_3_3 gstreamer
++ - make distcheck, rpm build should pass, from a FRESH cvs tree
++ - media tests should be done
++ - source tarball should be installed and tested
++ - rpms should be installed and tested
++ - .2 tarball should be submitted to translation project
++ - put up tarball for a day
++ }
++
++
++Release Period
++--------------
++When we're satisfied with the prereleases, it's time to make the final tarball.
++It's very important that the tarball we put out is fully checked, works as
++planned, and generally is generated only ONCE by someone with a relatively
++clean (and reference) system. We don't want to put out more than one tarball
++with the same name.
++
++TODO :
++ - give the latest prerelease another good testing
++ - proofread the release notes
++ - run bugzilla with the correct module and milestone and include
++ the output in the release notes
++ bin/bugzilla gstreamer 0.7.5 >> src/htdocs/releases/gstreamer/0.7.5.xml
++ then edit it
++ - verify all new translations are in and po files are updated:
++ run 'make download-po' to make sure translations in CVS are up-to-date,
++ and then 'make update' in po/ (which will update the .pot template too and
++ merge the changes into the .po files)
++ - run win32-update from toplevel to copy new versions and enum files
++ - copy www/htdocs/releases/$(module)/$(version) to RELEASE
++ - copy the list of changes, bugs fixed, and API changes and add them to NEWS
++ - update the ChangeLog to account for NEWS, RELEASE, and configure.ac,
++ mentioning the release name
++ - add === release (version) === to ChangeLog
++ - update web site docs
++ - release-specific docs should go in CVS
++ - change docs/current symlink
++ - remove the nano version number in configure.ac, AS_VERSION
++ - cvs commit
++ - tag tree
++ for example for 0.6.3 :
++ cvs tag RELEASE-0_6_3
++ - run "make release", build rpms
++ - install on gnome's ftp
++ - for plugins docs: run "make update" in docs/plugins to update version info
++ - for docs: run "make upload" from gstreamer/docs to get the new docs online
++ - change www/src/htdocs/entities.gst with the new version numbers
++ - change www/src/htdocs/bugs/bugs.xml and add a new milestone
++ - possibly add new version and milestone to bugzilla
++ - add a news item to the news.xml
++
++Post-Release Period
++-------------------
++Time to bring the new version under the eyes of the public.
++
++TODO :
++ - FIXME: should we md5 the tarballs?
++ - upload to sourceforge
++ upload.sourceforge.net/incoming
++ administer the release
++
++ - FIXME: announcements
++ - gstreamer-{devel, announce} : a simple mail with RELEASE
++ - freshmeat
++ - linux-audio-dev (if it's a big release) : a simple mail with RELEASE
++ - gnome lists (?)
++ - lwn (if it's a big release)
++ - send mail for translators with URL to .tar.bz2:
++ translation@iro.umontreal.ca
++ - Kick back, have a party, enjoy people coming in on IRC telling us how
++ GStreamer rocks.
++ - Later on, if necessary, merge back latest release branch to current dev
++ branch (if patches to source were made)
++
++ TWO WAYS:
++ A)
++ * get a diff between the branch root and the final release:
++ cvs diff -r BRANCH-RELEASE-0_7_5-ROOT -r RELEASE-0_7_5 > patch
++ * fix up this patch (remove RELEASE)
++ * and apply it to the HEAD branch
++ * update nano version to 1 in configure.ac
++
++ B)
++ * change to a HEAD branch, make sure it's updated
++ * cvs diff -R -r RELEASE-0_3_4-30SECONDFRENCHMAN
++ gives a list of differences between head and release tag,
++ stuff with > is how it's in HEAD, < is in the rel branch
++
++ * cvs update -j BRANCH-RELEASE-0_3_4
++ merges the difference made in that branch to the current source
++ this is what you want to use when merging back the branch
++ resolve conflicts and commit
++
++Some various random comments that might or might not make sense :
++
++- Should work:
++ * autoconf feature to allow building outside source dir
++
++- Package version policy
++ - Use major.minor.micro versioning
++ - Before 1.0.0, Update micro until code and API are fairly stable,
++ then update minor.
++ - After 1.0.0,
++ Update major when code and api hit new level of stability or major features.
++ Update minor on API changes.
++ Update micro on API-compatible changes.
++
++NOTES ON STARTING A NEW STABLE SERIES
++-------------------------------------
++- Given x.y.z being the last devel release, where y is an odd number
++- all API/ABI/renaming changes should be done
++- for every module:
++ - get a completely fresh checkout
++ - set GST_MAJORMINOR to x.(y + 1)
++ - reset libtool versioning to 0, 0, 0
++ - build every piece
++ - grep for possible non-updates of MAJORMINOR:
++ grep -r "0\.9" * | grep -v "0\.9\.6" | less -R
++ change stuff:
++ perl -i -p -e 's@0\.9(\.[^0-9])@0.10$1@g' (file) changes 0.9. -> 0.10.
++ perl -i -p -e 's@0\.9([^.])@0.10$1@g' (file) changes 0.9 -> 0.10
++
++
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/richardb/syncmail gstreamer-0.10.23/docs/random/richardb/syncmail
+--- gstreamer-0.10.23.orig/docs/random/richardb/syncmail 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/richardb/syncmail 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,3 @@
++The syncmail script in CVSROOT is a modified version of the script
++taken from the sourceforge snippets page, at:
++http://sourceforge.net/snippet/detail.php?type=snippet&id=100414
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/rtp gstreamer-0.10.23/docs/random/rtp
+--- gstreamer-0.10.23.orig/docs/random/rtp 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/rtp 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,44 @@
++RTP client subsystem proposal.
++Ramon Garcia Fernandez
++
++A brief description of the RTP protocol.
++
++The RTP protocol uses two connections: one for passing data and another for control. The control connection is used for starting, finishing, and passing statistics of lost packets. On the data connection, packets are transmitted containing the media. These packets have a 7 bit field that says what codec is the data transmitted with. This codec is variable. However data cannot change from audio to video in packets of the same connection. All the packets belong to the same logical stream, that is, for instanace, to the same speech, or to the same song. Different codecs in the same stream is used, for instance, to insert comfort noise.
++
++Each codec is packeted in a specific way in RTP packets. This is necessary to minimize the damage produced by lost packets. Therefore, packets should be arranged so that each packet can be decoded independently. If a packet is lost, that shoudn't preclude the decoding of following packets.
++
++
++Suggested implementation:
++
++Tbe implementation that I suggest contains an rtpdec element. This element has one sink pad for the data, one src pad for the decoded data, and a pair of src and sink pads for control messages. The decoded data that comes from rtpdec has no RTP dependency. It is in the format expected by the codec that it decodes it. Therefore, rtpdec must do codec specific processing of data to take into account that different codecs are stored differently in RTP.
++
++A posible pipeline is:
++
++udpcon name="data" udpcon name="control" data.src!rtpdec.datasrc control.src!rtpdec.controlin control.sink!rtpdec.controlout rtpdec name="rtpdec" ! mp3decode ! osssink
++
++udpcon is an element (not yet written) that provides a src and a sink pad to read and write to a socket. There are two udpcon, one for reading the data socket and another for reading and writting to the control socket.
++
++To handle variable types, the following would work (the UDP part left out for clarity is identical to the one above):
++
++[udp] rtpdec ! spider ! osssink
++
++rtpdec has a property that tells it the mapping of the payload bits to mime type. This is necessary, because that mapping is not fixed. It has to be obtained at runtime through other mechanisms, such as a SDP file obtained by http or rtsp.
++
++A posible implementation of rtpdec is a bin that contains two elements: a media independent _rtpparse and a media dependent rtp-dec-mp3. Thus the pipeline would be
++
++udpsrc ! _rtpparse ! rtp-dec-mp3 ! mp3decode ! osssink
++ \________________________/
++ rtpdec bin
++
++Another posible implementation is, that rtpdec opens a plugin that contains the code to convert the codec specific packets into the input that the normal decoder for that codec expects.
++
++Ronald said that this mechanism would be complicated because it would require to duplicate the functionality of the plugin loader. It shouldn't be like that because it should use the normal plugin loader. However, this is an issue that I do not fully understand.
++
++Ronald suggested to use inheritance. Thus the user should insert a codec specific rtp element in the pipeline. Such as:
++
++udpsrc ! rtp-mp3 ! mp3decode ! osssink
++
++Reuse of RTP logic would be achived through inhertiance.
++
++This looks more logical, because inheritance reflects the fact that rtp-mp3 "is an" specialization of rtp. However, there are several issues. As stated above, it is posible in RTP to switch the encoding of the media at any time. If this happens, some state must be kept, such as statistics of packets received and sent.
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/signal gstreamer-0.10.23/docs/random/signal
+--- gstreamer-0.10.23.orig/docs/random/signal 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/signal 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,12 @@
++Random notes on signals:
++
++* Use a BOXED (and not a POINTER) marshaller when your signal will have a
++ GstBuffer argument:
++
++g_signal_new ("handoff", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
++ G_STRUCT_OFFSET (GstIdentityClass, handoff), NULL, NULL,
++ gst_marshal_VOID__BOXED, G_TYPE_NONE, 1,
++ GST_TYPE_BUFFER | G_SIGNAL_TYPE_STATIC_SCOPE);
++
++* For GstBuffers arguments, consider using G_SIGNAL_TYPE_STATIC_SCOPE as it
++ can prevent an extra copy of the buffer
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/slomo/controller.txt gstreamer-0.10.23/docs/random/slomo/controller.txt
+--- gstreamer-0.10.23.orig/docs/random/slomo/controller.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/slomo/controller.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,73 @@
++GstController:
++==============
++
++Implementation:
++---------------
++
++Ideas and plans:
++ - Deprecate control-rate property and add a control-period property
++ that does the same and is named appropiately. Damn confusing names.
++
++ - gst_object_suggest_next_sync() will not be used at all anymore.
++ Note this in the docs and explain correct usage in elements.
++
++ - Optimize get_value_array() functions to not just call get() but be
++ a bit more intelligent.
++ - Optimize trigger interpolator's get_value_array() to set trigger if
++ a requested value's timestamp is before the trigger timestamp and
++ this timestamp + sample period is after the trigger timestamp.
++
++ - Get tempo interface in base (or core?) and have it modify the
++ control rate to get expected results.
++
++ - ? Let get_value_array() sample the values with control-period if
++ the given sample_interval is zero ?
++
++
++Usage in elements:
++------------------
++
++ - In the beginning of the processing loop call
++ gst_object_sync_values() with the current timestamp.
++ - Convert the controller's control-period property into frames/samples
++ and request values sampled with control-period to apply one value to
++ each control-period frames/samples.
++ - Update controlled GObject properties with the last values, i.e.
++ call gst_object_sync_values() with the end timestamp.
++
++ - ! The user has to choose a good control-period to prevent two trigger
++ timestamps separated by less than control-period nanoseconds.
++
++ code:
++
++ FIXME: can this be simplified? bugs in corner cases?
++
++ [...]
++ GstController ctrl = gst_object_get_controller (self);
++ GstValueArray prop1;
++ prop1.property_name = "prop1";
++ if (ctrl) {
++ gst_controller_sync_values (ctrl, GST_BUFFER_TIMESTAMP);
++ samples_per_period = control-period / sample-rate;
++ nvalues = num_samples / samples_per_period;
++ prop1.nbsamples = nvalues;
++ prop1.sample_interval = control-period;
++ prop1.values = g_new (type, nvalues);
++ gst_controller_get_value_array (ctrl, GST_BUFFER_TIMESTAMP, &prop1);
++ } else {
++ prop1.values = &self->prop1;
++ samples_per_period = num_samples;
++ }
++ [...]
++
++ for (i = 0; i < num_samples; i++) {
++ prop1_val = prop1.values[i / samples_per_period];
++ process();
++ }
++
++ [...]
++ if (ctrl) {
++ gst_controller_sync_values (ctrl, GST_BUFFER_TIMESTAMP + GST_BUFFER_DURATION);
++ g_free (prop1.values);
++ }
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/sources gstreamer-0.10.23/docs/random/sources
+--- gstreamer-0.10.23.orig/docs/random/sources 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/sources 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,324 @@
++There are a number of different ways of coding a GstSrc. I'll try to
++outline them and how the function here:
++
++1a) Simple push-function based with single output
++
++
++ *------* *------
++ ! ! !
++ ! src !--->--! plugin
++ ! ! !
++ *------* *------
++
++This is the style that all the existing sources use. There is a single
++output pad, and a _push function that's global to the whole element. The
++_push function simply constructs buffers and pushes them out the pad.
++
++Chained (current implementation):
++
++
++ bin src pad1 pad2 plugin
++ ! (= pad1->peer)
++ gst_bin_iterate
++ !
++ ! (find entry)
++ !
++ ! gst_src_push
++ !---------------->!
++ ! (create buffer)
++ !
++ ! gst_pad_push
++ !---------------->!
++ !
++ ! pad1->chainfunc (pad1->peer)
++ !------------------------------->!
++ ! !
++ : :
++ (more chaining)
++ : :
++ !<-------------------------------!
++ !<----------------!
++ !<-----------------!
++ !
++ iteration ends
++ !
++ ---
++ -
++
++Typically this will be the/an entry into the Bin. The Bin's iterate
++function simply calls the Src's _push function. When the _push function
++pushes a buffer out it's pad, the chain function of the peer pad is
++called, presumably causing a push out the other side of that element, and
++eventually data gets to the other end. The stack unrolls, and the
++iteration ends for that Src.
++
++
++
++Cothreaded:
++
++Again, the source would generally be an entry into the Bin. A loopfunc
++will be constructed around it, which will simply loop calling the Src's
++_push function as in the non-cothreaded case. When the _push function
++pushes a buffer, it finds a pushfunc attached to the pad, drops the buffer
++in the pen, and calls the pushfunc provided by the Bin. This causes a
++switch to the next element, then the next, to the end, at which point a
++buffer pull will travel back down the chain. The _push function gets
++context and finishes, at which point the loopfunc wrapper simply calls it
++again in the next iteration.
++
++(current implementation):
++
++
++ bin cothread1 src pad1 pad2 cothread2 plugin
++ ! (src) (= pad2->peer) (plugin)
++ gst_bin_iterate
++ !
++ ! (first entry)
++ !
++ ! cothread_switch
++ !---------------->!
++ ! gst_src_push
++ !---------------->!
++ ! (create buffer)
++ !
++ ! gst_pad_push (pad1)
++ !
++ !--------------------!
++ ! (fill bufpen)
++ !
++ ! cothread switch
++ ----------------------->!
++ ! gst_pad_pull (pad2)
++ !
++ !<----------!
++ !
++ ! (get buffer from bufpen)
++ !
++ !---------->!
++ ! pad2->chainfunc
++ !------------->!
++ !
++ :
++
++ :
++ !<-------------!
++ ! gst_pad_pull (pad2)
++ !<----------!
++ !
++ ! (bufpen empty)
++ !<----------!
++ !<-------------------------------------! cothread switch
++ !<----------------!
++ !
++ iteration ends
++ !
++ :
++
++ :
++ !
++ next iteration
++ !
++ ! cothread_switch
++ !---------------->!
++ ! gst_src_push
++ !---------------->!
++ ! (create buffer)
++ !
++ ! gst_pad_push (pad1)
++ !
++ !--------------------!
++ ! (fill bufpen)
++ !
++ ! cothread switch
++ !---------->!
++ ! (get buffer from bufpen)
++ !
++ !---------->!
++ ! pad2->chainfunc
++ !------------->!
++ !
++ :
++
++ :
++ !<-------------!
++ ! gst_pad_pull (pad2)
++ !<----------!
++ !
++ ! (bufpen empty)
++ !<----------!
++ !<-------------------------------------! cothread switch
++ !<----------------!
++ !
++ iteration ends
++ !
++ :
++
++
++-----------------------------------------------------------------------------------------------
++1b) Simple push-function based with multiple output
++
++Chained:
++
++Similar to the single output variant, except several chains are spawned
++off, one per push, hanging off whichever pad the buffer is pushed off of.
++The stack will grow and unwind as many times as buffers are pushed out.
++
++(current implementation)
++
++ bin src pad1 pad2 plugin
++ ! (= pad1->peer)
++ gst_bin_iterate
++ !
++ ! (find entry)
++ !
++ ! gst_src_push
++ !---------------->!
++ ! (create buffer)
++ !
++ ! gst_pad_push
++ !---------------->!
++ !
++ ! pad1->chainfunc (pad1->peer)
++ !------------------------------->!
++ ! !
++ : :
++ (more chaining)
++ : :
++ !<-------------------------------!
++ !<----------------!
++ ! (create buffer)
++ !
++ ! gst_pad_push
++ !---------------->!
++ !
++ ! pad1->chainfunc (pad1->peer)
++ !------------------------------->!
++ ! !
++ : :
++ (more chaining)
++ : :
++ !<-------------------------------!
++ !<----------------!
++ :
++ (more pushes)
++ :
++ !<-----------------!
++ !
++ iteration ends
++ !
++ ---
++ -
++
++
++Cothreaded:
++
++Also similar to the single output variant. When the pull winds its way
++back from the first push, execution returns to the Src's _push function,
++which simply goes off and pushes out another buffer, causing another
++series of context switches. Eventually the loopfunc wrapper starts over,
++round and round we go.
++
++
++
++-----------------------------------------------------------------------------------------------
++2) Pull-function based with single output
++
++Similar to a regular filter with a chain function associated with each
++pad, this kind of source doesn't provide a src-wide push function, but
++does provide pullfuncs for its pad. A pullfunc puts a buffer in the pen
++and exits.
++
++Chained:
++
++ bin src pad1 pad2 plugin
++ ! (= pad1->peer)
++ gst_bin_iterate
++ !
++ ! (find entry)
++ !
++ ! (find src pad
++ ! of entry element)
++ !
++ ! gst_pad_pull
++ !------------------------------------------------>!
++ ? !
++ !<------------------------------!
++ !
++ ! (create buffer)
++ !
++ ! gst_pad_push
++ !------------------------------>!
++ ! (bufpen filled)
++ (return buffer) !
++ !<------------------------------------------------!
++ !
++ ! gst_pad_chain
++ !------------------------------------------------------------------->!
++ !
++ :
++ (more chaining)
++ :
++ !<-------------------------------------------------------------------!
++ !
++ iteration ends
++ !
++ ---
++ -
++
++As usual, is likely to be an entry into a Bin. The Bin iterate code must
++explicitely pull a buffer and pass it on to the peer.
++
++Cothreaded:
++
++
++ bin cothread1 src pad1 pad2 cothread2 plugin
++ ! (src) (= pad2->peer) (plugin)
++ gst_bin_iterate
++ !
++ ! (first entry)
++ !
++ ! cothread_switch
++ !---------------->! gst_pad_pull
++ !------------------------------------------------>!
++ ? !
++ !<------------------------------!
++ !
++ ! (create buffer)
++ !
++ ! gst_pad_push
++ !------------------------------>!
++ ! (bufpen filled)
++ (return buffer) !
++ !<------------------------------------------------!
++ !
++ ! pad_chain
++ !--------------------------------------! cothread switch
++ |---------------------->!
++ ! gst_pad_pull (pad2)
++ !
++ !<----------!
++ !
++ ! (get buffer from bufpen)
++ !
++ !---------->!
++ ! pad2->chainfunc
++ !------------->!
++ !
++ :
++
++ :
++ !<-------------!
++ ! gst_pad_pull (pad2)
++ !<----------!
++ !
++ ! (bufpen empty)
++ !<-----------!
++ ! cothread switch
++ !-------------------!
++ !<----------------!
++ !<----------------!
++ !
++ iteration ends
++ !
++ :
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/streamheader gstreamer-0.10.23/docs/random/streamheader
+--- gstreamer-0.10.23.orig/docs/random/streamheader 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/streamheader 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,90 @@
++A lot of data streams need a few initial buffers to make sense of the
++data stream. With these initial buffers, it can pick up at any point in
++the rest of the data stream.
++
++Exampes:
++- Vorbis and Theora have three initial Ogg packets
++- MPEG4 has codec data
++- GDP protocol serializes the initial new_segment event and the initial caps
++
++It is important that elements that get connected after the stream starts,
++receive these initial buffers. Also, sink elements should know that these
++initial buffers are necessary for every new "client" of the sink element;
++for example, multifdsink needs to send these initial buffers before the
++normal buffers.
++
++Currently, this is done by putting a 'streamheader' value on the caps.
++'streamheader' is a GST_TYPE_ARRAY of GstBuffer, ie. an ordered list of
++buffers.
++
++The buffers themselves still get pushed as normal buffers, but with the
++IN_CAPS flag set. This allows elements that do not know about streamheader
++to still function correctly (ie. filesink and others)
++
++It is of course important that these streamheader buffers are not sent twice
++(once because they're in the caps, and once because they're received as
++buffers).
++
++So, an element that is aware of streamheader in the caps should probably best
++drop all incoming IN_CAPS buffers.
++
++Rules for sending streamheaders:
++- all streamheader buffers should have IN_CAPS set
++- from this list of streamheader buffers, a "streamheader" caps field should
++ be created as a GST_TYPE_ARRAY of GstBuffer. This should be done by
++ copying the buffers.
++ (the only important thing about the buffers in this list is the data;
++ other attributes of the buffers get ignored)
++- each of these buffers should then have these caps set on them.
++- when all streamheader buffers are collected in the element, pad caps should
++ be set, including this streamheader
++- streamheader buffers should be sent consecutively, and before any of the
++ data (non-IN_CAPS) buffers they apply to. If necessary, the element
++ should internally queue non-IN_CAPS buffers until the streamheaders
++ are completely assembled.
++- when new streamheader buffers need to be pushed out, this process is
++ repeated. Receiving a new IN_CAPS buffer after a non-IN_CAPS buffer
++ signifies resetting streamheader, as does the new set_caps with different
++ streamheader right before. (FIXME: it's probably better to explicitly
++ have an event/buffer that clears streamheaders; consider the case of
++ an element like GDP that has created streamheader from the first newsegment
++ and the first caps, and then receives a new tag event that it also wants
++ to put on the streamheader - it should be able to invalidate the previous
++ ones)
++
++Elements that can send streamheader caps:
++- vorbisenc
++- theoraenc
++- gdppay
++
++Elements that can receive streamheader caps:
++- multifdsink
++
++Elements that can receive and send streamheader caps:
++- oggmux
++
++Elements that could/should use this:
++- ffenc_mpeg4 (currently uses/sets codec_data)
++- theoradec, vorbisdec (currently only look at incoming buffers)
++- oggdemux
++
++FUTURE PLANS
++------------
++The concept of streamheader is more generally applicable. We may want to
++find a better way of implementing this than having two ways of telling
++downstream elements about them. Currently an element that is
++streamheader-aware needs to look both at caps and incoming buffers.
++
++One option would be to only rely on the buffer flow, and make all elements
++aware of a HEADER flag, causing them to keep these buffers around and push
++them for each new pad link. This needs to be done in every element; a
++scenario like
++ videotestsrc ! theoraenc
++where later on an oggmux gets connected, should still work without dropping
++these header buffers. But similarly,
++ videotestsrc ! theoraenc ! identity
++with a later connection of oggmux to identity should work.
++
++This could tie in with an idea to have pads store some initial data (the
++first new_segment event, tag events, ...), which at the moment also get
++dropped on dynamic in-stream links.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/styleguide gstreamer-0.10.23/docs/random/styleguide
+--- gstreamer-0.10.23.orig/docs/random/styleguide 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/styleguide 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,18 @@
++Some notes about various stylistic issues
++-----------------------------------------
++
++(This file should end up as a nice web page eventually)
++
++CODING STYLE
++------------
++- No //-style comments allowed. Never. Reason: Forte doesn't support it.
++- Our indentation style is codified in gstreamer/tools/gst-indent
++- Don't mix tabs with spaces when writing new code.
++- use GST_*_OBJECT as much as possible so it's clear which object you're
++ logging for
++
++SUBMITTING CODE
++---------------
++- new code submitted to core, plugins-base, or plugins-good needs to pass a
++ review from another committer.
++- submitting new base classes also means you look at targets for assimilation.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/testing/syntax gstreamer-0.10.23/docs/random/testing/syntax
+--- gstreamer-0.10.23.orig/docs/random/testing/syntax 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/testing/syntax 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,37 @@
++The test program
++----------------
++
++We need a test program that:
++
++ - can read a file with the test specs
++ - construct a pipeline using the pipeline definition in the spec file
++ (using gst_parse_launch ())
++ - add signals to elements in the pipeline
++ - run the pipeline for a fixed (in time/number of iterations) period
++ - record the fireing of the signals
++ - compare the signals to the expected results.
++
++
++spec file contents:
++-------------------
++
++tcN: name-of-the-tescase
++tcP: pipeline of the testcase in gst_parse_launch () syntax.
++tcS: id1, element, signalname (attach to signal in an element)
++tcS: id2, element, signalname
++...
++tcI: the number of iterations on the top bin
++tcT: a timeout value in mSecs
++tcR: id1,1,id2,1,.. (the pattern of signals trigered)
++or
++tcR: id1==id2,... (denote an equal number of signals)
++/n
++
++
++signal trigger patterns
++-----------------------
++
++
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/thaytan/opengl gstreamer-0.10.23/docs/random/thaytan/opengl
+--- gstreamer-0.10.23.orig/docs/random/thaytan/opengl 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/thaytan/opengl 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,20 @@
++# OpenGL usage
++How to set up openGL using plugins in such a way that they can
++render to an on-screen window, or offscreen equally?
++
++eg:
++superfoo3d ! glwindow
++or
++superfoo3d ! gloffscreen ! xvideowindow
++
++This would imply that there is some mime type which connects a glwindow/gloffscreen and a GL using component sensibly. I don't see that there is any actual
++data to send, however - the only purpose of the glwindow/gloffscreen is to
++set up an openGL context and then 'output' it somehow one the superfoo3d has
++finished drawing each frame.
++
++In the case of glwindow, 'output' it means translate into an on-screen window,
++but for gloffscreen it means produce a video packet and go.
++
++These components really need some other 2 way communication, rather than the
++pads metaphor, I think?
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/thaytan/video-overlays gstreamer-0.10.23/docs/random/thaytan/video-overlays
+--- gstreamer-0.10.23.orig/docs/random/thaytan/video-overlays 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/thaytan/video-overlays 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,28 @@
++# Compositing and video overlays.
++We want a way to composite a video frame and an overlay frame. The video frame is as we expect, the overlay is a normal video frame + an alpha mask. In the following monologue, please consider that I mean RGB/I420/YV12/YUY2 wherever I say RGB.
++
++So we have a plugin with 2 sinks and one src:
++ +----------------+
++ |video |
++ | video|
++ |overlay |
++ +----------------+
++
++What should the format for the overlay data look like?
++Ideas:
++ * RGBA - 4 byte per pixel video frame
++ * RGB+A - 3 Bytes per pixel video frame, then 1 byte per pixel overlay frame.
++ A new mime type, or a variation on video/raw? I'm not sure
++ * Overlay is actually 2 sinks, one takes a RGB/YUV data the other the alpha channel.
++
++I'm not sure which approach is better, but I think it is probably neatest to
++use RGB+A, and then have a separate plugin which has 2 sinks and converts an
++RGB/YUV stream plus an alpha stream into an RGB+A stream. The benefit of RGB+A over RGBA in this scenario, is that it is easier (correct me if I'm wrong) to optimise 2 block copies which appends an alpha frame to a RGB frame than it is to
++do the many copies required to interleave them into an RGBA stream.
++
++So, I see this producing a few new plugins:
++videooverlay - takes an RGB and an RGB+A frame from 2 sinks, does the overlay (according to some properties) and outputs a result frame in RGB or RGB+A (as negotiated) format on 1 src.
++rgb2rgba - takes 1 RGB frame and one A frame from 2 sinks and outputs RGB+A on 1 src. If the A sink is not connected, we just add a fixed alpha channel based on an object-property.
++rgb2rgba - takes an RGB+A frame and discards the RGB component.
++textoverlay - This plugin, instead of taking a video frame and overlaying text, can just output an RGB+A stream with appropriate timestamping. This prevents duplicating code to composite with an alpha mask and allows us to optimise it in one spot only.
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/thomasvs/0.10 gstreamer-0.10.23/docs/random/thomasvs/0.10
+--- gstreamer-0.10.23.orig/docs/random/thomasvs/0.10 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/thomasvs/0.10 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,121 @@
++general
++-------
++- write script to check for:
++ invalid // comments
++ invalid %lld
++ invalid LL for 64bit ints
++ wrong whitespacing
++ trailing space
++
++gstreamer
++---------
++- reorganize tests and examples into
++ - testsuite
++ - check: unit tests
++ - examples: example code
++ - interactive: interactive tests
++- move gst/base to libs/gst/base ?
++ (but elements link against them)
++- move elements out of gst/ dir ?
++- check/gst/pipelines: currently disabled, random failures
++
++gst-plugins-base
++----------------
++- gst-libs/gst/audio:
++ - DONE: audiofilter folded in
++- gst:
++ - adder: needs docs, an example, and a test
++ - audioconvert: ok
++ - audiorate: needs docs and tests
++ - audioresample: David needs to fix this
++ - audioscale: needs to go
++ - audiotestsrc: ok
++ - ffmpegcolorspace: needs a test
++ - playback: example
++ - sine: removed, DONE
++ - subparse:
++ - works, but how do we link it so we can display it ?
++ - example ?
++ - test with different files/sources ? can be inlined
++ - tags:
++ - contained a very small code file that wasn't built, and a copy of a header
++ that was in the tag lib; removed; DONE
++ - tcp:
++ - works
++ - need tests
++ - need docs
++ - need possible porting to GNet (later)
++ - typefind:
++ - works
++ - need tests - this definately could use it
++ - is there any way they can be documented ?
++ - should the plugin docs show a list of them ?
++ - videorate:
++ - needs tests, docs
++ - videoscale:
++ - needs tests
++ - negotiation
++ - par conversion
++ - different scale algorithms
++ - needs docs
++ - negotation with five out of six free variables (src/sink w/h/par)
++ - videotestsrc:
++ - could use tests for all possible caps
++ - volume: OK
++- ext:
++ - alsa:
++ - needs docs; esp. params and common practices
++ - needs interactive tests; depends on having such a setup available
++ - cdparanoia:
++ - needs docs, and interactive test
++ - remains in -base until cdio is proven to be better on all counts
++ - gnomevfs:
++ - needs docs (how to use proxy, link to gnomevfs docs, explanation
++ about need for homedir to create .gnome2 dir in, ...)
++ - needs test; test could use local files and http urls
++ - libvisual
++ - needs docs (easy)
++ - needs test
++ - ogg, vorbis, theora
++ - needs docs
++ - needs test
++- sys
++ - v4l
++ - needs interactive test
++ - needs lots of docs
++ - ximage
++ - interactive test should go somewhere
++ - docs ok
++ - xvimage
++ - interactive test should go somewhere
++ - docs ok
++
++gst-plugins-good
++----------------
++
++- gst:
++ - alpha, alphacolor: document with example
++ - auparse: crashes on e.g.
++ gst-launch -v filesrc location=/usr/share/emacs/site-lisp/emacspeak/sounds/default-8k/ask-short-question.au ! auparse ! osssink
++ -> will move to bad
++ - autodetect: OK
++ - videofilter:
++ - is the lib still needed, given basetransform ?
++ yes
++ - currently installs a lib; should not install, or move to a dir, with pc
++ file, possibly in -base
++ DONE: moved to -base
++- ext:
++ - aasink: properties need looking at
++ - width, height: why are they there ? caps don't match
++ - frames-displayed: in base class ?
++ - frame-time: what's this ?
++ - cairo:
++ - cairotimeoverlay works
++ - cairotextoverlay ? pipeline ?
++ - flac:
++ - flacenc:
++gst-launch -v audiotestsrc wave=white-noise ! flacenc ! filesink location=white-noise.flac does not produce a correct file
++ - flacdec works, but
++gst-launch gnomevfssrc location=http://gstreamer.freedesktop.org/media/small/dark.441-16-s.flac ! flacdec ! autoaudiosink
++ does not
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/thomasvs/0.4.0 gstreamer-0.10.23/docs/random/thomasvs/0.4.0
+--- gstreamer-0.10.23.orig/docs/random/thomasvs/0.4.0 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/thomasvs/0.4.0 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,108 @@
++Set of 0.4.0 proposals
++
++* module versioning
++ - we need an agreement on how we are going to version the separate modules.
++ This needs to meet some requirements :
++ a) we shouldn't be forced to release all of the modules together
++ every time (if the plugins have been updated, and still work against
++ a previous core, then only release plugins, for example)
++ We should start treating the different modules as separate projects
++ (albeit still closely tied of course)
++ b) it should be clear for other people what packages they need to download
++ c) major API breakage needs to be clear; we don't expect really old players
++ to keep working with really new cores.
++
++ - my idea (which others seemed to agree with) would be to let the micro
++ numbers run independently. Only when the core API has changed to the
++ point that other modules are not compatible with them anymore
++ should we upgrade the minor version.
++ We can assume/assert that modules with the same minor number will be able
++ to work with each other.
++
++ - Example schedule :
++ * we release 0.4.0 versions of all of the modules
++ * plugins get updated a few times : 0.4.1 and 0.4.2
++ * core gets a new scheduler, doesn't affect other modules : 0.4.1
++ * gst-player gets rapid releases due to arik's recovery: 0.4.1-0.4.5
++ * core gets a major new update re: events : 0.5.0
++ * some days later, other modules have been updated to the new core
++ and the new core starts being useful to other people as well
++
++* release practice
++ - we should have a simple way to cut releases; something that makes
++ the necessary adaptions to the source tree
++ This could also be a simple check list of things that need to pass
++ - cvs tarballs/packages should be easily distinguishable from pre-release
++ tarballs/packages and actual released ones.
++
++ my idea here would be :
++ a) releases are named as normal
++ e.g. gstreamer-0.4.0.tar.gz
++ gstreamer-0.4.0-1.i386.rpm
++
++ b) as soon as the release is made, we are back in "cvs" mode
++ i'd use a ".1" for a fourth version number for all cvs versions
++ so as soon as we release 0.4.0, I'd add a fourth ".1" version number.
++ this one would be used during the whole of the cvs period, no
++ reason to up this manually in between
++ The packages (rpms in any case, don't know about debs) would still
++ keep the date as the revision number like they have now, in order
++ to make it easy to work with snapshots.
++
++ c) when we are ready to release this module, I would go back to maintainer
++ mode, but keep the fourth version number and increase that for each cut.
++ So we'd stop developing the module, switch to maintainer mode, up the
++ version number to
++ gstreamer-0.4.0.2.tar.gz
++ and test that.
++
++ d) when we are happy with the precuts, we drop the fourth number and make
++ a release
++
++ Summary :
++ * all "official" released versions have sane versioning with three numbers
++ * all "cvs" versions are clearly recognizable by the fourth .1
++ * all "precuts" are also recognizable
++ * no tarballs will accidentally spill pretending to be real releases ;)
++ * upgrading rpm's all through this process is easy
++
++* build code stuff duplicated between various modules
++ - how do we integrate these ? this pertains to stuff in autogen.sh,
++ duplicate stuff in configure.ac (which should probably be moved out to
++ custom .m4 files and yanked in), and maybe testing stuff
++
++* what possible ways are there to build gstreamer ?
++ I would like to take stock of the combinations of deps possible to build
++ gstreamer. While most people want only glib2, I think there is merit
++ in still making glib1 work and willing to put in the effort. I just need
++ the possibilities mapped out once and for all ;) IMO the effort going into
++ making gstreamer build without libxml is the same as making it work with
++ older glib too. I mean, as soon as you allow variation, it isn't that hard
++ to allow for more than one variation. The bigger step is from zero to one.
++
++ so, what are they ?
++ - glib1 & gtk1
++ - glib1 & gtk1 & libxml
++ - glib2 & libxml2
++
++* media suite
++ - media files on the site should be renamed to simple uniform names
++ - and split up based on size
++ - described by features/content
++
++* when to branch in CVS ?
++
++* automatic build testing
++ - tinderbox ? useful ?
++ - small build scripts
++
++* automatic functionality testing
++ - an md5sink would be useful to do this
++ - something automated is needed; it should check if you have the plugins
++ that are needed to test other plugins
++
++* media player
++
++* packaging
++ - dependency libs should be easily available
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/thomasvs/capturing gstreamer-0.10.23/docs/random/thomasvs/capturing
+--- gstreamer-0.10.23.orig/docs/random/thomasvs/capturing 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/thomasvs/capturing 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,233 @@
++ELEMENTS (v4lsrc, alsasrc, osssrc)
++--------
++- capturing elements should not do fps/sample rate correction themselves
++ they should timestamp buffers according to "a clock", period.
++
++- if the element is the clock provider:
++ - timestamp buffers based on the internals of the clock it's providing,
++ without calling the exposed clock functions
++ - do this by getting a measure of elapsed time based on the internal clock
++ that is being wrapped. Ie., count the number of samples the *device*
++ has processed/dropped/...
++ If there are no underruns, the produced buffers are a contiguous data
++ stream.
++ - possibilities:
++ - the device has a method to query for the absolute time related to
++ a buffer you're about to capture or just have captured:
++ Use that time as the timestamp on the capture buffer
++ (it's important that this time is related to the capture buffer;
++ ie. it's a time that "stands still" if you're not capturing)
++ - since you're providing the clocking, but don't have the previous method,
++ you should open the device with a given rate and continuously read
++ samples from it, even in PAUSED. This allows you to update an internal
++ clock.
++ You use this internal clock as well to timestamp the buffers going out,
++ so you again form a contiguous set of buffers.
++ The only acceptable way to continuously read samples then is in a private
++ thread.
++ - as long as no underruns happen, the flow being output is a perfect stream:
++ the flow is data-contiguous and time-contiguous.
++ - underruns should be handled like this:
++ - if the code can detect how many samples it dropped, it should just
++ send the next buffer with the new correct offset. Ie, it produced
++ a data gap, and since it provides the clock, it produces a perfect
++ data gap (the timestamp will be correctly updated too).
++ - if it cannot detect how many samples it dropped, there's a fallback
++ algorithm. The element uses another GstClock (for example, system clock)
++ on which it corrects the skew and drift continuously as long as it
++ doesn't drop. When it detected a drop, it can get the time delta
++ on the other GstClock since the last time it captured and the current
++ time, and use that delta to guesstimate the number of samples dropped.
++
++- if the element is not the clock provider
++ - the element should always respect the clock it is given.
++ - the element should timestamp outgoing buffers based on time given by
++ the provided clock, by querying for the time on that clock, and
++ comparing to the base time.
++ - the element should NOT drop/add frames. Rather, it should just
++ - timestamp the buffers with the current time according to the provided
++ clock
++ - set the duration according to the *theoretical/nominal* framerate
++ - when underruns happen (the device has lost capture data because our
++ element is not handling them quickly enough), this should be detectable
++ by the element through the device. On underrun, the offset of your
++ next buffer will not match the end_offset of your previous one
++ (ie, the data flow is no longer contiguous).
++ If the exact number of samples dropped is detectable, this is the
++ difference between new offset and old offset_end.
++ If it's not detectable, it should be guessed based on the elapsed time
++ between now and the last capture.
++
++- a second element can be responsible for making the stream time-contiguous.
++ (ie, T1 + D1 = T2 for all buffers). This way they are made
++ acceptible for gapless presentation (which is useful for audio).
++ - The element treats the incoming stream as data-contiguous but not
++ necessarily time-contiguous.
++ - If the timestamps are contiguous as well, then everything is fine and
++ nothing needs to be done. This is the case where a file is being read
++ from disk, or capturing was done by an element that provided the clock.
++ - If they are not contiguous, then this element must make them so.
++ Since it should respect the nominal framerate, it has to stretch or
++ shorten the incoming data to match the timestamps set on the data.
++ For audio and video, this means it could interpolate or add/drop samples.
++ For audio, resampling/interpolation is preferred.
++ For video, a simple mechanism that chooses the frame with a timestamp as
++ close as possible to the theoretical timestamp could be used.
++ - When it receives a new buffer that is not data-contiguous with the
++ previous one, the capture element dropped samples/frames.
++ The adjuster can correct this by sending out as much "no-signal" data
++ (for audio, e.g. silence or background noise; for video, sending out
++ black frames) as it wants, since a data discontinuity is unrepairable.
++ So it can use these to catch up more aggressively.
++ It should just make sure that the next buffer it gets again goes
++ back to respecting the nominal framerate.
++
++- To achieve the best possible long-time capture, the following can be done:
++ - audiosrc captures audio and provides the clock. It does contiguous
++ timestamping by default.
++ - videosrc captures video timestamped with the audiosrc's clock. This data
++ feed doesn't match the nominal framerate. If there is an encoding format
++ that supports storing the actual timestamps instead of pretending the
++ data flow respects the nominal framerate, this can be corrected after
++ recording.
++ - at the end of recording, the absolute length in time of both streams,
++ measured against a common clock, is the same or can be made the same by
++ chopping off data.
++ - the nominal rate of both audio and video is also known.
++ - given the length and the nominal rate, we have an evenly spaced list
++ of theoretical sampling points.
++ - video frames can now be matched to these theoretical sampling points by
++ interpolating or reusing/dropping frames. It can choose the best
++ possible algorithm for this to decrease the visible effects
++ (interpolating results in blur, add/drop frames results in jerkiness).
++ - with the video resampled at the theoretical framerate, and the audio
++ already correct, the recording can now be muxed correctly into a format
++ that implicitly assumes a data rate matching the nominal framerate.
++ - One possibility is to use the GDP to store the recording, because that
++ retains all of the timestamping information.
++ - The process is symmetrical; if you want to use the clock provided by
++ the video capturer, you can stretch/shrink the audio at the end of
++ recording to match.
++
++TERMINOLOGY
++-----------
++- nominal rate
++ the framerate/samplerate
++ exposed in the caps; ie. the theoretical framerate of the
++ data flow. This is the fps reported by the device or set for the encoder,
++ or the sampling rate of the audio device.
++- contiguous data flow
++ offset_end of old buffer matches offset of new buffer
++ for audio, this is a more important requirement, since you configure
++ output devices for a contiguous data flow.
++- contiguous time flow
++ T1 + D1 = T2
++ for video, this is a more important requirement, because the sampling
++ period is bigger, so it is more important to match the presentation time
++- "perfect stream"
++ data and time are contiguous and match the nominal rate
++ videotestsrc, sinesrc, filesrc ! decoder produce this
++
++NETWORK
++-------
++- elements can be synchronized by writing a NTP clock subclass that listens
++ to an ntp server, and tries to match its own clock against the NTP server
++ by doing gradual rate adjustment, compared with the own system clock.
++- sending audio and video over the network using tcpserversink is possible
++ when the streams are made to be perfect streams and synchronized.
++ Since the streams are perfect and synchronized, the timestamps transmitted
++ along with the buffers can be trusted. The client just has to make
++ sure that it respects the timestamps.
++- One good way of doing that is to make an element that provides a clock
++ based on the timestamps of the data stream, interpolating using another
++ GstClock inbetween those time points. This allows you to create
++ a perfect network stream player (one that doesn't lag (increasing buffers))
++ or play too fast (having an empty network queue).
++- On the client side, a GStreamer-ish way to do that is to cut the playback
++ pipeline in half, and have a decoupled element that converts
++ timestamps/durations (by resampling/interpolating/...) so that the sinks
++ consume data at the same rate the tcp sources provide it.
++ tcpclientsrc ! theoradec ! clocker name=clocker { clocker. ! xvimagesink }
++
++SYNCHRONISATION
++---------------
++- low rate source with high rate source:
++ the high rate source can drop samples so it starts with the same phase
++ as the low rate source. This could be done in a synchronizer element.
++ example:
++ - audio, 8000 Hz, and video, 5 fps
++ - pipeline goes to playing
++ - video src does capture and receives its first frame 50 ms after playing
++ -> phase is -90 or 270 degrees
++ - to compensate, the equivalent of 150 ms of audio could be dropped so
++ that the first videoframe's timestamp coincides with the timestamp of
++ the first audio buffer
++ - this should be done in the raw audio domain since it's typically not
++ possible to chop off samples in the encoded domain
++
++- two low rate sources:
++ not possible to do this correctly, maybe something in the middle can be
++ found ?
++
++IMPROVING QUALITY
++-----------------
++- video src can capture at a higher framerate than will be encoded
++- this gives the corrector more frames to choose from or interpolate with
++ to match the target framerate, reducing jerkiness.
++ e.g. capturing at 15 fps for 5 fps framerate.
++
++LIVE CHANGES IN PIPELINE
++------------------------
++- case 1: video recording for some time, user wants to add audio recording on
++ the fly
++ - user sets complete pipeline to paused
++ - user adds element for audio recording
++ - new element gets same base time as video element
++ - on PLAYING, new element will be in sync and the first buffer produced
++ will have a non-zero timestamp that is the same as the first new video
++ buffer
++
++- case 2: video recording for some time, user wants to add in an audio file
++ from disk.
++ - two possible expectations:
++ A) user expects the audio file to "start playing now" and be muxed
++ together with the current video frames
++ B) user expects the audio file to "start playing from the point where the
++ video currently is" (ie, video is at 10 seconds, so mux with audio
++ starting from 10 secs)
++ - case A):
++ - complete pipeline gets paused
++ - filesrc ! dec added
++ - both get base_time same as video element
++ - pipeline to playing
++ - all elements receive new "now" as base_time so timestamps are reset
++ - muxer will receive synchronized data from both
++ - case B):
++ nothing gets paused
++ - filesrc ! dec added
++ - both get base_time that is the current clock time
++ - pipeline to playing
++ - core sets
++ 1) - new audio part starts sending out data with timestamp 0 from start
++ of file
++ - muxer receives a whole set of frames from the audio side that are late
++ (since the timestamps start at 0), so keeps dropping until it has
++ caught up with the current set).
++ OR
++ 2) - audio part does clock query
++
++THINGS TO DIG UP
++----------------
++- is there a better way to get at "when was this frame captured" then doing
++ a clock query after capturing ?
++ Imagine a video device with a hardware buffer of four frames. If you
++ haven't asked for a frame from it in a while, three frames could be
++ queued up. So three consecutive frame gets result in immediate returns
++ with pretty much the same clock query for each of them.
++ So we should find a way to get "a comparable clock time" corresponding
++ to the captured frame.
++
++- v4l2 api returns a gettimeofday() timestamp with each buffer.
++ Given that, you can timestamp the buffer by subtracting the delta
++ between the buffer's clock timestamp with the current system clock time,
++ from the current time reported by the provided clock.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/thomasvs/docreview gstreamer-0.10.23/docs/random/thomasvs/docreview
+--- gstreamer-0.10.23.orig/docs/random/thomasvs/docreview 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/thomasvs/docreview 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,37 @@
++Documentation review
++
++* gstbuffer
++- What are the flags in GstBuffer ? used anywhere ? defined how ?
++
++
++* General
++- how can we define common terms and make them cros-ref'd ?
++ e.g. timestamps in buffer, do we say everywhere that they're in nanosec ?
++
++
++* Style
++- when in doubt, try to conform to GTK+ reference docs
++ (in the gtk-doc tarball, doc/style-guide.txt)
++- GtkMisc and GtkFontSelectionDialog are example templates.
++
++- in the arg clarification, use as much cross-reffing as possible. Do it
++ only where it is useful in the explanation text.
++
++- examples
++
++ - use active form instead of imperative describing functions; we describe
++ what the function does.
++ good : creates a new buffer.
++ bad : create new buffer
++ - use singular for enum names; this makes it more natural to reference to
++ it in the API docs
++ good : GstBufferFlag
++ bad : GstBufferFlags
++ - in arg clarification, use a period and start with a small letter.
++ Call the object you work on "a" instead of "the". Call the other objects
++ "the".
++ If the object in question is the return value, this means you call the
++ return value "a". If the object in question is the first argument
++ of the call, you call this argument "a" and the rest "the".
++ good : @buf: a pointer to query.
++ bad : @buf: The pointer to query
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/thomasvs/features gstreamer-0.10.23/docs/random/thomasvs/features
+--- gstreamer-0.10.23.orig/docs/random/thomasvs/features 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/thomasvs/features 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,15 @@
++Here's a list of features in GStreamer which plug-ins can make use of.
++For each feature we will try to find a few plug-ins that show a good way
++of implementing them.
++
++seeking
++caps negotiation
++timestamps
++clock interaction
++signals
++object argument handling
++chain-based
++loop-based
++request pads
++sometimes pads
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/thomasvs/guadec-4 gstreamer-0.10.23/docs/random/thomasvs/guadec-4
+--- gstreamer-0.10.23.orig/docs/random/thomasvs/guadec-4 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/thomasvs/guadec-4 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,16 @@
++Presentation ideas for GUADEC 4 (thomasvs, April 8 2002)
++
++* use gst-editor to create pipelines that make a karaoke machine
++ in different steps and using different features
++
++1) pipeline 1: play the free software song by Richard Stallman
++2) pipeline 2: do the same but add a visualization plugin
++3) create a small video using actual RMS footage
++4) pipeline 3: play this video and the song together
++5) Stallman is a bit hard to understand. We want text.
++ pipeline 4: use the subtitle reader to overlay text
++ maybe also do a bouncing ball overlay !
++6) Stallman can't sing. Let's pitch-shift him.
++ this will need MIDI or dynparams to control a pitch shifter
++7) It sounds better, but still not quite there. Replace him with a festival
++ voice doing the pitch shifting.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/thomasvs/metadata gstreamer-0.10.23/docs/random/thomasvs/metadata
+--- gstreamer-0.10.23.orig/docs/random/thomasvs/metadata 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/thomasvs/metadata 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,272 @@
++I'll use this doc to describe how I think media info should work from the
++perspective of the application developer and end user, and from that
++extrapolate what we need to provide that.
++
++RATIONALE
++---------
++One of the strong points of GStreamer is that it abstracts library dependencies
++away. A user is free to choose whatever plug-ins he has, and a developer
++can code to the general API that GStreamer provides without having to deal
++with the underlying codecs.
++
++It is important that GStreamer also handles media info well and efficiently,
++since more often than not the same libraries are needed to do this. So
++to avoid applications depending on these libs just to do the media info,
++we should make sure GStreamer provides a reasonable and fast abstraction
++for this as well.
++
++GOALS
++-----
++- quickly read and write "tags"
++- quickly read stream metadata (technical properties, length, audio props, ...)
++- cache both kinds of data transparently
++- (possibly) provide bins that do this
++- provide a simple API to do this
++
++DEFINITION OF TERMS
++-------------------
++The user or developer using GStreamer is interested in all information that
++describes the stream. The library handles these two types differently
++however, so I will use the following terms to describe this :
++
++- metadata :
++ every kind of information that is tied to the "concept" of the stream,
++ and not tied to the actual encoding or representation of the stream.
++ - it can be altered without transcoding the stream
++ - it would stay the same for different encodings of the file
++ - describes properties of the information encoded into the stream
++ - examples:
++ - artist, title, author
++ - year, track order, album
++ - comments
++
++- mediainfo
++ every kind of information that is tied to the "codec" used.
++ - cannot be altered without transcoding
++ - is the set of parameters the stream has been encoded with
++ - describes properties of the encoded stream itself
++ - examples:
++ - bitrate targets (e.g. nominal), encoding mode (e.g. joint stereo)
++ - to this we also add "bitrate", but we query this through the pad_query
++ interface
++
++- format
++ every kind of information that is tied to the "raw" bitstream
++ - cannot be altered without decoding and changing the raw bitstream
++ - examples:
++ - samplerate, bit depth/width, channels
++ - length in time
++ - video size, frames per second, colorspace used
++ - the format is queried by getting the GstCaps of the pad that sources
++ the buffers
++
++- length in time and tracks for the whole stream
++ - gotten through pad queries
++ - stored in variables in the struct
++
++- immediate info
++ - examples:
++ - position in time
++ - current bitrate
++
++- tracks :
++ a media file or stream can contain multiple consecutive streams, which
++ we will call "tracks". GStreamer has a format for track used in querying
++ and seeking as well.
++ A track should be thought of as the whole of one single piece of media
++ inside a physical stream.
++ A track can have at most one set of tags, and has fixed "raw" properties.
++
++EXAMPLE PIPELINES
++-----------------
++reading metadata : filesrc ! id3v1
++ - would read metadata from file
++ - id3v1 immediately causes filesrc to seek until it has found
++ - the (first) metadata
++ - that there is no metadata present
++ - id3v1 sends out a property notification with name "metadata" and
++ a GstCaps structure
++
++resetting and writing content metadata :
++ id3v1 reset=true artist="Arid" ! filesink
++
++ - effect: clear the current tag and reset it to only have Arid as artist
++ - id3v1 seeks to the right location, clears the tag, and writes the new one
++
++COST
++----
++Querying media info can be expensive.
++Any application querying for media info should take this into account and
++make sure that it doesn't block the app unnecessarily while the querying
++happens.
++
++The app should create an object, hand it a bunch of locations to query,
++and connect to the signal the app is going to send out.
++
++In most cases, querying content data should be fast since it doesn't involve
++decoding
++
++Technical data could be harder and thus might be better done only when needed.
++
++CACHE
++-----
++Getting media info can be an expensive operation. It makes sense to cache
++the dia info queried on-disk to provide rapid access to this data.
++It is important however that this is done transparently - the system should
++be able to keep working without it, or keep working when you delete this cache.
++
++The API would provide a function like
++ gst_media_info_read_cached (media_info, location,
++ GST_MEDIA_INFO_METADATA,
++ GST_MEDIA_INFO_READ_CACHED);
++
++to try and get the cached metadata using the media info object.
++
++- check if the file is cached in the media info cache
++ - if no, then read the media info and store it in the cache
++ - if yes, then check the file against it's timestamp (or (part of) md5sum ?)
++ - if it was changed, force a new read and store it in the cache
++ - if it wasn't changed, just return the cached media info
++
++
++For optimizations, it might also make sense to do
++ GList * gst_metadata_read_many (media_info, GList *locations, ...)
++
++which would allow the back-end to implement this more efficiently.
++Suppose an application loads a playlist, for example, then this playlist
++could be handed to this function, and a GList of metadata types could
++be returned.
++
++Possible implementations :
++- one large XML file : would end up being too heavy
++- one XML file per dir on system : good compromise; would still make sense
++ to keep this in memory instead of reading and writing it all the time
++ Also, odds are good that users mostly use files from same dir in one app
++ (but not necessarily)
++
++Possible extra niceties :
++- matching of moved files, and a similar move of metadata (through user-space
++ tool ?)
++
++!!! For speed reasons, it might make sense to somehow keep the cache in memory
++instead of reparsing the same cache file each time.
++
++!!! For disk space reasons, it might make sense to have a system cache.
++Not sure if the complexity added is worth it though.
++
++!!! For disk space reasons, we might want to add an upper limit on the size of
++the cache. For that we might need a timestamp on last retrieval of metadata,
++so that we can drop the old ones.
++
++The cache should use standard glibc.
++FIXME: is it worth it to use gnome-vfs for this ?
++
++STANDARDIZATION OF MEDIAINFO
++----------------------------
++Different file formats have different "tags". It is not always possible
++to map metadata to tags. Some level of agreement on metadata names is also
++required.
++
++For media info, the names or properties should be fairly standard.
++We also use the same names as used for properties and capabilities in
++GStreamer.
++
++This means we use
++ - encoded audio
++ - "bitrate" (which is bits per second - use the most correct one,
++ ie. average bitrate for VBR for example)
++
++ - raw audio
++ - "samplerate" - sampling frequency
++ - "channels"
++ - "bitwidth" - how wide is the audio in bits
++
++ - encoded video
++ - "bitrate"
++
++ - raw video
++ (FIXME: I don't know enough about video, are these correct)
++ - "width"
++ - "height"
++ - "colordepth"
++ - "colorspace"
++ - "fps"
++ - "aspectratio"
++
++We must find a way to avoid collision. A system stream can contain both
++audio and video (-> bitrate) or multiple audio or video streams. One way
++to do this might be to make a metadata set for a stream a GList of metadata
++for elementary streams.
++
++For metadata and tags, the standards are less clear.
++Some nice ones to standardize on might be
++ - artist
++ - title
++ - author
++ - year
++ - genre (messy though)
++ - RMS, inpoint, outpoint (calculated through some formula, used for mixing)
++
++TESTING
++-------
++It is important to write a decent testsuite for this and do speed comparisons
++between the library used and the GStreamer implementation.
++
++
++API
++---
++struct GstMetadata
++{
++ gchar *location;
++ GstMetadataType type;
++
++ GList *streams;
++ GHashtable *values;
++};
++
++(streams would be a GList of (again) GstMetadata's.
++ "location" would then be reused to indicate an identifier in the stream.
++ FIXME: is that evil ?)
++
++GstMetadataType - technical, content
++GstMetadataReadType - cached, raw
++
++GstMetadata *
++gst_metadata_read (const char *location,
++ GstMetadataType type,
++ GstMetadataReadType read_type);
++GstMetadata *
++gst_metadata_read_props (const char *location,
++ GList *names,
++ GstMetadataType type,
++ GstMetadataReadType read_type);
++GstMetadata *
++gst_metadata_read_cached (const char *location,
++ GstMetadataType type,
++ GstMetadataReadType read_type);
++
++GstMetadata *
++gst_metadata_read_props_cached (...)
++
++GList *
++gst_metadata_read_cached_many (GList *locations,
++ GstMetadataType type,
++ GstMetadataReadType read_type);
++
++GList *
++gst_metadata_read_props_cached_many (GList *locations,
++ GList *names,
++ GstMetadataType type,
++ GstMetadataReadType read_type);
++
++GList *
++gst_metadata_content_write (const char *location,
++ GstMetadata *metadata);
++
++
++SOME USEFUL RESOURCES
++---------------------
++http://www.chin.gc.ca/English/Standards/metadata_multimedia.html
++- describes multimedia data for images
++ distinction between content (descriptive), technical and
++ administrative metadata
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/thomasvs/packaging gstreamer-0.10.23/docs/random/thomasvs/packaging
+--- gstreamer-0.10.23.orig/docs/random/thomasvs/packaging 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/thomasvs/packaging 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,162 @@
++Packaging guidelines for GStreamer
++----------------------------------
++
++Here are some guidelines for people trying to package GStreamer.
++
++VERSIONS
++--------
++
++First of all, there are two concepts of version in GStreamer.
++The first is the source package version; it is either of the form
++x.y.z or x.y.z.n
++
++x is the major number, y is the minor number, z is the micro number, and
++n (if it exists) is the nano number.
++
++In the first case, it is an official release of GStreamer.
++In the second case, it is a cvs version tarball if n == 1, and a prerelease
++for the next version if n > 1.
++
++Source releases where y is even are considered "stable", and source releases
++where y is uneven are considered "unstable" or "development". This is similar
++to a lot of projects, including GLib and the kernel.
++
++The second version is an "interface" version, used in versioning tools, the
++library name, packages, GConf install paths, registry locations, and so on.
++It is of the form x.y
++Commonly, it is refered to as the "major/minor" number of GStreamer.
++In most cases it is the same as the one used in the source version; only
++when we are doing release candidates for a new major/minor source version do
++we manually force the major/minor to be the same as the one for the next
++new version. This is done to shake out bugs that can arise due to this change
++before we do an actual x.y.0 release.
++
++PARALLEL INSTALLABILITY
++-----------------------
++Versions of GStreamer with a different "interface" or major/minor version are
++supposed to be parallel-installable. If they're not then it's considered to
++be a bug.
++
++There are parallel-installable versions from the 0.6 set and onwards.
++
++In practice, this means that
++- libraries contain the major/minor version in their name
++- plugins are installed in a major/minor-versioned directory
++- include headers are installed in separate directories
++- registry is saved in major/minor-versioned locations
++- major/minor-versioned tools are installed, together with versioned man pages
++- non-versioned front-end tools are also installed, that call the
++ versioned ones, and only depend on glib and popt.
++
++So, all parts of GStreamer are parallel-installable, EXCEPT for the
++non-versioned tools and man pages. However, only one of these sets needs
++to be present, and preferably the latest source version of them.
++
++PACKAGING
++---------
++To make packages of different major/minor versions parallel installable, the
++important part is to separate the package of the nonversioned tools and
++man pages, and make them usable for all the GStreamer library packages.
++
++We recommend putting the versioned binaries and man pages in the same package
++as the base GStreamer library.
++
++The base GStreamer library should require a version of the non-versioned tools,
++so that users can expect the non-versioned tools to be present in all cases,
++and our documentation agrees with the install.
++
++As for package names, we recommend the following system:
++
++- "gstreamer" as the base name should be used for the latest stable version
++ of GStreamer.
++- "gstreamerxy" should be used for all other versions (older stable version,
++ as well as current development version)
++
++As an example:
++ - 0.7 is current development version, and 0.6 is latest stable version:
++ "gstreamer" for 0.6 and "gstreamer07" for 0.7
++ - 0.8.0 gets released:
++ "gstreamer06" for 0.6, "gstreamer07" is kept for 0.7, and
++ "gstreamer" for 0.8, where:
++ - the 0.8 "gstreamer" package can now obsolete the 0.7 package
++ - the 0.6 "gstreamer06" package can obsolete previous "gstreamer" packages
++ with lower version/release
++
++This ensures that users who just want the latest stable version of GStreamer
++can just install the "gstreamer"-named set of packages, while automatic
++tools can still upgrade cleanly, maintaining compatibility for applications
++requiring older versions.
++
++This base named should be used for all GStreamer packages;
++for example gstreamer07-plugins is a package of plugins to work with
++the gstreamer07 base library package.
++
++SPLITTING OF PLUGIN PACKAGES
++----------------------------
++Since GStreamer can depend on, but isn't forced to depend on, more than
++40 additional libraries, choosing how to package these is a challenge
++compared to other projects.
++
++Three approaches have been used in the past. One was "one package per
++dependency library", so that users could choose exactly what functionality
++they want installed.
++A second one was "split according to functionality". This is more arbitrary.
++A third one, used by some distributors, is "put everything we want to ship
++in one big package".
++
++Packagers seem to agree that the first approach is too hard and users do not
++care this much about fine-grained control.
++We decided on a mix of 2) and 3); preferring to follow the base distribution's
++decision for the base -plugins package, then creating additional packages
++based on functionality.
++
++Plugins are put in -audio, -video, -dvd and -alsa packages. Also, some
++plugins are put in -extras- packages because they are distributed from a
++different location, are not as well maintained, have other issues, ...
++
++In the case of Fedora, for example, mp3 plugins are shipped in -extras-audio,
++and distributed on FreshRPMS or rpm.livna.org
++For Mandrake, for example, they would be shipped from PLF.
++
++Now, to make sure other packages can require functionality they need,
++virtual provides are added for plugin packages, combining the base gstreamer
++name with the name of the actual GStreamer plugin.
++
++Assuming 0.7, and the mad plugin, the package "gstreamer07-plugins-extra-audio"
++would virtual-provide "gstreamer07-mad". It would contain the file
++libgstmad.so in the correct directory.
++
++PACKAGING TIPS FOR RPMS
++-----------------------
++* use a define for the base package name for all GStreamer spec files:
++%define gstreamer gstreamer07
++* use a define for the major/minor version of the package:
++%define majorminor 0.7
++
++This ensures you can easily migrate your spec files when a new major/minor
++version is released.
++
++* always use the correctly versioned gst-register-x.y tool in post scripts
++ that install plugins.
++ It helps to create a define for this as well:
++%define register %{_bindir}/gst-register-%{majorminor} > /dev/null 2>&1
++
++* make each package that installs plugins have (pre) and (post) requires
++ on the versioned register binary
++
++* make each package that installs plugins have a requires on the corresponding
++ base plugins package
++
++* make sure that the nonversioned tools and man pages are put in a package
++ that is named "gstreamer-tools" no matter what the major/minor version is.
++ This way, the latest version of this package can be used for all previous
++ major/minor packages. If you do not want this package twice, with different
++ versions, then write your spec so that you don't package the tools for
++ previous versions, and only for the latest version.
++
++* applications that require specific plugins to function should require
++ the correct -plugins package, as well as any additional virtual provides
++ they need to pull in.
++
++* stable releases can obsolete: the previous development releases to ensure
++ they get removed when installing the new stable version.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/thomasvs/pthread gstreamer-0.10.23/docs/random/thomasvs/pthread
+--- gstreamer-0.10.23.orig/docs/random/thomasvs/pthread 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/thomasvs/pthread 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,75 @@
++Some notes on use of pthreads in GStreamer
++------------------------------------------
++
++First off, pthreads are HARD. Remember that.
++
++1) How I learned to debug glibc and pthreads and add debug code to it.
++
++You have to trick your GStreamer test app in running against a modified
++glibc.
++
++I used Red Hat 7.3, downloaded the .src.rpm, installed it, applied the
++patches included, and ran
++ ./configure --prefix=/home/thomas/cvs --with-add-ons
++ make
++ make install
++
++After quite some time this left me with recompiled libc and libpthread
++libraries in /home/thomas/cvs/lib, as well as a new ld-linux.so.2
++
++Now you need to use this new ld-linux.so ld loader to run your app,
++preferably from inside of gdb so you can tell what's going on when it
++crashes.
++
++You can use ld-linux.so.2 to call your binaries:
++ ld-linux.so.2 .libs/thread1
++to run the thread1 program with the new glibc.
++
++If this is a GStreamer app, chances are it might not find some libraries
++it needs that you could safely use from /usr/lib (like, zlib and popt).
++
++Also, you want it to run in gdb, so this is my full line:
++
++LD_LIBRARY_PATH=/usr/lib /home/thomas/cvs/lib/ld-linux.so.2 \
++ /usr/bin/gdb .libs/thread1
++
++At this point you can start adding debug code to the pthreads implementation
++in your glibc source tree. Just change, re-run make install, and restart
++the test app in gdb.
++
++Helpful --gst-mask is 0x00200100 to get thread info and scheduling info
++(with mem alloc from cothreads)
++
++2) What GStreamer does with pthreads.
++
++Apps create a thread with gst_thread_new. This just allocates the GstThread
++structure without actually doing much with it.
++
++When a thread goes from NULL to READY, the gst_thread_change_state function
++creates the actual pthread.
++ - we lock the thread->lock mutex
++ - we create attributes for the pthread
++ - by default the pthread is JOINABLE
++ - we ask the thread's scheduler for a preferred stack size and location
++ (FIXME: if the scheduler doesn't return one, what do we do ?)
++ - we create the pthread with the given attributes
++ - the pthread id is stored in thread->thread_id
++ - the created pthread starts executing gst_thread_main_loop (thread)
++ - the change_state function does a g_cond_wait
++ - this means it unlocks the mutex, waits until thread->cond is set
++ (which happens in gst_thread_main_loop),
++ then relocks the mutex and resumes execution
++
++From the point of view of the created pthread, here's what happens.
++gst_thread_main_loop (thread) gets called
++ - the thread's mutex gets locked
++ - the thread's scheduler's policy gets examined
++ - the scheduler gets set up (invokes the scheduler object's setup method)
++ FIXME: what are the prereqs of this _setup method ?
++ - basic and fast scheduler both call do_cothread_context_init
++ - basic: this calls cothread_context_init
++ - cothread_context_init
++ - fast: this calls cothread_create (NULL, 0, NULL, NULL))
++
++(FINISHME)
++(FOLDMEBACKTOREALDOCS)
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/thomasvs/pwg gstreamer-0.10.23/docs/random/thomasvs/pwg
+--- gstreamer-0.10.23.orig/docs/random/thomasvs/pwg 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/thomasvs/pwg 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,39 @@
++Stuff for the PWG
++-----------------
++
++* arguments
++
++ - how to add arguments
++ - create an identifier in the enum, starting with ARG_
++ example: ARG_RATE
++ - add the property by adding a
++ g_object_class_install_property line
++ FIXME: what is name/nick/blurb in the paramspec ?
++ - if the argument is readable, a block of code for it needs to be added
++ to the _get_property function.
++
++ - default value
++ - default value should be set in _init function
++ - default value can be specified in paramspec (but I don't think this
++ is used anywhere)
++
++
++ - things to check/possible problems
++ - do you have a _get_property function ?
++ - do you have a _set_property function ?
++ - do both have a default handler that handles invalid property ID's ?
++ - are the _get/_set_property handlers assigned to the class's struct ?
++ - do you have a g_object_class_install_property line for the argument ?
++ - are there restrictions on when your parameters can change ?
++ e.g. sample rate is not something that should be changed while PLAYING,
++ so it can only be changed in the NULL state
++ - did you use ARG_ ... consistently everywhere ?
++
++
++ - my own problems:
++ - how to set defaults and make the paramspec be right for them ?
++
++
++* audio
++ - explanation of difference of width and depth
++ - guidelines on how to implement this properly
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/thomasvs/registry gstreamer-0.10.23/docs/random/thomasvs/registry
+--- gstreamer-0.10.23.orig/docs/random/thomasvs/registry 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/thomasvs/registry 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,36 @@
++Reviewing the registry (thomasvs, April 8 2002)
++
++* added a --gst-registry flag to the core which allows any gst app
++ to specify a different registry for loading/saving
++
++ some stuff to do this went into gstreamer/gst/gstregistry.h
++
++* What location is used for writing ? (gst-register)
++
++ - if specified (using --gst-registry) then use the specified location
++ - if not specified :
++ - it can be written in the global location, do it there
++ (which should be sysconfdir/gstreamer) and reg.xml
++ - if not writable, then try ~/.gstreamer/reg.xml
++
++* What location is used for reading ? (gst-whatever)
++
++ - if specified (using --gst-registry) then use the specified location
++ - if not specified :
++ - right now :
++ if local exists, only read local
++ if not, read global
++
++ - TODO: try reading GST_CONFIG_DIR/reg.xml first
++ then try reading ~/.gstreamer/reg.xml
++ AND replace every namespace collision with the new one
++
++* actual variables stuff (gstregistry.c)
++ - use gst_registry_write_get to get a GstRegistryWrite struct back
++ listing the right location of dir, file and tmp file
++ - use gst_registry_read_get to get a GstRegistryRead struct back
++ listing the path of global and local file to read
++
++* gst-register signals it's going to write to the registry (causing it to
++ be unlinked before the read in post_init ()) by setting a global variable,
++ _gst_init_write_registry
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/thomasvs/TODO gstreamer-0.10.23/docs/random/thomasvs/TODO
+--- gstreamer-0.10.23.orig/docs/random/thomasvs/TODO 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/thomasvs/TODO 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,3 @@
++GSTREAMER
++---------
++- gst-i18n-lib.h is included funnily from base classes and elements
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/TODO-pre-0.9 gstreamer-0.10.23/docs/random/TODO-pre-0.9
+--- gstreamer-0.10.23.orig/docs/random/TODO-pre-0.9 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/TODO-pre-0.9 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,170 @@
++TODO:
++-----
++
++short term core API stability
++-----------------------------
++
++Changes that probably impact the API, carefull discussion (IRC) + design doc is required
++before changes are accepted.
++
++target release ! description
++ !
++ 0.4.1 ! expose and API to query the supported seek formats/flags on
++ (done) ! pads, somthing like an extra arg to gst_pad_set_convert_function
++ ! and gst_pad_set_event_function with some function to query the
++ ! flags and formats. more ideas in docs/random/wtay/query_events
++ ! (API: medium dificulty)
++ !
++ 0.4.1 ! add event for segment playback/looping and seeking (docs/random/wtay/segments)
++ (done) ! (API: medium dificulty, plugins: HARD to very HARD)
++ !
++ ? ! add event to adjust rate (reverse playback, slow motion, frame skipping)
++ ! (docs/random/wtay/rate_event)
++ ! (API: medium dificulty, plugins: HARD to very HARD)
++ !
++ ? ! add method in the scheduler to set the entry point (frame stepping?)
++ ! (docs/random/wtay/scheduler_entry)
++ ! (API: moderatly EASY, scheduler implementation MEDIUM)
++ !
++ 0.6.0 ! create a design doc for a timecache implementation,
++ (done) ! (docs/wtay/random/timecache)
++ ! (API: MEDIUM, needs lots of discussion, plugin implementation MEDIUM to HARD)
++ ! (done: implemented using GstIndex base class + subclasses)
++ !
++ ? ! implement a QoS event and a policy for handling the event.
++ ! (API: kindof EASY, plugins MEDIUM to very HARD)
++ !
++ 0.4.1 ! implement user defined GstFormat values, make a format factory etc..
++ (done) ! (API: MEDIUM, plugins MEDIUM)
++ !
++ ? ! strip the API to a bare bones minimal set of functions, leave the automatic
++ ! stuff to the app instead of forcing a policy in the core.
++ ! create a library with useful higher level function for people who don't want
++ ! to deal with the lowlevel stuff.
++ ! (HARD, need to negotiate with people :))
++ !
++ ? ! use GMarkup to load/save objects, remove dependency on libxml2
++ ! (MEDIUM) breaks API/ABI compatibility
++ !
++
++
++shortterm core feature enhancements
++-----------------------------------
++
++ 0.4.1 ! Implement PAD_DISABLED. This requires simple checks in the scheduler so that
++ ! it doesn't try to pull/push data from/to a disabled pad.
++ ! When an element goes to the PAUSED state, all of its pads should be disabled.
++ ! This should also work for ghostpads.
++ ! (API: MEDIUM to moderatly HARD, requires some scheduler understanding)
++
++
++short term usability
++--------------------
++
++Writing docs is NOT boring, you learn a lot, you get insight in stuff, you help a lot
++of people, hey! you might even find YOUR book on a shelf in a bookstore!!
++
++
++ ? ! plugin writers guide
++ ! (we have almost nothing, so any start is welcomed)
++ ! (MEDIUM)
++ !
++ ? ! app writers guide needs to cover common tips and tricks and HOWTOs
++ ! (MEDIUM)
++
++
++short to midterm policy definition
++----------------------------------
++
++Policy definition is closely related to a HOWTO but sometimes needs some thinking.
++
++
++ ? ! document thread safety guidelines, what stuff needs locking in the app, what
++ ! is done in the core.
++ ! most of this stuff is in the heads of various people but needs to be written
++ ! down so that people get more insights into the design and vision of GStreamer.
++ ! (MEDIUM, some research and discussion needed)
++ !
++ ? ! a step by step guide to the implementation of various events in a plugin, what can you
++ ! do, when is data passing forbidden etc..
++ ! (MEDIUM, some research needed)
++ !
++ ? ! figure out a policy for the NEW_MEDIA event
++ ! (MEDIUM to HARD)
++ !
++ ? ! figure out how to better handle clock resync
++ ! (MEDIUM to HARD)
++ !
++
++
++midterm feature enhancement
++---------------------------
++
++ 0.6.0 | Define and implement a syntax in gst_parse to handle filtered pad connections.
++ (done) | (MEDIUM)
++ |
++ ? | Figure out a way to set properties on schedulers (and bins?) from gst_parse.
++ | (MEDIUM)
++ |
++ ? | Make gst-inspect do inspection of plugins, schedulers, autopluggers, types.
++ | An idea would be to make -inspect output an XML representation of the objects
++ | and use XSLT to transform this into text, HTML, docbook, ...
++ | (MEDIUM to EASY)
++ |
++
++
++midterm (longterm) optimisations
++--------------------------------
++
++These optimisations can be done without changing the existing API.
++
++
++ (in progress) ! implement an optimal scheduler that uses chaining when possible
++ ! (HARD, requires detailed knowledge of element scheduling)
++ !
++ ? ! alternatively optimisations to the current scheduler can be done such
++ ! as: do nothing when the pipeline structure (or chain) has not changed
++ ! (MEDIUM)
++ !
++ ? ! GstQueue is a little mess. implement a better queue (lockfree?), refactor
++ ! queueing policy (max buffer, max time, levels etc..)
++ ! (MEDIUM to farily EASY)
++
++
++longterm feature enhancements
++-----------------------------
++
++Various features that are not critical yet.
++
++ ? ! factory aliases. map a generic name like "videosink" to and actual
++ ! user configurable plugin (aasink, sdlsink, xvideosink, ...)
++ ! (MEDIUM)
++ !
++ ? ! property proxy in compount elements. not sure if it's possible at all.
++ ! what with elements with the same property?
++ ! (MEDIUM, needs some thinking)
++ !
++ ? ! Make _pad_select work for muxers
++ ! (MEDIUM to HARD)
++
++
++needs consensus
++---------------
++
++Some stuff that needs to be figured out based on a pro/con comparison.
++
++ ? ! can we decide on the fact that downstream events are traveling using the
++ ! scheduler? do we need to reevaluate that design decision?
++ ! (MEDIUM, needs pros vs cons document)
++
++
++benchmarks
++----------
++
++Benchmarks are always good to get acceptance in a wider comunity or to identify performance
++problems that need fixing.
++
++ ? ! do a latency comparison with popular other frameworks, document GStreamer
++ ! overhead.
++ ! (MEDIUM to somewhat EASY)
++ !
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/typefind gstreamer-0.10.23/docs/random/typefind
+--- gstreamer-0.10.23.orig/docs/random/typefind 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/typefind 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,101 @@
++1) Goal:
++========
++The goal of this document is to analyze current problems
++in media type detection as we currently handle it in
++GStreamer (as of 27/9/2003), and how these can be solved.
++This touches upon typefinding, autoplugging and (optionally)
++bytestream.
++
++2) Typefinding, bytestream & autoplugging:
++==========================================
++
++bytestream:
++-----------
++currently, bytestream collects incoming buffers and adds
++them up (gst_buffer_merge ()). From this, a subbuffer is
++created, which is inexpensive. In case of filesrc, the
++merging is not expensive, too (mmap ()). However, in any
++other source case, _merge () needs a new buffer plus copy
++of the data. This is plain wrong. Source elements need to
++be able to support a _read ()- instead of a _get ()-based
++way of providing data to the pipeline on their choice. To
++the rest of GStreamer, _get () and _read () are the same,
++the only difference is that _read () also requests a size
++of the buffer to be returned.
++
++Surely, this does not mean that bytestream will read any
++buffer size that is requested from it plainly, this would
++be ineffective. It is still allowed to cache (although the
++kernel will do this too...).
++
++typefinding:
++------------
++the typefind function type is currently defined as:
++
++typedef stuct _GstTypeDefinition {
++ gchar *name;
++ gchar *mimetype;
++ gchar *extension;
++ GstTypefindFunc func;
++} GstTypeDefinition;
++
++typedef (GstCaps *) (* GstTypefindFunc) (GstBuffer *buffer,
++ gpointer private);
++
++GstTypeFactory * gst_type_factory_new (GstTypeDefinition *def);
++
++Although is is unclear what private is and how to use it
++in a plugin. ;). The current approach has one large
++disadvantage: the plugin cannot control the input for type
++detection. Therefore, if the incoming buffer is not large
++enough, typefinding will inappropriately fail. This is
++unacceptable. The plugin needs to control input data flow
++itself, so that we will have less false negatives and/or
++will need only one cycle through the plugins to find the
++type of a data stream.
++
++Therefore, I propose the following change to the typefind
++system:
++
++typedef (GstCaps *) (* GstTypefindFunc) (GstBytestream *input,
++ gpointer private);
++
++and
++
++GstTypeFactory * gst_type_factory_new (GstTypeDefinition *definition,
++ gpointer data);
++
++The data gpointer will be provided as second argument to the
++typefind function and is for private use to the plugin.
++
++There is one rule: at the end of typefinding, the plugin needs
++to take care that the state of the bytestream is exactly the
++same as before typefinding. It may cache data, but it may not
++skip (and therefore lose) data. If the bytestream supports
++seeking, this is easy: simply seek back to 0 (start of stream)
++after typefinding. If it does not, then you need to assure
++that you only used _peek (), not _read () or _flush ().
++
++The caller of the typefind function is responsible for creating
++the bytestream and for emptying the cache and reusing it in the
++data stream after the typefind function returns.
++
++spider:
++-------
++Imo, spider should use GstTypefind (a public element) for
++typefinding. Ideally, it would derive from it.
++
++GstTypefind emits a signal when a type is found, and furtherly
++only has a sink pad. the derived elements from this should
++implement anything needed to make a proper autoplugger.
++
++3) Status of this document
++==========================
++Proposal, pending to be implemented. Target release is 0.8.0 or
++any 0.7.x release.
++
++4) Copyright and blabla
++=======================
++(c) Ronald Bultje, 2003 <rbultje@ronald.bitfreak.net> under the
++terms of the GNU Free Documentation License. See http://www.gnu.org/
++for details.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/types gstreamer-0.10.23/docs/random/types
+--- gstreamer-0.10.23.orig/docs/random/types 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/types 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,33 @@
++GstTypes exist to try to make sure data eveyrone is talking about the
++right kind of data. They aid quite a bit in autoplugging, in fact make it
++possible. Each well-formed type includes a function (typefind) that will
++take one or more buffers and determine whether or not it is indeed a
++stream of that type, and possible a metadata to go with it. It may
++provide related metadata structure IDs (and must if it provides metadata
++from the typefind function).
++
++Because multiple elements and plugins are very likely to be using the same
++types, the process of creating/finding types is designed to be done with a
++single function call. All operations on GstTypes occur via their guint16
++ID numbers, with the GstType structure "private" to the GST library. A
++plugin wishing to use a give type would contain a static struct of type
++GstTypeFactory, which lists the MIME type, possible extensions (which may
++overlap the mime-types file), a typefind function, and any other cruft I
++decide to add.
++
++A plugin init function would take this typefactory and hand it to the
++gst_type_new() (FIXME: badly named) function, which would first search for
++that same MIME type in the current list. If it found one, it would
++compare the two to see if the new one is "better". Better is defined as
++having more extentions (to be merged) or a typefind function verses none.
++
++The point of returning an existing MIME type is a result of the goal of
++unifying types enough to guarantee that, for instance, all MP3 decoders
++will work interchangably. If MP3 decoder A says "MIME type 'audio/mpeg'
++with extensions 'mpeg3'" and decoder B says "MIME type 'audio/mpeg' with
++extensions 'mp3'", we don't want to have two types defined, possibly with
++two typefind functions. If we did, it's not obvious which of the two would
++be tried first (luck) and if both would really identify streams as mp3
++correctly in all cases. And whichever wins, we're stuck using the
++associated decoder to play that stream. We lose the choice between any
++valid mp3 decoder, and thus the whole point of the type system.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/types2 gstreamer-0.10.23/docs/random/types2
+--- gstreamer-0.10.23.orig/docs/random/types2 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/types2 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,282 @@
++OUTDATED
++--------
++
++
++1. Introduction
++---------------
++
++The type system is used to attach meaning to the bytes in a GstBuffer.
++A plugin can decide to add metadata to the GstBuffer, this metadata
++will carry an associated typeid.
++
++Types are also used by the plugins to expose the type of their pads to
++the type system.
++
++Types are essential for autoplugging.
++
++We will explain the inner workings of the type system in this document, as
++well as the API used in the plugins.
++
++
++2. Type properties
++------------------
++
++a) identification of the type
++
++ Types are identified by one or more MIME types.
++
++b) detection of types
++
++ The type of any given GstBuffer can be detected using
++
++ - a typefind function: a function that will inspect the bytes
++ in the buffer and return a gboolean indicating the
++ buffer is of the given type.
++
++ - a template for the bytes/bits in the data that must be
++ satisfied in order for the GstBuffer to be of the given
++ type.
++
++ - other properties that act more like a hint like:
++ the extension of the source filename.
++ the URI of the source.
++
++
++3. Type registration
++--------------------
++
++a) the core libraries will create to types:
++
++ video/raw image/raw
++ audio/raw
++
++b) all other types will be provided by the plugins
++
++before a type can become available to other plugins, the plugin
++has to register the type.
++
++The system will keep a directed graph of the types and the plugins
++that operate on them.
++
++example:
++
++ video/mpeg
++ !
++ mpeg1parse
++ / \
++ video/mpeg1 audio/mp3 -----\
++ ! ! \ !
++ mpeg_play mpeg2dec mpg123 xing ...
++ \ / \ /
++ video/raw audio/raw-----\
++ ! ! ! !
++ videosink SDLsink audiosink alsasink ...
++
++
++The system can find the needed plugins to convert video/mpeg to
++audio/raw using this graph.
++
++
++4. type equivalence
++-------------------
++
++some types can have the same meaning for example:
++
++ audio/mp3 and audio/mpeg
++
++or
++
++ video/raw and image/raw
++
++
++a plugin that exposes its output type as audio/mpeg and another plugins
++with input type audio/mp3 can be connected. The system has to know about
++the equivalence of both types, even it they have a different mime type.
++
++
++5. type hierarchy
++-----------------
++
++some plugins can ouput a specific subset of an allready existing type.
++
++example:
++
++ mp3parse inputs audio/mp3 and packs the stream into mp3 audio frames
++ with mime type: audio/mp3-frame
++
++ mpg123 only accepts audio/mp3-frame but not audio/mp3.
++
++ another mp3 decoder (libmpg123) can accept audio/mp3 (and thus also
++ audio/mp3-frame)
++
++ it must be possible to connect both libmpg123 and mpg123 to the mp3parse
++ element.
++ it must not be possible to connect mpg123 to an element that outputs only
++ audio/mp3 but not audio/mp3-frame.
++
++
++We say that audio/mp3-frame is a more specific subset of type audio/mp3.
++
++we can create a type hierarchy:
++
++ audio/mp3
++ / \
++ audio/mp3-frame audio/mp3-layer12
++ / \
++ audio/mp3-layer1 audio/mp3-layer2
++
++
++6. multi-type pads
++------------------
++
++certain plugins might accept multiple non equivalent types in one of their
++input pads. Consequently a plugin might output non equivalent types in
++its output pad.
++
++It must therefore be possible to specify multiple types for a pad.
++
++example:
++
++ mpegdemux may be able to demux both MPEG1 and MPEG2 system streams.
++ we show the type hierarchy of the video/mpeg as follows:
++
++ video/mpeg
++ / \
++ video/mpeg1 video/mpeg2 ---------------\
++ / \ / \ !
++ mpeg1-system* mpeg1-video mpeg2-ts mpeg2-ps* mpeg2-video
++
++
++ the mpegdemux element might specify the type of the input pad as
++ one of video/mpeg1-system and video/mpeg2-ts
++
++
++
++7. definition of types
++----------------------
++
++A plugin will provide the following information to the type system:
++
++ - a mime type string describing the hierarchy and where the types
++ they provide are located in that hierarchy.
++
++ - typefind functions for some of the types.
++
++ - extensions for some of the types
++
++We will propose a syntax to define the type hierarchy
++
++a) equivalent types :
++
++ separated with a | sign
++
++ ( audio/mp3 | audio/mpeg )
++
++b) type hierarchy :
++
++ in braces:
++
++ ( audio/mp3 ( audio/mp3-frame))
++
++c) multi-type pads
++
++ ( mpegdemux ( video/mpeg1-system + video/mpeg2-ps) )
++
++ the pad will have type mpegdemux which is the parent for
++ type video/mpeg1-system or video/mpeg2-ps
++
++ mpegdemux
++ / \
++ video/mpeg1-system video/mpeg2-ps
++
++
++
++once the type hierarchy has been registered, the typeid of each
++element can be obtained with:
++
++ guint16 gst_type_find_by_mime (gchar *mime)
++
++extra typefind functions and/or extensions can be added to the
++typeid afterwards.
++
++
++8. type matching
++----------------
++
++The more specific typefind functions, the functions associated with
++types in the leaf nodes, are tried first.
++
++when a specific type has been found ex. video/mpeg1-system elements
++that can handle this type or one of its parents are selected:
++
++ mpegdemux: mpeg1parse: supermpegdecoder:
++
++ video/mpeg video/mpeg video/mpeg
++ ! !
++ mpegdemux video/mpeg1-system
++ !
++ video/mpeg1-system
++
++In the above case, also the super mpeg element is selected because it stated
++that it can handle all sorts of video/mpeg data.
++
++
++example 2:
++
++ suppose the typefind functions finds an mp3 stream, fillowing elments
++ are selected:
++
++ libmpg123 mp3parse:
++
++ audio/mp3 audio/mp3
++
++ mpg123 is not selected because its pad type is too specific (audio/mp3-frame):
++
++ mpg123
++
++ audio/mp3
++ !
++ audio/mp3-frame
++
++ if the typefind would find a mp3-frame type, all three objects would be selected.
++
++
++8. consideration
++----------------
++
++It is clear that clear indications have to be given to the type hierarchy,
++especially for the top nodes.
++
++The more specific an element is in its mime type specification, the more flexible
++and extendible the plugin system can be.
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/types3 gstreamer-0.10.23/docs/random/types3
+--- gstreamer-0.10.23.orig/docs/random/types3 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/types3 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,177 @@
++SOMEWHAT OUTDATED, design still holds though
++--------------------------------------------
++
++
++1. Introduction
++---------------
++
++The type system is used to attach meaning to the bytes in a GstBuffer.
++A plugin can decide to add metadata to the GstBuffer, this metadata
++will carry an associated typeid.
++
++Types are also used by the plugins to expose the type of their pads to
++the type system.
++
++Types are essential for autoplugging.
++
++We will explain the inner workings of the type system in this document, as
++well as the API used in the plugins.
++
++2. major types
++--------------
++
++major types are identified with mime types and are used to denote a
++family of types.
++
++More specific information about the type is given using properties. This
++will allow us to be very specific without creating a lot of mime types.
++
++3. API
++------
++
++Both a simple array based specification and a real API will be
++provided to build the capabilities.
++
++In the array based approach, we basically build an array of pointers.
++Some macros will be available to specify ranges, boolean values, lists
++and id's. (not sure if this can be done)
++
++#define GST_TYPE_INT_RANGE(a, b) GST_TYPE_RANGE,(a),(b)
++#define GST_TYPE_BOOLEAN(a) GST_TYPE_BOOLEAN,(a)
++#define GST_TYPE_LIST(a...) GST_TYPE_LIST,(##a),NULL
++
++for example:
++
++ static GstTypeCapsFactory mpg123_sink_caps[] = {
++ "audio/mp3",
++ "layer", GST_TYPE_INT_RANGE (1, 3),
++ "bitrate", GST_TYPE_INT_RANGE (8, 320),
++ "framed", GST_TYPE_BOOLEAN (true),
++ NULL
++ };
++
++will expand to the array:
++
++ static GstTypeCapsFactory mpg123_sink_caps[] = {
++ "audio/mp3",
++ "layer", GST_TYPE_RANGE,1,3,
++ "bitrate", GST_TYPE_RANGE,8,320,
++ "famed", GST_TYPE_BOOLEAN,true,
++ NULL,
++ };
++
++when we register the caps factory, the strings will be converted
++into GQuarks and be stored into a GData Keyed Data List.
++
++This will result in a GstTypeCaps structure:
++
++struct _GstTypeCaps {
++ guint16 id; // if of the major type
++
++ GData *properties;
++}
++
++4. example using arrays
++-----------------------
++
++mpg123: an mpeg audio decoder.
++
++ // a factory for the major type we use
++ static GstTypeFactory mp3factory = {
++ "audio/mp3", // major type
++ ".mp3 .mp2 .mp1 .mpga", // extenstions
++ NULL, // typefind function
++ };
++
++ // capabilities of the sink pad
++ static GstTypeCapsFactory mpg123_sink_caps[] = {
++ "audio/mp3",
++ "layer", GST_TYPE_INT_RANGE (1, 3),
++ "bitrate", GST_TYPE_INT_RANGE (8, 320),
++ "framed", GST_TYPE_BOOLEAN (true),
++ NULL
++ };
++
++ // capabilities of the source pad
++ static GstTypeCapsFactory mpg123_src_caps[] = {
++ "audio/raw",
++ "rate", GST_TYPE_INT_RANGE (8000, 48000),
++ "channels", GST_TYPE_INT_RANGE (1, 2),
++ NULL
++ };
++
++ static GstTypeCaps *sinkcaps = NULL, *rawcaps = NULL;
++
++ static gst_mpg123_init (GstMpg123 *mpg123)
++ {
++ mpg123->sinpad = gst_pad_new ("sink", GST_PAD_SINK);
++ gst_element_add_pad (GST_ELEMENT (mpg123), mpg123->sinkpad);
++ gst_pad_set_caps (mpg123->sinkpad, sinkcaps);
++
++ ...
++ }
++
++ GstPlugin *plugin_init (GModule *module)
++ {
++ ...
++ plugin = gst_plugin_new ("mpg123");
++
++ gst_plugin_add_type_factory (plugin, mp3factory);
++
++ ...
++ sinkcaps = gst_type_register_caps (mpg123_sink_caps, NULL);
++ rawcaps = gst_type_register_caps (mpg123_src_caps, NULL);
++ ...
++ }
++
++mpeg2dec: an mpeg video decoder that can do mpeg1 and mpeg2.
++
++ static GstTypeFactory mpegfactory = {
++ "video/mpeg", // major type
++ ".mpg .mpeg", // extenstions
++ NULL, // typefind function
++ };
++
++ static GstTypeCapsFactory mpeg2dec_sink_caps[] = {
++ "video/mpeg",
++ "mpegtype", GST_TYPE_LIST (
++ GST_TYPE_INT(1),
++ GST_TYPE_INT(2),
++ ),
++ NULL
++ };
++
++ static GstTypeCapsFactory mpeg2dec_src_caps[] = {
++ "video/raw",
++ "fourcc", GST_TYPE_LIST (
++ GST_TYPE_INT32 (0x32315659),
++ GST_TYPE_INT32 (0x32...),
++ ),
++ "width", GST_TYPE_INT_RANGE (16, 4096),
++ "height", GST_TYPE_INT_RANGE (16, 4096),
++ NULL
++ };
++
++ static GstTypeCaps *sinkcaps = NULL, *rawcaps = NULL;
++
++ GstPlugin *plugin_init (GModule *module)
++ {
++ ...
++ plugin = gst_plugin_new ("mpeg2dec");
++
++ ...
++ sinkcaps = gst_type_register_caps (mpeg2dec_sink_caps, NULL);
++ rawcaps = gst_type_register_caps (mpeg2dec_src_caps, NULL);
++ ...
++ }
++
++
++5. capabilty compatibility
++--------------------------
++
++Two pads are compatible if:
++
++- The major types are equal
++- range of the sink pad contains the range of the src pad
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/uraeus/gstreamer_and_midi.txt gstreamer-0.10.23/docs/random/uraeus/gstreamer_and_midi.txt
+--- gstreamer-0.10.23.orig/docs/random/uraeus/gstreamer_and_midi.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/uraeus/gstreamer_and_midi.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,351 @@
++This document was created by editing together a series of emails and IRC logs.
++This means that the language might seem a little weird at places, but it should
++outline most of the thinking and design adding MIDI support to GStreamer so far.
++
++Authors of this document include:
++
++Steve Baker <steve@stevebaker.org>
++Leif Johnson <leif@ambient.2y.net>
++Andy Wingo <wingo@pobox.com>
++Christian Schaller <Uraeus@gnome.org>
++
++About MIDI
++----------
++
++MIDI (Musical Instrument Digital Interface) is used mainly as a communications
++protocol for devices in a music studio. These devices could be physical entities
++(e.g. synthesizers, sequencers, etc.) or purely logical (e.g. sequencers or
++filter banks implemented as software applications).
++
++The MIDI specification essentially consists of a list of MIDI messages that can
++be passed among devices ; these messages (also referred to as "events") are
++usually things like NoteOn (start playing a sound), NoteOff (stop playing a
++sound), Clock (for synchronization), ProgramChange (for signaling an instrument
++or program change), etc.
++
++MIDI is different from other cross-device or inter-process streaming methods
++(e.g. JACK and possibly some CORBA implementations) because MIDI messages are
++discrete and usually only exchanged a few times per second ; the devices
++involved are supposed to interpret the MIDI messages and produce sounds or
++signals. The devices in a MIDI chain typically send their audio signals out on
++separate (physical) cables or (logical) channels that have nothing to do with
++the MIDI chain itself.
++
++We want to have MIDI messages available in GStreamer pipelines because MIDI is a
++common protocol in many existing studios, and MIDI is more or less a standard
++for inter-device communications. With MIDI support in GStreamer we can look
++forward to (a) controlling and being controlled by external devices like
++keyboards and sequencers, and (b) synchronizing and communicating among multiple
++applications on a studio computer.
++
++GStreamer and MIDI
++------------------
++
++MIDI could be thought of in terms of dataflow as a sparse, non-constant flow of
++bytes. GStreamer works best with near-constant data flow, so a MIDI stream would
++probably have to consist mostly of filler events, sent at a constant tick rate.
++It makes the most sense at this point to distribute MIDI events in a GStreamer
++pipeline as a sequence of subclasses of GstEvent (GstMidiEvent or suchlike).
++
++On-the-wire hardware MIDI connections run at a fixed data rate:
++
++ The MIDI data stream is a unidirectional asynchronous bit stream at 31.25
++ Kbits/sec. with 10 bits transmitted per message (a start bit, 8 data bits, and
++ one stop bit).
++
++Which is to say, 3125 bytes/sec. I would assume that the rawmidi interface would
++already filter out the stop and start bits? dunno. How about the diagram on[1],
++I found that to be useful. The MIDI specification is also available (though I
++can't find it online at the moment ... might have to buy a copy), and there are
++several tutorial and help pages (just google for MIDI tutorial).
++
++There's another form of MIDI (the common usage?), "Standard MIDI files," which
++essentially specify how to save and restore MIDI events in a file. We'll talk
++about that in a bit.
++
++[1] http://www.philrees.co.uk/#midi
++
++MIDI and current Linux/Unix audio systems
++-----------------------------------------
++
++We don't know very much about the OSS MIDI interface; apparently there exists an
++evil /dev/sequencer interface, and maybe a better /dev/midi* one. I only know
++this from overhearing it from people. For latency reasons, the ALSA MIDI
++interface will be much more solid than using these devices ; however, the
++/dev/midi* devices might be more of a cross-platform standard.
++
++ALSA has a couple ways to access MIDI devices. One way is the sequencer API.
++There's a tutorial[1], and some example code[2] -- the paradigm is 'wait on some
++event fd's until you get an event, then process the event'. Not very
++GStreamer-like. This API timestamps the events, much like Standard MIDI files.
++
++The other way to use MIDI with alsa is with the rawmidi interface. There is a
++canonical reference[3] and example code, too[4]. This is much more like
++GStreamer. I do wonder about the ability to connect to other sequencer clients,
++though...
++
++[1] http://www.suse.de/~mana/alsa090_howto.html#sect04
++[2] http://www.suse.de/~mana/seqdemo.c
++[3] http://www.alsa-project.org/alsa-doc/alsa-lib/rawmidi.html#rawmidi
++[4] http://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2rawmidi_8c-example.html#example_test_rawmidi
++
++Getting MIDI into GStreamer
++---------------------------
++
++All buffers are timestamped, and MIDI buffers should be no exception. A buffer
++with MIDI data will have a timestamp which says exactly when the data should be
++played. In some cases this would mean a buffer contains just a couple of bytes
++(eg, NoteOn). If this turns out to be inefficient we can deal with that later.
++
++In addition to integrating more tightly with GStreamer audio pipelines (see the
++dparams and midi2pcm sections below), there are several elements that we will
++need for basic MIDI interaction in GStreamer. These basics include file parsing
++and encoding (is that the opposite of parsing ?), and direct hardware input and
++output. We'll also probably need a more generic sequencer interface for defining
++elements that are capable of sending and receiving this type of nonlinear stream
++information.
++
++For these tasks, we need to define some MIME types, some general properties, and
++some MIDI elements for GStreamer.
++
++Types :
++
++- MIDI being passed to/from a text file : audio/midi (This is in my midi.types
++ file, associated with a .midi or .mid extension. It seems analogous to a .wav
++ file, which contains "audio/x-wav" type information.)
++
++- MIDI in a pipeline : audio/x-gst-midi ?
++
++Properties :
++
++- tick rate : (default to 96.0, or something like that) This is measured in
++ ticks per quarter note (or "pulses per quarter note" (ppqn) to be picky). We
++ should use float for this so we can support nonstandard (fractional)
++ tempos.
++
++- tempo : (default to 120 bpm) This can be measured in bpm (beats per minute,
++ the musician's viewpoint), or mpq (microseconds per quarter note, the unit
++ used in a MIDI file[1]). Seems like we might want a query format for these
++ different units ? Or maybe we should just use MPQ and leave it to apps to do
++ conversions ?
++
++Elements :
++
++- midiparse : audio/midi -> audio/x-gst-midi
++
++ This element converts MIDI information from a file into MIDI signals that can
++ be passed around in GStreamer pipelines. This would parse so-called Standard
++ MIDI files (and XML format MIDI files ?). Standard MIDI files are just
++ timestamped MIDI data; they don't run at a constant bitrate, and for that
++ reason you need this element.
++
++ The timestamps that this element produces would be based on the tempo
++ property, and the time deltas of the MIDI file data. If no data exists for a
++ given tick, the element can just send a filler event.
++
++ The element should support both globbing and streaming the file. Streaming it
++ is the most GStreamerish way of handling it, but there are MIDI file formats
++ which are by definition unstreamable, therefore a MIDI plugin needs to support
++ streaming and globbing - and globbing might be easiest to implement first. The
++ modplug plugin also reads an entire file before playing so its a valid
++ technique.
++
++- ossmidisink : audio/x-gst-midi -> hardware
++
++ Could be added to the existing OSS plugin dir, sends MIDI data to the OSS MIDI
++ sequencer device (/dev/midi). Makes extensive use of GstClock to send out data
++ only when the buffer/event timestamp says it should. (Could instead use the
++ raw MIDI device for clocking, doesn't matter which.)
++
++- alsamidisink : audio/x-gst-midi -> ALSA rawmidi API
++
++ Guess what this does. Don't know whether alsa's sequencer interface would be
++ better than its rawmidi one. Probably rawmidi?
++
++- ossmidisrc, alsamidisrc : hardware -> audio/x-gst-midi
++
++ Real time midi input. This needs to be from the rawmidi APIs.
++
++It seems like we could implement a class hierarchy around these elements. We
++could use a GstMidiElement superclass, which would include the above properties
++and contain utility functions for things like reading from the clock and
++converting between different time measurement units. From this element we ought
++to have GstMidiSource, GstMidiFilter, and GstMidiSink parent classes. (Maybe
++that's overkill ?) Each of these MIDI elements listed above could then inherit
++from an appropriate superclass.
++
++We also need an interface (GstSequencer) to allow multiple implementations for
++one of the most common MIDI tasks (duh, sequencing). The midisinks could
++implement this interface, as could other soft-sequencer elements like
++playondemand. The sequencer interface needs to be able to support MIDI
++sequencing tasks, but it should support more generic sequencing concepts.
++
++As you might have guessed, getting MIDI support into GStreamer is thus a matter
++of (a) creating a series of elements that handle MIDI data, and (b) creating a
++sort of MIDI library (like Timidity ?) that basically includes #defines for MIDI
++message codes and stuff like that. This stuff should be coded in the gst-plugins
++module, under gst-libs/gst/sequencer (for the interface) and
++gst-libs/gst/audio/midi/ (for the defines and superclasses).
++
++Of course, this is just the basics ... read on for the really gory future stuff.
++:)
++
++[1] http://www.borg.com/~jglatt/tech/midifile/ppqn.htm
++
++Looking ahead
++-------------
++
++- MIDI to PCM
++
++It would be nice to be able to transform MIDI (audio/midi) to audio
++(audio/x-raw-{int|float}), which could be further processed in a GStreamer
++pipeline. In effect this would be using GStreamer as some kind of softsynth.
++
++The first way to do this would be to send MIDI data to softsynths and get audio
++data out. There's a very, very nice way of doing this in ALSA (the sequencer
++API). Timidity can already register itself as a sequencer client, as can
++amSynth, AlsaModularSynth, SpiralSynth, etc... and these latter ones are *much*
++more interesting. This is the proper, IMHO, way of doing things.
++
++But, the other question is getting that data back for use by GStreamer. In that
++sense a librafied Timidity would be useful, I guess... see the thing is that all
++of these sequencer clients probably want to output to the sound card directly,
++although they are configurable. In this, the musician's only hope is Jack. If
++the synth is jacked up, we can get its output back into GStreamer. If not, oh
++well, it's gone ...
++
++- MIDI to dparams
++
++Once we have MIDI streams, we can start doing fun things like writing a
++midi2dparams element which would map midi data to control the dynamic parameters
++of other elements, but lets not get ahead of ourselves.
++
++Which gets back to MIDI. MIDI is a representation of control signals. So all you
++need are elements to convert that representation to control signals. In
++addition, you'd probably want something like SuperCollider's Voicer element --
++see [1] for more information on that.
++
++All of this is pretty specific to a synthesizer system, and rightly so :
++multiple projects use it it could go in some kind of library or what-what but
++otherwise it can stay in individial projects.
++
++[1] http://www.audiosynth.com/schtmldocs/Help/Unit_Generators/Spawners/Voicer.help.html
++
++On using dparams for MIDI
++-------------------------
++
++You might might want to look into using dparams if:
++
++- you wanted your control parameters to change at a higher rate thanyour buffer
++ rate (think zipper noise and sample-granularity-interpolation)
++- you wanted a better way to store and represent control data than midifiles
++- We wrote a linear interpolation time-aware dparam so that we could really
++ demonstrate what they're good for.
++
++It was always the intention for dparams to be able to send values to and get
++values from pads. All we need is some simple elements to do the forwarding.
++
++Possible inefficiency remedy : GstControlPad
++--------------------------------------------
++
++If it turns out that sending MIDI events spaced out with filler (blank) events
++isn't efficient enough, we'll need to look into implementing something new ; for
++now, though, we'll just try the simple approach and hope our CPUs are fast
++enough. But read on for a little brainstorming.
++
++It seems like GStreamer could benefit from a different subclass of GstPad,
++something like GstControlPad. Pads of this type could contain control data like
++parameters for oscillators/filters, MIDI events, text information for subtitles,
++etc. The defining characteristic of this type of data is that it operates at a
++much lower sample rate than the multimedia data that GStreamer currently
++handles.I think that control data can be sent down existing pads without making
++any changes.
++
++GstControlPad instances could also contain a default value like Wingo has been
++pondering, so apps wouldn't need to connect actual data to the pads if the
++default value sufficed. There could also be some sweet integration with dparams,
++it seems like.If you want a default value on a control pad, just make the source
++element send the value when the state changes. Elements that have control pads
++could also have standard GstPads, and I'd imagine there would need to be some
++scheduler modifications to enable the lower processing demands of control pads.
++
++An example : integrating amSynth[1]
++-----------------------------------
++
++We would want to be able to write amSynth as a plugin. This would require that
++when the process function is called, we have a MIDI buffer as input, containing
++how ever many MIDI events occurred in, say, 1/100 sec for example, and then we
++generate an audio buffer of the same time duration...)
++
++Maybe this will indicate the kind of problems to be faced. GStreamer has solved
++this problem for audio/video syncing, so you should probably do it the same way.
++The first task would be to make this pipeline work:
++
++ filesrc location=foo.mid ! midiparse ! amSynth ! osssink
++
++midiparse will take MIDI file data as an input, and produce timestamped MIDI
++buffers as output. It could have a beats-per-minute property as mentioned above
++to specify how the MIDI beat offsets are converted to timestamps.
++
++An amSynth element should be a loop element. It would read MIDI buffers until it
++has more than enough to produce audio for the duration of one audio buffer. It
++knows it has enough MIDI buffers by looking at the timestamp. Because amSynth is
++setting the timestamps on the audio buffers going out, a MIDI sink element would
++know when to play them. Once this is working, a more challenging pipeline might
++be :
++
++ alsamidisrc ! amSynth ! alsasink
++
++This would be a real-time pipeline : any MIDI input should instantly be
++transformed into audio. You would have small audio buffers for lowlatency (64
++samples seems to be typical).
++
++This is a problem for amSynth because it can't sit there waiting for more MIDI
++just in case there is more than one MIDI event per audio buffer. In this case
++you could either :
++
++- listen to the clock so you know when its time to output the buffer
++- have some kind of real-time mode for amSynth which doesn't wait forMIDI events
++ which may never come
++- have alsamidisrc produce empty timestamped MIDI buffers so that amSynth knows
++ that is time to spit out some audio.
++
++[1] http://amsynthe.sourceforge.net/amSynth/index.html
++
++Extended midi files : .kar and karaoke
++-----------------------------------
++
++KAR files are standard MIDI files that also contain a stream with lyrics, for karaoke,
++synchronised on music. MIDI players play them without any problem, ignoring the
++additional data.
++
++It is the more widespread karaoke file format. (one other beeing .kok files, for mp3)
++
++KAR files are based on standard MIDI files with the following additional events:
++
++The KAR text meta events start with an @ followed by a character indicating
++the type of KAR text meta event, then followed by text for that event. The
++following text meta events occur embedded in regular MIDI text events:
++
++FileType: @KMIDI KARAOKE FILE
++Version: @V0100
++Information: @I<text>
++Language: @LENGL
++Title 1: @T<title>
++Title 2: @T<author>
++Title 3: @T<copyright>
++
++The following lyric text indicators are defined. A \ (backslash) in the
++text is to clear the screen. A / (forwardslash) in the text is a line feed
++(next line).
++
++Some more info on the data format could be found at those locations :
++
++http://www.krazykats-karaoke.co.uk/file_formats.html
++http://www.wotsit.org/download.asp?f=kar
++http://filext.com/detaillist.php?extdetail=KAR
++
++Some Linux players that handle this format :
++
++http://lmuse.sourceforge.net/files.php
++http://sourceforge.net/projects/gkaraoke/
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/usecases gstreamer-0.10.23/docs/random/usecases
+--- gstreamer-0.10.23.orig/docs/random/usecases 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/usecases 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,44 @@
++Use cases for audio applications
++--------------------------------
++
++ANALYSIS
++========
++
++* find start and end -x dB boundary
++
++* find overall volume for complete track (peak/RMS/average)
++
++* do level-triggered playback
++
++CUE FILES
++=========
++
++Given a long audio file and a .cue file:
++- an element should be able to read an audio input stream and a cue input
++ stream and send new-media events based on the .cue file information
++- a audiocdsink should be able to record this stream straight to disk
++
++Use cases for core functionality
++--------------------------------
++
++THREADS
++=======
++
++* { sinesrc } ! { queue ! osssink }
++ - play thread
++ - pause input thread
++ - output thread should keep playing as long as queue not empty
++ - play input thread again
++ - no gaps should be heard
++
++Use cases for video applications
++--------------------------------
++
++THUMBNAILING
++============
++- load file
++- figure out if it's playable
++- ask length of file
++- seek to middle
++- snapshot one frame
++- save to disk
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/vis-transform gstreamer-0.10.23/docs/random/vis-transform
+--- gstreamer-0.10.23.orig/docs/random/vis-transform 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/vis-transform 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,78 @@
++Duh, an 'easy' way to replicate Giess's behavior:
++
++For each frame, you have to mutate it by a transform matrix. This is
++easy, thought not cheap. First you precalculate the transform matrix how
++you want it, based on whatever rotations or whatever you want.
++
++The data stored in each spot on the matrix tells you how to transform a
++single pixel. The simple case is dx,dy, where both are relatively small.
++The probably ought to be a byte in any case, so you can scale the
++transform matrix on slow machines. A more complex case is some trick
++whereby a single pixel ends up splattered in several places. Idea below.
++
++The matrix consists of some number of 8bit arrays of the same size as the
++image. They'd probably be line-interleaved or better to help with cache
++effects (which are VERY serious here). Each channel represents some
++aspect of the transform. The first two would likely be dx and dy, the
++third might be a multiplier if that wasn't done statically.
++
++The idea: any number of transform sets could be applied, given available
++processing power. Just set the static scalar or the multiplier matrices
++so you don't completely swamp the output pixels.
++
++Note that this is fastest in 8-bit, but theoretically could be applied to
++32 bit. 15 and 16 are hard, since you can't easily apply the multipliers
++unless they're 1/2^n, and even then it's significantly heavier (you'd have
++to mask the top n bits of each color out).
++
++This SCREAMS for MMX, in case you haven't figured it out yet.
++Unfortunatley, MMX is only directly useful for the scalar matrix, unless
++you do a trick where all the pixels in that fit in 64 bits (8 8bit, 4
++16bit, or 2 32bit) are always moved in a group. This is very possible,
++and might be a significant perf increase by being able to use MMX all the
++way through. Otherwise you have to place each pixel by extracting the MMX
++stuff back into normal registers, and that just plain sucks.
++
++A pseudo-C implementation:
++
++----- BEGIN -----
++gint x,y; /* image x and y size */
++guchar old_image[x][y]; /* original image */
++guchar new_image[x][y]; /* new image */
++gchar x_xform[x][y]; /* dx matrix */
++gchar y_xform[x][y]; /* dy matrix */
++guchar s_xform[x][y]; /* intensity scalar matrix */
++guchar scalar; /* global scalar */
++
++gint i,j; /* indixes */
++gulong p; /* pixel value in question */
++guchar u,v,w; /* modifier variables */
++
++/* clear the new image, we don't want anything getting in the way */
++/* NOT NECESSARILY A GOOD THING, THOUGH */
++memset(new_image,0,x*y);
++
++/* loop through all the lines in the image */
++for (j=0;j<y;j++) {
++ /* loop through all the pixels in the line */
++ for (i=0;i<x;i++) {
++ p = old_image[i][j];
++ u = x_xform[i][j];
++ v = y_xform[i][j];
++ w = s_xform[i][j];
++ new_image[i+u][j+v] = (guchar)((p<<14) / (w * scalar));
++ }
++}
++----- END -----
++
++Note that the above really, *REALLY* sucks performance-wise. Throw it a
++80x60 image and it'll swamp my poor laptop. Also note that I simply set
++the pixel value, not merge it. That means you'd better be sure your
++transform matrix doesn't have overlapping destinations.
++
++Other notes about the above code: x_xform and y_xform are signed chars,
++which means pixels can move in all directions. The intensity matrix is
++unsigned, with a range from 0 to 255, so is the global scalar. Note the
++shift of 14bits (2 * 7bits), then divide by each. That means identity for
++both scalars is at 128. The FP range of each is thus 0.0 to 2.0. Very
++handy.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wingo/porting-plugins-to-0.9 gstreamer-0.10.23/docs/random/wingo/porting-plugins-to-0.9
+--- gstreamer-0.10.23.orig/docs/random/wingo/porting-plugins-to-0.9 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wingo/porting-plugins-to-0.9 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,32 @@
++-*- outline -*-
++
++
++Some collected notes porting plugins to GStreamer 0.9.
++
++
++* General notes
++
++Consider using the base classes. There are base classes for sources,
++sinks, and "transformers", which are plugins that have the same caps on
++their source and sink sides.
++
++These base classes offer interfaces that are much more appropriate to
++the function of specific plugins than the general GstElement interface.
++
++
++* Functions that changed
++
++** gst_pad_use_explicit_caps
++** gst_pad_set_explicit_caps
++
++Not needed; just set the caps on the first buffer you push out.
++
++** gst_element_set_loop_function
++
++Use gst_pad_set_loop_function. Note that loop-based elements participate
++more in the scheduling process in 0.9, so you'll need to add hooks to
++the activate function to start up a task.
++
++refcounting:
++_get_ accessors
++GValue, GstObject, and refcounts (arrrrgh)
+\ Kein Zeilenumbruch am Dateiende.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wingo/pro-audio-with-gstreamer gstreamer-0.10.23/docs/random/wingo/pro-audio-with-gstreamer
+--- gstreamer-0.10.23.orig/docs/random/wingo/pro-audio-with-gstreamer 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wingo/pro-audio-with-gstreamer 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,149 @@
++-*- outline -*-
++
++* Pro Audio with GStreamer
++
++This file attempts to document usage of GStreamer for so-called "pro
++audio"[0]. Two audiences are considered: programmers that are
++considering GStreamer for their pro-audio app, and GStreamer developers
++interested in which parts of GStreamer pro-audio uses.
++
++[0] I actually don't like this term, because it's elitist. Of course
++ other audio applications are not inferior, but they are different.
++ I'll stick with the term out of established practice.
++
++** What GStreamer Offers the Pro Audio Developer
++
++Choosing GStreamer for your application gives you lots of things for
++free.
++
++*** A high penetration into POSIX desktops
++
++GStreamer is included with Gnome, so you'll find it already installed on
++an increasing number of desktops. It makes it easier for a user to
++install your app. However, you still have to check for individual
++plugins that you depend on.
++
++*** An extremely flexible signal flow graph
++
++You have elements, connection points, different kinds of processing
++functions, schedulers, etc. You can subclass just about everything, or
++replace whole subsystems as you need to.
++
++All of this you would have to implement somehow. The downside is, of
++course, that it's extremely flexible. The graph isn't run by clock-tick
++-- the delays are carried out by the timekeeping element (if any), when
++execution reaches it. It's cooperative, rather than dictator-style like
++Jack. If all problems have been worked out, etc, it runs smoothly, but
++one poorly coded element can stall the graph.
++
++Restricting graph operation to clock-ticks and using buses instead, like
++SuperCollider 3, would introduce many simplifications to scheduling and
++such, I would think. However, you'd still have to implement your
++signal-flow infrastructure from scratch if you decided to go it alone.
++
++I might revise the above paragraph, though. I like GStreamer's level of
++flexibility a bit too much :)
++
++*** A wide variety of existing plugins
++
++This includes inputs like ALSA, OSS, sndfile, etc, as well as their
++corresponding sinks (outputs). Then there are the network transports.
++And the sound servers (including Jack). LADSPA plugins for free. Some
++DSP things, but admittedly not too much -- this is an area for future
++expansion.
++
++*** Generic plugin behavior
++
++Of course you still have to know some specifics about the plugins you
++use (which properties they have, for example), but in general elements
++of a "pipeline" (signal flow graph -- and no, it doesn't have to look
++like a pipe) are replaceable. Your user can choose between ALSA or OSS
++or even ESD (shudder), and it's simple to implement.
++
++*** Easy threads
++
++Adding threads to your signal flowgraph does takes some thought, but
++once you've decided how to set things up it's reasonably easy.
++Unfortunately realtime threads aren't implemented yet, but that should
++be an easy project, knock on wood.
++
++*** Other Stuff
++
++GStreamer is big these days. I wouldn't say bloated, but there are a lot
++of subsystems relating to "media" that just aren't applicable to
++processing float data. There's a whole system (called "caps") that deals
++with negotiating common formats between elements, when all pro audio has
++to deal with is sample-rate and the number of frames per buffer. There's
++a typefinding and pipeline autoplugging subsystem. There's "tags", like
++from ID3 tags.
++
++You might find uses for these things, and thankfully these uses blur the
++lines between "pro" and "consumer" audio. To an extent, these features
++complicate GStreamer programming. But mostly they stay out of your way
++-- besides caps, they only bother you when you ask them to :-)
++
++** Pro Audio for GStreamer Programmers
++
++Pro audio is a restricted, almost purely mathematical domain. There's
++not that much to worry about. Each channel is separate from the rest
++(never interleaved). All data is in float format, and native byte order.
++The sample rate is typically the same in the whole system. Same with the
++number of frames in a buffer.
++
++So it's simple, but it's different from "normal" audio processing (a
++whole mess of variables to synchronise and convert between, interleaved
++data, codecs, etc). But it's sufficiently different that in the past
++we've had discussions every 8 months or so about why things are
++implemented in such-and-such a way, and why don't we change them, and so
++on. So this part of the document is aimed at GStreamer developer's as a
++kind of documentation for the whole float-caps space.
++
++*** The Format
++
++Pro audio deals with floats. I'm not really worried about doubles --
++although LADSPA carefully #define's LADSPA_Sample so you can override
++it, everything's in float.
++
++There are two variables to be concerned about. One is sample rate, which
++is pretty obvious. The not-so-obvious one is buffer-frames, specifying
++the number of frames that will come in a buffer. If a buffer has fewer
++frames, that indicates EOS is coming on the next pull. This property is
++an optimization to allow easy chaining of buffers in multi-pad elements,
++as well as to prevent deadlocks in circular pipelines, and to comply
++with systems like Jack that operate on clock ticks.
++
++*** Channels
++
++One variable that is not in pro-audio is the number of channels in a
++stream. Streams are always mono. All DSP algorithms expect to receive
++mono data. Multichannel processing is done via multiple inputs. This is
++the complicated part of pro audio for GStreamer, because it means lots
++of multi-pad elements, and complicated pipelines, which is a pain to
++code for (if you're not coding it in Scheme, of course ;). So yes, it's
++kindof a pain, but it is a flexibility that's necessary.
++
++*** Stability
++
++DSP routines written years back still work, because all you need to use
++them is to -lm. GStreamer is a step towards DLL hell. And audio
++developers are a funny bunch. Look at Paul Davis's Ardour CVS, for
++instance. He has a local copy of every library ever coded, ever. No
++joke.
++
++If our platform is to remain attractive to this group, we need to start
++to stabilize the way GStreamer works. Of course API and ABI change,
++we're young. But outside of media-related work, the core is pretty
++stable. When we move to change things after 0.8, changes should be well
++documented.
++
++That's all pretty normal, but there is one special consideration. DSP
++involves lots of custom plugins, maintained outside the GStreamer tree.
++So just because you grep the tree and don't find an instance of X
++function or whatever, it doesn't necessarily mean the feature/behaviour
++is unused. This will be increasingly true for other GStreamer users in
++the future, but it's true now for DSP. I'm talking about me now ;)
++
++OK, enough rambling. Hope this clarifies things a bit.
++
++Andy Wingo, 24 Jan 2004.
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wingo/threadsafe-properties gstreamer-0.10.23/docs/random/wingo/threadsafe-properties
+--- gstreamer-0.10.23.orig/docs/random/wingo/threadsafe-properties 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wingo/threadsafe-properties 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,76 @@
++-*- Mode: text -*-
++
++Sometimes it's difficult to use GStreamer in real applications where the GUI and
++the GStreamer pipeline are in different threads. You have to somehow make sure
++that the object is not modifying its properties while you get and set them. This
++document is a brief outline of a potential fix to this issue.
++
++* When is it safe to get or set properties?
++
++Well, it is only safe to do so when other threads are not accessing an object.
++So, from the main thread, it is only safe to query or modify properties on an
++object when it is not in the RUNNING state, because when it is RUNNING its
++properties are potentially changing in the thread of execution.
++
++The only place that it is safe to get or set properties while in the RUNNING
++state is from within the thread of execution. Thus, something within the
++iteration loop of the thread must check to see if there are pending property
++changes or queries. There are two places this could be done, from within
++gstthread itself and from within the scheduler. Doing it from gstthread sounds
++like a good idea because it keeps more code out of the scheduler, but is also
++bad in a way because it requires a gstthread-specific api to proxy prop_set and
++prop_get. Setting it in the scheduler sounds good because of its finer
++granularity, but might be bad because it would clutter the scheduler a bit more.
++
++I propose to go with the scheduler-based solution based on system response time
++and out of potentials for integration with gst_clock_wait.
++
++* Implementation
++
++We do want to preserve some measure of generality, however. Considering that
++more threadsafety issues could pop up in the future, it would be nice to have
++one function to call from the scheduler, in the interests of code
++simplification. This function will be present in some elements and not in
++others, and will be modified at run time, so we will make it a function pointer
++within the GstElement struct.
++
++struct _GstElement {
++ ...
++ void (*pre_run_func) (GstElement *);
++ void (*post_run_func) (GstElement *);
++}
++
++Only the managing bin of an element is allowed to set that function, because
++presumably that bin would know something about how to schedule the element.
++Then, in the scheduler, before we call chain functions and before we switch into
++loop functions:
++
++if (element->pre_run_func)
++ element->pre_run_func (element);
++
++Then, to get or set properties, we use the new functions gst_element_get or
++gst_element_set. _set would add the property name and a gvalue onto a queue
++(probably a GAsyncQueue). Then the pre_run_func would go ahead and set the
++properties. _get is a little more tricky; _set doesn't hardly block at all,
++although it's not instantaneous. With _get though, you really don't know what
++the properties are until you query them. The best thing would be to connect to
++the ::notify signal, which executes within the thread of interest. However, say
++you really want to use _get. Hmm. I think that it would have to block. On what?
++Well, probably on an element's mutex. So it seems we might need a
++post_run_func too, to unlock the mutex. We can use the GstObject lock for this.
++
++But we need a little more. How do we know whether or not just calling
++g_object_get/set is ok? I'm thinking this whole prop set/get proxy thing should
++not be abstracted away, that it should be contained in gstelement.c. There are
++more kinds of bins that need threadsafety than just gstthread (I'm thinking
++about jack here). So, we can add on a GAsyncQueue *prop_set_queue; to the
++GstElement struct, and only initialize it in certain managing bins. Then, we can
++set a flag on gstelement, GST_ELEMENT_USE_THREADSAFE_PROPERTIES. If this flag is
++set (by the managing bin), do all this complicated mess; otherwise use the
++gobject native functionality.
++
++So, this is the plan. We'll see how the implementation goes. This should make MT
++gst programming much easier.
++
++wingo.
++25 May 2002.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wingo/without-factories gstreamer-0.10.23/docs/random/wingo/without-factories
+--- gstreamer-0.10.23.orig/docs/random/wingo/without-factories 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wingo/without-factories 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,62 @@
++-*- outline -*-
++
++* Creating Elements Without Factories
++
++** The purpose of factories
++
++On a typical GStreamer system, there are approximately 6.022*10^23
++plugins. GStreamer knows about all of them because of the registry. The
++goal is to avoid initializing each one of them, when maybe for your
++application you only need one or two.
++
++The problem becomes, how do you create an instance of the plugin? The
++normal way to instantiate a class is via g_object_new (TYPE, ARGS...).
++In the case that the plugin isn't loaded, you don't know its type, and
++can't even get it from the type name.
++
++Element factories exist to solve this problem by associating names (like
++"sinesrc" or "identity") with certain types that are provided by the
++plugin. Then when the user asks for "sinesrc", the appropriate plugin is
++loaded, its types are initialized, and then gst_element_factory_create
++creates the object for you.
++
++** Why not factories?
++
++To review, factories (1) allow plugins to remain unloaded if not
++necessary, and (2) make it easy to create elements.
++
++If you are writing an application that has custom elements (as is the
++case with most serious applications), you will probably have the plugin
++loaded up already, and you will have access to the type of the element.
++To muck about creating a plugin for the app, registering the element
++with the plugin, and then creating it with the element factory API
++actually takes more work than the normal way.
++
++** g_object_new
++
++So you want to avoid factories. To create objects with a simple
++g_object_new call is our strategy. However, to preserve the same
++semantics as gst_element_factory_create, we need to know what else is
++needed to initialize a GStreamer element.
++
++The other things that gst_element_factory_create does are as follows:
++
++*** Sets the ->elementfactory member on the element class
++
++Note that anything trying to get the factory won't work (e.g.
++gst_element_get_factory). Thankfully this is less of a problem after the
++0.7 plugin system changes.
++
++*** Initializes the name of the element
++
++To do this ourselves, we either call gst_object_set_name, or when we
++set the "name" property when creating the object.
++
++** Summary
++
++To create a GStreamer element when you know the type, you can just use
++
++g_object_new (get_type_of_my_element (),
++ "name", the_name_you_want_possibly_null,
++ ... any other properties ...
++ NULL);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/abstract gstreamer-0.10.23/docs/random/wtay/abstract
+--- gstreamer-0.10.23.orig/docs/random/wtay/abstract 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/abstract 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,33 @@
++This paper will present the GStreamer Media framework. We
++explain briefly what a media framework is and what its advantages
++are. This introduction presents the basic design of GStreamer
++and how the modularity can provide many benefits when building
++multimedia applications ranging from simple audio/video players
++to complex audio/video mixing and non linear editing.
++
++We then go into more detail about the different components of
++the framework and how specific problems were solved.
++State changes are covered first as they bring the pipeline with
++all its components from a sleeping to a running state. The most
++interesting problem here is error recovery and thread interlocking.
++
++We expand on the scheduler that is responsible for making sure all
++of the components don't step on eachothers toes as they pass along
++data. We explain one of the possible scheduling methods using
++cothreads and expand on how the number of cothread switches can
++be reduced in order to make the data flow as fast as possible.
++
++Since GStreamer is a very open system that can basically handle
++any media type, a mechanism is provided to negotiate the media
++types between plugins. We continue with an explanation of how
++this type negotiation is done.
++
++Events are the mechanism to indicate changes in the data that is
++flowing through the pipeline, such as End Of Stream notification
++or seek and flush events. We explain how these events work and
++how they interact with the scheduler.
++
++We finally cover some of the interesting libraries that are
++provided with GStreamer, such as the bytestream library. We
++explain how all the pieces fit together and how we combine different
++techniques to create a very fast read API.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/autoplug2 gstreamer-0.10.23/docs/random/wtay/autoplug2
+--- gstreamer-0.10.23.orig/docs/random/wtay/autoplug2 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/autoplug2 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,135 @@
++Autoplugger V2
++==============
++
++The current autoplugger as described in autoplug1 has some
++serious shortcommings:
++
++ - it is embedded in GstPipeline and cannot be used with a
++ generic interface. A lot of complexity is inside the
++ pipeline, more specifically the creation of threads and
++ subbins and the pad connections.
++ - it is not (easily) pluggable.
++
++
++
++1) definition
++-------------
++
++We want to define a plugable framework for autoplugging this
++includes:
++
++ - autoplugging algorithms can be added and removed at run time.
++ - autoplugging algorithms can be defined by plugins.
++
++The autoplugger is build to handle simple media playback but
++could also be used to create more complex pipelines.
++
++The main focus will be on creating an element (can be a bin)
++that has *one* input pad and *one or more* output pads.
++
++It must be possible for a user app to insert its own elements in
++the autogenerated element.
++
++The autoplugger will be an interface to the low level plugin
++system based on the functional requirements of the user app.
++the app will for example request an object that can convert
++media type X to media type Y, the user app is not interested in
++any intermediate steps to accomplish this conversion.
++
++
++2) the API
++----------
++
++The API for the user apps should be no more then this:
++
++ GstElement* gst_autoplug_caps_list (GstAutoplug *autoplug,
++ GList *incaps,
++ GList *outcaps, ...);
++
++ autoplug is a reference to the autoplug implementation
++ incaps is a GList of GstCaps* for the source pad, the last set
++ of arguments is a va_list of destination caps lists.
++
++A handle to the autoplugger implementation can be obtained
++with
++
++ GList* gst_autoplugfactory_get_list (void);
++
++which will return a GList* of autopluggers.
++
++ GstAutoplug* gst_autoplugfactory_make ("name");
++
++or
++
++ GstAutoplug* gst_autoplugfactory_create (GstAutoplugFactory *autoplug);
++
++is used to get an autoplugger.
++
++
++3) the plugins API
++------------------
++
++plugins can add their own autoplugger implementation by
++subclassing an abstract autoplugger class and implementing/
++overriding various methods.
++
++the autoplugger can be registered with:
++
++ gst_plugin_add_autoplugger (GstPlugin *plugin,
++ GstAutoplugFactory *autoplug);
++
++This will allow us to only load the autoplugger when needed.
++
++
++
++4) implementation
++-----------------
++
++We will implement two autopluggers:
++
++ - a static autoplugger. This autoplugger recursively adds
++ elements to the target element until all of the possible
++ pads are connected to something. The static autoplugger
++ only operates on padtemplates and ALWAYS pads. The pipeline
++ is not started before all elements are connected, hence
++ the 'static' autoplugger. This autoplugger will be a rework
++ of the current autoplugger.
++
++ - a dynamic autoplugger. This autoplugger configures the
++ pipeline at runtime based on the pad capabilities when they
++ become available. this allows for more fine grained
++ autoplugging than can be achieved with the static one because
++ it can be based on the actual media stream you are handling.
++
++the autopluggers will be implemented in their separate plugins,
++outside of the core libraries and are therefore optional.
++
++
++5) the autoplugger object
++-------------------------
++
++the autoplugger object will be an abstract class with the following
++properties:
++
++ - name, description, more text to identify the autoplugger.
++
++ - a class method autoplug_caps_list that has to be implemented by
++ the real autoplugger.
++
++optionally, the core autoplugger code can provide convenience
++functions to implement custom autopluggers. The shortest path
++algorithm with pluggable weighting and list functions come to
++mind.
++
++signals will be added to the autoplugger so that user apps can
++modify the constructed pipeline by adding extra objects.
++A possible use case would be to let gstmediaplay perform an
++autoplug on the media stream and insert a custom sound/video
++effect in the pipeline when an appropriate element is created.
++
++the "new_object" signal will be fired by the autoplugger whenever
++a new object has been created. This signal can be caught by the
++user app to perform an introspection on the newly created object.
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/autoplug3 gstreamer-0.10.23/docs/random/wtay/autoplug3
+--- gstreamer-0.10.23.orig/docs/random/wtay/autoplug3 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/autoplug3 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,38 @@
++
++The autoplugger is a custom bin with a set of custom add/remove methods.
++The point is to virtually add a set of plugins that should take part in
++the autoplugging (like the src, sink elements). The autoplugger should
++try hard to included these plugins in the final pipeline.
++
++The autoplugger has to be a bin because else we cannot put it into the
++paused state when dynamically connecting elements.
++
++We cannot include the intermediate elements or sink/src elements to the bin
++right away because else they will be scheduled by the scheduler.
++
++The bin will use the elementfactory klass field to get a basic idea about
++the plugin:
++
++ - the 'Source' keyword is used to detect source elements
++ - the 'Sink' keyword is used to detect the sink elements or targets
++ of the autoplugging.
++ - other elements are considered intermediate elements and will be
++ inserted when possible.
++
++
++algorithm:
++
++- Autoplugging starts from a source element, it will be added to the real bin.
++- for all unconnected pads:
++ - if pad has NULL padtemplate caps add typefind + autoplugcache to the pad
++- if unconnected pad has fixed caps, find element in repository that can
++ connect.
++ - first check elements added to the bin
++ - test elements ordered by rank
++ - favour 'Demux' type elements close to sources, 'Decoder' elements after
++ that and 'Filter' elements close to sinks.
++- link dummy element with pads with non-fixed caps. The dummy element getcaps
++ function will use the repository to return a list of compatible caps, so that
++ the element can choose freely. The dummy element is replaced with a real
++ element when caps become fixed.
++- all new_pad signals and caps notifications trigger the above actions.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/capsnego2 gstreamer-0.10.23/docs/random/wtay/capsnego2
+--- gstreamer-0.10.23.orig/docs/random/wtay/capsnego2 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/capsnego2 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,227 @@
++
++the current capsnegotiation sucks and plainly doesn't work for queues.
++one of the reasons is that the core is trying to do too much, like
++being a mediator in the negotiation process. There is also way too much
++interaction between plugins. Plugins have to keep a lot of state too.
++
++The proposed method works by sending chains of caps instead, requiring
++a worst case of 2 interactions between plugins. The drawback is that
++a negotiating plugin has to do a bit more work, but in pactice this is
++not a real argument against the proposed method, as the actions it has
++to perform cannot be avoided. We will provide sufficient APIs to
++facilitate this.
++
++We are not going to send random chains of caps between plugins but we
++are going to filter them by using a new gst_caps_intersect() function
++that can find the common media types and properties between the plugins.
++The main idea is that the simple case should remain simple.
++
++We also introduce app specific filters that can be set while doing a
++pad connection.
++
++We proceed with a few use cases because they tend to explain the ideas
++better.
++
++
++use case 1
++----------
++
++v4lsrc -> xvideosink
++
++no pad restrictions set on pad_connect
++v4lsrc can do many formats, so can xvideosink
++
++- v4lsrc request caps:
++
++ width and height properties were set on v4lsrc so it provides them as hints.
++
++ GstCaps *peercaps = gst_pad_request_caps (v4lsrc->srcpad,
++ GST_CAPS_NEW (
++ "v4lsrc_srccaps",
++ "video/raw",
++ "width", GST_PROPS_INT (352),
++ "height", GST_PROPS_INT (288)));
++
++- core fetches xvideosink caps. if xvideosink has a request_caps function,
++ then the intersection of the hint, v4lsrcpad template caps and xvideosink
++ sinkpad template are sent as input.
++ If xvideosink has no request_caps function, the padtemplate
++ caps of xvideosink are taken.
++- after intersect on both caps, peercaps equals:
++
++ peercaps ==
++ gst_caps_chain (
++ GST_CAPS_NEW (
++ "xvideosink_caps",
++ "video/raw",
++ "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("YV12")),
++ "width", GST_PROPS_INT (352),
++ "height", GST_PROPS_INT (288)
++ ),
++ GST_CAPS_NEW (
++ "xvideosink_caps",
++ "video/raw",
++ "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("I420")),
++ "width", GST_PROPS_INT (352),
++ "height", GST_PROPS_INT (288)
++ ),
++ GST_CAPS_NEW (
++ "xvideosink_caps",
++ "video/raw",
++ "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("YUY2")),
++ "width", GST_PROPS_INT (352),
++ "height", GST_PROPS_INT (288)
++ ),
++ GST_CAPS_NEW (
++ "xvideosink_caps",
++ "video/raw",
++ "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("UYVY")),
++ "width", GST_PROPS_INT (352),
++ "height", GST_PROPS_INT (288)
++ ),
++ GST_CAPS_NEW (
++ "xvideosink_caps",
++ "video/raw",
++ "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("RGB ")),
++ "bpp", GST_PROPS_INT (16),
++ "depth", GST_PROPS_INT (16),
++ "endianness", GST_PROPS_INT (G_BYTE_ORDER),
++ "red_mask", GST_PROPS_INT (0xf800),
++ "green_mask", GST_PROPS_INT (0x07e0),
++ "blue_mask", GST_PROPS_INT (0x001f),
++ "width", GST_PROPS_INT (352),
++ "height", GST_PROPS_INT (288)
++ )
++ )
++
++- v4lsrc does:
++
++ while (peercaps) {
++ /* check if the caps can be used */
++ if (caps_are_useful (peercaps)) {
++ break;
++ }
++ ...
++
++ peercaps = gst_caps_new (peercaps);
++ }
++
++ gst_pad_set_caps (v4lsrc->srcpad, peercaps);
++
++- core check compatibility with v4lsrc and xvideosink caps. if all goes well
++ caps are set on the pads.
++
++- negotiation was more effective if v4lsrc provided srcpad caps since maybe
++ YUY2 etc could be removed in the intersect (when v4lsrc doesn't support that
++ format).
++
++
++use case 2
++----------
++
++mpeg2dec -> colorspace -> xvideosink
++
++
++- mpeg2dec does:
++
++ gst_pad_set_caps (mpeg2dec->srcpad,
++ GST_CAPS_NEW (
++ "mpeg2dec_srccaps",
++ "video/raw",
++ "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("I420")),
++ "width", GST_PROPS_INT (720),
++ "height", GST_PROPS_INT (480)
++ )
++ );
++
++- core checks compatibility with mpeg2dec srcpad caps and colorspace caps.
++- newcaps function of colorspace is called.
++- colorspace requests peer pad caps with the hint.
++- xvideosink doesn't have a request_caps function, the hint is ignored and
++ the padtemplate caps are returned.
++- colorspace runs intersect on the two caps.
++- if the intersection is NULL, colorspace has to set up a conversion function.
++ - runs through the list of caps, picking the first one for which a
++ converter exists between the received caps and the target caps. set up
++ the converter and set the target caps on the srcpad.
++- if the intersection is not NULL, set received caps on colorspace srcpad.
++
++
++use case 3
++----------
++
++mpeg2dec -> queue -> colorspace -> queue -> xvideosink
++
++
++Same as use case 2, really. the queue just forwards the caps and the
++request caps.
++
++can we use a default implementation for this proxying? probably.
++for an element with no newcaps function or request_caps function, we can
++simply set the caps on all srcpads when a set_caps is performed, or we
++can request and intersect all srcpad caps when a peer element does
++request_caps. This will actually work for tee too, to some degree.
++
++
++use case 4
++----------
++
++gst_pad_connect_caps (...),
++gst_element_connect_caps (v4lsrc, "src", xvideosink, "sink",
++ GST_CAPS_NEW (
++ "app_caps",
++ "video/raw",
++ "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("I420")),
++ "width", GST_PROPS_INT (352),
++ "height", GST_PROPS_INT (288)
++ )
++ );
++
++- as long as the connection is not broken, the caps are set as a filter to the
++ to pads.
++
++- when v4lsrc requests pads, the intersection with the filter is also made.
++
++- v4lsrc has no other choice but to use I420.
++
++use case 5
++----------
++
++mad -> osssink
++
++in this case, mad can both send "int" audio samples and "float" samples.
++
++- mad request_caps from osssink, sending the fixed properties as hints (rate,
++ channels, ...)
++- osssink has a request_caps function, the core first makes the intersection
++ between the hint and mad srcpad template. the core then does the intersection
++ between osssink sinkpad template and sends this list to osssinks request_caps
++ function. osssink can try this list (or whatever remains of it) and whatever
++ works is sent back as the return value of the request_caps function.
++- mad receives the caps list, takes the top caps and does a pad_set_caps
++- osssink recieves the final caps on its new_caps function and configures the
++ oss driver.
++
++
++use case 6
++----------
++
++gsm -> audioscaler -> osssink
++
++Somebody sets some crazy low rate on the gsm srcpad (1000Hz).
++
++- audioscalers newcaps function is called.
++- audioscaler does a request_caps on its srcpad with the provided
++ caps as a hint.
++- osssink tries the caps in the request_caps function (by opening the
++ device, seeing that it doesn't support this rate at all...)
++- osssink tries to comply as closely with the rate and sends the
++ intersection between its padtemplate caps and the findings (rate 8000Hz
++ is possible).
++- audioscaler does the intersection between the caps list and the hint.
++- intersection == NULL, a converter is needed between the hint and
++ the first caps of the request_caps list.
++- intersection != NULL, set those caps (== the hint).
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/capsnego2-docs gstreamer-0.10.23/docs/random/wtay/capsnego2-docs
+--- gstreamer-0.10.23.orig/docs/random/wtay/capsnego2-docs 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/capsnego2-docs 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,321 @@
++purpose
++-------
++
++GStreamer has a very flexible mechanism to describe media types using
++mime types and key/value pairs (GstCaps). The definition of media types
++is entirely done by the plugins which can set the media type to one or
++more of the plugins GstPads.
++
++Pads with the same mime type and 'compatible' properties are allowed to
++connect. It is possible that a pad can accept or produce many different
++media types.
++
++The purpose of caps negotiation is to provide a framework for plugins so
++that they can agree on a common media type for their pads.
++
++
++Capabilities (GstCaps)
++----------------------
++
++The core component in the caps negotiation system are GstCaps. They consist
++of:
++
++ - a name (ex. "my_audio_capabilities")
++ - a mime-type (ex. audio/raw, audio/mp3, ...)
++ - a list of key/value pairs (ex. channels=2, rate=44100, ...)
++
++The list of key/value pairs is maintained by the GstProps object.
++
++The GstProps object maintains a GList of GstPropsEntries. An entry has
++a key, which is always a string constant (internally converted to a GQuark)
++and a value, which can be one of the following:
++
++ - an integer constant (ex. 5)
++ - a float contant (ex. 1.0)
++ - a string constant (ex. "int")
++ - a boolean constant (ex. FALSE)
++ - a fourcc constant (ex. I420)
++ * fourcc codes are usually used to describe a video format
++
++In addition to these constant values, the following variable values are
++supported too:
++
++ - an integer range (ex. 0-200)
++ - a float range (ex. 1.0-3.0)
++ - a list of values (ex. 1, 2, 5).
++ * A List cannot contain another list and the
++ entries in the list should all have the
++ same type (int, float, string, fourcc). It is
++ allowed to mix integers/floats and
++ integer/float ranges in a list.
++
++A capability is usually described as follows:
++
++ GST_CAPS_NEW (
++ capability name ---> "my_audio_capabilities",
++ mime-type ---------> "audio/raw",
++ ( "format", GST_PROPS_STRING ("int"),
++ GstProps ---------> ( "channels", GST_PROPS_INT_RANGE (1, 2),
++ (list of entries) ( "rate", GST_PROPS_INT (44100)
++ )
++
++ (-----------) (--------------------------)
++ entry key entry value
++
++Two capabilities can be chained together to form a larger capability:
++
++ ( GST_CAPS_NEW (
++ ( "my_mp3_capability",
++ ( "audio/mp3",
++ one capability ----> ( NULL
++ created by chaining ( ),
++ two capabilities. ( GST_CAPS_NEW (
++ ( "my_vorbis_capability",
++ ( "audio/vorbis",
++ ( NULL
++ ( )
++
++Capabilities always work as constraints, this means that they constrain the
++media type to the given mime-type and properties. By this definition a NULL
++GstCaps or a NULL GstProps means: no constraints.
++
++
++Variable capabilities vs. fixed capabilities
++--------------------------------------------
++
++Definition:
++
++ A GstProps structure is said to be fixed if it doesn't contain lists or
++ ranges, otherwise it is a variable GstProps. A variable GstProps, by definitin
++ does not constrain the media type to a set of fixed properties.
++
++ A GstCaps is said to be fixed if it is not chained and it doesn't contain
++ a variable GstProps component.
++
++
++GstCaps compatibility
++---------------------
++
++<write me>
++
++GstCaps intersection
++--------------------
++
++<write me>
++
++
++GstCaps usage
++-------------
++
++GstCaps are used in the following data structures:
++
++ - padtemplates.
++ * padtemplates are added to elementfactory to describe the possible
++ pads that an element created from said factory can have.
++ * padtemplates contain the name, direction and presence of the pads.
++ * padtemplates also describe the media types that this element can
++ accept/produce using GstCaps.
++ * padtemplates can provide fixed or variable GstCaps for the pads.
++ * padtemplates can be used by the element to create its pads and is
++ highly recommended.
++ * the padtemplate GstCaps are saved into the registry so that the
++ media types an element can operate on, are known without having to
++ bring the element into memory.
++
++ - pad caps
++ * pad caps are _fixed_ caps attached to a pad to describe the exact media
++ type this pad is handling. A pad with caps is said to be a "tainted" pad.
++
++ - connection filters
++ * a connection filter is created when two pads are connected. It describes
++ the media type(s) that _can_ flow through this connection.
++
++ - application connection filters
++ * When the application connects two pads, it can specify an application
++ connection filter that will act as additional constraints on the media types
++ that can flow through the connection.
++
++Connection filters and application filters are cleared when two connected pads
++are disconnected. Pad caps are not cleared. Padtemplates are immutable and
++never cleared.
++
++
++The GstPad get_caps function
++----------------------------
++
++the gst_pad_get_caps function returns the caps of a given pad. The pad caps are
++calculated as:
++
++ - if the pad has pad caps, return those
++ - else if the pad has a getcaps function, call the function and return the result
++ - else if the pad has a padtemplate, return the padtemplate caps
++ - else return NULL
++
++
++Purpose of caps negotiation
++---------------------------
++
++The purpose of the caps negotiation procedure is to set "pad caps" on a pad
++so that it is compatible with the "connection filter". This has to be done
++_before_ any data passing happens through the connection. Data passing between two
++pads is _not_ allowed when the pad caps are not compatible with the connection
++filter or when the pad caps of two pads participating in the connection are not
++equal.
++
++Real caps negotiation starts as soon as an element is in the READY state or higher.
++This means that the connect functions of the pads are only called when the element
++is at least READY. The intersection between two pads is made at connect time,
++regardless of element state.
++
++
++GstPad connection
++-----------------
++
++When two pads are connected get_caps is called on both pads to get their caps.
++Then the intersection between those caps is made, this will give us all the
++possible media types that can flow through this pad connection. Optionally the
++application can provide additional caps, the pad intersection is also made with
++the application caps.
++
++The intersection and the optional application caps are stored in the two pads.
++
++If the intersection is NULL, the two pads have no common types and the connection
++is refused.
++
++If the intersection is a fixed caps, this means there is only one possible media type
++that can be used for this connection.
++
++For all not NULL intersections the pad connect functions are called with the
++intersection. Depending on the result of the connect funtion the connection is
++allowed or refused.
++
++If the intersection is fixed and the pad connect functions agreed to the caps,
++the caps are set on the pads.
++
++Note that pad caps are never set for non fixed caps.
++
++!Example 1:
++!
++! 1. before connecting the pads, they both have a set of possible media types,
++! on the pad, through the getcaps function or on the padtemplate (here
++! represented with capital letters)
++!
++! srcpad sinkpad
++! A B
++! B F
++! C A
++! G
++!
++! 2. when performing the connection, the intersection between the two sets of caps
++! is made.
++!
++! srcpad sinkpad
++! A ) ( B
++! B )--------> A <------( F
++! C ) B ( A
++! ( G
++!
++! 3. In this case the intersection is not a fixed caps (it's a chained caps).
++! the connect function of the two pads are called (if any), the connect
++! function can accept of refuse the caps.
++!
++! 4. if the caps are accepted, the intersection caps are set on both pads.
++!
++! 5. plugins will typically not configure themselves if they get variable caps.
++! It is possible though for a plugin to select one of the caps, fixate
++! some properties and refine the filter to fixed caps (see later)
++!
++
++
++!Example 2:
++!
++! 1. we take two pads that intersect to fixed caps (B):
++!
++! srcpad sinkpad
++! A ) ( B
++! B )-------> B <-------( F
++!
++! 2. both pad connect functions are called.
++!
++! 3. assuming the connect functions did not refuse the connection, the caps
++! are set on both pads (because they are fixed).
++!
++! srcpad (B)--------------(B) sinkpad
++! A B
++! B F
++!
++
++!Example 3:
++!
++! 1. we take two pads, one with pad caps, another one with a padtemplate.
++!
++! srcpad (B) sinkpad
++! ! ( B
++! ------> B <-------( F
++!
++! 2. the pad get_caps function will return the pad caps of the srcpad and
++! the padtemplate caps of the sinkpad. The intersection is made, yielding
++! a fixed caps (B) which is sent to both connect functions (if any)
++!
++! 3. If the connect function(s) didn't refuse the connection the fixed caps
++! are set on both pads. The intersection is also kept in the pad object.
++!
++! srcpad (B)--------------(B) sinkpad
++! B
++! F
++!
++! 4. when fixed caps are received on the sinkpad the plugin will typically
++! configure itself to deal with the format.
++!
++
++
++Pad connect functions
++---------------------
++
++A Pad can be notified when another pad is connected or reconnected to it with
++fixed or variable caps. This notification will be done with the optional
++GstPadConnectFunction callback that an element can provide for a pad.
++Remember that this connection is _always_ called, not only whith fixed caps
++but also with variable caps (if any).
++
++We will explain some of the common situations with some examples.
++
++!Example 4:
++!
++! 1. We have a simple mpeg audio decoder connected to a simple audio sink.
++! The mpeg decoder doesn't have a connect function on
++!
++!
++!
++!
++!
++!
++!
++!
++!
++!
++!
++!
++!
++!
++!
++!
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/capsnego3 gstreamer-0.10.23/docs/random/wtay/capsnego3
+--- gstreamer-0.10.23.orig/docs/random/wtay/capsnego3 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/capsnego3 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,48 @@
++Capsnego patterns
++-----------------
++
++
++
++
++src negotiation recovery
++------------------------
++
++common pipelines like
++
++ filesrc -> mad -> osssink
++
++perform negotiation strictly left to right. At some point during
++iterate, mad will know the caps of the media stream and will need
++to inform osssink of this before pushing out a buffer.
++mad only has one set of fixed caps.
++
++1) try_set_caps
++
++ mad does a try_set_caps with the caps if all goes well, osssink
++ accepts and negotiation succeeds.
++
++ if the try_set_caps function fails, the application should have
++ a change to recover.
++
++ - mad therefore calls gst_pad_caps_error_try_recover, this will
++ emit a signal on the pad that the app can catch. One of the
++ signal arguments will contain a list of possible caps.
++
++ - the app can use the allowed caps to find another element that
++ is compatible with the caps and the peer element caps.
++
++ - the app will connect the new element with mad, negotiation
++ will happen again, the link will fail or succeed, if it fails,
++ thr app knows because the link function returns FALSE.
++
++ - if the link succeeds, pad caps are set and the try_recover
++ function returns TRUE, mad then knows the issue was resolved
++ and can continue. It will have received the final caps in its
++ srclink function.
++
++ - if no signal handler is connected to the caps_nego_failure signal
++ the issue will remain unresolved and a big debug warning is
++ printed on the console to debug the issue. mad will get a
++ return value of FALSE and may stop.
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/capsnego-cases gstreamer-0.10.23/docs/random/wtay/capsnego-cases
+--- gstreamer-0.10.23.orig/docs/random/wtay/capsnego-cases 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/capsnego-cases 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,349 @@
++OUTDATED
++--------
++
++
++pad has caps
++| pad has template
++|/ pad has negotiate function
++||/
++--- -> ---
++
++always compatible
++
++--+ -> ---
++
++call negotiate function, set the resulting caps
++
++-+- -> ---
++
++always compatible
++
++-++ -> ---
++
++call negotiate function, set the resulting caps
++
+++-- -> ---
++
++always compatible, caps are those of the pad
++
+++-+ -> ---
++
++always compatible, caps are those of the pad
++
++++- -> ---
++
++always compatible, caps are those of the pad
++
+++++ -> ---
++
++always compatible, caps are those of the pad
++
++=====================================
++pad has caps
++| pad has template
++|/ pad has negotiate function
++||/
++
++--- -> --+
++
++call negotiate function, set the resulting caps
++
++--+ -> --+
++
++negotiate until agreed
++
++-+- -> --+
++
++call negotiate until caps match padtemplate
++
++-++ -> --+
++
++negotiate until agreed, caps only got send to the
++other pad if they match the padtemplate
++
+++-- -> --+
++
++call negotiate function with src caps, set caps if ok
++
+++-+ -> --+
++
++call negotiate function with src caps, negotiate until agreed
++
++++- -> --+
++
++call negotiate function with src caps, set caps if ok
++
+++++ -> --+
++
++call negotiate function with src caps, negotiate until agreed
++
++=====================================
++pad has caps
++| pad has template
++|/ pad has negotiate function
++||/
++
++--- -> -+-
++
++always compatible
++
++--+ -> -+-
++
++call negotiate until caps match padtemplate
++
++-+- -> -+-
++
++check padtemplates, if compatible connect
++
++-++ -> -+-
++
++check templates, if compatible,
++call negotiate, until it matches the padtemplate
++
+++-- -> -+-
++
++check caps against padtemplate, if compatible, connect
++
+++-+ -> -+-
++
++check caps against padtemplate, if compatible: connect
++alse call negotiate until it matches template
++
++++- -> -+-
++
++check caps against padtemplate, if match, connect
++
+++++ -> -+-
++
++check caps against padtemplate, if match, connect
++alse check padtemplates if compatible,
++call negotiate until match template
++
++
++=====================================
++
++pad has caps
++| pad has template
++|/ pad has negotiate function
++||/
++
++--- -> -++
++
++call negotiate, set resulting caps
++
++--+ -> -++
++
++call negotiate until agree, check src caps against
++padtemplate before calling sink negotiate
++
++-+- -> -++
++
++check padtemplates, if match call negotiate until
++match src padtemplate.
++
++-++ -> -++
++
++check padtemplates, if match call negotiate until
++agree
++
+++-- -> -++
++
++check caps against padtemplate
++call negotiate with caps, if agree, set caps
++
+++-+ -> -++
++
++check caps against padtemplate
++call negotiate with caps, negotiate until agree
++
++++- -> -++
++
++check caps against padtemplate
++call negotiate with caps, call negotiate until
++sink caps match src padtemplate
++
+++++ -> -++
++
++check caps against padtemplate
++call negotiate with caps, negotiate until agree
++
++
++=====================================
++
++
++pad has caps
++| pad has template
++|/ pad has negotiate function
++||/
++
++--- -> +--
++
++connection fails
++
++--+ -> +--
++
++
++
++-+- -> +--
++
++
++-++ -> +--
++
++
+++-- -> +--
++
++
+++-+ -> +--
++
++
++++- -> +--
++
++
+++++ -> +--
++
++check caps,
++call src negotiate with caps
++
++
++=====================================
++
++pad has caps
++| pad has template
++|/ pad has negotiate function
++||/
++
++--- -> +-+
++
++
++--+ -> +-+
++
++
++-+- -> +-+
++
++
++-++ -> +-+
++
++
+++-- -> +-+
++
++
+++-+ -> +-+
++
++
++++- -> +-+
++
++
+++++ -> +-+
++
++
++=====================================
++
++pad has caps
++| pad has template
++|/ pad has negotiate function
++||/
++
++--- -> ++-
++
++
++--+ -> ++-
++
++
++-+- -> ++-
++
++
++-++ -> ++-
++
++
+++-- -> ++-
++
++
+++-+ -> ++-
++
++
++++- -> ++-
++
++
+++++ -> ++-
++
++
++=====================================
++
++pad has caps
++| pad has template
++|/ pad has negotiate function
++||/
++
++--- -> +++
++
++
++--+ -> +++
++
++
++-+- -> +++
++
++
++-++ -> +++
++
++
+++-- -> +++
++
++
+++-+ -> +++
++
++
++++- -> +++
++
++
+++++ -> +++
++
++
++=====================================
++
++ srccaps = GST_PAD_CAPS (srcpad);
++ srctempl = FALSE;
++
++ do {
++
++ //no caps, get one
++ if (!srccaps)
++ {
++ if (srcpad->negotiatefunc && !srctempl)
++ {
++ srccaps = srcpad->negotiatefunc (srpad, srcaps, counter);
++ srctempl = FALSE;
++ }
++ else
++ {
++ srccaps = gst_pad_get_caps (srcpad);
++ srctempl = TRUE;
++ }
++ }
++
++ /* check against other pad */
++
++ // the other pad doesn't want to negotiate
++ if (!sinkpad->negotiatefunc)
++ {
++ sinkcaps = gst_pad_get_caps (sinkpad);
++
++ if (!sinkcaps)
++ break;
++
++ if (gst_caps_check_compatibility (srccaps, sinkcaps))
++ {
++ // cool
++ break;
++ }
++ }
++ else {
++ switch pads;
++ }
++
++ } while (counter < 100);
++
++
++
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/caps-negociation gstreamer-0.10.23/docs/random/wtay/caps-negociation
+--- gstreamer-0.10.23.orig/docs/random/wtay/caps-negociation 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/caps-negociation 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,349 @@
++OUTDATED
++--------
++
++
++caps negotiation
++================
++
++1) purpose
++----------
++
++The pads expose the media types they can handle using a mime
++type and a set of properties. Before the pad is created or
++used to pass buffers, we only know the global 'range' of media
++data this pad can accept. When the element has had a chance to
++look at the media data, only then it knows the exact values of the
++properties.
++
++example1:
++!
++! The mp3 decoder exposes the capabilities of its src pad
++! with the following caps:
++!
++! 'mpg123_src':
++! MIME type: 'audio/raw':
++! format: Integer: 16
++! depth: Integer: 16
++! rate: Integer range: 11025 - 48000
++! channels: Integer range: 1 - 2
++
++as you can see in example1, the padtemplate has both a range
++(for the audio rate) and a list (for the number of channels)
++for its properties.
++
++only when the mpg123 element has decoded the first mpeg audio
++header, it knows the exact values of the rate and channels
++properties.
++
++suppose that we want to connect this src pad to the sink pad
++of an audiosink with the properties given in example2:
++
++example2:
++!
++! 'audiosink_sink':
++! MIME type: 'audio/raw':
++! format: Integer: 16
++! depth: List:
++! Integer: 8
++! Integer: 16
++! rate: Integer range: 8000 - 44000
++! channels: Integer range: 1 - 2
++
++we can see that connecting the mpg123 src pad with the
++audiosinks sink pad can cause a potential problem with the
++rate property.
++
++When the mpg123 decoder decides to output raw audio with a
++48000Hz samplerate, the audiosink will not be able to handle
++it. The conservative approach would be to disallow the connection
++between the two incompatible pads. This rules out any potential
++problems but severely limits the amount of possible connections
++between the elements.
++
++Another approach would be to allow the connection (and mark it
++as dangerous) and let the two elements figure out a suitable
++media type at runtime. This procedure is called caps negotiation.
++
++
++2) a bit of history
++-------------------
++
++The typing of the data that was attached to a buffer used to be
++done using GstMeta* (and it still is as of 11 feb 2001). With
++the new GstCaps and GstProps system this typing is gradually moved
++to the pads and to the padtemplates. This has several advantages:
++
++ - the typing of the data tends to be static. The type of media
++ doesn't change for every buffer.
++
++ - Moving the typing up to the pad(templates) allows us to save
++ them into the registry and allows us to figure out what pads
++ are compatible.
++
++ - the current metadata implementation needs header files. this may
++ change when we also use properties for metadata.
++
++example3:
++!
++! This is the current GstMeta structure that travels with audio buffers
++!
++! struct _MetaAudioRaw {
++! GstMeta meta;
++!
++! /* formatting information */
++! gint format;
++! gint channels;
++! gint frequency;
++! gint bps;
++! };
++
++
++The question still remains what purpose the metadata will serve
++now that we expose the media type in the pads. Some possibilities:
++
++ - interesting information, not describing the data itself but the
++ context in which the data was generated (suggested buffer size,
++ timestamps, etc...)
++
++ - user app metadata.
++
++In this proposal we also assume that the current use of metadata using
++GstMeta is deprecated and that we move this information to the properties
++of the pads.
++
++
++3) the pad/padtemplates caps
++----------------------------
++
++All elements have to provide a padtemplate for their pads.
++
++The padtemplates provide a range of possible media types this pad can
++src/sink. the main purpose for the padtemplates is to allow a
++rough guess at which pads are compatible before even a single buffer
++has been processed by the element.
++
++pads are usually created from the templates. When the pad is created
++it has no GstCaps* attached to it yet. The possible caps this pad
++can have is exposed in the padtemplate. The caps are filled in by
++the element when it knows the values for the caps.
++
++
++4) the connect function
++-----------------------
++
++when two pads are connected the following steps will take
++place (not sure, FIXME):
++
++ - if both pads have caps, the caps are checked. If the caps
++ are incompatible, the padtemplates are checked, if they
++ are compatible, caps negotiation is performed.
++
++ - if one of the pads has caps, the caps is checked against
++ the padtemplate of the peer pad. If they are incompatible,
++ the padtemplates are compared, if they are incompatible,
++ caps negotiation is performed.
++
++ - if none of the pads have caps, the padtemplates are checked,
++ if they are incompatible, a warning is issued.
++
++
++5) when the element knows the media type it is handling
++-------------------------------------------------------
++
++When the element has received its first buffer it will know
++the media type it is handling by inspecting the buffer.
++
++before pushing the data out to its peer element(s), the element
++will set its src pad with the appropriate caps and properties.
++These caps must follow the following rules:
++
++ - the caps must be compatible with the padtemplates of this
++ pad.
++
++ - the caps cannot contain ranges or lists.
++
++when the element wants to change the caps of a pad, it has to
++perform gst_pad_renegotiate (GstPad *pad). this will trigger
++the caps negotiation procedure.
++
++this will trigger the class method of the pad and calls the pads
++gst_pad_negotiate function:
++
++ GstCaps *gst_pad_negotiate (GstPad *pad, GstCaps *caps, guint count);
++
++This function takes a GstCaps *structure as an argument (typically the
++current caps of the pad) and a negotiation counter. this counter can be
++used to keep track of the negotiation process.
++
++The pad then creates a new caps structure with the desired caps.
++If the caps are accepted, it just returns the provided input caps. the
++_renegotiate function will set the caps of both pads whenever the
++input caps are the same (pointer wise) as the input caps.
++
++the caps structure is checked against the padtemplate of the peer pad,
++if it is incompatible the gst_pad_negotiate function is called again
++and the element is supposed to create another caps structure.
++
++the gst_pad_renegotiate function then calls the gst_pad_negotiate
++function of the peer pad with the new caps as the argument. The peer
++pad can adjust or create a new caps if it doesn't accept it.
++
++the caps structure keeps on bouncing between the two pads until one
++of the pads negotiation functions returns the caps unmodified.
++
++The element can also return a NULL pointer if it has run out of
++options for the caps structure. When this happens, both pads are set
++the the NULL caps again and the pad connnection is broken.
++
++The negotiation process is stopped after a fixed number of tries,
++when the counter has reached some limit. This limit is typically
++checked by the pads negotiate function.
++
++
++6) caps negotiation function
++----------------------------
++
++the negotiate function of a pad is called whenever the pad or
++peer pad has performed _renegotiate.
++
++example5:
++!
++! this is the caps negotiation function implemented by an element on
++! one of its sink pads.
++!
++! static GstCaps*
++! gst_pad_negotiate (GstPad *pad, GstCaps *caps, guint counter)
++! {
++! /* we don't accept anything else than audio/raw */
++! if (strcmp (gst_caps_get_mime (caps), "audio/raw"))
++! return NULL;
++!
++! if (gst_caps_get_int_prop (caps, "format") != AFMT_S16_LE)
++! return NULL;
++!
++! /* we accept everything else */
++! return caps;
++! }
++
++When the negotiate function returns NULL (it does not accept the
++specified caps of the peer pad), the negotiation process is stopped.
++
++
++
++APPENDIX A: use cases
++=====================
++
++1) mpg123 src!sink audiosink
++----------------------------
++
++When the pads are connected the padtemplates are checked and it
++turns out that the pads might be incompatible (mpg123 can do
++48000Hz while audiosink can do 44000Hz). Nothing happens at
++connect time except for the user app that can mark this connection
++as possibly dangerous and keep some spare elements ready for when
++the pads turn out to be incompatible.
++
++both elements start out with no caps at all (NULL). mpg123 wants
++to output a buffer with specific properties. It calls
++gst_pad_renegotiate (mpg123->srcpad).
++
++The _renegotiate functions calls the negotiate function of the
++mpg123->srcpad. the negotiate function would look like this:
++
++
++/*
++ * The mpg123 element cannot convert the decoded type into something
++ * else so it has to force the caps of the src pad into the specific
++ * type as defined by the mp3.
++ */
++static GstCaps*
++gst_mpeg123_src_negotiate (GstPad *pad, GstCaps *caps, guint counter)
++{
++ GstMpg123 *mpg123;
++
++ mpg123 = GST_MPG123 (gst_pad_get_parent (pad));
++
++ /* we got caps in, check them */
++ if (caps != NULL) {
++ if (!strcmp (gst_caps_get_mime (caps), "audio/raw") &&
++ (gst_caps_get_int_prop (caps, "format") == AFMT_S16_LE) &&
++ (gst_caps_get_int_prop (caps, "depth") == 16) &&
++ (gst_caps_get_int_prop (caps, "rate") == mpg123->rate) &&
++ (gst_caps_get_int_prop (caps, "channels") == mpg123->channels)) {
++ return caps;
++ }
++ }
++ /* we didn't get caps, so we decide */
++ else if (counter != 2) {
++ GstCaps *new;
++
++ /* fill in our desired caps */
++ new = gst_caps_new_with_props (
++ "src_caps", /* name */
++ "audio/raw", /* mime */
++ gst_props_new (
++ "format", GST_PROPS_INT (AFMT_S16_LE),
++ "depth", GST_PROPS_INT (16),
++ "rate", GST_PROPS_INT (mpg123->rate),
++ "channels", GST_PROPS_INT (mpg123->channels),
++ NULL
++ )
++ );
++ return caps;
++ }
++ /* too many attempts at nogotiation, bail out */
++ return NULL;
++}
++
++
++The audiosink pad negotiate function would look like this:
++
++/*
++ * The audiosink has a wide range of possible parameters for
++ * its sink pad, based on the audio card capabilities and
++ * possibly the element configuration.
++ * we assume the audiosink element can be both the initiator of
++ * the negotiations and the negotiated one.
++ */
++static GstCaps*
++gst_audiosink_sink_negotiate (GstPad *pad, GstCaps *caps, guint counter)
++{
++ GstAudiosink *audiosink;
++ gboolean accepted = TRUE;
++
++ audiosink = GST_AUDIOSINK (gst_pad_get_parent (pad));
++
++ /* we got caps in, we know they will match the padtemplate */
++ if (caps != NULL) {
++ return caps;
++ }
++ /* we didn't get caps, so we decide */
++ else if (counter != 2) {
++ GstCaps *new;
++
++ /* fill in our desired caps */
++ new = gst_caps_new_with_props (
++ "sink_caps", /* name */
++ "audio/raw", /* mime */
++ gst_props_new (
++ "format", GST_PROPS_INT (audiosink->format),
++ "depth", GST_PROPS_INT (audiosink->depth),
++ "rate", GST_PROPS_INT (audiosink->rate),
++ "channels", GST_PROPS_INT (audiosink->channels),
++ NULL
++ )
++ );
++ return caps;
++ }
++ /* too many attempts at nogotiation, bail out */
++ return NULL;
++}
++
++
++
++
++
++
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/clocking gstreamer-0.10.23/docs/random/wtay/clocking
+--- gstreamer-0.10.23.orig/docs/random/wtay/clocking 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/clocking 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,200 @@
++purpose
++-------
++
++A proposal for proper syncing and clocking of a pipeline.
++
++Requirements
++------------
++
++ - elements should be able to get the time and wait for a specific
++ time
++ - some elements should be able to control and adjust the clock.
++ (clock master)
++ - the application should be able to provide another clock.
++
++Clocks
++------
++
++A clock extends the abstract GstClock class.
++
++gst_clock_get_time should always report an equal or increasing
++value with each succesive call.
++
++
++
++Clock providers
++---------------
++
++Clock providers call gst_element_provides_clock (element, clock)
++in their _init function. This will set some element flags.
++This also means that a clock provider cannot stop being a clock
++provider.
++
++Clock providers will update the clock at specific intervals.
++get_resolution/set_resolution can be used to control the resolution.
++
++When a clock provider is not going to update the clock anymore
++it should make sure elements still blocked on the clock get
++unblocked at the right time. This can be done by converting all
++blocking waits to a select call. All further waits on the clock
++should be estimated (using gettimeofday for example)
++
++
++Clock receivers
++---------------
++
++An element needing a clock must implement the element receive_clock method.
++It has to use the clock received in this function or if the
++clock == NULL it should not do any waiting at all.
++
++
++Clocks and the scheduler
++------------------------
++
++The scheduler knows about the clocks, else a clock provider and receiver
++in the same scheduler could cause a deadlock.
++
++Only one clock provider is allowed per scheduler. multiple clock
++receivers are allowed per scheduler.
++
++
++
++Specifying clocks
++-----------------
++
++on every bin with a scheduler, gst_bin_use_clock (bin, clock) can be used
++to force the use of this specific clock for all the elements in this bin.
++
++gst_bin_use_clock (bin, NULL) to disable all clocking for this bin.
++
++gst_bin_auto_clock (bin) to use the default algorithm to find a clock.
++
++bins that get a use clock set a flag and store the clock, they also call
++set_clock on all of their children. When other children are added, they
++all get the stored clock.
++
++
++Clock distribution
++------------------
++
++clock providers and receivers are collected in the bins on element
++add/remove, recursing bins if needed.
++
++the toplevel bin with a scheduler selects the global clock and calls
++set_clock on itself. This happens in the NULL->READY state.
++
++bins dispatch the set_clock to to all of the reveivers. Bins with
++a scheduler and another use_clock do nothing.
++
++Bins with a scheduler also notify the scheduler of the clock.
++
++
++Clock usage
++-----------
++
++when an element wants to wait for a specific time, if calls
++gst_element_clock_wait (elements, clock, time). The call is dispatched
++to the scheduler of the element which can use the owner field
++of the clock to check if the elements are in the same scheduler.
++
++For elements waiting for a clock provided by an element in another
++scheduler there is no problem.
++
++When provider and receiver are in the same scheduler, a deadlock can
++occur since the scheduler will block on the wait without being able to
++schedule the provider again to update the clock.
++
++A solution would be to call the async notify of the clock and schedule
++some other element (the provider?). We probably need an event based
++scheduler for this. When the async event arrives we can reschedule
++the receiver and continue.
++
++The current scheduler will assert on this condition for now.
++
++
++Changing clocks
++---------------
++
++The clock can only be changed when the bin is in the PAUSED state.
++
++
++State Changes
++-------------
++
++When the pipeline is PAUSED, the clock is stopped with
++gst_clock_enable (clock, FALSE). The clock should unblock all
++waiting elements ASAP and return GST_CLOCK_STOP in the wait.
++
++Elements waiting for a clock and receiving the STOP should
++process the last buffer ASAP and break out of their loop.
++
++When the pipeline is brought to the READY state, the clock is
++set to 0.
++
++When the clock is enabled again, it should start counting from where
++it was last disabled.
++
++NULL->READY : distribute clock, clock_reset,
++READY->PAUSED : clock_activate (FALSE)
++PAUSED->PLAYING : clock_activate (TRUE)
++PLAYING->PAUSED : clock_activate (FALSE);
++PAUSED->READY : clock_reset
++READY->NULL : delete clock;
++
++
++automatic Clock selection
++-------------------------
++
++Select a random clock from the Src elements.
++if no Src elements exist with a clock, select a random clock from the
++Sink elements.
++else use a default System Clock.
++
++Src elements with a clock are prefered because they usualy provide
++live audio/video.
++
++Issues
++------
++
++ossrc ! osssink can cause clock drift if osssink doesn't process the bytes
++at the same rate osssrc provides them (different hardware). Things will
++stutter and cracle if this is the case. QoS and a resampler could solve
++this.
++
++
++Use Cases
++---------
++ -- queue ! mpeg2dec ! videosink
++ /
++filesrc ! mpegdemux
++ \
++ -- queue ! mad ! osssink
++
++
++videosink is a receiver
++osssink is a provider
++
++osssink is selected as a clock provider since it is a Sink. The global
++pipeline distributes the clock to videosink and osssink.
++osssink sees that it receives its own clock.
++
++osssink uses the OSS ioctls to determine the number of bytes processed
++by the hardware. using the audio rate it can figure out the exact time
++and updates its clock with a resolution that matches the resolution
++as closely as possible.
++
++videosink blocks on the clock. with each update of the clock videosink
++is unblocked if the current time >= wait time and shows the frame.
++
++when osssink is PAUSED, the clock will not be updated anymore. osssink
++instructs its clock to convert all requests to select() calls.
++When it is set to PLAYING again, it resumes normal operation.
++
++
++
++
++
++
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/clocking2 gstreamer-0.10.23/docs/random/wtay/clocking2
+--- gstreamer-0.10.23.orig/docs/random/wtay/clocking2 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/clocking2 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,88 @@
++The clock
++---------
++
++The clock always returns reference time
++
++Element State change
++--------------------
++
++Each element receives the current clock reference time
++in the state change function.
++
++On PAUSED to PLAYING
++
++An element starts sending buffers with timestamp
++reftime + internal counter
++
++After a seek, the element sets internal counters to 0
++
++
++Bin state change
++----------------
++
++PAUSED to PLAYING
++
++bin propagates clock time to children
++
++
++Toplevel bin state change
++-------------------------
++
++PAUSED to PLAYING
++
++start time is set to ref time
++stream time is thus 0
++
++start time is sent to state change of children
++
++
++use case 1
++----------
++
++filesrc ! mad ! osssink
++
++pipeline PAUSED to PLAYING:
++
++start time = ref time
++
++filesrc state change gets starttime
++mad state change gets starttime
++osssink state change gets starttime
++
++mad sends buffers with timestamp starttime + internal counter
++osssink syncs these samples against the clock with starttime + timestamp
++
++PLAYING to PAUSED
++
++nothing happens
++
++use case 2
++----------
++
++ { filesrc ! mad ! queue } ! osssink
++
++let it play for a while
++PAUSE the thread
++PLAY the thread
++thread is not the toplevel bin, use same starttime as when
++it first started.
++do state change on elements with same starttime
++
++use case 3
++----------
++
++ filesrc ! mad ! mixer ! osssink
++
++ !
++ filesrc ! mad !-^
++
++
++
++
++
++
++
++
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/clocking3 gstreamer-0.10.23/docs/random/wtay/clocking3
+--- gstreamer-0.10.23.orig/docs/random/wtay/clocking3 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/clocking3 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,41 @@
++
++blocking wait
++-------------
++
++- allocate a new clock entry
++- add to list of pending sync waits
++- do {
++ wait on entry
++ } while (entry != restart)
++- free entry/remove from list
++
++async wait
++----------
++
++- if no thread, start thread
++- alloc a new clock entry
++- add to list of pending async waits
++- signal thread to restart timeouts
++
++async thread
++------------
++
++ while (true) {
++ if (no entry) wait for restart
++ do {
++ take first entry
++ wait on it
++ } while (entry != restart)
++ call entry signal function
++ free entry/remove from list
++ }
++
++clock adjust
++------------
++
++- loop over sync/async entries
++- restart all entries
++
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/CORBA gstreamer-0.10.23/docs/random/wtay/CORBA
+--- gstreamer-0.10.23.orig/docs/random/wtay/CORBA 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/CORBA 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,63 @@
++CORBA and bonobo ramblings
++==========================
++
++This is about something I know nothing about, so I want
++your views on the subject :)
++
++statements in this doc might contain plain nonsense and
++utter ignorance about the subject, so feel free to correct
++no matter how many brown paper bags I need to put over my
++head.
++
++
++CORBA
++-----
++
++The object request broker. It basically allows you to declare
++objects using a language called IDL. It has the nice benefit
++of allowing objects to live in other contexts, languages and
++even on other machines over the network.
++
++Wrapping the GStreamer objects in CORBA objects doesn't look
++like a problem. It will immediatly allow us to create objects
++accros the network and use the framework in a distributed
++environment.
++
++You will end up with a lot of corba objects using this method.
++Is this the way to do it? do we only need to CORBA-ify some
++of the core objects instead?
++
++I see a CORBA wrapper as something that exposes the API of
++GStreamer. If I want to do distributed media processing I would
++build up an app with corba calls. The point is that you use
++the lowlevel CORBA API to create a distributed media app.
++
++
++Bonobo
++------
++
++A component model build with CORBA. Bonobo has provisions for
++creating embedable objects. As I understand it, this means that
++it has something visible to embed. I know you can also use
++Bonobo without the GUI parts but why would we prefer Bonobo
++over CORBA to handle that?
++
++Bonobo has a framework to create toolbars, menus and other
++neat stuff. It also has a serialisation mechanism that allows
++you to, for example, merge a pipeline with a document in one
++single stream.
++
++I see bonobo as a high level service provider, you create a
++mediaplayer component that can be embeded into a document and
++stuff like that. The point here is that you use bonobo to
++create services out of user apps build with GStreamer.
++
++
++Comments?
++
++Wim
++
++
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/DVDplayer gstreamer-0.10.23/docs/random/wtay/DVDplayer
+--- gstreamer-0.10.23.orig/docs/random/wtay/DVDplayer 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/DVDplayer 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,41 @@
++A DVDplayer
++-----------
++
++1) set up a pipeline
++
++ <draw pipeline schematics here>
++
++2) set to playing
++
++ - dvdnav reads the ifo file. A set of events are generated to configure
++ various elements in the pipeline. These would include:
++ - SPU colors
++ - whatmore..
++
++ - first the src will read the DVD menu. this will contain mpeg2 data
++ and spu/nav info. after the menu is sent down the pipeline
++ the nav decoder waits for input somehow. The pipeline keeps on
++ playing to animate the menus.
++
++ - somehow a button is pressed on the menu: a method is triggered in
++ the dvdnav plugin to tell it button X was pressed (event? app?).
++
++ - dvdnav reacts and starts to stream other data.
++
++ - nav packets in the stream indicate what can happen next.
++ - update the menu
++ - keep the menu
++ - hide the menu
++ - show the menu
++
++ - pressing the hotkey to bring up the menu triggers a method in dvdnav
++ which will send down nav info downstream to bring up the menu.
++ A background picture (I frame) is sent downstream too.
++
++ - nav info can also happen while playing the movie. This can highlite
++ some buttons the user can press.
++
++ - selecting a button triggers some color/compositing changes in SPU/NAVdec
++ and an action on dvdnav.
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/eos-19012001 gstreamer-0.10.23/docs/random/wtay/eos-19012001
+--- gstreamer-0.10.23.orig/docs/random/wtay/eos-19012001 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/eos-19012001 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,113 @@
++OUTDATED
++--------
++
++EOS as implemented on Jan 21 2001:
++
++1) terminology
++--------------
++
++EOS: end of stream. The problem we are trying to solve here is
++ detecting when the processing of a piece of media data has
++ ended.
++
++ This problem can get complicated because the pipeline might
++ contain an arbitrary number of threads and other ASYNC and
++ DECOUPLED elements like queues. We are trying to solve the
++ obvious cases first by making some assumptions (see limitations)
++ in order to avoid the exponentially growing complexity.
++
++ The trick is to detect when all the elements/subbins/threads
++ and done processing their data. This involves monitoring the
++ threads and elements.
++
++ Catching the EOS signals from an element is easy. We are focusing
++ here on the EOS signal propagation to the manager bin up to the
++ toplevel bin.
++
++EOS call: the pads have a method gst_pad_set_eos () that will
++ be called by an element that cannot send any more data on the
++ pad.
++
++EOS signals: elements fires the EOS signal when all it's pads are in
++ EOS.
++
++chains: at plan generation, the bin will find the elements it has to
++ manage. The elements that are managed together are called a chain.
++ This is typically a set of elements that need input from their
++ peer element before they can output data. When one of those elements
++ cannot provide more data and goes into EOS, the other elements
++ are basically worthless and there is no point in trying to schedule
++ them anymore.
++
++ Chains are typically broken up on DECOUPLED elements. Those elements
++ have no clear relation between their input/output behaviour, like
++ the queue.
++
++EOS denial: An element can deny an EOS call by returning FALSE on the
++ overridden EOS call. This behaviour is typical for an element that
++ performs _get_region on its sinkpad and basically does not care
++ about the EOS because it knows it will pull a specific region
++ anyway.
++
++
++2) EOS implementation
++---------------------
++
++EOS is currently implemented by selectively disabling scheduling of
++the chains. This procedure continues untill a bin/thread has no more
++chains left to schedule, at which point it will fire the EOS signal.
++
++A gboolean was added to the chain structure to indicate if this chain
++need scheduling. Initially this will gboolean will be set to TRUE.
++
++the gst_bin_iterate_func will only schedule those chains that have
++their need_scheduling flag to TRUE.
++
++All elements are treated as potential EOS signal providers. When we add
++the elements to a chain, we attach the eos signal to them and hand
++the chain they were added to as an argument to the signal handler.
++When an element goes to EOS, we mark the chain as need_scheduling=FALSE.
++This removes the chain from the scheduling loop.
++
++Since plain bins in bins are flattened during the chain creation, we do
++not need to worry about the bin EOS.
++
++Other elements that do their own managing (like threads) are treated
++differently, they are added to a list of EOS-providers. Since they
++have their own chains and use the same iterate_func, they will eventually
++fire EOS on their own when they run out of schedulable chains.
++The EOS signal of the EOS providers is caught by the parent bin which
++will then remove the bin from the list of possible EOS providers.
++
++Combining the EOS providers list and the chains, the bin will fire
++and EOS signal when 1) it has no more chains to schedule, 2) all its
++EOS providers have signaled EOS.
++
++3) queue EOS handling
++---------------------
++
++The queue overrides the eos call and performs the following:
++
++Set the sinkpad to EOS and signal its internal g_cond to unlock any
++waiting threads on the srcpad.
++
++The scrpad _get function performs the EOS call when no more buffers
++are queued and the sinkpad is in EOS. This causes the EOS call to
++propagate downstream and effectively causes all chains and threads
++to become EOS.
++
++
++4) limitations
++--------------
++
++We assume a chain is a single schedualable entity. Rescheduling of
++the bins and chains are not performed.
++
++No provisions for changing the state of the elements in EOS, although
++this probably isn't hard to do.
++
++No provisions for undoing the EOS state. This is probably related to
++the state change, where a chain should become schedulable again when the
++element goes back to the PLAYING state.
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/eos2 gstreamer-0.10.23/docs/random/wtay/eos2
+--- gstreamer-0.10.23.orig/docs/random/wtay/eos2 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/eos2 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,150 @@
++OUTDATED
++--------
++
++
++case 1)
++
++(--------------------------------------------------)
++! bin !
++! (--------) (--------) (--------) !
++! ! fakesrc! !identity! !fakesink! !
++! ! src ----- sink src ---- sink ! !
++! (--------) (--------) (--------) !
++(--------------------------------------------------)
++
++.scheduling.
++
++ case1 has just one scheduled entity (chain) no problem here.
++
++.eos.
++
++ fakesrc detects the end of stream. It just returned the last buffer.
++ The next _pull will cause the srcpad to trigger gst_pad_set_eos ().
++ After that it will return a NULL buffer.
++
++ gst_pad_set_eos() will notify the parent about the plugins attempt to
++ signal eos. the parent adds the element to its possible EOS
++ providers.
++
++ gst_pad_set_eos() will by default propagate to identy and to fakesink.
++ none of these plugins override the default behaviour so gst_pad_set_eos
++ returns TRUE and fakesrc signals EOS with the value TRUE.
++
++ The parent looks in the list of EOS providers and finds the faksrc
++ element that is now signaling EOS. all EOS providers are now in EOS
++ and so the bin fires EOS.
++
++
++
++case 2)
++ (---------------)
++ !thread !
++ (--------) (--------) (--------) ! (--------)!
++ ! fakesrc! !identity! ! queue ! ! !fakesink!!
++ ! src ----- sink src ---- sink src ---- sink !!
++ (--------) (--------) (--------) ! (--------)!
++ (---------------)
++
++.scheduling.
++
++ case2 has two scheduled entities: fsr-i-q, q-fsk.
++
++.eos.
++
++ fakesrc detects the end of stream. It just returned the last buffer.
++ The next _pull will cause the srcpad to trigger gst_pad_set_eos ().
++ After that it will return a NULL buffer.
++
++ gst_pad_set_eos() will notify the parent about the plugins attempt to
++ signal eos. the parent adds the element to its possible EOS
++ providers.
++
++ gst_pad_eos() will by default propagate to identy and to queue.
++ queue overrides the eos handler and returns false on the eos
++ request. fakesrc signals EOS with a value of false and the parent
++ bin removes the EOS provider from its list.
++
++ after the queue has sent out the last buffer, its calls eos on its
++ src pad. queue is added to the top level bin as an eos provider and
++ the default eos handler signals EOS with a value of TRUE to the parent.
++
++ the parent sees that all the eos providers are in eos now and signals
++ EOS.
++
++
++case 3)
++ (---------------)
++ !thread !
++ (--------) (--------) (--------) ! (--------)!
++ ! fakesrc! ! tee ! ! queue1 ! ! !fakesink!!
++ ! src ----- sink src ---- sink src ---- sink !!
++ (--------) ! ! (--------) ! (--------)!
++ ! ! (---------------)
++ ! !
++ ! ! (---------------)
++ ! ! !thread !
++ ! ! (--------) ! (--------)!
++ ! ! ! queue2 ! ! !fakesink!!
++ ! src ---- sink src ---- sink !!
++ ! ! (--------) ! (--------)!
++ (--------) (---------------)
++
++
++ fakesrc detects the end of stream. It just sent the last buffer
++ and sets the srcpad to EOS with gst_pad_eos ().
++
++ the eos handler returns false because both queues return false on the
++ eos request. the parent removes fakesrc as an EOS provider.
++
++ queue1 and queue2 were responisble for the EOS delay and so they get
++ added to the bin as possible EOS providers.
++
++ after the queues have sent out their last buffer, they calls eos on their
++ src pads.
++ the parent allready has the two queues in the EOS provider list so they dont
++ get added twice.
++ the two queues perform gst_pad_eos () on their pads when the queue is empty,
++ the parent removes the EOS providers from its list, when the list is empty,
++ the parent fires EOS.
++
++
++case 4)
++
++ (---------------)
++ !thread !
++ (--------) (----------) (--------) ! (--------)!
++ ! fakesrc! !mpeg1parse! ! queue1 ! ! !fakesink!!
++ ! src -- sink src ---- sink src ---- sink !!
++ (--------) ! ! (--------) ! (--------)!
++ ! ! (---------------)
++ ! !
++ ! ! (---------------)
++ ! ! !thread !
++ ! ! (--------) ! (--------)!
++ ! ! ! queue2 ! ! !fakesink!!
++ ! src ---- sink src ---- sink !!
++ ! ! (--------) ! (--------)!
++ (----------) (---------------)
++
++
++ this case differs from case3 in that one of the queues can be empty
++ while the other isn't. we assume queue1 is empty while queue2 isn't yet.
++
++ fakesrc detects the end of stream. It just sent the last buffer
++ and sets the srcpad to EOS with gst_pad_eos ().
++
++ the eos handler returns false because queue2 returns false on the
++ eos request. the parent removes fakesrc as an EOS provider.
++
++ queue2 was responisble for the EOS delay and so it gets added to the bin
++ as a possible EOS provider.
++
++ after the queue2 has sent its last buffer, it performs gst_pad_eos on its
++ src pad.
++ the parent allready has the queue2 in the list of EOS providers so it does not
++ get added twice.
++ queue2 finally fires the EOS signal and the parent removes the EOS provider
++ from its list, when the list is empty, the parent fires EOS.
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/eos3 gstreamer-0.10.23/docs/random/wtay/eos3
+--- gstreamer-0.10.23.orig/docs/random/wtay/eos3 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/eos3 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,256 @@
++OUTDATED
++--------
++
++
++case 1)
++
++(--------------------------------------------------)
++! bin !
++! (--------) (--------) (--------) !
++! ! fakesrc! !identity! !fakesink! !
++! ! src ----- sink src ---- sink ! !
++! (--------) (--------) (--------) !
++(--------------------------------------------------)
++
++.scheduling.
++
++ case1 has just one scheduled entity (chain) no problem here.
++
++.eos.
++
++ fakesrc detects the end of stream. It just returned the last buffer.
++ The next _pull will cause the srcpad to trigger gst_pad_set_eos ().
++ After that it will return a NULL buffer.
++
++ gst_pad_set_eos() will notify the parent about the plugins attempt to
++ signal eos. the parent disables scheduling for the chain containing
++ fakesrc.
++
++ no more chains are being scheduled so the bin fires EOS.
++
++
++case 2)
++
++
++(-----------------------------------------------------------------------)
++! bin !
++! (---------------) !
++! !thread ! !
++! (--------) (--------) (--------) ! (--------)! !
++! ! fakesrc! !identity! ! queue ! ! !fakesink!! !
++! ! src ----- sink src ---- sink src ---- sink !! !
++! (--------) (--------) (--------) ! (--------)! !
++! (---------------) !
++(-----------------------------------------------------------------------)
++
++.scheduling.
++
++ case2 has two scheduled entities: fsr-i-q, q-fsk.
++ The first one is scheduled by the bin, the second one by the thread.
++
++.eos.
++
++ fakesrc detects the end of stream. It just returned the last buffer.
++ The next _pull will cause the srcpad to trigger gst_pad_set_eos ().
++ After that it will return a NULL buffer.
++
++ gst_pad_set_eos() will notify the parent about the plugins attempt to
++ signal eos. the parent will take chain1 out if its scheduled chains.
++
++ the bin does not fire EOS yet because the thread has not yet signaled
++ EOS.
++
++ after the queue has sent out the last buffer, its calls eos on its
++ src pad. the chain with the queue is removed from the threads scheduled
++ chains. there are no more chains to schedule, the thread fires EOS.
++
++ The bin now has no more scheduled chains and no more pending subbins,
++ it fires EOS.
++
++
++case 3)
++
++(-----------------------------------------------------------------------)
++! bin !
++! (---------------) !
++! !thread ! !
++! (--------) (--------) (--------) ! (--------)! !
++! ! fakesrc! ! tee ! ! queue1 ! ! !fakesink!! !
++! ! src ----- sink src ---- sink src ---- sink !! !
++! (--------) ! ! (--------) ! (--------)! !
++! ! ! (---------------) !
++! ! ! !
++! ! ! (---------------) !
++! ! ! !thread ! !
++! ! ! (--------) ! (--------)! !
++! ! ! ! queue2 ! ! !fakesink!! !
++! ! src ---- sink src ---- sink !! !
++! ! ! (--------) ! (--------)! !
++! (--------) (---------------) !
++(-----------------------------------------------------------------------)
++
++.scheduling.
++
++ case3 has tree scheduled entities: fsr-t(-q1,-q2), q1-fsk. q2-fsk
++ the first one is managed by the bin, the second two are managed by the
++ threads.
++
++.eos.
++
++ fakesrc detects the end of stream. It just returned the last buffer.
++ The next _pull will cause the srcpad to trigger gst_pad_set_eos ().
++ After that it will return a NULL buffer.
++
++ chain1 is taken out of the scheduling algorithm of the bin.
++
++ after a while, the threads finish their scheduling and fire EOS too.
++
++ The bin now has no more scheduled chains and no more pending subbins,
++ it fires EOS.
++
++
++case 4)
++
++(-----------------------------------------------------------------------)
++! bin !
++! (---------------) !
++! !thread ! !
++! (--------) (----------) (--------) ! (--------)! !
++! ! fakesrc! !mpeg1parse! ! queue1 ! ! !fakesink!! !
++! ! src -- sink src ---- sink src ---- sink !! !
++! (--------) ! ! (--------) ! (--------)! !
++! ! ! (---------------) !
++! ! ! !
++! ! ! (---------------) !
++! ! ! !thread ! !
++! ! ! (--------) ! (--------)! !
++! ! ! ! queue2 ! ! !fakesink!! !
++! ! src ---- sink src ---- sink !! !
++! ! ! (--------) ! (--------)! !
++! (----------) (---------------) !
++(-----------------------------------------------------------------------)
++
++ this case differs from case3 in that one of the queues can be empty
++ while the other isn't. we assume queue1 is empty while queue2 isn't yet.
++
++.scheduling.
++
++ case3 has tree scheduled entities: fsr-t(-q1,-q2), q1-fsk. q2-fsk
++ the first one is managed by the bin, the second two are managed by the
++ threads.
++
++.eos.
++
++ fakesrc detects the end of stream. It just returned the last buffer.
++ The next _pull will cause the srcpad to trigger gst_pad_set_eos ().
++ After that it will return a NULL buffer.
++
++ chain1 is taken out of the scheduling algorithm of the bin.
++
++ after a while, the threads finish their scheduling and fire EOS too.
++ chain2 (with queue1) is taken out of the scheduling first because it
++ is empty.
++
++ chain3 (with queue2) finally removes its last scheduled chain and
++ fires EOS.
++
++ The bin now has no more scheduled chains and no more pending subbins,
++ it fires EOS.
++
++
++case 5)
++
++(-----------------------------------------------------------------------)
++! bin !
++! (---------------) !
++! !audiosink ! !
++! (--------) (----------) (--------) ! ! !
++! !disksrc1! ! effect ! ! mixer ! ! ! !
++! ! src -- sink src ---- sink src -- sink ! !
++! (--------) (----------) ! ! ! ! !
++! ! ! (---------------) !
++! (--------) (----------) ! ! !
++! !disksrc2! ! effect ! ! ! !
++! ! src -- sink src ---- sink ! !
++! (--------) (----------) (--------) !
++(-----------------------------------------------------------------------)
++
++ This is a simple audio mixer (mp3audio mixer).
++ We assume disksrc1 is going to be in EOS while disksrc2 is still in !EOS
++
++
++.scheduling.
++
++ two chains are detected: disksrc1-effect-mixer-audiosink,
++ disksrc2-effect-mixer-audiosink
++
++.eos.
++
++ disksrc1 has passed the last buffer in the _get function. with its next
++ call to _get, it will return a NULL buffer and set the src pad to EOS.
++
++ the EOS call travels up till the mixer element because it has overridden
++ the handler. The first chain is disabled from the scheduler.
++
++ finally disksrc2 run into EOS, same procedure as with disksrc1, except
++ now the mixer also sets EOS to its src pad, chain2 becomes inactive too
++ and the bin fires EOS because there are no more chains to schedule.
++
++ somebody sets the location of disksrc1 to a new mp3 file, the srcpad
++ is set to !EOS, chain1 is scheduled again, mixer is activated again too
++ and audio is playing again...
++
++
++case 6)
++
++(-------------------------------------------------------------------------------------)
++! bin !
++! (---------------) !
++! (---------------------------------------------) !audiosink ! !
++! ! thread1 ! ! ! !
++! ! (--------) (----------) (-----) ! (--------) ! ! !
++! ! !disksrc1! ! effect ! !queue! ! ! mixer ! ! ! !
++! ! ! src -- sink src -- sink src -- sink src -- sink ! !
++! ! (--------) (----------) (-----) ! ! ! ! ! !
++! (---------------------------------------------) ! ! ! ! !
++! ! ! (---------------) !
++! (---------------------------------------------) ! ! !
++! ! thread2 ! ! ! !
++! ! (--------) (----------) (-----) ! ! ! !
++! ! !disksrc2! ! effect ! !queue! ! ! ! !
++! ! ! src -- sink src -- sink src -- sink ! !
++! ! (--------) (----------) (-----) ! (--------) !
++! (---------------------------------------------) !
++(-------------------------------------------------------------------------------------)
++
++ This is a simple audio mixer (mp3audio mixer).
++ We assume disksrc1 is going to be in EOS while disksrc2 is still in !EOS
++
++.scheduling.
++
++ Scheduling is a bit tricky here: we have two threads with each one chain ds1-e-q and
++ ds2-e-q. the mixer element is loop based and forms a third chain, mixer-audiosink
++
++.eos.
++
++ disksrc1 has passed the last buffer in the _get function. with its next
++ call to _get, it will return a NULL buffer and set the src pad to EOS.
++
++ the EOS call travels up till the queue element because it has overridden
++ the handler. The first chain is disabled from the scheduler. thread1 fires EOS
++ because it does not have any chains to schedule.
++
++ the mixer element pulls buffers from queue1 until queue1 is empty. At that time,
++ queue1 sets the pad to EOS, mixer now knows that it does not have to request
++ another buffer from that pad again.
++
++ disksrc2 finally sets its pad to EOS, rendering chain2 unscheduled which makes
++ the thread2 fire an EOS.
++
++ the mixer element pulls buffers from queue2 until queue2 is empty. At that time,
++ queue2 sets the pad to EOS, mixer now knows that it does not have to request
++ another buffer from that pad again. all pads for the mixer are in EOS now so
++ it sets the src pad to EOS. the last chain now also becomes unscheduled and
++ the bin fires EOS.
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/eos4 gstreamer-0.10.23/docs/random/wtay/eos4
+--- gstreamer-0.10.23.orig/docs/random/wtay/eos4 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/eos4 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,87 @@
++OUTDATED
++--------
++
++
++case 1)
++
++(--------------------------------------------------)
++! bin !
++! (--------) (--------) (--------) !
++! ! fakesrc! !identity! !fakesink! !
++! ! 1 src ----- sink 1 src ---- sink 1 ! !
++! (--------) (--------) (--------) !
++! !
++! (--------) (--------) (--------) !
++! !fakesrc ! !identity! !fakesink! !
++! ! 2 src ----- sink 2 src ---- sink 2 ! !
++! (--------) (--------) (--------) !
++(--------------------------------------------------)
++
++ just two scheduled chains in a single bin.
++
++.scheduling.
++
++ we have two chains here fs1-i1-fsk1 and fs2-i2-fsk2
++ fakesrc1 will output 1 buffer, fakesrc2 3 buffers
++
++.eos.
++
++ fs1 will call gst_pad_set_eos (src, TRUE) on its srcpad
++ in the _get function and returns a NULL buffer.
++
++ gst_pad_set_eos will recurse down the pipeline and set
++ all the pads in i1 and fsk1 to EOS too. none of these elements
++ override the default behaviour so gst_pad_set_eos returns TRUE.
++
++ fakesrc signals EOS. since an element in chain1 has signales
++ EOS, chain1 becomes EOS. All the elements in the chain are set
++ to the READY state and the chain is not scheduled anymore because
++ its EOS flag is on.
++
++ the same procedure happens for chain2. At that point, the bin
++ has no chains to schedule and so it fires EOS.
++
++
++case 2)
++
++(---------------------------------------------------)
++! bin !
++! (--------) (--------) (---------) !
++! ! disksrc! ! mpg123 ! !audiosink! !
++! ! 1 src ----- sink 1 src ---- sink 1 ! !
++! (--------) (--------) (---------) !
++! !
++! (--------) (--------) (---------) !
++! !disksrc ! ! mpg123 ! !audiosink! !
++! ! 2 src ----- sink 2 src ---- sink 2 ! !
++! (--------) (--------) (---------) !
++(---------------------------------------------------)
++
++ same as case 1, an mp3 mixer where the mixing is performed
++ in hardware (in the audiosink).
++ we want to show how the EOS state can be undone.
++
++.scheduling.
++
++ we have two chains here ds1-mpg1-ask1 and ds2-mpg2-ask2
++ the song in chain1 is about to end, chain2 has just begun
++ playing a song.
++
++.eos.
++
++ disksrc1 will set the src pad to EOS with gst_pad_set_eos (pad, TRUE)
++ the call recurses up and down, disksrc1 signals EOS. the chain with
++ disksrc1 becomes EOS and is excluded from the scheduling algorithm.
++ disksrc1 is set to the READY state.
++
++ the user then changes the location of disksrc1 to the new mp3 song.
++ The user then sets the element state of disksrc to PLAYING. disksrc
++ performs gst_pad_set_eos (pad, FALSE)
++
++ the call recurses up and down and returns TRUE. chain1 is set to !EOS
++ so that it will be scheduled again.
++
++ disksrc1 is set to PLAYING and the new mp3 is playing again.
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/eos5 gstreamer-0.10.23/docs/random/wtay/eos5
+--- gstreamer-0.10.23.orig/docs/random/wtay/eos5 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/eos5 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,76 @@
++OUTDATED
++--------
++
++
++case 1)
++
++(--------------------------------------------------)
++! bin !
++! (--------) (--------) (--------) !
++! ! fakesrc! !identity! !fakesink! !
++! ! 1 src ----- sink 1 src ---- sink 1 ! !
++! (--------) (--------) (--------) !
++! !
++! (--------) (--------) (--------) !
++! !fakesrc ! !identity! !fakesink! !
++! ! 2 src ----- sink 2 src ---- sink 2 ! !
++! (--------) (--------) (--------) !
++(--------------------------------------------------)
++
++ just two scheduled chains in a single bin.
++
++.scheduling.
++
++ we have two chains here fs1-i1-fsk1 and fs2-i2-fsk2
++ fakesrc1 will output 1 buffer, fakesrc2 3 buffers
++
++.eos.
++
++ fs1 will return a NULL buffer on EOS. the scheduler
++ detects the NULL buffer and puts chain1 in EOS so that it
++ doesn't get scheduled again. The scheduler fires the EOS
++ signal for all the elements in the chain and puts the fs1
++ element in the READY state.
++
++ the same procedure happens for chain2. At that point, the bin
++ has no chains to schedule and so it fires EOS.
++
++
++case 2)
++
++(---------------------------------------------------)
++! bin !
++! (--------) (--------) (---------) !
++! ! disksrc! ! mpg123 ! !audiosink! !
++! ! 1 src ----- sink 1 src ---- sink 1 ! !
++! (--------) (--------) (---------) !
++! !
++! (--------) (--------) (---------) !
++! !disksrc ! ! mpg123 ! !audiosink! !
++! ! 2 src ----- sink 2 src ---- sink 2 ! !
++! (--------) (--------) (---------) !
++(---------------------------------------------------)
++
++ same as case 1, an mp3 mixer where the mixing is performed
++ in hardware (in the audiosink).
++ we want to show how the EOS state can be undone.
++
++.scheduling.
++
++ we have two chains here ds1-mpg1-ask1 and ds2-mpg2-ask2
++ the song in chain1 is about to end, chain2 has just begun
++ playing a song.
++
++.eos.
++
++ fs1 will return a NULL buffer on EOS. the scheduler
++ detects the NULL buffer and puts chain1 in EOS so that it
++ doesn't get scheduled again. The scheduler fires the EOS
++ signal for all the elements in the chain and puts the fs1
++ element in the READY state.
++
++ the app sets the new location for the disksrc. The element is
++ put in the PLAYING state, the chain is marked !EOS so that
++ it will be scheduled again.
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/events gstreamer-0.10.23/docs/random/wtay/events
+--- gstreamer-0.10.23.orig/docs/random/wtay/events 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/events 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,138 @@
++This is a round up from our IRC session on events. It's open for
++discussion of course.
++
++Definition
++----------
++
++The event system is designed to be a mechanism for _inter_plugin_
++communication. Their scope is therefore limited in a way that they do
++not serve as a way to communicate between plugins and the app (signals
++and properties are still used for plugin-app communication).
++
++Events will be generated by either a plugin or the app. It should be
++possible for a plugin to generate an event on one of its pads and it
++should be possible for an app to insert an event on an abitrary pad in
++the pipeline.
++
++
++Event handling
++--------------
++
++Events can both travel upstream or downstream. Some events, by nature,
++only travel in one direction.
++
++* downstream events
++
++ - Travel in the same way buffers do. This includes that they are handled
++ by the scheduler. The rationale is that the events should be kept
++ as close to the buffers are possible.
++
++ - plugins should check the type of the GstData passed in the _chain
++ or _loop function and act appropriatly. This can be done by either
++ doing their own stuff or by calling the default handler.
++
++ - are handled on the sink pad.
++
++* upstream events
++
++ - are handled with an event handler attached to the srcpad. A default
++ handler will be implemented for pads that don't implement their own
++ handler.
++
++ - travel as fast as possible. the rationale is that a seek event should
++ get to the src element ASAP.
++
++
++Possible candidates for events
++------------------------------
++
++ - QoS
++ quality of service. Plugins can notify other plugins about the quality
++ of the pipeline. A video element can for example say that it receives
++ too much frames and that plugins connected to it need to slow down.
++
++ - EOS
++ A plugin can notify other plugins that it has run out-of-data.
++
++ - Seek
++ Used to notify plugins that they need to seek to a certain byte offset
++ or timestamp.
++
++ - discontinuous
++ A plugin has detected a discontinuity in the stream. Other plugins
++ might need to resync.
++
++ - flush
++ Plugins need to get rid of any buffered data ASAP.
++
++ - caps nego??
++ - bufferpool get??
++ - ...
++
++
++application generated events
++----------------------------
++
++The application can insert events into the pipeline at arbirary
++places. This will be done by calling gst_pad_event() on a pad.
++
++A first implementation will only cover inserting events on src pads
++since inserting events on sinkpads needs changes to the scheduler.
++
++
++Effects of events on plugins
++----------------------------
++
++some events are going to change the state of an element. The EOS event
++will for example change the state of an element to the PAUSED state. Not
++sure when or how this will happen.
++
++
++use cases
++---------
++
++1) filesrc ! fakesink
++
++filesrc will read until it reaches EOF. It will then create a GstEvent
++of type EOS and return it in the _get function. The event will travel
++downstream and will reach the fakesink element. Fakesink will detect
++the event in the _chain function and will call the default handler. The
++default handler will set the element to the paused state. filesrc will
++eventually change its state to PAUSED, probably before sending out the
++event (TBD)
++
++2) filesrc ! fakesink
++
++The app wants to perform a seek on filesrc. It'll call the gst_pad_event()
++on filesrcs src pad with the SEEK event type. The event handler will
++react and change filesrcs internal status. filesrc will return a DISCONT
++event before returning the buffer with the new offset.
++
++3) filesrc ! mpeg2parse video_0! queue ! { mpeg2dec ! xvideosink }
++
++lost of possibilities here: The app can choose to insert a seek event
++on the filesrc element (byte offset), it can insert a byte/time offset
++seek on the video_0 pad of mpeg2parse or it can insert a time seek event
++on mpeg2decs src pad.
++
++the event will travel upstream using the handlers and the intermediate
++elements can convert the event from a time to a byte offset (possibly
++using GstTimeCache to speed up things).
++
++Filesrc will get a byte seek event on its src pad and will proceed as
++in case 2.
++
++As can be seen from this example the app will generate an event in another
++context than those of the plugins, so this will need proper locking.
++
++The app can also choose to insert a flush event on one of the src
++pads. The plugins would clear their cached data and forward the event
++to their upstream peer pad(s).
++
++4)...
++
++Insert impossible case here..
++
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/events2 gstreamer-0.10.23/docs/random/wtay/events2
+--- gstreamer-0.10.23.orig/docs/random/wtay/events2 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/events2 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,143 @@
++INITIAL RAMBLINGS
++-----------------
++
++some random ramblings about the event system:
++
++Possible candidates for events
++------------------------------
++
++ - QoS
++ - EOS
++ - Seek
++ - caps nego??
++ - bufferpool get??
++ - ...
++
++Assumptions for events
++----------------------
++
++- They are tied to a pad.
++- get rid of gst_pad_set_*_function (except for the chain/get ones)
++- occur async to dataflow. (need locking?)
++- fixed set of events only for core features. (elements cannot abuse
++ events for doing dataflow)
++
++Questions
++---------
++
++limit the valid directions an event can travel in? ie. Can EOS only
++travel downstream (left to right)?
++
++eg. Seek travels upstream, but it makes sense to also make it travel
++ downstream (the case of a filesink, where we overwrite the header)
++
++
++Setting an event function
++-------------------------
++
++void gst_pad_set_event_function (GstPad *pad, gint event_mask,
++ GstEventFunction *function);
++
++
++event masks:
++
++typedef enum {
++ GST_EVENT_EOS = (1 << 0),
++ GST_EVENT_QOS = (1 << 1),
++ GST_EVENT_SEEK = (1 << 2),
++ GST_EVENT_CAPS = (1 << 3),
++} GstEventType;
++
++Event structure
++---------------
++
++typedef struct {
++ GstEventType type;
++ GstEventMinorType minor;
++ guint64 timestamp; /* also sequence number ?? */
++
++ union {
++ /* EOS stuff */
++ /* QoS stuff */
++ /* Seek stuff */
++ GstSeekType type; /* time, bytes, ... */
++ gint64 offset;
++ gint64 lenth;
++ /* Caps stuff */
++ GstCaps *caps;
++ } data;
++} GstEvent;
++
++
++typedef enum {
++ GST_EVENT_MINOR_NONE,
++ /* EOS stuff */
++
++ /* QoS stuff */
++ /* Seek stuff */
++ GST_EVENT_MINOR_OFFSET,
++ GST_EVENT_MINOR_TIME,
++
++ /* caps nego stuff */
++ GST_EVENT_MINOR_CAPS_TRY,
++ GST_EVENT_MINOR_CAPS_START,
++ GST_EVENT_MINOR_CAPS_FINAL,
++} GstEventMinorType;
++
++
++Receiving events
++----------------
++
++a sample GstEventFunction, the event functions returns TRUE if the event is handled,
++FALSE otherwise.
++
++gboolean
++gst_anelement_handle_event (GstPad *pad, GstEvent *event)
++{
++ if (event->type == GST_EVENT_EOS) {
++ /* do something */
++ return TRUE;
++ }
++ else if (event->type == GST_EVENT_CAPS) {
++ if (event->minor == GST_EVENT_CAPS_TRY) {
++ /* try using this caps structure */
++ return TRUE; /* return FALSE to proxy ???*/
++ }
++ }
++ return FALSE;
++}
++
++
++Default event handler for pads
++------------------------------
++
++gboolean
++gst_pad_handle_event (GstPad *pad, GstEvent *event)
++{
++ GstElement *element;
++ GList *pads;
++ GstPad *srcpad;
++ gboolean result = TRUE;
++ GstPadDirection dir = GST_PAD_DIRECTION (pad);
++
++ g_return_val_if_fail (pad != NULL, FALSE);
++ g_return_val_if_fail (GST_IS_REAL_PAD(pad), FALSE); // NOTE the restriction
++
++ element = GST_ELEMENT (gst_object_get_parent (GST_OBJECT (pad)));
++
++ /* send out the events to all pad with opposite direction */
++ pads = gst_element_get_pad_list(element);
++ while (pads) {
++ otherpad = GST_PAD(pads->data);
++ pads = g_list_next(pads);
++
++ if (gst_pad_get_direction(otherpad) != dir) {
++ result &= gst_pad_send_event (GST_REAL_PAD(otherpad), event);
++ }
++ }
++
++ /* result is combined result of all handlers? */
++ return result;
++}
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/events3 gstreamer-0.10.23/docs/random/wtay/events3
+--- gstreamer-0.10.23.orig/docs/random/wtay/events3 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/events3 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,239 @@
++This is the current implementation of events, based on an earlier
++document, in this same directory, called "events".
++
++Definition
++----------
++
++The event system is designed to be a mechanism for _inter_plugin_
++communication. Their scope is therefore limited in a way that they do
++not serve as a way to communicate between plugins and the app (signals
++and properties are still used for plugin-app communication).
++
++Events will be generated by either a plugin or the app. It should be
++possible for a plugin to generate an event on one of its pads and it
++should be possible for an app to insert an event on an abitrary pad or
++element in the pipeline.
++
++
++Event handling
++--------------
++
++Events can both travel upstream or downstream. Some events, by nature,
++only travel in one direction.
++
++* downstream events
++
++ - Travel in the same way buffers do. This includes that they are handled
++ by the scheduler. The rationale is that the events should be kept
++ as close to the buffers are possible.
++
++ - plugins should check the type of the GstData passed in the _chain
++ or _loop function and act appropriatly. This can be done by either
++ doing their own stuff or by calling the default handler.
++
++ - are handled on the sink pad.
++
++* upstream events
++
++ - are handled with an event handler attached to the srcpad. A default
++ handler is implemented for pads that don't implement their own
++ handler.
++
++ - travel as fast as possible. the rationale is that a seek event should
++ get to the src element ASAP.
++
++
++
++Plugin generated events
++-----------------------
++
++We cover the range of events a plugin can generate and how they
++are supposed to handle them.
++
++* EOS
++
++ when the plugin has no more data to push, it pushes an EOS
++ event and calls gst_element_set_eos.
++
++ _get based plugins should call gst_element_set_eos() before
++ returning the EOS event.
++
++ gst_element_set_eos() will put an element into the PAUSED state
++ and will emit the eos signal to the app.
++
++ Elements receiving the EOS event on a pad should not pull anymore
++ data from that pad (in case of a loop based element).
++ If the plugin cannot operate when it doesn't receive data on that
++ pad, the element should go to EOS too. It does this by pushing
++ any data it might still have, to the srcpad after which it
++ pushes an EOS event on thet pad and calls gst_element_set_eos().
++
++ The EOS event will typically originate from a source element, it
++ will eventually put all elements into the PAUSED state so that the
++ pipeline stops.
++
++ The EOS event is strictly a downstream event.
++
++* DISCONTINUOUS
++
++ The discontinuous event is used to indicate a discontinuity in the
++ stream to downstream elements. A disctontinuity happens for the
++ following reasons:
++
++ - a source element is sending the first buffers of a stream.
++ - an element has performed a seek operation resulting in a
++ discontinuity in the data.
++
++ elements that receive a discontinuity event should flush any state
++ they might have and treat the new data as the start of new data.
++ Before sending out the new data the element must send a discont event
++ to the downstream element with at least a GST_FORMAT_TIME or
++ GST_FORMAT_BYTES as the format/value pair (see below).
++
++ a DISCONTINUOUS event has a flush flag. If that flag is set, the
++ element should also remove any buffered data it might have.
++
++ In addition to the flush flag, a DISCONTINUOUS event also caries up
++ to GST_DISCONTINUOUS_MAX_FORMATS format/value pairs. These values
++ might be used by the receiver of the event to resynchronize itself.
++
++ elements that are using a clock must take special actions upon
++ receiving the DISCONTINUOUS event: they must call
++ gst_clock_handle_discont() with the GST_FORMAT_TIME value of
++ the discont event.
++
++ The DISCONTINUOUS event is strictly a downstream event.
++
++
++* SEEK
++
++ The seek event is used to reposition the upstream elements to
++ a new position in the media stream.
++
++ The seek event caries a bitwise-or of a GstFormat and a GstSeekType.
++
++ An element receiving the seek event on its srcpad should try to
++ reposition itself as closely to the requested location as possible.
++ if the ACCURATE flag is set and it cannot reposition itself with
++ absolute certainty, it should reposition itself well before the
++ requested position. If the ACCURATE flag is not set, the element
++ is free to choose a suitable position in the stream before or after
++ the requested time.
++
++ If the flush flag is set it should make sure that it pushes the
++ DISCONTINUOUS event the next time it is scheduled, clearing any
++ data it might have buffered.
++
++ The element is free to set the ACCURACY field in the event to notify
++ the originator of the event of the result. If no accuracy is set, it
++ defaults to FUZZY.
++
++ The SEEK event is stricly an upstream event.
++
++* QOS
++
++ QoS is sent to indicate Quality of Service to the upstream element(s).
++
++ The QOS event is stricly an upstream event.
++
++* FLUSH
++
++ A plugin can send a flush event to its src or sink peer to clear the
++ buffered contents in the pipeline.
++
++
++application generated events
++----------------------------
++
++The application can insert events into the pipeline at arbirary
++places. This is done by calling gst_pad_send_event() on a pad.
++
++An application can also insert events on any element. The element
++can implement its own handler for these events or it can use
++the default handler, which simply forwards the event to the first
++connected sinkpad of the element. Events to an element are send using
++gst_element_send_event().
++
++This first implementation only covers inserting events on src pads
++since inserting events on sinkpads needs changes to the scheduler.
++
++
++* FLUSH
++
++ A flush event is used to clear any buffered data an element might
++ have. It is a downstream and upstream event.
++
++ Flush events are typically inserted into the pipeline by the app.
++ Elements that buffer data should implement an event handler on
++ both the sink and src pads it might have and respond to the flush
++ event by clearing all data they have buffered.
++
++* SEEK
++
++ The application can insert the seek event into the pipeline on
++ a srcpad with gst_pad_send_event () or on an element with
++ gst_element_send_event().
++
++ The semantics of the seek parameters are described above.
++
++
++Thread safety
++-------------
++
++All upstream events can occur outside the element's thread context.
++It is not required to protect the element's data structures with
++mutexes because in principal we don't support sending events to
++a running threaded pipeline.
++
++GstQueue in its current form will refuse to pass events upstream if
++it is in the PLAYING state. Future versions might pass the event
++on as soon as the element is scheduled again on the sinkpad.
++
++An application cannot insert an event on an element that is PLAYING
++in another thread context. It is therefore strongly recommended to
++PAUSE the threaded pipeline before inserting an event.
++
++
++use cases
++---------
++
++1) filesrc ! fakesink
++
++<< explain EOS >>
++
++
++2) filesrc ! fakesink
++
++The app wants to perform a seek on filesrc. It'll call the gst_pad_send_event()
++on filesrcs src pad with the SEEK event type. The event handler will
++react and change filesrcs internal status. filesrc will return a DISCONT
++event before returning the buffer with the new offset.
++
++3) filesrc ! mpeg2parse video_0! queue ! { mpeg2dec ! xvideosink }
++
++lost of possibilities here: The app can choose to insert a seek event
++on the filesrc element (byte offset), it can insert a byte/time offset
++seek on the video_0 pad of mpeg2parse or it can insert a time seek event
++on mpeg2decs src pad.
++
++the event will travel upstream using the handlers and the intermediate
++elements can convert the event from a time to a byte offset (possibly
++using GstTimeCache to speed up things).
++
++Filesrc will get a byte seek event on its src pad and will proceed as
++in case 2.
++
++As can be seen from this example the app will generate an event in another
++context than those of the plugins, so this will need proper locking.
++
++The app can also choose to insert a flush event on one of the src
++pads. The plugins would clear their cached data and forward the event
++to their upstream peer pad(s).
++
++4)...
++
++Insert impossible case here..
++
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/interactivity gstreamer-0.10.23/docs/random/wtay/interactivity
+--- gstreamer-0.10.23.orig/docs/random/wtay/interactivity 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/interactivity 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,93 @@
++This document contains some ideas that can be used to implement
++interactivity in media content.
++
++Possible application: DVD navigation, flash,...
++
++Requirements
++------------
++
++- capture mouse clicks, mouse position, movement occuring on
++ a video display plugin
++- transport these events to the interested plugins
++- allow for automation (ie, the technique should work without
++ a video plugin too)
++- the core doesn't care
++
++Capturing events
++----------------
++
++- the videosink element captures mouse events
++ - event is encapsulated into a generic data structure
++ describing the event (need to define a caps?)
++ - event is signalled to the app?.
++ - event is sent upstream?
++
++ * videosink has to add something to the main_loop to
++ be able to grab events
++ * thread issues?
++ * does the app need to know about the events?
++
++- app captures mouse events
++ - no idea if that's possible
++ - app sends events upstream
++
++Sending events to plugins
++-------------------------
++
++- are sent upstream using the event methods
++ * more generic
++ * less app control
++
++- are sent to the appropriate plugin by the app
++ * app needs to know what plugins are interested,
++ less generic.
++ * more app control
++
++automation will always work, the app can construct navigation
++events and insert them into the pipeline.
++
++What about flushing to minimize latency?
++
++
++Defining an event
++-----------------
++
++some ideas:
++
++GST_CAPS_NEW (
++ "videosink_event",
++ "application/x-gst-navigation"
++ "type", "click",
++ "x_pos", 30,
++ "y_pos", 40
++ )
++
++GST_CAPS_NEW (
++ "videosink_event",
++ "application/x-gst-navigation"
++ "type", "move",
++ "x_pos", 30,
++ "y_pos", 40
++ )
++
++...
++
++do we need a library for this?
++
++do we use custom events and use the mime type to detect the
++type? do we creat a GST_EVENT_NAVIGATION?
++
++can we encapsulate all events into a GstCaps? I would think so
++
++Random thoughts
++---------------
++
++- we're basically defining an event model, I don't think there is
++ anything wrong with that.
++- how is our coordinate system going to work? do
++ we use normalized values, 0-1000000 (or floats)
++ or real pixel values? real pixel values require scalers to adjust
++ the values (I don't think I like that)
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/messages gstreamer-0.10.23/docs/random/wtay/messages
+--- gstreamer-0.10.23.orig/docs/random/wtay/messages 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/messages 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,135 @@
++OUTDATED
++--------
++
++
++problem
++-------
++
++Since gstreamer uses a hierarchical pipeline layout individual elements
++can be inside N levels of containers (bins). Elements can also produce
++interesting information for the user app or for its parent.
++
++Consider the mp3parse element that could detect id3 tags in the stream.
++One way to let the app know about those tags is by emitting a signal. The
++problem with this signal is that the app has to perform a g_signal_connect
++on this element. This might not always be possible/feasable because
++the APP might not know about the mp3parse element (eg. an autoplugged
++pipeline or a compound object). The app could instrospect each element
++in the pipeline and look for known properties/signals to connect to,
++but that looks a bit ugly IMO.
++
++Signal proxying is also not very feasable because signals are tied to
++class instances.
++
++let's take the following use case:
++
++ - the user autoplugs an mpeg1 pipeline
++
++ - the autoplugged pipeline most likely contains an mpegdemuxer, an mp3
++ decoder, mpegdecoder etc.
++
++ - the mpegdemuxer knows the (average) bitrate of the stream.
++
++ - the mpegdecoder knows the framerate of the stream
++
++ - the mp3 decoder has some neat stuff too (bitrate, layer etc..)
++
++how are we going to get all those properties to the app? each element
++could fire a signal with the data. It the app were able to connect to
++every signal in each element this would work somewhat.
++
++
++Requirements
++------------
++
++The application can listen to an abritrary bin in the pipeline to collect
++information about that bins children. The app can listen on the top
++level bin to collect all of the elements messages.
++
++The data sent out by the elements must not be limited to a fixed set of
++messages; it must be extensible.
++
++
++proposed solution
++-----------------
++
++We propose another way of propagating these element messages to the
++application.
++
++An element can send a message to its parent using a
++gst_element_send_message (element, message). The message would be of type
++GstMessage and would be similar to a GstEvent type (maybe even the same).
++
++The message would contain GstProps, which can be anything (a string, an
++int, a range etc..). It would also contain the originator of the message.
++
++The parent would just simply accept the message (and do something with it)
++or the default handler would just forward the message to its parent etc..
++
++The message would bubble up the pipeline. When an element doesn't have
++a parent, the message is converted to a GSignal. The signal ("message")
++would just forward the message to any listening apps.
++
++The app can then use the originator field of the message to find out
++where it came from, possibly using the elementfactories klass field to
++find out what type of plugin created this message.
++
++For an autoplugged mpeg1 pipeline the following messages could be
++signalled to the app:
++
++element klass element property value
++ name
++
++stream/mpeg/demuxer: (mpegdemux) "bitrate", GST_PROPS_INT (1000000)
++stream/mpeg/demuxer: (mpegdemux) "type", GST_PROPS_STRING ("mpeg1")
++video/mpeg/decoder: (mpeg2dec) "type", GST_PROPS_STRING ("mpeg1")
++video/mpeg/decoder: (mpeg2dec) "frame_rate",GST_PROPS_INT (25)
++video/mpeg/decoder: (mpeg2dec) "size", GST_PROPS_LIST (
++ GST_PROPS_INT (320),
++ GST_PROPS_INT (200)
++ )
++audio/mp3/decoder: (mad) "layer", GST_PROPS_INT (2)
++audio/mp3/decoder: (mad) "bitrate", GST_PROPS_INT (128000)
++audio/mp3/decoder: (mad) "channels", GST_PROPS_INT (2)
++
++other possibilities:
++
++video/render/X: (xvideosink) "frames_dropped", GST_PROPS_INT (4)
++video/render/X: (xvideosink) "frames_shown", GST_PROPS_INT (254)
++video/mpeg/decoder: (mpeg2dec) "frames_dropped", GST_PROPS_INT (2)
++video/avi/demuxer: (avidemux) "codec", GST_PROPS_FOURCC ("DIVX")
++
++or
++
++video/mpeg/decoder: (mpeg2dec) "state_changed", GST_PROPS_INT (GST_STATE_PAUSED)
++
++or even
++
++audio/render/oss: (osssink) "master_clock", GST_PROPS_OBJECT (osssink_clock)
++....
++
++or even even:
++
++input/file/filesrc: (filesrc) "here_i_am", GST_PROPS_STRING ("alive and kicking")
++
++
++With standard naming conventions for the element klass type and the
++messages ids, the player can easily create an info dialog to show various
++properties of the stream.
++
++The benefits are that we don't need to define N-thousand methods on
++elements, the messages can be anything and we don't have to use the
++heavyweight GObject signals in the core library.
++
++
++what about?
++-----------
++
++- Threads? do we queue events and let the top half collect the messages
++ or do we send them to the app in the thread context?
++
++- do we need a similar system for core functionalities (clocks, states,
++ ...) or do we define methods for those?
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/namespaces gstreamer-0.10.23/docs/random/wtay/namespaces
+--- gstreamer-0.10.23.orig/docs/random/wtay/namespaces 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/namespaces 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,219 @@
++XML namespaces
++==============
++
++1) requirements
++---------------
++
++GStreamer uses XML to save a complete media pipeline. This
++opens a lot of possibilities for end user apps, eg: save
++constructed pipelines for later reuse, send pipelines over
++the wire to render data elsewhere etc...
++
++We will also allow the end user app to insert its own tags
++into the GStreamer generated XML in order to give more
++context to the elements. An example of such an app would be
++gsteditor; while the GStreamer core will save the plain
++element hierarchy, the editor will insert its own tags into
++the XML tree to describe the elements positions, the
++signals and other project data that might need to be
++externalised.
++
++And inherent problem with XML is that the use and naming of
++the tags can be done in an arbitrary way. The GStreamer core
++will, for example, use the 'element' and 'pad' tags to store
++the element and pad objects. The description and the nesting
++of the tags are described in a DTD (document type definition)
++or soon with the proposed 'new' standard of the W3C; Schemas.
++
++We can see obvious problems when a user app (unaware of the
++core tags) is also trying to use the 'element' tag for its
++own purposes. The core might try to load the 'element' tag
++desscribing the user app data and the user app might get fed
++with XML data of the GStreamer core.
++
++In this document we try to describe how we will solve this problem
++using namespaces.
++
++
++2) namespaces
++-------------
++
++To avoid the tag conflicts we mentioned, the W3C has incorporated
++XML namescapes.
++
++Were a typical XML document without namespaces would look like:
++
++<?xml version="1.0"?>
++<GST-Pipeline>
++ <element>
++ <name>bin</name>
++ <children>
++ ...
++ </children>
++ </element>
++</GST-Pipeline>
++
++Tha same document with namespaces look like this:
++
++<?xml version="1.0"?>
++<gst:GST-Pipeline xmlns:gst="http://gstreamer.net/gst-core/1.0/">
++ <gst:element>
++ <gst:name>bin</gst:name>
++ <gst:children>
++ ...
++ </gst:children>
++ </gst:element>
++</gst:GST-Pipeline>
++
++In front of each tag we add, in this case, gst:. gst: is called the
++namespace of the document and is declared with a statement:
++
++<... xmlns:gst="http://gstreamer.net/gst-core/1.0/">
++
++In this case we define a new namespace 'gst:' that is tied to the URL
++http://gstreamer.net/gst-core/1.0/. This URL is typically based on
++a domain you control and doesn't have to point to something valid on
++the internet. Note that the following document is exactly the same
++as the one mentioned above:
++
++<?xml version="1.0"?>
++<core:GST-Pipeline xmlns:core="http://gstreamer.net/gst-core/1.0/">
++ <core:element>
++ <core:name>bin</gst:name>
++ <core:children>
++ ...
++ </core:children>
++ </core:element>
++</core:GST-Pipeline>
++
++GStreamer currently uses xmlns:gst="http://gstreamer.net/gst-core/1.0" as
++the namespace used for saving the core pipeline.
++
++3) multi-namespace documents
++----------------------------
++
++Suppose we have a user app that wants to insert its own XML tags into
++the core GStreamer XML pipelines, for the examples sake we will use the
++editor as an example. The editor will insert XML tags inside each
++element that describes the position and size of the element as it was
++laid out in the editor.
++
++For the examples sake, the tags that are used to descibe this meta data
++will also be names 'element' in order to demonstrate the namespaces.
++
++The editor will use its own namespace, being:
++xmlns:editor="http://gstreamer.net/gst-editor/1.0". This namespace is
++added to the XML documents header and all the elements the editor will
++save will have this namespace attached to it. Our interleaved XML
++document might look like this:
++
++<?xml version="1.0"?>
++<gst:GST-Pipeline xmlns:gst="http://gstreamer.net/gst-core/1.0/"
++ xmlns:editor="http://gstreamer.net/gst-editor/1.0/">
++ <gst:element>
++ <gst:name>bin</gst:name>
++ <gst:children>
++ ...
++ </gst:children>
++ <editor:element>
++ <editor:position x="100" y="50"/>
++ </editor:element>
++ </gst:element>
++</gst:GST-Pipeline>
++
++As you can see, the namespaces clearly separate the same XML tags
++'element'.
++
++
++4) implementation considerations
++--------------------------------
++
++The GStreamer core doesn't know about user apps inserting data into the
++XML, it does not look at XML tags not within its namespace when it
++performs the parsing of the XML tree. The core, however, must be
++able to hand over the XML tree to the user app so it can perform the
++parsing of its tags inside its namespace. We therefore need hooks inside
++the framework to accomplish this.
++
++We also need hooks inside the GStreamer core to signal a user app that
++it can now insert its tags into the XML tree.
++
++4.1) XML save hooks
++-------------------
++
++GstObject has an abstract class method
++
++ xmlNodePtr (*save_thyself) (GstObject *object, xmlNodePtr parent)
++
++A real element or pad will implement this function and construct an XML
++representation of itself with the parent xmlNodePtr as the parent.
++An element will typically call the save_thyself function of its
++parent class before saving itself.
++
++The XML save procedure on a GstObject is performed with:
++
++ gst_object_save_thyself (GstObject *object, xmlNodePtr parent)
++
++Wich will call the elements implementation of the save_thyself function.
++
++An app that wants to insert its XML tags has to connect to a signal of
++the GstObject object called xml_saved. The object and the parent
++xmlNodePtr will be passed to the signal handler of the user app, which
++can then insert its tags.
++
++The user app has no problem inserting its namespace into the xmlDoc and
++neither will the GStreamer core.
++
++4.2) XML load hooks
++-------------------
++
++The real problem lies in the loading of the XML tree. Before we load
++the objects, we don't have anything to connect a signal to, so
++another method has to be invented to signal the user app of the
++freshly loaded objects.
++
++One obvious solution would be to attach a class signal to the
++GstObject class that would be fired whenever an object is created from
++an XML document. Unfortunatly Gtk+ (or glib2.0) doesn't have class
++signals so we need something else. Another problem with the class
++signals would be that the user app would also be notified of object
++creation outside its context. For example, if two threads perform an
++XML load at the same time, the objects created in the first thread
++would also notify the listener in the second thread. Both threads then
++have to take care of not trying to parse XML documents that are from
++the other thread, this obvously can get messy and we have to deal
++with it without bothering the user app.
++
++We'll continue with some random ramblings...
++
++solution 1
++----------
++To solve this problem we can create a special method in gstobject
++
++gst_object_loaded_notify_add (GstObjectLoadedCallback *callback,
++ xmlNodePtr doc)
++
++this method would add the specified callback function to a list of
++listeners and would perform the callback function if an object is
++created (this can be done in the init method). The problem remains
++though because we do not know the xmlNodePtr when we call the
++callback. This seems messy.
++
++sultion 2
++---------
++After the object has performed its restore_thyself, it is responsible
++for signaling a object_loaded signal with the object and the xmlNodePtr
++as an argument.
++
++At object creation, the signal is connected to a singleton object managed
++by GstObject that can proxy the signal to the user app. This looks a
++lot like a class signal. apps could also specify the xmlNodePtr they
++are interested in and the signal would only be proxied to the app
++if the xmlNodePtrs are from the same xmlDoc.
++
++Solution 2 seems like a reasonable solution for now...
++
++comments?
++
++wtay
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/negotiation3 gstreamer-0.10.23/docs/random/wtay/negotiation3
+--- gstreamer-0.10.23.orig/docs/random/wtay/negotiation3 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/negotiation3 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,328 @@
++Caps Negotiation
++================
++
++
++Definitions
++-----------
++
++- GstCaps is a structure that holds a mimetype and a set of properties. The properties are
++ either fixed or non-fixed, they contain ranges or lists.
++
++- filter caps: caps set by the application to constrain a link to a specific GstCaps.
++
++- allowed caps: caps calculated when connecting elements, these are the types that are
++ possible on this connection. If no types are possible, the link is refused.
++
++- pad template caps: caps put on padtemplates to describe the possible media types of
++ the pad.
++
++- pad caps: the caps of the pad as it is currently negotiated.
++
++
++General overview
++----------------
++
++Caps negotiation is the process of two pads agreeing on a common fixed GstCaps structure
++that describes the media type that will be exchanged between those pads.
++
++We define that caps negotiation only happens in the PLAYING state, when there is actual
++dataflow and elements thus know what kind of data they are dealing with, or when
++linking elements.
++
++Caps negotiation is first performed when linking elements. If the elements can agree
++on a media type at link time then negotiation will not have to be performed at runtime.
++Usually this is not possible, so the pads remain unnegotiated until at runtime.
++
++Caps negotiation is initiated by an element that wants to send data on a non-negotiated
++pad, thus the source pad. The core only provides a policy and convenience methods to aid
++the element in performing the negotiation. The core does not keep track of what pads
++are negotiated or not, this is a task of the pads.
++
++Caps negotiation is normally started by the source element right before it sends out
++data (case 1).
++Caps negotiation can also be redone by a sink element that wants to receive another
++format from a downstream element (case 2).
++
++There are two functions handling the negotiation, the link function and the do_link
++function. The link function is always called first and must eventually call do_link on
++the peer pad. The link function must figure out a compatible format for the connection
++and then call the do_link function on the peer pad. The do_link function can only
++accept or refuse the provided caps.
++
++For autopluggers it is important to know when the pad is ready to start the negotiation.
++It is also inportant to know when the negotiation failed and it must be possible to
++restart the negotiation with another element. This functionality will be provided
++with signals.
++
++Pad functions
++-------------
++
++!
++! const GstCaps* gst_pad_iterate_caps (GstPad *pad, gint position);
++!
++Returns the nth possible caps that describes the media type that can flow over
++this pad. This function should not return static caps but caps that are
++dependent of the media type and the peer connections of the element.
++
++This function can be called at any time so that an autoplugger can know the
++exact types of the pads at any time.
++
++!
++! gboolean gst_pad_accept_caps (GstPad *pad, GstCaps *caps);
++!
++Checks that a given caps is acceptable for this pad. Returns FALSE if the
++pad cannot handle the caps.
++
++!
++! gboolean gst_pad_link (GstPad *pad, GstPad *peer, GstCaps *caps);
++!
++Tells the pad to start negotiation with the given filtercaps. The
++caps need not be fixed and serves as a filter for performing the negotiation
++with the peerpad.
++
++!
++! gboolean gst_pad_do_link (GstPad *pad, GstPad *peer, GstCaps *caps);
++!
++Configures the pad to accept data with the given caps. The caps must be fixed.
++
++!
++! const GstCaps* gst_pad_get_negotiated_caps (GstPad *pad);
++!
++Get the negotiated caps of a pad or NULL if the pad is not negotiated.
++
++
++Linking Elements
++----------------
++
++When linking elements with the gst_pad_link function, the core will call
++the link function on the srcpad. If that pad returns GST_PAD_LINK_OK,
++the link is established, else the link fails.
++
++Since the link function of the pad will call the do_link function of
++the peerpad, the caps will be set on both pads.
++
++It is not required to decide on a caps at link time, a plugin can choose to
++dynamically renegotiate at runtime.
++
++When a link fails, the core emits a signal link_failed, which the application
++can catch to try to establish a new link with another element, for example.
++
++!
++! def gst_pad_link_filtered (pad1, pad2, filtercaps):
++!
++! ... get srcpad and sinkpad ...
++! srcpad = (pad1 == GST_PAD_SRC ? pad1 : pad2);
++! sinkpad = (pad1 == GST_PAD_SINK ? pad1 : pad2);
++!
++! ... more checks to see if the pads are of different types and
++! ... that they live in the same scheduler etc...
++!
++! res = gst_pad_link (srcpad, sinkpad, filtercaps)
++! if (res == GST_PAD_LINK_OK)
++! ... perform other setup ...
++! else
++! res = signal_emit (srcpad, "link_failed")
++!
++! return res
++!
++
++Pad link is just a convenience function that passes a NULL filtercaps:
++!
++! def gst_pad_link (pad1, pad2):
++! gst_pad_link_filtered (pad1, pad2, NULL)
++!
++
++
++Dynamic renegotiation
++---------------------
++
++Dynamic renegotiation happens at runtime when the element knows the exact media
++type it is handling.
++
++The element that wants to redecide on the data type of a connection just calls
++gst_pad_relink on one of it's pads. The core will call unlink and link on the
++pads again as if this were a new connection. Since the iterate_caps function
++returns other values while linking, the new link will renegotiate to a new
++format or the link will fail.
++
++Prototype of the relink function:
++!
++! def gst_pad_relink_filtered (pad, filtercaps):
++! gst_pad_unlink (pad, peerpad)
++! gst_pad_link_filtered (pad, peerpad, filtercaps)
++!
++
++Again the relink function is a convenience function for not having to pass
++filtercaps.
++!
++! def gst_pad_relink (pad):
++! gst_pad_relink_filtered (pad, NULL)
++!
++
++The core, however, should optimize the relink function so that it does a minimal
++amount of work, like not informing the scheduler about the unlink/link call in
++case of success.
++
++Error recovery
++--------------
++
++When a pad is ready to negotiate and it has no peer pad, it fires the "need-link"
++signal. Autopluggers can use this signal to start plugging elements to the pad.
++
++When a link fails because of a renegotiation, the "link-failed" signal is fired
++so that autopluggers can try other elements.
++
++
++Default implementations
++-----------------------
++
++!
++! gst_pad_src_link_func (pad, peerpad, filtercaps)
++! {
++! srcpad->negotiated_caps = NULL;
++! gboolean possible = FALSE;
++!
++! for (i=0; peercaps = gst_pad_iterate_caps (peerpad, i); i++)
++! {
++! for (j=0; srccaps = gst_pad_iterate_caps (srcpad, j); j++)
++! {
++! test = gst_caps_intersect (srccaps, peercaps, filtercaps);
++! if (test == GST_CAPS_EMPTY)
++! continue;
++!
++! /* non empty caps, something is possible */
++! possible = TRUE;
++!
++! if (!gst_caps_is_fixed (caps))
++! continue;
++!
++! if (gst_pad_accepts_caps (peerpad, test))
++! {
++! if (gst_pad_do_link (peerpad, srcpad, test))
++! {
++! srcpad->negotiated_caps = test;
++! goto done;
++! }
++! else
++! {
++! /* weird, it accepted but did not want to link */
++! }
++! }
++! else
++! {
++! /* caps are not accepted by peer, try next */
++! }
++! }
++! }
++! done:
++! if (!possible)
++! return GST_PAD_LINK_FAILED;
++! else
++! return GST_PAD_LINK_OK;
++! }
++!
++
++gst_pad_iterate_caps returns caps in the following order:
++
++ 1) prefered caps (if any)
++ 2) negotiated caps (if any)
++ 3) profile caps (if any, filtered against caps of current media type)
++ 4) padtemplate caps (filtered against caps of current media type)
++
++1 = a caps describing the media type that would result in optimal
++ processing of the current media type
++2 = a caps that it is currently handling
++3 = a caps describing the user configured default values
++4 = a caps describing all other possibilities that this pad can
++ produce or consume given the current media type if any.
++
++
++generic flow 1:
++
++ Linkage
++
++ src sink
++ | |
++ | <--- link(sink, A) |
++check if | |
++A is ok | |
++or filter | |
++against | |
++allowed | |
++src caps | |
++ | iterate_caps |
++if A not +-------------------------> |
++fixed | |
++ | <-------------------------+
++filter | |
++against A | |
++to get A' | |
++ | can_accept(A') |
++if A' fix +-------------------------> |
++ | | check if A' is ok
++ | yes |
++ | <-------------------------+
++ | |
++if A' not | |
++fixed, | |
++A'=null | |
++ | do_link(src, A') |
++ +-------------------------> |
++ | ok | store src, A'
++ | <-------------------------+
++store | |
++sink, A' | |
++
++
++
++Unlink
++
++ src sink
++ | |
++ | <--- unlink() |
++ | |
++ | unlink() |
++ +-------------------------> |
++unref | | unref src, format
++sink, fmt | |
++
++
++ Dynamic negotiation of B
++
++ src sink
++ | can_accept(B) |
++ +-------------------------> |
++ | | check if B is ok
++ | yes |
++ | <-------------------------+
++ | |
++ | do_link(B) |
++ +-------------------------> |
++ | ok | store B
++ | <-------------------------+
++store | |
++B | |
++
++
++
++TODO
++-----
++
++Write test objects to simulate different behaviour.
++
++
++tests (in python):
++
++ vts -> colorspace -> ximagsink
++
++ relink with different colorspaces while running
++
++
++ vts -> videoscale -> ximagesink
++
++ relink to different sizes while running, scaling vts or ximagesink.
++
++ sinesrc -> audiorate -> audiosink
++
++ where audiosink only has one possible fixed caps.
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/network-transp gstreamer-0.10.23/docs/random/wtay/network-transp
+--- gstreamer-0.10.23.orig/docs/random/wtay/network-transp 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/network-transp 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,48 @@
++Network Transparent elements
++----------------------------
++
++1) netbin
++
++ - exposes local shims and remote real elements.
++ - all shim pads can be connected to other shim
++ pads and operations are proxied to real elements.
++ - when the pads are not part of the same bin, network
++ transparent ghostpads are created to connect them.
++ - bin has host property to indicate where it should
++ run.
++
++2) netpipeline
++
++ - synchronizes different netbins, this means distributing
++ the same element base time to the remote bins.
++ - clocks master/slave is set up.
++
++3) netpad
++
++ - all pad operations are proxied to peer pad using
++ a network protocol, possibly selectable from RTP/TCP/....
++ Serialisation of buffers and events are to be considered
++ but also methods with their arguments. A generator would
++ not be too bad to automate this.
++ - the implementation would be fairly similar to the
++ ghostpad implementation.
++ - This includes event passing (bidirectional) and
++ data passing (unidirectional). Some events have to pass
++ in parallel with the datastream so the event path should
++ use a different connection.
++
++4) GStreamer deamon
++
++ - each host has to run a deamon that listens for
++ commands and creates elements/pipelines and performs all
++ operations on the real pipeline.
++
++Other stuff
++-----------
++
++ - what about migrating elements from one host to another. This
++ would happen when an element is removed form a bin into another
++ bin.
++
++ - do we have/need a fast protocol for stuff on the same machine or
++ will regular network connections work fine?
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/padprobes gstreamer-0.10.23/docs/random/wtay/padprobes
+--- gstreamer-0.10.23.orig/docs/random/wtay/padprobes 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/padprobes 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,14 @@
++PadProbes
++---------
++
++Required functionality
++
++ - get notification of data passing on arbitrary pad
++ - posibility to drop data
++ - posibility to change/inspect data
++ - single shot probe
++ - filter on events/buffers?
++ - filter on timestamp?
++ - filter on types of events?
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/performance gstreamer-0.10.23/docs/random/wtay/performance
+--- gstreamer-0.10.23.orig/docs/random/wtay/performance 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/performance 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,85 @@
++Fixing Performance
++------------------
++
++1) Observations
++
++ The following observations are made when considering the current (17/11/2004)
++ problems in gstreamer.
++
++ - startup time.
++ Most of the time is spend in reading the xml registry. Several methods exist
++ for not using a registry (see testsuite/plugin/).
++ Since registries are pluggable, one can also write a binary registry which
++ should significantly reduce the size and the load time.
++
++ - Performance in state changes
++ State changes are pretty heavy currently because negotiation happens at
++ each state change. The PAUSED->PLAYING state change in particular is
++ too heavy and should be made more 'snappy'.
++
++ - Performance in data passing.
++ Too much checking is done in the push/pull functions. Most of these checks
++ can be performed more efficiently in the plugins, like checking if the
++ element is sufficiently negotiated. The discont event 'invent' hack used
++ for fixing the synchronisation has to go away.
++
++ We also propose a get_range based method for pads so that random-access
++ in file-based sources can happen more efficiently (typical for muxers).
++
++ - Scheduling overhead.
++ The current default opt scheduler has extensive data-structures and does
++ uses fairly complicated algorithms for grouping and scheduling elements.
++ This has performance impact on pipeline constructions and pipeline
++ execution.
++
++ - Events in dataflow.
++ Because events are put inside the dataflow, a typical chain function has
++ to check if the GstData object is an event of a buffer.
++
++
++2) Proposed solutions
++
++ - startup time.
++ Volunteers to implement a binary registry?
++
++ - The changes listed in the separate document 'threading' will greatly
++ reduce the number of negotiation steps during state changes. It will
++ also reduce the latency between PAUSED<->PLAYING since it basically
++ involves unlocking a mutex in the sinks.
++
++ - adding return values to push/pull will offload some checks to the plugins
++ that can more efficiently and more accuratly handle most error cases.
++ With the new sync model in 'threading' it is also not needed to have
++ the 'invented' events in the pull function.
++
++ - The following scheduling policies should be made possible for pads:
++
++ 1) get_range <-> pull-range-based
++ 2) get <-> pull based
++ 3) push <-> chain-based
++
++ The scheduling policies are listed in order of preference. A pad should
++ export what scheduling it supports and the core will select what
++ scheduling method to use. It is possible for a pad to support more than
++ one scheduling method.
++
++ It is possible that two elements cannot connect when they do not support
++ compatible scheduling policies. We require that pull-based pads also
++ support the chain based methods, at minimal, using a helper function to
++ queue a buffer and that get-based pads also support a push based implementation.
++
++ - With the changes listed in 'threading' the scheduler will be a lot more
++ simple since it does not have to keep track of groups and connected
++ elements. Starting and scheduling the pipeline will be a matter of
++ starting the source/loop GstTasks and they will from there on take
++ over.
++
++ - move events out of the dataflow. Different methods will be used to
++ send/receive events. This will also remove some of the checks in
++ the push/pull functions. Note that plugins are still able to serialize
++ buffers and events because they hold the streaming lock.
++
++3) detailed explanation
++
++ TO BE WRITTEN
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/pipelineinfo gstreamer-0.10.23/docs/random/wtay/pipelineinfo
+--- gstreamer-0.10.23.orig/docs/random/wtay/pipelineinfo 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/pipelineinfo 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,266 @@
++In this document we describe how we can obtain various properties
++of the pipeline we are running.
++
++we have 5 possible ways to get information, each one of these
++methods focus on one particular property of the pipeline.
++
++ - caps: this is a description of the media type that flows between
++ 2 pads.
++ - metadata: non essential extra (human readable) information about
++ the stream, like author, copyright, name etc..
++ - streaminfo: information about the stream as encoded into the
++ stream itself.
++ - pad/element queries: information about the stream as it is being
++ processed.
++ - pad/element convert: information about the relation between formats
++ in a streams as it is being processed.
++
++note that element properties are not included in this list. Element
++properties are only used to configure the codec/element.
++
++caps, metadata, streaminfo are supposed to remain fairly static during
++the stream. The queries/converts can be done on demand. The reason
++for this is that caps/metadata/streaminfo is quite expensive and
++could degrade pipeline performance.
++
++
++Caps.
++-----
++
++Caps are automatically set on pads by the core when two pads agree
++on a media type. This automatically means that the caps are fixed.
++
++Since caps is a property of the pad and the g_object_notify() mechanism
++is used to signal a change, the user can either connect a "notify"
++signal handler to the pad or connect to the "deep_notify" signal on
++a parent pipeline.
++
++The caps notifications are useful if you want to know what kind of
++media is passing through pads. You can, for example, report to the
++user how the video or audiosink is configured or what kind of
++media some plugin is producing/accepting.
++
++So, always use the caps to find out the channels/samplerate/size
++of the media.
++
++
++Metadata
++--------
++
++Metadata is a GstCaps element property (named "metadata") that contains
++additional information encoded into the stream that doesn't say anything
++about the media type of the stream itself.
++
++Metadata are typically human readable information like author, copyright,
++title, ... and can be displayed by the application as-is.
++
++An element with a "metadata" property is supposed to g_object_notify that
++property when the metadata changes so that the app can connect a signal
++handler to the property or use the "deep_notify" signal to get the
++notification.
++
++
++Streaminfo
++----------
++
++Streaminfo is a GstCaps element property (named "streaminfo") that contains
++additional information about the stream that is not stricly required to
++specify the media type of the stream.
++
++Streaminfo is typically the length, bitrate, framerate, flags, ... of the
++stream.
++
++It is important to note that this information should be derived from the
++stream itself and might not be correct for the pipeline being processed.
++Let's illustrate this with an example:
++
++ - an mp3 stream has an id3 tags that contains the length of the stream
++ (TLEN).
++ - we cut the mp3 stream in half
++
++ The actual length doesn't match the stated length as encoded in the id3
++ tags, so the TLEN tag should be put in the streaminfo and the actual
++ length should be queried with a pad_query.
++
++So, be careful when showing streaminfo as-is in an app.
++
++Queries
++-------
++
++Queries can be performed on pads and elements and are used to get
++information about the current stream. The value is a single gint64
++in a specific format.
++
++example:
++
++ - the query (GST_QUERY_TOTAL, GST_FORMAT_TIME) will return the total
++ amount of time this pad/element will run.
++
++ - the query (GST_QUERY_POSITION, GST_FORMAT_UNITS) will return the
++ current position of the stream expressed in units (units are samples,
++ frames, bytes, ... depending on the media type of the stream)
++
++two methods exist to perform a query:
++
++ - gboolean gst_pad_query (GstPad *pad, GstQueryType type,
++ GstFormat *format, gint64 *value);
++
++and:
++
++ - gboolean gst_element_query (GstElement *element, GstQueryType type,
++ GstFormat *format, gint64 *value);
++
++if you want to get the total duration of a stream or the current position,
++you need to use a pad query. A pad query can fail (method returns FALSE),
++this usually means that the duration is not known or that not enough data
++has been processed to report the correct value.
++
++the possible queries that can be performed on a pad/element can be obtained
++with
++
++ - const GstQueryType* gst_pad_get_query_types (GstPad *pad);
++
++and
++
++ - const GstQueryType* gst_element_get_query_types (GstElement *element);
++
++These functions return an array of GstQueryTypes (last element == 0). you
++can loop over the array to see what is supported or do
++
++ - gboolean gst_queries_contains (const GstQueryType *types, GstQueryType type);
++
++to see if a specific format is contained in the list.
++
++The value reported by a pad query can be considered correct or
++as-good-as-can-be. Elements that support pad queries must do the best
++they can to report correct values.
++
++
++Convert
++-------
++
++The convert functions are used to query an element/pad for the relationship
++between two formats that it supports. For example:
++
++suppose we want to know how many frames a particular video decoder will
++produce in one second, we ask it to convert its concept of 1 SECOND into
++1 UNIT (frames in the context of video). so,
++
++ GstFormat format = GST_FORMAT_UNITS;
++
++ res = gst_pad_convert (pad, GST_FORMAT_TIME, GST_SECOND,
++ &format, &value);
++
++if res == TRUE, value will contain the framerate of the video, of course
++this framerate will only contain the integral part. If you want more
++accuracy, use 1000 * GST_SECOND and divide the result by 1000 to get
++a fractional part.
++
++All other neat things can be done too, look at the typical cdplayer
++plugin for example. It defines a new format "track". Now you can
++ask it to convert a TRACK to TIME like this:
++
++
++ GstFormat format = GST_FORMAT_TIME;
++ track_format = gst_format_get_by_nick ("track");
++ res = gst_pad_convert (pad, track_format, 1,
++ &format, &value);
++
++
++This will convert 1 track to a time. of course we didn't (couldn't) specify
++which track, but that's not a problem if you understand how the stream is
++divided into different formats:
++
++Take the total stream as containing bytes (indicated with + in figure) we
++can subdivide the (byte)stream in different formats.
++
++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ... bytes
++! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ... samples (units)
++! ! ! ! ... buffers
++! ! ! ... time
++! ! ... track
++
++The raw bytestream can be grouped in samples for example (for 16 bit stereo
++int audio, 4 bytes == 1 sample) or we can divide it into time
++(44100 samples == 176400 bytes == 1 second) or into tracks
++(1 track could be 17640000 bytes or 100 seconds or 4410000 samples)
++
++It is important to know that the stream starts at position 0 (for all formats)
++and ends at position X (expressed in a specific format). now take this stream
++divided into the track format:
++
++0 200 500 700 1000
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .. bytes
++! track0 ! track1 ! track2 ! track3 ! ...
++
++if we now perform a pad convert from 100 bytes to the track format, we
++get the value 0, as the region 0-100 bytes is contained in track0.
++if we perform a pad convert from 600 bytes to track, we get the value
++2, as track0->track2 contains the bytes 0-500.
++
++We can also do: convert track1 to bytes, then we get 200. If we do
++convert track2 to bytes, we get 500. Note that the conversions are
++always performed relative to 0, so if we convert track2 to bytes, we
++always get the number of bytes from track0->track2.
++
++If we want to get the number of bytes of one particular track, we have
++to substract two convert values. Look at the folowing figure to understand
++this. The --- defines the region we want to convert.
++
++
++0 200 500 700 1000
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .. bytes
++! track0 ! track1 ! track2 ! track3 ! ...
++
++----------- track1 -> bytes (1) (size of track0)
++
++---------------------- track2 -> bytes (2) (size of track0 and track1)
++
++ ----------- (2) - (1) = total bytes for track 1
++
++Another example would be to get the bitrate of a decoder plugin, consider the
++following example:
++
++ (------------)
++ ! mad !
++ - sink src -
++ (------------)
++
++The element has a sinkpad that will take N bytes as input to produce M
++samples (units) on its srcpad.
++The rate at which it takes bytes is defined as the byterate of the
++stream (bitrate == byterate * 8). So, we do:
++
++ GstFormat format = GST_FORMAT_BYTES;
++ gint64 value;
++
++ gst_pad_convert (mad->sinkpad, GST_FORMAT_TIME, GST_SECOND,
++ &format, &value);
++
++..and we get the number of bytes this plugin takes in each second.
++Again, note that this value is relative to 0, you can get an average
++of a specific period by using the same substract trick as above.
++
++
++Element Properties
++------------------
++
++Element properties are used to configure an element. They should not be
++used to describe media info, metadata fields, streaminfo fields or anything
++other that doesn't involve codec configuration.
++
++Several reasons:
++
++ - metadata requires dynamic properties (one for each tag). This cannot be done
++ with GObject properties.
++ - you cannot signal a logical group of related properties (exposing stuff like
++ samplerate/channels/encoding/... in different element properties is not a
++ good idea.
++ - stuff like length an position depend on the pads of the element, you cannot
++ sanely expose a property for each pad to describe this.
++ - element properties can only report stuff with one type. If your property
++ exposes somthing like "total_length", you cannot make it both report this
++ in time/bytes/samples/frames...
++ - impossible to sanely implement convert with element properties.
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/player.fig gstreamer-0.10.23/docs/random/wtay/player.fig
+--- gstreamer-0.10.23.orig/docs/random/wtay/player.fig 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/player.fig 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,33 @@
++#FIG 3.2
++Landscape
++Center
++Metric
++A4
++100.00
++Single
++-2
++1200 2
++2 2 0 1 0 6 50 0 20 0.000 0 0 -1 0 0 5
++ 5895 3465 8460 3465 8460 5175 5895 5175 5895 3465
++2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
++ 4905 1935 8640 1935 8640 5310 4905 5310 4905 1935
++2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
++ 2610 1935 4815 1935 4815 5310 2610 5310 2610 1935
++2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
++ 495 675 8685 675 8685 5400 495 5400 495 675
++2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
++ 675 1935 2430 1935 2430 3465 675 3465 675 1935
++4 0 0 50 0 0 12 0.0000 4 180 615 6210 3915 GstPlay\001
++4 0 0 50 0 0 12 0.0000 4 180 1485 6480 4455 - GStreamer (glib2)\001
++4 0 0 50 0 0 12 0.0000 4 180 1470 5130 2250 Bonobo Component\001
++4 0 0 50 0 0 12 0.0000 4 135 1275 5130 2700 - sliders/buttons\001
++4 0 0 50 0 0 12 0.0000 4 135 1260 5130 2925 - Gtk/Gnome etc\001
++4 0 0 50 0 0 12 0.0000 4 180 1245 5130 3150 - uses libgstplay\001
++4 0 0 50 0 0 12 0.0000 4 180 1095 2700 945 GstMediaPlay\001
++4 0 0 50 0 0 12 0.0000 4 180 1785 2745 1170 - app using components\001
++4 0 0 50 0 0 12 0.0000 4 180 1440 2700 2160 Bonobo component\001
++4 0 0 50 0 0 12 0.0000 4 180 1035 2700 2610 - playlist etc..\001
++4 0 0 50 0 0 12 0.0000 4 180 1395 855 2160 Other components\001
++4 0 0 50 0 0 12 0.0000 4 135 705 855 2610 - encoder\001
++4 0 0 50 0 0 12 0.0000 4 135 540 855 2835 - editor\001
++4 0 0 50 0 0 12 0.0000 4 60 240 855 3060 - ...\001
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/plugin_guidelines gstreamer-0.10.23/docs/random/wtay/plugin_guidelines
+--- gstreamer-0.10.23.orig/docs/random/wtay/plugin_guidelines 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/plugin_guidelines 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,295 @@
++
++This short document gives some guidelines to plugin writers.
++
++
++chain-based plugins
++===================
++
++ - the plugin has a chain function on each sink pad (can be the same function)
++
++!
++! chain (GstPad *pad, GstBuffer *buffer)
++! {
++! MyElement *elem = MY_ELEMENT (gst_pad_get_parent (pad));
++! GstBuffer *new_buffer;
++!
++! ...
++! (process the buffer)
++! ...
++!
++! /* you can push as many buffers (0 or more) as you want */
++! while (!done) {
++! ...
++! (process some more
++! ...
++! gst_pad_push (elem->some_sink_pad, new_buffer);
++! ...
++! /* if you're like going to send a large amount of buffers
++! * it's a good idea to call _yield from time to time after
++! * the buffer has been pushed */
++! (optional gst_element_yield (GST_ELEMENT (elem)); )
++! }
++! }
++!
++
++ - chain based functions are usually easy and recommended.
++ - use gst_element_yield if you are going to push a lot of buffers.
++
++
++
++loop-based plugins
++==================
++
++ - one loop function for the element.
++ - required for bytestream based plugins.
++
++simple case
++-----------
++
++ - one pull at the start
++
++ - if you do something like this, you really should consider using a
++ chain function as it can be significantly optimised by the scheduler.
++
++!
++! loop (GstElement *element)
++! {
++! MyElement *elem = MY_ELEMENT (element);
++! GstBuffer *buffer;
++! GstBuffer *new_buffer;
++!
++! buffer = gst_pad_pull (elem->sinkpad);
++!
++! ...
++! (do something)
++! ...
++!
++! /* you can push as many buffers (0 or more) as you want */
++! while (!done) {
++! ...
++! (process some more
++! ...
++! gst_pad_push (elem->some_sink_pad, new_buffer);
++! ...
++! /* if you're like going to send a large amount of buffers
++! * it's a good idea to call _yield from time to time after
++! * the buffer has been pushed */
++! (optional gst_element_yield (GST_ELEMENT (elem)); )
++! }
++! }
++!
++
++DONT!!
++
++- infinite loop
++
++!
++! loop (element)
++! {
++! while (TRUE) {
++! ...
++! _pull ()
++! ...
++!
++! ...
++! _push ()
++! ...
++! }
++! }
++!
++
++* you can fix this by either:
++
++ - setting the GST_ELEMENT_INFINITE_LOOP flag on the element. this is
++ not recommended, if all plugins in the pipeline (or depending on the
++ pipeline, some plugins) have this flag, the pipeline will not run.
++ - calling break; from time to time to get out of the loop. (duh, then
++ it's not an infinite loop anymore). beware that the next time the loop
++ function is called, it will be started from the top.
++ - calling gst_element_yield() from time to time (see NOTES).
++ - this is fine (albeit rather useless, use a chain function):
++ !
++ ! loop (element)
++ ! {
++ ! ...
++ ! _pull ()
++ ! ...
++ !
++ ! ...
++ ! _push ()
++ ! ...
++ ! }
++ !
++ - so is this (albeit rather useless, consider removing the while and the _yield):
++ !
++ ! loop (element)
++ ! {
++ ! while (TRUE) {
++ ! ...
++ ! _pull ()
++ ! ...
++ !
++ ! ...
++ ! _push ()
++ ! ...
++ ! gst_element_yield (element);
++ ! }
++ ! }
++ !
++
++
++DONT!!
++
++- allocate data, loop, free data
++
++!
++! loop (element)
++! {
++!
++! (my funky malloc)
++!
++! while (TRUE) {
++!
++! ...
++! _pull ()
++! ...
++!
++! ...
++! _push ()
++! ...
++!
++! _yield ()
++! }
++!
++! (my funky free)
++!
++! }
++!
++
++ - the free will NEVER happen!.
++
++* You can fix this by:
++
++ - allocating/freeing data in the state change function
++ - you could think the following code would work too:
++ !
++ ! (*WRONG* example follows)
++ !
++ ! loop (element)
++ ! {
++ !
++ ! (my funky malloc)
++ !
++ ! while (TRUE) {
++ !
++ ! ...
++ ! _pull ()
++ ! if (EOS)
++ ! break;
++ !
++ ! ...
++ ! _push ()
++ ! ...
++ !
++ ! _yield ()
++ ! }
++ !
++ ! (my funky free)
++ !
++ ! }
++ !
++ but it'll only free the data if the pipeline was shut down with
++ and EOS so don't try it. Besides, on EOS, a state change will happen
++ anyway so free the data there.
++
++
++bytestream/multiple pull case
++-----------------------------
++
++ - same as the simple case, but you can't use a chain based function unless
++ you want to make things a little harder then they should be.
++
++
++complicated case
++----------------
++
++ - push and pull are completely mixed.
++ - the flow is usually something like this:
++
++!
++! loop (element)
++! {
++!
++! while (TRUE) {
++!
++! while (something) {
++! ...
++! do some _pull ()
++! ...
++! do some _push ()
++! ...
++! while (something_else) {
++! ...
++! if (testing)
++! do some _pull ()
++! ...
++! do some _push ()
++! }
++! }
++!
++! while (something_useful) {
++! ...
++! _push ()
++! ...
++! }
++! }
++! }
++!
++(example made complicated on purpose, but vorbisdec comes close)
++
++ - you cannot call break to avoid infinite loops and there are loops that
++ take a significant amount of time to execute, possibly pushing/pulling
++ a lot of buffers.
++
++* You can fix this by:
++
++ - inserting gst_element_yield () in sane places, don't exagerate because
++ every yield can potentially never return so you need to keep track of
++ allocations (see the NOTES below).
++
++
++
++NOTES:
++======
++
++ - a call to _yield() can never return. if you have data allocated on the
++ stack before the yield, keep a pointer to it in the element struct
++ and free it in the state change function.
++
++
++IMPLEMENATION DETAILS
++=====================
++
++The infinite loops are only problematic if the scheduler chooses to select
++the plugin as an entry point in the chain. _yield() will be a nop if this is
++not the case. The scheduler will not select plugins with the INFINITE_LOOP
++flag set as entries in a chain.
++
++A _yield in an entry will hand over control to the main thread context, allowing
++state changes and other actions to be performed. It will basically exit the
++_iterate() function. spending a long time in a loop will degrade app responsiveness
++because _iterate will take a long time.
++
++Calling yield, pulling, pushing can potentially never return because a state change
++might have happened, killing off execution of the plugin. pulling/pushing buffers
++will cause no leaks in this case because the core will free pending buffers in a
++state change to READY. The plugin must free allocated data/buffers itself in the state
++change function if the yield didn't retrun.
++
++
++
++
++
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/poll-timeout gstreamer-0.10.23/docs/random/wtay/poll-timeout
+--- gstreamer-0.10.23.orig/docs/random/wtay/poll-timeout 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/poll-timeout 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,123 @@
++WITH LOCK
++*********
++
++create clock id:
++
++ id->state = OK;
++
++
++waiting for id:
++
++ lock
++ /* once unscheduled, the id cannot be used anymore */
++ while (id->state != unscheduled) {
++ id->state = busy;
++ unlock
++
++ ret = gstpoll (timeout);
++
++ lock
++ if (id->state == unscheduled) {
++ /* id became unscheduled, read the fd and broadcast */
++ read (fd)
++ cond_broadcast ()
++ }
++ else {
++ if (ret != 0) {
++ /* some other id got unlocked */
++ /* mark ourselves as EARLY, we release the lock and we could be
++ * unscheduled ourselves but we don't want the unscheduling thread
++ * to write on the fd */
++ id->state = EARLY;
++ /* wait until it reads the fd and signals us */
++ cond_wait ()
++ }
++ else {
++ /* we timed out */
++ id->state = OK | EARLY;
++ }
++ }
++ }
++ unlock
++ return id->state;
++
++
++unschedule id:
++
++ lock
++ /* if it's busy waiting in poll, write to the fd */
++ if (id->state == busy) {
++ write (fd)
++ }
++ /* when it leaves the poll, it'll detect the unscheduled. */
++ id->state = unscheduled;
++ unlock
++
++
++
++ATOMIC
++******
++
++create clock id:
++
++ id->state = OK;
++
++
++waiting for id:
++
++ /* once state changes to != OK, the id cannot be used anymore */
++ while (g_atomic_int_compare_and_exchange (&id->state, OK, BUSY) {
++
++ ret = gstpoll (timeout);
++
++ /* two things can happen here, either the entry is BUSY or UNSCHEDULED,
++ * first check if it was busy. */
++ if (g_atomic_int_compare_and_exchange (&id->state, BUSY, OK) {
++ /* we got unscheduled, see if it was because we timed out or some other
++ * id got unscheduled */
++ if (ret != 0) {
++ if (g_atomic_int_get (&waiters) > 0) {
++ lock
++ /* some other id got unlocked */
++ /* wait until it reads the fd and signals us */
++ while (waiters)
++ cond_wait ()
++ unlock
++ }
++ }
++ else {
++ /* we timed out update the status. */
++ id->state = OK | EARLY;
++ break;
++ }
++ }
++ else if (g_atomic_int_get (&id->state) == UNSCHEDULED) {
++ /* id became unscheduled, read the fd and broadcast */
++ lock
++ read (fd)
++ g_atomic_int_dec (&waiters);
++ cond_broadcast ()
++ unlock
++ break;
++ }
++ else {
++ g_assert_not_reached ();
++ }
++ }
++
++ return id->state;
++
++
++unschedule id:
++
++ if (g_atomic_int_compare_and_exchange (&id->state, BUSY, UNSCHEDULED) {
++ /* if it's busy waiting in poll, write to the fd */
++ lock
++ g_atomic_int_inc (&waiters)
++ write (fd)
++ unlock
++ }
++ else {
++ /* was not waiting, just mark unscheduled */
++ g_atomic_int_set (id->state, UNSCHEDULED);
++ }
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/qos gstreamer-0.10.23/docs/random/wtay/qos
+--- gstreamer-0.10.23.orig/docs/random/wtay/qos 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/qos 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,6 @@
++Quality-of-Service (QoS)
++------------------------
++
++Timestamps are used in the pipeline to ensure timely delivery
++of media.
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/registry gstreamer-0.10.23/docs/random/wtay/registry
+--- gstreamer-0.10.23.orig/docs/random/wtay/registry 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/registry 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,64 @@
++Requirements
++------------
++
++- plugable backends:
++
++ - XML
++ - flat file
++ - GConf/bonobo conf
++ - web registry
++ - in memory (trivial?)
++ - SQL backend (gda?)
++
++- provide API to the core to load/inspect/save plugins.
++- provide user/system registry
++- provide combination of backends
++- provide backend specific queries
++
++user/system registry
++--------------------
++There are two be two registries on the system. One system registry and one user registry.
++The user registry should be queried first, then if that doesn't exist or don't contain any
++plugins able to handle the mediatype it should fall back to system registry.
++
++model:
++------
++
++registry_pool
++ !
++ !---> registry (name, priority)
++ !
++ !
++ !---> registry (name, priority)
++ ! !
++ ! !-> plugin
++ ! !
++ ! !-> plugin
++ ! ... !
++ ! !-> feature ...
++ !
++ ...
++
++
++A registrypool holds a list of registries each with a priority
++
++A registry contains a list of plugins (or libraries)
++
++A plugin contains a list of features (elementfactories, typefacories, ...)
++
++Loading the registry will do
++
++ - instantiate empty GstPlugin objects (loaded flag == FALSE)
++ - instantiate empty plugin features
++
++
++
++
++
++
++
++API
++---
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/rwlocks gstreamer-0.10.23/docs/random/wtay/rwlocks
+--- gstreamer-0.10.23.orig/docs/random/wtay/rwlocks 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/rwlocks 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,33 @@
++***********************************************
++
++typedef struct {
++ int pre_count;
++ int post_count;
++ Mutex *lock;
++} RWLock;
++
++
++reader:
++
++ retry:
++ post = atomic_get (lock->post_count);
++
++ ... do read ...
++
++ if (atomic_get (lock->pre_count) != post) {
++ /* wait for writer to finish then retry */
++ lock (lock->mutex);
++ unlock (lock->mutex);
++ goto retry;
++ }
++
++
++writer:
++
++ lock (lock->mutex);
++ atomic_inc (lock->pre_count);
++
++ ... update ...
++
++ atomic_inc (lock->post_count);
++ unlock (lock->mutex);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/scheduling_ideas gstreamer-0.10.23/docs/random/wtay/scheduling_ideas
+--- gstreamer-0.10.23.orig/docs/random/wtay/scheduling_ideas 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/scheduling_ideas 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,537 @@
++Element types
++-------------
++
++SOURCES
++-------
++
++* never chain-based
++* have no sinkpads
++
++1) get based src
++
++ (----------)
++ ! fakesrc !
++ ! src- (get based)
++ (----------)
++
++ * no sinkpads
++ * srcpad(s) that are get-based
++
++2) loop based src
++
++ (----------)
++ ! fakesrc !
++ ! src- (loop based)
++ (----------)
++
++ * no sinkpads
++ * element is loop-based
++ * data is pushed on the srcpad(s)
++
++FILTERS
++-------
++
++3) chain based filter
++
++ (----------)
++ ! identity !
++ -sink src-
++ (----------)
++
++ * sinkpad(s) have a chain function
++ * srcpad(s) push data
++
++4) loop-based filter
++
++ (----------)
++ ! identity !
++ -sink src-
++ (----------)
++
++ * element is loop-based
++ * data is pushed on the srcpads
++ * data is pulled from sinkpad(s)
++
++
++SINKS
++-----
++
++5) chain based sink
++
++ (----------)
++ ! fakesink !
++ -sink !
++ (----------)
++
++ * sinkpad(s) have a chain function
++ * no srcpads
++
++6) loop-based sink
++
++ (----------)
++ ! fakesink !
++ -sink !
++ (----------)
++
++ * element is loop-based
++ * data is pulled from sinkpad(s)
++
++
++DECOUPLED
++---------
++
++7) decoupled element
++
++
++ (----------)
++ ! queue !
++ -sink src-
++ (----------)
++
++ * sinkpad(s) have chain function
++ * srcpad(s) have get function
++ * never loop-based
++ * always acts like a chain-based sink for upstream elements
++ * always acts like a get-based src for downstream elements
++ * are not added to a group, but marked as an entry point in
++ case it acts as a src element
++
++
++Connection types
++----------------
++
++1) get based src
++2) loop based src
++3) chain based filter
++4) loop-based filter
++5) chain based sink
++6) loop-based sink
++7) decoupled element
++
++
++ ! 1 ! 2 ! 3 ! 4 ! 5 ! 6 ! 7 !
++---+-----+-----+-----+-----+-----+-----+-----+
++ 1 ! X ! X ! A ! C ! A ! C ! A !
++ ! ! ! ! ! ! ! !
++ 2 ! X ! X ! B ! F ! B ! F ! B !
++ ! ! ! ! ! ! ! !
++ 3 ! X ! X ! D ! E ! D ! E ! D !
++ ! ! ! ! ! ! ! !
++ 4 ! X ! X ! B ! F ! B ! F ! B !
++ ! ! ! ! ! ! ! !
++ 5 ! X ! X ! X ! X ! X ! X ! X !
++ ! ! ! ! ! ! ! !
++ 6 ! X ! X ! X ! X ! X ! X ! X !
++ ! ! ! ! ! ! ! !
++ 7 ! X ! X ! A ! C ! A ! C ! X !
++ ! ! ! ! ! ! ! !
++
++
++A)
++
++ src -> sink
++ src -> filter
++ src -> decoupled
++ decoupled -> sink
++ decoupled -> filter
++
++ - get based source
++ - chain based sink
++
++ * one group
++ * src at start of group and entry point
++ * _get from src, push to sink
++
++ (-group1---------------)
++ ! !
++ ! *fakesrc -> fakesink !
++ (----------------------)
++
++
++B)
++
++ src -> sink
++ src -> filter
++ src -> decoupled
++ filter -> sink
++ filter -> filter
++ filter -> decoupled
++
++ - loop based source/filter
++ - chain based sink/filter/decoupled
++
++ * one group
++ * src/filter at start of group and entry point
++ * loop on src, chainhandler set to chain function
++
++ (-group1----------------)
++ ! !
++ ! %*fakesrc -> fakesink !
++ (-----------------------)
++
++
++C)
++
++ src -> sink
++ src -> filter
++ decoupled -> sink
++ decoupled -> filter
++
++ - get based source/decoupled
++ - loop based sink/filter
++
++ * one group
++ * loop based element is entry point
++ * loop on sink/filter, gethandler set to getfunction
++
++ (-group1----------------)
++ ! !
++ ! fakesrc -> %*fakesink !
++ (-----------------------)
++
++D)
++
++ filter -> filter
++ filter -> sink
++ filter -> decoupled
++
++ - chain based filter
++ - chain based filter/sink/decoupled
++
++ * one group is created to hold the two elements
++ * no entry point
++ * chainhandler set to peer chainfunction
++
++ (-group1----------------)
++ ! !
++ ! identity -> identity !
++ (-----------------------)
++
++E)
++
++ filter -> filter
++ filter -> sink
++
++ - chain based filter
++ - loop based filter/sink
++
++ * two groups
++ * group is created for src element if needed
++ * chainhandler of loop based element set to loop wrapper, control is
++ handed to the peer group
++ * gethandler of loop based element set to get wrapper
++
++ (-group1---) (-group2------)
++ ! ! ! !
++ ! identity ---> %*identity !
++ (----------) (-------------)
++
++
++F)
++
++ src -> filter
++ src -> sink
++ filter -> filter
++ filter -> sink
++
++ - loop based filter/src
++ - loop based filter/sink
++
++ * two groups
++ * two entry points
++ * chainhandler set to loop wrapper
++ * gethandler set to get wrapper
++
++ (-group1-----) (-group2------)
++ ! ! ! !
++ ! %*identity ---> %*identity !
++ (------------) (-------------)
++
++
++Grouping
++--------
++
++ * a group has at most one loop based element
++ * elements in a group are sorted, src elements first (not mandatory)
++ * a group has one cothread
++ * a group is created immediatly for loop based elements, all other elements
++ are added to a group when a pad connection is made
++ * get-based plugins are put in the same group as a peer loop based element
++ * chain based elements are put in the same group as sink peer elements
++ * entry point in the group is:
++ - loopbased element
++ - first src element if no loopbased element exists in the group
++
++Result: you end up with a group of connected elements with either:
++ - a loop based plugin as the entry point
++ - a get based plugin as the entry point
++
++Scheduling the group is a matter of starting the cothread and calling
++the loop function or doing a _get/_push on a srcpad.
++
++
++other examples of groups:
++-------------------------
++
++ % = loop based
++ * = entry point of group
++
++.
++ (-group1---------------)
++ ! !
++ ! *fakesrc -> fakesink !
++ (----------------------)
++
++.
++ (-group1---------------------------------------)
++ ! !
++ ! *fakesrc -> identity -> identity -> fakesink !
++ (----------------------------------------------)
++
++.
++ (-group1-----------------------------------------)
++ ! !
++ ! fakesrc -> %*identity -> identity -> fakesink !
++ (------------------------------------------------)
++
++.
++ (-group1---------------) (-group2-----------------)
++ ! ! ! !
++ ! *fakesrc -> identity --> *%identity -> fakesink !
++ (----------------------) (------------------------)
++
++.
++ (-group1------------------------------------)
++ ! !
++ ! *fakesrc -> tee --> identity -> fakesink !
++ ! --> identity -> fakesink !
++ (-------------------------------------------)
++
++.
++ (-group1------------------------------------)
++ ! !
++ ! *fakesrc -> tee --> identity -> fakesink !
++ (--------------!----------------------------)
++ v
++ (-group2-----------------)
++ ! !
++ ! *%identity -> fakesink !
++ (------------------------)
++
++.
++ (-group1----------) (-group2-----------------)
++ ! ! ! !
++ ! *fakesrc -> tee --> *%identity -> fakesink !
++ (--------------!--) (------------------------)
++ v
++ (-group3-----------------)
++ ! !
++ ! *%identity -> fakesink !
++ (------------------------)
++
++.
++ (-group1-----------------------) (-group2----------------------)
++ ! ! ! !
++ ! filesrc -> *%mpegdemux --> queue* -> mpeg2dec -> xvideosink !
++ ! ! (-----------------------------)
++ ! ! (-group3----------------------)
++ ! ! ! !
++ ! --> queue* -> mad -> osssink !
++ (------------------------------) (-----------------------------)
++
++
++Chaining
++--------
++
++ * groups that are connected end up in the same chain
++ * a group always belongs to a chain
++ * updating the chain is only needed when two groups are
++ connected with a connection of type E/F. for other
++ connection types, the group itself is updated.
++ * a chain is scheduled by scheduling a random group in the chain.
++
++
++Wrapper functions
++-----------------
++
++
++
++iterating without cothreads
++---------------------------
++
++A cothread for each group is the easiest way to schedule most of
++the pipelines. Some pipelines are however schedulable without
++any cothreads.
++
++Each group is schedulable without cothreads, one can call the
++group schedule function and be done with it. Problems arise
++one the group boundaries of connected elements, which are always
++of type E and F (chain->loop, loop->loop)
++
++We always have a producer group and a provider group in this case.
++
++chain->loop
++-----------
++
++
++
++Scheduler algorithm
++-------------------
++
++1: select (random?) group in chain
++2: schedule group
++3: on E/F connections, the get/chain wrapper is called
++ - get wrapper puts the peer element on the runqueue and
++ recursively invokes the scheduler.
++ - chain wrapper puts the buffer in the bufpen and puts
++ the peer element in the runqueue
++4: when the group is scheduled, take group from the runqueue
++ and goto 2:
++5: no more groups on the runqueue, iteration ends
++
++
++NOTES:
++
++- We need a GList instead of a single bufpen to hold buffers
++ for multi-out elements.
++
++- We probably need to set a limit on the maximum number of
++ recursions and size of the bufpen list.
++
++- elements run non-preemptively, a group is done scheduling when all
++ elements in that group complete their chain/loop function.
++
++- can we only have a stack overflow when there is a loop in the
++ pipeline? I think so.
++
++- putting groups twice on the runqueue is not a good idea, we
++ need to check a flag or something, maybe give the group a
++ higher priority?
++
++- what about starvation? We'll probably have to put the group
++ at the end of the runqueue.
++
++- multi-out elements can introduce significant latency. consider:
++
++ (-group1----------) (-group2-----------------)
++ ! ! ! !
++ ! *filesrc -> mad --> *%identity -> osssink !
++ (-----------------) (------------------------)
++
++ mad produces N output buffers, they are queued in the bufpen, when
++ group1 is done, group2 is scheduled to empty the bufpen queue.
++
++ The time it takes for the first buffer to arrive at osssink equals
++ the time needed to decode the N-1 other buffers.
++
++ Of course, given the right buffersize for filesrc, N can be reduced
++ to 1. mad can also suggest a buffersize to filesrc with the
++ BUFFER_SIZE event.
++
++
++
++Ungrouping
++----------
++
++Ungrouping might be the hardest part. especially in the case where
++an element is still running (state changes and pipeline modifications
++in element callbacks).
++
++Ungrouping involves two tasks:
++
++ - breaking up groups. This can happen when a pad connection is broken
++ so that the group contains two clusters of unconnected elements.
++ - breaking up chains. This happens when a pad connection is broken
++ so that the chains contains two clusters of unconnected groups.
++
++
++case1
++-----
++
++The most simple case is where two elements are disconnected and one
++of the elements does not belong to a group. In this case, we don't need
++to do anything at all.
++
++case2
++-----
++
++if the elements are part of different groups, we need to check if the
++chain needs to be broken. A chain is broken if it contains two sets
++of unconnected groups.
++
++To test this case, we will create a new chain and recursively move
++one of the groups with all of its connected groups to it. If the
++origial chain is empty after this operation, there was still a connection
++and the new chain replaces the old one, else we end up with two chains.
++
++case3
++-----
++
++When the elements are part of the same group we check if both elements
++still have a connection to some other element in that group. The elements
++without connections are removed from the group.
++
++It is possible that when an element still has a connection with some other
++element in the group, the group has to be split up anyway. This can happen
++in fakesrc ! indentity ! identity ! fakesink when we break the connection
++between the two identity elements. We have to be careful here in the cothread
++case that we don't take away the running cothread from under the elements.
++In the non-cothread case we can just move the elements to another new group.
++
++
++Interrupt with cothreadless optimal scheduler
++---------------------------------------------
++
++Interrupts are usually performed when a blocking _get based source or
++decoupled element is unlocked for a state change. The idea of the
++interrupt scheduler call is to return to the main execution stack frame
++ASAP so that the state change can take place. For cothread based
++implementations of the scheduler this is not a problem as one can jump
++to the main cothread context without problems. For non cothread based
++schedulers we need to follow this scheme:
++
++get <-> chain based connection.
++
++ - enter get group scheduler
++ - call _get function on source, this can block internally
++ - app performs state change, element is told to unlock itself
++ - lock inside the get based function unlocks and _get function
++ return GST_EVENT_INTERRUPT
++ - group scheduler notices the event, unrefs it and jumps out of the
++ get_group_scheduler function, a scheduler INTERRUPTED flag is set.
++
++get <-> loop based connection
++
++ - enter loop group scheduler
++ - loop based element does pull on sinkpad
++ - _get blocks
++ - app performs state change, _get is unlocked and returns
++ GST_EVENT_INTERRUPT.
++ - loop based function receives INTERRUPT event and exits its loop
++ ASAP using gst_element_interrupt.
++
++loop/chain <-> loop based connection
++
++ - when returning from the recursive call to the scheduler, the state
++ of the scheduler is checked, if it was interrupted, a
++ GST_EVENT_INTERRUPTED event is returned to the loop based element.
++ - the loop based element exits its loop ASAP.
++
++
++This technique will unwind the stack of scheduled groups ASAP and returns
++to the main execution stack frame where the iterate() function can return
++and the state change can take place.
++
++Another alternative could be implemented when the _push and _pull functions
++would return a result code...
++
++
++
++
++
++
++
++
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/states gstreamer-0.10.23/docs/random/wtay/states
+--- gstreamer-0.10.23.orig/docs/random/wtay/states 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/states 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,66 @@
++1) transitions
++--------------
++
++There are four states, NULL, READY, PAUSED, PLAYING. state transitions only
++happen from once neighbouring state to another.
++
++NULL: the element is just being created, the initial state.
++ !
++ ! the element creates all of its resources (a thread will create
++ ! its pthread etc..)
++ ! - most used by bins to set up thread context for its children
++ v
++READY: the element is ready to start processing.
++ !
++ ! the element sets up its state so it can start processing buffers.
++ ! - open devices
++ v
++PAUSED: the element is paused
++ !
++ ! the element starts spinning
++ !
++ v
++PLAYING: the element is playing
++ !
++ ! the element stops spinning
++ ! the element frees resources from other plugins (bufferpools)
++ !
++ v
++PAUSED
++ ! element removes caps from pads
++ ! reset internal state
++ ! - close devices
++ !
++ v
++READY
++ !
++ ! the element frees all of its resources (eg: pthread_join)
++ !
++ v
++NULL
++
++
++2) bin transition
++-----------------
++
++the state of a bin is equal to the maximum state of its children.
++
++
++3) interaction with the scheduler
++---------------------------------
++
++elements in the !PLAYING state are disabled in the scheduler.
++
++
++4) action that can be performed by the app in the different states
++------------------------------------------------------------------
++
++PLAYING: nothing, only iterate on the pipeline, some properties can
++ be changed.
++
++PAUSED: elements can be connected, removed, disconnected. some
++ properties can be changed
++
++READY: as in PAUSED but *all* properties can be changed.
++
++NULL: everything.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/strip_down gstreamer-0.10.23/docs/random/wtay/strip_down
+--- gstreamer-0.10.23.orig/docs/random/wtay/strip_down 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/strip_down 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,41 @@
++
++Howto strip gstreamer
++---------------------
++
++subsystems that can disabled:
++
++ * load/save (gstxml.h, various other files)
++ - no object serialisation to XML
++
++ * typefind (gsttypefind.h)
++ - typefind element is not compiled in the core
++
++ * autoplugging (gstautoplug.h)
++ - autoplugging functions not available
++
++ * parse (gstparse.h)
++ - no parsing can be done
++
++ * trace (gsttrace.h)
++ - no tracing features
++
++ * registry (gstregistry.h)
++ - can't instantiate registry objects
++ - registry pool only contains statically
++ registered plugins
++
++ * enumtypes (gstenumtypes.h)
++ - code not linked into the core
++
++ * index (gstindex.h)
++ - index plugin feature not available
++
++ * plugin (gstplugin.h, gstregistry.h, gstpluginfeature.h)
++ - can't group elementfactories in plugins
++ - no pluginfeatures
++ - no registrypool
++
++ * URI (gsturi.h)
++ - no urihandler pluginfeature
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/threading gstreamer-0.10.23/docs/random/wtay/threading
+--- gstreamer-0.10.23.orig/docs/random/wtay/threading 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/threading 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,676 @@
++Fixing Threading
++----------------
++
++1) Observations
++
++ The following observations are made when considering the current (17/11/2004)
++ problems in gstreamer.
++
++ - Bin state changes.
++ Currently the state of a bin is determined by the highest state of the
++ children, This is in particular a problem for GstThread because a thread
++ should start/stop spinning at any time depending on the state of a child.
++
++ ex 1:
++
++ +-------------------------------------+
++ | GstThread |
++ | +--------+ +---------+ +------+ |
++ | | src | | decoder | | sink | |
++ | | src-sink src-sink | |
++ | +--------+ +---------+ +------+ |
++ +-------------------------------------+
++
++ When performing the state change on the GstThread to PLAYING, one of the
++ children (at random) will go to PLAYING first, this will trigger a method
++ in GstThread that will start spinning the thread. Some elements are not yet
++ in the PLAYING state when the scheduler starts iterating elements. This
++ is not a clean way to start the data passing.
++
++ State changes also trigger negotiation and scheduling (in the other thread)
++ can do too. This creates races in negotiation.
++
++ - ERROR and EOS conditions triggering a state change
++
++ A typical problem is also that since scheduling starts while the state change
++ happens, it is possible that the elements go to EOS or ERROR before the
++ state change completes. Currently this makes the elements go to PAUSED again,
++ creating races with the state change in progress. This also gives the
++ impression to the core that the state change failed.
++
++ - no locking whatsoever
++
++ When an element does a state change, it is possible for another thread to
++ perform a conflicting state change.
++
++ - negotiation is not designed to work over multithread boundaries.
++
++ negotiation over a queue is not possible. There is no method or policy of
++ discovering a media type and then commiting it. It is also not possible to
++ tie the negotiated media to the relevant buffer.
++
++ ex1:
++ it Should be possible to queue the old and the new formats in a queue.
++ The element connected to the sinkpad of the queue should be able to
++ find out that the new format will be accepted by the element connected
++ on the srcpad of the queue, even if that element is streaming the old
++ format.
++
++ +------------------------------+
++ | GstQueue |
++ | +++++++++++++++++++++++++ |
++ -sink |B|B|B|B|B|B|A|A|A|A|A|A| src-
++ | +++++++++++++++++++++++++ |
++ +------------------------------+
++ +----------+ +----------+
++ buffers in buffers in
++ new format old format
++
++ - element properties are not threadsafe
++
++ When setting an element property while streaming, the element does no
++ locking whatsoever to guarantee its internal consistency.
++
++ - No control over streaming.
++
++ When some GstThread is iterating and you want to reconnect a pad, there
++ is no way to block the pad, perform the actions and then unblock it
++ again. This leads to thread problems where a pad is negotiation at the
++ same time that it is passing data.
++
++ This is currently solved by PAUSING the pipeline or performing the actions
++ in the same threadcontext as the iterate loop.
++
++ - race conditions in synchronizing the clocks and spinning up the pipeline.
++ Currently the clock is started as soon as the pipeline is set to playing.
++ Because some time elaspes before the elements are negotiated, autoplugged
++ and streaming, the first frame/sample almost always arrives late at the
++ sinks. Hacks exist to adjust the element base time to compensate for the
++ delay but this clearly is not clean.
++
++ - race conditions when performing seeks in the pipeline. Since the elements
++ have no control over the streaming threads, they cannot block them or
++ resync them to the new seek position. It is also hard to synchronize them
++ with the clock.
++
++ - race conditions when sending tags and error messages up the pipeline
++ hierarchy. These races are either caused by glib refcounting problems and
++ by not properly locking.
++
++ - more as changes are implemented and testcases are written
++
++2) possible solutions
++
++ - not allowing threading at all
++
++ Run the complete pipeline in a single thread. Complications to solve include
++ handling of blocking operations like source elements blocking in kernel
++ space, sink elements blocking on the clock or kernel space, etc.. In practice,
++ all operations should be made non-blocking because a blocking element can
++ cause the rest of the pipeline to block as well and cause it to miss a deadline.
++ A non-blocking model needs cooperation from the kernel (with callbacks) or
++ requires the use of a polling mechanism, both of which are either impractical
++ or too CPU intensive and in general not achievable for a general purpose
++ Multimedia framework. For this reason we will not go further with this
++ solution.
++
++ - Allow threading.
++
++ To make this work, We propose the following changes:
++
++ - Remove GstThread, it does not add anything useful in a sense that you cannot
++ arbitrarily place the thread element, it needs decoupled elements around the
++ borders.
++
++ - Simplify the state changes of bins elements. A bin or element never changes
++ state automatically on EOS and ERROR.
++
++ - Introduce the concept of the application and the streaming thread. All data
++ passing is done in the streaming thread. This also means that all operations
++ either are performed in the application thread or streaming thread and that
++ they should be protected against competing operations in other threads.
++ This would define a policy for adding appropriate locking.
++
++ - Move the creation of threads into source and loop-based elements. This will
++ make it possible for the elements in control of the threads to perform the
++ locking when needed. One particular instance is for example the state changes,
++ by creating the threads in the element, it is possible to sync the streaming
++ and the application thread (which does the state change).
++
++ - Remove negotiation from state changes. This will remove the conflict between
++ streaming and negotiating elements.
++
++ - add locks around pad operations like negotiation, streaming, linking, etc. This
++ will remove races between these conflicting operations. This will also make it
++ possible to un/block dataflow.
++
++ - add locks around bin operations like add/removing elements.
++
++ - add locks around element operations like state changes and property changes.
++
++ - add a 2-phase directed negotiation process. The source pad queries and figures
++ out what the sinkpad can take in the first phase. In the second phase it sends
++ the new format change as an event to the peer element. This event can be
++ interleaved with the buffers and can travel over queues inbetween the buffers.
++ Need to rethink this wrt bufferpools (see DShow and old bufferpool implementation)
++
++ - add a preroll phase that will be used to spin up the pipeline and align frames/samples
++ in the sinks. This phase will happen in the PAUSED state. This also means that
++ dataflow will happen in the PAUSED state. Sinks will not sink samples in the PAUSED
++ state but will complete their state change asynchronously. This will allow
++ us to have perfect synchronisation with the clock.
++
++ - a two phase seek policy. First the event travels upstream, putting all elements in
++ the seeking phase and making them synchronize to the new position. In the
++ second phase the DISCONT event signals the end of the seek and all filters can
++ continue with the new position.
++
++ - Error messages, EOS, tags and other events in the pipeline should be sent to a
++ mainloop. The app then has an in-thread mechanism for getting information about
++ the pipeline. It should also be possible to get the messages directly from the
++ elements itself, like signals. The application programmer has to know that
++ working these events come from another thread and should handle them accordingly.
++
++ - Add return values to push/pull so that errors upstream or downstream can be noted
++ by other elements so that they can disable themselves or propagate the error.
++
++
++3) detailed explanation
++
++ a) Pipeline construction
++
++ Pipeline construction includes:
++
++ - adding/removing elements to the bin
++ - finding elements in a bin by name and interface
++ - setting the clock on a pipeline.
++ - setting properties on objects
++ - linking/unlinking pads
++
++ These operations should take the object lock to make sure it can be
++ executed from different threads.
++
++ When connecting pads to other pads from elements inside another bin,
++ we require that the bin has a ghostpad for the pad. This is needed so
++ that the bin looks like a self-contained element.
++
++ not allowed:
++ +---------------------+
++ | GstBin |
++ +---------+ | +--------+ |
++ | element | | | src | |
++ sink src------sink src- ... |
++ +---------+ | +--------+ |
++ +---------------------+
++
++ allowed:
++ +-----------------------+
++ | GstBin |
++ | +--------+ |
++ +---------+ | | src | |
++ | element | | sink src- ... |
++ sink src---sink/ +--------+ |
++ +---------+ +-----------------------+
++
++ This requirement is important when we need to sort the elements in the
++ bin to perfrom the state change.
++
++
++ testcases:
++
++ - create a bin, add/remove elements from it
++ - add/remove from different threads and check the bin integrity.
++
++ b) state changes
++
++ An element can be in one of the four states NULL, READY, PAUSED, PLAYING.
++
++ NULL: starting state of the element
++ READY: element is ready to start running.
++ PAUSED: element is streaming data, has opened devices etc.
++ PLAYING: element is streaming data and clock is running
++
++ Note that data starts streaming even in the PAUSED state. The only difference
++ between the PAUSED and PLAYING state is that the clock is running in the
++ PLAYING state. This mostly has an effect on the renderers which will block on
++ the first sample they receive when in PAUSED mode. The transition from
++ READY->PAUSED is called the preroll state. During that transition, media is
++ queued in the pipeline and autoplugging is done.
++
++ Elements are put in a new state using the _set_state function. This function
++ can return the following return values:
++
++ typedef enum {
++ GST_STATE_FAILURE = 0,
++ GST_STATE_PARTIAL = 1,
++ GST_STATE_SUCCESS = 2,
++ GST_STATE_ASYNC = 3
++ } GstElementStateReturn;
++
++ GST_STATE_FAILURE is returned when the element failed to go to the
++ required state. When dealing with a bin, this is returned when one
++ of the elements failed to go to the required state. The other elements
++ in the bin might have changed their states succesfully. This return
++ value means that the element did _not_ change state, for bins this
++ means that not all children have changed their state.
++
++ GST_STATE_PARTIAL is returned when some elements in a bin where in the
++ locked state and therefore did not change their state. Note that the
++ state of the bin will be changed regardless of this PARTIAL return value.
++
++ GST_STATE_SUCCES is returned when all the elements successfully changed their
++ states.
++
++ GST_STATE_ASYNC is returned when an element is going to report the success
++ or failure of a state change later.
++
++ The state of a bin is not related to the state of its children but only to
++ the last state change directly performed on the bin or on a parent bin. This
++ means that changing the state of an element inside the bin does not affect
++ the state of the bin.
++
++ Setting the state on a bin that is already in the correct state will
++ perform the requested state change on the children.
++
++ Elements are not allowed to change their own state. For bins, it is allowed
++ to change the state of its children. This means that the application
++ can only know about the states of the elements it has explicitly set.
++
++ There is a difference in the way a pipeline and a bin handles the state
++ change of its children:
++
++ - a bin returns GST_STATE_ASYNC when one of its children returns an
++ ASYNC reply.
++
++ - a pipeline never returns GST_STATE_ASYNC but returns from the state
++ change function after all ASYNC elements completed the state change.
++ This is done by polling the ASYNC elements until they return their
++ final state.
++
++ The state change function must be fast an cannot block. If a blocking behaviour
++ is unavoidable, the state change function must perform an async state change.
++ Sink elements therefore always use async state changes since they need to
++ wait before the first buffer arrives at the sink.
++
++ A bin has to change the state of its children elements from the sink to the
++ source elements. This makes sure that a sink element is always ready to
++ receive data from a source element in the case of a READY->PAUSED state change.
++ In the case of a PAUSED->READY state, the sink element will be set to READY
++ first so that the source element will receive an error when it tries to push
++ data to this element so that it will shut down as well.
++
++ For loop based elements we have to be careful since they can pull a buffer
++ from the peer element before it has been put in the right state.
++ The state of a loop based element is therefore only changed after the source
++ element has been put in the new state.
++
++ c) Element state change functions
++
++ The core will call the change_state function of an element with the element
++ lock held. The element is responsible for starting any streaming tasks/threads
++ and making sure that it synchronizes them to the state change function if
++ needed.
++
++ This means that no other thread is allowed to change the state of the element
++ at that time and for bins, it is not possible to add/remove elements.
++
++ When an element is busy doing the ASYNC state change, it is possible that another
++ state change happens. The elements should be prepared for this.
++
++ An element can receive a state change for the same state it is in. This
++ is not a problem, some elements (like bins) use this to resynchronize their
++ children. Other elements should ignore this state change and return SUCCESS.
++
++ When performing a state change on an element that returns ASYNC on one of
++ the state changes, ASYNC is returned and you can only proceed to the next
++ state change change when this ASYNC state change completed. Use the
++ gst_element_get_state function to know when the state change completed.
++ An example of this behaviour is setting a videosink to PLAYING, it will
++ return ASYNC in the state change from READY->PAUSED. You can only set
++ it to PLAYING when this state change completes.
++
++ Bins will perform the state change code listed in d).
++
++ For performing the state change, two variables are used: the current state
++ of the element and the pending state. When the element is not performing a
++ state change, the pending state == None. The state change variables are
++ protected by the element lock. The pending state != None as long as the
++ state change is performed or when an ASYNC state change is running.
++
++ The core provides the following function for applications and bins to
++ get the current state of an element:
++
++ bool gst_element_get_state(&state, &pending, timeout);
++
++ This function will block while the state change function is running inside
++ the element because it grabs the element lock.
++ When the element did not perform an async state change, this function returns
++ TRUE immediatly with the state updated to reflect the current state of the
++ element and pending set to None.
++ When the element performed an async state change, this function will block
++ for the value of timeout and will return TRUE if the element completed the
++ async state change within that timeout, otherwise it returns FALSE, with
++ the current and pending state filled in.
++
++ The algorithm is like this:
++
++ bool gst_element_get_state(elem, &state, &pending, timeout)
++ {
++ g_mutex_lock (ELEMENT_LOCK);
++ if (elem->pending != none) {
++ if (!g_mutex_cond_wait(STATE, ELEMENT_LOCK, timeout) {
++ /* timeout triggered */
++ *state = elem->state;
++ *pending = elem->pending;
++ ret = FALSE;
++ }
++ }
++ if (elem->pending == none) {
++ *state = elem->state;
++ *pending = none;
++ ret = TRUE;
++ }
++ g_mutex_unlock (ELEMENT_LOCK);
++
++ return ret;
++ }
++
++ For plugins the following function is provided to commit the pending state,
++ the ELEMENT_LOCK should be held when calling this function:
++
++ gst_element_commit_state(element)
++ {
++ if (pending != none) {
++ state = pending;
++ pending = none;
++ }
++ g_cond_broadcast (STATE);
++ }
++
++ For bins the gst_element_get_state() works slightly different. It will run
++ the function on all of its children, as soon as one of the children returns
++ FALSE, the method returns FALSE with the state set to the current bin state
++ and the pending set to pending state.
++
++ For bins with elements that did an ASYNC state change, the _commit_state()
++ is only executed when actively calling _get_state(). The reason for this is
++ that when a child of the bin commits its state, this is not automatically
++ reported to the bin. This is not a problem since the _get_state() function
++ is the only way to get the current and pending state of the bin and is always
++ consistent.
++
++ d) bin state change algorithm
++
++ In order to perform the sink to source state change a bin must be able to sort
++ the elements. To make this easier we require that elements are connected to
++ bins using ghostpads on the bin.
++
++ The algoritm goes like this:
++
++ d = [ ] # list of delayed elements
++ p = [ ] # list of pending async elements
++ q = [ elements without srcpads ] # sinks
++ while q not empty do
++ e = dequeue q
++ s = [ all elements connected to e on the sinkpads ]
++ q = q append s
++ if e is entry point
++ d = d append e
++ else
++ r = state change e
++ if r is ASYNC
++ p = p append e
++ done
++ while d not empty do
++ e = dequeue d
++ r = state change e
++ if r is ASYNC
++ p = p append e
++ done
++ # a bin would return ASYNC here if p is not empty
++
++ # this last part is only performed by a pipeline
++ while p not empty do
++ e = peek p
++ if state completed e
++ dequeue e from p
++ done
++
++ The algorithm first tries to find the sink elements, ie. ones without
++ sinkpads. Then it changes the state of each sink elements and queues
++ the elements connected to the sinkpads.
++
++ The entry points (loopbased and getbased elements) are delayed as we
++ first need to change the state of the other elements before we can activate
++ the entry points in the pipeline.
++
++ The pipeline will poll the async children before returning.
++
++ e) The GstTask infrastructure
++
++ A new component: GstTask is added to the core. A task is created by
++ an instance of the abstract GstScheduler class.
++
++ Each schedulable element (when added to a pipeline) is handed a
++ reference to a GstScheduler. It can use this object to create
++ a GstTask, which is basically a managed wrapper around a threading
++ library like GThread. It should be possible to write a GstScheduler
++ instance that uses other means of scheduling, like one that does not
++ use threads but implements task switching based on mutex locking.
++
++ When source and loopbased elements want to create the streaming thread
++ they create an instance of a GstTask, which they pass a pointer to
++ a loop-function. This function will be called as soon as the element
++ performs GstTask.start(). The element can stop and uses mutexes to
++ pause the GstTask from, for example, the state change function or the
++ event functions.
++
++ The GstTasks implement the streaming threads.
++
++ f) the preroll phase
++
++ Element start the streaming threads in the READY->PAUSED state. Since
++ the elements that start the threads are put in the PAUSED state last,
++ after their connected elements, they will be able to deliver data to
++ their peers without problems.
++
++ Sink elements like audio and videosinks will return an async state change
++ reply and will only commit the state change after receiving the first
++ buffer. This will implement the preroll phase.
++
++ The following pseudo code shows an algorithm for commiting the state
++ change in the streaming method.
++
++ GST_OBJECT_LOCK (element);
++ /* if we are going to PAUSED, we can commit the state change */
++ if (GST_STATE_TRANSITION (element) == GST_STATE_READY_TO_PAUSED) {
++ gst_element_commit_state (element);
++ }
++ /* if we are paused we need to wait for playing to continue */
++ if (GST_STATE (element) == GST_STATE_PAUSED) {
++
++ /* here we wait for the next state change */
++ do {
++ g_cond_wait (element->state_cond, GST_OBJECT_GET_LOCK (element));
++ } while (GST_STATE (element) == GST_STATE_PAUSED);
++
++ /* check if we got playing */
++ if (GST_STATE (element) != GST_STATE_PLAYING) {
++ /* not playing, we can't accept the buffer */
++ GST_OBJECT_UNLOCK (element);
++ gst_buffer_unref (buf);
++ return GST_FLOW_WRONG_STATE;
++ }
++ }
++ GST_OBJECT_UNLOCK (element);
++
++
++
++ g) return values for push/pull
++
++ To recover from pipeline errors in a more elegant manner than just
++ shutting down the pipeline, we need more finegrained error messages
++ in the data transport. The plugins should be able to know what goes
++ wrong when interacting with their outside environment. This means
++ that gst_pad_push/gst_pad_pull and gst_event_send should return a
++ result code.
++
++ Possible return values include:
++
++ - GST_OK
++ - GST_ERROR
++ - GST_NOT_CONNECTED
++ - GST_NOT_NEGOTIATED
++ - GST_WRONG_STATE
++ - GST_UNEXPECTED
++ - GST_NOT_SUPPORTED
++
++ GST_OK
++ Data transport was successful
++
++ GST_ERROR
++ An error occured during transport, such as a fatal decoding error,
++ the pad should not be used again.
++
++ GST_NOT_CONNECTED
++ The pad was not connected
++
++ GST_NOT_NEGOTIATED
++ The peer does not know what datatype is going over the pipeline.
++
++ GST_WRONG_STATE
++ The peer pad is not in the correct state.
++
++ GST_UNEXPECTED
++ The peer pad did not expect the data because it was flushing or
++ received an eos.
++
++ GST_NOT_SUPPORTED
++ The operation is not supported.
++
++ The signatures of the functions will become:
++
++ GstFlowReturn gst_pad_push (GstPad *pad, GstBuffer *buffer);
++ GstFlowReturn gst_pad_pull (GstPad *pad, GstBuffer **buffer);
++
++ GstResult gst_pad_push_event (GstPad *pad, GstEvent *event);
++
++ - push_event will send the event to the connected pad.
++
++ For sending events from the application:
++
++ GstResult gst_pad_send_event (GstPad *pad, GstEvent *event);
++
++ h) Negotiation
++
++ Implement a simple two phase negotiation. First the source queries the
++ sink if it accepts a certain format, then it sends the new format
++ as an event. Sink pads can also trigger a state change by requesting
++ a renegotiation.
++
++ i) Mainloop integration/GstBus
++
++ All error, warning and EOS messages from the plugins are sent to an event
++ queue. The pipeline reads the messages from the queue and will either
++ handle them or forward them to the main event queue that is read by the
++ application.
++
++ Specific pipelines can be written that deal with negotiation messages and
++ errors in the pipeline intelligently. The basic pipeline will stop the
++ pipeline when an error occurs.
++
++ Whenever an element posts a message on the event queue, a signal is also
++ fired that can be catched by the application. When dealing with those
++ signals the application has to be aware that they come from the streaming
++ threads and need to make sure they use proper locking to protect their
++ own data structures.
++
++ The messages will be implemented using a GstBus object that allows
++ plugins to post messages and allows the application to read messages either
++ synchronous or asynchronous. It is also possible to integrate the bus in
++ the mainloop.
++
++ The messages will derive from GstData to make them a lightweight refcounted
++ object. Need to figure out how we can extend this method to encapsulate
++ generic signals in messages too.
++
++ This decouples the streaming thread from the application thread and should
++ avoid race conditions and pipeline stalling due to application interaction.
++
++ It is still possible to receive the messages in the streaming thread context
++ if an application wants to. When doing this, special care has to be taken
++ when performing state changes.
++
++ j) EOS
++
++ When an element goes to EOS, it sends the EOS event to the peer plugin
++ and stops sending data on that pad. The peer element that received an EOS
++ event on a pad can refuse any buffers on that pad.
++
++ All elements without source pads must post the EOS message on the message
++ queue. When the pipeline receives an EOS event from all sinks, it will
++ post the EOS message on the application message queue so that the application
++ knows the pipeline is in EOS. Elements without any connected sourcepads
++ should also post the EOS message. This makes sure that all "dead-ends"
++ signalled the EOS.
++
++ No state change happens when elements go to EOS but the elements with the
++ GstTask will stop their tasks and so stop producing data.
++
++ An application can issue a seek operation which makes all tasks running
++ again so that they can start streaming from the new location.
++
++
++
++A) threads and lowlatency
++
++ People often think it is a sin to use threads in low latency applications. This is true
++ when using the data has to pass thread boundaries but false when it doesn't. Since
++ source and loop based elements create a thread, it is possible to construct a pipeline
++ where data passing has to cross thread boundaries, consider this case:
++
++ +-----------------------------------+
++ | +--------+ +--------+ |
++ | |element1| |element2| |
++ | .. -sink src-sink src- .. |
++ | +--------+ +--------+ |
++ +-----------------------------------+
++
++ The two elements are loop base and thus create a thread to drive the pipeline. At the
++ border between the two elements there is a mutex to pass the data between the two
++ threads. When using these kinds of element in a pipeline, low-latency will not be
++ possible. For low-latency apps, don't use these constructs!
++
++ Note that in a typical pipeline with one get-based element and two chain-based
++ elements (decoder/sink) there is only one thread, no data is crossing thread
++ boundaries and thus this pipeline can be low-latency. Also note that while this
++ pipeline is streaming no interaction or locking is done between it and the main
++ application.
++
++ +-------------------------------------+
++ | +--------+ +---------+ +------+ |
++ | | src | | decoder | | sink | |
++ | | src-sink src-sink | |
++ | +--------+ +---------+ +------+ |
++ +-------------------------------------+
++
++
++B) howto make non-threaded pipelines
++
++ For low latency it is required to not have datapassing cross any thread
++ borders. Here are some pointers for making sure this requirement is met:
++
++ - never connect a loop or chain based element to a loop based element, this
++ will create a new thread for the sink loop element.
++
++ - do not use queues or any other decoupled element, as they implicitly
++ create a thread boundary.
++
++ - At least one thread will be created for any source element (either in the
++ connected loop-based element or in the source itself) unless the source
++ elements are connected to the same loop based element.
++
++ - when designing sinks, make them non-blocking, use the async clock callbacks
++ to schedule media rendering in the same thread (if any) as the clock. Sinks that
++ provide the clock can be made blocking.
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/threads_hilevel gstreamer-0.10.23/docs/random/wtay/threads_hilevel
+--- gstreamer-0.10.23.orig/docs/random/wtay/threads_hilevel 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/threads_hilevel 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,172 @@
++1) terms
++--------
++
++- the managing container (top half). This is the main thread that
++ will create and control the main_loop.
++
++- the main_loop (bottom half), this is the thread that actually does
++ the work.
++
++
++
++2) state changes
++================
++
++
++NULL->READY
++-----------
++
++precondition:
++ At this point only the top half exists.
++ flag GST_THREAD_ACTIVE is unset
++
++flow: (TH column 1, BH column 2, ! denotes (possible) thread switch)
++ get mutex
++ pthread create BH
++ wait for spin up (release lock) !
++ get mutex
++ set flag GST_THREAD_ACTIVE
++ change state of children to READY (*)
++ signal TH
++ ! wait for commands (release lock)
++ (lock reacquired after wait)
++ unlock mutex
++
++(*) marks a spot that could potentially induce another state change.
++
++
++READY->NULL
++-----------
++
++precondition:
++ BH is waiting for commands.
++ flag GST_THREAD_ACTIVE is set
++
++flow:
++ get mutex
++ set command for BH (NULL)
++ signal for new command
++ wait for ACK (release lock) !
++ (lock reacquired after wait for cmd)
++ change state of children to NULL (*)
++ signal TH
++ unset flag GST_THREAD_ACTIVE
++ ! unlock (release lock)
++ ! exit
++ (lock reacquired after wait)
++ join
++ unlock (release lock)
++
++
++READY->PAUSED
++-------------
++
++precondition:
++ BH is waiting for commands.
++ flag GST_THREAD_ACTIVE is set
++
++flow:
++ get mutex
++ set command for BH (PAUSED)
++ signal for new command
++ wait for ACK (release lock) !
++ (lock reacquired after wait for cmd)
++ change state of children to READY (*)
++ signal TH
++ ! wait for commands (release lock)
++ (lock reacquired after wait)
++ unlock (release lock)
++
++
++PAUSED->PLAYING
++---------------
++
++precondition:
++ BH is waiting for commands.
++ flag GST_THREAD_ACTIVE is set
++
++flow:
++ get mutex
++ set command for BH (PLAYING)
++ signal for new command
++ wait for ACK (release lock) !
++ (lock reacquired after wait for cmd)
++ change state of children to PLAYING (*)
++ set flag GST_THREAD_SPINNING
++ while (flag SPINNING is set) {
++ signal TH
++ ! unlock mutex
++ (lock reacquired after wait) !
++ unlock (release lock) !
++ ! status = iterate() (*)
++ lock mutex
++ signal TH
++ if (!status) // EOS
++ unset SPINNING flag
++ }
++ signal TH
++ ! wait for commands (release lock)
++
++
++PLAYING->PAUSED
++---------------
++
++precondition:
++ 1. either:
++ BH is spinning
++ flag GST_THREAD_ACTIVE is set
++ flag GST_THREAD_SPINNING is set
++ 2. or:
++ BH is waiting for commands.
++ flag GST_THREAD_ACTIVE is set
++ flag GST_THREAD_SPINNING is unset
++
++flow:
++
++case 1.
++
++ ! while (flag SPINNING is set) {
++ ! signal TH
++ ! unlock mutex
++ get mutex !
++ set command for BH (PAUSED) !
++ unset SPINNING flag ! status = iterate ()
++ signal for new command !
++ wait for ACK (release lock) !
++ lock mutex (reacquired after iteration)
++ if (!status) // EOS
++ unset SPINNING flag
++ }
++ if (status)
++ change state of children to READY (*) (!EOS)
++ signal TH
++ ! wait for commands (release lock)
++ (lock reacquired after wait)
++ unlock (release lock)
++
++case 2.
++
++ get mutex
++ set command for BH (PAUSED)
++ unset SPINNING flag (nop)
++ signal for new command
++ wait for ACK (release lock) !
++ (lock reacquired after wait for cmd)
++ change state of children to READY (*)
++ signal TH
++ ! wait for commands (release lock)
++ (lock reacquired after wait)
++ unlock (release lock)
++
++
++PAUSED->READY
++-------------
++
++similar to READY->PAUSED
++
++TODO
++----
++
++- review
++- figure all all state change scenarios occuring in code marked with (*)
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/wtay/timecache gstreamer-0.10.23/docs/random/wtay/timecache
+--- gstreamer-0.10.23.orig/docs/random/wtay/timecache 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/wtay/timecache 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,133 @@
++1) intro
++--------
++
++For efficient and accurate seeking, a plugin typically needs
++an index of possible seek positions (in time, bytes, samples, ...).
++
++The purpose of GstTimecache is to provide an infrastructure for
++plugins to maintain such an index.
++
++By creating a generic interace to this functionality, it is also
++possible for the application to make use of the generated index.
++possible use cases are: saving/loading of indexes, obtain an
++overview of the indexed stream (where is sample N, where is
++the keyframe...)
++
++
++This document describes a proposed API for this functionality.
++
++
++2) Requirements
++---------------
++
++Bare minimum:
++
++- store mappings between format1 and format2 (bytes<->time,
++ samples<->tracks, ...)
++- update the mappings (add/remove/change entries)
++- query the index, locate entries.
++- store arbitrary extra metadata in the timecache (media file,
++ time, author, ...)
++- set/get cache on elements.
++
++Nice to have:
++
++- cache groups with varying certainty that are merged.
++- API to control the indexing process, what gets indexed, how much,
++ ...)
++- Get notification when a new entry is added, together with an
++ option to turn off in-memory caching, this could be used to
++ do direct-to-disk indexing (for large files) insteda of to-memory.
++
++3) use cases
++------------
++
++a) indexing an mpeg systems stream
++
++ - create an empty timecache object
++ - create filesrc ! mpegparse
++ - set timecache on mpegparse
++ - run the pipeline to EOS
++ - mpegparse will create a mapping from SCR to byte offset
++ and add it to the cache.
++ - read/save timecache
++
++b) running an mpeg with a previously created cache
++
++ - create timecache object from saved index
++ - create filesrc ! mpegparse
++ - set the timecache on mpegparse
++ - run the pipeline, seek, ...
++ - mpegparse uses the timecache to do accurate seek to
++ SCR timestamps.
++
++c) indexing an mpeg systems stream, SCR, video and audio elementary
++ streams.
++
++ - create an empty timecache object
++ - create filesrc ! mpegdemux
++ - set timecache on mpegdemux
++ - run the pipeline to EOS
++ - mpegparse will create a mappings for:
++ * SCR to byte offset
++ * PTS + streamid to byte offset
++ and add it to the cache.
++ - read/save timecache
++
++d) complete indexing of mpeg systems streams and audio/video
++ streams.
++
++ - create 3 empty timecaches
++ - create filesrc ! mpegdemux video_%02d! mpeg2dec
++ mpegdemux0 audio_%02d! mad
++ - set timecaches on mpegdemux, mpeg2dec, mad
++ - run pipeline to EOS
++ - mpegdemux creates timecache for SCR, PTS + streamid
++ - mpeg2dec creates timecache for frames + I/P/B id
++ - mad creates timecache for mpeg audio headers
++ - read/save timecaches
++
++ seeking in a fully indexed stream:
++ - seek on timestamp in mpeg2dec
++ - mpeg2dec locates previous I frame in cache, does
++ a timeseek on sinkpad
++ - mpegparse uses the cache to convert the timestamp
++ to an offset, then does a seek on offset
++ - filesrc seeks to offset
++
++4) Entry types
++--------------
++
++ - mapping between formats:
++
++ <padid> <flags> <format> <position>, <format> <position>, ...
++
++ - metadata, streaminfo, other objects:
++
++ <padid> <format> <position>, <keyword> gpointer
++
++
++5) implementation
++-----------------
++
++We define an abstract base class GstTimeCache with following
++abstract methods:
++
++
++6) cache format example
++-----------------------
++
++We define a binary format for the cache for space/speed reasons.
++It is entirely possible to create alternative implementations.
++
++
++
++
++
++
++
++
++
++
++
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/docs/random/zaheerm/dvb-interface.txt gstreamer-0.10.23/docs/random/zaheerm/dvb-interface.txt
+--- gstreamer-0.10.23.orig/docs/random/zaheerm/dvb-interface.txt 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/docs/random/zaheerm/dvb-interface.txt 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,26 @@
++Interface:
++- type (string like caps) channels/x-mpegts-pat
++- GstStructure to describe the what the list is, name, where from etc. (how many entries you can select, if multiple tried, first one picked)
++- method to list entries (channels)
++- method to get current entries
++- method to set list of entries
++- each entry contains an id (32 bit int say), GstStructure (with additional stuff)
++
++signals to say when entry list changes
++ to say when current entry changes
++
++So for a transport stream, this interface would be exported and it could contain a list of interfaces...eg it would export PAT, and PAT list would contain interfaces in the GstStructure for the PMT.
++
++dvbsrc -> list of frequencies
++flutsdemux -> list of programs (PAT) and list of PMT streams per program
++
++get list of frequencies, select frequency
++get list of programs, select programs
++get list of streams, select streams
++
++only give program details in PAT list, when we have seen the PMT for that program.
++
++possibly another interface to select multiple list interfaces from an element. (interface selector interface)
++
++--
++other option is to tag
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/glib-compat.c gstreamer-0.10.23/gst/glib-compat.c
+--- gstreamer-0.10.23.orig/gst/glib-compat.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/gst/glib-compat.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,28 @@
++/*
++ * glib-compat.c
++ * Functions copied from glib 2.6 and 2.8
++ *
++ * Copyright 2005 David Schleef <ds@schleef.org>
++ */
++
++#include "config.h"
++
++#include <glib.h>
++#include <glib/gstdio.h>
++
++#include <stdio.h>
++#include <errno.h>
++
++#include "glib-compat.h"
++#include "glib-compat-private.h"
++
++#include <sys/stat.h>
++#ifdef HAVE_UNISTD_H
++#include <unistd.h>
++#endif
++#include <sys/types.h>
++
++#ifdef G_OS_WIN32
++#include <windows.h>
++#include <io.h>
++#endif /* G_OS_WIN32 */
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstbin.c gstreamer-0.10.23/gst/gstbin.c
+--- gstreamer-0.10.23.orig/gst/gstbin.c 2009-05-06 14:41:39.000000000 +0200
++++ gstreamer-0.10.23/gst/gstbin.c 2009-06-11 14:19:59.000000000 +0200
+@@ -831,12 +831,16 @@
+ if ((src = GST_MESSAGE_SRC (message))) {
+ /* first find the previous message posted by this element */
+ if ((previous = find_message (bin, src, types))) {
++ GstMessage *previous_msg;
++
+ /* if we found a previous message, replace it */
+- gst_message_unref (previous->data);
++ previous_msg = previous->data;
+ previous->data = message;
+
+- GST_DEBUG_OBJECT (bin, "replace old message %s from %s",
+- name, GST_ELEMENT_NAME (src));
++ GST_DEBUG_OBJECT (bin, "replace old message %s from %s with %s message",
++ GST_MESSAGE_TYPE_NAME (previous_msg), GST_ELEMENT_NAME (src), name);
++
++ gst_message_unref (previous_msg);
+ } else {
+ /* keep new message */
+ bin->messages = g_list_prepend (bin->messages, message);
+@@ -985,8 +989,9 @@
+ /* distribute the bus */
+ gst_element_set_bus (element, bin->child_bus);
+
+- /* propagate the current base_time and clock */
++ /* propagate the current base_time, start_time and clock */
+ gst_element_set_base_time (element, GST_ELEMENT (bin)->base_time);
++ gst_element_set_start_time (element, GST_ELEMENT_START_TIME (bin));
+ /* it's possible that the element did not accept the clock but
+ * that is not important right now. When the pipeline goes to PLAYING,
+ * a new clock will be selected */
+@@ -1965,19 +1970,20 @@
+
+ static GstStateChangeReturn
+ gst_bin_element_set_state (GstBin * bin, GstElement * element,
+- GstClockTime base_time, GstState current, GstState next)
++ GstClockTime base_time, GstClockTime start_time, GstState current,
++ GstState next)
+ {
+ GstStateChangeReturn ret;
+ gboolean locked;
+ GList *found;
+
+- /* set base_time on child */
+- gst_element_set_base_time (element, base_time);
+-
+ GST_STATE_LOCK (element);
+
+- /* peel off the locked flag */
+ GST_OBJECT_LOCK (element);
++ /* set base_time and start time on child */
++ GST_ELEMENT_START_TIME (element) = start_time;
++ element->base_time = base_time;
++ /* peel off the locked flag */
+ locked = GST_OBJECT_FLAG_IS_SET (element, GST_ELEMENT_LOCKED_STATE);
+ /* get previous state return */
+ ret = GST_STATE_RETURN (element);
+@@ -2229,7 +2235,7 @@
+ GstState current, next;
+ gboolean have_async;
+ gboolean have_no_preroll;
+- GstClockTime base_time;
++ GstClockTime base_time, start_time;
+ GstIterator *it;
+ gboolean done;
+
+@@ -2303,6 +2309,7 @@
+ restart:
+ /* take base_time */
+ base_time = gst_element_get_base_time (element);
++ start_time = gst_element_get_start_time (element);
+
+ have_no_preroll = FALSE;
+
+@@ -2318,7 +2325,9 @@
+ child = GST_ELEMENT_CAST (data);
+
+ /* set state and base_time now */
+- ret = gst_bin_element_set_state (bin, child, base_time, current, next);
++ ret =
++ gst_bin_element_set_state (bin, child, base_time, start_time,
++ current, next);
+
+ switch (ret) {
+ case GST_STATE_CHANGE_SUCCESS:
+@@ -2383,12 +2392,13 @@
+
+ GST_OBJECT_LOCK (bin);
+ bin->polling = FALSE;
+- /* it's possible that we did not get ASYNC form the children while the bin is
++ /* it's possible that we did not get ASYNC from the children while the bin is
+ * simulating ASYNC behaviour by posting an ASYNC_DONE message on the bus with
+ * itself as the source. In that case we still want to check if the state
+ * change completed. */
+ if (ret != GST_STATE_CHANGE_ASYNC && !bin->priv->pending_async_done) {
+- /* no element returned ASYNC, we can just complete. */
++ /* no element returned ASYNC and there are no pending async_done messages,
++ * we can just complete. */
+ GST_DEBUG_OBJECT (bin, "no async elements");
+ goto state_end;
+ }
+@@ -3607,12 +3617,12 @@
+ GST_CAT_INFO (GST_CAT_XML, "[%s]: saving %d children",
+ GST_ELEMENT_NAME (bin), bin->numchildren);
+
+- children = bin->children;
++ children = g_list_last (bin->children);
+ while (children) {
+ child = GST_ELEMENT (children->data);
+ elementnode = xmlNewChild (childlist, NULL, (xmlChar *) "element", NULL);
+ gst_object_save_thyself (GST_OBJECT (child), elementnode);
+- children = g_list_next (children);
++ children = g_list_previous (children);
+ }
+ return childlist;
+ }
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstbuffer.c gstreamer-0.10.23/gst/gstbuffer.c
+--- gstreamer-0.10.23.orig/gst/gstbuffer.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gstbuffer.c 2009-06-11 14:19:59.000000000 +0200
+@@ -165,8 +165,8 @@
+
+ gst_caps_replace (&GST_BUFFER_CAPS (buffer), NULL);
+
+- GST_MINI_OBJECT_CLASS (gst_buffer_parent_class)->finalize
+- (GST_MINI_OBJECT_CAST (buffer));
++ ((GstMiniObjectClass *)
++ gst_buffer_parent_class)->finalize (GST_MINI_OBJECT_CAST (buffer));
+ }
+
+ /**
+@@ -193,6 +193,10 @@
+ g_return_if_fail (dest != NULL);
+ g_return_if_fail (src != NULL);
+
++ /* nothing to copy if the buffers are the same */
++ if (G_UNLIKELY (dest == src))
++ return;
++
+ GST_CAT_LOG (GST_CAT_BUFFER, "copy %p to %p", src, dest);
+
+ if (flags & GST_BUFFER_COPY_FLAGS) {
+@@ -201,7 +205,8 @@
+ /* copy relevant flags */
+ mask = GST_BUFFER_FLAG_PREROLL | GST_BUFFER_FLAG_IN_CAPS |
+ GST_BUFFER_FLAG_DELTA_UNIT | GST_BUFFER_FLAG_DISCONT |
+- GST_BUFFER_FLAG_GAP;
++ GST_BUFFER_FLAG_GAP | GST_BUFFER_FLAG_MEDIA1 |
++ GST_BUFFER_FLAG_MEDIA2 | GST_BUFFER_FLAG_MEDIA3;
+ GST_MINI_OBJECT_FLAGS (dest) |= GST_MINI_OBJECT_FLAGS (src) & mask;
+ }
+
+@@ -213,10 +218,7 @@
+ }
+
+ if (flags & GST_BUFFER_COPY_CAPS) {
+- if (GST_BUFFER_CAPS (src))
+- GST_BUFFER_CAPS (dest) = gst_caps_ref (GST_BUFFER_CAPS (src));
+- else
+- GST_BUFFER_CAPS (dest) = NULL;
++ gst_caps_replace (&GST_BUFFER_CAPS (dest), GST_BUFFER_CAPS (src));
+ }
+ }
+
+@@ -483,7 +485,7 @@
+ {
+ gst_buffer_unref (buffer->parent);
+
+- GST_MINI_OBJECT_CLASS (gst_subbuffer_parent_class)->finalize
++ ((GstMiniObjectClass *) gst_subbuffer_parent_class)->finalize
+ (GST_MINI_OBJECT_CAST (buffer));
+ }
+
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstbufferlist.c gstreamer-0.10.23/gst/gstbufferlist.c
+--- gstreamer-0.10.23.orig/gst/gstbufferlist.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/gst/gstbufferlist.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,736 @@
++/* GStreamer
++ * Copyright (C) 2009 Axis Communications <dev-gstreamer at axis dot com>
++ * @author Jonas Holmberg <jonas dot holmberg at axis dot com>
++ *
++ * gstbufferlist.c: Buffer list
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++/**
++ * SECTION:gstbufferlist
++ * @short_description: Grouped scatter data buffer type for data-passing
++ * @see_also: #GstPad, #GstMiniObject
++ *
++ * Buffer lists are units of grouped scatter/gather data transfer in
++ * GStreamer.
++ *
++ * Buffer lists are created with gst_buffer_list_new() and filled with data
++ * using a #GstBufferListIterator. The iterator has no current buffer; its
++ * cursor position lies between buffers, immediately before the buffer that
++ * would be returned by gst_buffer_list_iterator_next(). After iterating to the
++ * end of a group the iterator must be advanced to the next group by a call to
++ * gst_buffer_list_iterator_next_group() before any further calls to
++ * gst_buffer_list_iterator_next() can return buffers again. The cursor position
++ * of a newly created iterator lies before the first group; a call to
++ * gst_buffer_list_iterator_next_group() is necessary before calls to
++ * gst_buffer_list_iterator_next() can return buffers.
++ *
++ * <informalexample>
++ * <programlisting>
++ * +--- group0 ----------------------+--- group1 ------------+
++ * | buffer0 buffer1 buffer2 | buffer3 buffer4 |
++ * ^ ^ ^ ^ ^ ^ ^ ^
++ * Iterator positions
++ * </programlisting>
++ * </informalexample>
++ *
++ * The gst_buffer_list_iterator_remove(), gst_buffer_list_iterator_steal(),
++ * gst_buffer_list_iterator_take(), gst_buffer_list_iterator_do() and
++ * gst_buffer_list_iterator_do_data() functions are not defined in terms of the
++ * cursor position; they operate on the last element returned from
++ * gst_buffer_list_iterator_next().
++ *
++ * The basic use pattern of creating a buffer list with an iterator is as
++ * follows:
++ *
++ * <example>
++ * <title>Creating a buffer list</title>
++ * <programlisting>
++ * GstBufferList *list;
++ * GstBufferListIterator *it;
++ *
++ * list = gst_buffer_list_new ();
++ * it = gst_buffer_list_iterate (list);
++ * gst_buffer_list_iterator_add_group (it);
++ * gst_buffer_list_iterator_add (it, header1);
++ * gst_buffer_list_iterator_add (it, data1);
++ * gst_buffer_list_iterator_add_group (it);
++ * gst_buffer_list_iterator_add (it, header2);
++ * gst_buffer_list_iterator_add (it, data2);
++ * gst_buffer_list_iterator_add_group (it);
++ * gst_buffer_list_iterator_add (it, header3);
++ * gst_buffer_list_iterator_add (it, data3);
++ * ...
++ * gst_buffer_list_iterator_free (it);
++ * </programlisting>
++ * </example>
++ *
++ * The basic use pattern of iterating over a buffer list is as follows:
++ *
++ * <example>
++ * <title>Iterating a buffer list</title>
++ * <programlisting>
++ * GstBufferListIterator *it;
++ *
++ * it = gst_buffer_list_iterate (list);
++ * while (gst_buffer_list_iterator_next_group (it)) {
++ * while ((buffer = gst_buffer_list_iterator_next (it)) != NULL) {
++ * do_something_with_buffer (buffer);
++ * }
++ * }
++ * gst_buffer_list_iterator_free (it);
++ * </programlisting>
++ * </example>
++ *
++ * The basic use pattern of modifying a buffer in a list is as follows:
++ *
++ * <example>
++ * <title>Modifying the data of the first buffer in a list</title>
++ * <programlisting>
++ * GstBufferListIterator *it;
++ *
++ * list = gst_buffer_list_make_writable (list);
++ * it = gst_buffer_list_iterate (list);
++ * if (gst_buffer_list_iterator_next_group (it)) {
++ * GstBuffer *buf
++ *
++ * buf = gst_buffer_list_iterator_next (it);
++ * if (buf != NULL) {
++ * buf = gst_buffer_list_iterator_do (it,
++ * (GstBufferListDoFunction) gst_mini_object_make_writable);
++ * modify_data (GST_BUFFER_DATA (buf));
++ * }
++ * }
++ * gst_buffer_list_iterator_free (it);
++ * </programlisting>
++ * </example>
++ *
++ * Since: 0.10.24
++ */
++#include "gst_private.h"
++
++#include "gstbuffer.h"
++#include "gstbufferlist.h"
++
++#define GST_CAT_DEFAULT GST_CAT_BUFFER_LIST
++
++#define GROUP_START NULL
++static const gpointer STOLEN = "";
++
++/**
++ * GstBufferList:
++ * @mini_object: the parent structure
++ *
++ * Opaque list of grouped buffers.
++ */
++struct _GstBufferList
++{
++ GstMiniObject mini_object;
++
++ /*< private > */
++ GList *buffers;
++};
++
++struct _GstBufferListClass
++{
++ GstMiniObjectClass mini_object_class;
++};
++
++/**
++ * GstBufferListIterator:
++ *
++ * Opaque iterator for a #GstBufferList.
++ */
++struct _GstBufferListIterator
++{
++ GstBufferList *list;
++ GList *next;
++ GList *last_returned;
++};
++
++static GType _gst_buffer_list_type = 0;
++static GstMiniObjectClass *parent_class = NULL;
++
++void
++_gst_buffer_list_initialize (void)
++{
++ g_type_class_ref (gst_buffer_list_get_type ());
++}
++
++static void
++gst_buffer_list_init (GTypeInstance * instance, gpointer g_class)
++{
++ GstBufferList *list;
++
++ list = (GstBufferList *) instance;
++ list->buffers = NULL;
++
++ GST_LOG ("init %p", list);
++}
++
++static void
++gst_buffer_list_finalize (GstBufferList * list)
++{
++ GList *tmp;
++
++ g_return_if_fail (list != NULL);
++
++ GST_LOG ("finalize %p", list);
++
++ tmp = list->buffers;
++ while (tmp) {
++ if (tmp->data != GROUP_START && tmp->data != STOLEN) {
++ gst_buffer_unref (GST_BUFFER_CAST (tmp->data));
++ }
++ tmp = tmp->next;
++ }
++ g_list_free (list->buffers);
++
++ parent_class->finalize (GST_MINI_OBJECT_CAST (list));
++}
++
++static GstBufferList *
++_gst_buffer_list_copy (GstBufferList * list)
++{
++ GstBufferList *list_copy;
++ GList *tmp;
++
++ g_return_val_if_fail (list != NULL, NULL);
++
++ list_copy = gst_buffer_list_new ();
++
++ /* shallow copy of list and pointers */
++ list_copy->buffers = g_list_copy (list->buffers);
++
++ /* ref all buffers in the list */
++ tmp = list_copy->buffers;
++ while (tmp) {
++ if (tmp->data != GROUP_START && tmp->data != STOLEN) {
++ tmp->data = gst_buffer_ref (GST_BUFFER_CAST (tmp->data));
++ }
++ tmp = g_list_next (tmp);
++ }
++
++ return list_copy;
++}
++
++static void
++gst_buffer_list_class_init (gpointer g_class, gpointer class_data)
++{
++ GstBufferListClass *list_class = GST_BUFFER_LIST_CLASS (g_class);
++
++ parent_class = g_type_class_peek_parent (g_class);
++
++ list_class->mini_object_class.copy =
++ (GstMiniObjectCopyFunction) _gst_buffer_list_copy;
++ list_class->mini_object_class.finalize =
++ (GstMiniObjectFinalizeFunction) gst_buffer_list_finalize;
++}
++
++/**
++ * gst_buffer_list_new:
++ *
++ * Creates a new, empty #GstBufferList. The caller is responsible for unreffing
++ * the returned #GstBufferList.
++ *
++ * Returns: the new #GstBufferList. gst_buffer_list_unref() after usage.
++ */
++GstBufferList *
++gst_buffer_list_new (void)
++{
++ GstBufferList *list;
++
++ list = (GstBufferList *) gst_mini_object_new (_gst_buffer_list_type);
++
++ GST_LOG ("new %p", list);
++
++ return list;
++}
++
++/**
++ * gst_buffer_list_n_groups:
++ * @list: a #GstBufferList
++ *
++ * Returns the number of groups in @list.
++ *
++ * Returns: the number of groups in the buffer list
++ */
++guint
++gst_buffer_list_n_groups (GstBufferList * list)
++{
++ GList *tmp;
++ guint n;
++
++ g_return_val_if_fail (list != NULL, 0);
++
++ tmp = list->buffers;
++ n = 0;
++ while (tmp) {
++ if (tmp->data == GROUP_START) {
++ n++;
++ }
++ tmp = g_list_next (tmp);
++ }
++
++ return n;
++}
++
++GType
++gst_buffer_list_get_type (void)
++{
++ if (G_UNLIKELY (_gst_buffer_list_type == 0)) {
++ static const GTypeInfo buffer_list_info = {
++ sizeof (GstBufferListClass),
++ NULL,
++ NULL,
++ gst_buffer_list_class_init,
++ NULL,
++ NULL,
++ sizeof (GstBufferList),
++ 0,
++ gst_buffer_list_init,
++ NULL
++ };
++
++ _gst_buffer_list_type = g_type_register_static (GST_TYPE_MINI_OBJECT,
++ "GstBufferList", &buffer_list_info, 0);
++ }
++
++ return _gst_buffer_list_type;
++}
++
++/**
++ * gst_buffer_list_iterate:
++ * @list: a #GstBufferList
++ *
++ * Iterate the buffers in @list. The owner of the iterator must also be the
++ * owner of a reference to @list while the returned iterator is in use.
++ *
++ * Returns: a new #GstBufferListIterator of the buffers in @list.
++ * gst_buffer_list_iterator_free() after usage
++ */
++GstBufferListIterator *
++gst_buffer_list_iterate (GstBufferList * list)
++{
++ GstBufferListIterator *it;
++
++ g_return_val_if_fail (list != NULL, NULL);
++
++ it = g_slice_new (GstBufferListIterator);
++ it->list = list;
++ it->next = list->buffers;
++ it->last_returned = NULL;
++
++ return it;
++}
++
++/**
++ * gst_buffer_list_iterator_free:
++ * @it: the #GstBufferListIterator to free
++ *
++ * Free the iterator.
++ */
++void
++gst_buffer_list_iterator_free (GstBufferListIterator * it)
++{
++ g_return_if_fail (it != NULL);
++
++ g_slice_free (GstBufferListIterator, it);
++}
++
++/**
++ * gst_buffer_list_iterator_n_buffers:
++ * @it: a #GstBufferListIterator
++ *
++ * Returns the number of buffers left to iterate in the current group. I.e. the
++ * number of calls that can be made to gst_buffer_list_iterator_next() before
++ * it returns NULL.
++ *
++ * This function will not move the implicit cursor or in any other way affect
++ * the state of the iterator @it.
++ *
++ * Returns: the number of buffers left to iterate in the current group
++ */
++guint
++gst_buffer_list_iterator_n_buffers (const GstBufferListIterator * it)
++{
++ GList *tmp;
++ guint n;
++
++ g_return_val_if_fail (it != NULL, 0);
++
++ tmp = it->next;
++ n = 0;
++ while (tmp && tmp->data != GROUP_START) {
++ if (tmp->data != STOLEN) {
++ n++;
++ }
++ tmp = g_list_next (tmp);
++ }
++
++ return n;
++}
++
++/**
++ * gst_buffer_list_iterator_add:
++ * @it: a #GstBufferListIterator
++ * @buffer: a #GstBuffer
++ *
++ * Inserts @buffer into the #GstBufferList iterated with @it. The buffer is
++ * inserted into the current group, immediately before the buffer that would be
++ * returned by gst_buffer_list_iterator_next(). The buffer is inserted before
++ * the implicit cursor, a subsequent call to gst_buffer_list_iterator_next()
++ * will return the buffer after the inserted buffer, if any.
++ *
++ * This function takes ownership of @buffer.
++ */
++void
++gst_buffer_list_iterator_add (GstBufferListIterator * it, GstBuffer * buffer)
++{
++ g_return_if_fail (it != NULL);
++ g_return_if_fail (buffer != NULL);
++
++ /* adding before the first group start is not allowed */
++ g_return_if_fail (it->next != it->list->buffers);
++
++ /* cheap insert into the GList */
++ it->list->buffers = g_list_insert_before (it->list->buffers, it->next,
++ buffer);
++}
++
++/**
++ * gst_buffer_list_iterator_add_group:
++ * @it: a #GstBufferListIterator
++ *
++ * Inserts a new, empty group into the #GstBufferList iterated with @it. The
++ * group is inserted immediately before the group that would be returned by
++ * gst_buffer_list_iterator_next_group(). A subsequent call to
++ * gst_buffer_list_iterator_next_group() will advance the iterator to the group
++ * after the inserted group, if any.
++ */
++void
++gst_buffer_list_iterator_add_group (GstBufferListIterator * it)
++{
++ g_return_if_fail (it != NULL);
++
++ /* advance iterator to next group start */
++ while (it->next != NULL && it->next->data != GROUP_START) {
++ it->next = g_list_next (it->next);
++ }
++
++ /* cheap insert of a group start into the GList */
++ it->list->buffers = g_list_insert_before (it->list->buffers, it->next,
++ GROUP_START);
++}
++
++/**
++ * gst_buffer_list_iterator_next:
++ * @it: a #GstBufferListIterator
++ *
++ * Returns the next buffer in the list iterated with @it. If the iterator is at
++ * the end of a group, NULL will be returned. This function may be called
++ * repeatedly to iterate through the current group.
++ *
++ * The caller will not get a new ref to the returned #GstBuffer and must not
++ * unref it.
++ *
++ * Returns: the next buffer in the current group of the buffer list, or NULL
++ */
++GstBuffer *
++gst_buffer_list_iterator_next (GstBufferListIterator * it)
++{
++ GstBuffer *buffer;
++
++ g_return_val_if_fail (it != NULL, NULL);
++
++ while (it->next != NULL && it->next->data != GROUP_START &&
++ it->next->data == STOLEN) {
++ it->next = g_list_next (it->next);
++ }
++
++ if (it->next == NULL || it->next->data == GROUP_START) {
++ goto no_buffer;
++ }
++
++ buffer = GST_BUFFER_CAST (it->next->data);
++
++ it->last_returned = it->next;
++ it->next = g_list_next (it->next);
++
++ return buffer;
++
++no_buffer:
++ it->last_returned = NULL;
++
++ return NULL;
++}
++
++/**
++ * gst_buffer_list_iterator_next_group:
++ * @it: a #GstBufferListIterator
++ *
++ * Advance the iterator @it to the first buffer in the next group. If the
++ * iterator is at the last group, FALSE will be returned. This function may be
++ * called repeatedly to iterate through the groups in a buffer list.
++ *
++ * Returns: TRUE if the iterator could be advanced to the next group, FALSE if
++ * the iterator was already at the last group
++ */
++gboolean
++gst_buffer_list_iterator_next_group (GstBufferListIterator * it)
++{
++ g_return_val_if_fail (it != NULL, FALSE);
++
++ /* advance iterator to next group start */
++ while (it->next != NULL && it->next->data != GROUP_START) {
++ it->next = g_list_next (it->next);
++ }
++
++ if (it->next) {
++ /* move one step beyond the group start */
++ it->next = g_list_next (it->next);
++ }
++
++ it->last_returned = NULL;
++
++ return (it->next != NULL);
++}
++
++/**
++ * gst_buffer_list_iterator_remove:
++ * @it: a #GstBufferListIterator
++ *
++ * Removes the last buffer returned by gst_buffer_list_iterator_next() from
++ * the #GstBufferList iterated with @it. gst_buffer_list_iterator_next() must
++ * have been called on @it before this function is called. This function can
++ * only be called once per call to gst_buffer_list_iterator_next().
++ *
++ * The removed buffer is unreffed.
++ */
++void
++gst_buffer_list_iterator_remove (GstBufferListIterator * it)
++{
++ g_return_if_fail (it != NULL);
++ g_return_if_fail (it->last_returned != NULL);
++ g_assert (it->last_returned->data != GROUP_START);
++
++ if (it->last_returned->data != STOLEN) {
++ gst_buffer_unref (it->last_returned->data);
++ }
++ it->list->buffers = g_list_delete_link (it->list->buffers, it->last_returned);
++ it->last_returned = NULL;
++}
++
++/**
++ * gst_buffer_list_iterator_take:
++ * @it: a #GstBufferListIterator
++ * @buffer: a #GstBuffer
++ *
++ * Replaces the last buffer returned by gst_buffer_list_iterator_next() with
++ * @buffer in the #GstBufferList iterated with @it and takes ownership of
++ * @buffer. gst_buffer_list_iterator_next() must have been called on @it before
++ * this function is called. gst_buffer_list_iterator_remove() must not have been
++ * called since the last call to gst_buffer_list_iterator_next().
++ *
++ * This function unrefs the replaced buffer if it has not been stolen with
++ * gst_buffer_list_iterator_steal() and takes ownership of @buffer (i.e. the
++ * refcount of @buffer is not increased).
++ */
++void
++gst_buffer_list_iterator_take (GstBufferListIterator * it, GstBuffer * buffer)
++{
++ g_return_if_fail (it != NULL);
++ g_return_if_fail (it->last_returned != NULL);
++ g_return_if_fail (buffer != NULL);
++ g_assert (it->last_returned->data != GROUP_START);
++
++ if (it->last_returned->data != STOLEN) {
++ gst_buffer_unref (it->last_returned->data);
++ }
++ it->last_returned->data = buffer;
++}
++
++/**
++ * gst_buffer_list_iterator_steal:
++ * @it: a #GstBufferListIterator
++ *
++ * Returns the last buffer returned by gst_buffer_list_iterator_next() without
++ * modifying the refcount of the buffer.
++ *
++ * Returns: the last buffer returned by gst_buffer_list_iterator_next()
++ */
++GstBuffer *
++gst_buffer_list_iterator_steal (GstBufferListIterator * it)
++{
++ GstBuffer *buffer;
++
++ g_return_val_if_fail (it != NULL, NULL);
++ g_return_val_if_fail (it->last_returned != NULL, NULL);
++ g_return_val_if_fail (it->last_returned->data != STOLEN, NULL);
++ g_assert (it->last_returned->data != GROUP_START);
++
++ buffer = it->last_returned->data;
++ it->last_returned->data = STOLEN;
++
++ return buffer;
++}
++
++/**
++ * gst_buffer_list_iterator_do_data:
++ * @it: a #GstBufferListIterator
++ * @do_func: the function to be called
++ * @data: the gpointer to optional user data.
++ * @data_notify: function to be called when @data is no longer used
++ *
++ * Calls the given function for the last buffer returned by
++ * gst_buffer_list_iterator_next(). gst_buffer_list_iterator_next() must have
++ * been called on @it before this function is called.
++ * gst_buffer_list_iterator_remove() and gst_buffer_list_iterator_steal() must
++ * not have been called since the last call to gst_buffer_list_iterator_next().
++ *
++ * See #GstBufferListDoFunction for more details.
++ *
++ * The @data_notify function is called after @do_func has returned, before this
++ * function returns, usually used to free @data.
++ *
++ * Returns: the return value from @do_func
++ */
++GstBuffer *
++gst_buffer_list_iterator_do_data (GstBufferListIterator * it,
++ GstBufferListDoDataFunction do_func, gpointer data,
++ GDestroyNotify data_notify)
++{
++ GstBuffer *buffer;
++
++ g_return_val_if_fail (it != NULL, NULL);
++ g_return_val_if_fail (it->last_returned != NULL, NULL);
++ g_return_val_if_fail (it->last_returned->data != STOLEN, NULL);
++ g_return_val_if_fail (do_func != NULL, NULL);
++ g_return_val_if_fail (gst_buffer_list_is_writable (it->list), NULL);
++ g_assert (it->last_returned->data != GROUP_START);
++
++ buffer = gst_buffer_list_iterator_steal (it);
++ buffer = do_func (buffer, data);
++ if (buffer == NULL) {
++ gst_buffer_list_iterator_remove (it);
++ } else {
++ gst_buffer_list_iterator_take (it, buffer);
++ }
++
++ if (data_notify != NULL) {
++ data_notify (data);
++ }
++
++ return buffer;
++}
++
++static GstBuffer *
++do_func_no_data (GstBuffer * buffer, GstBufferListDoFunction do_func)
++{
++ return do_func (buffer);
++}
++
++/**
++ * gst_buffer_list_iterator_do:
++ * @it: a #GstBufferListIterator
++ * @do_func: the function to be called
++ *
++ * Calls the given function for the last buffer returned by
++ * gst_buffer_list_iterator_next(). gst_buffer_list_iterator_next() must have
++ * been called on @it before this function is called.
++ * gst_buffer_list_iterator_remove() or gst_buffer_list_iterator_steal() must
++ * not have been called since the last call to gst_buffer_list_iterator_next().
++ *
++ * See #GstBufferListDoFunction for more details.
++ *
++ * Returns: the return value from @do_func
++ */
++GstBuffer *
++gst_buffer_list_iterator_do (GstBufferListIterator * it,
++ GstBufferListDoFunction do_func)
++{
++ g_return_val_if_fail (it != NULL, NULL);
++ g_return_val_if_fail (it->last_returned != NULL, NULL);
++ g_return_val_if_fail (it->last_returned->data != STOLEN, NULL);
++ g_return_val_if_fail (do_func != NULL, NULL);
++ g_return_val_if_fail (gst_buffer_list_is_writable (it->list), NULL);
++ g_assert (it->last_returned->data != GROUP_START);
++
++ return gst_buffer_list_iterator_do_data (it,
++ (GstBufferListDoDataFunction) do_func_no_data, do_func, NULL);
++}
++
++/**
++ * gst_buffer_list_iterator_merge_group:
++ * @it: a #GstBufferListIterator
++ *
++ * Merge a buffer list group into a normal #GstBuffer by copying its metadata
++ * and memcpying its data into consecutive memory. All buffers in the current
++ * group after the implicit cursor will be merged into one new buffer. The
++ * metadata of the new buffer will be a copy of the metadata of the buffer that
++ * would be returned by gst_buffer_list_iterator_next(). If there is no buffer
++ * in the current group after the implicit cursor, NULL will be returned.
++ *
++ * This function will not move the implicit cursor or in any other way affect
++ * the state of the iterator @it or the list.
++ *
++ * Returns: a new #GstBuffer, gst_buffer_unref() after usage, or NULL
++ */
++GstBuffer *
++gst_buffer_list_iterator_merge_group (const GstBufferListIterator * it)
++{
++ GList *tmp;
++ guint size;
++ GstBuffer *buf;
++ guint8 *ptr;
++
++ g_return_val_if_fail (it != NULL, NULL);
++
++ /* calculate size of merged buffer */
++ size = 0;
++ tmp = it->next;
++ while (tmp && tmp->data != GROUP_START) {
++ if (tmp->data != STOLEN) {
++ size += GST_BUFFER_SIZE (tmp->data);
++ }
++ tmp = g_list_next (tmp);
++ }
++
++ if (size == 0) {
++ return NULL;
++ }
++
++ /* allocate a new buffer */
++ buf = gst_buffer_new_and_alloc (size);
++
++ /* copy metadata from the next buffer after the implicit cursor */
++ gst_buffer_copy_metadata (buf, GST_BUFFER_CAST (it->next->data),
++ GST_BUFFER_COPY_ALL);
++
++ /* copy data of all buffers before the next group start into the new buffer */
++ ptr = GST_BUFFER_DATA (buf);
++ tmp = it->next;
++ do {
++ if (tmp->data != STOLEN) {
++ memcpy (ptr, GST_BUFFER_DATA (tmp->data), GST_BUFFER_SIZE (tmp->data));
++ ptr += GST_BUFFER_SIZE (tmp->data);
++ }
++ tmp = g_list_next (tmp);
++ } while (tmp && tmp->data != GROUP_START);
++
++ return buf;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstbufferlist.h gstreamer-0.10.23/gst/gstbufferlist.h
+--- gstreamer-0.10.23.orig/gst/gstbufferlist.h 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/gst/gstbufferlist.h 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,196 @@
++/* GStreamer
++ * Copyright (C) 2009 Axis Communications <dev-gstreamer at axis dot com>
++ * @author Jonas Holmberg <jonas dot holmberg at axis dot com>
++ *
++ * gstbufferlist.h: Header for GstBufferList object
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#ifndef __GST_BUFFER_LIST_H__
++#define __GST_BUFFER_LIST_H__
++
++#include <gst/gstbuffer.h>
++
++G_BEGIN_DECLS
++
++#define GST_TYPE_BUFFER_LIST (gst_buffer_list_get_type ())
++#define GST_IS_BUFFER_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_BUFFER_LIST))
++#define GST_IS_BUFFER_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_BUFFER_LIST))
++#define GST_BUFFER_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_BUFFER_LIST, GstBufferListClass))
++#define GST_BUFFER_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_BUFFER_LIST, GstBufferList))
++#define GST_BUFFER_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_BUFFER_LIST, GstBufferListClass))
++#define GST_BUFFER_LIST_CAST(obj) ((GstBufferList *)obj)
++
++typedef struct _GstBufferList GstBufferList;
++typedef struct _GstBufferListClass GstBufferListClass;
++typedef struct _GstBufferListIterator GstBufferListIterator;
++
++/**
++ * GstBufferListDoFunction:
++ * @buffer: the #GstBuffer
++ *
++ * A function for accessing the last buffer returned by
++ * gst_buffer_list_iterator_next(). The function can leave @buffer in the list,
++ * replace @buffer in the list or remove @buffer from the list, depending on
++ * the return value. If the function returns NULL, @buffer will be removed from
++ * the list, otherwise @buffer will be replaced with the returned buffer.
++ *
++ * The last buffer returned by gst_buffer_list_iterator_next() will be replaced
++ * with the buffer returned from the function. The function takes ownership of
++ * @buffer and if a different value than @buffer is returned, @buffer must be
++ * unreffed. If NULL is returned, the buffer will be removed from the list. The
++ * list must be writable.
++ *
++ * Returns: the buffer to replace @buffer in the list, or NULL to remove @buffer
++ * from the list
++ */
++typedef GstBuffer* (*GstBufferListDoFunction) (GstBuffer * buffer);
++
++/**
++ * GstBufferListDoDataFunction:
++ * @buffer: the #GstBuffer
++ * @data: the gpointer to optional user data.
++ *
++ * A function for accessing the last buffer returned by
++ * gst_buffer_list_iterator_next(). The function can leave @buffer in the list,
++ * replace @buffer in the list or remove @buffer from the list, depending on
++ * the return value. If the function returns NULL, @buffer will be removed from
++ * the list, otherwise @buffer will be replaced with the returned buffer.
++ *
++ * The last buffer returned by gst_buffer_list_iterator_next() will be replaced
++ * with the buffer returned from the function. The function takes ownership of
++ * @buffer and if a different value than @buffer is returned, @buffer must be
++ * unreffed. If NULL is returned, the buffer will be removed from the list. The
++ * list must be writable.
++ *
++ * Returns: the buffer to replace @buffer in the list, or NULL to remove @buffer
++ * from the list
++ */
++typedef GstBuffer* (*GstBufferListDoDataFunction) (GstBuffer * buffer, gpointer data);
++
++GType gst_buffer_list_get_type (void);
++
++/* allocation */
++GstBufferList *gst_buffer_list_new (void);
++
++/* refcounting */
++/**
++ * gst_buffer_list_ref:
++ * @list: a #GstBufferList
++ *
++ * Increases the refcount of the given buffer list by one.
++ *
++ * Note that the refcount affects the writeability of @list and its data, see
++ * gst_buffer_list_make_writable(). It is important to note that keeping
++ * additional references to GstBufferList instances can potentially increase
++ * the number of memcpy operations in a pipeline.
++ *
++ * Returns: @list
++ */
++#ifdef _FOOL_GTK_DOC_
++G_INLINE_FUNC GstBufferList * gst_buffer_list_ref (GstBufferList * list);
++#endif
++
++static inline GstBufferList *
++gst_buffer_list_ref (GstBufferList * list)
++{
++ return GST_BUFFER_LIST_CAST (gst_mini_object_ref (GST_MINI_OBJECT_CAST (
++ list)));
++}
++
++/**
++ * gst_buffer_list_unref:
++ * @list: a #GstBufferList
++ *
++ * Decreases the refcount of the buffer list. If the refcount reaches 0, the
++ * buffer list will be freed.
++ */
++#ifdef _FOOL_GTK_DOC_
++G_INLINE_FUNC void gst_buffer_list_unref (GstBufferList * list);
++#endif
++
++static inline void
++gst_buffer_list_unref (GstBufferList * list)
++{
++ gst_mini_object_unref (GST_MINI_OBJECT_CAST (list));
++}
++
++/* copy */
++/**
++ * gst_buffer_list_copy:
++ * @list: a #GstBufferList
++ *
++ * Create a shallow copy of the given buffer list. This will make a newly
++ * allocated copy of the source list with copies of buffer pointers. The
++ * refcount of buffers pointed to will be increased by one.
++ *
++ * Returns: a new copy of @list.
++ */
++#ifdef _FOOL_GTK_DOC_
++G_INLINE_FUNC GstBufferList * gst_buffer_list_copy (const GstBufferList * list);
++#endif
++
++static inline GstBufferList *
++gst_buffer_list_copy (const GstBufferList * list)
++{
++ return GST_BUFFER_LIST (gst_mini_object_copy (GST_MINI_OBJECT_CAST (list)));
++}
++
++/**
++ * gst_buffer_list_is_writable:
++ * @list: a #GstBufferList
++ *
++ * Tests if you can safely add buffers and groups into a buffer list.
++ */
++#define gst_buffer_list_is_writable(list) gst_mini_object_is_writable (GST_MINI_OBJECT_CAST (list))
++
++/**
++ * gst_buffer_list_make_writable:
++ * @list: a #GstBufferList
++ *
++ * Makes a writable buffer list from the given buffer list. If the source buffer
++ * list is already writable, this will simply return the same buffer list. A
++ * copy will otherwise be made using gst_buffer_list_copy().
++ */
++#define gst_buffer_list_make_writable(list) GST_BUFFER_LIST_CAST (gst_mini_object_make_writable (GST_MINI_OBJECT_CAST (list)))
++
++guint gst_buffer_list_n_groups (GstBufferList *list);
++
++/* iterator */
++GstBufferListIterator * gst_buffer_list_iterate (GstBufferList *list);
++void gst_buffer_list_iterator_free (GstBufferListIterator *it);
++
++guint gst_buffer_list_iterator_n_buffers (const GstBufferListIterator *it);
++GstBuffer * gst_buffer_list_iterator_next (GstBufferListIterator *it);
++gboolean gst_buffer_list_iterator_next_group (GstBufferListIterator *it);
++
++void gst_buffer_list_iterator_add (GstBufferListIterator *it, GstBuffer *buffer);
++void gst_buffer_list_iterator_add_group (GstBufferListIterator *it);
++void gst_buffer_list_iterator_remove (GstBufferListIterator *it);
++GstBuffer * gst_buffer_list_iterator_steal (GstBufferListIterator *it);
++void gst_buffer_list_iterator_take (GstBufferListIterator *it, GstBuffer *buffer);
++
++GstBuffer * gst_buffer_list_iterator_do (GstBufferListIterator *it, GstBufferListDoFunction do_func);
++GstBuffer * gst_buffer_list_iterator_do_data (GstBufferListIterator *it, GstBufferListDoDataFunction do_func,
++ gpointer data, GDestroyNotify data_notify);
++
++/* conversion */
++GstBuffer * gst_buffer_list_iterator_merge_group (const GstBufferListIterator *it);
++
++G_END_DECLS
++
++#endif /* __GST_BUFFER_LIST_H__ */
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gst.c gstreamer-0.10.23/gst/gst.c
+--- gstreamer-0.10.23.orig/gst/gst.c 2009-04-21 21:12:19.000000000 +0200
++++ gstreamer-0.10.23/gst/gst.c 2009-06-11 14:19:59.000000000 +0200
+@@ -766,11 +766,7 @@
+ }
+
+ GST_INFO ("Registry cache changed. Writing new registry cache");
+-#ifdef USE_BINARY_REGISTRY
+ if (!gst_registry_binary_write_cache (default_registry, registry_file)) {
+-#else
+- if (!gst_registry_xml_write_cache (default_registry, registry_file)) {
+-#endif
+ g_set_error (error, GST_CORE_ERROR, GST_CORE_ERROR_FAILED,
+ _("Error writing registry cache to %s: %s"),
+ registry_file, g_strerror (errno));
+@@ -884,11 +880,7 @@
+ if (result_code == REGISTRY_SCAN_AND_UPDATE_SUCCESS_UPDATED) {
+ GST_DEBUG ("Child succeeded. Parent reading registry cache");
+ _priv_gst_registry_remove_cache_plugins (default_registry);
+-#ifdef USE_BINARY_REGISTRY
+ gst_registry_binary_read_cache (default_registry, registry_file);
+-#else
+- gst_registry_xml_read_cache (default_registry, registry_file);
+-#endif
+ } else if (result_code == REGISTRY_SCAN_AND_UPDATE_FAILURE) {
+ GST_DEBUG ("Child failed. Parent re-scanning registry, ignoring errors.");
+ scan_and_update_registry (default_registry, registry_file, FALSE, NULL);
+@@ -911,21 +903,12 @@
+ default_registry = gst_registry_get_default ();
+ registry_file = g_strdup (g_getenv ("GST_REGISTRY"));
+ if (registry_file == NULL) {
+-#ifdef USE_BINARY_REGISTRY
+ registry_file = g_build_filename (g_get_home_dir (),
+ ".gstreamer-" GST_MAJORMINOR, "registry." HOST_CPU ".bin", NULL);
+-#else
+- registry_file = g_build_filename (g_get_home_dir (),
+- ".gstreamer-" GST_MAJORMINOR, "registry." HOST_CPU ".xml", NULL);
+-#endif
+ }
+
+ GST_INFO ("reading registry cache: %s", registry_file);
+-#ifdef USE_BINARY_REGISTRY
+ have_cache = gst_registry_binary_read_cache (default_registry, registry_file);
+-#else
+- have_cache = gst_registry_xml_read_cache (default_registry, registry_file);
+-#endif
+
+ if (have_cache) {
+ do_update = !_gst_disable_registry_update;
+@@ -1028,6 +1011,7 @@
+ g_type_class_ref (gst_clock_return_get_type ());
+ g_type_class_ref (gst_clock_entry_type_get_type ());
+ g_type_class_ref (gst_clock_flags_get_type ());
++ g_type_class_ref (gst_clock_type_get_type ());
+ g_type_class_ref (gst_debug_graph_details_get_type ());
+ g_type_class_ref (gst_state_get_type ());
+ g_type_class_ref (gst_state_change_return_get_type ());
+@@ -1068,8 +1052,11 @@
+ g_type_class_ref (gst_rank_get_type ());
+ g_type_class_ref (gst_query_type_get_type ());
+ g_type_class_ref (gst_buffering_mode_get_type ());
++ g_type_class_ref (gst_stream_status_type_get_type ());
++ g_type_class_ref (gst_structure_change_type_get_type ());
+ g_type_class_ref (gst_tag_merge_mode_get_type ());
+ g_type_class_ref (gst_tag_flag_get_type ());
++ g_type_class_ref (gst_task_pool_get_type ());
+ g_type_class_ref (gst_task_state_get_type ());
+ g_type_class_ref (gst_alloc_trace_flags_get_type ());
+ g_type_class_ref (gst_type_find_probability_get_type ());
+@@ -1084,6 +1071,7 @@
+ gst_caps_get_type ();
+ _gst_event_initialize ();
+ _gst_buffer_initialize ();
++ _gst_buffer_list_initialize ();
+ _gst_message_initialize ();
+ _gst_tag_initialize ();
+
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstclock.c gstreamer-0.10.23/gst/gstclock.c
+--- gstreamer-0.10.23.orig/gst/gstclock.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gstclock.c 2009-06-11 14:19:59.000000000 +0200
+@@ -28,7 +28,7 @@
+ *
+ * GStreamer uses a global clock to synchronize the plugins in a pipeline.
+ * Different clock implementations are possible by implementing this abstract
+- * base class.
++ * base class or, more conveniently, by subclassing #GstSystemClock.
+ *
+ * The #GstClock returns a monotonically increasing time with the method
+ * gst_clock_get_time(). Its accuracy and base time depend on the specific
+@@ -37,7 +37,7 @@
+ * meaningful in itself, what matters are the deltas between two clock times.
+ * The time returned by a clock is called the absolute time.
+ *
+- * The pipeline uses the clock to calculate the stream time. Usually all
++ * The pipeline uses the clock to calculate the running time. Usually all
+ * renderers synchronize to the global clock using the buffer timestamps, the
+ * newsegment events and the element's base time, see #GstPipeline.
+ *
+@@ -77,7 +77,7 @@
+ * state changes and if the entry would be unreffed automatically, the handle
+ * might become invalid without any notification.
+ *
+- * These clock operations do not operate on the stream time, so the callbacks
++ * These clock operations do not operate on the running time, so the callbacks
+ * will also occur when not in PLAYING state as if the clock just keeps on
+ * running. Some clocks however do not progress when the element that provided
+ * the clock is not PLAYING.
+@@ -99,7 +99,7 @@
+ * number of samples to use when calibrating and #GstClock:window-threshold
+ * defines the minimum number of samples before the calibration is performed.
+ *
+- * Last reviewed on 2006-08-11 (0.10.10)
++ * Last reviewed on 2009-05-21 (0.10.24)
+ */
+
+
+@@ -132,6 +132,41 @@
+ PROP_TIMEOUT
+ };
+
++struct _GstClockPrivate
++{
++ gint pre_count;
++ gint post_count;
++};
++
++/* seqlocks */
++#define read_seqbegin(clock) \
++ g_atomic_int_get (&clock->ABI.priv->post_count);
++
++static inline gboolean
++read_seqretry (GstClock * clock, gint seq)
++{
++ /* no retry if the seqnum did not change */
++ if (G_LIKELY (seq == g_atomic_int_get (&clock->ABI.priv->pre_count)))
++ return FALSE;
++
++ /* wait for the writer to finish and retry */
++ GST_OBJECT_LOCK (clock);
++ GST_OBJECT_UNLOCK (clock);
++ return TRUE;
++}
++
++#define write_seqlock(clock) \
++G_STMT_START { \
++ GST_OBJECT_LOCK (clock); \
++ g_atomic_int_inc (&clock->ABI.priv->pre_count); \
++} G_STMT_END;
++
++#define write_sequnlock(clock) \
++G_STMT_START { \
++ g_atomic_int_inc (&clock->ABI.priv->post_count); \
++ GST_OBJECT_UNLOCK (clock); \
++} G_STMT_END;
++
+ static void gst_clock_class_init (GstClockClass * klass);
+ static void gst_clock_init (GstClock * clock);
+ static void gst_clock_dispose (GObject * object);
+@@ -404,7 +439,7 @@
+ if (entry->type == GST_CLOCK_ENTRY_PERIODIC)
+ entry->time = requested + entry->interval;
+
+- if (clock->stats)
++ if (G_UNLIKELY (clock->stats))
+ gst_clock_update_stats (clock);
+
+ return res;
+@@ -520,7 +555,7 @@
+ }
+
+
+-/**
++/*
+ * GstClock abstract base class implementation
+ */
+ G_DEFINE_TYPE (GstClock, gst_clock, GST_TYPE_OBJECT);
+@@ -560,6 +595,8 @@
+ "The amount of time, in nanoseconds, to sample master and slave clocks",
+ 0, G_MAXUINT64, DEFAULT_TIMEOUT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
++
++ g_type_class_add_private (klass, sizeof (GstClockPrivate));
+ }
+
+ static void
+@@ -570,6 +607,9 @@
+ clock->entries_changed = g_cond_new ();
+ clock->stats = FALSE;
+
++ clock->ABI.priv =
++ G_TYPE_INSTANCE_GET_PRIVATE (clock, GST_TYPE_CLOCK, GstClockPrivate);
++
+ clock->internal_calibration = 0;
+ clock->external_calibration = 0;
+ clock->rate_numerator = 1;
+@@ -701,7 +741,7 @@
+ cdenom = clock->rate_denominator;
+
+ /* avoid divide by 0 */
+- if (cdenom == 0)
++ if (G_UNLIKELY (cdenom == 0))
+ cnum = cdenom = 1;
+
+ /* The formula is (internal - cinternal) * cnum / cdenom + cexternal
+@@ -711,12 +751,14 @@
+ * though.
+ */
+ if (G_LIKELY (internal >= cinternal)) {
+- ret = gst_util_uint64_scale (internal - cinternal, cnum, cdenom);
++ ret = internal - cinternal;
++ ret = gst_util_uint64_scale (ret, cnum, cdenom);
+ ret += cexternal;
+ } else {
+- ret = gst_util_uint64_scale (cinternal - internal, cnum, cdenom);
++ ret = cinternal - internal;
++ ret = gst_util_uint64_scale (ret, cnum, cdenom);
+ /* clamp to 0 */
+- if (cexternal > ret)
++ if (G_LIKELY (cexternal > ret))
+ ret = cexternal - ret;
+ else
+ ret = 0;
+@@ -756,16 +798,18 @@
+ cdenom = clock->rate_denominator;
+
+ /* avoid divide by 0 */
+- if (cnum == 0)
++ if (G_UNLIKELY (cnum == 0))
+ cnum = cdenom = 1;
+
+ /* The formula is (external - cexternal) * cdenom / cnum + cinternal */
+- if (external >= cexternal) {
+- ret = gst_util_uint64_scale (external - cexternal, cdenom, cnum);
++ if (G_LIKELY (external >= cexternal)) {
++ ret = external - cexternal;
++ ret = gst_util_uint64_scale (ret, cdenom, cnum);
+ ret += cinternal;
+ } else {
+- ret = gst_util_uint64_scale (cexternal - external, cdenom, cnum);
+- if (cinternal > ret)
++ ret = cexternal - external;
++ ret = gst_util_uint64_scale (ret, cdenom, cnum);
++ if (G_LIKELY (cinternal > ret))
+ ret = cinternal - ret;
+ else
+ ret = 0;
+@@ -831,15 +875,19 @@
+ gst_clock_get_time (GstClock * clock)
+ {
+ GstClockTime ret;
++ gint seq;
+
+ g_return_val_if_fail (GST_IS_CLOCK (clock), GST_CLOCK_TIME_NONE);
+
+- ret = gst_clock_get_internal_time (clock);
+-
+- GST_OBJECT_LOCK (clock);
+- /* this will scale for rate and offset */
+- ret = gst_clock_adjust_unlocked (clock, ret);
+- GST_OBJECT_UNLOCK (clock);
++ do {
++ /* reget the internal time when we retry to get the most current
++ * timevalue */
++ ret = gst_clock_get_internal_time (clock);
++
++ seq = read_seqbegin (clock);
++ /* this will scale for rate and offset */
++ ret = gst_clock_adjust_unlocked (clock, ret);
++ } while (read_seqretry (clock, seq));
+
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock, "adjusted time %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (ret));
+@@ -887,9 +935,8 @@
+ g_return_if_fail (GST_IS_CLOCK (clock));
+ g_return_if_fail (rate_num != GST_CLOCK_TIME_NONE);
+ g_return_if_fail (rate_denom > 0 && rate_denom != GST_CLOCK_TIME_NONE);
+- g_return_if_fail (internal <= gst_clock_get_internal_time (clock));
+
+- GST_OBJECT_LOCK (clock);
++ write_seqlock (clock);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, clock,
+ "internal %" GST_TIME_FORMAT " external %" GST_TIME_FORMAT " %"
+ G_GUINT64_FORMAT "/%" G_GUINT64_FORMAT " = %f", GST_TIME_ARGS (internal),
+@@ -900,7 +947,7 @@
+ clock->external_calibration = external;
+ clock->rate_numerator = rate_num;
+ clock->rate_denominator = rate_denom;
+- GST_OBJECT_UNLOCK (clock);
++ write_sequnlock (clock);
+ }
+
+ /**
+@@ -923,18 +970,21 @@
+ gst_clock_get_calibration (GstClock * clock, GstClockTime * internal,
+ GstClockTime * external, GstClockTime * rate_num, GstClockTime * rate_denom)
+ {
++ gint seq;
++
+ g_return_if_fail (GST_IS_CLOCK (clock));
+
+- GST_OBJECT_LOCK (clock);
+- if (rate_num)
+- *rate_num = clock->rate_numerator;
+- if (rate_denom)
+- *rate_denom = clock->rate_denominator;
+- if (external)
+- *external = clock->external_calibration;
+- if (internal)
+- *internal = clock->internal_calibration;
+- GST_OBJECT_UNLOCK (clock);
++ do {
++ seq = read_seqbegin (clock);
++ if (rate_num)
++ *rate_num = clock->rate_numerator;
++ if (rate_denom)
++ *rate_denom = clock->rate_denominator;
++ if (external)
++ *external = clock->external_calibration;
++ if (internal)
++ *internal = clock->internal_calibration;
++ } while (read_seqretry (clock, seq));
+ }
+
+ /* will be called repeatedly to sample the master and slave clock
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstclock.h gstreamer-0.10.23/gst/gstclock.h
+--- gstreamer-0.10.23.orig/gst/gstclock.h 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gstclock.h 2009-06-11 14:19:59.000000000 +0200
+@@ -235,6 +235,7 @@
+ typedef struct _GstClockEntry GstClockEntry;
+ typedef struct _GstClock GstClock;
+ typedef struct _GstClockClass GstClockClass;
++typedef struct _GstClockPrivate GstClockPrivate;
+
+ /* --- prototype for async callbacks --- */
+ /**
+@@ -447,7 +448,10 @@
+ GstClockID clockid;
+
+ /*< private >*/
+- GstClockTime _gst_reserved[GST_PADDING];
++ union {
++ GstClockPrivate *priv;
++ GstClockTime _gst_reserved[GST_PADDING];
++ } ABI;
+ };
+
+ /**
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstdebugutils.c gstreamer-0.10.23/gst/gstdebugutils.c
+--- gstreamer-0.10.23.orig/gst/gstdebugutils.c 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/gst/gstdebugutils.c 2009-06-11 14:19:59.000000000 +0200
+@@ -27,6 +27,11 @@
+ * - changing node-shape from box into record
+ * - use labels like : element [ label="{element | <src> src | <sink> sink}"]
+ * - point to record-connectors : element1:src -> element2:sink
++ * - we use head/tail labels for pad-caps right now
++ * - this does not work well, as dot seems to not llok at their sizen when
++ * doing the layout
++ * - we could add the caps to the pad itself, then we should use one line per
++ * caps (simple caps = one line)
+ */
+
+ #include "gst_private.h"
+@@ -131,18 +136,52 @@
+ }
+
+ static void
++debug_dump_pad (GstPad * pad, gchar * color_name, gchar * element_name,
++ FILE * out, const gint indent)
++{
++ GstPadTemplate *pad_templ;
++ GstPadPresence presence;
++ gchar *pad_name, *style_name;
++ gchar pad_flags[6];
++ const gchar *activation_mode = "-><";
++ const gchar *spc = &spaces[MAX (sizeof (spaces) - (1 + indent * 2), 0)];
++
++ pad_name = debug_dump_make_object_name (GST_OBJECT (pad));
++
++ /* pad availability */
++ style_name = "filled,solid";
++ if ((pad_templ = gst_pad_get_pad_template (pad))) {
++ presence = GST_PAD_TEMPLATE_PRESENCE (pad_templ);
++ if (presence == GST_PAD_SOMETIMES) {
++ style_name = "filled,dotted";
++ } else if (presence == GST_PAD_REQUEST) {
++ style_name = "filled,dashed";
++ }
++ }
++ /* check if pad flags */
++ pad_flags[0] = GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_BLOCKED) ? 'B' : 'b';
++ pad_flags[1] = GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_FLUSHING) ? 'F' : 'f';
++ pad_flags[2] = GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_IN_GETCAPS) ? 'G' : 'g';
++ pad_flags[3] = GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_IN_SETCAPS) ? 's' : 's';
++ pad_flags[4] = GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_BLOCKING) ? 'B' : 'b';
++ pad_flags[5] = '\0';
++
++ fprintf (out, "%s %s_%s [color=black, fillcolor=\"%s\", label=\"%s\\n[%c][%s]\", height=\"0.2\", style=\"%s\"];\n", spc, element_name, pad_name, color_name, GST_OBJECT_NAME (pad), activation_mode[pad->mode], /* NONE/PUSH/PULL */
++ pad_flags, style_name);
++
++ g_free (pad_name);
++}
++
++static void
+ debug_dump_element_pad (GstPad * pad, GstElement * element,
+ GstDebugGraphDetails details, FILE * out, const gint indent)
+ {
+ GstElement *target_element;
+ GstPad *target_pad, *tmp_pad;
+ GstPadDirection dir;
+- GstPadTemplate *pad_templ;
+- GstPadPresence presence;
+ gchar *pad_name, *element_name;
+- gchar *target_pad_name, *target_element_name;
+- gchar *color_name, *style_name;
+- const gchar *spc = &spaces[MAX (sizeof (spaces) - (1 + indent * 2), 0)];
++ gchar *target_element_name;
++ gchar *color_name;
+
+ dir = gst_pad_get_direction (pad);
+ pad_name = debug_dump_make_object_name (GST_OBJECT (pad));
+@@ -154,27 +193,14 @@
+ /* output target-pad so that it belongs to this element */
+ if ((tmp_pad = gst_ghost_pad_get_target (GST_GHOST_PAD (pad)))) {
+ if ((target_pad = gst_pad_get_peer (tmp_pad))) {
+- target_pad_name = debug_dump_make_object_name (GST_OBJECT (target_pad));
+ if ((target_element = gst_pad_get_parent_element (target_pad))) {
+ target_element_name =
+ debug_dump_make_object_name (GST_OBJECT (target_element));
+ } else {
+ target_element_name = "";
+ }
+- style_name = "filled,solid";
+- if ((pad_templ = gst_pad_get_pad_template (target_pad))) {
+- presence = GST_PAD_TEMPLATE_PRESENCE (pad_templ);
+- if (presence == GST_PAD_SOMETIMES) {
+- style_name = "filled,dotted";
+- } else if (presence == GST_PAD_REQUEST) {
+- style_name = "filled,dashed";
+- }
+- }
+- fprintf (out,
+- "%s %s_%s [color=black, fillcolor=\"%s\", label=\"%s\", height=\"0.2\", style=\"%s\"];\n",
+- spc, target_element_name, target_pad_name, color_name,
+- GST_OBJECT_NAME (target_pad), style_name);
+- g_free (target_pad_name);
++ debug_dump_pad (target_pad, color_name, target_element_name, out,
++ indent);
+ if (target_element) {
+ g_free (target_element_name);
+ gst_object_unref (target_element);
+@@ -189,21 +215,7 @@
+ GST_PAD_SINK) ? "#aaaaff" : "#cccccc");
+ }
+ /* pads */
+- style_name = "filled,solid";
+- if ((pad_templ = gst_pad_get_pad_template (pad))) {
+- presence = GST_PAD_TEMPLATE_PRESENCE (pad_templ);
+- if (presence == GST_PAD_SOMETIMES) {
+- style_name = "filled,dotted";
+- } else if (presence == GST_PAD_REQUEST) {
+- style_name = "filled,dashed";
+- }
+- }
+- fprintf (out,
+- "%s %s_%s [color=black, fillcolor=\"%s\", label=\"%s\", height=\"0.2\", style=\"%s\"];\n",
+- spc, element_name, pad_name, color_name, GST_OBJECT_NAME (pad),
+- style_name);
+-
+- g_free (pad_name);
++ debug_dump_pad (pad, color_name, element_name, out, indent);
+ g_free (element_name);
+ }
+
+@@ -441,8 +453,8 @@
+ } else if (media_src && media_sink) {
+ /* dot has some issues with placement of head and taillabels,
+ * we need an empty label to make space */
+- fprintf (out, "%s%s_%s -> %s_%s [labeldistance=\"5\", labelangle=\"0\", "
+- "label=\" \", "
++ fprintf (out, "%s%s_%s -> %s_%s [labeldistance=\"10\", labelangle=\"0\", "
++ "label=\" \", "
+ "headlabel=\"%s\", taillabel=\"%s\"]\n",
+ spc, element_name, pad_name, peer_element_name, peer_pad_name,
+ media_src, media_sink);
+@@ -650,13 +662,13 @@
+ "digraph pipeline {\n"
+ " rankdir=LR;\n"
+ " fontname=\"sans\";\n"
+- " fontsize=\"8\";\n"
++ " fontsize=\"10\";\n"
+ " labelloc=t;\n"
+ " nodesep=.1;\n"
+ " ranksep=.2;\n"
+ " label=\"<%s>\\n%s%s%s\";\n"
+- " node [style=filled, shape=box, fontsize=\"7\", fontname=\"sans\", margin=\"0.0,0.0\"];\n"
+- " edge [labelfontsize=\"7\", fontsize=\"7\", fontname=\"monospace\"];\n"
++ " node [style=filled, shape=box, fontsize=\"9\", fontname=\"sans\", margin=\"0.0,0.0\"];\n"
++ " edge [labelfontsize=\"6\", fontsize=\"9\", fontname=\"monospace\"];\n"
+ "\n", G_OBJECT_TYPE_NAME (bin), GST_OBJECT_NAME (bin),
+ (state_name ? state_name : ""), (param_name ? param_name : "")
+ );
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstelement.c gstreamer-0.10.23/gst/gstelement.c
+--- gstreamer-0.10.23.orig/gst/gstelement.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gstelement.c 2009-06-11 14:19:59.000000000 +0200
+@@ -73,7 +73,7 @@
+ * toplevel #GstPipeline so the clock functions are only to be used in very
+ * specific situations.
+ *
+- * Last reviewed on 2006-03-12 (0.10.5)
++ * Last reviewed on 2009-05-29 (0.10.24)
+ */
+
+ #include "gst_private.h"
+@@ -145,6 +145,9 @@
+ static GstObjectClass *parent_class = NULL;
+ static guint gst_element_signals[LAST_SIGNAL] = { 0 };
+
++/* this is used in gstelementfactory.c:gst_element_register() */
++GQuark _gst_elementclass_factory = 0;
++
+ GType
+ gst_element_get_type (void)
+ {
+@@ -167,6 +170,9 @@
+
+ _type = g_type_register_static (GST_TYPE_OBJECT, "GstElement",
+ &element_info, G_TYPE_FLAG_ABSTRACT);
++
++ _gst_elementclass_factory =
++ g_quark_from_static_string ("GST_ELEMENTCLASS_FACTORY");
+ g_once_init_leave (&gst_element_type, _type);
+ }
+ return gst_element_type;
+@@ -252,6 +258,13 @@
+ */
+ memset (&element_class->details, 0, sizeof (GstElementDetails));
+ element_class->padtemplates = NULL;
++
++ /* set the factory, see gst_element_register() */
++ element_class->elementfactory =
++ g_type_get_qdata (G_TYPE_FROM_CLASS (element_class),
++ _gst_elementclass_factory);
++ GST_DEBUG ("type %s : factory %p", G_OBJECT_CLASS_NAME (element_class),
++ element_class->elementfactory);
+ }
+
+ static void
+@@ -510,7 +523,7 @@
+ * Returns the base time of the element. The base time is the
+ * absolute time of the clock when this element was last put to
+ * PLAYING. Subtracting the base time from the clock time gives
+- * the stream time of the element.
++ * the running time of the element.
+ *
+ * Returns: the base time of the element.
+ *
+@@ -531,6 +544,73 @@
+ }
+
+ /**
++ * gst_element_set_start_time:
++ * @element: a #GstElement.
++ * @time: the base time to set.
++ *
++ * Set the start time of an element. The start time of the element is the
++ * running time of the element when it last went to the PAUSED state. In READY
++ * or after a flushing seek, it is set to 0.
++ *
++ * Toplevel elements like #GstPipeline will manage the start_time and
++ * base_time on its children. Setting the start_time to #GST_CLOCK_TIME_NONE
++ * on such a toplevel element will disable the distribution of the base_time to
++ * the children and can be useful if the application manages the base_time
++ * itself, for example if you want to synchronize capture from multiple
++ * pipelines, and you can also ensure that the pipelines have the same clock.
++ *
++ * MT safe.
++ *
++ * Since: 0.10.24
++ */
++void
++gst_element_set_start_time (GstElement * element, GstClockTime time)
++{
++ GstClockTime old;
++
++ g_return_if_fail (GST_IS_ELEMENT (element));
++
++ GST_OBJECT_LOCK (element);
++ old = GST_ELEMENT_START_TIME (element);
++ GST_ELEMENT_START_TIME (element) = time;
++ GST_OBJECT_UNLOCK (element);
++
++ GST_CAT_DEBUG_OBJECT (GST_CAT_CLOCK, element,
++ "set start_time=%" GST_TIME_FORMAT ", old %" GST_TIME_FORMAT,
++ GST_TIME_ARGS (time), GST_TIME_ARGS (old));
++}
++
++/**
++ * gst_element_get_start_time:
++ * @element: a #GstElement.
++ *
++ * Returns the start time of the element. The start time is the
++ * running time of the clock when this element was last put to PAUSED.
++ *
++ * Usually the start_time is managed by a toplevel element such as
++ * #GstPipeline.
++ *
++ * MT safe.
++ *
++ * Returns: the start time of the element.
++ *
++ * Since: 0.10.24
++ */
++GstClockTime
++gst_element_get_start_time (GstElement * element)
++{
++ GstClockTime result;
++
++ g_return_val_if_fail (GST_IS_ELEMENT (element), GST_CLOCK_TIME_NONE);
++
++ GST_OBJECT_LOCK (element);
++ result = GST_ELEMENT_START_TIME (element);
++ GST_OBJECT_UNLOCK (element);
++
++ return result;
++}
++
++/**
+ * gst_element_is_indexable:
+ * @element: a #GstElement.
+ *
+@@ -1893,7 +1973,7 @@
+ } else {
+ timeval = NULL;
+ }
+- /* get cookie to dected state change during waiting */
++ /* get cookie to detect state changes during waiting */
+ cookie = element->state_cookie;
+
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+@@ -2176,15 +2256,16 @@
+ }
+
+ /**
+- * gst_element_lost_state:
++ * gst_element_lost_state_full:
+ * @element: a #GstElement the state is lost of
++ * @new_base_time: if a new base time should be distributed
+ *
+ * Brings the element to the lost state. The current state of the
+ * element is copied to the pending state so that any call to
+ * gst_element_get_state() will return %GST_STATE_CHANGE_ASYNC.
+ *
+- * An ASYNC_START message is posted with an indication to distribute a new
+- * base_time to the element.
++ * An ASYNC_START message is posted with indication to distribute a new
++ * base_time to the element when @new_base_time is %TRUE.
+ * If the element was PLAYING, it will go to PAUSED. The element
+ * will be restored to its PLAYING state by the parent pipeline when it
+ * prerolls again.
+@@ -2199,9 +2280,11 @@
+ * plugins or applications.
+ *
+ * MT safe.
++ *
++ * Since: 0.10.24
+ */
+ void
+-gst_element_lost_state (GstElement * element)
++gst_element_lost_state_full (GstElement * element, gboolean new_base_time)
+ {
+ GstState old_state, new_state;
+ GstMessage *message;
+@@ -2209,10 +2292,12 @@
+ g_return_if_fail (GST_IS_ELEMENT (element));
+
+ GST_OBJECT_LOCK (element);
+- if (GST_STATE_PENDING (element) != GST_STATE_VOID_PENDING ||
+- GST_STATE_RETURN (element) == GST_STATE_CHANGE_FAILURE)
++ if (GST_STATE_RETURN (element) == GST_STATE_CHANGE_FAILURE)
+ goto nothing_lost;
+
++ if (GST_STATE_PENDING (element) != GST_STATE_VOID_PENDING)
++ goto only_async_start;
++
+ old_state = GST_STATE (element);
+
+ /* when we were PLAYING, the new state is PAUSED. We will also not
+@@ -2231,13 +2316,16 @@
+ GST_STATE_NEXT (element) = new_state;
+ GST_STATE_PENDING (element) = new_state;
+ GST_STATE_RETURN (element) = GST_STATE_CHANGE_ASYNC;
++ if (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);
+
+- message = gst_message_new_async_start (GST_OBJECT_CAST (element), TRUE);
++ message =
++ gst_message_new_async_start (GST_OBJECT_CAST (element), new_base_time);
+ gst_element_post_message (element, message);
+
+ return;
+@@ -2247,6 +2335,32 @@
+ GST_OBJECT_UNLOCK (element);
+ return;
+ }
++only_async_start:
++ {
++ GST_OBJECT_UNLOCK (element);
++
++ message = gst_message_new_async_start (GST_OBJECT_CAST (element), TRUE);
++ gst_element_post_message (element, message);
++ return;
++ }
++}
++
++/**
++ * gst_element_lost_state:
++ * @element: a #GstElement the state is lost of
++ *
++ * Brings the element to the lost state. This function calls
++ * gst_element_lost_state_full() with the new_base_time set to %TRUE.
++ *
++ * This function is used internally and should normally not be called from
++ * plugins or applications.
++ *
++ * MT safe.
++ */
++void
++gst_element_lost_state (GstElement * element)
++{
++ gst_element_lost_state_full (element, TRUE);
+ }
+
+ /**
+@@ -2854,7 +2968,7 @@
+
+ g_free (specs);
+
+- pads = GST_ELEMENT_PADS (element);
++ pads = g_list_last (GST_ELEMENT_PADS (element));
+
+ while (pads) {
+ GstPad *pad = GST_PAD_CAST (pads->data);
+@@ -2865,7 +2979,7 @@
+
+ gst_object_save_thyself (GST_OBJECT_CAST (pad), padtag);
+ }
+- pads = g_list_next (pads);
++ pads = g_list_previous (pads);
+ }
+
+ return parent;
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstelementfactory.c gstreamer-0.10.23/gst/gstelementfactory.c
+--- gstreamer-0.10.23.orig/gst/gstelementfactory.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gstelementfactory.c 2009-06-11 15:10:57.000000000 +0200
+@@ -79,6 +79,9 @@
+
+ /* static guint gst_element_factory_signals[LAST_SIGNAL] = { 0 }; */
+
++/* this is defined in gstelement.c */
++extern GQuark _gst_elementclass_factory;
++
+ #define _do_init \
+ { \
+ GST_DEBUG_CATEGORY_INIT (element_factory_debug, "GST_ELEMENT_FACTORY", \
+@@ -193,8 +196,7 @@
+
+ __gst_element_details_clear (&factory->details);
+ if (factory->type) {
+- g_type_class_unref (g_type_class_peek (factory->type));
+- factory->type = 0;
++ factory->type = G_TYPE_INVALID;
+ }
+
+ for (item = factory->staticpadtemplates; item; item = item->next) {
+@@ -249,6 +251,8 @@
+ gst_element_register (GstPlugin * plugin, const gchar * name, guint rank,
+ GType type)
+ {
++ GstPluginFeature *existing_feature;
++ GstRegistry *registry;
+ GstElementFactory *factory;
+ GType *interfaces;
+ guint n_interfaces, i;
+@@ -258,8 +262,27 @@
+ g_return_val_if_fail (name != NULL, FALSE);
+ g_return_val_if_fail (g_type_is_a (type, GST_TYPE_ELEMENT), FALSE);
+
+- factory = GST_ELEMENT_FACTORY (g_object_new (GST_TYPE_ELEMENT_FACTORY, NULL));
+- gst_plugin_feature_set_name (GST_PLUGIN_FEATURE (factory), name);
++ registry = gst_registry_get_default ();
++
++ /* check if feature already exists, if it exists there is no need to update it
++ * when the registry is getting updated, outdated plugins and all there
++ * feature are removed and readded.
++ */
++ existing_feature = gst_registry_lookup_feature (registry, name);
++ if (existing_feature) {
++ GST_DEBUG_OBJECT (registry, "update existing feature %p (%s)",
++ existing_feature, name);
++ factory = GST_ELEMENT_FACTORY_CAST (existing_feature);
++ factory->type = type;
++ existing_feature->loaded = TRUE;
++ g_type_set_qdata (type, _gst_elementclass_factory, factory);
++ gst_object_unref (existing_feature);
++ return TRUE;
++ }
++
++ factory =
++ GST_ELEMENT_FACTORY_CAST (g_object_new (GST_TYPE_ELEMENT_FACTORY, NULL));
++ gst_plugin_feature_set_name (GST_PLUGIN_FEATURE_CAST (factory), name);
+ GST_LOG_OBJECT (factory, "Created new elementfactory for type %s",
+ g_type_name (type));
+
+@@ -283,7 +306,7 @@
+ g_list_append (factory->staticpadtemplates, newt);
+ }
+ factory->numpadtemplates = klass->numpadtemplates;
+- klass->elementfactory = factory;
++ g_type_set_qdata (type, _gst_elementclass_factory, factory);
+
+ /* special stuff for URI handling */
+ if (g_type_is_a (type, GST_TYPE_URI_HANDLER)) {
+@@ -314,15 +337,14 @@
+ g_free (interfaces);
+
+ if (plugin && plugin->desc.name) {
+- GST_PLUGIN_FEATURE (factory)->plugin_name = plugin->desc.name;
++ GST_PLUGIN_FEATURE_CAST (factory)->plugin_name = plugin->desc.name;
+ } else {
+- GST_PLUGIN_FEATURE (factory)->plugin_name = "NULL";
++ GST_PLUGIN_FEATURE_CAST (factory)->plugin_name = "NULL";
+ }
+- gst_plugin_feature_set_rank (GST_PLUGIN_FEATURE (factory), rank);
+- GST_PLUGIN_FEATURE (factory)->loaded = TRUE;
++ gst_plugin_feature_set_rank (GST_PLUGIN_FEATURE_CAST (factory), rank);
++ GST_PLUGIN_FEATURE_CAST (factory)->loaded = TRUE;
+
+- gst_registry_add_feature (gst_registry_get_default (),
+- GST_PLUGIN_FEATURE (factory));
++ gst_registry_add_feature (registry, GST_PLUGIN_FEATURE_CAST (factory));
+
+ return TRUE;
+
+@@ -388,16 +410,16 @@
+
+ /* fill in the pointer to the factory in the element class. The
+ * class will not be unreffed currently.
+- * FIXME: This isn't safe and may leak a refcount on the factory if 2 threads
+- * create the first instance of an element at the same moment */
++ * Be thread safe as there might be 2 threads creating the first instance of
++ * an element at the same moment
++ */
+ oclass = GST_ELEMENT_GET_CLASS (element);
+- if (G_UNLIKELY (oclass->elementfactory == NULL))
+- oclass->elementfactory = factory;
+- else
++ if (!g_atomic_pointer_compare_and_exchange (
++ (gpointer) & oclass->elementfactory, NULL, factory))
+ gst_object_unref (factory);
+
+ if (name)
+- gst_object_set_name (GST_OBJECT (element), name);
++ gst_object_set_name (GST_OBJECT_CAST (element), name);
+
+ GST_DEBUG ("created element \"%s\"", GST_PLUGIN_FEATURE_NAME (factory));
+
+@@ -406,7 +428,8 @@
+ /* ERRORS */
+ load_failed:
+ {
+- GST_WARNING_OBJECT (factory, "loading plugin returned NULL!");
++ GST_WARNING_OBJECT (factory,
++ "loading plugin containing feature %s returned NULL!", name);
+ return NULL;
+ }
+ no_type:
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstelementfactory.c~ gstreamer-0.10.23/gst/gstelementfactory.c~
+--- gstreamer-0.10.23.orig/gst/gstelementfactory.c~ 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/gst/gstelementfactory.c~ 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,706 @@
++/* GStreamer
++ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
++ * 2000 Wim Taymans <wtay@chello.be>
++ * 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
++ *
++ * gstelementfactory.c: GstElementFactory object, support routines
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++/**
++ * SECTION:gstelementfactory
++ * @short_description: Create GstElements from a factory
++ * @see_also: #GstElement, #GstPlugin, #GstPluginFeature, #GstPadTemplate.
++ *
++ * #GstElementFactory is used to create instances of elements. A
++ * GstElementfactory can be added to a #GstPlugin as it is also a
++ * #GstPluginFeature.
++ *
++ * Use the gst_element_factory_find() and gst_element_factory_create()
++ * functions to create element instances or use gst_element_factory_make() as a
++ * convenient shortcut.
++ *
++ * The following code example shows you how to create a GstFileSrc element.
++ *
++ * <example>
++ * <title>Using an element factory</title>
++ * <programlisting language="c">
++ * #include <gst/gst.h>
++ *
++ * GstElement *src;
++ * GstElementFactory *srcfactory;
++ *
++ * gst_init (&argc, &argv);
++ *
++ * srcfactory = gst_element_factory_find ("filesrc");
++ * g_return_if_fail (srcfactory != NULL);
++ * src = gst_element_factory_create (srcfactory, "src");
++ * g_return_if_fail (src != NULL);
++ * ...
++ * </programlisting>
++ * </example>
++ *
++ * Last reviewed on 2005-11-23 (0.9.5)
++ */
++
++#include "gst_private.h"
++
++#include "gstelement.h"
++#include "gstinfo.h"
++#include "gsturi.h"
++#include "gstregistry.h"
++
++#include "glib-compat-private.h"
++
++GST_DEBUG_CATEGORY_STATIC (element_factory_debug);
++#define GST_CAT_DEFAULT element_factory_debug
++
++static void gst_element_factory_class_init (GstElementFactoryClass * klass);
++static void gst_element_factory_init (GstElementFactory * factory);
++static void gst_element_factory_finalize (GObject * object);
++void __gst_element_details_clear (GstElementDetails * dp);
++static void gst_element_factory_cleanup (GstElementFactory * factory);
++
++static GstPluginFeatureClass *parent_class = NULL;
++
++/* static guint gst_element_factory_signals[LAST_SIGNAL] = { 0 }; */
++
++/* this is defined in gstelement.c */
++extern GQuark _gst_elementclass_factory;
++
++#define _do_init \
++{ \
++ GST_DEBUG_CATEGORY_INIT (element_factory_debug, "GST_ELEMENT_FACTORY", \
++ GST_DEBUG_BOLD | GST_DEBUG_FG_WHITE | GST_DEBUG_BG_RED, \
++ "element factories keep information about installed elements"); \
++}
++
++G_DEFINE_TYPE_WITH_CODE (GstElementFactory, gst_element_factory,
++ GST_TYPE_PLUGIN_FEATURE, _do_init);
++
++static void
++gst_element_factory_class_init (GstElementFactoryClass * klass)
++{
++ GObjectClass *gobject_class = (GObjectClass *) klass;
++
++ parent_class = g_type_class_peek_parent (klass);
++
++ gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_element_factory_finalize);
++}
++
++static void
++gst_element_factory_init (GstElementFactory * factory)
++{
++ factory->staticpadtemplates = NULL;
++ factory->numpadtemplates = 0;
++
++ factory->uri_type = GST_URI_UNKNOWN;
++ factory->uri_protocols = NULL;
++
++ factory->interfaces = NULL;
++}
++
++static void
++gst_element_factory_finalize (GObject * object)
++{
++ GstElementFactory *factory = GST_ELEMENT_FACTORY (object);
++
++ gst_element_factory_cleanup (factory);
++ G_OBJECT_CLASS (parent_class)->finalize (object);
++}
++
++/**
++ * gst_element_factory_find:
++ * @name: name of factory to find
++ *
++ * Search for an element factory of the given name. Refs the returned
++ * element factory; caller is responsible for unreffing.
++ *
++ * Returns: #GstElementFactory if found, NULL otherwise
++ */
++GstElementFactory *
++gst_element_factory_find (const gchar * name)
++{
++ GstPluginFeature *feature;
++
++ g_return_val_if_fail (name != NULL, NULL);
++
++ feature = gst_registry_find_feature (gst_registry_get_default (), name,
++ GST_TYPE_ELEMENT_FACTORY);
++ if (feature)
++ return GST_ELEMENT_FACTORY (feature);
++
++ /* this isn't an error, for instance when you query if an element factory is
++ * present */
++ GST_LOG ("no such element factory \"%s\"", name);
++ return NULL;
++}
++
++void
++__gst_element_details_clear (GstElementDetails * dp)
++{
++ g_free (dp->longname);
++ g_free (dp->klass);
++ g_free (dp->description);
++ g_free (dp->author);
++ memset (dp, 0, sizeof (GstElementDetails));
++}
++
++#define VALIDATE_SET(__dest, __src, __entry) \
++G_STMT_START { \
++ if (g_utf8_validate (__src->__entry, -1, NULL)) { \
++ __dest->__entry = g_strdup (__src->__entry); \
++ } else { \
++ g_warning ("Invalid UTF-8 in " G_STRINGIFY (__entry) ": %s", \
++ __src->__entry); \
++ __dest->__entry = g_strdup ("[ERROR: invalid UTF-8]"); \
++ } \
++} G_STMT_END
++
++void
++__gst_element_details_set (GstElementDetails * dest,
++ const GstElementDetails * src)
++{
++ VALIDATE_SET (dest, src, longname);
++ VALIDATE_SET (dest, src, klass);
++ VALIDATE_SET (dest, src, description);
++ VALIDATE_SET (dest, src, author);
++}
++
++void
++__gst_element_details_copy (GstElementDetails * dest,
++ const GstElementDetails * src)
++{
++ __gst_element_details_clear (dest);
++ __gst_element_details_set (dest, src);
++}
++
++static void
++gst_element_factory_cleanup (GstElementFactory * factory)
++{
++ GList *item;
++
++ __gst_element_details_clear (&factory->details);
++ if (factory->type) {
++ factory->type = G_TYPE_INVALID;
++ }
++
++ for (item = factory->staticpadtemplates; item; item = item->next) {
++ GstStaticPadTemplate *templ = item->data;
++ GstCaps *caps = (GstCaps *) & (templ->static_caps);
++
++ g_free ((gchar *) templ->static_caps.string);
++
++ /* FIXME: this is not threadsafe */
++ if (caps->refcount == 1) {
++ GstStructure *structure;
++ guint i;
++
++ for (i = 0; i < caps->structs->len; i++) {
++ structure = (GstStructure *) gst_caps_get_structure (caps, i);
++ gst_structure_set_parent_refcount (structure, NULL);
++ gst_structure_free (structure);
++ }
++ g_ptr_array_free (caps->structs, TRUE);
++ caps->refcount = 0;
++ }
++ g_free (templ);
++ }
++ g_list_free (factory->staticpadtemplates);
++ factory->staticpadtemplates = NULL;
++ factory->numpadtemplates = 0;
++ factory->uri_type = GST_URI_UNKNOWN;
++ if (factory->uri_protocols) {
++ g_strfreev (factory->uri_protocols);
++ factory->uri_protocols = NULL;
++ }
++
++ g_list_foreach (factory->interfaces, (GFunc) g_free, NULL);
++ g_list_free (factory->interfaces);
++ factory->interfaces = NULL;
++}
++
++/**
++ * gst_element_register:
++ * @plugin: #GstPlugin to register the element with, or NULL for a static
++ * element (note that passing NULL only works in GStreamer 0.10.13 and later)
++ * @name: name of elements of this type
++ * @rank: rank of element (higher rank means more importance when autoplugging)
++ * @type: GType of element to register
++ *
++ * Create a new elementfactory capable of instantiating objects of the
++ * @type and add the factory to @plugin.
++ *
++ * Returns: TRUE, if the registering succeeded, FALSE on error
++ */
++gboolean
++gst_element_register (GstPlugin * plugin, const gchar * name, guint rank,
++ GType type)
++{
++ GstPluginFeature *existing_feature;
++ GstRegistry *registry;
++ GstElementFactory *factory;
++ GType *interfaces;
++ guint n_interfaces, i;
++ GstElementClass *klass;
++ GList *item;
++
++ g_return_val_if_fail (name != NULL, FALSE);
++ g_return_val_if_fail (g_type_is_a (type, GST_TYPE_ELEMENT), FALSE);
++
++ registry = gst_registry_get_default ();
++
++ /* check if feature already exists, if it exists there is no need to update it
++ * when the registry is getting updated, outdated plugins and all there
++ * feature are removed and readded.
++ */
++ existing_feature = gst_registry_lookup_feature (registry, name);
++ if (existing_feature) {
++ GST_DEBUG_OBJECT (registry, "update existing feature %p (%s)",
++ existing_feature, name);
++ factory = GST_ELEMENT_FACTORY_CAST (existing_feature);
++ factory->type = type;
++ existing_feature->loaded = TRUE;
++ g_type_set_qdata (type, _gst_elementclass_factory, factory);
++ gst_object_unref (existing_feature);
++ return TRUE;
++ }
++
++ factory =
++ GST_ELEMENT_FACTORY_CAST (g_object_new (GST_TYPE_ELEMENT_FACTORY, NULL));
++ gst_plugin_feature_set_name (GST_PLUGIN_FEATURE_CAST (factory), name);
++ GST_LOG_OBJECT (factory, "Created new elementfactory for type %s",
++ g_type_name (type));
++
++ klass = GST_ELEMENT_CLASS (g_type_class_ref (type));
++ if ((klass->details.longname == NULL) ||
++ (klass->details.klass == NULL) || (klass->details.author == NULL))
++ goto detailserror;
++
++ factory->type = type;
++ __gst_element_details_copy (&factory->details, &klass->details);
++ for (item = klass->padtemplates; item; item = item->next) {
++ GstPadTemplate *templ = item->data;
++ GstStaticPadTemplate *newt;
++
++ newt = g_new0 (GstStaticPadTemplate, 1);
++ newt->name_template = g_intern_string (templ->name_template);
++ newt->direction = templ->direction;
++ newt->presence = templ->presence;
++ newt->static_caps.string = gst_caps_to_string (templ->caps);
++ factory->staticpadtemplates =
++ g_list_append (factory->staticpadtemplates, newt);
++ }
++ factory->numpadtemplates = klass->numpadtemplates;
++ g_type_set_qdata (type, _gst_elementclass_factory, factory);
++
++ /* special stuff for URI handling */
++ if (g_type_is_a (type, GST_TYPE_URI_HANDLER)) {
++ GstURIHandlerInterface *iface = (GstURIHandlerInterface *)
++ g_type_interface_peek (klass, GST_TYPE_URI_HANDLER);
++
++ if (!iface || (!iface->get_type && !iface->get_type_full) ||
++ (!iface->get_protocols && !iface->get_protocols_full))
++ goto urierror;
++ if (iface->get_type)
++ factory->uri_type = iface->get_type ();
++ else if (iface->get_type_full)
++ factory->uri_type = iface->get_type_full (factory->type);
++ if (!GST_URI_TYPE_IS_VALID (factory->uri_type))
++ goto urierror;
++ if (iface->get_protocols)
++ factory->uri_protocols = g_strdupv (iface->get_protocols ());
++ else if (iface->get_protocols_full)
++ factory->uri_protocols = iface->get_protocols_full (factory->type);
++ if (!factory->uri_protocols)
++ goto urierror;
++ }
++
++ interfaces = g_type_interfaces (type, &n_interfaces);
++ for (i = 0; i < n_interfaces; i++) {
++ __gst_element_factory_add_interface (factory, g_type_name (interfaces[i]));
++ }
++ g_free (interfaces);
++
++ if (plugin && plugin->desc.name) {
++ GST_PLUGIN_FEATURE_CAST (factory)->plugin_name = plugin->desc.name;
++ } else {
++ GST_PLUGIN_FEATURE_CAST (factory)->plugin_name = "NULL";
++ }
++ gst_plugin_feature_set_rank (GST_PLUGIN_FEATURE_CAST (factory), rank);
++ GST_PLUGIN_FEATURE_CAST (factory)->loaded = TRUE;
++
++ gst_registry_add_feature (registry, GST_PLUGIN_FEATURE_CAST (factory));
++
++ return TRUE;
++
++ /* ERRORS */
++urierror:
++ {
++ GST_WARNING_OBJECT (factory, "error with uri handler!");
++ gst_element_factory_cleanup (factory);
++ return FALSE;
++ }
++
++detailserror:
++ {
++ GST_WARNING_OBJECT (factory,
++ "The GstElementDetails don't seem to have been set properly");
++ gst_element_factory_cleanup (factory);
++ return FALSE;
++ }
++}
++
++/**
++ * gst_element_factory_create:
++ * @factory: factory to instantiate
++ * @name: name of new element
++ *
++ * Create a new element of the type defined by the given elementfactory.
++ * It will be given the name supplied, since all elements require a name as
++ * their first argument.
++ *
++ * Returns: new #GstElement or NULL if the element couldn't be created
++ */
++GstElement *
++gst_element_factory_create (GstElementFactory * factory, const gchar * name)
++{
++ GstElement *element;
++ GstElementClass *oclass;
++ GstElementFactory *newfactory;
++
++ g_return_val_if_fail (factory != NULL, NULL);
++
++ newfactory =
++ GST_ELEMENT_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE
++ (factory)));
++
++ if (newfactory == NULL)
++ goto load_failed;
++
++ factory = newfactory;
++
++ if (name)
++ GST_INFO ("creating element \"%s\" named \"%s\"",
++ GST_PLUGIN_FEATURE_NAME (factory), GST_STR_NULL (name));
++ else
++ GST_INFO ("creating element \"%s\"", GST_PLUGIN_FEATURE_NAME (factory));
++
++ if (factory->type == 0)
++ goto no_type;
++
++ /* create an instance of the element, cast so we don't assert on NULL */
++ element = GST_ELEMENT_CAST (g_object_new (factory->type, NULL));
++ if (G_UNLIKELY (element == NULL))
++ goto no_element;
++
++ /* fill in the pointer to the factory in the element class. The
++ * class will not be unreffed currently.
++ * Be thread safe as there might be 2 threads creating the first instance of
++ * an element at the same moment
++ */
++ oclass = GST_ELEMENT_GET_CLASS (element);
++ if (!g_atomic_pointer_compare_and_exchange (
++ (gpointer *) & oclass->elementfactory, NULL, factory))
++ gst_object_unref (factory);
++
++ if (name)
++ gst_object_set_name (GST_OBJECT_CAST (element), name);
++
++ GST_DEBUG ("created element \"%s\"", GST_PLUGIN_FEATURE_NAME (factory));
++
++ return element;
++
++ /* ERRORS */
++load_failed:
++ {
++ GST_WARNING_OBJECT (factory,
++ "loading plugin containing feature %s returned NULL!", name);
++ return NULL;
++ }
++no_type:
++ {
++ GST_WARNING_OBJECT (factory, "factory has no type");
++ gst_object_unref (factory);
++ return NULL;
++ }
++no_element:
++ {
++ GST_WARNING_OBJECT (factory, "could not create element");
++ gst_object_unref (factory);
++ return NULL;
++ }
++}
++
++/**
++ * gst_element_factory_make:
++ * @factoryname: a named factory to instantiate
++ * @name: name of new element
++ *
++ * Create a new element of the type defined by the given element factory.
++ * If name is NULL, then the element will receive a guaranteed unique name,
++ * consisting of the element factory name and a number.
++ * If name is given, it will be given the name supplied.
++ *
++ * Returns: new #GstElement or NULL if unable to create element
++ */
++GstElement *
++gst_element_factory_make (const gchar * factoryname, const gchar * name)
++{
++ GstElementFactory *factory;
++ GstElement *element;
++
++ g_return_val_if_fail (factoryname != NULL, NULL);
++
++ GST_LOG ("gstelementfactory: make \"%s\" \"%s\"",
++ factoryname, GST_STR_NULL (name));
++
++ factory = gst_element_factory_find (factoryname);
++ if (factory == NULL)
++ goto no_factory;
++
++ GST_LOG_OBJECT (factory, "found factory %p", factory);
++ element = gst_element_factory_create (factory, name);
++ if (element == NULL)
++ goto create_failed;
++
++ gst_object_unref (factory);
++ return element;
++
++ /* ERRORS */
++no_factory:
++ {
++ GST_INFO ("no such element factory \"%s\"!", factoryname);
++ return NULL;
++ }
++create_failed:
++ {
++ GST_INFO_OBJECT (factory, "couldn't create instance!");
++ gst_object_unref (factory);
++ return NULL;
++ }
++}
++
++void
++__gst_element_factory_add_static_pad_template (GstElementFactory * factory,
++ GstStaticPadTemplate * templ)
++{
++ g_return_if_fail (factory != NULL);
++ g_return_if_fail (templ != NULL);
++
++ factory->staticpadtemplates =
++ g_list_append (factory->staticpadtemplates, templ);
++ factory->numpadtemplates++;
++}
++
++/**
++ * gst_element_factory_get_element_type:
++ * @factory: factory to get managed #GType from
++ *
++ * Get the #GType for elements managed by this factory. The type can
++ * only be retrieved if the element factory is loaded, which can be
++ * assured with gst_plugin_feature_load().
++ *
++ * Returns: the #GType for elements managed by this factory or 0 if
++ * the factory is not loaded.
++ */
++GType
++gst_element_factory_get_element_type (GstElementFactory * factory)
++{
++ g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), 0);
++
++ return factory->type;
++}
++
++/**
++ * gst_element_factory_get_longname:
++ * @factory: a #GstElementFactory
++ *
++ * Gets the longname for this factory
++ *
++ * Returns: the longname
++ */
++G_CONST_RETURN gchar *
++gst_element_factory_get_longname (GstElementFactory * factory)
++{
++ g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), NULL);
++
++ return factory->details.longname;
++}
++
++/**
++ * gst_element_factory_get_klass:
++ * @factory: a #GstElementFactory
++ *
++ * Gets the class for this factory.
++ *
++ * Returns: the class
++ */
++G_CONST_RETURN gchar *
++gst_element_factory_get_klass (GstElementFactory * factory)
++{
++ g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), NULL);
++
++ return factory->details.klass;
++}
++
++/**
++ * gst_element_factory_get_description:
++ * @factory: a #GstElementFactory
++ *
++ * Gets the description for this factory.
++ *
++ * Returns: the description
++ */
++G_CONST_RETURN gchar *
++gst_element_factory_get_description (GstElementFactory * factory)
++{
++ g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), NULL);
++
++ return factory->details.description;
++}
++
++/**
++ * gst_element_factory_get_author:
++ * @factory: a #GstElementFactory
++ *
++ * Gets the author for this factory.
++ *
++ * Returns: the author
++ */
++G_CONST_RETURN gchar *
++gst_element_factory_get_author (GstElementFactory * factory)
++{
++ g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), NULL);
++
++ return factory->details.author;
++}
++
++/**
++ * gst_element_factory_get_num_pad_templates:
++ * @factory: a #GstElementFactory
++ *
++ * Gets the number of pad_templates in this factory.
++ *
++ * Returns: the number of pad_templates
++ */
++guint
++gst_element_factory_get_num_pad_templates (GstElementFactory * factory)
++{
++ g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), 0);
++
++ return factory->numpadtemplates;
++}
++
++/**
++ * __gst_element_factory_add_interface:
++ * @elementfactory: The elementfactory to add the interface to
++ * @interfacename: Name of the interface
++ *
++ * Adds the given interfacename to the list of implemented interfaces of the
++ * element.
++ */
++void
++__gst_element_factory_add_interface (GstElementFactory * elementfactory,
++ const gchar * interfacename)
++{
++ g_return_if_fail (GST_IS_ELEMENT_FACTORY (elementfactory));
++ g_return_if_fail (interfacename != NULL);
++ g_return_if_fail (interfacename[0] != '\0'); /* no empty string */
++
++ elementfactory->interfaces =
++ g_list_prepend (elementfactory->interfaces, g_strdup (interfacename));
++}
++
++/**
++ * gst_element_factory_get_static_pad_templates:
++ * @factory: a #GstElementFactory
++ *
++ * Gets the #GList of #GstStaticPadTemplate for this factory.
++ *
++ * Returns: the padtemplates
++ */
++G_CONST_RETURN GList *
++gst_element_factory_get_static_pad_templates (GstElementFactory * factory)
++{
++ g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), NULL);
++
++ return factory->staticpadtemplates;
++}
++
++/**
++ * gst_element_factory_get_uri_type:
++ * @factory: a #GstElementFactory
++ *
++ * Gets the type of URIs the element supports or #GST_URI_UNKNOWN if none.
++ *
++ * Returns: type of URIs this element supports
++ */
++gint
++gst_element_factory_get_uri_type (GstElementFactory * factory)
++{
++ g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), GST_URI_UNKNOWN);
++
++ return factory->uri_type;
++}
++
++/**
++ * gst_element_factory_get_uri_protocols:
++ * @factory: a #GstElementFactory
++ *
++ * Gets a NULL-terminated array of protocols this element supports or NULL if
++ * no protocols are supported. You may not change the contents of the returned
++ * array, as it is still owned by the element factory. Use g_strdupv() to
++ * make a copy of the protocol string array if you need to.
++ *
++ * Returns: the supported protocols or NULL
++ */
++gchar **
++gst_element_factory_get_uri_protocols (GstElementFactory * factory)
++{
++ g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), NULL);
++
++ return factory->uri_protocols;
++}
++
++/**
++ * gst_element_factory_has_interface:
++ * @factory: a #GstElementFactory
++ * @interfacename: an interface name
++ *
++ * Check if @factory implements the interface with name @interfacename.
++ *
++ * Returns: #TRUE when @factory implement the interface.
++ *
++ * Since: 0.10.14
++ */
++gboolean
++gst_element_factory_has_interface (GstElementFactory * factory,
++ const gchar * interfacename)
++{
++ GList *walk;
++
++ g_return_val_if_fail (GST_IS_ELEMENT_FACTORY (factory), FALSE);
++
++ for (walk = factory->interfaces; walk; walk = g_list_next (walk)) {
++ gchar *iname = (gchar *) walk->data;
++
++ if (!strcmp (iname, interfacename))
++ return TRUE;
++ }
++ return FALSE;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstelement.h gstreamer-0.10.23/gst/gstelement.h
+--- gstreamer-0.10.23.orig/gst/gstelement.h 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/gst/gstelement.h 2009-06-11 14:19:59.000000000 +0200
+@@ -263,6 +263,17 @@
+ #define GST_ELEMENT_PADS(elem) (GST_ELEMENT_CAST(elem)->pads)
+
+ /**
++ * GST_ELEMENT_START_TIME:
++ * @elem: a #GstElement to return the start time for.
++ *
++ * This macro returns the start_time of the @elem. The start_time is the
++ * running_time of the pipeline when the element went to PAUSED.
++ *
++ * Since: 0.10.24
++ */
++#define GST_ELEMENT_START_TIME(elem) (GST_ELEMENT_CAST(elem)->abidata.ABI.start_time)
++
++/**
+ * GST_ELEMENT_ERROR:
+ * @el: the element that generates the error
+ * @domain: like CORE, LIBRARY, RESOURCE or STREAM (see #gstreamer-GstGError)
+@@ -394,7 +405,7 @@
+ * element by the toplevel #GstPipeline.
+ * @base_time: the time of the clock right before the element is set to
+ * PLAYING. Subtracting @base_time from the current clock time in the PLAYING
+- * state will yield the stream time.
++ * state will yield the running_time against the clock.
+ * @numpads: number of pads of the element, includes both source and sink pads.
+ * @pads: list of pads
+ * @numsrcpads: number of source pads of the element.
+@@ -441,6 +452,8 @@
+ struct {
+ /* state set by application */
+ GstState target_state;
++ /* running time of the last PAUSED state */
++ GstClockTime start_time;
+ } ABI;
+ /* adding + 0 to mark ABI change to be undone later */
+ gpointer _gst_reserved[GST_PADDING + 0];
+@@ -586,6 +599,8 @@
+ gboolean gst_element_set_clock (GstElement *element, GstClock *clock);
+ void gst_element_set_base_time (GstElement *element, GstClockTime time);
+ GstClockTime gst_element_get_base_time (GstElement *element);
++void gst_element_set_start_time (GstElement *element, GstClockTime time);
++GstClockTime gst_element_get_start_time (GstElement *element);
+
+ /* indexes */
+ gboolean gst_element_is_indexable (GstElement *element);
+@@ -654,6 +669,7 @@
+ GstStateChangeReturn gst_element_continue_state (GstElement * element,
+ GstStateChangeReturn ret);
+ void gst_element_lost_state (GstElement * element);
++void gst_element_lost_state_full (GstElement * element, gboolean new_base_time);
+
+ /* factory management */
+ GstElementFactory* gst_element_get_factory (GstElement *element);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gsterror.c gstreamer-0.10.23/gst/gsterror.c
+--- gstreamer-0.10.23.orig/gst/gsterror.c 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/gst/gsterror.c 2009-06-11 14:19:59.000000000 +0200
+@@ -143,7 +143,8 @@
+ TABLE (t, CORE, NOT_IMPLEMENTED,
+ N_("Internal GStreamer error: code not implemented." FILE_A_BUG));
+ TABLE (t, CORE, STATE_CHANGE,
+- N_("Internal GStreamer error: state change failed." FILE_A_BUG));
++ N_("GStreamer error: state change failed and some element failed to "
++ "post a proper error message with the reason for the failure."));
+ TABLE (t, CORE, PAD, N_("Internal GStreamer error: pad problem." FILE_A_BUG));
+ TABLE (t, CORE, THREAD,
+ N_("Internal GStreamer error: thread problem." FILE_A_BUG));
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstevent.c gstreamer-0.10.23/gst/gstevent.c
+--- gstreamer-0.10.23.orig/gst/gstevent.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gstevent.c 2009-06-11 14:19:59.000000000 +0200
+@@ -542,7 +542,8 @@
+ * The newsegment event marks the range of buffers to be processed. All
+ * data not within the segment range is not to be processed. This can be
+ * used intelligently by plugins to apply more efficient methods of skipping
+- * unneeded data.
++ * unneeded data. The valid range is expressed with the @start and @stop
++ * values.
+ *
+ * The position value of the segment is used in conjunction with the start
+ * value to convert the buffer timestamps into the stream time. This is
+@@ -601,8 +602,7 @@
+ if (stop != -1)
+ g_return_val_if_fail (start <= stop, NULL);
+
+- structure = gst_structure_empty_new ("GstEventNewsegment");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (EVENT_NEWSEGMENT),
+ GST_QUARK (UPDATE), G_TYPE_BOOLEAN, update,
+ GST_QUARK (RATE), G_TYPE_DOUBLE, rate,
+ GST_QUARK (APPLIED_RATE), G_TYPE_DOUBLE, applied_rate,
+@@ -733,8 +733,7 @@
+ ", maxsize %" G_GINT64_FORMAT ", async %d", gst_format_get_name (format),
+ minsize, maxsize, async);
+
+- structure = gst_structure_empty_new ("GstEventBufferSize");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (EVENT_BUFFER_SIZE),
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (MINSIZE), G_TYPE_INT64, minsize,
+ GST_QUARK (MAXSIZE), G_TYPE_INT64, maxsize,
+@@ -839,8 +838,7 @@
+ ", timestamp %" GST_TIME_FORMAT, proportion,
+ diff, GST_TIME_ARGS (timestamp));
+
+- structure = gst_structure_empty_new ("GstEventQOS");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (EVENT_QOS),
+ GST_QUARK (PROPORTION), G_TYPE_DOUBLE, proportion,
+ GST_QUARK (DIFF), G_TYPE_INT64, diff,
+ GST_QUARK (TIMESTAMP), G_TYPE_UINT64, timestamp, NULL);
+@@ -952,8 +950,7 @@
+ stop);
+ }
+
+- structure = gst_structure_empty_new ("GstEventSeek");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (EVENT_SEEK),
+ GST_QUARK (RATE), G_TYPE_DOUBLE, rate,
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (FLAGS), GST_TYPE_SEEK_FLAGS, flags,
+@@ -1043,7 +1040,7 @@
+ *
+ * Create a new latency event. The event is sent upstream from the sinks and
+ * notifies elements that they should add an additional @latency to the
+- * timestamps before synchronising against the clock.
++ * running time before synchronising against the clock.
+ *
+ * The latency is mostly used in live sinks and is always expressed in
+ * the time format.
+@@ -1061,8 +1058,7 @@
+ GST_CAT_INFO (GST_CAT_EVENT,
+ "creating latency event %" GST_TIME_FORMAT, GST_TIME_ARGS (latency));
+
+- structure = gst_structure_empty_new ("GstEventLatency");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (EVENT_LATENCY),
+ GST_QUARK (LATENCY), G_TYPE_UINT64, latency, NULL);
+ event = gst_event_new_custom (GST_EVENT_LATENCY, structure);
+
+@@ -1092,3 +1088,90 @@
+ g_value_get_uint64 (gst_structure_id_get_value (structure,
+ GST_QUARK (LATENCY)));
+ }
++
++/**
++ * gst_event_new_step:
++ * @format: the format of @amount
++ * @amount: the amount of data to step
++ * @rate: the step rate
++ * @flush: flushing steps
++ * @intermediate: intermediate steps
++ *
++ * Create a new step event. The purpose of the step event is to instruct a sink
++ * to skip @amount (expressed in @format) of media. It can be used to implement
++ * stepping through the video frame by frame or for doing fast trick modes.
++ *
++ * A rate of <= 0.0 is not allowed, pause the pipeline or reverse the playback
++ * direction of the pipeline to get the same effect.
++ *
++ * The @flush flag will clear any pending data in the pipeline before starting
++ * the step operation.
++ *
++ * The @intermediate flag instructs the pipeline that this step operation is
++ * part of a larger step operation.
++ *
++ * Returns: a new #GstEvent
++ *
++ * Since: 0.10.24
++ */
++GstEvent *
++gst_event_new_step (GstFormat format, guint64 amount, gdouble rate,
++ gboolean flush, gboolean intermediate)
++{
++ GstEvent *event;
++ GstStructure *structure;
++
++ g_return_val_if_fail (rate > 0.0, NULL);
++
++ GST_CAT_INFO (GST_CAT_EVENT, "creating step event");
++
++ structure = gst_structure_id_new (GST_QUARK (EVENT_STEP),
++ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
++ GST_QUARK (AMOUNT), G_TYPE_UINT64, amount,
++ GST_QUARK (RATE), G_TYPE_DOUBLE, rate,
++ GST_QUARK (FLUSH), G_TYPE_BOOLEAN, flush,
++ GST_QUARK (INTERMEDIATE), G_TYPE_BOOLEAN, intermediate, NULL);
++ event = gst_event_new_custom (GST_EVENT_STEP, structure);
++
++ return event;
++}
++
++/**
++ * gst_event_parse_step:
++ * @event: The event to query
++ * @format: A pointer to store the format in.
++ * @amount: A pointer to store the amount in.
++ * @rate: A pointer to store the rate in.
++ * @flush: A pointer to store the flush boolean in.
++ * @intermediate: A pointer to store the intermediate boolean in.
++ *
++ * Parse the step event.
++ *
++ * Since: 0.10.24
++ */
++void
++gst_event_parse_step (GstEvent * event, GstFormat * format, guint64 * amount,
++ gdouble * rate, gboolean * flush, gboolean * intermediate)
++{
++ const GstStructure *structure;
++
++ g_return_if_fail (GST_IS_EVENT (event));
++ g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_STEP);
++
++ structure = gst_event_get_structure (event);
++ if (format)
++ *format = g_value_get_enum (gst_structure_id_get_value (structure,
++ GST_QUARK (FORMAT)));
++ if (amount)
++ *amount = g_value_get_uint64 (gst_structure_id_get_value (structure,
++ GST_QUARK (AMOUNT)));
++ if (rate)
++ *rate = g_value_get_double (gst_structure_id_get_value (structure,
++ GST_QUARK (RATE)));
++ if (flush)
++ *flush = g_value_get_boolean (gst_structure_id_get_value (structure,
++ GST_QUARK (FLUSH)));
++ if (intermediate)
++ *intermediate = g_value_get_boolean (gst_structure_id_get_value (structure,
++ GST_QUARK (INTERMEDIATE)));
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstevent.h gstreamer-0.10.23/gst/gstevent.h
+--- gstreamer-0.10.23.orig/gst/gstevent.h 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/gst/gstevent.h 2009-06-11 14:19:59.000000000 +0200
+@@ -92,6 +92,7 @@
+ * user requests, such as mouse or keyboard movements,
+ * to upstream elements.
+ * @GST_EVENT_LATENCY: Notification of new latency adjustment. Since: 0.10.12
++ * @GST_EVENT_STEP: A request for stepping through the media. Since: 0.10.24
+ * @GST_EVENT_CUSTOM_UPSTREAM: Upstream custom event
+ * @GST_EVENT_CUSTOM_DOWNSTREAM: Downstream custom event that travels in the
+ * data flow.
+@@ -124,6 +125,7 @@
+ GST_EVENT_SEEK = GST_EVENT_MAKE_TYPE (16, FLAG(UPSTREAM)),
+ GST_EVENT_NAVIGATION = GST_EVENT_MAKE_TYPE (17, FLAG(UPSTREAM)),
+ GST_EVENT_LATENCY = GST_EVENT_MAKE_TYPE (18, FLAG(UPSTREAM)),
++ GST_EVENT_STEP = GST_EVENT_MAKE_TYPE (19, FLAG(UPSTREAM)),
+
+ /* custom events start here */
+ GST_EVENT_CUSTOM_UPSTREAM = GST_EVENT_MAKE_TYPE (32, FLAG(UPSTREAM)),
+@@ -460,6 +462,12 @@
+ GstEvent* gst_event_new_latency (GstClockTime latency);
+ void gst_event_parse_latency (GstEvent *event, GstClockTime *latency);
+
++/* step event */
++GstEvent* gst_event_new_step (GstFormat format, guint64 amount, gdouble rate,
++ gboolean flush, gboolean intermediate);
++void gst_event_parse_step (GstEvent *event, GstFormat *format, guint64 *amount,
++ gdouble *rate, gboolean *flush, gboolean *intermediate);
++
+ G_END_DECLS
+
+ #endif /* __GST_EVENT_H__ */
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstformat.h gstreamer-0.10.23/gst/gstformat.h
+--- gstreamer-0.10.23.orig/gst/gstformat.h 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/gst/gstformat.h 2009-06-11 14:19:59.000000000 +0200
+@@ -35,11 +35,15 @@
+ * GstFormat:
+ * @GST_FORMAT_UNDEFINED: undefined format
+ * @GST_FORMAT_DEFAULT: the default format of the pad/element. This can be
+- * samples for raw audio, frames/fields for raw video.
++ * samples for raw audio, frames/fields for raw video (some, but not all,
++ * elements support this; use @GST_FORMAT_TIME if you don't have a good
++ * reason to query for samples/frames)
+ * @GST_FORMAT_BYTES: bytes
+ * @GST_FORMAT_TIME: time in nanoseconds
+- * @GST_FORMAT_BUFFERS: buffers
+- * @GST_FORMAT_PERCENT: percentage of stream
++ * @GST_FORMAT_BUFFERS: buffers (few, if any, elements implement this as of
++ * May 2009)
++ * @GST_FORMAT_PERCENT: percentage of stream (few, if any, elements implement
++ * this as of May 2009)
+ *
+ * Standard predefined formats
+ */
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstghostpad.c gstreamer-0.10.23/gst/gstghostpad.c
+--- gstreamer-0.10.23.orig/gst/gstghostpad.c 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/gst/gstghostpad.c 2009-06-11 14:19:59.000000000 +0200
+@@ -144,20 +144,6 @@
+ return res;
+ }
+
+-static GList *
+-gst_proxy_pad_do_internal_link (GstPad * pad)
+-{
+- GList *res = NULL;
+- GstPad *target = gst_proxy_pad_get_target (pad);
+-
+- if (target) {
+- res = gst_pad_get_internal_links (target);
+- gst_object_unref (target);
+- }
+-
+- return res;
+-}
+-
+ static GstIterator *
+ gst_proxy_pad_do_iterate_internal_links (GstPad * pad)
+ {
+@@ -434,8 +420,6 @@
+ GST_DEBUG_FUNCPTR (gst_proxy_pad_do_query_type));
+ gst_pad_set_event_function (pad, GST_DEBUG_FUNCPTR (gst_proxy_pad_do_event));
+ gst_pad_set_query_function (pad, GST_DEBUG_FUNCPTR (gst_proxy_pad_do_query));
+- gst_pad_set_internal_link_function (pad,
+- GST_DEBUG_FUNCPTR (gst_proxy_pad_do_internal_link));
+ gst_pad_set_iterate_internal_links_function (pad,
+ GST_DEBUG_FUNCPTR (gst_proxy_pad_do_iterate_internal_links));
+
+@@ -689,14 +673,19 @@
+ on_int_notify (GstPad * internal, GParamSpec * unused, GstGhostPad * pad)
+ {
+ GstCaps *caps;
++ gboolean changed;
+
+ g_object_get (internal, "caps", &caps, NULL);
+
+ GST_OBJECT_LOCK (pad);
+- gst_caps_replace (&(GST_PAD_CAPS (pad)), caps);
++ changed = (GST_PAD_CAPS (pad) != caps);
++ if (changed)
++ gst_caps_replace (&(GST_PAD_CAPS (pad)), caps);
+ GST_OBJECT_UNLOCK (pad);
+
+- g_object_notify (G_OBJECT (pad), "caps");
++ if (changed)
++ g_object_notify (G_OBJECT (pad), "caps");
++
+ if (caps)
+ gst_caps_unref (caps);
+ }
+@@ -705,17 +694,20 @@
+ on_src_target_notify (GstPad * target, GParamSpec * unused, GstGhostPad * pad)
+ {
+ GstCaps *caps;
++ gboolean changed;
+
+ g_object_get (target, "caps", &caps, NULL);
+
+ GST_OBJECT_LOCK (pad);
++ changed = (GST_PAD_CAPS (pad) != caps);
+ gst_caps_replace (&(GST_PAD_CAPS (pad)), caps);
+ GST_OBJECT_UNLOCK (pad);
+
+- g_object_notify (G_OBJECT (pad), "caps");
++ if (changed)
++ g_object_notify (G_OBJECT (pad), "caps");
++
+ if (caps)
+ gst_caps_unref (caps);
+-
+ }
+
+ static gboolean
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gst.h gstreamer-0.10.23/gst/gst.h
+--- gstreamer-0.10.23.orig/gst/gst.h 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/gst/gst.h 2009-06-11 14:19:59.000000000 +0200
+@@ -33,6 +33,7 @@
+
+ #include <gst/gstbin.h>
+ #include <gst/gstbuffer.h>
++#include <gst/gstbufferlist.h>
+ #include <gst/gstcaps.h>
+ #include <gst/gstchildproxy.h>
+ #include <gst/gstclock.h>
+@@ -64,6 +65,7 @@
+ #include <gst/gsttaglist.h>
+ #include <gst/gsttagsetter.h>
+ #include <gst/gsttask.h>
++#include <gst/gsttaskpool.h>
+ #include <gst/gsttrace.h>
+ #include <gst/gsttypefind.h>
+ #include <gst/gsttypefindfactory.h>
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstinfo.c gstreamer-0.10.23/gst/gstinfo.c
+--- gstreamer-0.10.23.orig/gst/gstinfo.c 2009-04-21 21:12:19.000000000 +0200
++++ gstreamer-0.10.23/gst/gstinfo.c 2009-06-11 14:19:59.000000000 +0200
+@@ -2,6 +2,7 @@
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
++ * Copyright (C) 2008-2009 Tim-Philipp Müller <tim centricular net>
+ *
+ * gstinfo.c: debugging functions
+ *
+@@ -112,6 +113,7 @@
+
+ #include "gst_private.h"
+ #include "gstutils.h"
++#include "gstquark.h"
+ #include "gstsegment.h"
+ #ifdef HAVE_VALGRIND_H
+ # include <valgrind/valgrind.h>
+@@ -164,9 +166,14 @@
+ const struct printf_info *info, const void *const *args);
+ static int _gst_info_printf_extension_segment (FILE * stream,
+ const struct printf_info *info, const void *const *args);
++#if HAVE_REGISTER_PRINTF_SPECIFIER
++static int _gst_info_printf_extension_arginfo (const struct printf_info *info,
++ size_t n, int *argtypes, int *size);
++#else
+ static int _gst_info_printf_extension_arginfo (const struct printf_info *info,
+ size_t n, int *argtypes);
+ #endif
++#endif
+
+ struct _GstDebugMessage
+ {
+@@ -199,6 +206,9 @@
+ static GStaticMutex __log_func_mutex = G_STATIC_MUTEX_INIT;
+ static GSList *__log_functions = NULL;
+
++#define PRETTY_TAGS_DEFAULT TRUE
++static gboolean pretty_tags = PRETTY_TAGS_DEFAULT;
++
+ static gint __default_level;
+ static gint __use_color;
+
+@@ -217,6 +227,7 @@
+ GstDebugCategory *GST_CAT_SCHEDULING = NULL;
+
+ GstDebugCategory *GST_CAT_BUFFER = NULL;
++GstDebugCategory *GST_CAT_BUFFER_LIST = NULL;
+ GstDebugCategory *GST_CAT_BUS = NULL;
+ GstDebugCategory *GST_CAT_CAPS = NULL;
+ GstDebugCategory *GST_CAT_CLOCK = NULL;
+@@ -282,6 +293,8 @@
+ void
+ _gst_debug_init (void)
+ {
++ const gchar *env;
++
+ g_atomic_int_set (&__default_level, GST_LEVEL_DEFAULT);
+ g_atomic_int_set (&__use_color, 1);
+
+@@ -289,11 +302,18 @@
+ _priv_gst_info_start_time = gst_util_get_timestamp ();
+
+ #ifdef HAVE_PRINTF_EXTENSION
++#if HAVE_REGISTER_PRINTF_SPECIFIER
++ register_printf_specifier (GST_PTR_FORMAT[0], _gst_info_printf_extension_ptr,
++ _gst_info_printf_extension_arginfo);
++ register_printf_specifier (GST_SEGMENT_FORMAT[0],
++ _gst_info_printf_extension_segment, _gst_info_printf_extension_arginfo);
++#else
+ register_printf_function (GST_PTR_FORMAT[0], _gst_info_printf_extension_ptr,
+ _gst_info_printf_extension_arginfo);
+ register_printf_function (GST_SEGMENT_FORMAT[0],
+ _gst_info_printf_extension_segment, _gst_info_printf_extension_arginfo);
+ #endif
++#endif
+
+ /* do NOT use a single debug function before this line has been run */
+ GST_CAT_DEFAULT = _gst_debug_category_new ("default",
+@@ -318,6 +338,8 @@
+ GST_DEBUG_BOLD | GST_DEBUG_FG_MAGENTA, NULL);
+ GST_CAT_BUFFER = _gst_debug_category_new ("GST_BUFFER",
+ GST_DEBUG_BOLD | GST_DEBUG_BG_GREEN, NULL);
++ GST_CAT_BUFFER_LIST = _gst_debug_category_new ("GST_BUFFER_LIST",
++ GST_DEBUG_BOLD | GST_DEBUG_BG_GREEN, NULL);
+ GST_CAT_BUS = _gst_debug_category_new ("GST_BUS", GST_DEBUG_BG_YELLOW, NULL);
+ GST_CAT_CAPS = _gst_debug_category_new ("GST_CAPS",
+ GST_DEBUG_BOLD | GST_DEBUG_FG_BLUE, NULL);
+@@ -364,6 +386,14 @@
+
+ /* print out the valgrind message if we're in valgrind */
+ _priv_gst_in_valgrind ();
++
++ env = g_getenv ("GST_DEBUG_OPTIONS");
++ if (env != NULL) {
++ if (strstr (env, "full_tags") || strstr (env, "full-tags"))
++ pretty_tags = FALSE;
++ else if (strstr (env, "pretty_tags") || strstr (env, "pretty-tags"))
++ pretty_tags = TRUE;
++ }
+ }
+
+ /* we can't do this further above, because we initialize the GST_CAT_DEFAULT struct */
+@@ -472,6 +502,54 @@
+ return message->message;
+ }
+
++#define MAX_BUFFER_DUMP_STRING_LEN 100
++
++/* structure_to_pretty_string:
++ * @structure: a #GstStructure
++ *
++ * Converts @structure to a human-readable string representation. Basically
++ * the same as gst_structure_to_string(), but if the structure contains large
++ * buffers such as images the hex representation of those buffers will be
++ * shortened so that the string remains readable.
++ *
++ * Returns: a newly-allocated string. g_free() when no longer needed.
++ */
++static gchar *
++structure_to_pretty_string (const GstStructure * s)
++{
++ gchar *str, *pos, *end;
++
++ str = gst_structure_to_string (s);
++ if (str == NULL)
++ return NULL;
++
++ pos = str;
++ while ((pos = strstr (pos, "(buffer)"))) {
++ guint count = 0;
++
++ pos += strlen ("(buffer)");
++ for (end = pos; *end != '\0' && *end != ';' && *end != ' '; ++end)
++ ++count;
++ if (count > MAX_BUFFER_DUMP_STRING_LEN) {
++ memcpy (pos + MAX_BUFFER_DUMP_STRING_LEN - 6, "..", 2);
++ memcpy (pos + MAX_BUFFER_DUMP_STRING_LEN - 4, pos + count - 4, 4);
++ g_memmove (pos + MAX_BUFFER_DUMP_STRING_LEN, pos + count,
++ strlen (pos + count) + 1);
++ pos += MAX_BUFFER_DUMP_STRING_LEN;
++ }
++ }
++
++ return str;
++}
++
++static inline gchar *
++gst_info_structure_to_string (GstStructure * s)
++{
++ if (G_UNLIKELY (pretty_tags && s->name == GST_QUARK (TAGLIST)))
++ return structure_to_pretty_string (s);
++ else
++ return gst_structure_to_string (s);
++}
+
+ static gchar *
+ gst_debug_print_object (gpointer ptr)
+@@ -499,7 +577,7 @@
+ return gst_caps_to_string ((GstCaps *) ptr);
+ }
+ if (*(GType *) ptr == GST_TYPE_STRUCTURE) {
+- return gst_structure_to_string ((GstStructure *) ptr);
++ return gst_info_structure_to_string ((GstStructure *) ptr);
+ }
+ #ifdef USE_POISONING
+ if (*(guint32 *) ptr == 0xffffffff) {
+@@ -520,7 +598,7 @@
+ gchar *s, *ret;
+
+ if (msg->structure) {
+- s = gst_structure_to_string (msg->structure);
++ s = gst_info_structure_to_string (msg->structure);
+ } else {
+ s = g_strdup ("(NULL)");
+ }
+@@ -535,7 +613,7 @@
+ GstQuery *query = GST_QUERY_CAST (object);
+
+ if (query->structure) {
+- return gst_structure_to_string (query->structure);
++ return gst_info_structure_to_string (query->structure);
+ } else {
+ const gchar *query_type_name;
+
+@@ -872,19 +950,19 @@
+ case GST_LEVEL_NONE:
+ return "";
+ case GST_LEVEL_ERROR:
+- return "ERROR";
++ return "ERROR ";
+ case GST_LEVEL_WARNING:
+- return "WARN ";
++ return "WARN ";
+ case GST_LEVEL_INFO:
+- return "INFO ";
++ return "INFO ";
+ case GST_LEVEL_DEBUG:
+- return "DEBUG";
++ return "DEBUG ";
+ case GST_LEVEL_LOG:
+- return "LOG ";
++ return "LOG ";
+ case GST_LEVEL_FIXME:
+- return "FIXME";
++ return "FIXME ";
+ case GST_LEVEL_MEMDUMP:
+- return "MEMDUMP ";
++ return "MEMDUMP";
+ default:
+ g_warning ("invalid level specified for gst_debug_level_get_name");
+ return "";
+@@ -1483,12 +1561,22 @@
+ return len;
+ }
+
++#if HAVE_REGISTER_PRINTF_SPECIFIER
++static int
++_gst_info_printf_extension_arginfo (const struct printf_info *info, size_t n,
++ int *argtypes, int *size)
++#else
+ static int
+ _gst_info_printf_extension_arginfo (const struct printf_info *info, size_t n,
+ int *argtypes)
++#endif
+ {
+- if (n > 0)
++ if (n > 0) {
+ argtypes[0] = PA_POINTER;
++#if HAVE_REGISTER_PRINTF_SPECIFIER
++ *size = sizeof (gpointer);
++#endif
++ }
+ return 1;
+ }
+ #endif /* HAVE_PRINTF_EXTENSION */
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstmessage.c gstreamer-0.10.23/gst/gstmessage.c
+--- gstreamer-0.10.23.orig/gst/gstmessage.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gstmessage.c 2009-06-11 14:19:59.000000000 +0200
+@@ -303,9 +303,9 @@
+ *
+ * Returns: The message's sequence number.
+ *
+- * Since: 0.10.22
+- *
+ * MT safe.
++ *
++ * Since: 0.10.22
+ */
+ guint32
+ gst_message_get_seqnum (GstMessage * message)
+@@ -326,9 +326,9 @@
+ * the message relates to other messages or events. See gst_message_get_seqnum()
+ * for more information.
+ *
+- * Since: 0.10.22
+- *
+ * MT safe.
++ *
++ * Since: 0.10.22
+ */
+ void
+ gst_message_set_seqnum (GstMessage * message, guint32 seqnum)
+@@ -381,8 +381,7 @@
+ GstMessage *message;
+ GstStructure *structure;
+
+- structure = gst_structure_empty_new ("GstMessageError");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (MESSAGE_ERROR),
+ GST_QUARK (GERROR), GST_TYPE_G_ERROR, error,
+ GST_QUARK (DEBUG), G_TYPE_STRING, debug, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_ERROR, src, structure);
+@@ -409,8 +408,7 @@
+ GstMessage *message;
+ GstStructure *structure;
+
+- structure = gst_structure_empty_new ("GstMessageWarning");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (MESSAGE_WARNING),
+ GST_QUARK (GERROR), GST_TYPE_G_ERROR, error,
+ GST_QUARK (DEBUG), G_TYPE_STRING, debug, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_WARNING, src, structure);
+@@ -427,11 +425,11 @@
+ * Create a new info message. The message will make copies of @error and
+ * @debug.
+ *
++ * MT safe.
++ *
+ * Returns: The new info message.
+ *
+ * Since: 0.10.12
+- *
+- * MT safe.
+ */
+ GstMessage *
+ gst_message_new_info (GstObject * src, GError * error, const gchar * debug)
+@@ -439,9 +437,9 @@
+ GstMessage *message;
+ GstStructure *structure;
+
+- structure = gst_structure_empty_new ("GstMessageInfo");
+- gst_structure_id_set (structure, GST_QUARK (GERROR), GST_TYPE_G_ERROR,
+- error, GST_QUARK (DEBUG), G_TYPE_STRING, debug, NULL);
++ structure = gst_structure_id_new (GST_QUARK (MESSAGE_INFO),
++ GST_QUARK (GERROR), GST_TYPE_G_ERROR, error,
++ GST_QUARK (DEBUG), G_TYPE_STRING, debug, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_INFO, src, structure);
+
+ return message;
+@@ -473,6 +471,39 @@
+ }
+
+ /**
++ * gst_message_new_tag_full:
++ * @src: The object originating the message.
++ * @pad: The originating pad for the tag.
++ * @tag_list: The tag list for the message.
++ *
++ * Create a new tag message. The message will take ownership of the tag list.
++ * The message is posted by elements that discovered a new taglist.
++ *
++ * Returns: The new tag message.
++ *
++ * Since: 0.10.24
++ *
++ * MT safe.
++ */
++GstMessage *
++gst_message_new_tag_full (GstObject * src, GstPad * pad, GstTagList * tag_list)
++{
++ GstMessage *message;
++ GstStructure *s;
++
++ g_return_val_if_fail (GST_IS_STRUCTURE (tag_list), NULL);
++ g_return_val_if_fail (pad == NULL || GST_IS_PAD (pad), NULL);
++
++ s = (GstStructure *) tag_list;
++ if (pad)
++ gst_structure_set (s, "source-pad", GST_TYPE_PAD, pad, NULL);
++
++ message = gst_message_new_custom (GST_MESSAGE_TAG, src, s);
++
++ return message;
++}
++
++/**
+ * gst_message_new_buffering:
+ * @src: The object originating the message.
+ * @percent: The buffering percent
+@@ -488,11 +519,11 @@
+ * message with @percent set to 100, which can happen after the pipeline
+ * completed prerolling.
+ *
++ * MT safe.
++ *
+ * Returns: The new buffering message.
+ *
+ * Since: 0.10.11
+- *
+- * MT safe.
+ */
+ GstMessage *
+ gst_message_new_buffering (GstObject * src, gint percent)
+@@ -502,8 +533,7 @@
+
+ g_return_val_if_fail (percent >= 0 && percent <= 100, NULL);
+
+- structure = gst_structure_empty_new ("GstMessageBuffering");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (MESSAGE_BUFFERING),
+ GST_QUARK (BUFFER_PERCENT), G_TYPE_INT, percent,
+ GST_QUARK (BUFFERING_MODE), GST_TYPE_BUFFERING_MODE, GST_BUFFERING_STREAM,
+ GST_QUARK (AVG_IN_RATE), G_TYPE_INT, -1,
+@@ -536,8 +566,7 @@
+ GstMessage *message;
+ GstStructure *structure;
+
+- structure = gst_structure_empty_new ("GstMessageState");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (MESSAGE_STATE),
+ GST_QUARK (OLD_STATE), GST_TYPE_STATE, (gint) oldstate,
+ GST_QUARK (NEW_STATE), GST_TYPE_STATE, (gint) newstate,
+ GST_QUARK (PENDING_STATE), GST_TYPE_STATE, (gint) pending, NULL);
+@@ -592,8 +621,7 @@
+ GstMessage *message;
+ GstStructure *structure;
+
+- structure = gst_structure_empty_new ("GstMessageClockProvide");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (MESSAGE_CLOCK_PROVIDE),
+ GST_QUARK (CLOCK), GST_TYPE_CLOCK, clock,
+ GST_QUARK (READY), G_TYPE_BOOLEAN, ready, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_CLOCK_PROVIDE, src, structure);
+@@ -623,8 +651,7 @@
+ GstMessage *message;
+ GstStructure *structure;
+
+- structure = gst_structure_empty_new ("GstMessageClockLost");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (MESSAGE_CLOCK_LOST),
+ GST_QUARK (CLOCK), GST_TYPE_CLOCK, clock, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_CLOCK_LOST, src, structure);
+
+@@ -649,8 +676,7 @@
+ GstMessage *message;
+ GstStructure *structure;
+
+- structure = gst_structure_empty_new ("GstMessageNewClock");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (MESSAGE_NEW_CLOCK),
+ GST_QUARK (CLOCK), GST_TYPE_CLOCK, clock, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_NEW_CLOCK, src, structure);
+
+@@ -687,8 +713,7 @@
+ g_return_val_if_fail (GST_PAD_DIRECTION (src) == GST_PAD_SRC, NULL);
+ g_return_val_if_fail (GST_IS_ELEMENT (owner), NULL);
+
+- structure = gst_structure_empty_new ("GstMessageStructureChange");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (MESSAGE_STRUCTURE_CHANGE),
+ GST_QUARK (TYPE), GST_TYPE_STRUCTURE_CHANGE_TYPE, type,
+ GST_QUARK (OWNER), GST_TYPE_ELEMENT, owner,
+ GST_QUARK (BUSY), G_TYPE_BOOLEAN, busy, NULL);
+@@ -721,8 +746,7 @@
+ GstMessage *message;
+ GstStructure *structure;
+
+- structure = gst_structure_empty_new ("GstMessageSegmentStart");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (MESSAGE_SEGMENT_START),
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (POSITION), G_TYPE_INT64, position, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_SEGMENT_START, src, structure);
+@@ -752,8 +776,7 @@
+ GstMessage *message;
+ GstStructure *structure;
+
+- structure = gst_structure_empty_new ("GstMessageSegmentDone");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (MESSAGE_SEGMENT_DONE),
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (POSITION), G_TYPE_INT64, position, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_SEGMENT_DONE, src, structure);
+@@ -825,8 +848,7 @@
+ GstMessage *message;
+ GstStructure *structure;
+
+- structure = gst_structure_empty_new ("GstMessageDuration");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (MESSAGE_DURATION),
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (DURATION), G_TYPE_INT64, duration, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_DURATION, src, structure);
+@@ -855,8 +877,7 @@
+ GstMessage *message;
+ GstStructure *structure;
+
+- structure = gst_structure_empty_new ("GstMessageAsyncStart");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (MESSAGE_ASYNC_START),
+ GST_QUARK (NEW_BASE_TIME), G_TYPE_BOOLEAN, new_base_time, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_ASYNC_START, src, structure);
+
+@@ -929,8 +950,7 @@
+ GstMessage *message;
+ GstStructure *structure;
+
+- structure = gst_structure_empty_new ("GstMessageRequestState");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (MESSAGE_REQUEST_STATE),
+ GST_QUARK (NEW_STATE), GST_TYPE_STATE, (gint) state, NULL);
+ message = gst_message_new_custom (GST_MESSAGE_REQUEST_STATE, src, structure);
+
+@@ -970,11 +990,57 @@
+ void
+ gst_message_parse_tag (GstMessage * message, GstTagList ** tag_list)
+ {
++ GstStructure *ret;
++
++ g_return_if_fail (GST_IS_MESSAGE (message));
++ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_TAG);
++ g_return_if_fail (tag_list != NULL);
++
++ ret = gst_structure_copy (message->structure);
++ gst_structure_remove_field (ret, "source-pad");
++
++ *tag_list = (GstTagList *) ret;
++}
++
++/**
++ * gst_message_parse_tag_full:
++ * @message: A valid #GstMessage of type GST_MESSAGE_TAG.
++ * @pad: Location where the originating pad is stored, unref after usage
++ * @tag_list: Return location for the tag-list.
++ *
++ * Extracts the tag list from the GstMessage. The tag list returned in the
++ * output argument is a copy; the caller must free it when done.
++ *
++ * Since: 0.10.24
++ *
++ * MT safe.
++ */
++void
++gst_message_parse_tag_full (GstMessage * message, GstPad ** pad,
++ GstTagList ** tag_list)
++{
++ GstStructure *ret;
++
+ g_return_if_fail (GST_IS_MESSAGE (message));
+ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_TAG);
+ g_return_if_fail (tag_list != NULL);
+
+- *tag_list = (GstTagList *) gst_structure_copy (message->structure);
++ ret = gst_structure_copy (message->structure);
++
++ if (gst_structure_has_field (ret, "source-pad") && pad) {
++ const GValue *v;
++
++ v = gst_structure_get_value (ret, "source-pad");
++ if (v && G_VALUE_HOLDS (v, GST_TYPE_PAD))
++ *pad = g_value_dup_object (v);
++ else
++ *pad = NULL;
++ } else if (pad) {
++ *pad = NULL;
++ }
++ gst_structure_remove_field (ret, "source-pad");
++
++ *tag_list = (GstTagList *) ret;
+ }
+
+ /**
+@@ -985,9 +1051,9 @@
+ * Extracts the buffering percent from the GstMessage. see also
+ * gst_message_new_buffering().
+ *
+- * Since: 0.10.11
+- *
+ * MT safe.
++ *
++ * Since: 0.10.11
+ */
+ void
+ gst_message_parse_buffering (GstMessage * message, gint * percent)
+@@ -1458,3 +1524,202 @@
+ *state = g_value_get_enum (gst_structure_id_get_value (message->structure,
+ GST_QUARK (NEW_STATE)));
+ }
++
++/**
++ * gst_message_new_stream_status:
++ * @src: The object originating the message.
++ * @type: The stream status type.
++ * @owner: The owner element of @src.
++ *
++ * Create a new stream status message. This message is posted when a streaming
++ * thread is created/destroyed or when the state changed.
++ *
++ * Returns: The new stream status message.
++ *
++ * MT safe.
++ *
++ * Since: 0.10.24.
++ */
++GstMessage *
++gst_message_new_stream_status (GstObject * src, GstStreamStatusType type,
++ GstElement * owner)
++{
++ GstMessage *message;
++ GstStructure *structure;
++
++ structure = gst_structure_id_new (GST_QUARK (MESSAGE_STREAM_STATUS),
++ GST_QUARK (TYPE), GST_TYPE_STREAM_STATUS_TYPE, (gint) type,
++ GST_QUARK (OWNER), GST_TYPE_ELEMENT, owner, NULL);
++ message = gst_message_new_custom (GST_MESSAGE_STREAM_STATUS, src, structure);
++
++ return message;
++}
++
++/**
++ * gst_message_parse_stream_status:
++ * @message: A valid #GstMessage of type GST_MESSAGE_STREAM_STATUS.
++ * @type: A pointer to hold the status type
++ * @owner: The owner element of the message source
++ *
++ * Extracts the stream status type and owner the GstMessage. The returned
++ * owner remains valid for as long as the reference to @message is valid and
++ * should thus not be unreffed.
++ *
++ * MT safe.
++ *
++ * Since: 0.10.24.
++ */
++void
++gst_message_parse_stream_status (GstMessage * message,
++ GstStreamStatusType * type, GstElement ** owner)
++{
++ const GValue *owner_gvalue;
++
++ g_return_if_fail (GST_IS_MESSAGE (message));
++ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STREAM_STATUS);
++
++ owner_gvalue =
++ gst_structure_id_get_value (message->structure, GST_QUARK (OWNER));
++ g_return_if_fail (owner_gvalue != NULL);
++
++ if (type)
++ *type = g_value_get_enum (gst_structure_id_get_value (message->structure,
++ GST_QUARK (TYPE)));
++ if (owner)
++ *owner = (GstElement *) g_value_get_object (owner_gvalue);
++}
++
++/**
++ * gst_message_set_stream_status_object:
++ * @message: A valid #GstMessage of type GST_MESSAGE_STREAM_STATUS.
++ * @object: the object controlling the streaming
++ *
++ * Configures the object handling the streaming thread. This is usually a
++ * GstTask object but other objects might be added in the future.
++ *
++ * Since: 0.10.24
++ */
++void
++gst_message_set_stream_status_object (GstMessage * message,
++ const GValue * object)
++{
++ g_return_if_fail (GST_IS_MESSAGE (message));
++ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STREAM_STATUS);
++
++ gst_structure_id_set_value (message->structure, GST_QUARK (OBJECT), object);
++}
++
++/**
++ * gst_message_get_stream_status_object:
++ * @message: A valid #GstMessage of type GST_MESSAGE_STREAM_STATUS.
++ *
++ * Extracts the object managing the streaming thread from @message.
++ *
++ * Returns: a GValue containing the object that manages the streaming thread.
++ * This object is usually of type GstTask but other types can be added in the
++ * future. The object remains valid as long as @message is valid.
++ *
++ * Since: 0.10.24
++ */
++const GValue *
++gst_message_get_stream_status_object (GstMessage * message)
++{
++ const GValue *result;
++
++ g_return_val_if_fail (GST_IS_MESSAGE (message), NULL);
++ g_return_val_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STREAM_STATUS,
++ NULL);
++
++ result = gst_structure_id_get_value (message->structure, GST_QUARK (OBJECT));
++
++ return result;
++}
++
++/**
++ * gst_message_new_step_done:
++ * @src: The object originating the message.
++ * @format: the format of @amount
++ * @amount: the amount of stepped data
++ * @rate: the rate of the stepped amount
++ * @flush: is this an flushing step
++ * @intermediate: is this an intermediate step
++ * @duration: the duration of the data
++ *
++ * This message is posted by elements when they complete a part, when @intermediate set
++ * to TRUE, or a complete step operation.
++ *
++ * @duration will contain the amount of time (in GST_FORMAT_TIME) of the stepped
++ * @amount of media in format @format.
++ *
++ * Returns: The new step_done message.
++ *
++ * MT safe.
++ *
++ * Since: 0.10.24
++ */
++GstMessage *
++gst_message_new_step_done (GstObject * src, GstFormat format, guint64 amount,
++ gdouble rate, gboolean flush, gboolean intermediate, guint64 duration)
++{
++ GstMessage *message;
++ GstStructure *structure;
++
++ structure = gst_structure_id_new (GST_QUARK (MESSAGE_STEP_DONE),
++ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
++ GST_QUARK (AMOUNT), G_TYPE_UINT64, amount,
++ GST_QUARK (RATE), G_TYPE_DOUBLE, rate,
++ GST_QUARK (FLUSH), G_TYPE_BOOLEAN, flush,
++ GST_QUARK (INTERMEDIATE), G_TYPE_BOOLEAN, intermediate,
++ GST_QUARK (DURATION), G_TYPE_UINT64, duration, NULL);
++ message = gst_message_new_custom (GST_MESSAGE_STEP_DONE, src, structure);
++
++ return message;
++}
++
++/**
++ * gst_message_parse_step_done:
++ * @message: A valid #GstMessage of type GST_MESSAGE_STEP_DONE.
++ * @format: result location for the format
++ * @amount: result location for the amount
++ * @rate: result location for the rate
++ * @flush: result location for the flush flag
++ * @intermediate: result location for the intermediate flag
++ * @duration: result location for the duration
++ *
++ * Extract the requested state from the request_state message.
++ *
++ * MT safe.
++ *
++ * Since: 0.10.24
++ */
++void
++gst_message_parse_step_done (GstMessage * message, GstFormat * format,
++ guint64 * amount, gdouble * rate, gboolean * flush, gboolean * intermediate,
++ guint64 * duration)
++{
++ g_return_if_fail (GST_IS_MESSAGE (message));
++ g_return_if_fail (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STEP_DONE);
++
++ if (format)
++ *format = g_value_get_enum (gst_structure_id_get_value (message->structure,
++ GST_QUARK (FORMAT)));
++ if (amount)
++ *amount =
++ g_value_get_uint64 (gst_structure_id_get_value (message->structure,
++ GST_QUARK (AMOUNT)));
++ if (rate)
++ *rate = g_value_get_double (gst_structure_id_get_value (message->structure,
++ GST_QUARK (RATE)));
++ if (flush)
++ *flush =
++ g_value_get_boolean (gst_structure_id_get_value (message->structure,
++ GST_QUARK (FLUSH)));
++ if (intermediate)
++ *intermediate =
++ g_value_get_boolean (gst_structure_id_get_value (message->structure,
++ GST_QUARK (INTERMEDIATE)));
++ if (duration)
++ *duration =
++ g_value_get_uint64 (gst_structure_id_get_value (message->structure,
++ GST_QUARK (DURATION)));
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstmessage.h gstreamer-0.10.23/gst/gstmessage.h
+--- gstreamer-0.10.23.orig/gst/gstmessage.h 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/gst/gstmessage.h 2009-06-11 14:19:59.000000000 +0200
+@@ -182,6 +182,17 @@
+ * Get the object that posted @message.
+ */
+ #define GST_MESSAGE_SRC(message) (GST_MESSAGE(message)->src)
++/**
++ * GST_MESSAGE_SRC_NAME:
++ * @message: a #GstMessage
++ *
++ * Get the name of the object that posted @message. Returns "(NULL)" if
++ * the message has no source object set.
++ *
++ * Since: 0.10.24
++ */
++#define GST_MESSAGE_SRC_NAME(message) (GST_MESSAGE_SRC(message) ? \
++ GST_OBJECT_NAME (GST_MESSAGE_SRC(message)) : "(NULL)")
+
+ /**
+ * GstStructureChangeType:
+@@ -198,6 +209,32 @@
+ } GstStructureChangeType;
+
+ /**
++ * GstStreamStatusType:
++ * @GST_STREAM_STATUS_TYPE_CREATE: A new thread need to be created.
++ * @GST_STREAM_STATUS_TYPE_ENTER: a thread entered its loop function
++ * @GST_STREAM_STATUS_TYPE_LEAVE: a thread left its loop function
++ * @GST_STREAM_STATUS_TYPE_DESTROY: a thread is destroyed
++ * @GST_STREAM_STATUS_TYPE_START: a thread is started
++ * @GST_STREAM_STATUS_TYPE_PAUSE: a thread is paused
++ * @GST_STREAM_STATUS_TYPE_STOP: a thread is stopped
++ *
++ * The type of a #GstMessageStreamStatus. The stream status messages inform the
++ * application of new streaming threads and their status.
++ *
++ * Since: 0.10.24
++ */
++typedef enum {
++ GST_STREAM_STATUS_TYPE_CREATE = 0,
++ GST_STREAM_STATUS_TYPE_ENTER = 1,
++ GST_STREAM_STATUS_TYPE_LEAVE = 2,
++ GST_STREAM_STATUS_TYPE_DESTROY = 3,
++
++ GST_STREAM_STATUS_TYPE_START = 8,
++ GST_STREAM_STATUS_TYPE_PAUSE = 9,
++ GST_STREAM_STATUS_TYPE_STOP = 10
++} GstStreamStatusType;
++
++/**
+ * GstMessage:
+ * @mini_object: the parent structure
+ * @type: the #GstMessageType of the message
+@@ -334,14 +371,16 @@
+
+ /* TAG */
+ GstMessage * gst_message_new_tag (GstObject * src, GstTagList * tag_list);
++GstMessage * gst_message_new_tag_full (GstObject * src, GstPad *pad, GstTagList * tag_list);
+ void gst_message_parse_tag (GstMessage *message, GstTagList **tag_list);
++void gst_message_parse_tag_full (GstMessage *message, GstPad **pad, GstTagList **tag_list);
+
+ /* BUFFERING */
+-GstMessage * gst_message_new_buffering (GstObject * src, gint percent);
+-void gst_message_parse_buffering (GstMessage *message, gint *percent);
+-void gst_message_set_buffering_stats (GstMessage *message, GstBufferingMode mode,
+- gint avg_in, gint avg_out,
+- gint64 buffering_left);
++GstMessage * gst_message_new_buffering (GstObject * src, gint percent);
++void gst_message_parse_buffering (GstMessage *message, gint *percent);
++void gst_message_set_buffering_stats (GstMessage *message, GstBufferingMode mode,
++ gint avg_in, gint avg_out,
++ gint64 buffering_left);
+ void gst_message_parse_buffering_stats (GstMessage *message, GstBufferingMode *mode,
+ gint *avg_in, gint *avg_out,
+ gint64 *buffering_left);
+@@ -355,6 +394,13 @@
+ /* STATE_DIRTY */
+ GstMessage * gst_message_new_state_dirty (GstObject * src);
+
++/* STEP_DONE */
++GstMessage * gst_message_new_step_done (GstObject * src, GstFormat format, guint64 amount,
++ gdouble rate, gboolean flush, gboolean intermediate,
++ guint64 duration);
++void gst_message_parse_step_done (GstMessage * message, GstFormat *format, guint64 *amount,
++ gdouble *rate, gboolean *flush, gboolean *intermediate,
++ guint64 *duration);
+ /* CLOCK_PROVIDE */
+ GstMessage * gst_message_new_clock_provide (GstObject * src, GstClock *clock, gboolean ready);
+ void gst_message_parse_clock_provide (GstMessage *message, GstClock **clock,
+@@ -405,6 +451,14 @@
+ void gst_message_parse_structure_change (GstMessage *message, GstStructureChangeType *type,
+ GstElement **owner, gboolean *busy);
+
++/* STREAM STATUS */
++GstMessage * gst_message_new_stream_status (GstObject * src, GstStreamStatusType type,
++ GstElement *owner);
++void gst_message_parse_stream_status (GstMessage *message, GstStreamStatusType *type,
++ GstElement **owner);
++void gst_message_set_stream_status_object (GstMessage *message, const GValue *object);
++const GValue * gst_message_get_stream_status_object (GstMessage *message);
++
+ /* REQUEST_STATE */
+ GstMessage * gst_message_new_request_state (GstObject * src, GstState state);
+ void gst_message_parse_request_state (GstMessage * message, GstState *state);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstobject.c gstreamer-0.10.23/gst/gstobject.c
+--- gstreamer-0.10.23.orig/gst/gstobject.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gstobject.c 2009-06-11 14:19:59.000000000 +0200
+@@ -327,6 +327,39 @@
+ }
+
+ /**
++ * gst_object_ref_sink:
++ * @object: a #GstObject to sink
++ *
++ * Increase the reference count of @object, and possibly remove the floating
++ * reference, if @object has a floating reference.
++ *
++ * In other words, if the object is floating, then this call "assumes ownership"
++ * of the floating reference, converting it to a normal reference by clearing
++ * the floating flag while leaving the reference count unchanged. If the object
++ * is not floating, then this call adds a new normal reference increasing the
++ * reference count by one.
++ *
++ * MT safe. This function grabs and releases @object lock.
++ *
++ * Since: 0.10.24
++ */
++void
++gst_object_ref_sink (gpointer object)
++{
++ g_return_if_fail (GST_IS_OBJECT (object));
++
++ GST_OBJECT_LOCK (object);
++ if (G_LIKELY (GST_OBJECT_IS_FLOATING (object))) {
++ GST_CAT_LOG_OBJECT (GST_CAT_REFCOUNTING, object, "unsetting floating flag");
++ GST_OBJECT_FLAG_UNSET (object, GST_OBJECT_FLOATING);
++ GST_OBJECT_UNLOCK (object);
++ } else {
++ GST_OBJECT_UNLOCK (object);
++ gst_object_ref (object);
++ }
++}
++
++/**
+ * gst_object_sink:
+ * @object: a #GstObject to sink
+ *
+@@ -472,12 +505,8 @@
+ guint i;
+ gchar *name, *debug_name;
+
+- /* we fail when this is not a GstObject */
+- g_return_if_fail (GST_IS_OBJECT (object));
+-
+ /* do the standard dispatching */
+- G_OBJECT_CLASS (parent_class)->dispatch_properties_changed (object, n_pspecs,
+- pspecs);
++ parent_class->dispatch_properties_changed (object, n_pspecs, pspecs);
+
+ gst_object = GST_OBJECT_CAST (object);
+ name = gst_object_get_name (gst_object);
+@@ -491,8 +520,7 @@
+ "deep notification from %s (%s)", debug_name, pspecs[i]->name);
+
+ g_signal_emit (parent, gst_object_signals[DEEP_NOTIFY],
+- g_quark_from_string (pspecs[i]->name), GST_OBJECT_CAST (object),
+- pspecs[i]);
++ g_quark_from_string (pspecs[i]->name), gst_object, pspecs[i]);
+ }
+
+ old_parent = parent;
+@@ -766,7 +794,7 @@
+ gst_object_ref (object);
+ }
+
+- g_signal_emit (G_OBJECT (object), gst_object_signals[PARENT_SET], 0, parent);
++ g_signal_emit (object, gst_object_signals[PARENT_SET], 0, parent);
+
+ return TRUE;
+
+@@ -832,8 +860,7 @@
+ object->parent = NULL;
+ GST_OBJECT_UNLOCK (object);
+
+- g_signal_emit (G_OBJECT (object), gst_object_signals[PARENT_UNSET], 0,
+- parent);
++ g_signal_emit (object, gst_object_signals[PARENT_UNSET], 0, parent);
+
+ gst_object_unref (object);
+ } else {
+@@ -938,8 +965,7 @@
+ if (oclass->save_thyself)
+ oclass->save_thyself (object, parent);
+
+- g_signal_emit (G_OBJECT (object), gst_object_signals[OBJECT_SAVED], 0,
+- parent);
++ g_signal_emit (object, gst_object_signals[OBJECT_SAVED], 0, parent);
+
+ return parent;
+ }
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstobject.h gstreamer-0.10.23/gst/gstobject.h
+--- gstreamer-0.10.23.orig/gst/gstobject.h 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/gst/gstobject.h 2009-06-11 14:19:59.000000000 +0200
+@@ -290,6 +290,7 @@
+ /* refcounting + life cycle */
+ gpointer gst_object_ref (gpointer object);
+ void gst_object_unref (gpointer object);
++void gst_object_ref_sink (gpointer object);
+ void gst_object_sink (gpointer object);
+
+ /* replace object pointer */
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstpad.c gstreamer-0.10.23/gst/gstpad.c
+--- gstreamer-0.10.23.orig/gst/gstpad.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gstpad.c 2009-06-11 14:19:59.000000000 +0200
+@@ -95,6 +95,16 @@
+ /* FILL ME */
+ };
+
++#define GST_PAD_GET_PRIVATE(obj) \
++ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_PAD, GstPadPrivate))
++
++#define GST_PAD_CHAINLISTFUNC(pad) ((pad)->abidata.ABI.priv->chainlistfunc)
++
++struct _GstPadPrivate
++{
++ GstPadChainListFunction chainlistfunc;
++};
++
+ static void gst_pad_dispose (GObject * object);
+ static void gst_pad_finalize (GObject * object);
+ static void gst_pad_set_property (GObject * object, guint prop_id,
+@@ -230,6 +240,8 @@
+ gobject_class = G_OBJECT_CLASS (klass);
+ gstobject_class = GST_OBJECT_CLASS (klass);
+
++ g_type_class_add_private (klass, sizeof (GstPadPrivate));
++
+ parent_class = g_type_class_peek_parent (klass);
+
+ gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_pad_dispose);
+@@ -314,6 +326,8 @@
+ static void
+ gst_pad_init (GstPad * pad)
+ {
++ pad->abidata.ABI.priv = GST_PAD_GET_PRIVATE (pad);
++
+ GST_PAD_DIRECTION (pad) = GST_PAD_UNKNOWN;
+ GST_PAD_PEER (pad) = NULL;
+
+@@ -1235,6 +1249,29 @@
+ }
+
+ /**
++ * gst_pad_set_chain_list_function:
++ * @pad: a sink #GstPad.
++ * @chainlist: the #GstPadChainListFunction to set.
++ *
++ * Sets the given chain list function for the pad. The chainlist function is
++ * called to process a #GstBufferList input buffer list. See
++ * #GstPadChainListFunction for more details.
++ *
++ * Since: 0.10.24
++ */
++void
++gst_pad_set_chain_list_function (GstPad * pad,
++ GstPadChainListFunction chainlist)
++{
++ g_return_if_fail (GST_IS_PAD (pad));
++ g_return_if_fail (GST_PAD_IS_SINK (pad));
++
++ GST_PAD_CHAINLISTFUNC (pad) = chainlist;
++ GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad, "chainlistfunc set to %s",
++ GST_DEBUG_FUNCPTR_NAME (chainlist));
++}
++
++/**
+ * gst_pad_set_getrange_function:
+ * @pad: a source #GstPad.
+ * @get: the #GstPadGetRangeFunction to set.
+@@ -3274,9 +3311,9 @@
+ * inside of the parent element.
+ * The caller must free this list after use.
+ *
+- * Returns: a newly allocated #GList of pads, free with g_list_free().
+- *
+ * Not MT safe.
++ *
++ * Returns: a newly allocated #GList of pads, free with g_list_free().
+ *
+ * Deprecated: This function does not ref the pads in the list so that they
+ * could become invalid by the time the application accesses them. It's also
+@@ -3622,6 +3659,7 @@
+ {
+ xmlNodePtr field = self->xmlChildrenNode;
+ GstPad *pad = NULL, *targetpad;
++ GstPadTemplate *tmpl;
+ gchar *peer = NULL;
+ gchar **split;
+ GstElement *target;
+@@ -3632,7 +3670,8 @@
+ if (!strcmp ((char *) field->name, "name")) {
+ name = (gchar *) xmlNodeGetContent (field);
+ pad = gst_element_get_static_pad (GST_ELEMENT (parent), name);
+- if (!pad)
++ if ((!pad) || ((tmpl = gst_pad_get_pad_template (pad))
++ && (GST_PAD_REQUEST == GST_PAD_TEMPLATE_PRESENCE (tmpl))))
+ pad = gst_element_get_request_pad (GST_ELEMENT (parent), name);
+ g_free (name);
+ } else if (!strcmp ((char *) field->name, "peer")) {
+@@ -3676,7 +3715,10 @@
+ if (targetpad == NULL)
+ goto cleanup;
+
+- gst_pad_link (pad, targetpad);
++ if (gst_pad_get_direction (pad) == GST_PAD_SRC)
++ gst_pad_link (pad, targetpad);
++ else
++ gst_pad_link (targetpad, pad);
+
+ cleanup:
+ g_strfreev (split);
+@@ -3925,15 +3967,48 @@
+ return res;
+ }
+
++static void
++gst_pad_data_unref (gboolean is_buffer, void *data)
++{
++ if (G_LIKELY (is_buffer)) {
++ gst_buffer_unref (data);
++ } else {
++ gst_buffer_list_unref (data);
++ }
++}
++
++static GstCaps *
++gst_pad_data_get_caps (gboolean is_buffer, void *data)
++{
++ GstCaps *caps;
++
++ if (G_LIKELY (is_buffer)) {
++ caps = GST_BUFFER_CAPS (data);
++ } else {
++ GstBufferListIterator *it;
++ GstBuffer *buf;
++
++ caps = NULL;
++ it = gst_buffer_list_iterate (GST_BUFFER_LIST_CAST (data));
++ if (gst_buffer_list_iterator_next_group (it)) {
++ buf = gst_buffer_list_iterator_next (it);
++ if (buf != NULL) {
++ caps = GST_BUFFER_CAPS (buf);
++ }
++ }
++ gst_buffer_list_iterator_free (it);
++ }
++ return caps;
++}
++
+ /* this is the chain function that does not perform the additional argument
+ * checking for that little extra speed.
+ */
+ static inline GstFlowReturn
+-gst_pad_chain_unchecked (GstPad * pad, GstBuffer * buffer)
++gst_pad_chain_data_unchecked (GstPad * pad, gboolean is_buffer, void *data)
+ {
+ GstCaps *caps;
+ gboolean caps_changed;
+- GstPadChainFunction chainfunc;
+ GstFlowReturn ret;
+ gboolean emit_signal;
+
+@@ -3943,7 +4018,7 @@
+ if (G_UNLIKELY (GST_PAD_IS_FLUSHING (pad)))
+ goto flushing;
+
+- caps = GST_BUFFER_CAPS (buffer);
++ caps = gst_pad_data_get_caps (is_buffer, data);
+ caps_changed = caps && caps != GST_PAD_CAPS (pad);
+
+ emit_signal = GST_PAD_DO_BUFFER_SIGNALS (pad) > 0;
+@@ -3952,8 +4027,14 @@
+ /* see if the signal should be emited, we emit before caps nego as
+ * we might drop the buffer and do capsnego for nothing. */
+ if (G_UNLIKELY (emit_signal)) {
+- if (!gst_pad_emit_have_data_signal (pad, GST_MINI_OBJECT (buffer)))
+- goto dropping;
++ if (G_LIKELY (is_buffer)) {
++ if (!gst_pad_emit_have_data_signal (pad, GST_MINI_OBJECT (data)))
++ goto dropping;
++ } else {
++ /* chain all groups in the buffer list one by one to avoid problems with
++ * buffer probes that push buffers or events */
++ goto chain_groups;
++ }
+ }
+
+ /* we got a new datatype on the pad, see if it can handle it */
+@@ -3968,26 +4049,81 @@
+ * the data to the wrong function. This is not really a
+ * problem since functions are assigned at creation time
+ * and don't change that often... */
+- if (G_UNLIKELY ((chainfunc = GST_PAD_CHAINFUNC (pad)) == NULL))
+- goto no_function;
++ if (G_LIKELY (is_buffer)) {
++ GstPadChainFunction chainfunc;
+
+- GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+- "calling chainfunction &%s", GST_DEBUG_FUNCPTR_NAME (chainfunc));
++ if (G_UNLIKELY ((chainfunc = GST_PAD_CHAINFUNC (pad)) == NULL))
++ goto no_function;
+
+- ret = chainfunc (pad, buffer);
++ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
++ "calling chainfunction &%s", GST_DEBUG_FUNCPTR_NAME (chainfunc));
+
+- GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+- "called chainfunction &%s, returned %s",
+- GST_DEBUG_FUNCPTR_NAME (chainfunc), gst_flow_get_name (ret));
++ ret = chainfunc (pad, GST_BUFFER_CAST (data));
++
++ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
++ "called chainfunction &%s, returned %s",
++ GST_DEBUG_FUNCPTR_NAME (chainfunc), gst_flow_get_name (ret));
++ } else {
++ GstPadChainListFunction chainlistfunc;
++
++ if (G_UNLIKELY ((chainlistfunc = GST_PAD_CHAINLISTFUNC (pad)) == NULL))
++ goto chain_groups;
++
++ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
++ "calling chainlistfunction &%s",
++ GST_DEBUG_FUNCPTR_NAME (chainlistfunc));
++
++ ret = chainlistfunc (pad, GST_BUFFER_LIST_CAST (data));
++
++ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
++ "called chainlistfunction &%s, returned %s",
++ GST_DEBUG_FUNCPTR_NAME (chainlistfunc), gst_flow_get_name (ret));
++ }
+
+ GST_PAD_STREAM_UNLOCK (pad);
+
+ return ret;
+
++chain_groups:
++ {
++ GstBufferList *list;
++ GstBufferListIterator *it;
++ GstBuffer *group;
++
++ GST_PAD_STREAM_UNLOCK (pad);
++
++ GST_INFO_OBJECT (pad, "chaining each group in list as a merged buffer");
++
++ list = GST_BUFFER_LIST_CAST (data);
++ it = gst_buffer_list_iterate (list);
++
++ ret = GST_FLOW_OK;
++ if (gst_buffer_list_iterator_next_group (it)) {
++ do {
++ group = gst_buffer_list_iterator_merge_group (it);
++ if (group == NULL) {
++ group = gst_buffer_new ();
++ GST_CAT_INFO_OBJECT (GST_CAT_SCHEDULING, pad, "chaining empty group");
++ } else {
++ GST_CAT_INFO_OBJECT (GST_CAT_SCHEDULING, pad, "chaining group");
++ }
++ ret = gst_pad_chain_data_unchecked (pad, TRUE, group);
++ } while (ret == GST_FLOW_OK && gst_buffer_list_iterator_next_group (it));
++ } else {
++ GST_CAT_INFO_OBJECT (GST_CAT_SCHEDULING, pad, "chaining empty group");
++ ret = gst_pad_chain_data_unchecked (pad, TRUE, gst_buffer_new ());
++ }
++
++ gst_buffer_list_iterator_free (it);
++ gst_buffer_list_unref (list);
++
++ return ret;
++ }
++
+ /* ERRORS */
+ flushing:
+ {
+- gst_buffer_unref (buffer);
++ gst_pad_data_unref (is_buffer, data);
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "pushing, but pad was flushing");
+ GST_OBJECT_UNLOCK (pad);
+@@ -3996,22 +4132,22 @@
+ }
+ dropping:
+ {
+- gst_buffer_unref (buffer);
++ gst_pad_data_unref (is_buffer, data);
+ GST_DEBUG_OBJECT (pad, "Dropping buffer due to FALSE probe return");
+ GST_PAD_STREAM_UNLOCK (pad);
+ return GST_FLOW_OK;
+ }
+ not_negotiated:
+ {
+- gst_buffer_unref (buffer);
++ gst_pad_data_unref (is_buffer, data);
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+- "pushing buffer but pad did not accept");
++ "pushing data but pad did not accept");
+ GST_PAD_STREAM_UNLOCK (pad);
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+ no_function:
+ {
+- gst_buffer_unref (buffer);
++ gst_pad_data_unref (is_buffer, data);
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "pushing, but not chainhandler");
+ GST_ELEMENT_ERROR (GST_PAD_PARENT (pad), CORE, PAD, (NULL),
+@@ -4055,48 +4191,55 @@
+ g_return_val_if_fail (GST_PAD_IS_SINK (pad), GST_FLOW_ERROR);
+ g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR);
+
+- return gst_pad_chain_unchecked (pad, buffer);
++ return gst_pad_chain_data_unchecked (pad, TRUE, buffer);
+ }
+
+ /**
+- * gst_pad_push:
+- * @pad: a source #GstPad, returns #GST_FLOW_ERROR if not.
+- * @buffer: the #GstBuffer to push returns GST_FLOW_ERROR if not.
++ * gst_pad_chain_list:
++ * @pad: a sink #GstPad, returns GST_FLOW_ERROR if not.
++ * @list: the #GstBufferList to send, return GST_FLOW_ERROR if not.
+ *
+- * Pushes a buffer to the peer of @pad.
++ * Chain a bufferlist to @pad.
+ *
+- * This function will call an installed pad block before triggering any
+- * installed pad probes.
++ * The function returns #GST_FLOW_WRONG_STATE if the pad was flushing.
+ *
+- * If the caps on @buffer are different from the currently configured caps on
+- * @pad, this function will call any installed setcaps function on @pad (see
+- * gst_pad_set_setcaps_function()). In case of failure to renegotiate the new
+- * format, this function returns #GST_FLOW_NOT_NEGOTIATED.
++ * If the caps on the first buffer of @list are different from the current
++ * caps on @pad, this function will call any setcaps function
++ * (see gst_pad_set_setcaps_function()) installed on @pad. If the new caps
++ * are not acceptable for @pad, this function returns #GST_FLOW_NOT_NEGOTIATED.
+ *
+- * The function proceeds calling gst_pad_chain() on the peer pad and returns
+- * the value from that function. If @pad has no peer, #GST_FLOW_NOT_LINKED will
+- * be returned.
++ * The function proceeds calling the chainlist function installed on @pad (see
++ * gst_pad_set_chain_list_function()) and the return value of that function is
++ * returned to the caller. #GST_FLOW_NOT_SUPPORTED is returned if @pad has no
++ * chainlist function.
+ *
+- * In all cases, success or failure, the caller loses its reference to @buffer
++ * In all cases, success or failure, the caller loses its reference to @list
+ * after calling this function.
+ *
+- * Returns: a #GstFlowReturn from the peer pad.
+- *
+ * MT safe.
++ *
++ * Returns: a #GstFlowReturn from the pad.
++ *
++ * Since: 0.10.24
+ */
+ GstFlowReturn
+-gst_pad_push (GstPad * pad, GstBuffer * buffer)
++gst_pad_chain_list (GstPad * pad, GstBufferList * list)
++{
++ g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
++ g_return_val_if_fail (GST_PAD_IS_SINK (pad), GST_FLOW_ERROR);
++ g_return_val_if_fail (GST_IS_BUFFER_LIST (list), GST_FLOW_ERROR);
++
++ return gst_pad_chain_data_unchecked (pad, FALSE, list);
++}
++
++static GstFlowReturn
++gst_pad_push_data (GstPad * pad, gboolean is_buffer, void *data)
+ {
+ GstPad *peer;
+ GstFlowReturn ret;
+-
+ GstCaps *caps;
+ gboolean caps_changed;
+
+- g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
+- g_return_val_if_fail (GST_PAD_IS_SRC (pad), GST_FLOW_ERROR);
+- g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR);
+-
+ GST_OBJECT_LOCK (pad);
+
+ /* FIXME: this check can go away; pad_set_blocked could be implemented with
+@@ -4111,25 +4254,29 @@
+ /* unlock before emitting */
+ GST_OBJECT_UNLOCK (pad);
+
+- /* if the signal handler returned FALSE, it means we should just drop the
+- * buffer */
+- if (!gst_pad_emit_have_data_signal (pad, GST_MINI_OBJECT (buffer)))
+- goto dropped;
+-
++ if (G_LIKELY (is_buffer)) {
++ /* if the signal handler returned FALSE, it means we should just drop the
++ * buffer */
++ if (!gst_pad_emit_have_data_signal (pad, GST_MINI_OBJECT (data)))
++ goto dropped;
++ } else {
++ /* push all buffers in the list */
++ goto push_groups;
++ }
+ GST_OBJECT_LOCK (pad);
+ }
+
+ if (G_UNLIKELY ((peer = GST_PAD_PEER (pad)) == NULL))
+ goto not_linked;
+
+- /* take ref to peer pad before releasing the lock */
+- gst_object_ref (peer);
+-
+ /* Before pushing the buffer to the peer pad, ensure that caps
+ * are set on this pad */
+- caps = GST_BUFFER_CAPS (buffer);
++ caps = gst_pad_data_get_caps (is_buffer, data);
+ caps_changed = caps && caps != GST_PAD_CAPS (pad);
+
++ /* take ref to peer pad before releasing the lock */
++ gst_object_ref (peer);
++
+ GST_OBJECT_UNLOCK (pad);
+
+ /* we got a new datatype from the pad, it had better handle it */
+@@ -4141,29 +4288,63 @@
+ goto not_negotiated;
+ }
+
+- ret = gst_pad_chain_unchecked (peer, buffer);
++ ret = gst_pad_chain_data_unchecked (peer, is_buffer, data);
+
+ gst_object_unref (peer);
+
+ return ret;
+
++push_groups:
++ {
++ GstBufferList *list;
++ GstBufferListIterator *it;
++ GstBuffer *group;
++
++ GST_INFO_OBJECT (pad, "pushing each group in list as a merged buffer");
++
++ list = GST_BUFFER_LIST_CAST (data);
++ it = gst_buffer_list_iterate (list);
++
++ ret = GST_FLOW_OK;
++ if (gst_buffer_list_iterator_next_group (it)) {
++ do {
++ group = gst_buffer_list_iterator_merge_group (it);
++ if (group == NULL) {
++ group = gst_buffer_new ();
++ GST_CAT_INFO_OBJECT (GST_CAT_SCHEDULING, pad, "pushing empty group");
++ } else {
++ GST_CAT_INFO_OBJECT (GST_CAT_SCHEDULING, pad, "pushing group");
++ }
++ ret = gst_pad_push_data (pad, TRUE, group);
++ } while (ret == GST_FLOW_OK && gst_buffer_list_iterator_next_group (it));
++ } else {
++ GST_CAT_INFO_OBJECT (GST_CAT_SCHEDULING, pad, "pushing empty group");
++ ret = gst_pad_push_data (pad, TRUE, gst_buffer_new ());
++ }
++
++ gst_buffer_list_iterator_free (it);
++ gst_buffer_list_unref (list);
++
++ return ret;
++ }
++
+ /* ERROR recovery here */
+ flushed:
+ {
+- gst_buffer_unref (buffer);
++ gst_pad_data_unref (is_buffer, data);
+ GST_DEBUG_OBJECT (pad, "pad block stopped by flush");
+ GST_OBJECT_UNLOCK (pad);
+ return ret;
+ }
+ dropped:
+ {
+- gst_buffer_unref (buffer);
++ gst_pad_data_unref (is_buffer, data);
+ GST_DEBUG_OBJECT (pad, "Dropping buffer due to FALSE probe return");
+ return GST_FLOW_OK;
+ }
+ not_linked:
+ {
+- gst_buffer_unref (buffer);
++ gst_pad_data_unref (is_buffer, data);
+ GST_CAT_LOG_OBJECT (GST_CAT_SCHEDULING, pad,
+ "pushing, but it was not linked");
+ GST_OBJECT_UNLOCK (pad);
+@@ -4171,15 +4352,96 @@
+ }
+ not_negotiated:
+ {
+- gst_buffer_unref (buffer);
++ gst_pad_data_unref (is_buffer, data);
+ gst_object_unref (peer);
+ GST_CAT_DEBUG_OBJECT (GST_CAT_SCHEDULING, pad,
+- "element pushed buffer then refused to accept the caps");
++ "element pushed data then refused to accept the caps");
+ return GST_FLOW_NOT_NEGOTIATED;
+ }
+ }
+
+ /**
++ * gst_pad_push:
++ * @pad: a source #GstPad, returns #GST_FLOW_ERROR if not.
++ * @buffer: the #GstBuffer to push returns GST_FLOW_ERROR if not.
++ *
++ * Pushes a buffer to the peer of @pad.
++ *
++ * This function will call an installed pad block before triggering any
++ * installed pad probes.
++ *
++ * If the caps on @buffer are different from the currently configured caps on
++ * @pad, this function will call any installed setcaps function on @pad (see
++ * gst_pad_set_setcaps_function()). In case of failure to renegotiate the new
++ * format, this function returns #GST_FLOW_NOT_NEGOTIATED.
++ *
++ * The function proceeds calling gst_pad_chain() on the peer pad and returns
++ * the value from that function. If @pad has no peer, #GST_FLOW_NOT_LINKED will
++ * be returned.
++ *
++ * In all cases, success or failure, the caller loses its reference to @buffer
++ * after calling this function.
++ *
++ * Returns: a #GstFlowReturn from the peer pad.
++ *
++ * MT safe.
++ */
++GstFlowReturn
++gst_pad_push (GstPad * pad, GstBuffer * buffer)
++{
++ g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
++ g_return_val_if_fail (GST_PAD_IS_SRC (pad), GST_FLOW_ERROR);
++ g_return_val_if_fail (GST_IS_BUFFER (buffer), GST_FLOW_ERROR);
++
++ return gst_pad_push_data (pad, TRUE, buffer);
++}
++
++/**
++ * gst_pad_push_list:
++ * @pad: a source #GstPad, returns #GST_FLOW_ERROR if not.
++ * @list: the #GstBufferList to push returns GST_FLOW_ERROR if not.
++ *
++ * Pushes a buffer list to the peer of @pad.
++ *
++ * This function will call an installed pad block before triggering any
++ * installed pad probes.
++ *
++ * If the caps on the first buffer in the first group of @list are different
++ * from the currently configured caps on @pad, this function will call any
++ * installed setcaps function on @pad (see gst_pad_set_setcaps_function()). In
++ * case of failure to renegotiate the new format, this function returns
++ * #GST_FLOW_NOT_NEGOTIATED.
++ *
++ * If there are any probes installed on @pad every group of the buffer list
++ * will be merged into a normal #GstBuffer and pushed via gst_pad_push and the
++ * buffer list will be unreffed.
++ *
++ * The function proceeds calling the chain function on the peer pad and returns
++ * the value from that function. If @pad has no peer, #GST_FLOW_NOT_LINKED will
++ * be returned. If the peer pad does not have any installed chainlist function
++ * every group buffer of the list will be merged into a normal #GstBuffer and
++ * chained via gst_pad_chain().
++ *
++ * In all cases, success or failure, the caller loses its reference to @list
++ * after calling this function.
++ *
++ * Returns: a #GstFlowReturn from the peer pad.
++ *
++ * MT safe.
++ *
++ * Since: 0.10.24
++ */
++GstFlowReturn
++gst_pad_push_list (GstPad * pad, GstBufferList * list)
++{
++ g_return_val_if_fail (GST_IS_PAD (pad), GST_FLOW_ERROR);
++ g_return_val_if_fail (GST_PAD_IS_SRC (pad), GST_FLOW_ERROR);
++ g_return_val_if_fail (GST_IS_BUFFER_LIST (list), GST_FLOW_ERROR);
++
++ return gst_pad_push_data (pad, FALSE, list);
++}
++
++/**
+ * gst_pad_check_pull_range:
+ * @pad: a sink #GstPad.
+ *
+@@ -4801,6 +5063,53 @@
+ return pad->element_private;
+ }
+
++static void
++do_stream_status (GstPad * pad, GstStreamStatusType type,
++ GThread * thread, GstTask * task)
++{
++ GstElement *parent;
++
++ GST_DEBUG_OBJECT (pad, "doing stream-status %d", type);
++
++ if ((parent = GST_ELEMENT_CAST (gst_pad_get_parent (pad)))) {
++ if (GST_IS_ELEMENT (parent)) {
++ GstMessage *message;
++ GValue value = { 0 };
++
++ message = gst_message_new_stream_status (GST_OBJECT_CAST (pad),
++ type, parent);
++
++ g_value_init (&value, GST_TYPE_TASK);
++ g_value_set_object (&value, task);
++ gst_message_set_stream_status_object (message, &value);
++ g_value_unset (&value);
++
++ GST_DEBUG_OBJECT (pad, "posting stream-status %d", type);
++ gst_element_post_message (parent, message);
++ }
++ gst_object_unref (parent);
++ }
++}
++
++static void
++pad_enter_thread (GstTask * task, GThread * thread, gpointer user_data)
++{
++ do_stream_status (GST_PAD_CAST (user_data), GST_STREAM_STATUS_TYPE_ENTER,
++ thread, task);
++}
++
++static void
++pad_leave_thread (GstTask * task, GThread * thread, gpointer user_data)
++{
++ do_stream_status (GST_PAD_CAST (user_data), GST_STREAM_STATUS_TYPE_LEAVE,
++ thread, task);
++}
++
++static GstTaskThreadCallbacks thr_callbacks = {
++ pad_enter_thread,
++ pad_leave_thread,
++};
++
+ /**
+ * gst_pad_start_task:
+ * @pad: the #GstPad to start the task of
+@@ -4818,6 +5127,7 @@
+ gst_pad_start_task (GstPad * pad, GstTaskFunction func, gpointer data)
+ {
+ GstTask *task;
++ gboolean res;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+ g_return_val_if_fail (func != NULL, FALSE);
+@@ -4829,13 +5139,33 @@
+ if (task == NULL) {
+ task = gst_task_create (func, data);
+ gst_task_set_lock (task, GST_PAD_GET_STREAM_LOCK (pad));
+- GST_PAD_TASK (pad) = task;
++ gst_task_set_thread_callbacks (task, &thr_callbacks, pad, NULL);
+ GST_DEBUG_OBJECT (pad, "created task");
++ GST_PAD_TASK (pad) = task;
++ gst_object_ref (task);
++ /* release lock to post the message */
++ GST_OBJECT_UNLOCK (pad);
++
++ do_stream_status (pad, GST_STREAM_STATUS_TYPE_CREATE, NULL, task);
++
++ gst_object_unref (task);
++
++ GST_OBJECT_LOCK (pad);
++ /* nobody else is supposed to have changed the pad now */
++ if (GST_PAD_TASK (pad) != task)
++ goto concurrent_stop;
+ }
+- gst_task_start (task);
++ res = gst_task_set_state (task, GST_TASK_STARTED);
+ GST_OBJECT_UNLOCK (pad);
+
+- return TRUE;
++ return res;
++
++ /* ERRORS */
++concurrent_stop:
++ {
++ GST_OBJECT_UNLOCK (pad);
++ return TRUE;
++ }
+ }
+
+ /**
+@@ -4853,6 +5183,7 @@
+ gst_pad_pause_task (GstPad * pad)
+ {
+ GstTask *task;
++ gboolean res;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+
+@@ -4862,7 +5193,7 @@
+ task = GST_PAD_TASK (pad);
+ if (task == NULL)
+ goto no_task;
+- gst_task_pause (task);
++ res = gst_task_set_state (task, GST_TASK_PAUSED);
+ GST_OBJECT_UNLOCK (pad);
+
+ /* wait for task function to finish, this lock is recursive so it does nothing
+@@ -4870,7 +5201,7 @@
+ GST_PAD_STREAM_LOCK (pad);
+ GST_PAD_STREAM_UNLOCK (pad);
+
+- return TRUE;
++ return res;
+
+ no_task:
+ {
+@@ -4900,6 +5231,7 @@
+ gst_pad_stop_task (GstPad * pad)
+ {
+ GstTask *task;
++ gboolean res;
+
+ g_return_val_if_fail (GST_IS_PAD (pad), FALSE);
+
+@@ -4910,7 +5242,7 @@
+ if (task == NULL)
+ goto no_task;
+ GST_PAD_TASK (pad) = NULL;
+- gst_task_stop (task);
++ res = gst_task_set_state (task, GST_TASK_STOPPED);
+ GST_OBJECT_UNLOCK (pad);
+
+ GST_PAD_STREAM_LOCK (pad);
+@@ -4921,7 +5253,7 @@
+
+ gst_object_unref (task);
+
+- return TRUE;
++ return res;
+
+ no_task:
+ {
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstpad.h gstreamer-0.10.23/gst/gstpad.h
+--- gstreamer-0.10.23.orig/gst/gstpad.h 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/gst/gstpad.h 2009-06-11 14:19:59.000000000 +0200
+@@ -28,6 +28,7 @@
+
+ #include <gst/gstobject.h>
+ #include <gst/gstbuffer.h>
++#include <gst/gstbufferlist.h>
+ #include <gst/gstcaps.h>
+ #include <gst/gstevent.h>
+ #include <gst/gstquery.h>
+@@ -47,6 +48,7 @@
+
+
+ typedef struct _GstPad GstPad;
++typedef struct _GstPadPrivate GstPadPrivate;
+ typedef struct _GstPadClass GstPadClass;
+
+ /**
+@@ -230,6 +232,26 @@
+ * Returns: #GST_FLOW_OK for success
+ */
+ typedef GstFlowReturn (*GstPadChainFunction) (GstPad *pad, GstBuffer *buffer);
++
++/**
++ * GstPadChainListFunction:
++ * @pad: the sink #GstPad that performed the chain.
++ * @list: the #GstBufferList that is chained, not %NULL.
++ *
++ * A function that will be called on sinkpads when chaining buffer lists.
++ * The function typically processes the data contained in the buffer list and
++ * either consumes the data or passes it on to the internally linked pad(s).
++ *
++ * The implementer of this function receives a refcount to @list and
++ * should gst_buffer_list_unref() when the list is no longer needed.
++ *
++ * When a chainlist function detects an error in the data stream, it must
++ * post an error on the bus and return an appropriate #GstFlowReturn value.
++ *
++ * Returns: #GST_FLOW_OK for success
++ */
++typedef GstFlowReturn (*GstPadChainListFunction) (GstPad *pad, GstBufferList *list);
++
+ /**
+ * GstPadGetRangeFunction:
+ * @pad: the src #GstPad to perform the getrange on.
+@@ -546,7 +568,7 @@
+ * @unlinkfunc: function called when pad is unlinked
+ * @peer: the pad this pad is linked to
+ * @sched_private: private storage for the scheduler
+- * @chainfunc: function to chain data to pad
++ * @chainfunc: function to chain buffer to pad
+ * @checkgetrangefunc: function to check if pad can operate in pull mode
+ * @getrangefunc: function to get a range of data from a pad
+ * @eventfunc: function to send an event to a pad
+@@ -637,6 +659,7 @@
+ union {
+ struct {
+ gboolean block_callback_called;
++ GstPadPrivate *priv;
+ } ABI;
+ gpointer _gst_reserved[GST_PADDING - 2];
+ } abidata;
+@@ -840,6 +863,7 @@
+ void gst_pad_set_activatepull_function (GstPad *pad, GstPadActivateModeFunction activatepull);
+ void gst_pad_set_activatepush_function (GstPad *pad, GstPadActivateModeFunction activatepush);
+ void gst_pad_set_chain_function (GstPad *pad, GstPadChainFunction chain);
++void gst_pad_set_chain_list_function (GstPad *pad, GstPadChainListFunction chainlist);
+ void gst_pad_set_getrange_function (GstPad *pad, GstPadGetRangeFunction get);
+ void gst_pad_set_checkgetrange_function (GstPad *pad, GstPadCheckGetRangeFunction check);
+ void gst_pad_set_event_function (GstPad *pad, GstPadEventFunction event);
+@@ -878,6 +902,7 @@
+
+ /* data passing functions to peer */
+ GstFlowReturn gst_pad_push (GstPad *pad, GstBuffer *buffer);
++GstFlowReturn gst_pad_push_list (GstPad *pad, GstBufferList *list);
+ gboolean gst_pad_check_pull_range (GstPad *pad);
+ GstFlowReturn gst_pad_pull_range (GstPad *pad, guint64 offset, guint size,
+ GstBuffer **buffer);
+@@ -886,6 +911,7 @@
+
+ /* data passing functions on pad */
+ GstFlowReturn gst_pad_chain (GstPad *pad, GstBuffer *buffer);
++GstFlowReturn gst_pad_chain_list (GstPad *pad, GstBufferList *list);
+ GstFlowReturn gst_pad_get_range (GstPad *pad, guint64 offset, guint size,
+ GstBuffer **buffer);
+ gboolean gst_pad_send_event (GstPad *pad, GstEvent *event);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstpadtemplate.c gstreamer-0.10.23/gst/gstpadtemplate.c
+--- gstreamer-0.10.23.orig/gst/gstpadtemplate.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gstpadtemplate.c 2009-06-11 14:19:59.000000000 +0200
+@@ -231,8 +231,7 @@
+ * owned by the creator of the object
+ */
+ if (GST_OBJECT_IS_FLOATING (templ)) {
+- gst_object_ref (templ);
+- gst_object_sink (templ);
++ gst_object_ref_sink (templ);
+ }
+ }
+
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstpipeline.c gstreamer-0.10.23/gst/gstpipeline.c
+--- gstreamer-0.10.23.orig/gst/gstpipeline.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gstpipeline.c 2009-06-11 14:19:59.000000000 +0200
+@@ -62,23 +62,23 @@
+ * gst_pipeline_auto_clock() the default clock selection algorithm can be
+ * restored.
+ *
+- * A #GstPipeline maintains a stream time for the elements. The stream
++ * A #GstPipeline maintains a running time for the elements. The running
+ * time is defined as the difference between the current clock time and
+ * the base time. When the pipeline goes to READY or a flushing seek is
+- * performed on it, the stream time is reset to 0. When the pipeline is
++ * performed on it, the running time is reset to 0. When the pipeline is
+ * set from PLAYING to PAUSED, the current clock time is sampled and used to
+ * configure the base time for the elements when the pipeline is set
+- * to PLAYING again. The effect is that the stream time (as the difference
++ * to PLAYING again. The effect is that the running time (as the difference
+ * between the clock time and the base time) will count how much time was spent
+ * in the PLAYING state. This default behaviour can be changed with the
+- * gst_pipeline_set_new_stream_time() method.
++ * gst_element_set_start_time() method.
+ *
+ * When sending a flushing seek event to a GstPipeline (see
+ * gst_element_seek()), it will make sure that the pipeline is properly
+- * PAUSED and resumed as well as set the new stream time to 0 when the
++ * PAUSED and resumed as well as set the new running time to 0 when the
+ * seek succeeded.
+ *
+- * Last reviewed on 2006-03-12 (0.10.5)
++ * Last reviewed on 2009-05-29 (0.10.24)
+ */
+
+ #include "gst_private.h"
+@@ -120,7 +120,7 @@
+
+ /* when we need to update stream_time or clock when going back to
+ * PLAYING*/
+- gboolean update_stream_time;
++ GstClockTime last_start_time;
+ gboolean update_clock;
+ };
+
+@@ -292,15 +292,16 @@
+ }
+ }
+
+-/* set the stream time to 0 */
++/* set the start_time to 0, this will cause us to select a new base_time and
++ * make the running_time start from 0 again. */
+ static void
+-reset_stream_time (GstPipeline * pipeline)
++reset_start_time (GstPipeline * pipeline)
+ {
+ GST_OBJECT_LOCK (pipeline);
+- if (pipeline->stream_time != GST_CLOCK_TIME_NONE) {
+- GST_DEBUG_OBJECT (pipeline, "reset stream_time to 0");
+- pipeline->stream_time = 0;
+- pipeline->priv->update_stream_time = TRUE;
++ if (GST_ELEMENT_START_TIME (pipeline) != GST_CLOCK_TIME_NONE) {
++ GST_DEBUG_OBJECT (pipeline, "reset start_time to 0");
++ GST_ELEMENT_START_TIME (pipeline) = 0;
++ pipeline->priv->last_start_time = -1;
+ } else {
+ GST_DEBUG_OBJECT (pipeline, "application asked to not reset stream_time");
+ }
+@@ -346,8 +347,8 @@
+ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+ {
+ GstClockTime new_base_time;
+- GstClockTime start_time, stream_time, delay;
+- gboolean new_clock, update_stream_time, update_clock;
++ GstClockTime now, start_time, last_start_time, delay;
++ gboolean update_clock;
+ GstClock *cur_clock;
+
+ GST_DEBUG_OBJECT (element, "selecting clock and base_time");
+@@ -356,18 +357,20 @@
+ cur_clock = element->clock;
+ if (cur_clock)
+ gst_object_ref (cur_clock);
+- stream_time = pipeline->stream_time;
+- update_stream_time = pipeline->priv->update_stream_time;
++ /* get the desired running_time of the first buffer aka the start_time */
++ start_time = GST_ELEMENT_START_TIME (pipeline);
++ last_start_time = pipeline->priv->last_start_time;
++ pipeline->priv->last_start_time = start_time;
++ /* see if we need to update the clock */
+ update_clock = pipeline->priv->update_clock;
+- pipeline->priv->update_stream_time = FALSE;
+ pipeline->priv->update_clock = FALSE;
+ delay = pipeline->delay;
+ GST_OBJECT_UNLOCK (element);
+
+- /* stream time changed, either with a PAUSED or a flush, we need to check
++ /* running time changed, either with a PAUSED or a flush, we need to check
+ * if there is a new clock & update the base time */
+- if (update_stream_time) {
+- GST_DEBUG_OBJECT (pipeline, "Need to update stream_time");
++ if (last_start_time != start_time) {
++ GST_DEBUG_OBJECT (pipeline, "Need to update start_time");
+
+ /* when going to PLAYING, select a clock when needed. If we just got
+ * flushed, we don't reselect the clock. */
+@@ -380,16 +383,14 @@
+ clock = gst_object_ref (cur_clock);
+ }
+
+- new_clock = (clock != cur_clock);
+-
+ if (clock) {
+- start_time = gst_clock_get_time (clock);
++ now = gst_clock_get_time (clock);
+ } else {
+ GST_DEBUG ("no clock, using base time of NONE");
+- start_time = GST_CLOCK_TIME_NONE;
++ now = GST_CLOCK_TIME_NONE;
+ }
+
+- if (new_clock) {
++ if (clock != cur_clock) {
+ /* now distribute the clock (which could be NULL). If some
+ * element refuses the clock, this will return FALSE and
+ * we effectively fail the state change. */
+@@ -405,13 +406,12 @@
+ if (clock)
+ gst_object_unref (clock);
+
+- if (stream_time != GST_CLOCK_TIME_NONE
+- && start_time != GST_CLOCK_TIME_NONE) {
+- new_base_time = start_time - stream_time + delay;
++ if (start_time != GST_CLOCK_TIME_NONE && now != GST_CLOCK_TIME_NONE) {
++ new_base_time = now - start_time + delay;
+ GST_DEBUG_OBJECT (element,
+- "stream_time=%" GST_TIME_FORMAT ", now=%" GST_TIME_FORMAT
++ "start_time=%" GST_TIME_FORMAT ", now=%" GST_TIME_FORMAT
+ ", base_time %" GST_TIME_FORMAT,
+- GST_TIME_ARGS (stream_time), GST_TIME_ARGS (start_time),
++ GST_TIME_ARGS (start_time), GST_TIME_ARGS (now),
+ GST_TIME_ARGS (new_base_time));
+ } else
+ new_base_time = GST_CLOCK_TIME_NONE;
+@@ -420,7 +420,7 @@
+ gst_element_set_base_time (element, new_base_time);
+ else
+ GST_DEBUG_OBJECT (pipeline,
+- "NOT adjusting base_time because stream_time is NONE");
++ "NOT adjusting base_time because start_time is NONE");
+ } else {
+ GST_DEBUG_OBJECT (pipeline,
+ "NOT adjusting base_time because we selected one before");
+@@ -431,25 +431,6 @@
+ break;
+ }
+ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+- break;
+- case GST_STATE_CHANGE_PAUSED_TO_READY:
+- case GST_STATE_CHANGE_READY_TO_NULL:
+- break;
+- }
+-
+- result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+-
+- switch (transition) {
+- case GST_STATE_CHANGE_NULL_TO_READY:
+- break;
+- case GST_STATE_CHANGE_READY_TO_PAUSED:
+- {
+- reset_stream_time (pipeline);
+- break;
+- }
+- case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
+- break;
+- case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
+ GST_OBJECT_LOCK (element);
+ if ((clock = element->clock)) {
+ GstClockTime now;
+@@ -462,23 +443,41 @@
+ gst_object_unref (clock);
+
+ GST_OBJECT_LOCK (element);
+- /* store the current stream time */
+- if (pipeline->stream_time != GST_CLOCK_TIME_NONE) {
+- pipeline->stream_time = now - element->base_time;
++ /* store the current running time */
++ if (GST_ELEMENT_START_TIME (pipeline) != GST_CLOCK_TIME_NONE) {
++ GST_ELEMENT_START_TIME (pipeline) = now - element->base_time;
+ /* we went to PAUSED, when going to PLAYING select clock and new
+ * base_time */
+- pipeline->priv->update_stream_time = TRUE;
+ pipeline->priv->update_clock = TRUE;
+ }
+-
+ GST_DEBUG_OBJECT (element,
+- "stream_time=%" GST_TIME_FORMAT ", now=%" GST_TIME_FORMAT
++ "start_time=%" GST_TIME_FORMAT ", now=%" GST_TIME_FORMAT
+ ", base_time %" GST_TIME_FORMAT,
+- GST_TIME_ARGS (pipeline->stream_time), GST_TIME_ARGS (now),
+- GST_TIME_ARGS (element->base_time));
++ GST_TIME_ARGS (GST_ELEMENT_START_TIME (pipeline)),
++ GST_TIME_ARGS (now), GST_TIME_ARGS (element->base_time));
+ }
+ GST_OBJECT_UNLOCK (element);
+ break;
++ break;
++ case GST_STATE_CHANGE_PAUSED_TO_READY:
++ case GST_STATE_CHANGE_READY_TO_NULL:
++ break;
++ }
++
++ result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
++
++ switch (transition) {
++ case GST_STATE_CHANGE_NULL_TO_READY:
++ break;
++ case GST_STATE_CHANGE_READY_TO_PAUSED:
++ {
++ reset_start_time (pipeline);
++ break;
++ }
++ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
++ break;
++ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
++ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ break;
+ case GST_STATE_CHANGE_READY_TO_NULL:
+@@ -540,10 +539,10 @@
+
+ gst_message_parse_async_start (message, &new_base_time);
+
+- /* reset our stream time if we need to distribute a new base_time to the
++ /* reset our running time if we need to distribute a new base_time to the
+ * children. */
+ if (new_base_time)
+- reset_stream_time (pipeline);
++ reset_start_time (pipeline);
+
+ break;
+ }
+@@ -572,9 +571,9 @@
+ /**
+ * gst_pipeline_set_new_stream_time:
+ * @pipeline: a #GstPipeline
+- * @time: the new stream time to set
++ * @time: the new running time to set
+ *
+- * Set the new stream time of @pipeline to @time. The stream time is used to
++ * Set the new start time of @pipeline to @time. The start time is used to
+ * set the base time on the elements (see gst_element_set_base_time())
+ * in the PAUSED->PLAYING state transition.
+ *
+@@ -585,41 +584,44 @@
+ * pipelines have the same clock.
+ *
+ * MT safe.
++ *
++ * Deprecated: This function has the wrong name and is equivalent to
++ * gst_element_set_start_time().
+ */
++#ifndef GST_REMOVE_DEPRECATED
+ void
+ gst_pipeline_set_new_stream_time (GstPipeline * pipeline, GstClockTime time)
+ {
+ g_return_if_fail (GST_IS_PIPELINE (pipeline));
+
+- GST_OBJECT_LOCK (pipeline);
+- pipeline->stream_time = time;
+- pipeline->priv->update_stream_time = TRUE;
+- GST_OBJECT_UNLOCK (pipeline);
+-
+- GST_DEBUG_OBJECT (pipeline, "set new stream_time to %" GST_TIME_FORMAT,
+- GST_TIME_ARGS (time));
++ gst_element_set_start_time (GST_ELEMENT_CAST (pipeline), time);
+
+ if (time == GST_CLOCK_TIME_NONE)
+ GST_DEBUG_OBJECT (pipeline, "told not to adjust base_time");
+ }
++#endif /* GST_REMOVE_DEPRECATED */
+
+ /**
+ * gst_pipeline_get_last_stream_time:
+ * @pipeline: a #GstPipeline
+ *
+- * Gets the last stream time of @pipeline. If the pipeline is PLAYING,
+- * the returned time is the stream time used to configure the element's
++ * Gets the last running time of @pipeline. If the pipeline is PLAYING,
++ * the returned time is the running time used to configure the element's
+ * base time in the PAUSED->PLAYING state. If the pipeline is PAUSED, the
+- * returned time is the stream time when the pipeline was paused.
++ * returned time is the running time when the pipeline was paused.
+ *
+ * This function returns #GST_CLOCK_TIME_NONE if the pipeline was
+ * configured to not handle the management of the element's base time
+ * (see gst_pipeline_set_new_stream_time()).
+ *
++ * MT safe.
++ *
+ * Returns: a #GstClockTime.
+ *
+- * MT safe.
++ * Deprecated: This function has the wrong name and is equivalent to
++ * gst_element_get_start_time().
+ */
++#ifndef GST_REMOVE_DEPRECATED
+ GstClockTime
+ gst_pipeline_get_last_stream_time (GstPipeline * pipeline)
+ {
+@@ -627,12 +629,11 @@
+
+ g_return_val_if_fail (GST_IS_PIPELINE (pipeline), GST_CLOCK_TIME_NONE);
+
+- GST_OBJECT_LOCK (pipeline);
+- result = pipeline->stream_time;
+- GST_OBJECT_UNLOCK (pipeline);
++ result = gst_element_get_start_time (GST_ELEMENT_CAST (pipeline));
+
+ return result;
+ }
++#endif /* GST_REMOVE_DEPRECATED */
+
+ static GstClock *
+ gst_pipeline_provide_clock_func (GstElement * element)
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstpipeline.h gstreamer-0.10.23/gst/gstpipeline.h
+--- gstreamer-0.10.23.orig/gst/gstpipeline.h 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/gst/gstpipeline.h 2009-06-11 14:19:59.000000000 +0200
+@@ -59,7 +59,8 @@
+ * GST_PIPELINE_FLAG_FIXED_CLOCK is set.
+ * @stream_time: The stream time of the pipeline. A better name for this
+ * property would be the running_time, the total time spent in the
+- * PLAYING state without being flushed.
++ * PLAYING state without being flushed. (deprecated, use the start_time
++ * on GstElement).
+ * @delay: Extra delay added to base_time to compensate for computing delays
+ * when setting elements to PLAYING.
+ *
+@@ -92,8 +93,10 @@
+
+ GstBus* gst_pipeline_get_bus (GstPipeline *pipeline);
+
++#ifndef GST_DISABLE_DEPRECATED
+ void gst_pipeline_set_new_stream_time (GstPipeline *pipeline, GstClockTime time);
+ GstClockTime gst_pipeline_get_last_stream_time (GstPipeline *pipeline);
++#endif
+
+ void gst_pipeline_use_clock (GstPipeline *pipeline, GstClock *clock);
+ gboolean gst_pipeline_set_clock (GstPipeline *pipeline, GstClock *clock);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstplugin.c gstreamer-0.10.23/gst/gstplugin.c
+--- gstreamer-0.10.23.orig/gst/gstplugin.c 2009-04-21 21:12:19.000000000 +0200
++++ gstreamer-0.10.23/gst/gstplugin.c 2009-06-11 14:19:59.000000000 +0200
+@@ -100,7 +100,7 @@
+ };
+
+ static GstPlugin *gst_plugin_register_func (GstPlugin * plugin,
+- const GstPluginDesc * desc);
++ const GstPluginDesc * desc, gpointer user_data);
+ static void gst_plugin_desc_copy (GstPluginDesc * dest,
+ const GstPluginDesc * src);
+ static void gst_plugin_desc_free (GstPluginDesc * desc);
+@@ -137,6 +137,10 @@
+ g_list_free (plugin->priv->deps);
+ plugin->priv->deps = NULL;
+
++ if (plugin->priv->cache_data) {
++ gst_structure_free (plugin->priv->cache_data);
++ }
++
+ G_OBJECT_CLASS (gst_plugin_parent_class)->finalize (object);
+ }
+
+@@ -242,7 +246,76 @@
+
+ GST_LOG ("attempting to load static plugin \"%s\" now...", name);
+ plugin = g_object_new (GST_TYPE_PLUGIN, NULL);
+- if (gst_plugin_register_func (plugin, &desc) != NULL) {
++ if (gst_plugin_register_func (plugin, &desc, NULL) != NULL) {
++ GST_INFO ("registered static plugin \"%s\"", name);
++ res = gst_default_registry_add_plugin (plugin);
++ GST_INFO ("added static plugin \"%s\", result: %d", name, res);
++ }
++ return res;
++}
++
++/**
++ * gst_plugin_register_static_full:
++ * @major_version: the major version number of the GStreamer core that the
++ * plugin was compiled for, you can just use GST_VERSION_MAJOR here
++ * @minor_version: the minor version number of the GStreamer core that the
++ * plugin was compiled for, you can just use GST_VERSION_MINOR here
++ * @name: a unique name of the plugin (ideally prefixed with an application- or
++ * library-specific namespace prefix in order to avoid name conflicts in
++ * case a similar plugin with the same name ever gets added to GStreamer)
++ * @description: description of the plugin
++ * @init_full_func: pointer to the init function with user data of this plugin.
++ * @version: version string of the plugin
++ * @license: effective license of plugin. Must be one of the approved licenses
++ * (see #GstPluginDesc above) or the plugin will not be registered.
++ * @source: source module plugin belongs to
++ * @package: shipped package plugin belongs to
++ * @origin: URL to provider of plugin
++ * @user_data: gpointer to user data
++ *
++ * Registers a static plugin, ie. a plugin which is private to an application
++ * or library and contained within the application or library (as opposed to
++ * being shipped as a separate module file) with a #GstPluginInitFullFunc
++ * which allows user data to be passed to the callback function (useful
++ * for bindings).
++ *
++ * You must make sure that GStreamer has been initialised (with gst_init() or
++ * via gst_init_get_option_group()) before calling this function.
++ *
++ * Returns: TRUE if the plugin was registered correctly, otherwise FALSE.
++ *
++ * Since: 0.10.24
++ *
++ */
++gboolean
++gst_plugin_register_static_full (gint major_version, gint minor_version,
++ const gchar * name, gchar * description,
++ GstPluginInitFullFunc init_full_func, const gchar * version,
++ const gchar * license, const gchar * source, const gchar * package,
++ const gchar * origin, gpointer user_data)
++{
++ GstPluginDesc desc = { major_version, minor_version, name, description,
++ (GstPluginInitFunc) init_full_func, version, license, source, package,
++ origin,
++ };
++ GstPlugin *plugin;
++ gboolean res = FALSE;
++
++ g_return_val_if_fail (name != NULL, FALSE);
++ g_return_val_if_fail (description != NULL, FALSE);
++ g_return_val_if_fail (init_full_func != NULL, FALSE);
++ g_return_val_if_fail (version != NULL, FALSE);
++ g_return_val_if_fail (license != NULL, FALSE);
++ g_return_val_if_fail (source != NULL, FALSE);
++ g_return_val_if_fail (package != NULL, FALSE);
++ g_return_val_if_fail (origin != NULL, FALSE);
++
++ /* make sure gst_init() has been called */
++ g_return_val_if_fail (_gst_plugin_inited != FALSE, FALSE);
++
++ GST_LOG ("attempting to load static plugin \"%s\" now...", name);
++ plugin = g_object_new (GST_TYPE_PLUGIN, NULL);
++ if (gst_plugin_register_func (plugin, &desc, user_data) != NULL) {
+ GST_INFO ("registered static plugin \"%s\"", name);
+ res = gst_default_registry_add_plugin (plugin);
+ GST_INFO ("added static plugin \"%s\", result: %d", name, res);
+@@ -306,7 +379,8 @@
+ }
+
+ static GstPlugin *
+-gst_plugin_register_func (GstPlugin * plugin, const GstPluginDesc * desc)
++gst_plugin_register_func (GstPlugin * plugin, const GstPluginDesc * desc,
++ gpointer user_data)
+ {
+ if (!gst_plugin_check_version (desc->major_version, desc->minor_version)) {
+ if (GST_CAT_DEFAULT)
+@@ -335,11 +409,20 @@
+
+ gst_plugin_desc_copy (&plugin->desc, desc);
+
+- if (!((desc->plugin_init) (plugin))) {
+- if (GST_CAT_DEFAULT)
+- GST_WARNING ("plugin \"%s\" failed to initialise", plugin->filename);
+- plugin->module = NULL;
+- return NULL;
++ if (user_data) {
++ if (!(((GstPluginInitFullFunc) (desc->plugin_init)) (plugin, user_data))) {
++ if (GST_CAT_DEFAULT)
++ GST_WARNING ("plugin \"%s\" failed to initialise", plugin->filename);
++ plugin->module = NULL;
++ return NULL;
++ }
++ } else {
++ if (!((desc->plugin_init) (plugin))) {
++ if (GST_CAT_DEFAULT)
++ GST_WARNING ("plugin \"%s\" failed to initialise", plugin->filename);
++ plugin->module = NULL;
++ return NULL;
++ }
+ }
+
+ if (GST_CAT_DEFAULT)
+@@ -456,6 +539,7 @@
+ gpointer ptr;
+ struct stat file_status;
+ GstRegistry *registry;
++ gboolean new_plugin = TRUE;
+
+ g_return_val_if_fail (filename != NULL, NULL);
+
+@@ -465,11 +549,12 @@
+ plugin = gst_registry_lookup (registry, filename);
+ if (plugin) {
+ if (plugin->module) {
++ /* already loaded */
+ g_static_mutex_unlock (&gst_plugin_loading_mutex);
+ return plugin;
+ } else {
+- gst_object_unref (plugin);
+- plugin = NULL;
++ /* load plugin and update fields */
++ new_plugin = FALSE;
+ }
+ }
+
+@@ -507,13 +592,14 @@
+ goto return_error;
+ }
+
+- plugin = g_object_new (GST_TYPE_PLUGIN, NULL);
+-
++ if (new_plugin) {
++ plugin = g_object_new (GST_TYPE_PLUGIN, NULL);
++ plugin->file_mtime = file_status.st_mtime;
++ plugin->file_size = file_status.st_size;
++ plugin->filename = g_strdup (filename);
++ plugin->basename = g_path_get_basename (filename);
++ }
+ plugin->module = module;
+- plugin->filename = g_strdup (filename);
+- plugin->basename = g_path_get_basename (filename);
+- plugin->file_mtime = file_status.st_mtime;
+- plugin->file_size = file_status.st_size;
+
+ ret = g_module_symbol (module, "gst_plugin_desc", &ptr);
+ if (!ret) {
+@@ -527,15 +613,20 @@
+ }
+ plugin->orig_desc = (GstPluginDesc *) ptr;
+
+- /* check plugin description: complain about bad values but accept them, to
+- * maintain backwards compatibility (FIXME: 0.11) */
+- CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, name, filename);
+- CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, description, filename);
+- CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, version, filename);
+- CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, license, filename);
+- CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, source, filename);
+- CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, package, filename);
+- CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, origin, filename);
++ if (new_plugin) {
++ /* check plugin description: complain about bad values but accept them, to
++ * maintain backwards compatibility (FIXME: 0.11) */
++ CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, name, filename);
++ CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, description, filename);
++ CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, version, filename);
++ CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, license, filename);
++ CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, source, filename);
++ CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, package, filename);
++ CHECK_PLUGIN_DESC_FIELD (plugin->orig_desc, origin, filename);
++ } else {
++ /* this is overwritten by gst_plugin_register_func() */
++ g_free (plugin->desc.description);
++ }
+
+ GST_LOG ("Plugin %p for file \"%s\" prepared, calling entry function...",
+ plugin, filename);
+@@ -547,7 +638,7 @@
+ GST_LOG ("Plugin %p for file \"%s\" prepared, registering...",
+ plugin, filename);
+
+- if (!gst_plugin_register_func (plugin, plugin->orig_desc)) {
++ if (!gst_plugin_register_func (plugin, plugin->orig_desc, NULL)) {
+ /* remove signal handler */
+ _gst_plugin_fault_handler_restore ();
+ GST_DEBUG ("gst_plugin_register_func failed for plugin \"%s\"", filename);
+@@ -566,8 +657,10 @@
+ _gst_plugin_fault_handler_filename = NULL;
+ GST_INFO ("plugin \"%s\" loaded", plugin->filename);
+
+- gst_object_ref (plugin);
+- gst_default_registry_add_plugin (plugin);
++ if (new_plugin) {
++ gst_object_ref (plugin);
++ gst_default_registry_add_plugin (plugin);
++ }
+
+ g_static_mutex_unlock (&gst_plugin_loading_mutex);
+ return plugin;
+@@ -767,6 +860,49 @@
+ return (plugin->module != NULL || plugin->filename == NULL);
+ }
+
++/**
++ * gst_plugin_get_cache_data:
++ * @plugin: a plugin
++ *
++ * Gets the plugin specific data cache. If it is %NULL there is no cached data
++ * stored. This is the case when the registry is getting rebuild.
++ *
++ * Returns: The cached data as a #GstStructure or %NULL.
++ *
++ * Since: 0.10.24
++ */
++G_CONST_RETURN GstStructure *
++gst_plugin_get_cache_data (GstPlugin * plugin)
++{
++ g_return_val_if_fail (GST_IS_PLUGIN (plugin), NULL);
++
++ return plugin->priv->cache_data;
++}
++
++/**
++ * gst_plugin_set_cache_data:
++ * @plugin: a plugin
++ * @cache_data: a structure containing the data to cache
++ *
++ * Adds plugin specific data to cache. Passes the ownership of the structure to
++ * the @plugin.
++ *
++ * The cache is flushed every time the registry is rebuild.
++ *
++ * Since: 0.10.24
++ */
++void
++gst_plugin_set_cache_data (GstPlugin * plugin, GstStructure * cache_data)
++{
++ g_return_if_fail (GST_IS_PLUGIN (plugin));
++ g_return_if_fail (GST_IS_STRUCTURE (cache_data));
++
++ if (plugin->priv->cache_data) {
++ gst_structure_free (plugin->priv->cache_data);
++ }
++ plugin->priv->cache_data = cache_data;
++}
++
+ #if 0
+ /**
+ * gst_plugin_feature_list:
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstpluginfeature.c gstreamer-0.10.23/gst/gstpluginfeature.c
+--- gstreamer-0.10.23.orig/gst/gstpluginfeature.c 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/gst/gstpluginfeature.c 2009-06-11 14:19:59.000000000 +0200
+@@ -185,7 +185,7 @@
+ } else {
+ feature->name = g_strdup (name);
+ }
+- gst_object_set_name (GST_OBJECT (feature), feature->name);
++ gst_object_set_name (GST_OBJECT_CAST (feature), feature->name);
+ }
+
+ /**
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstplugin.h gstreamer-0.10.23/gst/gstplugin.h
+--- gstreamer-0.10.23.orig/gst/gstplugin.h 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/gst/gstplugin.h 2009-06-11 14:19:59.000000000 +0200
+@@ -32,6 +32,7 @@
+ #include <gmodule.h>
+ #include <gst/gstobject.h>
+ #include <gst/gstmacros.h>
++#include <gst/gststructure.h>
+
+ G_BEGIN_DECLS
+
+@@ -110,6 +111,23 @@
+ typedef gboolean (*GstPluginInitFunc) (GstPlugin *plugin);
+
+ /**
++ * GstPluginInitFullFunc:
++ * @plugin: The plugin object that can be used to register #GstPluginFeatures for this plugin.
++ * @user_data: The user data.
++ *
++ * A plugin should provide a pointer to a function of either #GstPluginInitFunc
++ * or this type in the plugin_desc struct.
++ * The function will be called by the loader at startup. This version allows
++ * user data to be passed to init function (useful for bindings).
++ *
++ * Returns: %TRUE if plugin initialised successfully
++ *
++ * Since: 0.10.24
++ *
++ */
++typedef gboolean (*GstPluginInitFullFunc) (GstPlugin *plugin, gpointer user_data);
++
++/**
+ * GstPluginDesc:
+ * @major_version: the major version number of core that plugin was compiled for
+ * @minor_version: the minor version number of core that plugin was compiled for
+@@ -308,6 +326,18 @@
+ const gchar *package,
+ const gchar *origin);
+
++gboolean gst_plugin_register_static_full (gint major_version,
++ gint minor_version,
++ const gchar *name,
++ gchar *description,
++ GstPluginInitFullFunc init_full_func,
++ const gchar *version,
++ const gchar *license,
++ const gchar *source,
++ const gchar *package,
++ const gchar *origin,
++ gpointer user_data);
++
+ G_CONST_RETURN gchar* gst_plugin_get_name (GstPlugin *plugin);
+ G_CONST_RETURN gchar* gst_plugin_get_description (GstPlugin *plugin);
+ G_CONST_RETURN gchar* gst_plugin_get_filename (GstPlugin *plugin);
+@@ -316,6 +346,9 @@
+ G_CONST_RETURN gchar* gst_plugin_get_source (GstPlugin *plugin);
+ G_CONST_RETURN gchar* gst_plugin_get_package (GstPlugin *plugin);
+ G_CONST_RETURN gchar* gst_plugin_get_origin (GstPlugin *plugin);
++G_CONST_RETURN GstStructure* gst_plugin_get_cache_data (GstPlugin * plugin);
++void gst_plugin_set_cache_data (GstPlugin * plugin, GstStructure *cache_data);
++
+ GModule * gst_plugin_get_module (GstPlugin *plugin);
+ gboolean gst_plugin_is_loaded (GstPlugin *plugin);
+
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstpreset.c gstreamer-0.10.23/gst/gstpreset.c
+--- gstreamer-0.10.23.orig/gst/gstpreset.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gstpreset.c 2009-06-11 14:19:59.000000000 +0200
+@@ -344,10 +344,12 @@
+
+ /* compare version to check for merge */
+ if (in_system) {
+- if (!in_user || preset_parse_version (str_version_system) >
++ /* keep system presets if there is no user preset or when the system
++ * version is higher than the user version. */
++ if (!in_user) {
++ presets = in_system;
++ } else if (preset_parse_version (str_version_system) >
+ preset_parse_version (str_version_user)) {
+- /* keep system presets if there is no user preset or when the system
+- * version is higher than the user version. */
+ presets = in_system;
+ updated_from_system = TRUE;
+ }
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gst_private.h gstreamer-0.10.23/gst/gst_private.h
+--- gstreamer-0.10.23.orig/gst/gst_private.h 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/gst/gst_private.h 2009-06-11 14:19:59.000000000 +0200
+@@ -20,12 +20,13 @@
+ * Boston, MA 02111-1307, USA.
+ */
+
+-
+ #ifndef __GST_PRIVATE_H__
+ #define __GST_PRIVATE_H__
+
+ #ifdef HAVE_CONFIG_H
++# ifndef GST_LICENSE /* don't include config.h twice, it has no guards */
+ # include "config.h"
++# endif
+ #endif
+
+ /* This needs to be before glib.h, since it might be used in inline
+@@ -69,6 +70,7 @@
+
+ struct _GstPluginPrivate {
+ GList *deps; /* list of GstPluginDep structures */
++ GstStructure *cache_data;
+ };
+
+ gboolean _priv_plugin_deps_env_vars_changed (GstPlugin * plugin);
+@@ -85,6 +87,7 @@
+ * headers, so at least the symbols need to continue to be available unless
+ * we want enterprise edition packagers dancing on our heads) */
+ void _gst_buffer_initialize (void);
++void _gst_buffer_list_initialize (void);
+ void _gst_event_initialize (void);
+ void _gst_format_initialize (void);
+ void _gst_message_initialize (void);
+@@ -105,15 +108,14 @@
+
+ /* registry cache backends */
+ /* FIXME 0.11: use priv_ prefix */
+-#ifdef USE_BINARY_REGISTRY
+ gboolean gst_registry_binary_read_cache (GstRegistry * registry, const char *location);
+ gboolean gst_registry_binary_write_cache (GstRegistry * registry, const char *location);
+-/* FIXME 0.11: this is in registry.h for backwards compatibility
+-#else
+-gboolean gst_registry_xml_read_cache (GstRegistry * registry, const char *location);
+-gboolean gst_registry_xml_write_cache (GstRegistry * registry, const char *location);
+-*/
+-#endif
++
++
++/* used in gstvalue.c and gststructure.c */
++#define GST_ASCII_IS_STRING(c) (g_ascii_isalnum((c)) || ((c) == '_') || \
++ ((c) == '-') || ((c) == '+') || ((c) == '/') || ((c) == ':') || \
++ ((c) == '.'))
+
+ /*** debugging categories *****************************************************/
+
+@@ -126,6 +128,7 @@
+ GST_EXPORT GstDebugCategory *GST_CAT_STATES;
+ GST_EXPORT GstDebugCategory *GST_CAT_SCHEDULING;
+ GST_EXPORT GstDebugCategory *GST_CAT_BUFFER;
++GST_EXPORT GstDebugCategory *GST_CAT_BUFFER_LIST;
+ GST_EXPORT GstDebugCategory *GST_CAT_BUS;
+ GST_EXPORT GstDebugCategory *GST_CAT_CAPS;
+ GST_EXPORT GstDebugCategory *GST_CAT_CLOCK;
+@@ -159,6 +162,7 @@
+ #define GST_CAT_SCHEDULING NULL
+ #define GST_CAT_DATAFLOW NULL
+ #define GST_CAT_BUFFER NULL
++#define GST_CAT_BUFFER_LIST NULL
+ #define GST_CAT_BUS NULL
+ #define GST_CAT_CAPS NULL
+ #define GST_CAT_CLOCK NULL
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstquark.c gstreamer-0.10.23/gst/gstquark.c
+--- gstreamer-0.10.23.orig/gst/gstquark.c 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/gst/gstquark.c 2009-06-11 14:19:59.000000000 +0200
+@@ -37,7 +37,17 @@
+ "max-latency", "busy", "type", "owner", "update", "applied-rate",
+ "start", "stop", "minsize", "maxsize", "async", "proportion",
+ "diff", "timestamp", "flags", "cur-type", "cur", "stop-type",
+- "latency", "uri"
++ "latency", "uri", "object", "taglist", "GstEventNewsegment",
++ "GstEventBufferSize", "GstEventQOS", "GstEventSeek", "GstEventLatency",
++ "GstMessageError", "GstMessageWarning", "GstMessageInfo",
++ "GstMessageBuffering", "GstMessageState", "GstMessageClockProvide",
++ "GstMessageClockLost", "GstMessageNewClock", "GstMessageStructureChange",
++ "GstMessageSegmentStart", "GstMessageSegmentDone", "GstMessageDuration",
++ "GstMessageAsyncStart", "GstMessageRequestState", "GstMessageStreamStatus",
++ "GstQueryPosition", "GstQueryDuration", "GstQueryLatency", "GstQueryConvert",
++ "GstQuerySegment", "GstQuerySeeking", "GstQueryFormats", "GstQueryBuffering",
++ "GstQueryURI", "GstEventStep", "GstMessageStepDone", "amount", "flush",
++ "intermediate"
+ };
+
+ GQuark _priv_gst_quark_table[GST_QUARK_MAX];
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstquark.h gstreamer-0.10.23/gst/gstquark.h
+--- gstreamer-0.10.23.orig/gst/gstquark.h 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/gst/gstquark.h 2009-06-11 14:19:59.000000000 +0200
+@@ -78,8 +78,44 @@
+ GST_QUARK_STOP_TYPE = 49,
+ GST_QUARK_LATENCY = 50,
+ GST_QUARK_URI = 51,
++ GST_QUARK_OBJECT = 52,
++ GST_QUARK_TAGLIST = 53,
++ GST_QUARK_EVENT_NEWSEGMENT = 54,
++ GST_QUARK_EVENT_BUFFER_SIZE = 55,
++ GST_QUARK_EVENT_QOS = 56,
++ GST_QUARK_EVENT_SEEK = 57,
++ GST_QUARK_EVENT_LATENCY = 58,
++ GST_QUARK_MESSAGE_ERROR = 59,
++ GST_QUARK_MESSAGE_WARNING = 60,
++ GST_QUARK_MESSAGE_INFO = 61,
++ GST_QUARK_MESSAGE_BUFFERING = 62,
++ GST_QUARK_MESSAGE_STATE = 63,
++ GST_QUARK_MESSAGE_CLOCK_PROVIDE = 64,
++ GST_QUARK_MESSAGE_CLOCK_LOST = 65,
++ GST_QUARK_MESSAGE_NEW_CLOCK = 66,
++ GST_QUARK_MESSAGE_STRUCTURE_CHANGE = 67,
++ GST_QUARK_MESSAGE_SEGMENT_START = 68,
++ GST_QUARK_MESSAGE_SEGMENT_DONE = 69,
++ GST_QUARK_MESSAGE_DURATION = 70,
++ GST_QUARK_MESSAGE_ASYNC_START = 71,
++ GST_QUARK_MESSAGE_REQUEST_STATE = 72,
++ GST_QUARK_MESSAGE_STREAM_STATUS = 73,
++ GST_QUARK_QUERY_POSITION = 74,
++ GST_QUARK_QUERY_DURATION = 75,
++ GST_QUARK_QUERY_LATENCY = 76,
++ GST_QUARK_QUERY_CONVERT = 77,
++ GST_QUARK_QUERY_SEGMENT = 78,
++ GST_QUARK_QUERY_SEEKING = 79,
++ GST_QUARK_QUERY_FORMATS = 80,
++ GST_QUARK_QUERY_BUFFERING = 81,
++ GST_QUARK_QUERY_URI = 82,
++ GST_QUARK_EVENT_STEP = 83,
++ GST_QUARK_MESSAGE_STEP_DONE = 84,
++ GST_QUARK_AMOUNT = 85,
++ GST_QUARK_FLUSH = 86,
++ GST_QUARK_INTERMEDIATE = 87,
+
+- GST_QUARK_MAX = 52
++ GST_QUARK_MAX = 88
+ } GstQuarkId;
+
+ extern GQuark _priv_gst_quark_table[GST_QUARK_MAX];
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstquery.c gstreamer-0.10.23/gst/gstquery.c
+--- gstreamer-0.10.23.orig/gst/gstquery.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gstquery.c 2009-06-11 14:19:59.000000000 +0200
+@@ -387,8 +387,7 @@
+ GstQuery *query;
+ GstStructure *structure;
+
+- structure = gst_structure_empty_new ("GstQueryPosition");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (QUERY_POSITION),
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (CURRENT), G_TYPE_INT64, G_GINT64_CONSTANT (-1), NULL);
+
+@@ -460,8 +459,7 @@
+ GstQuery *query;
+ GstStructure *structure;
+
+- structure = gst_structure_empty_new ("GstQueryDuration");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (QUERY_DURATION),
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (DURATION), G_TYPE_INT64, G_GINT64_CONSTANT (-1), NULL);
+
+@@ -535,8 +533,7 @@
+ GstQuery *query;
+ GstStructure *structure;
+
+- structure = gst_structure_empty_new ("GstQueryLatency");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (QUERY_LATENCY),
+ GST_QUARK (LIVE), G_TYPE_BOOLEAN, FALSE,
+ GST_QUARK (MIN_LATENCY), G_TYPE_UINT64, G_GUINT64_CONSTANT (0),
+ GST_QUARK (MAX_LATENCY), G_TYPE_UINT64, G_GUINT64_CONSTANT (-1), NULL);
+@@ -623,8 +620,7 @@
+ GstQuery *query;
+ GstStructure *structure;
+
+- structure = gst_structure_empty_new ("GstQueryConvert");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (QUERY_CONVERT),
+ GST_QUARK (SRC_FORMAT), GST_TYPE_FORMAT, src_format,
+ GST_QUARK (SRC_VALUE), G_TYPE_INT64, value,
+ GST_QUARK (DEST_FORMAT), GST_TYPE_FORMAT, dest_format,
+@@ -711,8 +707,7 @@
+ GstQuery *query;
+ GstStructure *structure;
+
+- structure = gst_structure_empty_new ("GstQuerySegment");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (QUERY_SEGMENT),
+ GST_QUARK (RATE), G_TYPE_DOUBLE, (gdouble) 0.0,
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (START_VALUE), G_TYPE_INT64, G_GINT64_CONSTANT (-1),
+@@ -832,7 +827,7 @@
+ }
+
+ /**
+- * gst_query_new_seeking (GstFormat *format)
++ * gst_query_new_seeking:
+ * @format: the default #GstFormat for the new query
+ *
+ * Constructs a new query object for querying seeking properties of
+@@ -846,8 +841,7 @@
+ GstQuery *query;
+ GstStructure *structure;
+
+- structure = gst_structure_empty_new ("GstQuerySeeking");
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (QUERY_SEEKING),
+ GST_QUARK (FORMAT), GST_TYPE_FORMAT, format,
+ GST_QUARK (SEEKABLE), G_TYPE_BOOLEAN, FALSE,
+ GST_QUARK (SEGMENT_START), G_TYPE_INT64, G_GINT64_CONSTANT (-1),
+@@ -935,7 +929,7 @@
+ GstQuery *query;
+ GstStructure *structure;
+
+- structure = gst_structure_new ("GstQueryFormats", NULL);
++ structure = gst_structure_id_empty_new (GST_QUARK (QUERY_FORMATS));
+ query = gst_query_new (GST_QUERY_FORMATS, structure);
+
+ return query;
+@@ -1096,10 +1090,9 @@
+ GstQuery *query;
+ GstStructure *structure;
+
+- structure = gst_structure_empty_new ("GstQueryBuffering");
+ /* by default, we configure the answer as no buffering with a 100% buffering
+ * progress */
+- gst_structure_id_set (structure,
++ structure = gst_structure_id_new (GST_QUARK (QUERY_BUFFERING),
+ GST_QUARK (BUSY), G_TYPE_BOOLEAN, FALSE,
+ GST_QUARK (BUFFER_PERCENT), G_TYPE_INT, 100,
+ GST_QUARK (BUFFERING_MODE), GST_TYPE_BUFFERING_MODE, GST_BUFFERING_STREAM,
+@@ -1306,8 +1299,8 @@
+ GstQuery *query;
+ GstStructure *structure;
+
+- structure = gst_structure_empty_new ("GstQueryURI");
+- gst_structure_id_set (structure, GST_QUARK (URI), G_TYPE_STRING, NULL, NULL);
++ structure = gst_structure_id_new (GST_QUARK (QUERY_URI),
++ GST_QUARK (URI), G_TYPE_STRING, NULL, NULL);
+
+ query = gst_query_new (GST_QUERY_URI, structure);
+
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstregistrybinary.c gstreamer-0.10.23/gst/gstregistrybinary.c
+--- gstreamer-0.10.23.orig/gst/gstregistrybinary.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gstregistrybinary.c 2009-06-11 14:19:59.000000000 +0200
+@@ -674,6 +674,14 @@
+
+ gst_plugin_feature_list_free (plugin_features);
+
++ /* pack cache data */
++ if (plugin->priv->cache_data) {
++ gchar *cache_str = gst_structure_to_string (plugin->priv->cache_data);
++ gst_registry_binary_save_string (list, cache_str);
++ } else {
++ gst_registry_binary_save_const_string (list, "");
++ }
++
+ /* pack plugin element strings */
+ gst_registry_binary_save_const_string (list, plugin->desc.origin);
+ gst_registry_binary_save_const_string (list, plugin->desc.package);
+@@ -766,10 +774,6 @@
+
+ if (!gst_registry_binary_write_chunk (registry, cache, cur->data, cur->size,
+ &file_position, cur->align)) {
+- if (!(cur->flags & GST_BINARY_REGISTRY_FLAG_CONST))
+- g_free (cur->data);
+- g_free (cur);
+- walk->data = NULL;
+ goto fail_free_list;
+ }
+ if (!(cur->flags & GST_BINARY_REGISTRY_FLAG_CONST))
+@@ -938,7 +942,7 @@
+
+ if (GST_IS_ELEMENT_FACTORY (feature)) {
+ GstBinaryElementFactory *ef;
+- GstElementFactory *factory = GST_ELEMENT_FACTORY (feature);
++ GstElementFactory *factory = GST_ELEMENT_FACTORY_CAST (feature);
+
+ align (*in);
+ GST_LOG ("Reading/casting for GstBinaryElementFactory at address %p", *in);
+@@ -1115,6 +1119,7 @@
+ {
+ GstBinaryPluginElement *pe;
+ GstPlugin *plugin = NULL;
++ gchar *cache_str = NULL;
+ guint i;
+
+ align (*in);
+@@ -1146,6 +1151,13 @@
+ GST_LOG (" desc.package='%s'", plugin->desc.package);
+ GST_LOG (" desc.origin='%s'", plugin->desc.origin);
+
++ /* unpack cache data */
++ unpack_string (*in, cache_str, end, fail);
++ if (*cache_str) {
++ plugin->priv->cache_data = gst_structure_from_string (cache_str, NULL);
++ }
++ g_free (cache_str);
++
+ plugin->basename = g_path_get_basename (plugin->filename);
+
+ /* Takes ownership of plugin */
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstregistrybinary.h gstreamer-0.10.23/gst/gstregistrybinary.h
+--- gstreamer-0.10.23.orig/gst/gstregistrybinary.h 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/gst/gstregistrybinary.h 2009-06-11 14:19:59.000000000 +0200
+@@ -33,10 +33,6 @@
+ #include <gst/gstpad.h>
+ #include <gst/gstregistry.h>
+
+-#ifdef HAVE_CONFIG_H
+-#include "config.h"
+-#endif
+-
+ /*
+ * GST_MAGIC_BINARY_REGISTRY_STR:
+ *
+@@ -57,7 +53,7 @@
+ * This _must_ be updated whenever the registry format changes,
+ * we currently use the core version where this change happened.
+ */
+-#define GST_MAGIC_BINARY_VERSION_STR ("0.10.21.2")
++#define GST_MAGIC_BINARY_VERSION_STR ("0.10.23.1")
+
+ /*
+ * GST_MAGIC_BINARY_VERSION_LEN:
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstregistry.c gstreamer-0.10.23/gst/gstregistry.c
+--- gstreamer-0.10.23.orig/gst/gstregistry.c 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/gst/gstregistry.c 2009-06-11 14:19:59.000000000 +0200
+@@ -241,8 +241,7 @@
+ g_static_mutex_lock (&_gst_registry_mutex);
+ if (G_UNLIKELY (!_gst_registry_default)) {
+ _gst_registry_default = g_object_new (GST_TYPE_REGISTRY, NULL);
+- gst_object_ref (GST_OBJECT_CAST (_gst_registry_default));
+- gst_object_sink (GST_OBJECT_CAST (_gst_registry_default));
++ gst_object_ref_sink (GST_OBJECT_CAST (_gst_registry_default));
+ }
+ registry = _gst_registry_default;
+ g_static_mutex_unlock (&_gst_registry_mutex);
+@@ -353,14 +352,12 @@
+
+ registry->plugins = g_list_prepend (registry->plugins, plugin);
+
+- gst_object_ref (plugin);
+- gst_object_sink (plugin);
++ gst_object_ref_sink (plugin);
+ GST_OBJECT_UNLOCK (registry);
+
+ GST_LOG_OBJECT (registry, "emitting plugin-added for filename \"%s\"",
+ GST_STR_NULL (plugin->filename));
+- g_signal_emit (G_OBJECT (registry), gst_registry_signals[PLUGIN_ADDED], 0,
+- plugin);
++ g_signal_emit (registry, gst_registry_signals[PLUGIN_ADDED], 0, plugin);
+
+ return TRUE;
+ }
+@@ -370,20 +367,22 @@
+ GstPlugin * plugin)
+ {
+ GList *f;
++ const gchar *name;
+
+ g_return_if_fail (GST_IS_REGISTRY (registry));
+ g_return_if_fail (GST_IS_PLUGIN (plugin));
+
++ name = gst_plugin_get_name (plugin);
++
+ /* Remove all features for this plugin */
+ f = registry->features;
+ while (f != NULL) {
+ GList *next = g_list_next (f);
+ GstPluginFeature *feature = f->data;
+
+- if (feature && !strcmp (feature->plugin_name, gst_plugin_get_name (plugin))) {
++ if (feature && !strcmp (feature->plugin_name, name)) {
+ GST_DEBUG_OBJECT (registry, "removing feature %p (%s) for plugin %s",
+- feature, gst_plugin_feature_get_name (feature),
+- gst_plugin_get_name (plugin));
++ feature, gst_plugin_feature_get_name (feature), name);
+
+ registry->features = g_list_delete_link (registry->features, f);
+ g_hash_table_remove (registry->feature_hash, feature->name);
+@@ -447,7 +446,8 @@
+ GST_DEBUG_OBJECT (registry, "replacing existing feature %p (%s)",
+ existing_feature, feature->name);
+ /* Remove the existing feature from the list now, before we insert the new
+- * one, but don't unref yet because the hash is still storing a reference to * it. */
++ * one, but don't unref yet because the hash is still storing a reference to
++ * it. */
+ registry->features = g_list_remove (registry->features, existing_feature);
+ }
+
+@@ -457,17 +457,16 @@
+ g_hash_table_replace (registry->feature_hash, feature->name, feature);
+
+ if (G_UNLIKELY (existing_feature)) {
+- /* We unref now. No need to remove the feature name from the hash table, it * got replaced by the new feature */
++ /* We unref now. No need to remove the feature name from the hash table, it
++ * got replaced by the new feature */
+ gst_object_unref (existing_feature);
+ }
+
+- gst_object_ref (feature);
+- gst_object_sink (feature);
++ gst_object_ref_sink (feature);
+ GST_OBJECT_UNLOCK (registry);
+
+ GST_LOG_OBJECT (registry, "emitting feature-added for %s", feature->name);
+- g_signal_emit (G_OBJECT (registry), gst_registry_signals[FEATURE_ADDED], 0,
+- feature);
++ g_signal_emit (registry, gst_registry_signals[FEATURE_ADDED], 0, feature);
+
+ return TRUE;
+ }
+@@ -934,12 +933,11 @@
+
+ /**
+ * gst_registry_scan_path:
+- * @registry: the registry to add the path to
+- * @path: the path to add to the registry
++ * @registry: the registry to add found plugins to
++ * @path: the path to scan
+ *
+- * Add the given path to the registry. The syntax of the
+- * path is specific to the registry. If the path has already been
+- * added, do nothing.
++ * Scan the given path for plugins to add to the registry. The syntax of the
++ * path is specific to the registry.
+ *
+ * Returns: %TRUE if registry changed
+ */
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstsegment.c gstreamer-0.10.23/gst/gstsegment.c
+--- gstreamer-0.10.23.orig/gst/gstsegment.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gstsegment.c 2009-06-11 14:19:59.000000000 +0200
+@@ -20,6 +20,8 @@
+ */
+
+
++#include <math.h>
++
+ #include "gst_private.h"
+
+ #include "gstutils.h"
+@@ -465,7 +467,7 @@
+ g_return_if_fail (segment->format == format);
+
+ if (update) {
+- if (segment->rate > 0.0) {
++ if (G_LIKELY (segment->rate > 0.0)) {
+ /* an update to the current segment is done, elapsed time is
+ * difference between the old start and new start. */
+ if (start > segment->start)
+@@ -511,7 +513,7 @@
+ last_stop = stop;
+ }
+ /* use previous rate to calculate duration */
+- if (segment->abs_rate != 1.0)
++ if (G_LIKELY (segment->abs_rate != 1.0))
+ duration /= segment->abs_rate;
+
+ /* accumulate duration */
+@@ -565,7 +567,7 @@
+
+ /* if we have the position for the same format as the segment, we can compare
+ * the start and stop values, otherwise we assume 0 and -1 */
+- if (segment->format == format) {
++ if (G_LIKELY (segment->format == format)) {
+ start = segment->start;
+ stop = segment->stop;
+ time = segment->time;
+@@ -593,18 +595,18 @@
+ abs_applied_rate = ABS (segment->applied_rate);
+
+ /* correct for applied rate if needed */
+- if (abs_applied_rate != 1.0)
++ if (G_UNLIKELY (abs_applied_rate != 1.0))
+ result *= abs_applied_rate;
+
+ /* add or subtract from segment time based on applied rate */
+- if (segment->applied_rate > 0.0) {
++ if (G_LIKELY (segment->applied_rate > 0.0)) {
+ /* correct for segment time */
+ result += time;
+ } else {
+ /* correct for segment time, clamp at 0. Streams with a negative
+ * applied_rate have timestamps between start and stop, as usual, but have
+ * the time member starting high and going backwards. */
+- if (time > result)
++ if (G_LIKELY (time > result))
+ result = time - result;
+ else
+ result = 0;
+@@ -650,7 +652,7 @@
+
+ /* if we have the position for the same format as the segment, we can compare
+ * the start and stop values, otherwise we assume 0 and -1 */
+- if (segment->format == format) {
++ if (G_LIKELY (segment->format == format)) {
+ start = segment->start;
+ stop = segment->stop;
+ accum = segment->accum;
+@@ -664,7 +666,7 @@
+ if (G_UNLIKELY (position < start))
+ return -1;
+
+- if (segment->rate > 0.0) {
++ if (G_LIKELY (segment->rate > 0.0)) {
+ /* outside of the segment boundary stop */
+ if (G_UNLIKELY (stop != -1 && position > stop))
+ return -1;
+@@ -683,7 +685,7 @@
+
+ /* scale based on the rate, avoid division by and conversion to
+ * float when not needed */
+- if (segment->abs_rate != 1.0)
++ if (G_UNLIKELY (segment->abs_rate != 1.0))
+ result /= segment->abs_rate;
+
+ /* correct for accumulated segments */
+@@ -761,3 +763,129 @@
+
+ return TRUE;
+ }
++
++/**
++ * gst_segment_to_position:
++ * @segment: a #GstSegment structure.
++ * @format: the format of the segment.
++ * @running_time: the running_time in the segment
++ *
++ * Convert @running_time into a position in the segment so that
++ * gst_segment_to_running_time() with that position returns @running_time.
++ *
++ * Returns: the position in the segment for @running_time. This function returns
++ * -1 when @running_time is -1 or when it is not inside @segment.
++ *
++ * Since: 0.10.24
++ */
++gint64
++gst_segment_to_position (GstSegment * segment, GstFormat format,
++ gint64 running_time)
++{
++ gint64 result;
++ gint64 start, stop, accum;
++
++ g_return_val_if_fail (segment != NULL, -1);
++
++ if (G_UNLIKELY (running_time == -1))
++ return -1;
++
++ if (G_UNLIKELY (segment->format == GST_FORMAT_UNDEFINED))
++ segment->format = format;
++
++ /* if we have the position for the same format as the segment, we can compare
++ * the start and stop values, otherwise we assume 0 and -1 */
++ if (G_LIKELY (segment->format == format)) {
++ start = segment->start;
++ stop = segment->stop;
++ accum = segment->accum;
++ } else {
++ start = 0;
++ stop = -1;
++ accum = 0;
++ }
++
++ /* this running_time was for a previous segment */
++ if (running_time < accum)
++ return -1;
++
++ /* start by subtracting the accumulated time */
++ result = running_time - accum;
++
++ /* move into the segment at the right rate */
++ if (G_UNLIKELY (segment->abs_rate != 1.0))
++ result = ceil (result * segment->abs_rate);
++
++ if (G_LIKELY (segment->rate > 0.0)) {
++ /* bring to corrected position in segment */
++ result += start;
++
++ /* outside of the segment boundary stop */
++ if (G_UNLIKELY (stop != -1 && result > stop))
++ return -1;
++ } else {
++ /* cannot continue if no stop position set or outside of
++ * the segment. */
++ if (G_UNLIKELY (stop == -1 || result + start > stop))
++ return -1;
++
++ /* bring to corrected position in segment */
++ result = stop - result;
++ }
++ return result;
++}
++
++
++/**
++ * gst_segment_set_running_time:
++ * @segment: a #GstSegment structure.
++ * @format: the format of the segment.
++ * @running_time: the running_time in the segment
++ *
++ * Adjust the start/stop and accum values of @segment such that the next valid
++ * buffer will be one with @running_time.
++ *
++ * Returns: %TRUE if the segment could be updated successfully. If %FALSE is
++ * returned, @running_time is -1 or not in @segment.
++ *
++ * Since: 0.10.24
++ */
++gboolean
++gst_segment_set_running_time (GstSegment * segment, GstFormat format,
++ gint64 running_time)
++{
++ gint64 position;
++ gint64 start, stop, last_stop;
++
++ /* start by bringing the running_time into the segment position */
++ position = gst_segment_to_position (segment, format, running_time);
++
++ /* we must have a valid position now */
++ if (G_UNLIKELY (position == -1))
++ return FALSE;
++
++ start = segment->start;
++ stop = segment->stop;
++ last_stop = segment->last_stop;
++
++ if (G_LIKELY (segment->rate > 0.0)) {
++ /* update the start/last_stop and time values */
++ start = position;
++ if (last_stop < start)
++ last_stop = start;
++ } else {
++ /* reverse, update stop */
++ stop = position;
++ /* if we were past the position, go back */
++ if (last_stop > stop)
++ last_stop = stop;
++ }
++ /* and accumulated time is exactly the running time */
++ segment->time = gst_segment_to_stream_time (segment, format, start);
++ segment->start = start;
++ segment->stop = stop;
++ segment->last_stop = last_stop;
++ segment->accum = running_time;
++
++ return TRUE;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstsegment.h gstreamer-0.10.23/gst/gstsegment.h
+--- gstreamer-0.10.23.orig/gst/gstsegment.h 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/gst/gstsegment.h 2009-06-11 14:19:59.000000000 +0200
+@@ -96,10 +96,14 @@
+
+ gint64 gst_segment_to_stream_time (GstSegment *segment, GstFormat format, gint64 position);
+ gint64 gst_segment_to_running_time (GstSegment *segment, GstFormat format, gint64 position);
++gint64 gst_segment_to_position (GstSegment *segment, GstFormat format, gint64 running_time);
+
+ gboolean gst_segment_clip (GstSegment *segment, GstFormat format, gint64 start,
+ gint64 stop, gint64 *clip_start, gint64 *clip_stop);
+
++gboolean gst_segment_set_running_time (GstSegment *segment, GstFormat format, gint64 running_time);
++
++
+ G_END_DECLS
+
+ #endif /* __GST_SEGMENT_H__ */
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gststructure.c gstreamer-0.10.23/gst/gststructure.c
+--- gstreamer-0.10.23.orig/gst/gststructure.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gststructure.c 2009-06-11 14:19:59.000000000 +0200
+@@ -49,7 +49,10 @@
+ * Fields can be removed with gst_structure_remove_field() or
+ * gst_structure_remove_fields().
+ *
+- * Last reviewed on 2007-10-16 (0.10.15)
++ * Strings in structures must be ASCII or UTF-8 encoded. Other encodings are
++ * not allowed. Strings must not be empty either, but may be NULL.
++ *
++ * Last reviewed on 2009-06-08 (0.10.23)
+ */
+
+ #ifdef HAVE_CONFIG_H
+@@ -59,6 +62,7 @@
+ #include <string.h>
+
+ #include "gst_private.h"
++#include "gstquark.h"
+ #include <gst/gst.h>
+ #include <gobject/gvaluecollector.h>
+
+@@ -77,6 +81,9 @@
+ (!(structure)->parent_refcount || \
+ g_atomic_int_get ((structure)->parent_refcount) == 1)
+
++#define IS_TAGLIST(structure) \
++ (structure->name == GST_QUARK (TAGLIST))
++
+ static void gst_structure_set_field (GstStructure * structure,
+ GstStructureField * field);
+ static GstStructureField *gst_structure_get_field (const GstStructure *
+@@ -432,17 +439,6 @@
+ g_return_if_fail (G_IS_VALUE (value));
+ g_return_if_fail (IS_MUTABLE (structure));
+
+- if (G_VALUE_HOLDS_STRING (value)) {
+- const gchar *s;
+-
+- s = g_value_get_string (value);
+- if (G_UNLIKELY (s != NULL && !g_utf8_validate (s, -1, NULL))) {
+- g_warning ("Trying to set string field '%s' on structure, but string is "
+- "not valid UTF-8. Please file a bug.", g_quark_to_string (field));
+- return;
+- }
+- }
+-
+ gsfield.name = field;
+ gst_value_init_and_copy (&gsfield.value, value);
+
+@@ -608,6 +604,41 @@
+ }
+ }
+
++/**
++ * gst_structure_id_new:
++ * @name_quark: name of new structure
++ * @field_quark: the GQuark for the name of the field to set
++ * @...: variable arguments
++ *
++ * Creates a new #GstStructure with the given name as a GQuark, followed by
++ * fieldname quark, GType, argument(s) "triplets" in the same format as
++ * gst_structure_id_set(). Basically a convenience wrapper around
++ * gst_structure_id_empty_new() and gst_structure_id_set().
++ *
++ * The last variable argument must be NULL (or 0).
++ *
++ * Returns: a new #GstStructure
++ *
++ * Since: 0.10.24
++ */
++GstStructure *
++gst_structure_id_new (GQuark name_quark, GQuark field_quark, ...)
++{
++ GstStructure *s;
++ va_list varargs;
++
++ g_return_val_if_fail (name_quark != 0, NULL);
++ g_return_val_if_fail (field_quark != 0, NULL);
++
++ s = gst_structure_id_empty_new (name_quark);
++
++ va_start (varargs, field_quark);
++ gst_structure_id_set_valist (s, field_quark, varargs);
++ va_end (varargs);
++
++ return s;
++}
++
+ /* If the structure currently contains a field with the same name, it is
+ * replaced with the provided field. Otherwise, the field is added to the
+ * structure. The field's value is not deeply copied.
+@@ -618,6 +649,34 @@
+ GstStructureField *f;
+ guint i;
+
++ if (G_UNLIKELY (G_VALUE_HOLDS_STRING (&field->value))) {
++ const gchar *s;
++
++ s = g_value_get_string (&field->value);
++ /* only check for NULL strings in taglists, as they are allowed in message
++ * structs, e.g. error message debug strings */
++ if (G_UNLIKELY (s == NULL && IS_TAGLIST (structure))) {
++ g_warning ("Trying to set NULL string on field '%s' on taglist. "
++ "Please file a bug.", g_quark_to_string (field->name));
++ g_value_unset (&field->value);
++ return;
++ } else if (G_UNLIKELY (s != NULL && *s == '\0')) {
++ /* empty strings never make sense */
++ g_warning ("Trying to set empty string on %s field '%s'. Please file a "
++ "bug.", IS_TAGLIST (structure) ? "taglist" : "structure",
++ g_quark_to_string (field->name));
++ g_value_unset (&field->value);
++ return;
++ } else if (G_UNLIKELY (s != NULL && !g_utf8_validate (s, -1, NULL))) {
++ g_warning ("Trying to set string on %s field '%s', but string is not "
++ "valid UTF-8. Please file a bug.",
++ IS_TAGLIST (structure) ? "taglist" : "structure",
++ g_quark_to_string (field->name));
++ g_value_unset (&field->value);
++ return;
++ }
++ }
++
+ for (i = 0; i < structure->fields->len; i++) {
+ f = GST_STRUCTURE_FIELD (structure, i);
+
+@@ -1164,6 +1223,11 @@
+ * given field. Caller is responsible for making sure the field exists
+ * and has the correct type.
+ *
++ * On success @value will point to a newly-allocated copy of the date which
++ * should be freed with g_date_free() when no longer needed (note: this is
++ * inconsistent with e.g. gst_structure_get_string() which doesn't return a
++ * copy of the string).
++ *
+ * Returns: TRUE if the value could be set correctly. If there was no field
+ * with @fieldname or the existing field did not contain a data, this function
+ * returns FALSE.
+@@ -1185,6 +1249,7 @@
+ if (!GST_VALUE_HOLDS_DATE (&field->value))
+ return FALSE;
+
++ /* FIXME: 0.11 g_value_dup_boxed() -> g_value_get_boxed() */
+ *value = g_value_dup_boxed (&field->value);
+
+ return TRUE;
+@@ -1504,11 +1569,6 @@
+ return G_VALUE_TYPE (val);
+ }
+
+-/* keep in sync with gstvalue.c */
+-#define GST_ASCII_IS_STRING(c) (g_ascii_isalnum((c)) || ((c) == '_') || \
+- ((c) == '-') || ((c) == '+') || ((c) == '/') || ((c) == ':') || \
+- ((c) == '.'))
+-
+ gboolean
+ priv_gst_structure_append_to_gstring (const GstStructure * structure,
+ GString * s)
+@@ -1797,7 +1857,7 @@
+ s++;
+
+ c = *name_end;
+- *name_end = 0;
++ *name_end = '\0';
+ field->name = g_quark_from_string (name);
+ *name_end = c;
+
+@@ -1821,7 +1881,6 @@
+ int ret = 0;
+ GType type = default_type;
+
+-
+ s = str;
+ while (g_ascii_isspace (*s))
+ s++;
+@@ -1849,7 +1908,7 @@
+ type = gst_structure_gtype_from_abbr (type_name);
+ *type_end = c;
+
+- if (type == G_TYPE_INVALID)
++ if (G_UNLIKELY (type == G_TYPE_INVALID))
+ return FALSE;
+ }
+
+@@ -1863,12 +1922,12 @@
+ ret = gst_structure_parse_array (s, &s, value, type);
+ } else {
+ value_s = s;
+- if (!gst_structure_parse_string (s, &value_end, &s))
++ if (G_UNLIKELY (!gst_structure_parse_string (s, &value_end, &s)))
+ return FALSE;
+
+ c = *value_end;
+- *value_end = 0;
+- if (type == G_TYPE_INVALID) {
++ *value_end = '\0';
++ if (G_UNLIKELY (type == G_TYPE_INVALID)) {
+ GType try_types[] =
+ { G_TYPE_INT, G_TYPE_DOUBLE, GST_TYPE_FRACTION, G_TYPE_BOOLEAN,
+ G_TYPE_STRING
+@@ -1886,6 +1945,8 @@
+ g_value_init (value, type);
+
+ ret = gst_value_deserialize (value, value_s);
++ if (G_UNLIKELY (!ret))
++ g_value_unset (value);
+ }
+ *value_end = c;
+ }
+@@ -1916,7 +1977,7 @@
+ char *r;
+ char save;
+ GstStructure *structure = NULL;
+- GstStructureField field = { 0 };
++ GstStructureField field;
+
+ g_return_val_if_fail (string != NULL, NULL);
+
+@@ -1935,11 +1996,11 @@
+ }
+
+ save = *w;
+- *w = 0;
++ *w = '\0';
+ structure = gst_structure_empty_new (name);
+ *w = save;
+
+- if (structure == NULL)
++ if (G_UNLIKELY (structure == NULL))
+ goto error;
+
+ do {
+@@ -1968,7 +2029,6 @@
+ if (!gst_structure_parse_field (r, &r, &field))
+ goto error;
+ gst_structure_set_field (structure, &field);
+-
+ } while (TRUE);
+
+ if (end)
+@@ -2282,3 +2342,250 @@
+
+ return FALSE;
+ }
++
++/* our very own version of G_VALUE_LCOPY that allows NULL return locations
++ * (useful for message parsing functions where the return location is user
++ * supplied and the user may pass NULL if the value isn't of interest) */
++#define GST_VALUE_LCOPY(value, var_args, flags, __error, fieldname) \
++G_STMT_START { \
++ const GValue *_value = (value); \
++ guint _flags = (flags); \
++ GType _value_type = G_VALUE_TYPE (_value); \
++ GTypeValueTable *_vtable = g_type_value_table_peek (_value_type); \
++ gchar *_lcopy_format = _vtable->lcopy_format; \
++ GTypeCValue _cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, }; \
++ guint _n_values = 0; \
++ \
++ while (*_lcopy_format != '\0') { \
++ g_assert (*_lcopy_format == G_VALUE_COLLECT_POINTER); \
++ _cvalues[_n_values++].v_pointer = va_arg ((var_args), gpointer); \
++ _lcopy_format++; \
++ } \
++ if (_n_values == 2 && !!_cvalues[0].v_pointer != !!_cvalues[1].v_pointer) { \
++ *(__error) = g_strdup_printf ("either all or none of the return " \
++ "locations for field '%s' need to be NULL", fieldname); \
++ } else if (_cvalues[0].v_pointer != NULL) { \
++ *(__error) = _vtable->lcopy_value (_value, _n_values, _cvalues, _flags); \
++ } \
++} G_STMT_END
++
++/**
++ * gst_structure_get_valist:
++ * @structure: a #GstStructure
++ * @first_fieldname: the name of the first field to read
++ * @valist: variable arguments
++ *
++ * Parses the variable arguments and reads fields from @structure accordingly.
++ * valist-variant of gst_structure_get(). Look at the documentation of
++ * gst_structure_get() for more details.
++ *
++ * Returns: TRUE, or FALSE if there was a problem reading any of the fields
++ *
++ * Since: 0.10.24
++ */
++gboolean
++gst_structure_get_valist (GstStructure * structure,
++ const char *first_fieldname, va_list args)
++{
++ const char *field_name;
++ GType expected_type = G_TYPE_INVALID;
++
++ g_return_val_if_fail (GST_IS_STRUCTURE (structure), FALSE);
++ g_return_val_if_fail (first_fieldname != NULL, FALSE);
++
++ field_name = first_fieldname;
++ while (field_name) {
++ const GValue *val = NULL;
++ gchar *err = NULL;
++
++ expected_type = va_arg (args, GType);
++
++ val = gst_structure_get_value (structure, field_name);
++
++ if (val == NULL)
++ goto no_such_field;
++
++ if (G_VALUE_TYPE (val) != expected_type)
++ goto wrong_type;
++
++ GST_VALUE_LCOPY (val, args, 0, &err, field_name);
++ if (err) {
++ g_warning ("%s: %s", G_STRFUNC, err);
++ g_free (err);
++ return FALSE;
++ }
++
++ field_name = va_arg (args, const gchar *);
++ }
++
++ return TRUE;
++
++/* ERRORS */
++no_such_field:
++ {
++ GST_WARNING ("Expected field '%s' in structure: %" GST_PTR_FORMAT,
++ field_name, structure);
++ return FALSE;
++ }
++wrong_type:
++ {
++ GST_WARNING ("Expected field '%s' in structure to be of type '%s', but "
++ "field was of type '%s': %" GST_PTR_FORMAT, field_name,
++ GST_STR_NULL (g_type_name (expected_type)),
++ G_VALUE_TYPE_NAME (gst_structure_get_value (structure, field_name)),
++ structure);
++ return FALSE;
++ }
++}
++
++/**
++ * gst_structure_id_get_valist:
++ * @structure: a #GstStructure
++ * @first_field_id: the quark of the first field to read
++ * @valist: variable arguments
++ *
++ * Parses the variable arguments and reads fields from @structure accordingly.
++ * valist-variant of gst_structure_id_get(). Look at the documentation of
++ * gst_structure_id_get() for more details.
++ *
++ * Returns: TRUE, or FALSE if there was a problem reading any of the fields
++ *
++ * Since: 0.10.24
++ */
++gboolean
++gst_structure_id_get_valist (GstStructure * structure, GQuark first_field_id,
++ va_list args)
++{
++ GQuark field_id;
++ GType expected_type = G_TYPE_INVALID;
++
++ g_return_val_if_fail (GST_IS_STRUCTURE (structure), FALSE);
++ g_return_val_if_fail (first_field_id != 0, FALSE);
++
++ field_id = first_field_id;
++ while (field_id) {
++ const GValue *val = NULL;
++ gchar *err = NULL;
++
++ expected_type = va_arg (args, GType);
++
++ val = gst_structure_id_get_value (structure, field_id);
++
++ if (val == NULL)
++ goto no_such_field;
++
++ if (G_VALUE_TYPE (val) != expected_type)
++ goto wrong_type;
++
++ GST_VALUE_LCOPY (val, args, 0, &err, g_quark_to_string (field_id));
++ if (err) {
++ g_warning ("%s: %s", G_STRFUNC, err);
++ g_free (err);
++ return FALSE;
++ }
++
++ field_id = va_arg (args, GQuark);
++ }
++
++ return TRUE;
++
++/* ERRORS */
++no_such_field:
++ {
++ GST_WARNING ("Expected field '%s' in structure: %" GST_PTR_FORMAT,
++ GST_STR_NULL (g_quark_to_string (field_id)), structure);
++ return FALSE;
++ }
++wrong_type:
++ {
++ GST_WARNING ("Expected field '%s' in structure to be of type '%s', but "
++ "field was of type '%s': %" GST_PTR_FORMAT,
++ g_quark_to_string (field_id),
++ GST_STR_NULL (g_type_name (expected_type)),
++ G_VALUE_TYPE_NAME (gst_structure_id_get_value (structure, field_id)),
++ structure);
++ return FALSE;
++ }
++}
++
++/**
++ * gst_structure_get:
++ * @structure: a #GstStructure
++ * @first_fieldname: the name of the first field to read
++ * @...: variable arguments
++ *
++ * Parses the variable arguments and reads fields from @structure accordingly.
++ * Variable arguments should be in the form field name, field type
++ * (as a GType), pointer(s) to a variable(s) to hold the return value(s).
++ * The last variable argument should be NULL.
++ *
++ * For refcounted (mini)objects you will acquire your own reference which
++ * you must release with a suitable _unref() when no longer needed. For
++ * strings and boxed types you will acquire a copy which you will need to
++ * release with either g_free() or the suiteable function for the boxed type.
++ *
++ * Returns: FALSE if there was a problem reading any of the fields (e.g.
++ * because the field requested did not exist, or was of a type other
++ * than the type specified), otherwise TRUE.
++ *
++ * Since: 0.10.24
++ */
++gboolean
++gst_structure_get (GstStructure * structure, const char *first_fieldname, ...)
++{
++ gboolean ret;
++ va_list args;
++
++ g_return_val_if_fail (GST_IS_STRUCTURE (structure), FALSE);
++ g_return_val_if_fail (first_fieldname != NULL, FALSE);
++
++ va_start (args, first_fieldname);
++ ret = gst_structure_get_valist (structure, first_fieldname, args);
++ va_end (args);
++
++ return ret;
++}
++
++/**
++ * gst_structure_id_get:
++ * @structure: a #GstStructure
++ * @first_field_id: the quark of the first field to read
++ * @...: variable arguments
++ *
++ * Parses the variable arguments and reads fields from @structure accordingly.
++ * Variable arguments should be in the form field id quark, field type
++ * (as a GType), pointer(s) to a variable(s) to hold the return value(s).
++ * The last variable argument should be NULL (technically it should be a
++ * 0 quark, but we require NULL so compilers that support it can check for
++ * the NULL terminator and warn if it's not there).
++ *
++ * This function is just like gst_structure_get() only that it is slightly
++ * more efficient since it saves the string-to-quark lookup in the global
++ * quark hashtable.
++ *
++ * For refcounted (mini)objects you will acquire your own reference which
++ * you must release with a suitable _unref() when no longer needed. For
++ * strings and boxed types you will acquire a copy which you will need to
++ * release with either g_free() or the suiteable function for the boxed type.
++ *
++ * Returns: FALSE if there was a problem reading any of the fields (e.g.
++ * because the field requested did not exist, or was of a type other
++ * than the type specified), otherwise TRUE.
++ *
++ * Since: 0.10.24
++ */
++gboolean
++gst_structure_id_get (GstStructure * structure, GQuark first_field_id, ...)
++{
++ gboolean ret;
++ va_list args;
++
++ g_return_val_if_fail (GST_IS_STRUCTURE (structure), FALSE);
++ g_return_val_if_fail (first_field_id != 0, FALSE);
++
++ va_start (args, first_field_id);
++ ret = gst_structure_id_get_valist (structure, first_field_id, args);
++ va_end (args);
++
++ return ret;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gststructure.h gstreamer-0.10.23/gst/gststructure.h
+--- gstreamer-0.10.23.orig/gst/gststructure.h 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/gst/gststructure.h 2009-06-11 14:19:59.000000000 +0200
+@@ -95,6 +95,9 @@
+ GstStructure * gst_structure_new_valist (const gchar * name,
+ const gchar * firstfield,
+ va_list varargs);
++GstStructure * gst_structure_id_new (GQuark name_quark,
++ GQuark field_quark,
++ ...);
+ GstStructure * gst_structure_copy (const GstStructure *structure);
+ void gst_structure_set_parent_refcount (GstStructure *structure,
+ gint *refcount);
+@@ -129,6 +132,21 @@
+ GQuark fieldname,
+ va_list varargs);
+
++gboolean gst_structure_get_valist (GstStructure *structure,
++ const char *first_fieldname,
++ va_list args);
++
++gboolean gst_structure_get (GstStructure *structure,
++ const char *first_fieldname,
++ ...) G_GNUC_NULL_TERMINATED;
++
++gboolean gst_structure_id_get_valist (GstStructure *structure,
++ GQuark first_field_id,
++ va_list args);
++
++gboolean gst_structure_id_get (GstStructure *structure,
++ GQuark first_field_id,
++ ...) G_GNUC_NULL_TERMINATED;
+
+ G_CONST_RETURN GValue * gst_structure_id_get_value (const GstStructure *structure,
+ GQuark field);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstsystemclock.c gstreamer-0.10.23/gst/gstsystemclock.c
+--- gstreamer-0.10.23.orig/gst/gstsystemclock.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gstsystemclock.c 2009-06-11 14:19:59.000000000 +0200
+@@ -41,6 +41,7 @@
+ #include "gst_private.h"
+ #include "gstinfo.h"
+ #include "gstsystemclock.h"
++#include "gstenumtypes.h"
+ #include "gstpoll.h"
+
+ #include <errno.h>
+@@ -48,8 +49,6 @@
+ /* Define this to get some extra debug about jitter from each clock_wait */
+ #undef WAIT_DEBUGGING
+
+-#define GST_TYPE_CLOCK_TYPE (gst_clock_type_get_type())
+-
+ struct _GstSystemClockPrivate
+ {
+ GstClockType clock_type;
+@@ -62,6 +61,16 @@
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_SYSTEM_CLOCK, \
+ GstSystemClockPrivate))
+
++#ifdef HAVE_POSIX_TIMERS
++# ifdef HAVE_MONOTONIC_CLOCK
++# define DEFAULT_CLOCK_TYPE GST_CLOCK_TYPE_MONOTONIC
++# else
++# define DEFAULT_CLOCK_TYPE GST_CLOCK_TYPE_REALTIME
++# endif
++#else
++#define DEFAULT_CLOCK_TYPE GST_CLOCK_TYPE_REALTIME
++#endif
++
+ enum
+ {
+ PROP_0,
+@@ -103,22 +112,6 @@
+
+ G_DEFINE_TYPE (GstSystemClock, gst_system_clock, GST_TYPE_CLOCK);
+
+-static GType
+-gst_clock_type_get_type (void)
+-{
+- static GType clock_type_type = 0;
+- static const GEnumValue clock_types[] = {
+- {GST_CLOCK_TYPE_REALTIME, "GST_CLOCK_TYPE_REALTIME", "realtime"},
+- {GST_CLOCK_TYPE_MONOTONIC, "GST_CLOCK_TYPE_MONOTONIC", "monotonic"},
+- {0, NULL, NULL},
+- };
+-
+- if (G_UNLIKELY (!clock_type_type)) {
+- clock_type_type = g_enum_register_static ("GstClockType", clock_types);
+- }
+- return clock_type_type;
+-}
+-
+ static void
+ gst_system_clock_class_init (GstSystemClockClass * klass)
+ {
+@@ -139,7 +132,7 @@
+ g_object_class_install_property (gobject_class, PROP_CLOCK_TYPE,
+ g_param_spec_enum ("clock-type", "Clock type",
+ "The type of underlying clock implementation used",
+- GST_TYPE_CLOCK_TYPE, GST_CLOCK_TYPE_REALTIME, G_PARAM_READWRITE));
++ GST_TYPE_CLOCK_TYPE, DEFAULT_CLOCK_TYPE, G_PARAM_READWRITE));
+
+ gstclock_class->get_internal_time = gst_system_clock_get_internal_time;
+ gstclock_class->get_resolution = gst_system_clock_get_resolution;
+@@ -159,7 +152,7 @@
+
+ clock->priv = GST_SYSTEM_CLOCK_GET_PRIVATE (clock);
+
+- clock->priv->clock_type = GST_CLOCK_TYPE_REALTIME;
++ clock->priv->clock_type = DEFAULT_CLOCK_TYPE;
+ clock->priv->timer = gst_poll_new_timer ();
+
+ #if 0
+@@ -268,8 +261,7 @@
+
+ /* we created the global clock; take ownership so
+ * we can hand out instances later */
+- gst_object_ref (clock);
+- gst_object_sink (GST_OBJECT (clock));
++ gst_object_ref_sink (clock);
+
+ _the_system_clock = clock;
+ g_static_mutex_unlock (&_gst_sysclock_mutex);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gsttaglist.c gstreamer-0.10.23/gst/gsttaglist.c
+--- gstreamer-0.10.23.orig/gst/gsttaglist.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gsttaglist.c 2009-06-11 14:19:59.000000000 +0200
+@@ -25,7 +25,9 @@
+ *
+ * List of tags and values used to describe media metadata.
+ *
+- * Last reviewed on 2005-11-23 (0.9.5)
++ * Strings must be in ASCII or UTF-8 encoding. No other encodings are allowed.
++ *
++ * Last reviewed on 2009-06-09 (0.10.23)
+ */
+
+ #ifdef HAVE_CONFIG_H
+@@ -38,6 +40,7 @@
+ #include "gstinfo.h"
+ #include "gstvalue.h"
+ #include "gstbuffer.h"
++#include "gstquark.h"
+
+ #include <gobject/gvaluecollector.h>
+ #include <string.h>
+@@ -60,9 +63,6 @@
+ }
+ GstTagInfo;
+
+-#define TAGLIST "taglist"
+-static GQuark gst_tag_list_quark;
+-
+ static GMutex *__tag_mutex;
+
+ static GHashTable *__tags;
+@@ -91,7 +91,6 @@
+ void
+ _gst_tag_initialize (void)
+ {
+- gst_tag_list_quark = g_quark_from_static_string (TAGLIST);
+ __tag_mutex = g_mutex_new ();
+ __tags = g_hash_table_new (g_direct_hash, g_direct_equal);
+ gst_tag_register (GST_TAG_TITLE, GST_TAG_FLAG_META,
+@@ -211,6 +210,9 @@
+ gst_tag_register (GST_TAG_SUBTITLE_CODEC, GST_TAG_FLAG_ENCODED,
+ G_TYPE_STRING,
+ _("subtitle codec"), _("codec the subtitle data is stored in"), NULL);
++ gst_tag_register (GST_TAG_CONTAINER_FORMAT, GST_TAG_FLAG_ENCODED,
++ G_TYPE_STRING, _("container format"),
++ _("container format the data is stored in"), NULL);
+ gst_tag_register (GST_TAG_BITRATE, GST_TAG_FLAG_ENCODED,
+ G_TYPE_UINT, _("bitrate"), _("exact or average bitrate in bits/s"), NULL);
+ gst_tag_register (GST_TAG_NOMINAL_BITRATE, GST_TAG_FLAG_ENCODED,
+@@ -529,7 +531,7 @@
+ GstTagList *
+ gst_tag_list_new (void)
+ {
+- return GST_TAG_LIST (gst_structure_new (TAGLIST, NULL));
++ return GST_TAG_LIST (gst_structure_id_empty_new (GST_QUARK (TAGLIST)));
+ }
+
+ /**
+@@ -566,7 +568,7 @@
+
+ g_return_val_if_fail (p != NULL, FALSE);
+
+- return (GST_IS_STRUCTURE (s) && s->name == gst_tag_list_quark);
++ return (GST_IS_STRUCTURE (s) && s->name == GST_QUARK (TAGLIST));
+ }
+
+ typedef struct
+@@ -893,6 +895,29 @@
+ }
+
+ /**
++ * gst_tag_list_add_value:
++ * @list: list to set tags in
++ * @mode: the mode to use
++ * @tag: tag
++ * @value: GValue for this tag
++ *
++ * Sets the GValue for a given tag using the specified mode.
++ *
++ * Since: 0.10.24
++ */
++void
++gst_tag_list_add_value (GstTagList * list, GstTagMergeMode mode,
++ const gchar * tag, const GValue * value)
++{
++ g_return_if_fail (GST_IS_TAG_LIST (list));
++ g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
++ g_return_if_fail (tag != NULL);
++
++ gst_tag_list_add_value_internal (list, mode, g_quark_from_string (tag),
++ value);
++}
++
++/**
+ * gst_tag_list_remove_tag:
+ * @list: list to remove tag from
+ * @tag: tag to remove
+@@ -1043,7 +1068,7 @@
+
+ /***** evil macros to get all the gst_tag_list_get_*() functions right *****/
+
+-#define TAG_MERGE_FUNCS(name,type) \
++#define TAG_MERGE_FUNCS(name,type,ret) \
+ gboolean \
+ gst_tag_list_get_ ## name (const GstTagList *list, const gchar *tag, \
+ type *value) \
+@@ -1058,7 +1083,7 @@
+ return FALSE; \
+ *value = COPY_FUNC (g_value_get_ ## name (&v)); \
+ g_value_unset (&v); \
+- return TRUE; \
++ return ret; \
+ } \
+ \
+ gboolean \
+@@ -1075,7 +1100,7 @@
+ if ((v = gst_tag_list_get_value_index (list, tag, index)) == NULL) \
+ return FALSE; \
+ *value = COPY_FUNC (g_value_get_ ## name (v)); \
+- return TRUE; \
++ return ret; \
+ }
+
+ /* FIXME 0.11: maybe get rid of _get_char*(), _get_uchar*(), _get_long*(),
+@@ -1108,7 +1133,7 @@
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+-TAG_MERGE_FUNCS (char, gchar)
++TAG_MERGE_FUNCS (char, gchar, TRUE)
+ /**
+ * gst_tag_list_get_uchar:
+ * @list: a #GstTagList to get the tag from
+@@ -1134,7 +1159,7 @@
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+-TAG_MERGE_FUNCS (uchar, guchar)
++TAG_MERGE_FUNCS (uchar, guchar, TRUE)
+ /**
+ * gst_tag_list_get_boolean:
+ * @list: a #GstTagList to get the tag from
+@@ -1160,7 +1185,7 @@
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+-TAG_MERGE_FUNCS (boolean, gboolean)
++TAG_MERGE_FUNCS (boolean, gboolean, TRUE)
+ /**
+ * gst_tag_list_get_int:
+ * @list: a #GstTagList to get the tag from
+@@ -1186,7 +1211,7 @@
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+-TAG_MERGE_FUNCS (int, gint)
++TAG_MERGE_FUNCS (int, gint, TRUE)
+ /**
+ * gst_tag_list_get_uint:
+ * @list: a #GstTagList to get the tag from
+@@ -1212,7 +1237,7 @@
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+-TAG_MERGE_FUNCS (uint, guint)
++TAG_MERGE_FUNCS (uint, guint, TRUE)
+ /**
+ * gst_tag_list_get_long:
+ * @list: a #GstTagList to get the tag from
+@@ -1238,7 +1263,7 @@
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+-TAG_MERGE_FUNCS (long, glong)
++TAG_MERGE_FUNCS (long, glong, TRUE)
+ /**
+ * gst_tag_list_get_ulong:
+ * @list: a #GstTagList to get the tag from
+@@ -1264,7 +1289,7 @@
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+-TAG_MERGE_FUNCS (ulong, gulong)
++TAG_MERGE_FUNCS (ulong, gulong, TRUE)
+ /**
+ * gst_tag_list_get_int64:
+ * @list: a #GstTagList to get the tag from
+@@ -1290,7 +1315,7 @@
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+-TAG_MERGE_FUNCS (int64, gint64)
++TAG_MERGE_FUNCS (int64, gint64, TRUE)
+ /**
+ * gst_tag_list_get_uint64:
+ * @list: a #GstTagList to get the tag from
+@@ -1316,7 +1341,7 @@
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+-TAG_MERGE_FUNCS (uint64, guint64)
++TAG_MERGE_FUNCS (uint64, guint64, TRUE)
+ /**
+ * gst_tag_list_get_float:
+ * @list: a #GstTagList to get the tag from
+@@ -1342,7 +1367,7 @@
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+-TAG_MERGE_FUNCS (float, gfloat)
++TAG_MERGE_FUNCS (float, gfloat, TRUE)
+ /**
+ * gst_tag_list_get_double:
+ * @list: a #GstTagList to get the tag from
+@@ -1368,7 +1393,7 @@
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+-TAG_MERGE_FUNCS (double, gdouble)
++TAG_MERGE_FUNCS (double, gdouble, TRUE)
+ /**
+ * gst_tag_list_get_pointer:
+ * @list: a #GstTagList to get the tag from
+@@ -1394,7 +1419,7 @@
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+-TAG_MERGE_FUNCS (pointer, gpointer)
++TAG_MERGE_FUNCS (pointer, gpointer, (*value != NULL))
+ #undef COPY_FUNC
+ #define COPY_FUNC g_strdup
+ /**
+@@ -1410,7 +1435,8 @@
+ * to retrieve the first string associated with this tag unmodified.
+ *
+ * The resulting string in @value will be in UTF-8 encoding and should be
+- * freed by the caller using g_free when no longer needed.
++ * freed by the caller using g_free when no longer needed. Since 0.10.24 the
++ * returned string is also guaranteed to be non-NULL and non-empty.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+@@ -1426,12 +1452,13 @@
+ * list.
+ *
+ * The resulting string in @value will be in UTF-8 encoding and should be
+- * freed by the caller using g_free when no longer needed.
++ * freed by the caller using g_free when no longer needed. Since 0.10.24 the
++ * returned string is also guaranteed to be non-NULL and non-empty.
+ *
+ * Returns: TRUE, if a value was copied, FALSE if the tag didn't exist in the
+ * given list.
+ */
+-TAG_MERGE_FUNCS (string, gchar *)
++TAG_MERGE_FUNCS (string, gchar *, (*value != NULL && **value != '\0'))
+
+ /**
+ * gst_tag_list_get_date:
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gsttaglist.h gstreamer-0.10.23/gst/gsttaglist.h
+--- gstreamer-0.10.23.orig/gst/gsttaglist.h 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/gst/gsttaglist.h 2009-06-11 14:19:59.000000000 +0200
+@@ -226,6 +226,10 @@
+ GstTagMergeMode mode,
+ const gchar * tag,
+ va_list var_args);
++void gst_tag_list_add_value (GstTagList * list,
++ GstTagMergeMode mode,
++ const gchar * tag,
++ const GValue * value);
+ void gst_tag_list_remove_tag (GstTagList * list,
+ const gchar * tag);
+ void gst_tag_list_foreach (const GstTagList * list,
+@@ -582,6 +586,14 @@
+ */
+ #define GST_TAG_SUBTITLE_CODEC "subtitle-codec"
+ /**
++ * GST_TAG_CONTAINER_FORMAT:
++ *
++ * container format the data is stored in (string)
++ *
++ * Since: 0.10.24
++ */
++#define GST_TAG_CONTAINER_FORMAT "container-format"
++/**
+ * GST_TAG_BITRATE:
+ *
+ * exact or average bitrate in bits/s (unsigned integer)
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gsttagsetter.c gstreamer-0.10.23/gst/gsttagsetter.c
+--- gstreamer-0.10.23.orig/gst/gsttagsetter.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gsttagsetter.c 2009-06-11 14:19:59.000000000 +0200
+@@ -301,6 +301,33 @@
+ }
+
+ /**
++ * gst_tag_setter_add_tag_value:
++ * @setter: a #GstTagSetter
++ * @mode: the mode to use
++ * @tag: tag to set
++ * @value: GValue to set for the tag
++ *
++ * Adds the given tag / GValue pair on the setter using the given merge mode.
++ *
++ * Since: 0.10.24
++ */
++void
++gst_tag_setter_add_tag_value (GstTagSetter * setter,
++ GstTagMergeMode mode, const gchar * tag, const GValue * value)
++{
++ GstTagData *data;
++
++ g_return_if_fail (GST_IS_TAG_SETTER (setter));
++ g_return_if_fail (GST_TAG_MODE_IS_VALID (mode));
++
++ data = gst_tag_setter_get_data (setter);
++ if (!data->list)
++ data->list = gst_tag_list_new ();
++
++ gst_tag_list_add_value (data->list, mode, tag, value);
++}
++
++/**
+ * gst_tag_setter_get_tag_list:
+ * @setter: a #GstTagSetter
+ *
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gsttagsetter.h gstreamer-0.10.23/gst/gsttagsetter.h
+--- gstreamer-0.10.23.orig/gst/gsttagsetter.h 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/gst/gsttagsetter.h 2009-06-11 14:19:59.000000000 +0200
+@@ -83,6 +83,11 @@
+ const gchar * tag,
+ va_list var_args);
+
++void gst_tag_setter_add_tag_value (GstTagSetter * setter,
++ GstTagMergeMode mode,
++ const gchar * tag,
++ const GValue * value);
++
+ G_CONST_RETURN GstTagList *
+ gst_tag_setter_get_tag_list (GstTagSetter * setter);
+
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gsttask.c gstreamer-0.10.23/gst/gsttask.c
+--- gstreamer-0.10.23.orig/gst/gsttask.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gsttask.c 2009-06-11 14:19:59.000000000 +0200
+@@ -42,11 +42,12 @@
+ * gst_task_set_lock().
+ *
+ * The task can be started, paused and stopped with gst_task_start(), gst_task_pause()
+- * and gst_task_stop() respectively.
++ * and gst_task_stop() respectively or with the gst_task_set_state() function.
+ *
+ * A #GstTask will repeatedly call the #GstTaskFunction with the user data
+- * that was provided when creating the task with gst_task_create(). Before calling
+- * the function it will acquire the provided lock.
++ * that was provided when creating the task with gst_task_create(). While calling
++ * the function it will acquire the provided lock. The provided lock is released
++ * when the task pauses or stops.
+ *
+ * Stopping a task with gst_task_stop() will not immediately make sure the task is
+ * not running anymore. Use gst_task_join() to make sure the task is completely
+@@ -66,13 +67,32 @@
+ GST_DEBUG_CATEGORY_STATIC (task_debug);
+ #define GST_CAT_DEFAULT (task_debug)
+
++#define GST_TASK_GET_PRIVATE(obj) \
++ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_TASK, GstTaskPrivate))
++
++struct _GstTaskPrivate
++{
++ /* callbacks for managing the thread of this task */
++ GstTaskThreadCallbacks thr_callbacks;
++ gpointer thr_user_data;
++ GDestroyNotify thr_notify;
++
++ gboolean prio_set;
++ GThreadPriority priority;
++
++ /* configured pool */
++ GstTaskPool *pool;
++
++ /* remember the pool and id that is currently running. */
++ gpointer id;
++ GstTaskPool *pool_id;
++};
++
+ static void gst_task_class_init (GstTaskClass * klass);
+ static void gst_task_init (GstTask * task);
+ static void gst_task_finalize (GObject * object);
+
+-static void gst_task_func (GstTask * task, GstTaskClass * tclass);
+-
+-static GstObjectClass *parent_class = NULL;
++static void gst_task_func (GstTask * task);
+
+ static GStaticMutex pool_lock = G_STATIC_MUTEX_INIT;
+
+@@ -84,50 +104,85 @@
+ G_DEFINE_TYPE_WITH_CODE (GstTask, gst_task, GST_TYPE_OBJECT, _do_init);
+
+ static void
++init_klass_pool (GstTaskClass * klass)
++{
++ g_static_mutex_lock (&pool_lock);
++ if (klass->pool) {
++ gst_task_pool_cleanup (klass->pool);
++ gst_object_unref (klass->pool);
++ }
++ klass->pool = gst_task_pool_new ();
++ gst_task_pool_prepare (klass->pool, NULL);
++ g_static_mutex_unlock (&pool_lock);
++}
++
++static void
+ gst_task_class_init (GstTaskClass * klass)
+ {
+ GObjectClass *gobject_class;
+
+ gobject_class = (GObjectClass *) klass;
+
+- parent_class = g_type_class_peek_parent (klass);
++ g_type_class_add_private (klass, sizeof (GstTaskPrivate));
+
+ gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_task_finalize);
+
+- klass->pool = g_thread_pool_new (
+- (GFunc) gst_task_func, klass, -1, FALSE, NULL);
++ init_klass_pool (klass);
+ }
+
+ static void
+ gst_task_init (GstTask * task)
+ {
++ GstTaskClass *klass;
++
++ klass = GST_TASK_GET_CLASS (task);
++
++ task->priv = GST_TASK_GET_PRIVATE (task);
+ task->running = FALSE;
+ task->abidata.ABI.thread = NULL;
+ task->lock = NULL;
+ task->cond = g_cond_new ();
+ task->state = GST_TASK_STOPPED;
++ task->priv->prio_set = FALSE;
++
++ /* use the default klass pool for this task, users can
++ * override this later */
++ g_static_mutex_lock (&pool_lock);
++ task->priv->pool = gst_object_ref (klass->pool);
++ g_static_mutex_unlock (&pool_lock);
+ }
+
+ static void
+ gst_task_finalize (GObject * object)
+ {
+ GstTask *task = GST_TASK (object);
++ GstTaskPrivate *priv = task->priv;
+
+ GST_DEBUG ("task %p finalize", task);
+
++ if (priv->thr_notify)
++ priv->thr_notify (priv->thr_user_data);
++ priv->thr_notify = NULL;
++ priv->thr_user_data = NULL;
++
++ gst_object_unref (priv->pool);
++
+ /* task thread cannot be running here since it holds a ref
+ * to the task so that the finalize could not have happened */
+ g_cond_free (task->cond);
+ task->cond = NULL;
+
+- G_OBJECT_CLASS (parent_class)->finalize (object);
++ G_OBJECT_CLASS (gst_task_parent_class)->finalize (object);
+ }
+
+ static void
+-gst_task_func (GstTask * task, GstTaskClass * tclass)
++gst_task_func (GstTask * task)
+ {
+ GStaticRecMutex *lock;
+ GThread *tself;
++ GstTaskPrivate *priv;
++
++ priv = task->priv;
+
+ tself = g_thread_self ();
+
+@@ -143,8 +198,15 @@
+ if (G_UNLIKELY (lock == NULL))
+ goto no_lock;
+ task->abidata.ABI.thread = tself;
++ /* only update the priority when it was changed */
++ if (priv->prio_set)
++ g_thread_set_priority (tself, priv->priority);
+ GST_OBJECT_UNLOCK (task);
+
++ /* fire the enter_thread callback when we need to */
++ if (priv->thr_callbacks.enter_thread)
++ priv->thr_callbacks.enter_thread (task, tself, priv->thr_user_data);
++
+ /* locking order is TASK_LOCK, LOCK */
+ g_static_rec_mutex_lock (lock);
+ GST_OBJECT_LOCK (task);
+@@ -181,6 +243,17 @@
+ task->abidata.ABI.thread = NULL;
+
+ exit:
++ if (priv->thr_callbacks.leave_thread) {
++ /* fire the leave_thread callback when we need to. We need to do this before
++ * we signal the task and with the task lock released. */
++ GST_OBJECT_UNLOCK (task);
++ priv->thr_callbacks.leave_thread (task, tself, priv->thr_user_data);
++ GST_OBJECT_LOCK (task);
++ } else {
++ /* restore normal priority when releasing back into the pool, we will not
++ * touch the priority when a custom callback has been installed. */
++ g_thread_set_priority (tself, G_THREAD_PRIORITY_NORMAL);
++ }
+ /* now we allow messing with the lock again by setting the running flag to
+ * FALSE. Together with the SIGNAL this is the sign for the _join() to
+ * complete.
+@@ -218,18 +291,7 @@
+ GstTaskClass *klass;
+
+ if ((klass = g_type_class_peek (GST_TYPE_TASK))) {
+- g_static_mutex_lock (&pool_lock);
+- if (klass->pool) {
+- /* Shut down all the threads, we still process the ones scheduled
+- * because the unref happens in the thread function.
+- * Also wait for currently running ones to finish. */
+- g_thread_pool_free (klass->pool, FALSE, TRUE);
+- /* create new pool, so we can still do something after this
+- * call. */
+- klass->pool = g_thread_pool_new (
+- (GFunc) gst_task_func, klass, -1, FALSE, NULL);
+- }
+- g_static_mutex_unlock (&pool_lock);
++ init_klass_pool (klass);
+ }
+ }
+
+@@ -245,6 +307,13 @@
+ * The function cannot be changed after the task has been created. You
+ * must create a new #GstTask to change the function.
+ *
++ * This function will not yet create and start a thread. Use gst_task_start() or
++ * gst_task_pause() to create and start the GThread.
++ *
++ * Before the task can be used, a #GStaticRecMutex must be configured using the
++ * gst_task_set_lock() function. This lock will always be acquired while
++ * @func is called.
++ *
+ * Returns: A new #GstTask.
+ *
+ * MT safe.
+@@ -295,6 +364,159 @@
+ }
+ }
+
++/**
++ * gst_task_set_priority:
++ * @task: a #GstTask
++ * @priority: a new priority for @task
++ *
++ * Changes the priority of @task to @priority.
++ *
++ * Note: try not to depend on task priorities.
++ *
++ * MT safe.
++ *
++ * Since: 0.10.24
++ */
++void
++gst_task_set_priority (GstTask * task, GThreadPriority priority)
++{
++ GstTaskPrivate *priv;
++ GThread *thread;
++
++ g_return_if_fail (GST_IS_TASK (task));
++
++ priv = task->priv;
++
++ GST_OBJECT_LOCK (task);
++ priv->prio_set = TRUE;
++ priv->priority = priority;
++ thread = task->abidata.ABI.thread;
++ if (thread != NULL) {
++ /* if this task already has a thread, we can configure the priority right
++ * away, else we do that when we assign a thread to the task. */
++ g_thread_set_priority (thread, priority);
++ }
++ GST_OBJECT_UNLOCK (task);
++}
++
++/**
++ * gst_task_get_pool:
++ * @task: a #GstTask
++ *
++ * Get the #GstTaskPool that this task will use for its streaming
++ * threads.
++ *
++ * MT safe.
++ *
++ * Returns: the #GstTaskPool used by @task. gst_object_unref()
++ * after usage.
++ *
++ * Since: 0.10.24
++ */
++GstTaskPool *
++gst_task_get_pool (GstTask * task)
++{
++ GstTaskPool *result;
++ GstTaskPrivate *priv;
++
++ g_return_val_if_fail (GST_IS_TASK (task), NULL);
++
++ priv = task->priv;
++
++ GST_OBJECT_LOCK (task);
++ result = gst_object_ref (priv->pool);
++ GST_OBJECT_UNLOCK (task);
++
++ return result;
++}
++
++/**
++ * gst_task_set_pool:
++ * @task: a #GstTask
++ * @pool: a #GstTaskPool
++ *
++ * Set @pool as the new GstTaskPool for @task. Any new streaming threads that
++ * will be created by @task will now use @pool.
++ *
++ * MT safe.
++ *
++ * Since: 0.10.24
++ */
++void
++gst_task_set_pool (GstTask * task, GstTaskPool * pool)
++{
++ GstTaskPool *old;
++ GstTaskPrivate *priv;
++
++ g_return_if_fail (GST_IS_TASK (task));
++ g_return_if_fail (GST_IS_TASK_POOL (pool));
++
++ priv = task->priv;
++
++ GST_OBJECT_LOCK (task);
++ if (priv->pool != pool) {
++ old = priv->pool;
++ priv->pool = gst_object_ref (pool);
++ } else
++ old = NULL;
++ GST_OBJECT_UNLOCK (task);
++
++ if (old)
++ gst_object_unref (old);
++}
++
++
++/**
++ * gst_task_set_thread_callbacks:
++ * @task: The #GstTask to use
++ * @callbacks: a #GstTaskThreadCallbacks pointer
++ * @user_data: user data passed to the callbacks
++ * @notify: called when @user_data is no longer referenced
++ *
++ * Set callbacks which will be executed when a new thread is needed, the thread
++ * function is entered and left and when the thread is joined.
++ *
++ * By default a thread for @task will be created from a default thread pool.
++ *
++ * Objects can use custom GThreads or can perform additional configuration of
++ * the threads (such as changing the thread priority) by installing callbacks.
++ *
++ * MT safe.
++ *
++ * Since: 0.10.24
++ */
++void
++gst_task_set_thread_callbacks (GstTask * task,
++ GstTaskThreadCallbacks * callbacks, gpointer user_data,
++ GDestroyNotify notify)
++{
++ GDestroyNotify old_notify;
++
++ g_return_if_fail (task != NULL);
++ g_return_if_fail (GST_IS_TASK (task));
++ g_return_if_fail (callbacks != NULL);
++
++ GST_OBJECT_LOCK (task);
++ old_notify = task->priv->thr_notify;
++
++ if (old_notify) {
++ gpointer old_data;
++
++ old_data = task->priv->thr_user_data;
++
++ task->priv->thr_user_data = NULL;
++ task->priv->thr_notify = NULL;
++ GST_OBJECT_UNLOCK (task);
++
++ old_notify (old_data);
++
++ GST_OBJECT_LOCK (task);
++ }
++ task->priv->thr_callbacks = *callbacks;
++ task->priv->thr_user_data = user_data;
++ task->priv->thr_notify = notify;
++ GST_OBJECT_UNLOCK (task);
++}
+
+ /**
+ * gst_task_get_state:
+@@ -320,79 +542,128 @@
+ return result;
+ }
+
++/* make sure the task is running and start a thread if it's not.
++ * This function must be called with the task LOCK. */
++static gboolean
++start_task (GstTask * task)
++{
++ gboolean res = TRUE;
++ GstTaskClass *tclass;
++ GError *error = NULL;
++ GstTaskPrivate *priv;
++
++ priv = task->priv;
++
++ /* new task, We ref before so that it remains alive while
++ * the thread is running. */
++ gst_object_ref (task);
++ /* mark task as running so that a join will wait until we schedule
++ * and exit the task function. */
++ task->running = TRUE;
++
++ tclass = GST_TASK_GET_CLASS (task);
++
++ /* push on the thread pool, we remember the original pool because the user
++ * could change it later on and then we join to the wrong pool. */
++ priv->pool_id = gst_object_ref (priv->pool);
++ priv->id =
++ gst_task_pool_push (priv->pool_id, (GstTaskPoolFunction) gst_task_func,
++ task, &error);
++
++ if (error != NULL) {
++ g_warning ("failed to create thread: %s", error->message);
++ g_error_free (error);
++ res = FALSE;
++ }
++ return res;
++}
++
++
+ /**
+- * gst_task_start:
+- * @task: The #GstTask to start
++ * gst_task_set_state:
++ * @task: a #GstTask
++ * @state: the new task state
++ *
++ * Sets the state of @task to @state.
++ *
++ * The @task must have a lock associated with it using
++ * gst_task_set_lock() when going to GST_TASK_STARTED or GST_TASK_PAUSED or
++ * this function will return %FALSE.
+ *
+- * Starts @task. The @task must have a lock associated with it using
+- * gst_task_set_lock() or this function will return %FALSE.
++ * MT safe.
+ *
+- * Returns: %TRUE if the task could be started.
++ * Returns: %TRUE if the state could be changed.
+ *
+- * MT safe.
++ * Since: 0.10.24
+ */
+ gboolean
+-gst_task_start (GstTask * task)
++gst_task_set_state (GstTask * task, GstTaskState state)
+ {
+ GstTaskState old;
++ gboolean res = TRUE;
+
+ g_return_val_if_fail (GST_IS_TASK (task), FALSE);
+
+- GST_DEBUG_OBJECT (task, "Starting task %p", task);
++ GST_DEBUG_OBJECT (task, "Changing task %p to state %d", task, state);
+
+ GST_OBJECT_LOCK (task);
+- if (G_UNLIKELY (GST_TASK_GET_LOCK (task) == NULL))
+- goto no_lock;
++ if (state != GST_TASK_STOPPED)
++ if (G_UNLIKELY (GST_TASK_GET_LOCK (task) == NULL))
++ goto no_lock;
+
++ /* if the state changed, do our thing */
+ old = task->state;
+- task->state = GST_TASK_STARTED;
+- switch (old) {
+- case GST_TASK_STOPPED:
+- {
+- GstTaskClass *tclass;
+-
+- /* If the task already has a thread scheduled we don't have to do
+- * anything. */
+- if (task->running)
++ if (old != state) {
++ task->state = state;
++ switch (old) {
++ case GST_TASK_STOPPED:
++ /* If the task already has a thread scheduled we don't have to do
++ * anything. */
++ if (G_UNLIKELY (!task->running))
++ res = start_task (task);
++ break;
++ case GST_TASK_PAUSED:
++ /* when we are paused, signal to go to the new state */
++ GST_TASK_SIGNAL (task);
++ break;
++ case GST_TASK_STARTED:
++ /* if we were started, we'll go to the new state after the next
++ * iteration. */
+ break;
+-
+- /* new task, push on thread pool. We ref before so
+- * that it remains alive while on the thread pool. */
+- gst_object_ref (task);
+- /* mark task as running so that a join will wait until we schedule
+- * and exit the task function. */
+- task->running = TRUE;
+-
+- tclass = GST_TASK_GET_CLASS (task);
+-
+- g_static_mutex_lock (&pool_lock);
+- g_thread_pool_push (tclass->pool, task, NULL);
+- g_static_mutex_unlock (&pool_lock);
+- break;
+ }
+- case GST_TASK_PAUSED:
+- /* PAUSE to PLAY, signal */
+- GST_TASK_SIGNAL (task);
+- break;
+- case GST_TASK_STARTED:
+- /* was OK */
+- break;
+ }
+ GST_OBJECT_UNLOCK (task);
+
+- return TRUE;
++ return res;
+
+ /* ERRORS */
+ no_lock:
+ {
+- GST_WARNING_OBJECT (task, "starting task without a lock");
++ GST_WARNING_OBJECT (task, "state %d set on task without a lock", state);
+ GST_OBJECT_UNLOCK (task);
+- g_warning ("starting task without a lock");
++ g_warning ("task without a lock can't be set to state %d", state);
+ return FALSE;
+ }
+ }
+
+ /**
++ * gst_task_start:
++ * @task: The #GstTask to start
++ *
++ * Starts @task. The @task must have a lock associated with it using
++ * gst_task_set_lock() or this function will return %FALSE.
++ *
++ * Returns: %TRUE if the task could be started.
++ *
++ * MT safe.
++ */
++gboolean
++gst_task_start (GstTask * task)
++{
++ return gst_task_set_state (task, GST_TASK_STARTED);
++}
++
++/**
+ * gst_task_stop:
+ * @task: The #GstTask to stop
+ *
+@@ -407,27 +678,7 @@
+ gboolean
+ gst_task_stop (GstTask * task)
+ {
+- GstTaskState old;
+-
+- g_return_val_if_fail (GST_IS_TASK (task), FALSE);
+-
+- GST_DEBUG_OBJECT (task, "Stopping task %p", task);
+-
+- GST_OBJECT_LOCK (task);
+- old = task->state;
+- task->state = GST_TASK_STOPPED;
+- switch (old) {
+- case GST_TASK_STOPPED:
+- break;
+- case GST_TASK_PAUSED:
+- GST_TASK_SIGNAL (task);
+- break;
+- case GST_TASK_STARTED:
+- break;
+- }
+- GST_OBJECT_UNLOCK (task);
+-
+- return TRUE;
++ return gst_task_set_state (task, GST_TASK_STOPPED);
+ }
+
+ /**
+@@ -446,53 +697,7 @@
+ gboolean
+ gst_task_pause (GstTask * task)
+ {
+- GstTaskState old;
+-
+- g_return_val_if_fail (GST_IS_TASK (task), FALSE);
+-
+- GST_DEBUG_OBJECT (task, "Pausing task %p", task);
+-
+- GST_OBJECT_LOCK (task);
+- if (G_UNLIKELY (GST_TASK_GET_LOCK (task) == NULL))
+- goto no_lock;
+-
+- old = task->state;
+- task->state = GST_TASK_PAUSED;
+- switch (old) {
+- case GST_TASK_STOPPED:
+- {
+- GstTaskClass *tclass;
+-
+- if (task->running)
+- break;
+-
+- gst_object_ref (task);
+- task->running = TRUE;
+-
+- tclass = GST_TASK_GET_CLASS (task);
+-
+- g_static_mutex_lock (&pool_lock);
+- g_thread_pool_push (tclass->pool, task, NULL);
+- g_static_mutex_unlock (&pool_lock);
+- break;
+- }
+- case GST_TASK_PAUSED:
+- break;
+- case GST_TASK_STARTED:
+- break;
+- }
+- GST_OBJECT_UNLOCK (task);
+-
+- return TRUE;
+-
+- /* ERRORS */
+-no_lock:
+- {
+- GST_WARNING_OBJECT (task, "pausing task without a lock");
+- GST_OBJECT_UNLOCK (task);
+- g_warning ("pausing task without a lock");
+- return FALSE;
+- }
++ return gst_task_set_state (task, GST_TASK_PAUSED);
+ }
+
+ /**
+@@ -516,6 +721,11 @@
+ gst_task_join (GstTask * task)
+ {
+ GThread *tself;
++ GstTaskPrivate *priv;
++ gpointer id;
++ GstTaskPool *pool = NULL;
++
++ priv = task->priv;
+
+ g_return_val_if_fail (GST_IS_TASK (task), FALSE);
+
+@@ -536,8 +746,22 @@
+ * to join it here. */
+ while (G_LIKELY (task->running))
+ GST_TASK_WAIT (task);
++ /* clean the thread */
++ task->abidata.ABI.thread = NULL;
++ /* get the id and pool to join */
++ if ((id = priv->id)) {
++ if ((pool = priv->pool_id))
++ gst_object_ref (pool);
++ priv->pool_id = NULL;
++ priv->id = NULL;
++ }
+ GST_OBJECT_UNLOCK (task);
+
++ if (pool) {
++ gst_task_pool_join (pool, id);
++ gst_object_unref (pool);
++ }
++
+ GST_DEBUG_OBJECT (task, "Joined task %p", task);
+
+ return TRUE;
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gsttask.h gstreamer-0.10.23/gst/gsttask.h
+--- gstreamer-0.10.23.orig/gst/gsttask.h 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/gst/gsttask.h 2009-06-11 14:19:59.000000000 +0200
+@@ -24,6 +24,7 @@
+ #define __GST_TASK_H__
+
+ #include <gst/gstobject.h>
++#include <gst/gsttaskpool.h>
+
+ G_BEGIN_DECLS
+
+@@ -47,6 +48,7 @@
+
+ typedef struct _GstTask GstTask;
+ typedef struct _GstTaskClass GstTaskClass;
++typedef struct _GstTaskPrivate GstTaskPrivate;
+
+ /**
+ * GstTaskState:
+@@ -108,6 +110,25 @@
+ #define GST_TASK_GET_LOCK(task) (GST_TASK_CAST(task)->lock)
+
+ /**
++ * GstTaskThreadCallbacks:
++ * @enter_thread: a thread is entered, this callback is called when the new
++ * thread enters its function.
++ * @leave_thread: a thread is exiting, this is called when the thread is about
++ * to leave its function
++ *
++ * Custom GstTask thread callback functions that can be installed.
++ *
++ * Since: 0.10.24
++ */
++typedef struct {
++ /* manage the lifetime of the thread */
++ void (*enter_thread) (GstTask *task, GThread *thread, gpointer user_data);
++ void (*leave_thread) (GstTask *task, GThread *thread, gpointer user_data);
++ /*< private >*/
++ gpointer _gst_reserved[GST_PADDING];
++} GstTaskThreadCallbacks;
++
++/**
+ * GstTask:
+ * @state: the state of the task
+ * @cond: used to pause/resume the task
+@@ -138,17 +159,17 @@
+ /* thread this task is currently running in */
+ GThread *thread;
+ } ABI;
+- /* adding + 0 to mark ABI change to be undone later */
+- gpointer _gst_reserved[GST_PADDING + 0];
++ gpointer _gst_reserved[GST_PADDING - 1];
+ } abidata;
+
++ GstTaskPrivate *priv;
+ };
+
+ struct _GstTaskClass {
+ GstObjectClass parent_class;
+
+ /*< private >*/
+- GThreadPool *pool;
++ GstTaskPool *pool;
+
+ /*< private >*/
+ gpointer _gst_reserved[GST_PADDING];
+@@ -160,8 +181,18 @@
+
+ GstTask* gst_task_create (GstTaskFunction func, gpointer data);
+ void gst_task_set_lock (GstTask *task, GStaticRecMutex *mutex);
++void gst_task_set_priority (GstTask *task, GThreadPriority priority);
++
++GstTaskPool * gst_task_get_pool (GstTask *task);
++void gst_task_set_pool (GstTask *task, GstTaskPool *pool);
++
++void gst_task_set_thread_callbacks (GstTask *task,
++ GstTaskThreadCallbacks *callbacks,
++ gpointer user_data,
++ GDestroyNotify notify);
+
+ GstTaskState gst_task_get_state (GstTask *task);
++gboolean gst_task_set_state (GstTask *task, GstTaskState state);
+
+ gboolean gst_task_start (GstTask *task);
+ gboolean gst_task_stop (GstTask *task);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gsttaskpool.c gstreamer-0.10.23/gst/gsttaskpool.c
+--- gstreamer-0.10.23.orig/gst/gsttaskpool.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/gst/gsttaskpool.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,271 @@
++/* GStreamer
++ * Copyright (C) 2009 Wim Taymans <wim.taymans@gmail.com>
++ *
++ * gsttaskpool.c: Pool for streaming threads
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++/**
++ * SECTION:gsttaskpool
++ * @short_description: Pool of GStreamer streaming threads
++ * @see_also: #GstTask, #GstPad
++ *
++ * This object provides an abstraction for creating threads. The default
++ * implementation uses a regular GThreadPool to start tasks.
++ *
++ * Subclasses can be made to create custom threads.
++ *
++ * Last reviewed on 2009-04-23 (0.10.24)
++ */
++
++#include "gst_private.h"
++
++#include "gstinfo.h"
++#include "gsttaskpool.h"
++
++GST_DEBUG_CATEGORY_STATIC (taskpool_debug);
++#define GST_CAT_DEFAULT (taskpool_debug)
++
++static void gst_task_pool_class_init (GstTaskPoolClass * klass);
++static void gst_task_pool_init (GstTaskPool * pool);
++static void gst_task_pool_finalize (GObject * object);
++
++#define _do_init \
++{ \
++ GST_DEBUG_CATEGORY_INIT (taskpool_debug, "taskpool", 0, "Thread pool"); \
++}
++
++G_DEFINE_TYPE_WITH_CODE (GstTaskPool, gst_task_pool, GST_TYPE_OBJECT, _do_init);
++
++typedef struct
++{
++ GstTaskPoolFunction func;
++ gpointer user_data;
++} TaskData;
++
++static void
++default_func (TaskData * tdata, GstTaskPool * pool)
++{
++ GstTaskPoolFunction func;
++ gpointer user_data;
++
++ func = tdata->func;
++ user_data = tdata->user_data;
++ g_slice_free (TaskData, tdata);
++
++ func (user_data);
++}
++
++static void
++default_prepare (GstTaskPool * pool, GError ** error)
++{
++ GST_OBJECT_LOCK (pool);
++ pool->pool = g_thread_pool_new ((GFunc) default_func, pool, -1, FALSE, NULL);
++ GST_OBJECT_UNLOCK (pool);
++}
++
++static void
++default_cleanup (GstTaskPool * pool)
++{
++ GST_OBJECT_LOCK (pool);
++ if (pool->pool) {
++ /* Shut down all the threads, we still process the ones scheduled
++ * because the unref happens in the thread function.
++ * Also wait for currently running ones to finish. */
++ g_thread_pool_free (pool->pool, FALSE, TRUE);
++ pool->pool = NULL;
++ }
++ GST_OBJECT_UNLOCK (pool);
++}
++
++static gpointer
++default_push (GstTaskPool * pool, GstTaskPoolFunction func,
++ gpointer user_data, GError ** error)
++{
++ TaskData *tdata;
++
++ tdata = g_slice_new (TaskData);
++ tdata->func = func;
++ tdata->user_data = user_data;
++
++ GST_OBJECT_LOCK (pool);
++ if (pool->pool)
++ g_thread_pool_push (pool->pool, tdata, error);
++ else {
++ g_slice_free (TaskData, tdata);
++ }
++ GST_OBJECT_UNLOCK (pool);
++
++ return NULL;
++}
++
++static void
++default_join (GstTaskPool * pool, gpointer id)
++{
++ /* we do nothing here, we can't join from the pools */
++}
++
++static void
++gst_task_pool_class_init (GstTaskPoolClass * klass)
++{
++ GObjectClass *gobject_class;
++ GstTaskPoolClass *gsttaskpool_class;
++
++ gobject_class = (GObjectClass *) klass;
++ gsttaskpool_class = (GstTaskPoolClass *) klass;
++
++ gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_task_pool_finalize);
++
++ gsttaskpool_class->prepare = default_prepare;
++ gsttaskpool_class->cleanup = default_cleanup;
++ gsttaskpool_class->push = default_push;
++ gsttaskpool_class->join = default_join;
++}
++
++static void
++gst_task_pool_init (GstTaskPool * pool)
++{
++}
++
++static void
++gst_task_pool_finalize (GObject * object)
++{
++ GstTaskPool *pool = GST_TASK_POOL (object);
++
++ GST_DEBUG ("taskpool %p finalize", pool);
++
++ G_OBJECT_CLASS (gst_task_pool_parent_class)->finalize (object);
++}
++
++/**
++ * gst_task_pool_new:
++ *
++ * Create a new default task pool. The default task pool will use a regular
++ * GThreadPool for threads.
++ *
++ * Returns: a new #GstTaskPool. gst_object_unref() after usage.
++ */
++GstTaskPool *
++gst_task_pool_new (void)
++{
++ GstTaskPool *pool;
++
++ pool = g_object_new (GST_TYPE_TASK_POOL, NULL);
++
++ return pool;
++}
++
++/**
++ * gst_task_pool_prepare:
++ * @pool: a #GstTaskPool
++ * @error: an error return location
++ *
++ * Prepare the taskpool for accepting gst_task_pool_push() operations.
++ *
++ * MT safe.
++ */
++void
++gst_task_pool_prepare (GstTaskPool * pool, GError ** error)
++{
++ GstTaskPoolClass *klass;
++
++ g_return_if_fail (GST_IS_TASK_POOL (pool));
++
++ klass = GST_TASK_POOL_GET_CLASS (pool);
++
++ if (klass->prepare)
++ klass->prepare (pool, error);
++}
++
++/**
++ * gst_task_pool_cleanup:
++ * @pool: a #GstTaskPool
++ *
++ * Wait for all tasks to be stopped. This is mainly used internally
++ * to ensure proper cleanup of internal data structures in test suites.
++ *
++ * MT safe.
++ */
++void
++gst_task_pool_cleanup (GstTaskPool * pool)
++{
++ GstTaskPoolClass *klass;
++
++ g_return_if_fail (GST_IS_TASK_POOL (pool));
++
++ klass = GST_TASK_POOL_GET_CLASS (pool);
++
++ if (klass->cleanup)
++ klass->cleanup (pool);
++}
++
++/**
++ * gst_task_pool_push:
++ * @pool: a #GstTaskPool
++ * @func: the function to call
++ * @user_data: data to pass to @func
++ * @error: return location for an error
++ *
++ * Start the execution of a new thread from @pool.
++ *
++ * Returns: a pointer that should be used for the gst_task_pool_join
++ * function. This pointer can be NULL, you must check @error to detect
++ * errors.
++ */
++gpointer
++gst_task_pool_push (GstTaskPool * pool, GstTaskPoolFunction func,
++ gpointer user_data, GError ** error)
++{
++ GstTaskPoolClass *klass;
++
++ g_return_val_if_fail (GST_IS_TASK_POOL (pool), NULL);
++
++ klass = GST_TASK_POOL_GET_CLASS (pool);
++
++ if (klass->push == NULL)
++ goto not_supported;
++
++ return klass->push (pool, func, user_data, error);
++
++ /* ERRORS */
++not_supported:
++ {
++ g_warning ("pushing tasks on pool %p is not supported", pool);
++ return NULL;
++ }
++}
++
++/**
++ * gst_task_pool_join:
++ * @pool: a #GstTaskPool
++ * @id: the id
++ *
++ * Join a task and/or return it to the pool. @id is the id obtained from
++ * gst_task_pool_push().
++ */
++void
++gst_task_pool_join (GstTaskPool * pool, gpointer id)
++{
++ GstTaskPoolClass *klass;
++
++ g_return_if_fail (GST_IS_TASK_POOL (pool));
++
++ klass = GST_TASK_POOL_GET_CLASS (pool);
++
++ if (klass->join)
++ klass->join (pool, id);
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gsttaskpool.h gstreamer-0.10.23/gst/gsttaskpool.h
+--- gstreamer-0.10.23.orig/gst/gsttaskpool.h 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/gst/gsttaskpool.h 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,95 @@
++/* GStreamer
++ * Copyright (C) <2009> Wim Taymans <wim.taymans@gmail.com>
++ *
++ * gsttaskpool.h: Pool for creating streaming threads
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#ifndef __GST_TASK_POOL_H__
++#define __GST_TASK_POOL_H__
++
++#include <gst/gstobject.h>
++
++G_BEGIN_DECLS
++
++/* --- standard type macros --- */
++#define GST_TYPE_TASK_POOL (gst_task_pool_get_type ())
++#define GST_TASK_POOL(pool) (G_TYPE_CHECK_INSTANCE_CAST ((pool), GST_TYPE_TASK_POOL, GstTaskPool))
++#define GST_IS_TASK_POOL(pool) (G_TYPE_CHECK_INSTANCE_TYPE ((pool), GST_TYPE_TASK_POOL))
++#define GST_TASK_POOL_CLASS(pclass) (G_TYPE_CHECK_CLASS_CAST ((pclass), GST_TYPE_TASK_POOL, GstTaskPoolClass))
++#define GST_IS_TASK_POOL_CLASS(pclass) (G_TYPE_CHECK_CLASS_TYPE ((pclass), GST_TYPE_TASK_POOL))
++#define GST_TASK_POOL_GET_CLASS(pool) (G_TYPE_INSTANCE_GET_CLASS ((pool), GST_TYPE_TASK_POOL, GstTaskPoolClass))
++#define GST_TASK_POOL_CAST(pool) ((GstTaskPool*)(pool))
++
++typedef struct _GstTaskPool GstTaskPool;
++typedef struct _GstTaskPoolClass GstTaskPoolClass;
++
++typedef void (*GstTaskPoolFunction) (void *data);
++
++/**
++ * GstTaskPool:
++ *
++ * The #GstTaskPool object.
++ */
++struct _GstTaskPool {
++ GstObject object;
++
++ /*< private >*/
++ GThreadPool *pool;
++
++ gpointer _gst_reserved[GST_PADDING];
++};
++
++/**
++ * GstTaskPoolClass:
++ * @parent_class: the parent class structure
++ * @prepare: prepare the threadpool
++ * @cleanup: make sure all threads are stopped
++ * @push: start a new thread
++ * @join: join a thread
++ *
++ * The #GstTaskPoolClass object.
++ */
++struct _GstTaskPoolClass {
++ GstObjectClass parent_class;
++
++ /*< public >*/
++ void (*prepare) (GstTaskPool *pool, GError **error);
++ void (*cleanup) (GstTaskPool *pool);
++
++ gpointer (*push) (GstTaskPool *pool, GstTaskPoolFunction func,
++ gpointer user_data, GError **error);
++ void (*join) (GstTaskPool *pool, gpointer id);
++
++ /*< private >*/
++ gpointer _gst_reserved[GST_PADDING];
++};
++
++GType gst_task_pool_get_type (void);
++
++GstTaskPool * gst_task_pool_new (void);
++void gst_task_pool_prepare (GstTaskPool *pool, GError **error);
++
++gpointer gst_task_pool_push (GstTaskPool *pool, GstTaskPoolFunction func,
++ gpointer user_data, GError **error);
++void gst_task_pool_join (GstTaskPool *pool, gpointer id);
++
++void gst_task_pool_cleanup (GstTaskPool *pool);
++
++G_END_DECLS
++
++#endif /* __GST_TASK_POOL_H__ */
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gsturi.c gstreamer-0.10.23/gst/gsturi.c
+--- gstreamer-0.10.23.orig/gst/gsturi.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gsturi.c 2009-06-11 14:19:59.000000000 +0200
+@@ -447,7 +447,7 @@
+ #endif
+
+ GST_LOG ("extracted location '%s' from URI '%s'", GST_STR_NULL (unescaped),
+- uri);;
++ uri);
+ return unescaped;
+ }
+
+@@ -643,8 +643,13 @@
+
+ iface = GST_URI_HANDLER_GET_INTERFACE (handler);
+ g_return_val_if_fail (iface != NULL, GST_URI_UNKNOWN);
+- g_return_val_if_fail (iface->get_type != NULL, GST_URI_UNKNOWN);
+- ret = iface->get_type ();
++ g_return_val_if_fail (iface->get_type != NULL
++ || iface->get_type_full != NULL, GST_URI_UNKNOWN);
++
++ if (iface->get_type != NULL)
++ ret = iface->get_type ();
++ else
++ ret = iface->get_type_full (G_OBJECT_TYPE (handler));
+ g_return_val_if_fail (GST_URI_TYPE_IS_VALID (ret), GST_URI_UNKNOWN);
+
+ return ret;
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstutils.c gstreamer-0.10.23/gst/gstutils.c
+--- gstreamer-0.10.23.orig/gst/gstutils.c 2009-04-16 01:49:39.000000000 +0200
++++ gstreamer-0.10.23/gst/gstutils.c 2009-06-11 14:19:59.000000000 +0200
+@@ -264,7 +264,7 @@
+ }
+
+ static guint64
+-gst_util_uint64_scale_int64 (guint64 val, guint64 num, guint64 denom)
++gst_util_uint64_scale_int64_unchecked (guint64 val, guint64 num, guint64 denom)
+ {
+ GstUInt64 a0, a1, b0, b1, c0, ct, c1, result;
+ GstUInt64 v, n;
+@@ -296,7 +296,7 @@
+ c1.ll = (guint64) a1.l.high + b0.l.high + ct.l.high + b1.ll;
+
+ /* if high bits bigger than denom, we overflow */
+- if (c1.ll >= denom)
++ if (G_UNLIKELY (c1.ll >= denom))
+ goto overflow;
+
+ /* shortcut for division by 1, c1.ll should be 0 because of the
+@@ -326,6 +326,36 @@
+ }
+ }
+
++static inline guint64
++gst_util_uint64_scale_int_unchecked (guint64 val, gint num, gint denom)
++{
++ GstUInt64 result;
++ GstUInt64 low, high;
++
++ /* do 96 bits mult/div */
++ low.ll = val;
++ result.ll = ((guint64) low.l.low) * num;
++ high.ll = ((guint64) low.l.high) * num + (result.l.high);
++
++ low.ll = high.ll / denom;
++ result.l.high = high.ll % denom;
++ result.ll /= denom;
++
++ /* avoid overflow */
++ if (G_UNLIKELY (low.ll + result.l.high > G_MAXUINT32))
++ goto overflow;
++
++ result.l.high += low.l.low;
++
++ return result.ll;
++
++overflow:
++ {
++ return G_MAXUINT64;
++ }
++}
++
++
+ /**
+ * gst_util_uint64_scale:
+ * @val: the number to scale
+@@ -344,33 +374,33 @@
+ {
+ g_return_val_if_fail (denom != 0, G_MAXUINT64);
+
+- if (num == 0)
++ if (G_UNLIKELY (num == 0))
+ return 0;
+
+- if (num == 1 && denom == 1)
++ if (G_UNLIKELY (num == denom))
+ return val;
+
+ /* if the denom is high, we need to do a 64 muldiv */
+- if (denom > G_MAXINT32)
++ if (G_UNLIKELY (denom > G_MAXINT32))
+ goto do_int64;
+
+ /* if num and denom are low we can do a 32 bit muldiv */
+- if (num <= G_MAXINT32)
++ if (G_LIKELY (num <= G_MAXINT32))
+ goto do_int32;
+
+ /* val and num are high, we need 64 muldiv */
+- if (val > G_MAXINT32)
++ if (G_UNLIKELY (val > G_MAXINT32))
+ goto do_int64;
+
+ /* val is low and num is high, we can swap them and do 32 muldiv */
+- return gst_util_uint64_scale_int (num, (gint) val, (gint) denom);
++ return gst_util_uint64_scale_int_unchecked (num, (gint) val, (gint) denom);
+
+ do_int32:
+- return gst_util_uint64_scale_int (val, (gint) num, (gint) denom);
++ return gst_util_uint64_scale_int_unchecked (val, (gint) num, (gint) denom);
+
+ do_int64:
+ /* to the more heavy implementations... */
+- return gst_util_uint64_scale_int64 (val, num, denom);
++ return gst_util_uint64_scale_int64_unchecked (val, num, denom);
+ }
+
+ /**
+@@ -390,43 +420,20 @@
+ guint64
+ gst_util_uint64_scale_int (guint64 val, gint num, gint denom)
+ {
+- GstUInt64 result;
+- GstUInt64 low, high;
+-
+ g_return_val_if_fail (denom > 0, G_MAXUINT64);
+ g_return_val_if_fail (num >= 0, G_MAXUINT64);
+
+- if (num == 0)
++ if (G_UNLIKELY (num == 0))
+ return 0;
+
+- if (num == 1 && denom == 1)
++ if (G_UNLIKELY (num == denom))
+ return val;
+
+ if (val <= G_MAXUINT32)
+ /* simple case */
+ return val * num / denom;
+
+- /* do 96 bits mult/div */
+- low.ll = val;
+- result.ll = ((guint64) low.l.low) * num;
+- high.ll = ((guint64) low.l.high) * num + (result.l.high);
+-
+- low.ll = high.ll / denom;
+- result.l.high = high.ll % denom;
+- result.ll /= denom;
+-
+- /* avoid overflow */
+- if (low.ll + result.l.high > G_MAXUINT32)
+- goto overflow;
+-
+- result.l.high += low.l.low;
+-
+- return result.ll;
+-
+-overflow:
+- {
+- return G_MAXUINT64;
+- }
++ return gst_util_uint64_scale_int_unchecked (val, num, denom);
+ }
+
+ /**
+@@ -3081,11 +3088,9 @@
+ g_return_if_fail (list != NULL);
+
+ gst_pad_push_event (pad, gst_event_new_tag (gst_tag_list_copy (list)));
+- /* FIXME 0.11: Set the pad as source to make it possible to detect for
+- * which pad the tags are actually found.
+- */
++ /* FIXME 0.11: Set the pad as source. */
+ gst_element_post_message (element,
+- gst_message_new_tag (GST_OBJECT (element), list));
++ gst_message_new_tag_full (GST_OBJECT (element), pad, list));
+ }
+
+ static void
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstutils.h gstreamer-0.10.23/gst/gstutils.h
+--- gstreamer-0.10.23.orig/gst/gstutils.h 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/gst/gstutils.h 2009-06-11 14:19:59.000000000 +0200
+@@ -268,10 +268,10 @@
+
+ /* Define PUT and GET functions for unaligned memory */
+ #define _GST_GET(__data, __idx, __size, __shift) \
+- (((guint##__size) (((guint8 *) (__data))[__idx])) << __shift)
++ (((guint##__size) (((guint8 *) (__data))[__idx])) << (__shift))
+
+ #define _GST_PUT(__data, __idx, __size, __shift, __num) \
+- (((guint8 *) (__data))[__idx] = (((guint##__size) __num) >> __shift) & 0xff)
++ (((guint8 *) (__data))[__idx] = (((guint##__size) (__num)) >> (__shift)) & 0xff)
+
+ /**
+ * GST_READ_UINT64_BE:
+@@ -514,6 +514,8 @@
+ *
+ * Swap byte order of a 32-bit floating point value (float).
+ *
++ * Returns: @in byte-swapped.
++ *
+ * Since: 0.10.22
+ *
+ */
+@@ -541,6 +543,8 @@
+ *
+ * Swap byte order of a 64-bit floating point value (double).
+ *
++ * Returns: @in byte-swapped.
++ *
+ * Since: 0.10.22
+ *
+ */
+@@ -673,6 +677,8 @@
+ *
+ * Read a 32 bit float value in little endian format from the memory buffer.
+ *
++ * Returns: The floating point value read from @data
++ *
+ * Since: 0.10.22
+ *
+ */
+@@ -699,6 +705,8 @@
+ *
+ * Read a 32 bit float value in big endian format from the memory buffer.
+ *
++ * Returns: The floating point value read from @data
++ *
+ * Since: 0.10.22
+ *
+ */
+@@ -725,6 +733,8 @@
+ *
+ * Read a 64 bit double value in little endian format from the memory buffer.
+ *
++ * Returns: The double-precision floating point value read from @data
++ *
+ * Since: 0.10.22
+ *
+ */
+@@ -751,6 +761,8 @@
+ *
+ * Read a 64 bit double value in big endian format from the memory buffer.
+ *
++ * Returns: The double-precision floating point value read from @data
++ *
+ * Since: 0.10.22
+ *
+ */
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstvalue.c gstreamer-0.10.23/gst/gstvalue.c
+--- gstreamer-0.10.23.orig/gst/gstvalue.c 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/gstvalue.c 2009-06-11 14:19:59.000000000 +0200
+@@ -68,6 +68,7 @@
+ };
+
+ static GArray *gst_value_table;
++static GHashTable *gst_value_hash;
+ static GArray *gst_value_union_funcs;
+ static GArray *gst_value_intersect_funcs;
+ static GArray *gst_value_subtract_funcs;
+@@ -80,6 +81,10 @@
+ static gint gst_value_compare_with_func (const GValue * value1,
+ const GValue * value2, GstValueCompareFunc compare);
+
++static gchar *gst_string_wrap (const gchar * s);
++static gchar *gst_string_take_and_wrap (gchar * s);
++static gchar *gst_string_unwrap (const gchar * s);
++
+ /********
+ * list *
+ ********/
+@@ -973,10 +978,13 @@
+ gst_value_init_fraction_range (GValue * value)
+ {
+ GValue *vals;
++ GType ftype;
++
++ ftype = GST_TYPE_FRACTION;
+
+- value->data[0].v_pointer = vals = g_new0 (GValue, 2);
+- g_value_init (&vals[0], GST_TYPE_FRACTION);
+- g_value_init (&vals[1], GST_TYPE_FRACTION);
++ value->data[0].v_pointer = vals = g_slice_alloc0 (2 * sizeof (GValue));
++ g_value_init (&vals[0], ftype);
++ g_value_init (&vals[1], ftype);
+ }
+
+ static void
+@@ -987,7 +995,7 @@
+ if (vals != NULL) {
+ g_value_unset (&vals[0]);
+ g_value_unset (&vals[1]);
+- g_free (vals);
++ g_slice_free1 (2 * sizeof (GValue), vals);
+ value->data[0].v_pointer = NULL;
+ }
+ }
+@@ -999,12 +1007,9 @@
+ GValue *src_vals = (GValue *) src_value->data[0].v_pointer;
+
+ if (vals == NULL) {
+- dest_value->data[0].v_pointer = vals = g_new0 (GValue, 2);
+- g_return_if_fail (vals != NULL);
+- g_value_init (&vals[0], GST_TYPE_FRACTION);
+- g_value_init (&vals[1], GST_TYPE_FRACTION);
++ gst_value_init_fraction_range (dest_value);
++ vals = dest_value->data[0].v_pointer;
+ }
+-
+ if (src_vals != NULL) {
+ g_value_copy (&src_vals[0], &vals[0]);
+ g_value_copy (&src_vals[1], &vals[1]);
+@@ -1021,12 +1026,8 @@
+ return g_strdup_printf ("not enough value locations for `%s' passed",
+ G_VALUE_TYPE_NAME (value));
+ if (vals == NULL) {
+- value->data[0].v_pointer = vals = g_new0 (GValue, 2);
+- if (vals == NULL)
+- return g_strdup_printf ("Could not initialise`%s' during collect",
+- G_VALUE_TYPE_NAME (value));
+- g_value_init (&vals[0], GST_TYPE_FRACTION);
+- g_value_init (&vals[1], GST_TYPE_FRACTION);
++ gst_value_init_fraction_range (value);
++ vals = value->data[0].v_pointer;
+ }
+
+ gst_value_set_fraction (&vals[0], collect_values[0].v_int,
+@@ -1045,26 +1046,26 @@
+ int *dest_values[4];
+ GValue *vals = (GValue *) value->data[0].v_pointer;
+
+- if (n_collect_values != 4)
++ if (G_UNLIKELY (n_collect_values != 4))
+ return g_strdup_printf ("not enough value locations for `%s' passed",
+ G_VALUE_TYPE_NAME (value));
+
+ for (i = 0; i < 4; i++) {
+- if (collect_values[i].v_pointer == NULL) {
++ if (G_UNLIKELY (collect_values[i].v_pointer == NULL)) {
+ return g_strdup_printf ("value location for `%s' passed as NULL",
+ G_VALUE_TYPE_NAME (value));
+ }
+ dest_values[i] = collect_values[i].v_pointer;
+ }
+
+- if (vals == NULL) {
++ if (G_UNLIKELY (vals == NULL)) {
+ return g_strdup_printf ("Uninitialised `%s' passed",
+ G_VALUE_TYPE_NAME (value));
+ }
+
+ dest_values[0][0] = gst_value_get_fraction_numerator (&vals[0]);
+ dest_values[1][0] = gst_value_get_fraction_denominator (&vals[0]);
+- dest_values[2][0] = gst_value_get_fraction_denominator (&vals[1]);
++ dest_values[2][0] = gst_value_get_fraction_numerator (&vals[1]);
+ dest_values[3][0] = gst_value_get_fraction_denominator (&vals[1]);
+ return NULL;
+ }
+@@ -1087,11 +1088,9 @@
+
+ vals = (GValue *) value->data[0].v_pointer;
+ if (vals == NULL) {
+- value->data[0].v_pointer = vals = g_new0 (GValue, 2);
+- g_value_init (&vals[0], GST_TYPE_FRACTION);
+- g_value_init (&vals[1], GST_TYPE_FRACTION);
++ gst_value_init_fraction_range (value);
++ vals = value->data[0].v_pointer;
+ }
+-
+ g_value_copy (start, &vals[0]);
+ g_value_copy (end, &vals[1]);
+ }
+@@ -1335,7 +1334,7 @@
+ {
+ GstStructure *structure = g_value_get_boxed (value);
+
+- return gst_structure_to_string (structure);
++ return gst_string_take_and_wrap (gst_structure_to_string (structure));
+ }
+
+ static gboolean
+@@ -1343,10 +1342,20 @@
+ {
+ GstStructure *structure;
+
+- structure = gst_structure_from_string (s, NULL);
++ if (*s != '"') {
++ structure = gst_structure_from_string (s, NULL);
++ } else {
++ gchar *str = gst_string_unwrap (s);
++
++ if (G_UNLIKELY (!str))
++ return FALSE;
++
++ structure = gst_structure_from_string (str, NULL);
++ g_free (str);
++ }
+
+- if (structure) {
+- g_value_set_boxed (dest, structure);
++ if (G_LIKELY (structure)) {
++ g_value_take_boxed (dest, structure);
+ return TRUE;
+ }
+ return FALSE;
+@@ -1777,54 +1786,51 @@
+ }
+ }
+
+-/* keep in sync with gststructure.c */
+-#define GST_ASCII_IS_STRING(c) (g_ascii_isalnum((c)) || ((c) == '_') || \
+- ((c) == '-') || ((c) == '+') || ((c) == '/') || ((c) == ':') || \
+- ((c) == '.'))
+-
+-static gchar *
+-gst_string_wrap (const gchar * s)
++static int
++gst_string_measure_wrapping (const gchar * s)
+ {
+- const gchar *t;
+ int len;
+- gchar *d, *e;
+ gboolean wrap = FALSE;
+
++ if (s == NULL)
++ return -1;
++
+ len = 0;
+- t = s;
+- if (!s)
+- return NULL;
+- while (*t) {
+- if (GST_ASCII_IS_STRING (*t)) {
++ while (*s) {
++ if (GST_ASCII_IS_STRING (*s)) {
+ len++;
+- } else if (*t < 0x20 || *t >= 0x7f) {
++ } else if (*s < 0x20 || *s >= 0x7f) {
+ wrap = TRUE;
+ len += 4;
+ } else {
+ wrap = TRUE;
+ len += 2;
+ }
+- t++;
++ s++;
+ }
+
+- if (!wrap)
+- return g_strdup (s);
++ return wrap ? len : -1;
++}
++
++static gchar *
++gst_string_wrap_inner (const gchar * s, int len)
++{
++ gchar *d, *e;
+
+ e = d = g_malloc (len + 3);
+
+ *e++ = '\"';
+- t = s;
+- while (*t) {
+- if (GST_ASCII_IS_STRING (*t)) {
+- *e++ = *t++;
+- } else if (*t < 0x20 || *t >= 0x7f) {
++ while (*s) {
++ if (GST_ASCII_IS_STRING (*s)) {
++ *e++ = *s++;
++ } else if (*s < 0x20 || *s >= 0x7f) {
+ *e++ = '\\';
+- *e++ = '0' + ((*(guchar *) t) >> 6);
+- *e++ = '0' + (((*t) >> 3) & 0x7);
+- *e++ = '0' + ((*t++) & 0x7);
++ *e++ = '0' + ((*(guchar *) s) >> 6);
++ *e++ = '0' + (((*s) >> 3) & 0x7);
++ *e++ = '0' + ((*s++) & 0x7);
+ } else {
+ *e++ = '\\';
+- *e++ = *t++;
++ *e++ = *s++;
+ }
+ }
+ *e++ = '\"';
+@@ -1833,6 +1839,34 @@
+ return d;
+ }
+
++/* Do string wrapping/escaping */
++static gchar *
++gst_string_wrap (const gchar * s)
++{
++ int len = gst_string_measure_wrapping (s);
++
++ if (len < 0)
++ return g_strdup (s);
++
++ return gst_string_wrap_inner (s, len);
++}
++
++/* Same as above, but take ownership of the string */
++static gchar *
++gst_string_take_and_wrap (gchar * s)
++{
++ gchar *out;
++ int len = gst_string_measure_wrapping (s);
++
++ if (len < 0)
++ return s;
++
++ out = gst_string_wrap_inner (s, len);
++ g_free (s);
++
++ return out;
++}
++
+ /*
+ * This function takes a string delimited with double quotes (")
+ * and unescapes any \xxx octal numbers.
+@@ -1935,7 +1969,7 @@
+ } else {
+ gchar *str = gst_string_unwrap (s);
+
+- if (!str)
++ if (G_UNLIKELY (!str))
+ return FALSE;
+ g_value_take_string (dest, str);
+ }
+@@ -2598,6 +2632,9 @@
+ guint i, size;
+ GValue subtraction = { 0, };
+ gboolean ret = FALSE;
++ GType ltype;
++
++ ltype = gst_value_list_get_type ();
+
+ size = gst_value_list_get_size (minuend);
+ for (i = 0; i < size; i++) {
+@@ -2607,15 +2644,8 @@
+ if (!ret) {
+ gst_value_init_and_copy (dest, &subtraction);
+ ret = TRUE;
+- } else if (GST_VALUE_HOLDS_LIST (dest)
+- && GST_VALUE_HOLDS_LIST (&subtraction)) {
+- /* unroll */
+- GValue unroll = { 0, };
+-
+- gst_value_init_and_copy (&unroll, dest);
+- g_value_unset (dest);
+- gst_value_list_concat (dest, &unroll, &subtraction);
+- } else if (GST_VALUE_HOLDS_LIST (dest)) {
++ } else if (G_VALUE_HOLDS (dest, ltype)
++ && !G_VALUE_HOLDS (&subtraction, ltype)) {
+ gst_value_list_append_value (dest, &subtraction);
+ } else {
+ GValue temp = { 0, };
+@@ -2762,33 +2792,6 @@
+ * comparison *
+ **************/
+
+-/**
+- * gst_value_can_compare:
+- * @value1: a value to compare
+- * @value2: another value to compare
+- *
+- * Determines if @value1 and @value2 can be compared.
+- *
+- * Returns: TRUE if the values can be compared
+- */
+-gboolean
+-gst_value_can_compare (const GValue * value1, const GValue * value2)
+-{
+- GstValueTable *table;
+- guint i;
+-
+- if (G_VALUE_TYPE (value1) != G_VALUE_TYPE (value2))
+- return FALSE;
+-
+- for (i = 0; i < gst_value_table->len; i++) {
+- table = &g_array_index (gst_value_table, GstValueTable, i);
+- if (g_type_is_a (G_VALUE_TYPE (value1), table->type) && table->compare)
+- return TRUE;
+- }
+-
+- return FALSE;
+-}
+-
+ /*
+ * gst_value_get_compare_func:
+ * @value1: a value to get the compare function for
+@@ -2803,32 +2806,50 @@
+ {
+ GstValueTable *table, *best = NULL;
+ guint i;
++ GType type1;
++ gint key;
++
++ key = type1 = G_VALUE_TYPE (value1);
+
+ /* this is a fast check */
+- for (i = 0; i < gst_value_table->len; i++) {
+- table = &g_array_index (gst_value_table, GstValueTable, i);
+- if (table->type == G_VALUE_TYPE (value1) && table->compare != NULL) {
+- best = table;
+- break;
+- }
+- }
++ best = g_hash_table_lookup (gst_value_hash, GINT_TO_POINTER (key));
++
+ /* slower checks */
+- if (!best) {
++ if (G_UNLIKELY (!best || !best->compare)) {
++ best = NULL;
+ for (i = 0; i < gst_value_table->len; i++) {
+ table = &g_array_index (gst_value_table, GstValueTable, i);
+- if (g_type_is_a (G_VALUE_TYPE (value1), table->type)) {
++ if (table->compare && g_type_is_a (type1, table->type)) {
+ if (!best || g_type_is_a (table->type, best->type))
+ best = table;
+ }
+ }
+ }
+- if (best) {
++ if (G_LIKELY (best))
+ return best->compare;
+- }
++
+ return NULL;
+ }
+
+ /**
++ * gst_value_can_compare:
++ * @value1: a value to compare
++ * @value2: another value to compare
++ *
++ * Determines if @value1 and @value2 can be compared.
++ *
++ * Returns: TRUE if the values can be compared
++ */
++gboolean
++gst_value_can_compare (const GValue * value1, const GValue * value2)
++{
++ if (G_VALUE_TYPE (value1) != G_VALUE_TYPE (value2))
++ return FALSE;
++
++ return gst_value_get_compare_func (value1) != NULL;
++}
++
++/**
+ * gst_value_compare:
+ * @value1: a value to compare
+ * @value2: another value to compare
+@@ -3001,19 +3022,23 @@
+ {
+ GstValueIntersectInfo *intersect_info;
+ guint i;
++ GType ltype, type1, type2;
++
++ ltype = gst_value_list_get_type ();
+
+ /* special cases */
+- if (GST_VALUE_HOLDS_LIST (value1) || GST_VALUE_HOLDS_LIST (value2))
++ if (G_VALUE_HOLDS (value1, ltype) || G_VALUE_HOLDS (value2, ltype))
+ return TRUE;
+
++ type1 = G_VALUE_TYPE (value1);
++ type2 = G_VALUE_TYPE (value2);
++
+ for (i = 0; i < gst_value_intersect_funcs->len; i++) {
+ intersect_info = &g_array_index (gst_value_intersect_funcs,
+ GstValueIntersectInfo, i);
+- if (intersect_info->type1 == G_VALUE_TYPE (value1) &&
+- intersect_info->type2 == G_VALUE_TYPE (value2))
+- if (intersect_info->type2 == G_VALUE_TYPE (value1) &&
+- intersect_info->type1 == G_VALUE_TYPE (value2))
+- return TRUE;
++ if (intersect_info->type1 == intersect_info->type2 &&
++ intersect_info->type1 == type1 && intersect_info->type2 == type2)
++ return TRUE;
+ }
+
+ return gst_value_can_compare (value1, value2);
+@@ -3039,35 +3064,35 @@
+ {
+ GstValueIntersectInfo *intersect_info;
+ guint i;
+- gboolean ret = FALSE;
++ GType ltype, type1, type2;
++
++ ltype = gst_value_list_get_type ();
+
+ /* special cases first */
+- if (GST_VALUE_HOLDS_LIST (value1))
++ if (G_VALUE_HOLDS (value1, ltype))
+ return gst_value_intersect_list (dest, value1, value2);
+- if (GST_VALUE_HOLDS_LIST (value2))
++ if (G_VALUE_HOLDS (value2, ltype))
+ return gst_value_intersect_list (dest, value2, value1);
+
++ if (gst_value_compare (value1, value2) == GST_VALUE_EQUAL) {
++ gst_value_init_and_copy (dest, value1);
++ return TRUE;
++ }
++
++ type1 = G_VALUE_TYPE (value1);
++ type2 = G_VALUE_TYPE (value2);
++
+ for (i = 0; i < gst_value_intersect_funcs->len; i++) {
+ intersect_info = &g_array_index (gst_value_intersect_funcs,
+ GstValueIntersectInfo, i);
+- if (intersect_info->type1 == G_VALUE_TYPE (value1) &&
+- intersect_info->type2 == G_VALUE_TYPE (value2)) {
+- ret = intersect_info->func (dest, value1, value2);
+- return ret;
++ if (intersect_info->type1 == type1 && intersect_info->type2 == type2) {
++ return intersect_info->func (dest, value1, value2);
+ }
+- if (intersect_info->type1 == G_VALUE_TYPE (value2) &&
+- intersect_info->type2 == G_VALUE_TYPE (value1)) {
+- ret = intersect_info->func (dest, value2, value1);
+- return ret;
++ if (intersect_info->type1 == type2 && intersect_info->type2 == type1) {
++ return intersect_info->func (dest, value2, value1);
+ }
+ }
+-
+- if (gst_value_compare (value1, value2) == GST_VALUE_EQUAL) {
+- gst_value_init_and_copy (dest, value1);
+- ret = TRUE;
+- }
+-
+- return ret;
++ return FALSE;
+ }
+
+ /**
+@@ -3117,17 +3142,22 @@
+ {
+ GstValueSubtractInfo *info;
+ guint i;
++ GType ltype, mtype, stype;
++
++ ltype = gst_value_list_get_type ();
+
+ /* special cases first */
+- if (GST_VALUE_HOLDS_LIST (minuend))
++ if (G_VALUE_HOLDS (minuend, ltype))
+ return gst_value_subtract_from_list (dest, minuend, subtrahend);
+- if (GST_VALUE_HOLDS_LIST (subtrahend))
++ if (G_VALUE_HOLDS (subtrahend, ltype))
+ return gst_value_subtract_list (dest, minuend, subtrahend);
+
++ mtype = G_VALUE_TYPE (minuend);
++ stype = G_VALUE_TYPE (subtrahend);
++
+ for (i = 0; i < gst_value_subtract_funcs->len; i++) {
+ info = &g_array_index (gst_value_subtract_funcs, GstValueSubtractInfo, i);
+- if (info->minuend == G_VALUE_TYPE (minuend) &&
+- info->subtrahend == G_VALUE_TYPE (subtrahend)) {
++ if (info->minuend == mtype && info->subtrahend == stype) {
+ return info->func (dest, minuend, subtrahend);
+ }
+ }
+@@ -3168,15 +3198,20 @@
+ {
+ GstValueSubtractInfo *info;
+ guint i;
++ GType ltype, mtype, stype;
++
++ ltype = gst_value_list_get_type ();
+
+ /* special cases */
+- if (GST_VALUE_HOLDS_LIST (minuend) || GST_VALUE_HOLDS_LIST (subtrahend))
++ if (G_VALUE_HOLDS (minuend, ltype) || G_VALUE_HOLDS (subtrahend, ltype))
+ return TRUE;
+
++ mtype = G_VALUE_TYPE (minuend);
++ stype = G_VALUE_TYPE (subtrahend);
++
+ for (i = 0; i < gst_value_subtract_funcs->len; i++) {
+ info = &g_array_index (gst_value_subtract_funcs, GstValueSubtractInfo, i);
+- if (info->minuend == G_VALUE_TYPE (minuend) &&
+- info->subtrahend == G_VALUE_TYPE (subtrahend))
++ if (info->minuend == mtype && info->subtrahend == stype)
+ return TRUE;
+ }
+
+@@ -3218,12 +3253,23 @@
+ * @table: structure containing functions to register
+ *
+ * Registers functions to perform calculations on #GValues of a given
+- * type.
++ * type. Each type can only be added once.
+ */
+ void
+ gst_value_register (const GstValueTable * table)
+ {
++ GstValueTable *found;
++ gint key;
++
+ g_array_append_val (gst_value_table, *table);
++
++ key = table->type;
++
++ found = g_hash_table_lookup (gst_value_hash, GINT_TO_POINTER (key));
++ if (found)
++ g_warning ("adding type %d multiple times", key);
++
++ g_hash_table_insert (gst_value_hash, GINT_TO_POINTER (key), (gpointer) table);
+ }
+
+ /**
+@@ -3255,25 +3301,28 @@
+ {
+ guint i;
+ GValue s_val = { 0 };
+- GstValueTable *table, *best = NULL;
++ GstValueTable *table, *best;
+ char *s;
++ GType type;
++ gint key;
+
+ g_return_val_if_fail (G_IS_VALUE (value), NULL);
+
+- for (i = 0; i < gst_value_table->len; i++) {
+- table = &g_array_index (gst_value_table, GstValueTable, i);
+- if (table->serialize == NULL)
+- continue;
+- if (table->type == G_VALUE_TYPE (value)) {
+- best = table;
+- break;
+- }
+- if (g_type_is_a (G_VALUE_TYPE (value), table->type)) {
+- if (!best || g_type_is_a (table->type, best->type))
+- best = table;
++ key = type = G_VALUE_TYPE (value);
++
++ best = g_hash_table_lookup (gst_value_hash, GINT_TO_POINTER (key));
++
++ if (G_UNLIKELY (!best || !best->serialize)) {
++ best = NULL;
++ for (i = 0; i < gst_value_table->len; i++) {
++ table = &g_array_index (gst_value_table, GstValueTable, i);
++ if (table->serialize && g_type_is_a (type, table->type)) {
++ if (!best || g_type_is_a (table->type, best->type))
++ best = table;
++ }
+ }
+ }
+- if (best)
++ if (G_LIKELY (best))
+ return best->serialize (value);
+
+ g_value_init (&s_val, G_TYPE_STRING);
+@@ -3300,30 +3349,30 @@
+ gboolean
+ gst_value_deserialize (GValue * dest, const gchar * src)
+ {
+- GstValueTable *table, *best = NULL;
++ GstValueTable *table, *best;
+ guint i;
++ GType type;
++ gint key;
+
+ g_return_val_if_fail (src != NULL, FALSE);
+ g_return_val_if_fail (G_IS_VALUE (dest), FALSE);
+
+- for (i = 0; i < gst_value_table->len; i++) {
+- table = &g_array_index (gst_value_table, GstValueTable, i);
+- if (table->serialize == NULL)
+- continue;
++ key = type = G_VALUE_TYPE (dest);
+
+- if (table->type == G_VALUE_TYPE (dest)) {
+- best = table;
+- break;
+- }
++ best = g_hash_table_lookup (gst_value_hash, GINT_TO_POINTER (key));
+
+- if (g_type_is_a (G_VALUE_TYPE (dest), table->type)) {
+- if (!best || g_type_is_a (table->type, best->type))
+- best = table;
++ if (G_UNLIKELY (!best || !best->deserialize)) {
++ best = NULL;
++ for (i = 0; i < gst_value_table->len; i++) {
++ table = &g_array_index (gst_value_table, GstValueTable, i);
++ if (table->deserialize && g_type_is_a (type, table->type)) {
++ if (!best || g_type_is_a (table->type, best->type))
++ best = table;
++ }
+ }
+ }
+- if (best) {
++ if (G_LIKELY (best))
+ return best->deserialize (dest, src);
+- }
+
+ return FALSE;
+ }
+@@ -4065,6 +4114,7 @@
+ _gst_value_initialize (void)
+ {
+ gst_value_table = g_array_new (FALSE, FALSE, sizeof (GstValueTable));
++ gst_value_hash = g_hash_table_new (NULL, NULL);
+ gst_value_union_funcs = g_array_new (FALSE, FALSE,
+ sizeof (GstValueUnionInfo));
+ gst_value_intersect_funcs = g_array_new (FALSE, FALSE,
+@@ -4140,7 +4190,7 @@
+ gst_value_deserialize_array,
+ };
+
+- gst_value.type = gst_value_array_get_type ();;
++ gst_value.type = gst_value_array_get_type ();
+ gst_value_register (&gst_value);
+ }
+
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/gstvalue.h gstreamer-0.10.23/gst/gstvalue.h
+--- gstreamer-0.10.23.orig/gst/gstvalue.h 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/gst/gstvalue.h 2009-06-11 14:19:59.000000000 +0200
+@@ -41,7 +41,7 @@
+ * </programlisting>
+ * </informalexample>
+ */
+-#define GST_MAKE_FOURCC(a,b,c,d) (guint32)((a)|(b)<<8|(c)<<16|(d)<<24)
++#define GST_MAKE_FOURCC(a,b,c,d) ((guint32)((a)|(b)<<8|(c)<<16|(d)<<24))
+
+ /**
+ * GST_STR_FOURCC:
+@@ -57,7 +57,7 @@
+ * </programlisting>
+ * </informalexample>
+ */
+-#define GST_STR_FOURCC(f) (guint32)(((f)[0])|((f)[1]<<8)|((f)[2]<<16)|((f)[3]<<24))
++#define GST_STR_FOURCC(f) ((guint32)(((f)[0])|((f)[1]<<8)|((f)[2]<<16)|((f)[3]<<24)))
+
+ /**
+ * GST_FOURCC_FORMAT:
+@@ -91,7 +91,7 @@
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_FOURCC value.
+ */
+-#define GST_VALUE_HOLDS_FOURCC(x) (G_VALUE_HOLDS(x, gst_fourcc_get_type ()))
++#define GST_VALUE_HOLDS_FOURCC(x) (G_VALUE_HOLDS((x), gst_fourcc_get_type ()))
+
+ /**
+ * GST_VALUE_HOLDS_INT_RANGE:
+@@ -99,7 +99,7 @@
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_INT_RANGE value.
+ */
+-#define GST_VALUE_HOLDS_INT_RANGE(x) (G_VALUE_HOLDS(x, gst_int_range_get_type ()))
++#define GST_VALUE_HOLDS_INT_RANGE(x) (G_VALUE_HOLDS((x), gst_int_range_get_type ()))
+
+ /**
+ * GST_VALUE_HOLDS_DOUBLE_RANGE:
+@@ -107,7 +107,7 @@
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_DOUBLE_RANGE value.
+ */
+-#define GST_VALUE_HOLDS_DOUBLE_RANGE(x) (G_VALUE_HOLDS(x, gst_double_range_get_type ()))
++#define GST_VALUE_HOLDS_DOUBLE_RANGE(x) (G_VALUE_HOLDS((x), gst_double_range_get_type ()))
+
+ /**
+ * GST_VALUE_HOLDS_FRACTION_RANGE:
+@@ -115,7 +115,7 @@
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_FRACTION_RANGE value.
+ */
+-#define GST_VALUE_HOLDS_FRACTION_RANGE(x) (G_VALUE_HOLDS(x, gst_fraction_range_get_type ()))
++#define GST_VALUE_HOLDS_FRACTION_RANGE(x) (G_VALUE_HOLDS((x), gst_fraction_range_get_type ()))
+
+ /**
+ * GST_VALUE_HOLDS_LIST:
+@@ -123,7 +123,7 @@
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_LIST value.
+ */
+-#define GST_VALUE_HOLDS_LIST(x) (G_VALUE_HOLDS(x, gst_value_list_get_type ()))
++#define GST_VALUE_HOLDS_LIST(x) (G_VALUE_HOLDS((x), gst_value_list_get_type ()))
+
+ /**
+ * GST_VALUE_HOLDS_ARRAY:
+@@ -131,7 +131,7 @@
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_ARRAY value.
+ */
+-#define GST_VALUE_HOLDS_ARRAY(x) (G_VALUE_HOLDS(x, gst_value_array_get_type ()))
++#define GST_VALUE_HOLDS_ARRAY(x) (G_VALUE_HOLDS((x), gst_value_array_get_type ()))
+
+ /**
+ * GST_VALUE_HOLDS_CAPS:
+@@ -139,7 +139,7 @@
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_CAPS value.
+ */
+-#define GST_VALUE_HOLDS_CAPS(x) (G_VALUE_HOLDS(x, GST_TYPE_CAPS))
++#define GST_VALUE_HOLDS_CAPS(x) (G_VALUE_HOLDS((x), GST_TYPE_CAPS))
+
+ /**
+ * GST_VALUE_HOLDS_STRUCTURE:
+@@ -149,7 +149,7 @@
+ *
+ * Since: 0.10.15
+ */
+-#define GST_VALUE_HOLDS_STRUCTURE(x) (G_VALUE_HOLDS(x, GST_TYPE_STRUCTURE))
++#define GST_VALUE_HOLDS_STRUCTURE(x) (G_VALUE_HOLDS((x), GST_TYPE_STRUCTURE))
+
+ /**
+ * GST_VALUE_HOLDS_BUFFER:
+@@ -157,7 +157,7 @@
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_BUFFER value.
+ */
+-#define GST_VALUE_HOLDS_BUFFER(x) (G_VALUE_HOLDS(x, GST_TYPE_BUFFER))
++#define GST_VALUE_HOLDS_BUFFER(x) (G_VALUE_HOLDS((x), GST_TYPE_BUFFER))
+
+ /**
+ * GST_VALUE_HOLDS_FRACTION:
+@@ -165,7 +165,7 @@
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_FRACTION value.
+ */
+-#define GST_VALUE_HOLDS_FRACTION(x) (G_VALUE_HOLDS(x, gst_fraction_get_type ()))
++#define GST_VALUE_HOLDS_FRACTION(x) (G_VALUE_HOLDS((x), gst_fraction_get_type ()))
+
+ /**
+ * GST_VALUE_HOLDS_DATE:
+@@ -173,7 +173,7 @@
+ *
+ * Checks if the given #GValue contains a #GST_TYPE_DATE value.
+ */
+-#define GST_VALUE_HOLDS_DATE(x) (G_VALUE_HOLDS(x, gst_date_get_type ()))
++#define GST_VALUE_HOLDS_DATE(x) (G_VALUE_HOLDS((x), gst_date_get_type ()))
+
+ /**
+ * GST_TYPE_FOURCC:
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/Makefile.am gstreamer-0.10.23/gst/Makefile.am
+--- gstreamer-0.10.23.orig/gst/Makefile.am 2009-04-15 21:18:16.000000000 +0200
++++ gstreamer-0.10.23/gst/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -9,11 +9,7 @@
+ if GST_DISABLE_REGISTRY
+ GST_REGISTRY_SRC =
+ else
+-if USE_BINARY_REGISTRY
+ GST_REGISTRY_SRC = gstregistrybinary.c
+-else
+-GST_REGISTRY_SRC = gstregistryxml.c
+-endif
+ endif
+
+ if GST_DISABLE_PARSE
+@@ -49,7 +45,7 @@
+
+ EXTRA_libgstreamer_@GST_MAJORMINOR@_la_SOURCES = \
+ gstmarshal.list gsttrace.c gstxml.c \
+- gstregistryxml.c gstregistrybinary.c
++ gstregistrybinary.c
+
+
+ # temporarily not used
+@@ -60,6 +56,7 @@
+ gstobject.c \
+ gstbin.c \
+ gstbuffer.c \
++ gstbufferlist.c \
+ gstbus.c \
+ gstcaps.c \
+ gstchildproxy.c \
+@@ -96,6 +93,7 @@
+ gsttaglist.c \
+ gsttagsetter.c \
+ gsttask.c \
++ gsttaskpool.c \
+ $(GST_TRACE_SRC) \
+ gsttypefind.c \
+ gsttypefindfactory.c \
+@@ -145,6 +143,7 @@
+ gstobject.h \
+ gstbin.h \
+ gstbuffer.h \
++ gstbufferlist.h \
+ gstbus.h \
+ gstcaps.h \
+ gstchildproxy.h \
+@@ -181,6 +180,7 @@
+ gsttaglist.h \
+ gsttagsetter.h \
+ gsttask.h \
++ gsttaskpool.h \
+ gsttrace.h \
+ gsttypefind.h \
+ gsttypefindfactory.h \
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/gst/parse/grammar.y gstreamer-0.10.23/gst/parse/grammar.y
+--- gstreamer-0.10.23.orig/gst/parse/grammar.y 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/gst/parse/grammar.y 2009-06-11 14:19:59.000000000 +0200
+@@ -290,25 +290,44 @@
+ GType value_type;
+
+ if (gst_child_proxy_lookup (GST_OBJECT (set->parent), set->name, &target, &pspec)) {
++ gboolean got_value = FALSE;
++
+ value_type = G_PARAM_SPEC_VALUE_TYPE (pspec);
+
+ GST_CAT_LOG (GST_CAT_PIPELINE, "parsing delayed property %s as a %s from %s", pspec->name,
+ g_type_name (value_type), set->value_str);
+ g_value_init (&v, value_type);
+- if (gst_value_deserialize (&v, set->value_str)) {
+- g_object_set_property (G_OBJECT (target), pspec->name, &v);
++ if (gst_value_deserialize (&v, set->value_str))
++ got_value = TRUE;
++ else if (g_type_is_a (value_type, GST_TYPE_ELEMENT)) {
++ GstElement *bin;
++
++ bin = gst_parse_bin_from_description (set->value_str, TRUE, NULL);
++ if (bin) {
++ g_value_set_object (&v, bin);
++ got_value = TRUE;
++ }
+ }
+ g_signal_handler_disconnect (child_proxy, set->signal_id);
+ g_free(set->name);
+ g_free(set->value_str);
+ g_free(set);
++ if (!got_value)
++ goto error;
++ g_object_set_property (G_OBJECT (target), pspec->name, &v);
+ }
+
++out:
+ if (G_IS_VALUE (&v))
+ g_value_unset (&v);
+ if (target)
+ gst_object_unref (target);
+ return;
++
++error:
++ GST_CAT_ERROR (GST_CAT_PIPELINE, "could not set property \"%s\" in element \"%s\"",
++ pspec->name, GST_ELEMENT_NAME (target));
++ goto out;
+ }
+
+
+@@ -344,11 +363,25 @@
+ gst_parse_unescape (pos);
+
+ if (gst_child_proxy_lookup (GST_OBJECT (element), value, &target, &pspec)) {
++ gboolean got_value = FALSE;
++
+ value_type = G_PARAM_SPEC_VALUE_TYPE (pspec);
++
+ GST_CAT_LOG (GST_CAT_PIPELINE, "parsing property %s as a %s", pspec->name,
+ g_type_name (value_type));
+ g_value_init (&v, value_type);
+- if (!gst_value_deserialize (&v, pos))
++ if (gst_value_deserialize (&v, pos))
++ got_value = TRUE;
++ else if (g_type_is_a (value_type, GST_TYPE_ELEMENT)) {
++ GstElement *bin;
++
++ bin = gst_parse_bin_from_description (pos, TRUE, NULL);
++ if (bin) {
++ g_value_set_object (&v, bin);
++ got_value = TRUE;
++ }
++ }
++ if (!got_value)
+ goto error;
+ g_object_set_property (G_OBJECT (target), pspec->name, &v);
+ } else {
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/libs/gst/base/gstadapter.c gstreamer-0.10.23/libs/gst/base/gstadapter.c
+--- gstreamer-0.10.23.orig/libs/gst/base/gstadapter.c 2009-04-15 21:18:17.000000000 +0200
++++ gstreamer-0.10.23/libs/gst/base/gstadapter.c 2009-06-11 14:19:59.000000000 +0200
+@@ -36,6 +36,10 @@
+ * in chunks of the desired size using gst_adapter_peek(). After the data is
+ * processed, it is freed using gst_adapter_flush().
+ *
++ * Other methods such as gst_adapter_take() and gst_adapter_take_buffer()
++ * combine gst_adapter_peek() and gst_adapter_flush() in one method and are
++ * potentially more convenient for some use cases.
++ *
+ * For example, a sink pad's chain function that needs to pass data to a library
+ * in 512-byte chunks could be implemented like this:
+ * <programlisting>
+@@ -74,11 +78,22 @@
+ * Also check the GST_BUFFER_FLAG_DISCONT flag on the buffer. Some elements might
+ * need to clear the adapter after a discontinuity.
+ *
++ * Since 0.10.24, the adapter will keep track of the timestamps of the buffers
++ * that were pushed. The last seen timestamp before the current position
++ * can be queried with gst_adapter_prev_timestamp(). This function can
++ * optionally return the amount of bytes between the start of the buffer that
++ * carried the timestamp and the current adapter position. The distance is
++ * useful when dealing with, for example, raw audio samples because it allows
++ * you to calculate the timestamp of the current adapter position by using the
++ * last seen timestamp and the amount of bytes since.
++ *
+ * A last thing to note is that while GstAdapter is pretty optimized,
+- * merging buffers still might be an operation that requires a memcpy()
+- * operation, and this operation is not the fastest. Because of this, some
+- * functions like gst_adapter_available_fast() are provided to help speed up
+- * such cases should you want to.
++ * merging buffers still might be an operation that requires a malloc() and
++ * memcpy() operation, and these operations are not the fastest. Because of
++ * this, some functions like gst_adapter_available_fast() are provided to help
++ * speed up such cases should you want to. To avoid repeated memory allocations,
++ * gst_adapter_copy() can be used to copy data into a (statically allocated)
++ * user provided buffer.
+ *
+ * GstAdapter is not MT safe. All operations on an adapter must be serialized by
+ * the caller. This is not normally a problem, however, as the normal use case
+@@ -90,7 +105,7 @@
+ * access the buffer later. The adapter will never modify the data in the
+ * buffer pushed in it.
+ *
+- * Last reviewed on 2006-04-04 (0.10.6).
++ * Last reviewed on 2009-05-13 (0.10.24).
+ */
+
+
+@@ -98,11 +113,20 @@
+ #include <string.h>
+
+ /* default size for the assembled data buffer */
+-#define DEFAULT_SIZE 16
++#define DEFAULT_SIZE 4096
+
+ GST_DEBUG_CATEGORY_STATIC (gst_adapter_debug);
+ #define GST_CAT_DEFAULT gst_adapter_debug
+
++#define GST_ADAPTER_GET_PRIVATE(obj) \
++ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_ADAPTER, GstAdapterPrivate))
++
++struct _GstAdapterPrivate
++{
++ GstClockTime timestamp;
++ guint64 distance;
++};
++
+ #define _do_init(thing) \
+ GST_DEBUG_CATEGORY_INIT (gst_adapter_debug, "adapter", 0, "object to splice and merge buffers to desired size")
+ GST_BOILERPLATE_FULL (GstAdapter, gst_adapter, GObject, G_TYPE_OBJECT,
+@@ -122,6 +146,8 @@
+ {
+ GObjectClass *object = G_OBJECT_CLASS (klass);
+
++ g_type_class_add_private (klass, sizeof (GstAdapterPrivate));
++
+ object->dispose = gst_adapter_dispose;
+ object->finalize = gst_adapter_finalize;
+ }
+@@ -129,8 +155,11 @@
+ static void
+ gst_adapter_init (GstAdapter * adapter, GstAdapterClass * g_class)
+ {
++ adapter->priv = GST_ADAPTER_GET_PRIVATE (adapter);
+ adapter->assembled_data = g_malloc (DEFAULT_SIZE);
+ adapter->assembled_size = DEFAULT_SIZE;
++ adapter->priv->timestamp = GST_CLOCK_TIME_NONE;
++ adapter->priv->distance = 0;
+ }
+
+ static void
+@@ -184,6 +213,58 @@
+ adapter->size = 0;
+ adapter->skip = 0;
+ adapter->assembled_len = 0;
++ adapter->priv->timestamp = GST_CLOCK_TIME_NONE;
++ adapter->priv->distance = 0;
++}
++
++static inline void
++update_timestamp (GstAdapter * adapter, GstBuffer * buf)
++{
++ GstClockTime timestamp;
++
++ timestamp = GST_BUFFER_TIMESTAMP (buf);
++ if (GST_CLOCK_TIME_IS_VALID (timestamp)) {
++ GST_LOG_OBJECT (adapter, "new timestamp %" GST_TIME_FORMAT,
++ GST_TIME_ARGS (timestamp));
++ adapter->priv->timestamp = timestamp;
++ adapter->priv->distance = 0;
++ }
++}
++
++/* copy data into @dest, skipping @skip bytes from the head buffers */
++static void
++copy_into_unchecked (GstAdapter * adapter, guint8 * dest, guint skip,
++ guint size)
++{
++ GSList *g;
++ GstBuffer *buf;
++ guint bsize, csize;
++
++ /* first step, do skipping */
++ g = adapter->buflist;
++ buf = g->data;
++ bsize = GST_BUFFER_SIZE (buf);
++ while (G_UNLIKELY (skip >= bsize)) {
++ skip -= bsize;
++ g = g_slist_next (g);
++ buf = g->data;
++ bsize = GST_BUFFER_SIZE (buf);
++ }
++ /* copy partial buffer */
++ csize = MIN (bsize - skip, size);
++ memcpy (dest, GST_BUFFER_DATA (buf) + skip, csize);
++ size -= csize;
++ dest += csize;
++
++ /* second step, copy remainder */
++ while (size > 0) {
++ g = g_slist_next (g);
++ buf = g->data;
++ csize = MIN (GST_BUFFER_SIZE (buf), size);
++ memcpy (dest, GST_BUFFER_DATA (buf), csize);
++ size -= csize;
++ dest += csize;
++ }
+ }
+
+ /**
+@@ -207,16 +288,18 @@
+ size = GST_BUFFER_SIZE (buf);
+
+ if (G_UNLIKELY (size == 0)) {
++ /* we can't have empty buffers, several parts in this file rely on it, this
++ * has some problems for the timestamp tracking. */
+ GST_LOG_OBJECT (adapter, "discarding empty buffer");
+ gst_buffer_unref (buf);
+ } else {
+-
+ adapter->size += size;
+
+ /* Note: merging buffers at this point is premature. */
+ if (G_UNLIKELY (adapter->buflist == NULL)) {
+ GST_LOG_OBJECT (adapter, "pushing first %u bytes", size);
+ adapter->buflist = adapter->buflist_end = g_slist_append (NULL, buf);
++ update_timestamp (adapter, buf);
+ } else {
+ /* Otherwise append to the end, and advance our end pointer */
+ GST_LOG_OBJECT (adapter, "pushing %u bytes at end, size now %u", size,
+@@ -227,34 +310,6 @@
+ }
+ }
+
+-/* Internal function that copies data into the given buffer, size must be
+- * bigger than the first buffer */
+-static void
+-gst_adapter_peek_into (GstAdapter * adapter, guint8 * data, guint size)
+-{
+- GstBuffer *cur;
+- GSList *cur_list;
+- guint copied, to_copy;
+-
+- /* The first buffer might be partly consumed, so need to handle
+- * 'skipped' bytes. */
+- cur = adapter->buflist->data;
+- copied = MIN (GST_BUFFER_SIZE (cur) - adapter->skip, size);
+- memcpy (data, GST_BUFFER_DATA (cur) + adapter->skip, copied);
+- data += copied;
+-
+- cur_list = g_slist_next (adapter->buflist);
+- while (copied < size) {
+- g_assert (cur_list);
+- cur = cur_list->data;
+- cur_list = g_slist_next (cur_list);
+- to_copy = MIN (GST_BUFFER_SIZE (cur), size - copied);
+- memcpy (data, GST_BUFFER_DATA (cur), to_copy);
+- data += to_copy;
+- copied += to_copy;
+- }
+-}
+-
+ /* Internal method only. Tries to merge buffers at the head of the queue
+ * to form a single larger buffer of size 'size'. Only merges buffers that
+ * where 'gst_buffer_is_span_fast' returns TRUE.
+@@ -324,6 +379,7 @@
+ gst_adapter_peek (GstAdapter * adapter, guint size)
+ {
+ GstBuffer *cur;
++ guint skip;
+
+ g_return_val_if_fail (GST_IS_ADAPTER (adapter), NULL);
+ g_return_val_if_fail (size > 0, NULL);
+@@ -340,29 +396,32 @@
+
+ /* our head buffer has enough data left, return it */
+ cur = adapter->buflist->data;
+- if (GST_BUFFER_SIZE (cur) >= size + adapter->skip)
+- return GST_BUFFER_DATA (cur) + adapter->skip;
++ skip = adapter->skip;
++ if (GST_BUFFER_SIZE (cur) >= size + skip)
++ return GST_BUFFER_DATA (cur) + skip;
+
+ /* We may be able to efficiently merge buffers in our pool to
+ * gather a big enough chunk to return it from the head buffer directly */
+ if (gst_adapter_try_to_merge_up (adapter, size)) {
+ /* Merged something! Check if there's enough avail now */
+ cur = adapter->buflist->data;
+- if (GST_BUFFER_SIZE (cur) >= size + adapter->skip)
+- return GST_BUFFER_DATA (cur) + adapter->skip;
++ if (GST_BUFFER_SIZE (cur) >= size + skip)
++ return GST_BUFFER_DATA (cur) + skip;
+ }
+
+ /* Gonna need to copy stuff out */
+- if (adapter->assembled_size < size) {
++ if (G_UNLIKELY (adapter->assembled_size < size)) {
+ adapter->assembled_size = (size / DEFAULT_SIZE + 1) * DEFAULT_SIZE;
+- GST_DEBUG_OBJECT (adapter, "setting size of internal buffer to %u",
++ GST_DEBUG_OBJECT (adapter, "resizing internal buffer to %u",
+ adapter->assembled_size);
++ /* no g_realloc to avoid a memcpy that is not desired here since we are
++ * going to copy new data into the area below */
+ g_free (adapter->assembled_data);
+ adapter->assembled_data = g_malloc (adapter->assembled_size);
+ }
+ adapter->assembled_len = size;
+
+- gst_adapter_peek_into (adapter, adapter->assembled_data, size);
++ copy_into_unchecked (adapter, adapter->assembled_data, skip, size);
+
+ return adapter->assembled_data;
+ }
+@@ -386,37 +445,11 @@
+ void
+ gst_adapter_copy (GstAdapter * adapter, guint8 * dest, guint offset, guint size)
+ {
+- GSList *g;
+- int skip;
+-
+ g_return_if_fail (GST_IS_ADAPTER (adapter));
+ g_return_if_fail (size > 0);
++ g_return_if_fail (offset + size <= adapter->size);
+
+- /* we don't have enough data, return. This is unlikely
+- * as one usually does an _available() first instead of copying a
+- * random size. */
+- if (G_UNLIKELY (offset + size > adapter->size))
+- return;
+-
+- skip = adapter->skip;
+- for (g = adapter->buflist; g && size > 0; g = g_slist_next (g)) {
+- GstBuffer *buf;
+-
+- buf = g->data;
+- if (offset < GST_BUFFER_SIZE (buf) - skip) {
+- int n;
+-
+- n = MIN (GST_BUFFER_SIZE (buf) - skip - offset, size);
+- memcpy (dest, GST_BUFFER_DATA (buf) + skip + offset, n);
+-
+- dest += n;
+- offset = 0;
+- size -= n;
+- } else {
+- offset -= GST_BUFFER_SIZE (buf) - skip;
+- }
+- skip = 0;
+- }
++ copy_into_unchecked (adapter, dest, offset + adapter->skip, size);
+ }
+
+ /**
+@@ -433,29 +466,56 @@
+ gst_adapter_flush (GstAdapter * adapter, guint flush)
+ {
+ GstBuffer *cur;
++ guint size;
++ GstAdapterPrivate *priv;
++ GSList *g;
+
+ g_return_if_fail (GST_IS_ADAPTER (adapter));
+ g_return_if_fail (flush <= adapter->size);
+
+ GST_LOG_OBJECT (adapter, "flushing %u bytes", flush);
++
++ /* flushing out 0 bytes will do nothing */
++ if (G_UNLIKELY (flush == 0))
++ return;
++
++ priv = adapter->priv;
++
++ /* clear state */
+ adapter->size -= flush;
+ adapter->assembled_len = 0;
+- while (flush > 0) {
+- cur = adapter->buflist->data;
+- if (GST_BUFFER_SIZE (cur) <= flush + adapter->skip) {
+- /* can skip whole buffer */
+- flush -= GST_BUFFER_SIZE (cur) - adapter->skip;
+- adapter->skip = 0;
+- adapter->buflist =
+- g_slist_delete_link (adapter->buflist, adapter->buflist);
+- if (G_UNLIKELY (adapter->buflist == NULL))
+- adapter->buflist_end = NULL;
+- gst_buffer_unref (cur);
+- } else {
+- adapter->skip += flush;
++
++ /* take skip into account */
++ flush += adapter->skip;
++ /* distance is always at least the amount of skipped bytes */
++ priv->distance -= adapter->skip;
++
++ g = adapter->buflist;
++ cur = g->data;
++ size = GST_BUFFER_SIZE (cur);
++ while (flush >= size) {
++ /* can skip whole buffer */
++ GST_LOG_OBJECT (adapter, "flushing out head buffer");
++ priv->distance += size;
++ flush -= size;
++
++ gst_buffer_unref (cur);
++ g = g_slist_delete_link (g, g);
++
++ if (G_UNLIKELY (g == NULL)) {
++ GST_LOG_OBJECT (adapter, "adapter empty now");
++ adapter->buflist_end = NULL;
+ break;
+ }
++ /* there is a new head buffer, update the timestamp */
++ cur = g->data;
++ update_timestamp (adapter, cur);
++ size = GST_BUFFER_SIZE (cur);
+ }
++ adapter->buflist = g;
++ /* account for the remaining bytes */
++ adapter->skip = flush;
++ adapter->priv->distance += flush;
+ }
+
+ /**
+@@ -484,15 +544,18 @@
+ if (G_UNLIKELY (nbytes > adapter->size))
+ return NULL;
+
+- data = g_malloc (nbytes);
+-
+- /* we have enough assembled data, copy from there */
++ /* we have enough assembled data, take from there */
+ if (adapter->assembled_len >= nbytes) {
+ GST_LOG_OBJECT (adapter, "taking %u bytes already assembled", nbytes);
+- memcpy (data, adapter->assembled_data, nbytes);
++ data = adapter->assembled_data;
++ /* allocate new data, assembled_len will be set to 0 in the flush below */
++ adapter->assembled_data = g_malloc (adapter->assembled_size);
+ } else {
++ /* we need to allocate and copy. We could potentially copy bytes from the
++ * assembled data before doing the copy_into */
+ GST_LOG_OBJECT (adapter, "taking %u bytes by collection", nbytes);
+- gst_adapter_peek_into (adapter, data, nbytes);
++ data = g_malloc (nbytes);
++ copy_into_unchecked (adapter, data, adapter->skip, nbytes);
+ }
+
+ gst_adapter_flush (adapter, nbytes);
+@@ -523,6 +586,7 @@
+ {
+ GstBuffer *buffer;
+ GstBuffer *cur;
++ guint hsize, skip;
+
+ g_return_val_if_fail (GST_IS_ADAPTER (adapter), NULL);
+ g_return_val_if_fail (nbytes > 0, NULL);
+@@ -535,43 +599,52 @@
+ if (G_UNLIKELY (nbytes > adapter->size))
+ return NULL;
+
+- /* our head buffer has enough data left, return it */
+ cur = adapter->buflist->data;
+- if (GST_BUFFER_SIZE (cur) >= nbytes + adapter->skip) {
++ skip = adapter->skip;
++ hsize = GST_BUFFER_SIZE (cur);
++
++ /* our head buffer has enough data left, return it */
++ if (skip == 0 && hsize == nbytes) {
++ GST_LOG_OBJECT (adapter, "providing buffer of %d bytes as head buffer",
++ nbytes);
++ buffer = gst_buffer_ref (cur);
++ goto done;
++ } else if (hsize >= nbytes + skip) {
+ GST_LOG_OBJECT (adapter, "providing buffer of %d bytes via sub-buffer",
+ nbytes);
+- buffer = gst_buffer_create_sub (cur, adapter->skip, nbytes);
+-
+- gst_adapter_flush (adapter, nbytes);
+-
+- return buffer;
++ buffer = gst_buffer_create_sub (cur, skip, nbytes);
++ goto done;
+ }
+
+ if (gst_adapter_try_to_merge_up (adapter, nbytes)) {
+ /* Merged something, let's try again for sub-buffering */
+ cur = adapter->buflist->data;
+- if (GST_BUFFER_SIZE (cur) >= nbytes + adapter->skip) {
++ if (GST_BUFFER_SIZE (cur) >= nbytes + skip) {
+ GST_LOG_OBJECT (adapter, "providing buffer of %d bytes via sub-buffer",
+ nbytes);
+- buffer = gst_buffer_create_sub (cur, adapter->skip, nbytes);
+-
+- gst_adapter_flush (adapter, nbytes);
+-
+- return buffer;
++ buffer = gst_buffer_create_sub (cur, skip, nbytes);
++ goto done;
+ }
+ }
+
+- buffer = gst_buffer_new_and_alloc (nbytes);
+-
+ /* we have enough assembled data, copy from there */
+ if (adapter->assembled_len >= nbytes) {
+ GST_LOG_OBJECT (adapter, "taking %u bytes already assembled", nbytes);
+- memcpy (GST_BUFFER_DATA (buffer), adapter->assembled_data, nbytes);
++ buffer = gst_buffer_new ();
++ GST_BUFFER_SIZE (buffer) = nbytes;
++ GST_BUFFER_DATA (buffer) = adapter->assembled_data;
++ GST_BUFFER_MALLOCDATA (buffer) = adapter->assembled_data;
++ /* flush will set the assembled_len to 0 */
++ adapter->assembled_data = g_malloc (adapter->assembled_size);
+ } else {
++ /* we need to allocate and copy. We could potentially copy bytes from the
++ * assembled data before doing the copy_into */
++ buffer = gst_buffer_new_and_alloc (nbytes);
+ GST_LOG_OBJECT (adapter, "taking %u bytes by collection", nbytes);
+- gst_adapter_peek_into (adapter, GST_BUFFER_DATA (buffer), nbytes);
++ copy_into_unchecked (adapter, GST_BUFFER_DATA (buffer), skip, nbytes);
+ }
+
++done:
+ gst_adapter_flush (adapter, nbytes);
+
+ return buffer;
+@@ -626,9 +699,141 @@
+ first = GST_BUFFER_CAST (adapter->buflist->data);
+ size = GST_BUFFER_SIZE (first);
+
+- /* we cannot have skipped more than the first buffer */
+- g_assert (size > adapter->skip);
+-
+- /* we can quickly get the data of the first buffer */
++ /* we can quickly get the (remaining) data of the first buffer */
+ return size - adapter->skip;
+ }
++
++/**
++ * gst_adapter_prev_timestamp:
++ * @adapter: a #GstAdapter
++ * @distance: pointer to location for distance or NULL
++ *
++ * Get the timestamp that was before the current byte in the adapter. When
++ * @distance is given, the amount of bytes between the timestamp and the current
++ * position is returned.
++ *
++ * The timestamp is reset to GST_CLOCK_TIME_NONE when the adapter is first
++ * created or when it is cleared.
++ *
++ * Returns: The previously seen timestamp.
++ *
++ * Since: 0.10.24
++ */
++GstClockTime
++gst_adapter_prev_timestamp (GstAdapter * adapter, guint64 * distance)
++{
++ g_return_val_if_fail (GST_IS_ADAPTER (adapter), GST_CLOCK_TIME_NONE);
++
++ if (distance)
++ *distance = adapter->priv->distance;
++
++ return adapter->priv->timestamp;
++}
++
++/**
++ * gst_adapter_masked_scan_uint32:
++ * @adapter: a #GstAdapter
++ * @mask: mask to apply to data before matching against @pattern
++ * @pattern: pattern to match (after mask is applied)
++ * @offset: offset into the adapter data from which to start scanning, returns
++ * the last scanned position.
++ * @size: number of bytes to scan from offset
++ *
++ * Scan for pattern @pattern with applied mask @mask in the adapter data,
++ * starting from offset @offset.
++ *
++ * The bytes in @pattern and @mask are interpreted left-to-right, regardless
++ * of endianness. All four bytes of the pattern must be present in the
++ * adapter for it to match, even if the first or last bytes are masked out.
++ *
++ * It is an error to call this function without making sure that there is
++ * enough data (offset+size bytes) in the adapter.
++ *
++ * Returns: offset of the first match, or -1 if no match was found.
++ *
++ * Example:
++ * <programlisting>
++ * // Assume the adapter contains 0x00 0x01 0x02 ... 0xfe 0xff
++ *
++ * gst_adapter_masked_scan_uint32 (adapter, 0x00010203, 0xffffffff, 0, 256);
++ * // -> returns 0
++ * gst_adapter_masked_scan_uint32 (adapter, 0x00010203, 0xffffffff, 1, 255);
++ * // -> returns -1
++ * gst_adapter_masked_scan_uint32 (adapter, 0x01020304, 0xffffffff, 1, 255);
++ * // -> returns 1
++ * gst_adapter_masked_scan_uint32 (adapter, 0x0001, 0xffff, 0, 256);
++ * // -> returns -1
++ * gst_adapter_masked_scan_uint32 (adapter, 0x0203, 0xffff, 0, 256);
++ * // -> returns 0
++ * gst_adapter_masked_scan_uint32 (adapter, 0x02030000, 0xffff0000, 0, 256);
++ * // -> returns 2
++ * gst_adapter_masked_scan_uint32 (adapter, 0x02030000, 0xffff0000, 0, 4);
++ * // -> returns -1
++ * </programlisting>
++ *
++ * Since: 0.10.24
++ */
++guint
++gst_adapter_masked_scan_uint32 (GstAdapter * adapter, guint32 mask,
++ guint32 pattern, guint offset, guint size)
++{
++ GSList *g;
++ guint skip, bsize, i;
++ guint32 state;
++ guint8 *bdata;
++ GstBuffer *buf;
++
++ g_return_val_if_fail (size > 0, -1);
++ g_return_val_if_fail (offset + size <= adapter->size, -1);
++
++ /* we can't find the pattern with less than 4 bytes */
++ if (G_UNLIKELY (size < 4))
++ return -1;
++
++ skip = offset + adapter->skip;
++
++ /* first step, do skipping and position on the first buffer */
++ g = adapter->buflist;
++ buf = g->data;
++ bsize = GST_BUFFER_SIZE (buf);
++ while (G_UNLIKELY (skip >= bsize)) {
++ skip -= bsize;
++ g = g_slist_next (g);
++ buf = g->data;
++ bsize = GST_BUFFER_SIZE (buf);
++ }
++ /* get the data now */
++ bsize -= skip;
++ bdata = GST_BUFFER_DATA (buf) + skip;
++ skip = 0;
++
++ /* set the state to something that does not match */
++ state = ~pattern;
++
++ /* now find data */
++ do {
++ bsize = MIN (bsize, size);
++ for (i = 0; i < bsize; i++) {
++ state = ((state << 8) | bdata[i]);
++ if (G_UNLIKELY ((state & mask) == pattern)) {
++ /* we have a match but we need to have skipped at
++ * least 4 bytes to fill the state. */
++ if (G_LIKELY (skip + i >= 3))
++ return offset + skip + i - 3;
++ }
++ }
++ size -= bsize;
++ if (size == 0)
++ break;
++
++ /* nothing found yet, go to next buffer */
++ skip += bsize;
++ g = g_slist_next (g);
++ buf = g->data;
++ bsize = GST_BUFFER_SIZE (buf);
++ bdata = GST_BUFFER_DATA (buf);
++ } while (TRUE);
++
++ /* nothing found */
++ return -1;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/libs/gst/base/gstadapter.h gstreamer-0.10.23/libs/gst/base/gstadapter.h
+--- gstreamer-0.10.23.orig/libs/gst/base/gstadapter.h 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/libs/gst/base/gstadapter.h 2009-06-11 14:19:59.000000000 +0200
+@@ -40,6 +40,7 @@
+
+ typedef struct _GstAdapter GstAdapter;
+ typedef struct _GstAdapterClass GstAdapterClass;
++typedef struct _GstAdapterPrivate GstAdapterPrivate;
+
+ /**
+ * GstAdapter:
+@@ -60,10 +61,14 @@
+ guint assembled_size;
+ guint assembled_len;
+
++ /* ABI added */
+ /* Remember where the end of our buffer list is to
+ * speed up the push */
+ GSList *buflist_end;
+- gpointer _gst_reserved[GST_PADDING - 1];
++
++ GstAdapterPrivate *priv;
++
++ gpointer _gst_reserved[GST_PADDING - 2];
+ };
+
+ struct _GstAdapterClass {
+@@ -73,6 +78,8 @@
+ gpointer _gst_reserved[GST_PADDING];
+ };
+
++GType gst_adapter_get_type (void);
++
+ GstAdapter * gst_adapter_new (void);
+
+ void gst_adapter_clear (GstAdapter *adapter);
+@@ -85,7 +92,12 @@
+ GstBuffer* gst_adapter_take_buffer (GstAdapter *adapter, guint nbytes);
+ guint gst_adapter_available (GstAdapter *adapter);
+ guint gst_adapter_available_fast (GstAdapter *adapter);
+-GType gst_adapter_get_type (void);
++
++GstClockTime gst_adapter_prev_timestamp (GstAdapter *adapter, guint64 *distance);
++
++guint gst_adapter_masked_scan_uint32 (GstAdapter * adapter, guint32 mask,
++ guint32 pattern, guint offset, guint size);
++
+
+ G_END_DECLS
+
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/libs/gst/base/gstbasesink.c gstreamer-0.10.23/libs/gst/base/gstbasesink.c
+--- gstreamer-0.10.23.orig/libs/gst/base/gstbasesink.c 2009-04-15 21:18:17.000000000 +0200
++++ gstreamer-0.10.23/libs/gst/base/gstbasesink.c 2009-06-11 14:19:59.000000000 +0200
+@@ -152,6 +152,26 @@
+ #define GST_BASE_SINK_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_BASE_SINK, GstBaseSinkPrivate))
+
++#define GST_FLOW_STEP GST_FLOW_CUSTOM_ERROR
++
++typedef struct
++{
++ gboolean valid; /* if this info is valid */
++ guint32 seqnum; /* the seqnum of the STEP event */
++ GstFormat format; /* the format of the amount */
++ guint64 amount; /* the total amount of data to skip */
++ guint64 position; /* the position in the stepped data */
++ guint64 duration; /* the duration in time of the skipped data */
++ guint64 start; /* running_time of the start */
++ gdouble rate; /* rate of skipping */
++ gdouble start_rate; /* rate before skipping */
++ guint64 start_start; /* start position skipping */
++ guint64 start_stop; /* stop position skipping */
++ gboolean flush; /* if this was a flushing step */
++ gboolean intermediate; /* if this is an intermediate step */
++ gboolean need_preroll; /* if we need preroll after this step */
++} GstStepInfo;
++
+ /* FIXME, some stuff in ABI.data and other in Private...
+ * Make up your mind please.
+ */
+@@ -224,6 +244,11 @@
+ guint32 seqnum;
+
+ gboolean call_preroll;
++ gboolean step_unlock;
++
++ /* we have a pending and a current step operation */
++ GstStepInfo current_step;
++ GstStepInfo pending_step;
+ };
+
+ #define DO_RUNNING_AVG(avg,val,size) (((val) + ((size)-1) * (avg)) / (size))
+@@ -1257,6 +1282,7 @@
+ basesink->eos = FALSE;
+ basesink->priv->received_eos = FALSE;
+ basesink->have_preroll = FALSE;
++ basesink->priv->step_unlock = FALSE;
+ basesink->eos_queued = FALSE;
+ basesink->preroll_queued = 0;
+ basesink->buffers_queued = 0;
+@@ -1454,6 +1480,207 @@
+ }
+ }
+
++static void
++start_stepping (GstBaseSink * sink, GstSegment * segment,
++ GstStepInfo * pending, GstStepInfo * current)
++{
++ gint64 end;
++
++ GST_DEBUG_OBJECT (sink, "update pending step");
++
++ GST_OBJECT_LOCK (sink);
++ memcpy (current, pending, sizeof (GstStepInfo));
++ pending->valid = FALSE;
++ GST_OBJECT_UNLOCK (sink);
++
++ /* get the running time of where we paused and remember it */
++ current->start = gst_element_get_start_time (GST_ELEMENT_CAST (sink));
++ gst_segment_set_running_time (segment, GST_FORMAT_TIME, current->start);
++
++ /* set the new rate for the remainder of the segment */
++ current->start_rate = segment->rate;
++ segment->rate *= current->rate;
++ segment->abs_rate = ABS (segment->rate);
++
++ /* save values */
++ if (segment->rate > 0.0)
++ current->start_stop = segment->stop;
++ else
++ current->start_start = segment->start;
++
++ if (current->format == GST_FORMAT_TIME) {
++ end = current->start + current->amount;
++ if (!current->flush) {
++ /* update the segment clipping regions for non-flushing seeks */
++ if (segment->rate > 0.0)
++ segment->stop = gst_segment_to_position (segment, GST_FORMAT_TIME, end);
++ else
++ segment->start =
++ gst_segment_to_position (segment, GST_FORMAT_TIME, end);
++ }
++ }
++
++ GST_DEBUG_OBJECT (sink, "segment now %" GST_TIME_FORMAT "-%" GST_TIME_FORMAT,
++ GST_TIME_ARGS (segment->start), GST_TIME_ARGS (segment->stop));
++
++ GST_DEBUG_OBJECT (sink, "step started at running_time %" GST_TIME_FORMAT,
++ GST_TIME_ARGS (current->start));
++
++ if (current->amount == -1) {
++ GST_DEBUG_OBJECT (sink, "step amount == -1, stop stepping");
++ current->valid = FALSE;
++ } else {
++ GST_DEBUG_OBJECT (sink, "step amount: %" G_GUINT64_FORMAT ", format: %s, "
++ "rate: %f", current->amount, gst_format_get_name (current->format),
++ current->rate);
++ }
++}
++
++static void
++stop_stepping (GstBaseSink * sink, GstSegment * segment,
++ GstStepInfo * current, gint64 rstart, gint64 rstop)
++{
++ gint64 stop, position;
++ GstMessage *message;
++
++ GST_DEBUG_OBJECT (sink, "step complete");
++
++ if (segment->rate > 0.0)
++ stop = rstart;
++ else
++ stop = rstop;
++
++ GST_DEBUG_OBJECT (sink,
++ "step stop at running_time %" GST_TIME_FORMAT, GST_TIME_ARGS (stop));
++
++ if (stop == -1)
++ current->duration = current->position;
++ else
++ current->duration = stop - current->start;
++
++ GST_DEBUG_OBJECT (sink, "step elapsed running_time %" GST_TIME_FORMAT,
++ GST_TIME_ARGS (current->duration));
++
++ position = current->start + current->duration;
++
++ /* now move the segment to the new running time */
++ gst_segment_set_running_time (segment, GST_FORMAT_TIME, position);
++
++ if (current->flush) {
++ /* and remove the accumulated time we flushed, start time did not change */
++ segment->accum = current->start;
++ } else {
++ /* start time is now the stepped position */
++ gst_element_set_start_time (GST_ELEMENT_CAST (sink), position);
++ }
++
++ /* restore the previous rate */
++ segment->rate = current->start_rate;
++ segment->abs_rate = ABS (segment->rate);
++
++ if (segment->rate > 0.0)
++ segment->stop = current->start_stop;
++ else
++ segment->start = current->start_start;
++
++ /* the clip segment is used for position report in paused... */
++ memcpy (sink->abidata.ABI.clip_segment, segment, sizeof (GstSegment));
++
++ /* post the step done when we know the stepped duration in TIME */
++ message =
++ gst_message_new_step_done (GST_OBJECT_CAST (sink), current->format,
++ current->amount, current->rate, current->flush, current->intermediate,
++ current->duration);
++ gst_message_set_seqnum (message, current->seqnum);
++ gst_element_post_message (GST_ELEMENT_CAST (sink), message);
++
++ if (!current->intermediate)
++ sink->need_preroll = current->need_preroll;
++
++ /* and the current step info finished and becomes invalid */
++ current->valid = FALSE;
++}
++
++static gboolean
++handle_stepping (GstBaseSink * sink, GstSegment * segment,
++ GstStepInfo * current, gint64 * cstart, gint64 * cstop, gint64 * rstart,
++ gint64 * rstop)
++{
++ GstBaseSinkPrivate *priv;
++ gboolean step_end = FALSE;
++
++ priv = sink->priv;
++
++ /* see if we need to skip this buffer because of stepping */
++ switch (current->format) {
++ case GST_FORMAT_TIME:
++ {
++ guint64 end;
++ gint64 first, last;
++
++ if (segment->rate > 0.0) {
++ first = *rstart;
++ last = *rstop;
++ } else {
++ first = *rstop;
++ last = *rstart;
++ }
++
++ end = current->start + current->amount;
++ current->position = first - current->start;
++
++ if (G_UNLIKELY (segment->abs_rate != 1.0))
++ current->position /= segment->abs_rate;
++
++ GST_DEBUG_OBJECT (sink,
++ "buffer: %" GST_TIME_FORMAT "-%" GST_TIME_FORMAT,
++ GST_TIME_ARGS (first), GST_TIME_ARGS (last));
++ GST_DEBUG_OBJECT (sink,
++ "got time step %" GST_TIME_FORMAT "-%" GST_TIME_FORMAT "/%"
++ GST_TIME_FORMAT, GST_TIME_ARGS (current->position),
++ GST_TIME_ARGS (last - current->start),
++ GST_TIME_ARGS (current->amount));
++
++ if ((current->flush && current->position >= current->amount)
++ || last >= end) {
++ GST_DEBUG_OBJECT (sink, "step ended, we need clipping");
++ step_end = TRUE;
++ if (segment->rate > 0.0) {
++ *rstart = end;
++ *cstart = gst_segment_to_position (segment, GST_FORMAT_TIME, end);
++ } else {
++ *rstop = end;
++ *cstop = gst_segment_to_position (segment, GST_FORMAT_TIME, end);
++ }
++ }
++ GST_DEBUG_OBJECT (sink,
++ "cstart %" GST_TIME_FORMAT ", rstart %" GST_TIME_FORMAT,
++ GST_TIME_ARGS (*cstart), GST_TIME_ARGS (*rstart));
++ GST_DEBUG_OBJECT (sink,
++ "cstop %" GST_TIME_FORMAT ", rstop %" GST_TIME_FORMAT,
++ GST_TIME_ARGS (*cstop), GST_TIME_ARGS (*rstop));
++ break;
++ }
++ case GST_FORMAT_BUFFERS:
++ GST_DEBUG_OBJECT (sink,
++ "got default step %" G_GUINT64_FORMAT "/%" G_GUINT64_FORMAT,
++ current->position, current->amount);
++
++ if (current->position < current->amount) {
++ current->position++;
++ } else {
++ step_end = TRUE;
++ }
++ break;
++ case GST_FORMAT_DEFAULT:
++ default:
++ GST_DEBUG_OBJECT (sink,
++ "got unknown step %" G_GUINT64_FORMAT "/%" G_GUINT64_FORMAT,
++ current->position, current->amount);
++ break;
++ }
++ return step_end;
++}
+
+ /* with STREAM_LOCK, PREROLL_LOCK
+ *
+@@ -1467,7 +1694,8 @@
+ gst_base_sink_get_sync_times (GstBaseSink * basesink, GstMiniObject * obj,
+ GstClockTime * rsstart, GstClockTime * rsstop,
+ GstClockTime * rrstart, GstClockTime * rrstop, gboolean * do_sync,
+- GstSegment * segment)
++ gboolean * stepped, GstSegment * segment, GstStepInfo * step,
++ gboolean * step_end)
+ {
+ GstBaseSinkClass *bclass;
+ GstBuffer *buffer;
+@@ -1510,7 +1738,9 @@
+ *do_sync = rstart != -1;
+ GST_DEBUG_OBJECT (basesink, "sync times for EOS %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (rstart));
+- goto done;
++ /* if we are stepping, we end now */
++ *step_end = step->valid;
++ goto eos_done;
+ }
+ default:
+ /* other events do not need syncing */
+@@ -1528,11 +1758,14 @@
+
+ bclass = GST_BASE_SINK_GET_CLASS (basesink);
+
+- /* just get the times to see if we need syncing */
++ /* just get the times to see if we need syncing, if the start returns -1 we
++ * don't sync. */
+ if (bclass->get_times)
+ bclass->get_times (basesink, buffer, &start, &stop);
+
+ if (start == -1) {
++ /* we don't need to sync but we still want to get the timestamps for
++ * tracking the position */
+ gst_base_sink_get_times (basesink, buffer, &start, &stop);
+ *do_sync = FALSE;
+ } else {
+@@ -1546,16 +1779,17 @@
+ /* collect segment and format for code clarity */
+ format = segment->format;
+
+- /* no timestamp clipping if we did not * get a TIME segment format */
++ /* no timestamp clipping if we did not get a TIME segment format */
+ if (G_UNLIKELY (format != GST_FORMAT_TIME)) {
+ cstart = start;
+ cstop = stop;
+ /* do running and stream time in TIME format */
+ format = GST_FORMAT_TIME;
++ GST_LOG_OBJECT (basesink, "not time format, don't clip");
+ goto do_times;
+ }
+
+- /* clip */
++ /* clip, only when we know about time */
+ if (G_UNLIKELY (!gst_segment_clip (segment, GST_FORMAT_TIME,
+ (gint64) start, (gint64) stop, &cstart, &cstop)))
+ goto out_of_segment;
+@@ -1573,14 +1807,29 @@
+ gst_segment_set_last_stop (segment, GST_FORMAT_TIME, cstart);
+
+ do_times:
++ rstart = gst_segment_to_running_time (segment, format, cstart);
++ rstop = gst_segment_to_running_time (segment, format, cstop);
++
++ if (G_UNLIKELY (step->valid)) {
++ if (!(*step_end = handle_stepping (basesink, segment, step, &cstart, &cstop,
++ &rstart, &rstop))) {
++ /* step is still busy, we discard data when we are flushing */
++ *stepped = step->flush;
++ }
++ }
+ /* this can produce wrong values if we accumulated non-TIME segments. If this happens,
+ * upstream is behaving very badly */
+ sstart = gst_segment_to_stream_time (segment, format, cstart);
+ sstop = gst_segment_to_stream_time (segment, format, cstop);
+- rstart = gst_segment_to_running_time (segment, format, cstart);
+- rstop = gst_segment_to_running_time (segment, format, cstop);
+
+-done:
++eos_done:
++ /* done label only called when doing EOS, we also stop stepping then */
++ if (*step_end && step->flush) {
++ GST_DEBUG_OBJECT (basesink, "flushing step ended");
++ stop_stepping (basesink, segment, step, rstart, rstop);
++ *step_end = FALSE;
++ }
++
+ /* save times */
+ *rsstart = sstart;
+ *rsstop = sstop;
+@@ -1593,10 +1842,9 @@
+ /* special cases */
+ out_of_segment:
+ {
+- /* should not happen since we clip them in the chain function already,
+- * we return FALSE so that we don't try to sync on it. */
+- GST_ELEMENT_WARNING (basesink, STREAM, FAILED,
+- (NULL), ("unexpected buffer out of segment found."));
++ /* we usually clip in the chain function already but stepping could cause
++ * the segment to be updated later. we return FALSE so that we don't try
++ * to sync on it. */
+ GST_LOG_OBJECT (basesink, "buffer skipped, not in segment");
+ return FALSE;
+ }
+@@ -1745,6 +1993,8 @@
+ sink->have_preroll = FALSE;
+ if (G_UNLIKELY (sink->flushing))
+ goto stopping;
++ if (G_UNLIKELY (sink->priv->step_unlock))
++ goto step_unlocked;
+ GST_DEBUG_OBJECT (sink, "continue after preroll");
+
+ return GST_FLOW_OK;
+@@ -1752,9 +2002,15 @@
+ /* ERRORS */
+ stopping:
+ {
+- GST_DEBUG_OBJECT (sink, "preroll interrupted");
++ GST_DEBUG_OBJECT (sink, "preroll interrupted because of flush");
+ return GST_FLOW_WRONG_STATE;
+ }
++step_unlocked:
++ {
++ sink->priv->step_unlock = FALSE;
++ GST_DEBUG_OBJECT (sink, "preroll interrupted because of step");
++ return GST_FLOW_STEP;
++ }
+ }
+
+ /**
+@@ -1791,8 +2047,12 @@
+ if (G_LIKELY (sink->need_preroll)) {
+ /* block until the state changes, or we get a flush, or something */
+ ret = gst_base_sink_wait_preroll (sink);
+- if (ret != GST_FLOW_OK)
+- goto preroll_failed;
++ if (ret != GST_FLOW_OK) {
++ if (ret == GST_FLOW_STEP)
++ ret = GST_FLOW_OK;
++ else
++ goto preroll_failed;
++ }
+ }
+ }
+ return GST_FLOW_OK;
+@@ -1840,8 +2100,12 @@
+ /* first wait for the playing state before we can continue */
+ if (G_UNLIKELY (sink->need_preroll)) {
+ ret = gst_base_sink_wait_preroll (sink);
+- if (ret != GST_FLOW_OK)
+- goto flushing;
++ if (ret != GST_FLOW_OK) {
++ if (ret == GST_FLOW_STEP)
++ ret = GST_FLOW_OK;
++ else
++ goto flushing;
++ }
+ }
+
+ /* preroll done, we can sync since we are in PLAYING now. */
+@@ -1906,7 +2170,7 @@
+ */
+ static GstFlowReturn
+ gst_base_sink_do_sync (GstBaseSink * basesink, GstPad * pad,
+- GstMiniObject * obj, gboolean * late)
++ GstMiniObject * obj, gboolean * late, gboolean * step_end)
+ {
+ GstClockTimeDiff jitter;
+ gboolean syncable;
+@@ -1915,17 +2179,29 @@
+ gboolean do_sync;
+ GstBaseSinkPrivate *priv;
+ GstFlowReturn ret;
++ GstStepInfo *current, *pending;
++ gboolean stepped;
+
+ priv = basesink->priv;
+
++do_step:
+ sstart = sstop = rstart = rstop = -1;
+ do_sync = TRUE;
++ stepped = FALSE;
+
+ priv->current_rstart = -1;
+
++ /* get stepping info */
++ current = &priv->current_step;
++ pending = &priv->pending_step;
++
+ /* get timing information for this object against the render segment */
+ syncable = gst_base_sink_get_sync_times (basesink, obj,
+- &sstart, &sstop, &rstart, &rstop, &do_sync, &basesink->segment);
++ &sstart, &sstop, &rstart, &rstop, &do_sync, &stepped, &basesink->segment,
++ current, step_end);
++
++ if (G_UNLIKELY (stepped))
++ goto step_skipped;
+
+ /* a syncable object needs to participate in preroll and
+ * clocking. All buffers and EOS are syncable. */
+@@ -1935,14 +2211,14 @@
+ /* store timing info for current object */
+ priv->current_rstart = rstart;
+ priv->current_rstop = (rstop != -1 ? rstop : rstart);
++
+ /* save sync time for eos when the previous object needed sync */
+ priv->eos_rtime = (do_sync ? priv->current_rstop : -1);
+
+ again:
+ /* first do preroll, this makes sure we commit our state
+ * to PAUSED and can continue to PLAYING. We cannot perform
+- * any clock sync in PAUSED because there is no clock.
+- */
++ * any clock sync in PAUSED because there is no clock. */
+ ret = gst_base_sink_do_preroll (basesink, obj);
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ goto preroll_failed;
+@@ -1954,6 +2230,13 @@
+ priv->current_sstop = (sstop != -1 ? sstop : sstart);
+ GST_OBJECT_UNLOCK (basesink);
+
++ /* update the segment with a pending step if the current one is invalid and we
++ * have a new pending one. We only accept new step updates after a preroll */
++ if (G_UNLIKELY (pending->valid && !current->valid)) {
++ start_stepping (basesink, &basesink->segment, pending, current);
++ goto do_step;
++ }
++
+ if (!do_sync)
+ goto done;
+
+@@ -2006,6 +2289,12 @@
+ return GST_FLOW_OK;
+
+ /* ERRORS */
++step_skipped:
++ {
++ GST_DEBUG_OBJECT (basesink, "skipped stepped object %p", obj);
++ *late = TRUE;
++ return GST_FLOW_OK;
++ }
+ not_syncable:
+ {
+ GST_DEBUG_OBJECT (basesink, "non syncable object %p", obj);
+@@ -2234,6 +2523,9 @@
+ * second, render it anyway so the user sees something */
+ if (priv->last_in_time != -1 && start - priv->last_in_time > GST_SECOND) {
+ late = FALSE;
++ GST_ELEMENT_WARNING (basesink, CORE, CLOCK,
++ (_("A lot of buffers are being dropped.")),
++ ("There may be a timestamping problem, or this computer is too slow."));
+ GST_DEBUG_OBJECT (basesink,
+ "**emergency** last buffer at %" GST_TIME_FORMAT " > GST_SECOND",
+ GST_TIME_ARGS (priv->last_in_time));
+@@ -2308,16 +2600,22 @@
+ gst_base_sink_render_object (GstBaseSink * basesink, GstPad * pad,
+ GstMiniObject * obj)
+ {
+- GstFlowReturn ret = GST_FLOW_OK;
++ GstFlowReturn ret;
+ GstBaseSinkClass *bclass;
+- gboolean late = FALSE;
++ gboolean late, step_end;
++
+ GstBaseSinkPrivate *priv;
+
+ priv = basesink->priv;
+
++again:
++ late = FALSE;
++ step_end = FALSE;
++ ret = GST_FLOW_OK;
++
+ /* synchronize this object, non syncable objects return OK
+ * immediatly. */
+- ret = gst_base_sink_do_sync (basesink, pad, obj, &late);
++ ret = gst_base_sink_do_sync (basesink, pad, obj, &late, &step_end);
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ goto sync_failed;
+
+@@ -2349,10 +2647,13 @@
+
+ ret = bclass->render (basesink, buf);
+
+- priv->rendered++;
+-
+ if (do_qos)
+ gst_base_sink_do_render_stats (basesink, FALSE);
++
++ if (ret == GST_FLOW_STEP)
++ goto again;
++
++ priv->rendered++;
+ }
+ } else {
+ GstEvent *event = GST_EVENT_CAST (obj);
+@@ -2413,6 +2714,12 @@
+ }
+
+ done:
++ if (step_end) {
++ stop_stepping (basesink, &basesink->segment, &priv->current_step,
++ priv->current_rstart, priv->current_rstop);
++ goto again;
++ }
++
+ gst_base_sink_perform_qos (basesink, late);
+
+ GST_DEBUG_OBJECT (basesink, "object unref after render %p", obj);
+@@ -2666,6 +2973,8 @@
+ basesink->priv->current_sstop = -1;
+ basesink->priv->eos_rtime = -1;
+ basesink->priv->call_preroll = TRUE;
++ basesink->priv->current_step.valid = FALSE;
++ basesink->priv->pending_step.valid = FALSE;
+ if (basesink->pad_mode == GST_ACTIVATE_PUSH) {
+ /* we need new segment info after the flush. */
+ basesink->have_newsegment = FALSE;
+@@ -3173,6 +3482,101 @@
+ return res;
+ }
+
++static void
++set_step_info (GstBaseSink * sink, GstStepInfo * current, GstStepInfo * pending,
++ guint seqnum, GstFormat format, guint64 amount, gdouble rate,
++ gboolean flush, gboolean intermediate)
++{
++ GST_OBJECT_LOCK (sink);
++ pending->seqnum = seqnum;
++ pending->format = format;
++ pending->amount = amount;
++ pending->position = 0;
++ pending->rate = rate;
++ pending->flush = flush;
++ pending->intermediate = intermediate;
++ pending->valid = TRUE;
++ /* flush invalidates the current stepping segment */
++ if (flush)
++ current->valid = FALSE;
++ GST_OBJECT_UNLOCK (sink);
++}
++
++static gboolean
++gst_base_sink_perform_step (GstBaseSink * sink, GstPad * pad, GstEvent * event)
++{
++ GstBaseSinkPrivate *priv;
++ GstBaseSinkClass *bclass;
++ gboolean flush, intermediate;
++ gdouble rate;
++ GstFormat format;
++ guint64 amount;
++ guint seqnum;
++ GstStepInfo *pending, *current;
++
++ bclass = GST_BASE_SINK_GET_CLASS (sink);
++ priv = sink->priv;
++
++ GST_DEBUG_OBJECT (sink, "performing step with event %p", event);
++
++ gst_event_parse_step (event, &format, &amount, &rate, &flush, &intermediate);
++ seqnum = gst_event_get_seqnum (event);
++
++ pending = &priv->pending_step;
++ current = &priv->current_step;
++
++ if (flush) {
++ /* we need to call ::unlock before locking PREROLL_LOCK
++ * since we lock it before going into ::render */
++ if (bclass->unlock)
++ bclass->unlock (sink);
++
++ GST_PAD_PREROLL_LOCK (sink->sinkpad);
++ /* now that we have the PREROLL lock, clear our unlock request */
++ if (bclass->unlock_stop)
++ bclass->unlock_stop (sink);
++
++ /* update the stepinfo and make it valid */
++ set_step_info (sink, current, pending, seqnum, format, amount, rate, flush,
++ intermediate);
++
++ if (sink->priv->async_enabled) {
++ /* and we need to commit our state again on the next
++ * prerolled buffer */
++ sink->playing_async = TRUE;
++ priv->pending_step.need_preroll = TRUE;
++ sink->need_preroll = FALSE;
++ gst_element_lost_state_full (GST_ELEMENT_CAST (sink), FALSE);
++ } else {
++ sink->priv->have_latency = TRUE;
++ sink->need_preroll = FALSE;
++ }
++ priv->current_sstart = -1;
++ priv->current_sstop = -1;
++ priv->eos_rtime = -1;
++ priv->call_preroll = TRUE;
++ gst_base_sink_set_last_buffer (sink, NULL);
++ gst_base_sink_reset_qos (sink);
++
++ if (sink->clock_id) {
++ gst_clock_id_unschedule (sink->clock_id);
++ }
++
++ if (sink->have_preroll) {
++ GST_DEBUG_OBJECT (sink, "signal waiter");
++ priv->step_unlock = TRUE;
++ GST_PAD_PREROLL_SIGNAL (sink->sinkpad);
++ }
++ GST_PAD_PREROLL_UNLOCK (sink->sinkpad);
++ } else {
++ /* update the stepinfo and make it valid */
++ set_step_info (sink, current, pending, seqnum, format, amount, rate, flush,
++ intermediate);
++ }
++
++ return TRUE;
++}
++
+ /* with STREAM_LOCK
+ */
+ static void
+@@ -3595,6 +3999,10 @@
+ if (mode == GST_ACTIVATE_PULL)
+ result = gst_base_sink_perform_seek (basesink, pad, event);
+ break;
++ case GST_EVENT_STEP:
++ result = gst_base_sink_perform_step (basesink, pad, event);
++ forward = FALSE;
++ break;
+ default:
+ break;
+ }
+@@ -3685,6 +4093,11 @@
+
+ if (oformat == GST_FORMAT_TIME) {
+ *cur = basesink->priv->current_sstart;
++ if (segment->rate < 0.0 && basesink->priv->current_sstop != -1) {
++ /* for reverse playback we prefer the stream time stop position if we have
++ * one */
++ *cur = basesink->priv->current_sstop;
++ }
+ } else {
+ *cur = gst_segment_to_stream_time (segment, oformat, segment->last_stop);
+ }
+@@ -4021,6 +4434,7 @@
+ GST_FORMAT_UNDEFINED);
+ basesink->offset = 0;
+ basesink->have_preroll = FALSE;
++ priv->step_unlock = FALSE;
+ basesink->need_preroll = TRUE;
+ basesink->playing_async = TRUE;
+ priv->current_sstart = -1;
+@@ -4032,6 +4446,8 @@
+ gst_base_sink_reset_qos (basesink);
+ priv->commited = FALSE;
+ priv->call_preroll = TRUE;
++ priv->current_step.valid = FALSE;
++ priv->pending_step.valid = FALSE;
+ if (priv->async_enabled) {
+ GST_DEBUG_OBJECT (basesink, "doing async state change");
+ /* when async enabled, post async-start message and return ASYNC from
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/libs/gst/base/gstbasesrc.c gstreamer-0.10.23/libs/gst/base/gstbasesrc.c
+--- gstreamer-0.10.23.orig/libs/gst/base/gstbasesrc.c 2009-04-15 21:18:17.000000000 +0200
++++ gstreamer-0.10.23/libs/gst/base/gstbasesrc.c 2009-06-11 14:19:59.000000000 +0200
+@@ -842,8 +842,15 @@
+
+ case GST_QUERY_SEEKING:
+ {
+- gst_query_set_seeking (query, src->segment.format,
+- gst_base_src_seekable (src), 0, src->segment.duration);
++ GstFormat format;
++
++ gst_query_parse_seeking (query, &format, NULL, NULL, NULL);
++ if (format == src->segment.format) {
++ gst_query_set_seeking (query, src->segment.format,
++ gst_base_src_seekable (src), 0, src->segment.duration);
++ } else {
++ gst_query_set_seeking (query, format, FALSE, 0, -1);
++ }
+ res = TRUE;
+ break;
+ }
+@@ -1147,7 +1154,7 @@
+ static gboolean
+ gst_base_src_perform_seek (GstBaseSrc * src, GstEvent * event, gboolean unlock)
+ {
+- gboolean res = TRUE;
++ gboolean res = TRUE, tres;
+ gdouble rate;
+ GstFormat seek_format, dest_format;
+ GstSeekFlags flags;
+@@ -1334,8 +1341,10 @@
+ src->data.ABI.running = TRUE;
+ /* and restart the task in case it got paused explicitely or by
+ * the FLUSH_START event we pushed out. */
+- gst_pad_start_task (src->srcpad, (GstTaskFunction) gst_base_src_loop,
++ tres = gst_pad_start_task (src->srcpad, (GstTaskFunction) gst_base_src_loop,
+ src->srcpad);
++ if (res && !tres)
++ res = FALSE;
+
+ /* and release the lock again so we can continue streaming */
+ GST_PAD_STREAM_UNLOCK (src->srcpad);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/libs/gst/base/gsttypefindhelper.c gstreamer-0.10.23/libs/gst/base/gsttypefindhelper.c
+--- gstreamer-0.10.23.orig/libs/gst/base/gsttypefindhelper.c 2009-04-01 13:45:11.000000000 +0200
++++ gstreamer-0.10.23/libs/gst/base/gsttypefindhelper.c 2009-06-11 14:19:59.000000000 +0200
+@@ -521,16 +521,16 @@
+ /* we only want to check those factories without a function */
+ if (factory->function != NULL)
+ continue;
+-
++
+ /* there are extension, see if one of them matches the requested
+ * extension */
+ for (i = 0; ext[i]; i++) {
+ if (strcmp (ext[i], extension) == 0) {
+- /* we found a matching extension, take the caps */
+- if ((result = gst_type_find_factory_get_caps (factory))) {
++ /* we found a matching extension, take the caps */
++ if ((result = gst_type_find_factory_get_caps (factory))) {
+ gst_caps_ref (result);
+- goto done;
+- }
++ goto done;
++ }
+ }
+ }
+ }
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/libs/gst/controller/gstinterpolation.c gstreamer-0.10.23/libs/gst/controller/gstinterpolation.c
+--- gstreamer-0.10.23.orig/libs/gst/controller/gstinterpolation.c 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/libs/gst/controller/gstinterpolation.c 2009-06-11 14:19:59.000000000 +0200
+@@ -1,7 +1,7 @@
+ /* GStreamer
+ *
+ * Copyright (C) <2005> Stefan Kost <ensonic at users dot sf dot net>
+- * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
++ * Copyright (C) 2007,2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * gstinterpolation.c: Interpolation methods for dynamic properties
+ *
+@@ -35,49 +35,53 @@
+
+ /* common helper */
+
++static gint
++gst_control_point_find (gconstpointer p1, gconstpointer p2)
++{
++ GstClockTime ct1 = ((GstControlPoint *) p1)->timestamp;
++ GstClockTime ct2 = *(GstClockTime *) p2;
++
++ return ((ct1 < ct2) ? -1 : ((ct1 == ct2) ? 0 : 1));
++}
++
+ /*
+- * gst_interpolation_control_source_find_control_point_node:
++ * gst_interpolation_control_source_find_control_point_iter:
+ * @self: the interpolation control source to search in
+ * @timestamp: the search key
+ *
+ * Find last value before given timestamp in control point list.
+ *
+- * Returns: the found #GList node or %NULL
++ * Returns: the found #GSequenceIter or %NULL
+ */
+-static GList *gst_interpolation_control_source_find_control_point_node
++static GSequenceIter *gst_interpolation_control_source_find_control_point_iter
+ (GstInterpolationControlSource * self, GstClockTime timestamp)
+ {
+- GList *prev_node = g_list_last (self->priv->values);
+- GList *node;
++ GSequenceIter *iter;
+ GstControlPoint *cp;
+
+- /* Check if we can start from the last requested value
+- * to save some time */
+- node = self->priv->values;
+- if (self->priv->last_requested_value) {
+- GstControlPoint *last_cp = self->priv->last_requested_value->data;
+-
+- if (timestamp > last_cp->timestamp)
+- node = self->priv->last_requested_value;
+- }
+-
+- /* iterate over timed value list */
+- for (; node; node = g_list_next (node)) {
+- cp = node->data;
+- /* this timestamp is newer that the one we look for */
+- if (timestamp < cp->timestamp) {
+- /* get previous one again */
+- prev_node = g_list_previous (node);
+- break;
+- }
+- }
++ if (!self->priv->values)
++ return NULL;
+
+- /* If we have something to return save it as a
+- * potential start position for the next search */
+- if (prev_node)
+- self->priv->last_requested_value = prev_node;
++ iter =
++ g_sequence_search (self->priv->values, ×tamp,
++ (GCompareDataFunc) gst_control_point_find, NULL);
++
++ /* g_sequence_search() returns the iter where timestamp
++ * would be inserted, i.e. the iter > timestamp, so
++ * we need to get the previous one */
++ iter = g_sequence_iter_prev (iter);
++
++ /* g_sequence_iter_prev () on the begin iter returns
++ * the begin iter. Check if the prev iter is still
++ * after our timestamp, in that case return NULL
++ */
++ cp = g_sequence_get (iter);
++ if (cp->timestamp > timestamp)
++ return NULL;
+
+- return prev_node;
++ /* If the iter is the end iter return NULL as no
++ * data is linked to the end iter */
++ return G_UNLIKELY (g_sequence_iter_is_end (iter)) ? NULL : iter;
+ }
+
+ /* steps-like (no-)interpolation, default */
+@@ -88,11 +92,11 @@
+ _interpolate_none_get_##type (GstInterpolationControlSource *self, GstClockTime timestamp) \
+ { \
+ GValue *ret; \
+- GList *node; \
++ GSequenceIter *iter; \
+ \
+- if ((node = \
+- gst_interpolation_control_source_find_control_point_node (self, timestamp))) { \
+- GstControlPoint *cp = node->data; \
++ if ((iter = \
++ gst_interpolation_control_source_find_control_point_iter (self, timestamp))) { \
++ GstControlPoint *cp = g_sequence_get (iter); \
+ g##type ret_val = g_value_get_##type (&cp->value); \
+ \
+ if (g_value_get_##type (&self->priv->minimum_value) > ret_val) \
+@@ -162,13 +166,13 @@
+ _interpolate_none_get (GstInterpolationControlSource * self,
+ GstClockTime timestamp)
+ {
+- GList *node;
++ GSequenceIter *iter;
+ GValue *ret;
+
+- if ((node =
+- gst_interpolation_control_source_find_control_point_node (self,
++ if ((iter =
++ gst_interpolation_control_source_find_control_point_iter (self,
+ timestamp))) {
+- GstControlPoint *cp = node->data;
++ GstControlPoint *cp = g_sequence_get (iter);
+
+ ret = &cp->value;
+ } else {
+@@ -300,13 +304,13 @@
+ static inline GValue * \
+ _interpolate_trigger_get_##type (GstInterpolationControlSource *self, GstClockTime timestamp) \
+ { \
+- GList *node; \
++ GSequenceIter *iter; \
+ GstControlPoint *cp; \
+ \
+ /* check if there is a value at the registered timestamp */ \
+- if ((node = \
+- gst_interpolation_control_source_find_control_point_node (self, timestamp))) { \
+- cp = node->data; \
++ if ((iter = \
++ gst_interpolation_control_source_find_control_point_iter (self, timestamp))) { \
++ cp = g_sequence_get (iter); \
+ if (timestamp == cp->timestamp) { \
+ g##type ret = g_value_get_##type (&cp->value); \
+ if (g_value_get_##type (&self->priv->minimum_value) > ret) \
+@@ -379,14 +383,14 @@
+ _interpolate_trigger_get (GstInterpolationControlSource * self,
+ GstClockTime timestamp)
+ {
+- GList *node;
++ GSequenceIter *iter;
+ GstControlPoint *cp;
+
+ /* check if there is a value at the registered timestamp */
+- if ((node =
+- gst_interpolation_control_source_find_control_point_node (self,
++ if ((iter =
++ gst_interpolation_control_source_find_control_point_iter (self,
+ timestamp))) {
+- cp = node->data;
++ cp = g_sequence_get (iter);
+ if (timestamp == cp->timestamp) {
+ return &cp->value;
+ }
+@@ -518,25 +522,27 @@
+ static inline gboolean \
+ _interpolate_linear_get_##vtype (GstInterpolationControlSource *self, GstClockTime timestamp, g##vtype *ret) \
+ { \
+- GList *node; \
++ GSequenceIter *iter; \
+ GstControlPoint *cp1 = NULL, *cp2, cp={0,}; \
+ \
+- node = gst_interpolation_control_source_find_control_point_node (self, timestamp); \
+- if (node) { \
+- cp1 = node->data; \
+- node = g_list_next (node); \
++ iter = gst_interpolation_control_source_find_control_point_iter (self, timestamp); \
++ if (iter) { \
++ cp1 = g_sequence_get (iter); \
++ iter = g_sequence_iter_next (iter); \
++ iter = g_sequence_iter_is_end (iter) ? NULL : iter; \
+ } else { \
+ cp.timestamp = G_GUINT64_CONSTANT(0); \
+ g_value_init (&cp.value, self->priv->type); \
+ g_value_copy (&self->priv->default_value, &cp.value); \
+ cp1 = &cp; \
+- node = self->priv->values; \
++ if (G_LIKELY (self->priv->values)) \
++ iter = g_sequence_get_begin_iter (self->priv->values); \
+ } \
+- if (node) { \
++ if (iter) { \
+ gdouble slope; \
+ g##vtype value1,value2; \
+ \
+- cp2 = node->data; \
++ cp2 = g_sequence_get (iter); \
+ \
+ value1 = g_value_get_##vtype (&cp1->value); \
+ value2 = g_value_get_##vtype (&cp2->value); \
+@@ -655,21 +661,21 @@
+ gdouble *b = g_new0 (gdouble, n); \
+ gdouble *z = g_new0 (gdouble, n); \
+ \
+- GList *node; \
++ GSequenceIter *iter; \
+ GstControlPoint *cp; \
+ GstClockTime x_prev, x, x_next; \
+ g##vtype y_prev, y, y_next; \
+ \
+ /* Fill linear system of equations */ \
+- node = self->priv->values; \
+- cp = node->data; \
++ iter = g_sequence_get_begin_iter (self->priv->values); \
++ cp = g_sequence_get (iter); \
+ x = cp->timestamp; \
+ y = g_value_get_##vtype (&cp->value); \
+ \
+ p[0] = 1.0; \
+ \
+- node = node->next; \
+- cp = node->data; \
++ iter = g_sequence_iter_next (iter); \
++ cp = g_sequence_get (iter); \
+ x_next = cp->timestamp; \
+ y_next = g_value_get_##vtype (&cp->value); \
+ h[0] = gst_guint64_to_gdouble (x_next - x); \
+@@ -680,8 +686,8 @@
+ y_prev = y; \
+ x = x_next; \
+ y = y_next; \
+- node = node->next; \
+- cp = node->data; \
++ iter = g_sequence_iter_next (iter); \
++ cp = g_sequence_get (iter); \
+ x_next = cp->timestamp; \
+ y_next = g_value_get_##vtype (&cp->value); \
+ \
+@@ -707,12 +713,12 @@
+ \
+ /* Save cache next in the GstControlPoint */ \
+ \
+- node = self->priv->values; \
++ iter = g_sequence_get_begin_iter (self->priv->values); \
+ for (i = 0; i < n; i++) { \
+- cp = node->data; \
++ cp = g_sequence_get (iter); \
+ cp->cache.cubic.h = h[i]; \
+ cp->cache.cubic.z = z[i]; \
+- node = node->next; \
++ iter = g_sequence_iter_next (iter); \
+ } \
+ \
+ /* Free our temporary arrays */ \
+@@ -727,7 +733,7 @@
+ static inline gboolean \
+ _interpolate_cubic_get_##vtype (GstInterpolationControlSource *self, GstClockTime timestamp, g##vtype *ret) \
+ { \
+- GList *node; \
++ GSequenceIter *iter; \
+ GstControlPoint *cp1 = NULL, *cp2, cp={0,}; \
+ \
+ if (self->priv->nvalues <= 2) \
+@@ -738,23 +744,24 @@
+ self->priv->valid_cache = TRUE; \
+ } \
+ \
+- node = gst_interpolation_control_source_find_control_point_node (self, timestamp); \
+- if (node) { \
+- cp1 = node->data; \
+- node = g_list_next (node); \
++ iter = gst_interpolation_control_source_find_control_point_iter (self, timestamp); \
++ if (iter) { \
++ cp1 = g_sequence_get (iter); \
++ iter = g_sequence_iter_next (iter); \
++ iter = g_sequence_iter_is_end (iter) ? NULL : iter; \
+ } else { \
+ cp.timestamp = G_GUINT64_CONSTANT(0); \
+ g_value_init (&cp.value, self->priv->type); \
+ g_value_copy (&self->priv->default_value, &cp.value); \
+ cp1 = &cp; \
+- node = self->priv->values; \
++ iter = g_sequence_get_begin_iter (self->priv->values); \
+ } \
+- if (node) { \
++ if (iter) { \
+ gdouble diff1, diff2; \
+ g##vtype value1,value2; \
+ gdouble out; \
+ \
+- cp2 = node->data; \
++ cp2 = g_sequence_get (iter); \
+ \
+ value1 = g_value_get_##vtype (&cp1->value); \
+ value2 = g_value_get_##vtype (&cp2->value); \
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/libs/gst/controller/gstinterpolationcontrolsource.c gstreamer-0.10.23/libs/gst/controller/gstinterpolationcontrolsource.c
+--- gstreamer-0.10.23.orig/libs/gst/controller/gstinterpolationcontrolsource.c 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/libs/gst/controller/gstinterpolationcontrolsource.c 2009-06-11 14:19:59.000000000 +0200
+@@ -1,6 +1,6 @@
+ /* GStreamer
+ *
+- * Copyright (C) 2007 Sebastian Dröge <slomo@circular-chaos.org>
++ * Copyright (C) 2007,2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
+ *
+ * gstinterpolationcontrolsource.c: Control source that provides several
+ * interpolation methods
+@@ -89,13 +89,11 @@
+ g_value_unset (&self->priv->maximum_value);
+
+ if (self->priv->values) {
+- g_list_foreach (self->priv->values, (GFunc) gst_control_point_free, NULL);
+- g_list_free (self->priv->values);
++ g_sequence_free (self->priv->values);
+ self->priv->values = NULL;
+ }
+
+ self->priv->nvalues = 0;
+- self->priv->last_requested_value = NULL;
+ self->priv->valid_cache = FALSE;
+ }
+
+@@ -124,9 +122,11 @@
+ *
+ * Returns: %TRUE if the interpolation mode could be set, %FALSE otherwise
+ */
++/* *INDENT-OFF* */
+ gboolean
+-gst_interpolation_control_source_set_interpolation_mode
+- (GstInterpolationControlSource * self, GstInterpolateMode mode)
++gst_interpolation_control_source_set_interpolation_mode (
++ GstInterpolationControlSource * self, GstInterpolateMode mode)
++/* *INDENT-ON* */
+ {
+ gboolean ret = TRUE;
+ GstControlSource *csource = GST_CONTROL_SOURCE (self);
+@@ -416,44 +416,6 @@
+ return ((ct1 < ct2) ? -1 : ((ct1 == ct2) ? 0 : 1));
+ }
+
+-/*
+- * _list_find_sorted_custom:
+- *
+- * This works like g_list_find_custom() with the difference that it expects the
+- * list to be sorted in ascending order (0->MAX), stops when it the list-values
+- * are bigger that what is searched for and optionaly delivers the last node
+- * back in the @prev_node argument. This can be used to quickly insert a new
+- * node at the correct position.
+- */
+-static GList *
+-_list_find_sorted_custom (GList * list, gconstpointer data, GCompareFunc func,
+- GList ** prev_node)
+-{
+- GList *prev = list;
+- gint cmp;
+-
+- g_return_val_if_fail (func != NULL, list);
+-
+- while (list) {
+- cmp = func (list->data, data);
+- switch (cmp) {
+- case -1:
+- prev = list;
+- list = list->next;
+- break;
+- case 0:
+- return list;
+- case 1:
+- if (prev_node)
+- *prev_node = prev;
+- return NULL;
+- }
+- }
+- if (prev_node)
+- *prev_node = prev;
+- return NULL;
+-}
+-
+ static GstControlPoint *
+ _make_new_cp (GstInterpolationControlSource * self, GstClockTime timestamp,
+ GValue * value)
+@@ -473,43 +435,37 @@
+ gst_interpolation_control_source_set_internal (GstInterpolationControlSource *
+ self, GstClockTime timestamp, GValue * value)
+ {
+- GList *node, *prev = self->priv->values;
+-
+- /* check if we can shortcut and append */
+- if ((node = g_list_last (self->priv->values))) {
+- GstControlPoint *last_cp = node->data;
+-
+- if (timestamp > last_cp->timestamp) {
+- /* pass 'node' instead of list, and also deliberately ignore the result */
+- node = g_list_append (node, _make_new_cp (self, timestamp, value));
+- self->priv->nvalues++;
+- goto done;
+- }
+- }
++ GSequenceIter *iter;
+
+ /* check if a control point for the timestamp already exists */
+- if ((node = _list_find_sorted_custom (self->priv->values, ×tamp,
+- gst_control_point_find, &prev))) {
+- /* update control point */
+- GstControlPoint *cp = node->data;
+- g_value_reset (&cp->value);
+- g_value_copy (value, &cp->value);
+- } else {
+- /* sort new cp into the prop->values list */
+- if (self->priv->values) {
+- GList *new_list;
+-
+- /* pass 'prev' instead of list */
+- new_list = g_list_insert_sorted (prev,
+- _make_new_cp (self, timestamp, value), gst_control_point_compare);
+- if (self->priv->values == prev)
+- self->priv->values = new_list;
+- } else {
+- self->priv->values = g_list_prepend (NULL,
+- _make_new_cp (self, timestamp, value));
++
++ /* iter contains the iter right *after* timestamp */
++ if (G_LIKELY (self->priv->values)) {
++ iter =
++ g_sequence_search (self->priv->values, ×tamp,
++ (GCompareDataFunc) gst_control_point_find, NULL);
++ if (iter) {
++ GSequenceIter *prev = g_sequence_iter_prev (iter);
++ GstControlPoint *cp = g_sequence_get (prev);
++
++ /* If the timestamp is the same just update the control point value */
++ if (cp->timestamp == timestamp) {
++ /* update control point */
++ g_value_reset (&cp->value);
++ g_value_copy (value, &cp->value);
++ goto done;
++ }
+ }
+- self->priv->nvalues++;
++ } else {
++ self->priv->values =
++ g_sequence_new ((GDestroyNotify) gst_control_point_free);
+ }
++
++ /* sort new cp into the prop->values list */
++ g_sequence_insert_sorted (self->priv->values, _make_new_cp (self, timestamp,
++ value), (GCompareDataFunc) gst_control_point_compare, NULL);
++ self->priv->nvalues++;
++
+ done:
+ self->priv->valid_cache = FALSE;
+ }
+@@ -595,7 +551,7 @@
+ gst_interpolation_control_source_unset (GstInterpolationControlSource * self,
+ GstClockTime timestamp)
+ {
+- GList *node;
++ GSequenceIter *iter;
+ gboolean res = FALSE;
+
+ g_return_val_if_fail (GST_IS_INTERPOLATION_CONTROL_SOURCE (self), FALSE);
+@@ -603,15 +559,22 @@
+
+ g_mutex_lock (self->lock);
+ /* check if a control point for the timestamp exists */
+- if ((node = g_list_find_custom (self->priv->values, ×tamp,
+- gst_control_point_find))) {
+- if (node == self->priv->last_requested_value)
+- self->priv->last_requested_value = NULL;
+- gst_control_point_free (node->data); /* free GstControlPoint */
+- self->priv->values = g_list_delete_link (self->priv->values, node);
+- self->priv->nvalues--;
+- self->priv->valid_cache = FALSE;
+- res = TRUE;
++ if ((iter =
++ g_sequence_search (self->priv->values, ×tamp,
++ (GCompareDataFunc) gst_control_point_find, NULL))) {
++ GstControlPoint *cp;
++
++ /* Iter contains the iter right after timestamp, i.e.
++ * we need to get the previous one and check the timestamp
++ */
++ iter = g_sequence_iter_prev (iter);
++ cp = g_sequence_get (iter);
++ if (cp->timestamp == timestamp) {
++ g_sequence_remove (iter);
++ self->priv->nvalues--;
++ self->priv->valid_cache = FALSE;
++ res = TRUE;
++ }
+ }
+ g_mutex_unlock (self->lock);
+
+@@ -633,16 +596,22 @@
+
+ g_mutex_lock (self->lock);
+ /* free GstControlPoint structures */
+- g_list_foreach (self->priv->values, (GFunc) gst_control_point_free, NULL);
+- g_list_free (self->priv->values);
+- self->priv->last_requested_value = NULL;
+- self->priv->values = NULL;
++ if (self->priv->values) {
++ g_sequence_free (self->priv->values);
++ self->priv->values = NULL;
++ }
+ self->priv->nvalues = 0;
+ self->priv->valid_cache = FALSE;
+
+ g_mutex_unlock (self->lock);
+ }
+
++static void
++_append_control_point (GstControlPoint * cp, GList ** l)
++{
++ *l = g_list_prepend (*l, cp);
++}
++
+ /**
+ * gst_interpolation_control_source_get_all:
+ * @self: the #GstInterpolationControlSource to get the list from
+@@ -660,11 +629,12 @@
+ g_return_val_if_fail (GST_IS_INTERPOLATION_CONTROL_SOURCE (self), NULL);
+
+ g_mutex_lock (self->lock);
+- if (self->priv->values)
+- res = g_list_copy (self->priv->values);
++ if (G_LIKELY (self->priv->values))
++ g_sequence_foreach (self->priv->values, (GFunc) _append_control_point,
++ &res);
+ g_mutex_unlock (self->lock);
+
+- return res;
++ return g_list_reverse (res);
+ }
+
+ /**
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/libs/gst/controller/gstinterpolationcontrolsourceprivate.h gstreamer-0.10.23/libs/gst/controller/gstinterpolationcontrolsourceprivate.h
+--- gstreamer-0.10.23.orig/libs/gst/controller/gstinterpolationcontrolsourceprivate.h 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/libs/gst/controller/gstinterpolationcontrolsourceprivate.h 2009-06-11 14:19:59.000000000 +0200
+@@ -90,9 +90,8 @@
+ GValue maximum_value; /* max value for the handled property */
+ GstInterpolateMode interpolation_mode;
+
+- GList *values; /* List of GstControlPoint */
++ GSequence *values; /* List of GstControlPoint */
+ gint nvalues; /* Number of control points */
+- GList *last_requested_value; /* last search result, can be used for incremental searches */
+ gboolean valid_cache;
+ };
+
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/Makefile.am gstreamer-0.10.23/Makefile.am
+--- gstreamer-0.10.23.orig/Makefile.am 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -101,7 +101,25 @@
+ cp $(top_builddir)/win32/common/config.h-new \
+ $(top_srcdir)/win32/common/config.h
+
++check-enum-gettypes: $(top_builddir)/gst/gstenumtypes.h
++ echo 'Checking if all enum and flag _get_type() funcs are inited in gst_init()'; \
++ FUNCS=`grep '_get_type (' gst/gstenumtypes.h | sed -e 's/^.*gst_/gst_/' -e 's/_get_type.*$$/_get_type/'`;\
++ MISSING_FUNCS=''; \
++ for f in $$FUNCS; do \
++ INIT_LINE=`grep $$f $(top_srcdir)/gst/*.c | grep g_type_class_ref`; \
++ if test "x$$INIT_LINE" = "x"; then \
++ MISSING_FUNCS="$$MISSING_FUNCS $$f"; \
++ fi; \
++ done; \
++ if test "x$$MISSING_FUNCS" != "x"; then \
++ echo "FIXME: please add to the following to gst/gst.c init_post():"; \
++ for f in $$MISSING_FUNCS; do \
++ echo " g_type_class_ref ($$f ());"; \
++ done; \
++ exit 1; \
++ fi
++
+ include $(top_srcdir)/common/coverage/lcov.mak
+
+-check: check-exports
++check: check-exports check-enum-gettypes
+
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/plugins/elements/gstfakesink.c gstreamer-0.10.23/plugins/elements/gstfakesink.c
+--- gstreamer-0.10.23.orig/plugins/elements/gstfakesink.c 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/plugins/elements/gstfakesink.c 2009-06-11 14:19:59.000000000 +0200
+@@ -113,6 +113,7 @@
+ const GValue * value, GParamSpec * pspec);
+ static void gst_fake_sink_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
++static void gst_fake_sink_finalize (GObject * obj);
+
+ static GstStateChangeReturn gst_fake_sink_change_state (GstElement * element,
+ GstStateChange transition);
+@@ -146,8 +147,8 @@
+ data2 = closure->data;
+ }
+ callback =
+- (marshalfunc_VOID__MINIOBJECT_OBJECT) (marshal_data ? marshal_data : cc->
+- callback);
++ (marshalfunc_VOID__MINIOBJECT_OBJECT) (marshal_data ? marshal_data :
++ cc->callback);
+
+ callback (data1, gst_value_get_mini_object (param_values + 1),
+ g_value_get_object (param_values + 2), data2);
+@@ -182,6 +183,7 @@
+
+ gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_fake_sink_set_property);
+ gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_fake_sink_get_property);
++ gobject_class->finalize = gst_fake_sink_finalize;
+
+ g_object_class_install_property (gobject_class, PROP_STATE_ERROR,
+ g_param_spec_enum ("state-error", "State Error",
+@@ -265,6 +267,17 @@
+ fakesink->state_error = DEFAULT_STATE_ERROR;
+ fakesink->signal_handoffs = DEFAULT_SIGNAL_HANDOFFS;
+ fakesink->num_buffers = DEFAULT_NUM_BUFFERS;
++ g_static_rec_mutex_init (&fakesink->notify_lock);
++}
++
++static void
++gst_fake_sink_finalize (GObject * obj)
++{
++ GstFakeSink *sink = GST_FAKE_SINK (obj);
++
++ g_static_rec_mutex_free (&sink->notify_lock);
++
++ G_OBJECT_CLASS (parent_class)->finalize (obj);
+ }
+
+ static void
+@@ -344,6 +357,20 @@
+ }
+ }
+
++static void
++gst_fake_sink_notify_last_message (GstFakeSink * sink)
++{
++ /* FIXME: this hacks around a bug in GLib/GObject: doing concurrent
++ * g_object_notify() on the same object might lead to crashes, see
++ * http://bugzilla.gnome.org/show_bug.cgi?id=166020#c60 and follow-ups.
++ * So we really don't want to do a g_object_notify() here for out-of-band
++ * events with the streaming thread possibly also doing a g_object_notify()
++ * for an in-band buffer or event. */
++ g_static_rec_mutex_lock (&sink->notify_lock);
++ g_object_notify ((GObject *) sink, "last_message");
++ g_static_rec_mutex_unlock (&sink->notify_lock);
++}
++
+ static gboolean
+ gst_fake_sink_event (GstBaseSink * bsink, GstEvent * event)
+ {
+@@ -367,7 +394,7 @@
+ g_free (sstr);
+ GST_OBJECT_UNLOCK (sink);
+
+- g_object_notify (G_OBJECT (sink), "last_message");
++ gst_fake_sink_notify_last_message (sink);
+ }
+
+ if (GST_BASE_SINK_CLASS (parent_class)->event) {
+@@ -392,7 +419,7 @@
+ sink->last_message = g_strdup_printf ("preroll ******* ");
+ GST_OBJECT_UNLOCK (sink);
+
+- g_object_notify (G_OBJECT (sink), "last_message");
++ gst_fake_sink_notify_last_message (sink);
+ }
+ if (sink->signal_handoffs) {
+ g_signal_emit (sink,
+@@ -445,10 +472,10 @@
+ ", duration: %s, offset: %" G_GINT64_FORMAT ", offset_end: %"
+ G_GINT64_FORMAT ", flags: %d) %p", GST_BUFFER_SIZE (buf), ts_str,
+ dur_str, GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET_END (buf),
+- GST_MINI_OBJECT (buf)->flags, buf);
++ GST_MINI_OBJECT_CAST (buf)->flags, buf);
+ GST_OBJECT_UNLOCK (sink);
+
+- g_object_notify (G_OBJECT (sink), "last_message");
++ gst_fake_sink_notify_last_message (sink);
+ }
+ if (sink->signal_handoffs)
+ g_signal_emit (G_OBJECT (sink), gst_fake_sink_signals[SIGNAL_HANDOFF], 0,
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/plugins/elements/gstfakesink.h gstreamer-0.10.23/plugins/elements/gstfakesink.h
+--- gstreamer-0.10.23.orig/plugins/elements/gstfakesink.h 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/plugins/elements/gstfakesink.h 2009-06-11 14:19:59.000000000 +0200
+@@ -82,6 +82,7 @@
+ gchar *last_message;
+ gint num_buffers;
+ gint num_buffers_left;
++ GStaticRecMutex notify_lock;
+ };
+
+ struct _GstFakeSinkClass {
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/plugins/elements/gstfakesrc.c gstreamer-0.10.23/plugins/elements/gstfakesrc.c
+--- gstreamer-0.10.23.orig/plugins/elements/gstfakesrc.c 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/plugins/elements/gstfakesrc.c 2009-06-11 14:19:59.000000000 +0200
+@@ -40,6 +40,10 @@
+ * Last reviewed on 2008-06-20 (0.10.21)
+ */
+
++/* FIXME: this ignores basesrc::blocksize property, which could be used as an
++ * alias to ::sizemax (see gst_base_src_get_blocksize()).
++ */
++
+ #ifdef HAVE_CONFIG_H
+ # include "config.h"
+ #endif
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/plugins/elements/gstfilesrc.c gstreamer-0.10.23/plugins/elements/gstfilesrc.c
+--- gstreamer-0.10.23.orig/plugins/elements/gstfilesrc.c 2009-04-16 01:49:39.000000000 +0200
++++ gstreamer-0.10.23/plugins/elements/gstfilesrc.c 2009-06-11 14:19:59.000000000 +0200
+@@ -1132,6 +1132,7 @@
+ gchar *location, *hostname = NULL;
+ gboolean ret = FALSE;
+ GstFileSrc *src = GST_FILE_SRC (handler);
++ GError *error = NULL;
+
+ if (strcmp (uri, "file://") == 0) {
+ /* Special case for "file://" as this is used by some applications
+@@ -1141,10 +1142,16 @@
+ return TRUE;
+ }
+
+- location = g_filename_from_uri (uri, &hostname, NULL);
++ location = g_filename_from_uri (uri, &hostname, &error);
+
+- if (!location) {
+- GST_WARNING_OBJECT (src, "Invalid URI '%s' for filesrc", uri);
++ if (!location || error) {
++ if (error) {
++ GST_WARNING_OBJECT (src, "Invalid URI '%s' for filesrc: %s", uri,
++ error->message);
++ g_error_free (error);
++ } else {
++ GST_WARNING_OBJECT (src, "Invalid URI '%s' for filesrc", uri);
++ }
+ goto beach;
+ }
+
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/plugins/elements/gstidentity.c gstreamer-0.10.23/plugins/elements/gstidentity.c
+--- gstreamer-0.10.23.orig/plugins/elements/gstidentity.c 2009-04-15 21:18:17.000000000 +0200
++++ gstreamer-0.10.23/plugins/elements/gstidentity.c 2009-06-11 14:19:59.000000000 +0200
+@@ -137,6 +137,7 @@
+ identity = GST_IDENTITY (object);
+
+ g_free (identity->last_message);
++ g_static_rec_mutex_free (&identity->notify_lock);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+ }
+@@ -289,6 +290,21 @@
+ identity->dump = DEFAULT_DUMP;
+ identity->last_message = NULL;
+ identity->signal_handoffs = DEFAULT_SIGNAL_HANDOFFS;
++ g_static_rec_mutex_init (&identity->notify_lock);
++}
++
++static void
++gst_identity_notify_last_message (GstIdentity * identity)
++{
++ /* FIXME: this hacks around a bug in GLib/GObject: doing concurrent
++ * g_object_notify() on the same object might lead to crashes, see
++ * http://bugzilla.gnome.org/show_bug.cgi?id=166020#c60 and follow-ups.
++ * So we really don't want to do a g_object_notify() here for out-of-band
++ * events with the streaming thread possibly also doing a g_object_notify()
++ * for an in-band buffer or event. */
++ g_static_rec_mutex_lock (&identity->notify_lock);
++ g_object_notify ((GObject *) identity, "last_message");
++ g_static_rec_mutex_unlock (&identity->notify_lock);
+ }
+
+ static gboolean
+@@ -318,7 +334,7 @@
+ g_free (sstr);
+ GST_OBJECT_UNLOCK (identity);
+
+- g_object_notify (G_OBJECT (identity), "last_message");
++ gst_identity_notify_last_message (identity);
+ }
+
+ if (identity->single_segment
+@@ -561,7 +577,7 @@
+ GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), GST_BUFFER_OFFSET (buf),
+ GST_BUFFER_OFFSET_END (buf), GST_BUFFER_FLAGS (buf), buf);
+ GST_OBJECT_UNLOCK (identity);
+- g_object_notify (G_OBJECT (identity), "last-message");
++ gst_identity_notify_last_message (identity);
+ }
+ /* return DROPPED to basetransform. */
+ return GST_BASE_TRANSFORM_FLOW_DROPPED;
+@@ -585,7 +601,7 @@
+ GST_BUFFER_OFFSET (buf), GST_BUFFER_OFFSET_END (buf),
+ GST_BUFFER_FLAGS (buf), buf);
+ GST_OBJECT_UNLOCK (identity);
+- g_object_notify (G_OBJECT (identity), "last-message");
++ gst_identity_notify_last_message (identity);
+ }
+
+ if (identity->datarate > 0) {
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/plugins/elements/gstidentity.h gstreamer-0.10.23/plugins/elements/gstidentity.h
+--- gstreamer-0.10.23.orig/plugins/elements/gstidentity.h 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/plugins/elements/gstidentity.h 2009-06-11 14:19:59.000000000 +0200
+@@ -73,6 +73,7 @@
+ gchar *last_message;
+ guint64 offset;
+ gboolean signal_handoffs;
++ GStaticRecMutex notify_lock;
+ };
+
+ struct _GstIdentityClass {
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/plugins/elements/gstmultiqueue.c gstreamer-0.10.23/plugins/elements/gstmultiqueue.c
+--- gstreamer-0.10.23.orig/plugins/elements/gstmultiqueue.c 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/plugins/elements/gstmultiqueue.c 2009-06-11 14:19:59.000000000 +0200
+@@ -1385,13 +1385,9 @@
+ if (IS_FILLED (visible, visible))
+ return TRUE;
+
+- if (sq->cur_time != 0) {
+- /* if we have valid time in the queue, check */
+- res = IS_FILLED (time, sq->cur_time);
+- } else {
+- /* no valid time, check bytes */
+- res = IS_FILLED (bytes, bytes);
+- }
++ /* check time or bytes */
++ res = IS_FILLED (time, sq->cur_time) || IS_FILLED (bytes, bytes);
++
+ return res;
+ }
+
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/plugins/elements/gsttypefindelement.c gstreamer-0.10.23/plugins/elements/gsttypefindelement.c
+--- gstreamer-0.10.23.orig/plugins/elements/gsttypefindelement.c 2009-04-01 13:45:11.000000000 +0200
++++ gstreamer-0.10.23/plugins/elements/gsttypefindelement.c 2009-06-11 14:19:59.000000000 +0200
+@@ -235,6 +235,7 @@
+ gstelement_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_type_find_element_change_state);
+ }
++
+ static void
+ gst_type_find_element_init (GstTypeFindElement * typefind,
+ GstTypeFindElementClass * g_class)
+@@ -278,6 +279,7 @@
+
+ typefind->store = NULL;
+ }
++
+ static void
+ gst_type_find_element_dispose (GObject * object)
+ {
+@@ -287,6 +289,10 @@
+ gst_buffer_unref (typefind->store);
+ typefind->store = NULL;
+ }
++ if (typefind->force_caps) {
++ gst_caps_unref (typefind->force_caps);
++ typefind->force_caps = NULL;
++ }
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+ }
+@@ -318,6 +324,7 @@
+ break;
+ }
+ }
++
+ static void
+ gst_type_find_element_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec)
+@@ -607,8 +614,8 @@
+ }
+
+ static GstCaps *
+-gst_type_find_guess_by_extension (GstTypeFindElement *typefind, GstPad *pad,
+- GstTypeFindProbability *probability)
++gst_type_find_guess_by_extension (GstTypeFindElement * typefind, GstPad * pad,
++ GstTypeFindProbability * probability)
+ {
+ GstQuery *query;
+ gchar *uri;
+@@ -637,12 +644,14 @@
+ break;
+ find--;
+ }
+- if (find < 0)
++ if (find < 0)
+ goto no_extension;
+
+- GST_DEBUG_OBJECT (typefind, "found extension %s", &uri[find+1]);
++ GST_DEBUG_OBJECT (typefind, "found extension %s", &uri[find + 1]);
+
+- caps = gst_type_find_helper_for_extension (GST_OBJECT_CAST (typefind), &uri[find+1]);
++ caps =
++ gst_type_find_helper_for_extension (GST_OBJECT_CAST (typefind),
++ &uri[find + 1]);
+ if (caps)
+ *probability = GST_TYPE_FIND_MAXIMUM;
+
+@@ -818,7 +827,7 @@
+ 3. deactivate pull mode.
+ 4. src pad might have been activated push by the state change. deactivate.
+ 5. if we didn't find any caps, try getting the uri extension by doing an uri
+- query.
++ query.
+ 6. if we didn't find any caps, fail.
+ 7. emit have-type; maybe the app connected the source pad to something.
+ 8. if the sink pad is activated, we are in pull mode. succeed.
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/po/POTFILES.skip gstreamer-0.10.23/po/POTFILES.skip
+--- gstreamer-0.10.23.orig/po/POTFILES.skip 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/po/POTFILES.skip 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,2 @@
++gst/parse/grammar.tab.c
++gst/parse/grammar.tab.pre.c
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/po/README gstreamer-0.10.23/po/README
+--- gstreamer-0.10.23.orig/po/README 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/po/README 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,30 @@
++The idiot's guide to managing this directory
++
++Q: How do I add source files to be translated ?
++A: - Make sure the source file includes either gst-i18n-lib.h (if it's a part
++ of a library/plugin) or gst-i18n-app.h (if it's an application)
++ - Add the file path, relative to the top of the module, to POTFILES.in
++
++Q: How do I add/mark strings to be translated ?
++A: - Use N_(...) to mark for translation.
++ - Use _(...) to get a translated string
++ - run "make gstreamer-0.10.pot-update" to update the .pot file
++ and check if your new strings got added
++
++Q: How do I add a language ?
++A: - copy gstreamer-0.10.pot to your new language.po
++ - add the language code to LINGUAS
++ - edit the header of this language.po file and make it match one of
++ the existing .po files
++ - translate the strings
++
++Q: How do I update a language ?
++A: - run make language.po-update to update your .po file
++ (replace language with your language code)
++ - edit the .po file, and translate the untranslated strings
++ - run make install from the .po dir (so the updated strings get installed
++ and will be used in the lib/app) and test if the new strings are
++ translated
++ (To check, you need to export LANG=ll_LL. Make sure you add the last
++ bit; ie. for Dutch you need export LANG=nl_NL)
++ - commit
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/scripts/cvs-update.sh gstreamer-0.10.23/scripts/cvs-update.sh
+--- gstreamer-0.10.23.orig/scripts/cvs-update.sh 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/scripts/cvs-update.sh 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,60 @@
++#!/bin/bash
++
++# update all known gstreamer modules
++# build them one by one
++# report failures at the end
++# run this from a directory that contains the checkouts for each of the
++# modules
++
++FAILURE=
++
++for m in \
++ gstreamer gst-plugins-base \
++ gst-plugins-good gst-plugins-ugly gst-plugins-bad \
++ gst-ffmpeg \
++ gst-python \
++ ; do
++ if test -d $m; then
++ cd $m
++ cvs update -dP
++ if test $? -ne 0
++ then
++ FAILURE="$FAILURE$m: update\n"
++ cd ..
++ continue
++ fi
++ if test ! -e Makefile
++ then
++ ./autoregen.sh
++ if test $? -ne 0
++ then
++ FAILURE="$FAILURE$m: autoregen.sh\n"
++ cd ..
++ continue
++ fi
++ fi
++
++ make $@
++ if test $? -ne 0
++ then
++ FAILURE="$FAILURE$m: make\n"
++ cd ..
++ continue
++ fi
++
++ make $@ check
++ if test $? -ne 0
++ then
++ FAILURE="$FAILURE$m: check\n"
++ cd ..
++ continue
++ fi
++ cd ..
++ fi
++done
++
++if test "x$FAILURE" != "x"; then
++ echo "Failures:"
++ echo
++ echo -e $FAILURE
++fi
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/scripts/gstcvstest.sh gstreamer-0.10.23/scripts/gstcvstest.sh
+--- gstreamer-0.10.23.orig/scripts/gstcvstest.sh 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/scripts/gstcvstest.sh 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,89 @@
++#!/bin/bash
++# gstreamer auto-builder
++# 0.1.0
++# thomas@apestaart.org
++# check out fresh gstreamer cvs code anonymously, configure, build
++
++# FIXME :
++# * check out source twice, compare, to make sure we don't get code
++# in between commits
++# * add rpm building if allowed
++# * maybe change dir where stuff gets built ?
++
++
++BR=/tmp # build root
++export DISPLAY=:0.0 # gtk-scandoc needs an X server
++
++# delete logs
++rm -rf $BR/*.log
++
++echo -n "+ Starting on "
++date
++echo -n "+ "
++uname -a
++# delete gstreamer dir if it exists
++if test -e $BR/gstreamer
++then
++ echo "+ Deleting $BR/gstreamer"
++ chmod u+rwx -R /tmp/gstreamer
++ rm -rf $BR/gstreamer
++fi
++
++cd $BR
++
++# check out
++echo "+ Checking out source code"
++cvs -z3 -d:pserver:anonymous@cvs.gstreamer.sourceforge.net:/cvsroot/gstreamer co gstreamer > cvs.log 2>&1
++
++# do your thing
++cd gstreamer
++
++# autogen
++echo "+ Running ./autogen.sh"
++./autogen.sh > ../autogen.log 2>&1
++if test $? -ne 0
++then
++ echo "- Problem while running autogen.sh"
++ echo "- Dumping end of log ..."
++ echo
++ tail -n 20 ../autogen.log
++ exit
++fi
++
++echo "+ Running ./configure --enable-docs-build=no"
++./configure --enable-docs-build=no > ../configure.log 2>&1
++if test $? -ne 0
++then
++ echo "- Problem while running configure"
++ echo "- Dumping end of log ..."
++ echo
++ tail -n 20 ../configure.log
++ exit
++fi
++
++# make
++echo "+ Running make"
++make > ../make.log 2>&1
++if test $? -ne 0
++then
++ echo "- Problem while running make"
++ echo "- Dumping end of log ..."
++ echo
++ grep -v "pasting would not give a valid" ../make.log > ../make.scrubbed.log
++ tail -n 20 ../make.scrubbed.log
++ exit
++fi
++
++echo "+ Running BUILD_DOCS= make distcheck"
++BUILD_DOCS= make distcheck > ../makedistcheck.log 2>&1
++if test $? -ne 0
++then
++ echo "- Problem while running make distcheck"
++ echo "- Dumping end of log ..."
++ echo
++ tail -n 20 ../makedistcheck.log
++ exit
++fi
++
++echo -n "+ Ending successful build cycle on "
++date
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/scripts/update-funcnames gstreamer-0.10.23/scripts/update-funcnames
+--- gstreamer-0.10.23.orig/scripts/update-funcnames 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/scripts/update-funcnames 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,29 @@
++#!/bin/bash
++
++set -e
++
++if test -z "$1" -o -n "$2"; then
++ echo "Usage: $0 FILE" >&2
++ exit 1
++fi
++
++file=$1
++
++function subst () {
++ from=$1
++ to=$2
++ if grep -q $from $file; then
++ echo "$file: $from->$to"
++ perl -i -p -e "s/$from/$to/g" $file
++ fi
++}
++
++subst gst_event_new_newsegment gst_event_new_new_segment
++subst gst_event_parse_newsegment gst_event_parse_new_segment
++subst gst_event_new_buffersize gst_event_new_buffer_size
++subst gst_event_parse_buffersize gst_event_parse_buffer_size
++subst gst_ghost_pad_new_notarget gst_ghost_pad_new_no_target
++subst gst_tag_setter_merge gst_tag_setter_merge_tags
++subst gst_tag_setter_get_list gst_tag_setter_get_tag_list
++subst gst_tag_setter_get_merge_mode gst_tag_setter_get_tag_merge_mode
++subst gst_util_clock_time_scale gst_util_uint64_scale_int
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/scripts/update-macros gstreamer-0.10.23/scripts/update-macros
+--- gstreamer-0.10.23.orig/scripts/update-macros 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/scripts/update-macros 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,26 @@
++#!/bin/bash
++
++set -e
++
++if test -z "$1" -o -n "$2"; then
++ echo "Usage: $0 FILE" >&2
++ exit 1
++fi
++
++file=$1
++
++if grep -q GST_GET_LOCK $file; then
++ echo "$file: GST_GET_LOCK->GST_OBJECT_GET_LOCK"
++ perl -i -p -e 's/GST_GET_LOCK/GST_OBJECT_GET_LOCK/g' $file
++fi
++
++if egrep -q 'GST_LOCK' $file; then
++ echo "$file: GST_LOCK->GST_OBJECT_LOCK"
++ perl -i -p -e 's/GST_LOCK/GST_OBJECT_LOCK/g' $file
++fi
++
++if egrep -q 'GST_UNLOCK' $file; then
++ echo "$file: GST_UNLOCK->GST_OBJECT_UNLOCK"
++ perl -i -p -e 's/GST_UNLOCK/GST_OBJECT_UNLOCK/g' $file
++fi
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/scripts/update-states gstreamer-0.10.23/scripts/update-states
+--- gstreamer-0.10.23.orig/scripts/update-states 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/scripts/update-states 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,66 @@
++#!/bin/bash
++
++set -e
++
++if test -z "$1" -o -n "$2"; then
++ echo "Usage: $0 FILE" >&2
++ exit 1
++fi
++
++file=$1
++
++if grep -q GstElementState $file; then
++ echo "$file: GstElementState->GstState"
++ perl -i -p -e 's/GstElementState/GstState/g' $file
++fi
++
++if grep -q GstStateReturn $file; then
++ echo "$file: GstStateReturn->GstStateChangeReturn"
++ perl -i -p -e 's/GstStateReturn/GstStateChangeReturn/g' $file
++fi
++
++if egrep 'GST_STATE_(ASYNC|SUCCESS|FAILURE|NO_PREROLL)' $file | grep -q -v 'NO_PREROLL ('; then
++ echo "$file: GST_STATE_SUCCESS -> GST_STATE_CHANGE_SUCCESS"
++ perl -i -p -e 's/GST_STATE_SUCCESS/GST_STATE_CHANGE_SUCCESS/g' $file
++ perl -i -p -e 's/GST_STATE_ASYNC/GST_STATE_CHANGE_ASYNC/g' $file
++ perl -i -p -e 's/GST_STATE_FAILURE/GST_STATE_CHANGE_FAILURE/g' $file
++ perl -i -p -e 's/GST_STATE_NO_PREROLL/GST_STATE_CHANGE_NO_PREROLL/g' $file
++ # hack around the overloaded macro in 0.9
++ perl -i -p -e 's/GST_STATE_CHANGE_NO_PREROLL \(/GST_STATE_NO_PREROLL (/g' $file
++fi
++
++if grep 'change_state (' $file | grep -q 'element)'; then
++ echo "$file: change_state (GstElement) -> change_state (GstElement, GstStateChange)"
++ perl -i -p -e 's/^(static.*)change_state \(GstElement \* element\);/$1change_state (GstElement * element,\n GstStateChange transition);/g' $file
++ perl -i -p -e 's/change_state \(GstElement \* element\)/change_state (GstElement * element, GstStateChange transition)/g' $file
++ perl -i -p -e 's/change_state \(element\)/change_state (element, transition)/g' $file
++ egrep -v '^[[:space:]]+GstState transition;' < $file > $file.tmp
++ mv $file.tmp $file
++ grep -v 'transition = ' < $file > $file.tmp
++ mv $file.tmp $file
++fi
++
++if grep -q GST_STATE_TRANSITION $file; then
++ echo "$file: CHECK ME: GST_STATE_TRANSITION (element) -> transition"
++ perl -i -p -e 's/GST_STATE_TRANSITION \(element\)/transition/g' $file
++fi
++
++if grep 'transition' $file | grep -q int; then
++ echo "$file: Removing ghetto int transitions"
++ egrep -v '^[[:space:]]+g?u?int.* transition;' < $file > $file.tmp
++ mv $file.tmp $file
++fi
++
++if egrep -q 'GST_STATE_[A-Z]+_TO_[A-Z]+' $file; then
++ echo "$file: GST_STATE_NULL_TO_READY -> GST_STATE_CHANGE_NULL_TO_READY"
++ perl -i -p -e 's/GST_STATE_([A-Z]+)_TO_([A-Z]+)/GST_STATE_CHANGE_$1_TO_$2/g' $file
++fi
++
++if grep -q GstStateReturn $file; then
++ echo "$file: GST_STATE_SUCCESS -> GST_STATE_CHANGE_SUCCESS"
++ perl -i -p -e 's/GstStateReturn/GstStateChangeReturn/g' $file
++ perl -i -p -e 's/GST_STATE_SUCCESS/GST_STATE_CHANGE_SUCCESS/g' $file
++ perl -i -p -e 's/GST_STATE_ASYNC/GST_STATE_CHANGE_ASYNC/g' $file
++ perl -i -p -e 's/GST_STATE_FAILURE/GST_STATE_CHANGE_FAILURE/g' $file
++ perl -i -p -e 's/GST_STATE_NO_PREROLL/GST_STATE_CHANGE_NO_PREROLL/g' $file
++fi
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/benchmarks/complexity.gnuplot gstreamer-0.10.23/tests/benchmarks/complexity.gnuplot
+--- gstreamer-0.10.23.orig/tests/benchmarks/complexity.gnuplot 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/benchmarks/complexity.gnuplot 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,25 @@
++# Copyright (C) 2005 Andy Wingo
++#
++# This library is free software; you can redistribute it and/or
++# modify it under the terms of the GNU Lesser General Public
++# License as published by the Free Software Foundation; either
++# version 2.1 of the License, or (at your option) any later version.
++#
++# This library is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++# Lesser General Public License for more details.
++#
++# You should have received a copy of the GNU Lesser General Public
++# License along with this library; if not, write to the Free Software
++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++
++set terminal postscript landscape monochrome dashed "Helvetica" 14
++set xlabel "Number of Forks Per Tee"
++set ylabel "Seconds"
++set logscale x
++set title "Complex Pipeline Performance: N Forks per Tee, 1024 Elements"
++plot "complexity.data" using 1:2 title "Element creation", \
++ "complexity.data" using 1:3 title "State change", \
++ "complexity.data" using 1:4 title "Processing 1000 buffers", \
++ "complexity.data" using 1:5 title "Element destruction"
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/benchmarks/complexity.scm gstreamer-0.10.23/tests/benchmarks/complexity.scm
+--- gstreamer-0.10.23.orig/tests/benchmarks/complexity.scm 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/benchmarks/complexity.scm 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,85 @@
++#!/bin/bash
++# -*- scheme -*-
++exec guile -s $0 "$@"
++!#
++
++;; Copyright (C) 2005 Andy Wingo
++;;
++;; This library is free software; you can redistribute it and/or
++;; modify it under the terms of the GNU Lesser General Public
++;; License as published by the Free Software Foundation; either
++;; version 2.1 of the License, or (at your option) any later version.
++;;
++;; This library is distributed in the hope that it will be useful,
++;; but WITHOUT ANY WARRANTY; without even the implied warranty of
++;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++;; Lesser General Public License for more details.
++;;
++;; You should have received a copy of the GNU Lesser General Public
++;; License along with this library; if not, write to the Free Software
++;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++
++;; Quick hack to make some data files that gnuplot can read from
++;; complexity. Guile 1.6.
++
++(use-modules (srfi srfi-13)
++ (srfi srfi-1)
++ (ice-9 optargs)
++ (ice-9 popen))
++
++(define *phases* '(create set run destroy))
++
++(define (read-lines port)
++ (let lp ((lines '()))
++ (let ((x (read-line port)))
++ (if (eof-object? x)
++ (begin
++ (close-port port)
++ (reverse! lines))
++ (lp (cons x lines))))))
++
++(define (parse-time str)
++ (and (char-numeric? (string-ref str 0))
++ (fold (lambda (x ret) (+ (* ret 60) x)) 0
++ (map (lambda (x) (with-input-from-string x read))
++ (string-split str #\:)))))
++
++(define (run-test program . args)
++ (format #t "; running test: ~a\n" (cons program args))
++ (map
++ cons
++ *phases*
++ (filter-map
++ parse-time
++ (read-lines
++ (open-input-pipe
++ (string-join (map object->string (cons program args)) " "))))))
++
++(define (seq start stop step)
++ (let lp ((n start) (out '()))
++ (if (> n stop)
++ (reverse! out)
++ (lp (+ n step) (cons n out)))))
++
++(define (run-tests n-elements)
++ (let lp ((x 1) (out '()))
++ (if (> x n-elements)
++ (reverse! out)
++ (lp (* x 2)
++ (acons x (run-test "./complexity" x n-elements) out)))))
++
++(define (output-results results)
++ (let ((p (open-output-file "complexity.data")))
++ (display "#complexity creation state-change run destroy\n" p)
++ (for-each
++ (lambda (line)
++ (display (car line) p)
++ (for-each
++ (lambda (t) (format p " ~a" t))
++ (map cdr (cdr line)))
++ (newline p))
++ results)
++ (close-port p)))
++
++(output-results
++ (apply run-tests (map string->number (cdr (program-arguments)))))
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/benchmarks/controller.c gstreamer-0.10.23/tests/benchmarks/controller.c
+--- gstreamer-0.10.23.orig/tests/benchmarks/controller.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/benchmarks/controller.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,172 @@
++/* GStreamer
++ * Copyright (C) 2009 Stefan Kost <ensonic@users.sf.net>
++ *
++ * controller.c: benchmark for interpolation control-source
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#include <gst/gst.h>
++#include <gst/controller/gstcontroller.h>
++#include <gst/controller/gstinterpolationcontrolsource.h>
++
++/* a song in buzztard can easily reach 30000 here */
++#define NUM_CP 15000
++#define BLOCK_SIZE 64
++
++static void
++event_loop (GstElement * pipe)
++{
++ GstBus *bus;
++ GstMessage *message = NULL;
++
++ bus = gst_element_get_bus (GST_ELEMENT (pipe));
++
++ while (TRUE) {
++ message = gst_bus_poll (bus, GST_MESSAGE_ANY, -1);
++
++ g_assert (message != NULL);
++
++ switch (message->type) {
++ case GST_MESSAGE_EOS:
++ gst_message_unref (message);
++ return;
++ case GST_MESSAGE_WARNING:
++ case GST_MESSAGE_ERROR:{
++ GError *gerror;
++ gchar *debug;
++
++ gst_message_parse_error (message, &gerror, &debug);
++ gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
++ gst_message_unref (message);
++ g_error_free (gerror);
++ g_free (debug);
++ return;
++ }
++ default:
++ gst_message_unref (message);
++ break;
++ }
++ }
++}
++
++gint
++main (gint argc, gchar * argv[])
++{
++ gint res = 1;
++ gint i, j;
++ GstElement *src, *sink;
++ GstElement *bin;
++ GstController *ctrl;
++ GstInterpolationControlSource *csource;
++ GValue freq = { 0, };
++ GstClockTime bt, ct;
++ GstClockTimeDiff elapsed;
++ GstClockTime tick;
++
++ gst_init (&argc, &argv);
++ gst_controller_init (&argc, &argv);
++
++ /* build pipeline */
++ bin = gst_pipeline_new ("pipeline");
++ src = gst_element_factory_make ("audiotestsrc", "gen_audio");
++ if (!src) {
++ GST_WARNING ("need audiotestsrc from gst-plugins-base");
++ goto Error;
++ }
++ sink = gst_element_factory_make ("fakesink", "swallow_audio");
++
++ gst_bin_add_many (GST_BIN (bin), src, sink, NULL);
++ if (!gst_element_link (src, sink)) {
++ GST_WARNING ("can't link elements");
++ goto Error;
++ }
++
++ g_object_set (G_OBJECT (src), "wave", 7, /* sine table - we don't want to benchmark the fpu */
++ "num-buffers", NUM_CP, "samplesperbuffer", BLOCK_SIZE, NULL);
++
++ tick = BLOCK_SIZE * GST_SECOND / 44100;
++
++ /* add a controller to the source */
++ if (!(ctrl = gst_controller_new (G_OBJECT (src), "freq", NULL))) {
++ GST_WARNING ("can't control source element");
++ goto Error;
++ }
++
++ /* create and configure control source */
++ csource = gst_interpolation_control_source_new ();
++ gst_controller_set_control_source (ctrl, "freq",
++ GST_CONTROL_SOURCE (csource));
++ gst_interpolation_control_source_set_interpolation_mode (csource,
++ GST_INTERPOLATE_LINEAR);
++ g_value_init (&freq, G_TYPE_DOUBLE);
++
++
++ /* set control values, we set them in a linear order as we would when loading
++ * a stored project
++ */
++ bt = gst_util_get_timestamp ();
++
++ for (i = 0; i < NUM_CP; i++) {
++ g_value_set_double (&freq, g_random_double_range (50.0, 3000.0));
++ gst_interpolation_control_source_set (csource, i * tick, &freq);
++ }
++
++ ct = gst_util_get_timestamp ();
++ elapsed = GST_CLOCK_DIFF (bt, ct);
++ printf ("linear insert of control-points: %" GST_TIME_FORMAT "\n",
++ GST_TIME_ARGS (elapsed));
++
++
++ /* set extra control values, we set them in arbitrary order to simulate
++ * the user editing a project from the ui
++ */
++ bt = gst_util_get_timestamp ();
++
++ for (i = 0; i < 100; i++) {
++ j = g_random_int_range (0, NUM_CP - 1);
++ g_value_set_double (&freq, g_random_double_range (50.0, 3000.0));
++ gst_interpolation_control_source_set (csource, j * tick, &freq);
++ }
++
++ ct = gst_util_get_timestamp ();
++ elapsed = GST_CLOCK_DIFF (bt, ct);
++ printf ("random insert of control-points: %" GST_TIME_FORMAT "\n",
++ GST_TIME_ARGS (elapsed));
++
++ g_object_unref (csource);
++
++ /* play, this test sequential reads */
++ bt = gst_util_get_timestamp ();
++
++ if (gst_element_set_state (bin, GST_STATE_PLAYING)) {
++ /* wait for EOS */
++ event_loop (bin);
++ gst_element_set_state (bin, GST_STATE_NULL);
++ }
++
++ ct = gst_util_get_timestamp ();
++ elapsed = GST_CLOCK_DIFF (bt, ct);
++ printf ("linear read of control-points: %" GST_TIME_FORMAT "\n",
++ GST_TIME_ARGS (elapsed));
++
++ /* cleanup */
++ g_object_unref (G_OBJECT (ctrl));
++ gst_object_unref (G_OBJECT (bin));
++ res = 0;
++Error:
++ return res;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/benchmarks/gstclockstress.c gstreamer-0.10.23/tests/benchmarks/gstclockstress.c
+--- gstreamer-0.10.23.orig/tests/benchmarks/gstclockstress.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/benchmarks/gstclockstress.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,90 @@
++/* GStreamer
++ * Copyright (C) <2009> Wim Taymans <wim taymans at gmail dot com>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#include <stdlib.h>
++#include <gst/gst.h>
++
++#define MAX_THREADS 100
++
++static gboolean running = TRUE;
++static gint count = 0;
++
++static void *
++run_test (void *user_data)
++{
++ gint prev;
++ GstClock *sysclock = GST_CLOCK_CAST (user_data);
++
++ while (running) {
++ gst_clock_get_time (sysclock);
++ prev = g_atomic_int_exchange_and_add (&count, 1);
++ if (prev == G_MAXINT)
++ g_warning ("overflow");
++ }
++ g_thread_exit (NULL);
++ return NULL;
++}
++
++gint
++main (gint argc, gchar * argv[])
++{
++ GThread *threads[MAX_THREADS];
++ gint num_threads;
++ gint t;
++ GstClock *sysclock;
++
++ gst_init (&argc, &argv);
++
++ if (argc != 2) {
++ g_print ("usage: %s <num_threads>\n", argv[0]);
++ exit (-1);
++ }
++
++ num_threads = atoi (argv[1]);
++
++ sysclock = gst_system_clock_obtain ();
++
++ for (t = 0; t < num_threads; t++) {
++ GError *error = NULL;
++
++ threads[t] = g_thread_create (run_test, sysclock, TRUE, &error);
++ if (error) {
++ printf ("ERROR: g_thread_create() %s\n", error->message);
++ exit (-1);
++ }
++ }
++ printf ("main(): Created %d threads.\n", t);
++
++ /* run for 5 seconds */
++ g_usleep (G_USEC_PER_SEC * 5);
++
++ printf ("main(): Stopping threads...\n");
++
++ running = FALSE;
++
++ for (t = 0; t < num_threads; t++) {
++ g_thread_join (threads[t]);
++ }
++
++ g_print ("performed %d get_time operations\n", count);
++
++ gst_object_unref (sysclock);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/benchmarks/Makefile.am gstreamer-0.10.23/tests/benchmarks/Makefile.am
+--- gstreamer-0.10.23.orig/tests/benchmarks/Makefile.am 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/tests/benchmarks/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -1,10 +1,15 @@
+ noinst_PROGRAMS = \
+ caps \
+ complexity \
++ controller \
+ init \
+ mass-elements \
+- gstpollstress
++ gstpollstress \
++ gstclockstress
+
+ LDADD = $(GST_OBJ_LIBS)
+ AM_CFLAGS = $(GST_OBJ_CFLAGS)
+
++controller_CFLAGS = $(GST_OBJ_CFLAGS) -I$(top_builddir)/libs
++controller_LDFLAGS = $(top_builddir)/libs/gst/controller/libgstcontroller-@GST_MAJORMINOR@.la
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/benchmarks/mass-elements.gnuplot gstreamer-0.10.23/tests/benchmarks/mass-elements.gnuplot
+--- gstreamer-0.10.23.orig/tests/benchmarks/mass-elements.gnuplot 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/benchmarks/mass-elements.gnuplot 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,24 @@
++# Copyright (C) 2005 Andy Wingo
++#
++# This library is free software; you can redistribute it and/or
++# modify it under the terms of the GNU Lesser General Public
++# License as published by the Free Software Foundation; either
++# version 2.1 of the License, or (at your option) any later version.
++#
++# This library is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++# Lesser General Public License for more details.
++#
++# You should have received a copy of the GNU Lesser General Public
++# License along with this library; if not, write to the Free Software
++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++
++set terminal postscript landscape monochrome dashed "Helvetica" 14
++set xlabel "Number of Identity Elements"
++set ylabel "Seconds"
++set title "Mass Pipeline Performance: fakesrc ! N * identity ! fakesink"
++plot "mass_elements.data" using 1:2 title "Element creation", \
++ "mass_elements.data" using 1:3 title "State change", \
++ "mass_elements.data" using 1:4 title "Processing 1000 buffers", \
++ "mass_elements.data" using 1:5 title "Element destruction"
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/benchmarks/mass-elements.scm gstreamer-0.10.23/tests/benchmarks/mass-elements.scm
+--- gstreamer-0.10.23.orig/tests/benchmarks/mass-elements.scm 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/benchmarks/mass-elements.scm 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,84 @@
++#!/bin/bash
++# -*- scheme -*-
++exec guile -s $0 "$@"
++!#
++
++;; Copyright (C) 2005 Andy Wingo
++;;
++;; This library is free software; you can redistribute it and/or
++;; modify it under the terms of the GNU Lesser General Public
++;; License as published by the Free Software Foundation; either
++;; version 2.1 of the License, or (at your option) any later version.
++;;
++;; This library is distributed in the hope that it will be useful,
++;; but WITHOUT ANY WARRANTY; without even the implied warranty of
++;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++;; Lesser General Public License for more details.
++;;
++;; You should have received a copy of the GNU Lesser General Public
++;; License along with this library; if not, write to the Free Software
++;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++
++;; Quick hack to make some data files that gnuplot can read from
++;; mass-elements. Guile 1.6.
++
++(use-modules (srfi srfi-13)
++ (srfi srfi-1)
++ (ice-9 optargs)
++ (ice-9 popen))
++
++(define *phases* '(create set run destroy))
++
++(define (read-lines port)
++ (let lp ((lines '()))
++ (let ((x (read-line port)))
++ (if (eof-object? x)
++ (begin
++ (close-port port)
++ (reverse! lines))
++ (lp (cons x lines))))))
++
++(define (run-test n-identities)
++ (format #t "; running test: ~a\n" n-identities)
++ (let lp ((in (read-lines
++ (open-input-pipe
++ (format #f "./mass_elements ~A"
++ (number->string n-identities)))))
++ (out '()))
++ (if (null? in)
++ (begin
++ (or (eq? (length out) 4) (error "Invalid mass_elements output"))
++ (map cons *phases* (reverse! out)))
++ (let ((line (car in)))
++ (if (eqv? (string-ref line 0) #\*)
++ (lp (cdr in) out)
++ (lp (cdr in)
++ (cons (fold (lambda (x ret) (+ (* ret 60) x)) 0
++ (map (lambda (x) (with-input-from-string x read))
++ (string-split line #\:)))
++ out)))))))
++
++(define (run-tests start stop step)
++ (let lp ((n start) (out '()))
++ (if (> n stop)
++ (reverse! out)
++ (lp (+ n step)
++ (acons n (run-test n) out)))))
++
++(define (output-results results)
++ (let ((p (open-output-file "mass_elements.data")))
++ (display "#num_identities creation state-change run destroy\n" p)
++ (let lp ((in results))
++ (if (not (null? in))
++ (let* ((line (car in))
++ (n (car line)))
++ (display n p)
++ (for-each
++ (lambda (t) (format p " ~a" t))
++ (map cdr (cdr line)))
++ (newline p)
++ (lp (cdr in)))))
++ (close-port p)))
++
++(output-results
++ (apply run-tests (map string->number (cdr (program-arguments)))))
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/check/elements/fakesink.c gstreamer-0.10.23/tests/check/elements/fakesink.c
+--- gstreamer-0.10.23.orig/tests/check/elements/fakesink.c 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/tests/check/elements/fakesink.c 2009-06-11 14:19:59.000000000 +0200
+@@ -4,6 +4,7 @@
+ *
+ * Copyright (C) <2005> Thomas Vander Stichele <thomas at apestaart dot org>
+ * <2007> Wim Taymans <wim@fluendo.com>
++ * <2009> Tim-Philipp Müller <tim centricular net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+@@ -23,6 +24,7 @@
+
+ #include <unistd.h>
+
++#include <gst/base/gstpushsrc.h>
+ #include <gst/check/gstcheck.h>
+
+ typedef struct
+@@ -858,6 +860,106 @@
+
+ GST_END_TEST;
+
++/* like fakesrc, but also pushes an OOB event after each buffer */
++typedef GstPushSrc OOBSource;
++typedef GstPushSrcClass OOBSourceClass;
++
++GST_BOILERPLATE (OOBSource, oob_source, GstPushSrc, GST_TYPE_PUSH_SRC);
++
++static void
++oob_source_base_init (gpointer g_class)
++{
++ static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("src",
++ GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY);
++
++ gst_element_class_add_pad_template (GST_ELEMENT_CLASS (g_class),
++ gst_static_pad_template_get (&sinktemplate));
++}
++
++static GstFlowReturn
++oob_source_create (GstPushSrc * src, GstBuffer ** p_buf)
++{
++ *p_buf = gst_buffer_new ();
++
++ gst_pad_push_event (GST_BASE_SRC_PAD (src),
++ gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM_OOB, NULL));
++
++ return GST_FLOW_OK;
++}
++
++static void
++oob_source_class_init (OOBSourceClass * klass)
++{
++ GstPushSrcClass *pushsrc_class = GST_PUSH_SRC_CLASS (klass);
++
++ pushsrc_class->create = GST_DEBUG_FUNCPTR (oob_source_create);
++}
++
++static void
++oob_source_init (OOBSource * src, OOBSourceClass * g_class)
++{
++ /* nothing to do */
++}
++
++#define NOTIFY_RACE_NUM_PIPELINES 20
++
++typedef struct
++{
++ GstElement *src;
++ GstElement *queue;
++ GstElement *sink;
++ GstElement *pipe;
++} NotifyRacePipeline;
++
++static void
++test_notify_race_setup_pipeline (NotifyRacePipeline * p)
++{
++ p->pipe = gst_pipeline_new ("pipeline");
++ p->src = g_object_new (oob_source_get_type (), NULL);
++
++ p->queue = gst_element_factory_make ("queue", NULL);
++ g_object_set (p->queue, "max-size-buffers", 2, NULL);
++
++ p->sink = gst_element_factory_make ("fakesink", NULL);
++ gst_bin_add (GST_BIN (p->pipe), p->src);
++ gst_bin_add (GST_BIN (p->pipe), p->queue);
++ gst_bin_add (GST_BIN (p->pipe), p->sink);
++ gst_element_link_many (p->src, p->queue, p->sink, NULL);
++
++ fail_unless_equals_int (gst_element_set_state (p->pipe, GST_STATE_PLAYING),
++ GST_STATE_CHANGE_ASYNC);
++ fail_unless_equals_int (gst_element_get_state (p->pipe, NULL, NULL, -1),
++ GST_STATE_CHANGE_SUCCESS);
++}
++
++static void
++test_notify_race_cleanup_pipeline (NotifyRacePipeline * p)
++{
++ gst_element_set_state (p->pipe, GST_STATE_NULL);
++ gst_object_unref (p->pipe);
++ memset (p, 0, sizeof (NotifyRacePipeline));
++}
++
++/* we create N pipelines to make sure the notify race isn't per-class, but
++ * only per instance */
++GST_START_TEST (test_notify_race)
++{
++ NotifyRacePipeline pipelines[NOTIFY_RACE_NUM_PIPELINES];
++ int i;
++
++ for (i = 0; i < G_N_ELEMENTS (pipelines); ++i) {
++ test_notify_race_setup_pipeline (&pipelines[i]);
++ }
++
++ g_usleep (2 * G_USEC_PER_SEC);
++
++ for (i = 0; i < G_N_ELEMENTS (pipelines); ++i) {
++ test_notify_race_cleanup_pipeline (&pipelines[i]);
++ }
++}
++
++GST_END_TEST;
++
+ static Suite *
+ fakesink_suite (void)
+ {
+@@ -872,6 +974,7 @@
+ tcase_add_test (tc_chain, test_eos);
+ tcase_add_test (tc_chain, test_eos2);
+ tcase_add_test (tc_chain, test_position);
++ tcase_add_test (tc_chain, test_notify_race);
+
+ return s;
+ }
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/check/gst/gstbin.c gstreamer-0.10.23/tests/check/gst/gstbin.c
+--- gstreamer-0.10.23.orig/tests/check/gst/gstbin.c 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/tests/check/gst/gstbin.c 2009-06-11 14:19:59.000000000 +0200
+@@ -300,8 +300,9 @@
+ /* each object is referenced by a message;
+ * base_src is blocked in the push and has an extra refcount.
+ * base_sink_chain has taken a refcount on the sink, and is blocked on
+- * preroll */
+- ASSERT_OBJECT_REFCOUNT (src, "src", 2);
++ * preroll
++ * The stream-status messages holds 2 more refs to the element */
++ ASSERT_OBJECT_REFCOUNT (src, "src", 4);
+ /* refcount can be 4 if the bin is still processing the async_done message of
+ * the sink. */
+ ASSERT_OBJECT_REFCOUNT_BETWEEN (sink, "sink", 2, 3);
+@@ -352,8 +353,9 @@
+ ret = gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_READY);
+ fail_unless (ret == GST_STATE_CHANGE_SUCCESS);
+
+- /* each object is referenced by two messages */
+- ASSERT_OBJECT_REFCOUNT (src, "src", 3);
++ /* each object is referenced by two messages, the source also has the
++ * stream-status message referencing it */
++ ASSERT_OBJECT_REFCOUNT (src, "src", 4);
+ ASSERT_OBJECT_REFCOUNT (sink, "sink", 3);
+ ASSERT_OBJECT_REFCOUNT (pipeline, "pipeline", 3);
+
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/check/gst/gstbufferlist.c gstreamer-0.10.23/tests/check/gst/gstbufferlist.c
+--- gstreamer-0.10.23.orig/tests/check/gst/gstbufferlist.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/check/gst/gstbufferlist.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,667 @@
++/* GStreamer
++ *
++ * unit test for GstBufferList
++ *
++ * Copyright (C) 2009 Axis Communications <dev-gstreamer at axis dot com>
++ * @author Jonas Holmberg <jonas dot holmberg at axis dot com>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#include <gst/check/gstcheck.h>
++#include <gst/gstbufferlist.h>
++#include <string.h>
++
++#define TIMESTAMP 42
++
++static GstBufferList *list;
++static GstCaps *caps;
++
++static void
++setup (void)
++{
++ list = gst_buffer_list_new ();
++ caps = gst_caps_new_simple ("text/plain", NULL);
++}
++
++static void
++cleanup (void)
++{
++ gst_caps_unref (caps);
++ gst_buffer_list_unref (list);
++}
++
++static GstBuffer *
++buffer_from_string (gchar * str)
++{
++ guint size;
++ GstBuffer *buf;
++
++ size = strlen (str);
++ buf = gst_buffer_new_and_alloc (size);
++ gst_buffer_set_caps (buf, caps);
++ GST_BUFFER_TIMESTAMP (buf) = TIMESTAMP;
++ memcpy (GST_BUFFER_DATA (buf), str, size);
++ GST_BUFFER_SIZE (buf) = size;
++
++ return buf;
++}
++
++GST_START_TEST (test_add_and_iterate)
++{
++ GstBufferListIterator *it;
++ GstBuffer *buf1;
++ GstBuffer *buf2;
++ GstBuffer *buf3;
++ GstBuffer *buf4;
++ GstBuffer *buf;
++
++ /* buffer list is initially empty */
++ fail_unless (gst_buffer_list_n_groups (list) == 0);
++
++ it = gst_buffer_list_iterate (list);
++
++ ASSERT_CRITICAL (gst_buffer_list_iterator_add (it, NULL));
++ ASSERT_CRITICAL (gst_buffer_list_iterator_add (NULL, NULL));
++
++ /* cannot add buffer without adding a group first */
++ buf1 = gst_buffer_new ();
++ ASSERT_CRITICAL (gst_buffer_list_iterator_add (it, buf1));
++
++ /* add a group of 2 buffers */
++ fail_unless (gst_buffer_list_iterator_n_buffers (it) == 0);
++ gst_buffer_list_iterator_add_group (it);
++ fail_unless (gst_buffer_list_n_groups (list) == 1);
++ ASSERT_CRITICAL (gst_buffer_list_iterator_add (it, NULL));
++ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 1);
++ gst_buffer_list_iterator_add (it, buf1);
++ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 1); /* list takes ownership */
++ fail_unless (gst_buffer_list_n_groups (list) == 1);
++ fail_unless (gst_buffer_list_iterator_n_buffers (it) == 0);
++ buf2 = gst_buffer_new ();
++ gst_buffer_list_iterator_add (it, buf2);
++ ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 1);
++ fail_unless (gst_buffer_list_n_groups (list) == 1);
++ fail_unless (gst_buffer_list_iterator_n_buffers (it) == 0);
++
++ /* add another group of 2 buffers */
++ gst_buffer_list_iterator_add_group (it);
++ fail_unless (gst_buffer_list_n_groups (list) == 2);
++ buf3 = gst_buffer_new ();
++ gst_buffer_list_iterator_add (it, buf3);
++ ASSERT_BUFFER_REFCOUNT (buf3, "buf3", 1);
++ fail_unless (gst_buffer_list_n_groups (list) == 2);
++ fail_unless (gst_buffer_list_iterator_n_buffers (it) == 0);
++ buf4 = gst_buffer_new ();
++ gst_buffer_list_iterator_add (it, buf4);
++ ASSERT_BUFFER_REFCOUNT (buf4, "buf4", 1);
++ fail_unless (gst_buffer_list_n_groups (list) == 2);
++ fail_unless (gst_buffer_list_iterator_n_buffers (it) == 0);
++
++ /* freeing iterator does not affect list */
++ gst_buffer_list_iterator_free (it);
++ fail_unless (gst_buffer_list_n_groups (list) == 2);
++
++ /* create a new iterator */
++ it = gst_buffer_list_iterate (list);
++
++ /* iterate list */
++ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
++ fail_unless (gst_buffer_list_iterator_next_group (it));
++ fail_unless (gst_buffer_list_iterator_n_buffers (it) == 2);
++ buf = gst_buffer_list_iterator_next (it);
++ fail_unless (buf == buf1);
++ fail_unless (gst_buffer_list_iterator_n_buffers (it) == 1);
++ buf = gst_buffer_list_iterator_next (it);
++ fail_unless (buf == buf2);
++ fail_unless (gst_buffer_list_iterator_n_buffers (it) == 0);
++ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
++ fail_unless (gst_buffer_list_iterator_next_group (it));
++ fail_unless (gst_buffer_list_iterator_n_buffers (it) == 2);
++ buf = gst_buffer_list_iterator_next (it);
++ fail_unless (buf == buf3);
++ fail_unless (gst_buffer_list_iterator_n_buffers (it) == 1);
++ buf = gst_buffer_list_iterator_next (it);
++ fail_unless (buf == buf4);
++ fail_unless (gst_buffer_list_iterator_n_buffers (it) == 0);
++ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
++ fail_if (gst_buffer_list_iterator_next_group (it));
++
++ gst_buffer_list_iterator_free (it);
++}
++
++GST_END_TEST;
++
++GST_START_TEST (test_make_writable)
++{
++ GstBufferListIterator *it;
++ GstBufferList *wlist;
++ GstBuffer *buf1;
++ GstBuffer *buf2;
++ GstBuffer *buf3;
++ GstBuffer *buf;
++
++ /* add buffers to list */
++ it = gst_buffer_list_iterate (list);
++ gst_buffer_list_iterator_add_group (it);
++ buf1 = gst_buffer_new_and_alloc (1);
++ gst_buffer_list_iterator_add (it, buf1);
++ gst_buffer_list_iterator_add_group (it);
++ buf2 = gst_buffer_new_and_alloc (2);
++ gst_buffer_list_iterator_add (it, buf2);
++ buf3 = gst_buffer_new_and_alloc (3);
++ gst_buffer_list_iterator_add (it, buf3);
++ gst_buffer_list_iterator_free (it);
++
++ /* making it writable with refcount 1 returns the same list */
++ wlist = gst_buffer_list_make_writable (list);
++ fail_unless (wlist == list);
++ it = gst_buffer_list_iterate (list);
++ fail_unless (gst_buffer_list_iterator_next_group (it));
++ buf = gst_buffer_list_iterator_next (it);
++ fail_unless (buf == buf1);
++ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 1);
++ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
++ fail_unless (gst_buffer_list_iterator_next_group (it));
++ buf = gst_buffer_list_iterator_next (it);
++ fail_unless (buf == buf2);
++ ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 1);
++ buf = gst_buffer_list_iterator_next (it);
++ fail_unless (buf == buf3);
++ ASSERT_BUFFER_REFCOUNT (buf3, "buf3", 1);
++ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
++ fail_if (gst_buffer_list_iterator_next_group (it));
++ gst_buffer_list_iterator_free (it);
++
++ /* making it writable with refcount 2 returns a copy of the list with
++ * increased refcount on the buffers in the list */
++ gst_buffer_list_ref (list);
++ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (list) == 2);
++ wlist = gst_buffer_list_make_writable (list);
++ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (list) == 1);
++ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (wlist) == 1);
++ fail_unless (wlist != list);
++ it = gst_buffer_list_iterate (wlist);
++ fail_unless (gst_buffer_list_iterator_next_group (it));
++ buf = gst_buffer_list_iterator_next (it);
++ fail_unless (buf == buf1);
++ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 2);
++ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
++ fail_unless (gst_buffer_list_iterator_next_group (it));
++ buf = gst_buffer_list_iterator_next (it);
++ fail_unless (buf == buf2);
++ ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 2);
++ buf = gst_buffer_list_iterator_next (it);
++ fail_unless (buf == buf3);
++ ASSERT_BUFFER_REFCOUNT (buf3, "buf3", 2);
++ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
++ fail_if (gst_buffer_list_iterator_next_group (it));
++ gst_buffer_list_iterator_free (it);
++ gst_buffer_list_unref (wlist);
++}
++
++GST_END_TEST;
++
++GST_START_TEST (test_copy)
++{
++ GstBufferListIterator *it;
++ GstBufferList *list_copy;
++ GstBuffer *buf1;
++ GstBuffer *buf2;
++ GstBuffer *buf3;
++ GstBuffer *buf;
++
++ /* add buffers to the list */
++ it = gst_buffer_list_iterate (list);
++ gst_buffer_list_iterator_add_group (it);
++ buf1 = gst_buffer_new ();
++ gst_buffer_list_iterator_add (it, buf1);
++ gst_buffer_list_iterator_add_group (it);
++ buf2 = gst_buffer_new ();
++ gst_buffer_list_iterator_add (it, buf2);
++ buf3 = gst_buffer_new ();
++ gst_buffer_list_iterator_add (it, buf3);
++ gst_buffer_list_iterator_free (it);
++
++ /* make a copy */
++ list_copy = gst_buffer_list_copy (list);
++ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (list) == 1);
++ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (list_copy) == 1);
++ fail_unless (list_copy != list);
++ it = gst_buffer_list_iterate (list_copy);
++ fail_unless (gst_buffer_list_iterator_next_group (it));
++ buf = gst_buffer_list_iterator_next (it);
++ fail_unless (buf == buf1);
++ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 2);
++ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
++ fail_unless (gst_buffer_list_iterator_next_group (it));
++ buf = gst_buffer_list_iterator_next (it);
++ fail_unless (buf == buf2);
++ ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 2);
++ buf = gst_buffer_list_iterator_next (it);
++ fail_unless (buf == buf3);
++ ASSERT_BUFFER_REFCOUNT (buf3, "buf3", 2);
++ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
++ fail_if (gst_buffer_list_iterator_next_group (it));
++ gst_buffer_list_iterator_free (it);
++ gst_buffer_list_unref (list_copy);
++}
++
++GST_END_TEST;
++
++GST_START_TEST (test_steal)
++{
++ GstBufferListIterator *it;
++ GstBuffer *buf1;
++ GstBuffer *buf2;
++ GstBuffer *buf3;
++ GstBuffer *buf;
++
++ /* add buffers to the list */
++ it = gst_buffer_list_iterate (list);
++ gst_buffer_list_iterator_add_group (it);
++ buf1 = gst_buffer_new ();
++ gst_buffer_list_iterator_add (it, buf1);
++ gst_buffer_list_iterator_add_group (it);
++ buf2 = gst_buffer_new ();
++ gst_buffer_list_iterator_add (it, buf2);
++ buf3 = gst_buffer_new ();
++ gst_buffer_list_iterator_add (it, buf3);
++ gst_buffer_list_iterator_free (it);
++
++ /* check some error handling */
++ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (NULL)));
++ fail_unless (buf == NULL);
++ it = gst_buffer_list_iterate (list);
++ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
++ fail_unless (buf == NULL);
++
++ /* steal the first buffer */
++ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
++ fail_unless (gst_buffer_list_iterator_next_group (it));
++ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
++ fail_unless (gst_buffer_list_iterator_next (it) == buf1);
++ buf = gst_buffer_list_iterator_steal (it);
++ fail_unless (buf == buf1);
++ ASSERT_BUFFER_REFCOUNT (buf, "buf", 1);
++ gst_buffer_unref (buf);
++ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
++ fail_unless (buf == NULL);
++
++ /* steal the second buffer */
++ fail_unless (gst_buffer_list_iterator_next_group (it));
++ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
++ fail_unless (gst_buffer_list_iterator_next (it) == buf2);
++ buf = gst_buffer_list_iterator_steal (it);
++ fail_unless (buf == buf2);
++ ASSERT_BUFFER_REFCOUNT (buf, "buf", 1);
++ gst_buffer_unref (buf);
++ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
++
++ /* steal the third buffer */
++ fail_unless (gst_buffer_list_iterator_next (it) == buf3);
++ buf = gst_buffer_list_iterator_steal (it);
++ fail_unless (buf == buf3);
++ ASSERT_BUFFER_REFCOUNT (buf, "buf", 1);
++ gst_buffer_unref (buf);
++ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_steal (it)));
++
++ gst_buffer_list_iterator_free (it);
++
++ /* iterate again when all buffers have been stolen */
++ it = gst_buffer_list_iterate (list);
++ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
++ fail_unless (gst_buffer_list_iterator_next_group (it));
++ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
++ fail_unless (gst_buffer_list_iterator_next_group (it));
++ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
++ fail_if (gst_buffer_list_iterator_next_group (it));
++ gst_buffer_list_iterator_free (it);
++}
++
++GST_END_TEST;
++
++GST_START_TEST (test_take)
++{
++ GstBufferListIterator *it;
++ GstBuffer *buf1;
++ GstBuffer *buf2;
++ GstBuffer *buf3;
++ GstBuffer *buf;
++
++ /* add buffers to the list */
++ it = gst_buffer_list_iterate (list);
++ gst_buffer_list_iterator_add_group (it);
++ buf1 = gst_buffer_new ();
++ gst_buffer_ref (buf1);
++ gst_buffer_list_iterator_add (it, buf1);
++ gst_buffer_list_iterator_add_group (it);
++ buf2 = gst_buffer_new ();
++ gst_buffer_ref (buf2);
++ gst_buffer_list_iterator_add (it, buf2);
++ buf3 = gst_buffer_new ();
++ gst_buffer_ref (buf3);
++ gst_buffer_list_iterator_add (it, buf3);
++ gst_buffer_list_iterator_free (it);
++
++ /* check some error handling */
++ ASSERT_CRITICAL (gst_buffer_list_iterator_take (NULL, NULL));
++ it = gst_buffer_list_iterate (list);
++ ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, NULL));
++ buf = gst_buffer_new ();
++ gst_buffer_ref (buf);
++ ASSERT_CRITICAL (gst_buffer_list_iterator_take (NULL, buf));
++ ASSERT_BUFFER_REFCOUNT (buf, "buf", 2);
++
++ /* replace the first buffer */
++ ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, buf));
++ ASSERT_BUFFER_REFCOUNT (buf, "buf", 2);
++ fail_unless (gst_buffer_list_iterator_next_group (it));
++ ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, buf));
++ ASSERT_BUFFER_REFCOUNT (buf, "buf", 2);
++ fail_unless (gst_buffer_list_iterator_next (it) == buf1);
++ ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, NULL));
++ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 2);
++ gst_buffer_list_iterator_take (it, buf);
++ ASSERT_BUFFER_REFCOUNT (buf, "buf", 2);
++ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 1);
++ gst_buffer_unref (buf1);
++
++ /* replace the first buffer again, with itself */
++ gst_buffer_ref (buf);
++ gst_buffer_list_iterator_take (it, buf);
++ ASSERT_BUFFER_REFCOUNT (buf, "buf", 2);
++
++ /* replace the second buffer */
++ gst_buffer_ref (buf);
++ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
++ ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, buf));
++ ASSERT_BUFFER_REFCOUNT (buf, "buf", 3);
++ fail_unless (gst_buffer_list_iterator_next_group (it));
++ ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 2);
++ ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, buf));
++ ASSERT_BUFFER_REFCOUNT (buf, "buf", 3);
++ ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 2);
++ fail_unless (gst_buffer_list_iterator_next (it) == buf2);
++ ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, NULL));
++ ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 2);
++ gst_buffer_list_iterator_take (it, buf);
++ ASSERT_BUFFER_REFCOUNT (buf, "buf", 3);
++ ASSERT_BUFFER_REFCOUNT (buf2, "buf2", 1);
++ gst_buffer_unref (buf2);
++
++ /* replace the third buffer */
++ gst_buffer_ref (buf);
++ fail_unless (gst_buffer_list_iterator_next (it) == buf3);
++ ASSERT_BUFFER_REFCOUNT (buf3, "buf3", 2);
++ gst_buffer_list_iterator_take (it, buf);
++ ASSERT_BUFFER_REFCOUNT (buf, "buf", 4);
++ ASSERT_BUFFER_REFCOUNT (buf3, "buf3", 1);
++ gst_buffer_unref (buf3);
++ fail_if (gst_buffer_list_iterator_next_group (it));
++ ASSERT_CRITICAL (gst_buffer_list_iterator_take (it, buf));
++ ASSERT_BUFFER_REFCOUNT (buf, "buf", 4);
++ gst_buffer_unref (buf);
++
++ gst_buffer_list_iterator_free (it);
++}
++
++GST_END_TEST;
++
++static gpointer do_data_func_data;
++static gboolean notified;
++
++static void
++data_notify (gpointer data)
++{
++ fail_unless (data != NULL);
++ fail_unless (data == do_data_func_data);
++ fail_if (notified);
++ notified = TRUE;
++}
++
++static GstBuffer *
++do_data_func (GstBuffer * buffer, gpointer data)
++{
++ do_data_func_data = data;
++ fail_if (notified);
++
++ return buffer;
++}
++
++static GstBuffer *
++do_func_null (GstBuffer * buffer)
++{
++ gst_buffer_unref (buffer);
++
++ return NULL;
++}
++
++GST_START_TEST (test_do)
++{
++ GstBufferListIterator *it;
++ GstBuffer *buf1;
++ GstBuffer *buf;
++ gchar *data;
++
++ /* error handling */
++ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_do (NULL, NULL)));
++ fail_unless (buf == NULL);
++ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_do_data (NULL, NULL, NULL,
++ NULL)));
++ fail_unless (buf == NULL);
++ it = gst_buffer_list_iterate (list);
++ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_do (it, NULL)));
++ fail_unless (buf == NULL);
++ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_do_data (it, NULL, NULL,
++ NULL)));
++ fail_unless (buf == NULL);
++
++ /* add buffers to the list */
++ gst_buffer_list_iterator_add_group (it);
++ buf1 = gst_buffer_new ();
++ gst_buffer_ref (buf1);
++ gst_buffer_list_iterator_add (it, buf1);
++ gst_buffer_list_iterator_add_group (it);
++ gst_buffer_list_iterator_free (it);
++
++ /* call do-function */
++ it = gst_buffer_list_iterate (list);
++ fail_unless (gst_buffer_list_iterator_next_group (it));
++ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_do (it, gst_buffer_ref)));
++ fail_unless (buf == NULL);
++ data = "data";
++ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_do_data (it, do_data_func,
++ data, data_notify)));
++ fail_unless (buf == NULL);
++ fail_unless (do_data_func_data != data);
++ buf = gst_buffer_list_iterator_next (it);
++ fail_unless (buf == buf1);
++ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 2);
++ buf = gst_buffer_list_iterator_do (it, gst_buffer_ref);
++ fail_unless (buf == buf1);
++ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 3);
++ gst_buffer_unref (buf);
++ buf = gst_buffer_list_iterator_do_data (it, do_data_func, data, data_notify);
++ fail_unless (buf == buf1);
++ fail_unless (do_data_func_data == data);
++
++ /* do-function that return a new buffer replaces the buffer in the list */
++ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 2);
++ buf = gst_buffer_list_iterator_do (it,
++ (GstBufferListDoFunction) gst_mini_object_make_writable);
++ fail_unless (buf != buf1);
++ ASSERT_BUFFER_REFCOUNT (buf, "buf", 1);
++ ASSERT_BUFFER_REFCOUNT (buf, "buf1", 1);
++ gst_buffer_replace (&buf1, buf);
++
++ /* do-function that return NULL removes the buffer from the list */
++ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 2);
++ fail_unless (gst_buffer_list_iterator_do (it, do_func_null) == NULL);
++ ASSERT_BUFFER_REFCOUNT (buf1, "buf1", 1);
++ ASSERT_CRITICAL ((buf = gst_buffer_list_iterator_do (it, gst_buffer_ref)));
++ fail_unless (buf == NULL);
++ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
++ gst_buffer_list_iterator_free (it);
++ it = gst_buffer_list_iterate (list);
++ fail_unless (gst_buffer_list_iterator_next_group (it));
++ fail_unless (gst_buffer_list_iterator_next (it) == NULL);
++ fail_if (gst_buffer_list_iterator_next_group (it));
++ gst_buffer_list_iterator_free (it);
++ gst_buffer_unref (buf1);
++}
++
++GST_END_TEST;
++
++GST_START_TEST (test_merge)
++{
++ GstBufferListIterator *it;
++ GstBufferListIterator *merge_it;
++ GstBuffer *merged_buf;
++ GstBuffer *buf;
++
++ it = gst_buffer_list_iterate (list);
++ fail_unless (gst_buffer_list_iterator_merge_group (it) == NULL);
++
++ /* create a new group and add a buffer */
++ gst_buffer_list_iterator_add_group (it);
++ fail_unless (gst_buffer_list_iterator_merge_group (it) == NULL);
++ buf = buffer_from_string ("One");
++ gst_buffer_ref (buf);
++ gst_buffer_list_iterator_add (it, buf);
++
++ /* merging a group with one buffer returns a copy of the buffer */
++ merge_it = gst_buffer_list_iterate (list);
++ fail_unless (gst_buffer_list_iterator_next_group (merge_it));
++ merged_buf = gst_buffer_list_iterator_merge_group (merge_it);
++ fail_unless (merged_buf != buf);
++ ASSERT_BUFFER_REFCOUNT (merged_buf, "merged_buf", 1);
++ gst_buffer_unref (buf);
++ fail_unless (GST_BUFFER_CAPS (merged_buf) == caps);
++ fail_unless (GST_BUFFER_TIMESTAMP (merged_buf) == TIMESTAMP);
++ fail_unless (GST_BUFFER_SIZE (merged_buf) == 3);
++ fail_unless (memcmp (GST_BUFFER_DATA (merged_buf), "One",
++ GST_BUFFER_SIZE (merged_buf)) == 0);
++ gst_buffer_unref (merged_buf);
++
++ /* add another buffer to the same group */
++ gst_buffer_list_iterator_add (it, buffer_from_string ("Group"));
++
++ /* merging a group returns a new buffer with merged data */
++ merged_buf = gst_buffer_list_iterator_merge_group (merge_it);
++ ASSERT_BUFFER_REFCOUNT (merged_buf, "merged_buf", 1);
++ fail_unless (GST_BUFFER_CAPS (merged_buf) == caps);
++ fail_unless (GST_BUFFER_TIMESTAMP (merged_buf) == TIMESTAMP);
++ fail_unless (GST_BUFFER_SIZE (merged_buf) == 8);
++ fail_unless (memcmp (GST_BUFFER_DATA (merged_buf), "OneGroup",
++ GST_BUFFER_SIZE (merged_buf)) == 0);
++
++ /* merging the same group again should return a new buffer with merged data */
++ buf = gst_buffer_list_iterator_merge_group (merge_it);
++ ASSERT_BUFFER_REFCOUNT (buf, "buf", 1);
++ fail_unless (buf != merged_buf);
++ fail_unless (GST_BUFFER_SIZE (buf) == 8);
++ fail_unless (memcmp (GST_BUFFER_DATA (buf), "OneGroup",
++ GST_BUFFER_SIZE (buf)) == 0);
++ gst_buffer_unref (buf);
++ gst_buffer_unref (merged_buf);
++
++ /* add a new group */
++ gst_buffer_list_iterator_add_group (it);
++ gst_buffer_list_iterator_add (it, buffer_from_string ("AnotherGroup"));
++ gst_buffer_list_iterator_free (it);
++
++ /* merge the first group again */
++ merged_buf = gst_buffer_list_iterator_merge_group (merge_it);
++ ASSERT_BUFFER_REFCOUNT (merged_buf, "merged_buf", 1);
++ fail_unless (GST_BUFFER_CAPS (merged_buf) == caps);
++ fail_unless (GST_BUFFER_TIMESTAMP (merged_buf) == TIMESTAMP);
++ fail_unless (GST_BUFFER_SIZE (merged_buf) == 8);
++ fail_unless (memcmp (GST_BUFFER_DATA (merged_buf), "OneGroup",
++ GST_BUFFER_SIZE (merged_buf)) == 0);
++ gst_buffer_unref (merged_buf);
++
++ /* merge the second group */
++ fail_unless (gst_buffer_list_iterator_next_group (merge_it));
++ merged_buf = gst_buffer_list_iterator_merge_group (merge_it);
++ ASSERT_BUFFER_REFCOUNT (merged_buf, "merged_buf", 1);
++ fail_unless (GST_BUFFER_CAPS (merged_buf) == caps);
++ fail_unless (GST_BUFFER_TIMESTAMP (merged_buf) == TIMESTAMP);
++ fail_unless (GST_BUFFER_SIZE (merged_buf) == 12);
++ fail_unless (memcmp (GST_BUFFER_DATA (merged_buf), "AnotherGroup",
++ GST_BUFFER_SIZE (merged_buf)) == 0);
++ gst_buffer_unref (merged_buf);
++
++ gst_buffer_list_iterator_free (merge_it);
++
++ /* steal the second buffer and merge the first group again */
++ it = gst_buffer_list_iterate (list);
++ fail_unless (gst_buffer_list_iterator_next_group (it));
++ fail_unless (gst_buffer_list_iterator_next (it) != NULL);
++ fail_unless (gst_buffer_list_iterator_next (it) != NULL);
++ buf = gst_buffer_list_iterator_steal (it);
++ gst_buffer_list_iterator_free (it);
++ fail_unless (buf != NULL);
++ fail_unless (memcmp (GST_BUFFER_DATA (buf), "Group",
++ GST_BUFFER_SIZE (buf)) == 0);
++ gst_buffer_unref (buf);
++ merge_it = gst_buffer_list_iterate (list);
++ fail_unless (gst_buffer_list_iterator_next_group (merge_it));
++ merged_buf = gst_buffer_list_iterator_merge_group (merge_it);
++ ASSERT_BUFFER_REFCOUNT (merged_buf, "merged_buf", 1);
++ fail_unless (GST_BUFFER_CAPS (merged_buf) == caps);
++ fail_unless (GST_BUFFER_TIMESTAMP (merged_buf) == TIMESTAMP);
++ fail_unless (GST_BUFFER_SIZE (merged_buf) == 3);
++ fail_unless (memcmp (GST_BUFFER_DATA (merged_buf), "One",
++ GST_BUFFER_SIZE (merged_buf)) == 0);
++ gst_buffer_unref (merged_buf);
++
++ /* steal the first buffer too and merge the first group again */
++ it = gst_buffer_list_iterate (list);
++ fail_unless (gst_buffer_list_iterator_next_group (it));
++ fail_unless (gst_buffer_list_iterator_next (it) != NULL);
++ buf = gst_buffer_list_iterator_steal (it);
++ fail_unless (buf != NULL);
++ fail_unless (memcmp (GST_BUFFER_DATA (buf), "One",
++ GST_BUFFER_SIZE (buf)) == 0);
++ gst_buffer_unref (buf);
++ gst_buffer_list_iterator_free (it);
++ fail_unless (gst_buffer_list_iterator_merge_group (merge_it) == NULL);
++ gst_buffer_list_iterator_free (merge_it);
++}
++
++GST_END_TEST;
++
++static Suite *
++gst_buffer_list_suite (void)
++{
++ Suite *s = suite_create ("GstBufferList");
++ TCase *tc_chain = tcase_create ("general");
++
++ suite_add_tcase (s, tc_chain);
++ tcase_add_checked_fixture (tc_chain, setup, cleanup);
++ tcase_add_test (tc_chain, test_add_and_iterate);
++ tcase_add_test (tc_chain, test_make_writable);
++ tcase_add_test (tc_chain, test_copy);
++ tcase_add_test (tc_chain, test_steal);
++ tcase_add_test (tc_chain, test_take);
++ tcase_add_test (tc_chain, test_do);
++ tcase_add_test (tc_chain, test_merge);
++
++ return s;
++}
++
++GST_CHECK_MAIN (gst_buffer_list);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/check/gst/gstmessage.c gstreamer-0.10.23/tests/check/gst/gstmessage.c
+--- gstreamer-0.10.23.orig/tests/check/gst/gstmessage.c 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/tests/check/gst/gstmessage.c 2009-06-11 14:19:59.000000000 +0200
+@@ -186,6 +186,60 @@
+ void gst_message_parse_warning (GstMessage *message, GError **gerror, gchar **debug);
+ */
+
++ /* GST_MESSAGE_STREAM_STATUS */
++ {
++ GstStreamStatusType type;
++ GstTask *task, *task2;
++ GValue value = { 0 };
++ const GValue *val;
++
++ message =
++ gst_message_new_stream_status (NULL, GST_STREAM_STATUS_TYPE_ENTER,
++ NULL);
++ fail_if (message == NULL);
++ fail_unless (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STREAM_STATUS);
++ fail_unless (GST_MESSAGE_SRC (message) == NULL);
++
++ /* set some wrong values to check if the parse method overwrites them
++ * with the good values */
++ type = GST_STREAM_STATUS_TYPE_START;
++ gst_message_parse_stream_status (message, &type, NULL);
++ fail_unless (type == GST_STREAM_STATUS_TYPE_ENTER);
++
++ /* create a task with some dummy function, we're not actually going to run
++ * the task here */
++ task = gst_task_create ((GstTaskFunction) gst_object_unref, NULL);
++
++ ASSERT_OBJECT_REFCOUNT (task, "task", 1);
++
++ /* set the task */
++ g_value_init (&value, GST_TYPE_TASK);
++ g_value_set_object (&value, task);
++
++ ASSERT_OBJECT_REFCOUNT (task, "task", 2);
++
++ gst_message_set_stream_status_object (message, &value);
++ ASSERT_OBJECT_REFCOUNT (task, "task", 3);
++ g_value_unset (&value);
++ ASSERT_OBJECT_REFCOUNT (task, "task", 2);
++ gst_object_unref (task);
++ ASSERT_OBJECT_REFCOUNT (task, "task", 1);
++
++ /* get the object back, no refcount is changed */
++ val = gst_message_get_stream_status_object (message);
++ ASSERT_OBJECT_REFCOUNT (task, "task", 1);
++
++ task2 = g_value_get_object (val);
++
++ fail_unless (GST_IS_TASK (task2));
++ fail_unless (task2 == task);
++
++ ASSERT_OBJECT_REFCOUNT (task, "task", 1);
++ ASSERT_OBJECT_REFCOUNT (task2, "task", 1);
++
++ gst_message_unref (message);
++ }
++
+ /* GST_MESSAGE_REQUEST_STATE */
+ {
+ GstState state;
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/check/gst/gstpad.c gstreamer-0.10.23/tests/check/gst/gstpad.c
+--- gstreamer-0.10.23.orig/tests/check/gst/gstpad.c 2009-04-15 21:18:17.000000000 +0200
++++ gstreamer-0.10.23/tests/check/gst/gstpad.c 2009-06-11 14:19:59.000000000 +0200
+@@ -399,6 +399,87 @@
+
+ GST_END_TEST;
+
++static GstBuffer *
++buffer_from_string (gchar * str)
++{
++ guint size;
++ GstBuffer *buf;
++
++ size = strlen (str);
++ buf = gst_buffer_new_and_alloc (size);
++ memcpy (GST_BUFFER_DATA (buf), str, size);
++ GST_BUFFER_SIZE (buf) = size;
++
++ return buf;
++}
++
++GST_START_TEST (test_push_buffer_list_compat)
++{
++ GstPad *src, *sink;
++ GstPadLinkReturn plr;
++ GstCaps *caps;
++ GstBufferList *list;
++ GstBufferListIterator *it;
++ GstBuffer *buffer;
++
++ /* setup */
++ sink = gst_pad_new ("sink", GST_PAD_SINK);
++ fail_if (sink == NULL);
++ gst_pad_set_chain_function (sink, gst_check_chain_func);
++ /* leave chainlistfunc unset */
++
++ src = gst_pad_new ("src", GST_PAD_SRC);
++ fail_if (src == NULL);
++
++ caps = gst_caps_from_string ("foo/bar");
++
++ gst_pad_set_caps (src, caps);
++ gst_pad_set_caps (sink, caps);
++
++ plr = gst_pad_link (src, sink);
++ fail_unless (GST_PAD_LINK_SUCCESSFUL (plr));
++
++ list = gst_buffer_list_new ();
++
++ /* activate pads */
++ gst_pad_set_active (src, TRUE);
++ gst_pad_set_active (sink, TRUE);
++
++ /* test */
++ /* adding to a buffer list will drop the ref to the buffer */
++ it = gst_buffer_list_iterate (list);
++ gst_buffer_list_iterator_add_group (it);
++ gst_buffer_list_iterator_add (it, buffer_from_string ("List"));
++ gst_buffer_list_iterator_add (it, buffer_from_string ("Group"));
++ gst_buffer_list_iterator_add_group (it);
++ gst_buffer_list_iterator_add (it, buffer_from_string ("Another"));
++ gst_buffer_list_iterator_add (it, buffer_from_string ("List"));
++ gst_buffer_list_iterator_add (it, buffer_from_string ("Group"));
++ gst_buffer_list_iterator_free (it);
++ fail_unless (gst_pad_push_list (src, list) == GST_FLOW_OK);
++ fail_unless_equals_int (g_list_length (buffers), 2);
++ buffer = GST_BUFFER (buffers->data);
++ ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
++ fail_unless (memcmp (GST_BUFFER_DATA (buffer), "ListGroup", 9) == 0);
++ gst_buffer_unref (buffer);
++ buffers = g_list_delete_link (buffers, buffers);
++ buffer = GST_BUFFER (buffers->data);
++ ASSERT_MINI_OBJECT_REFCOUNT (buffer, "buffer", 1);
++ fail_unless (memcmp (GST_BUFFER_DATA (buffer), "AnotherListGroup", 16) == 0);
++ gst_buffer_unref (buffer);
++ buffers = g_list_delete_link (buffers, buffers);
++ fail_unless (buffers == NULL);
++
++ /* teardown */
++ gst_pad_unlink (src, sink);
++ gst_object_unref (src);
++ gst_object_unref (sink);
++ ASSERT_CAPS_REFCOUNT (caps, "caps", 1);
++ gst_caps_unref (caps);
++}
++
++GST_END_TEST;
++
+ GST_START_TEST (test_flowreturn)
+ {
+ GstFlowReturn ret;
+@@ -904,6 +985,7 @@
+ tcase_add_test (tc_chain, test_name_is_valid);
+ tcase_add_test (tc_chain, test_push_unlinked);
+ tcase_add_test (tc_chain, test_push_linked);
++ tcase_add_test (tc_chain, test_push_buffer_list_compat);
+ tcase_add_test (tc_chain, test_flowreturn);
+ tcase_add_test (tc_chain, test_push_negotiation);
+ tcase_add_test (tc_chain, test_src_unref_unlink);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/check/gst/gstpipeline.c gstreamer-0.10.23/tests/check/gst/gstpipeline.c
+--- gstreamer-0.10.23.orig/tests/check/gst/gstpipeline.c 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/tests/check/gst/gstpipeline.c 2009-06-11 14:19:59.000000000 +0200
+@@ -283,7 +283,7 @@
+ fail_unless (clock && GST_IS_CLOCK (clock), "i want a clock dammit");
+ gst_pipeline_use_clock (GST_PIPELINE (pipeline), clock);
+
+- fail_unless (gst_pipeline_get_last_stream_time (GST_PIPELINE (pipeline)) == 0,
++ fail_unless (gst_element_get_start_time (pipeline) == 0,
+ "stream time doesn't start off at 0");
+
+ probe_lock = g_mutex_new ();
+@@ -331,7 +331,7 @@
+ fail_unless (upper >= base, "bogus base time: %" GST_TIME_FORMAT " > %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (base), GST_TIME_ARGS (upper));
+
+- stream = gst_pipeline_get_last_stream_time (GST_PIPELINE (pipeline));
++ stream = gst_element_get_start_time (pipeline);
+
+ fail_unless (stream > 0, "bogus new stream time: %" GST_TIME_FORMAT " > %"
+ GST_TIME_FORMAT, GST_TIME_ARGS (stream), GST_TIME_ARGS (0));
+@@ -399,7 +399,7 @@
+
+ fail_if (observed == GST_CLOCK_TIME_NONE, "no timestamp recorded");
+
+- stream = gst_pipeline_get_last_stream_time (GST_PIPELINE (pipeline));
++ stream = gst_element_get_start_time (pipeline);
+
+ fail_unless (base >= oldbase + WAIT_TIME, "base time not reset");
+ fail_unless (upper >= base + stream, "bogus base time: %"
+@@ -439,8 +439,7 @@
+ fail_unless (lower >= upper + WAIT_TIME, "clock did not advance?");
+
+ /* bling */
+- gst_pipeline_set_new_stream_time (GST_PIPELINE (pipeline),
+- GST_CLOCK_TIME_NONE);
++ gst_element_set_start_time (pipeline, GST_CLOCK_TIME_NONE);
+
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ fail_unless (gst_element_get_state (pipeline, NULL, NULL,
+@@ -470,7 +469,7 @@
+
+ fail_if (observed == GST_CLOCK_TIME_NONE, "no timestamp recorded");
+
+- fail_unless (gst_pipeline_get_last_stream_time (GST_PIPELINE (pipeline))
++ fail_unless (gst_element_get_start_time (pipeline)
+ == GST_CLOCK_TIME_NONE, "stream time was reset");
+
+ fail_unless (base == oldbase, "base time was reset");
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/check/gst/gstsegment.c gstreamer-0.10.23/tests/check/gst/gstsegment.c
+--- gstreamer-0.10.23.orig/tests/check/gst/gstsegment.c 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/tests/check/gst/gstsegment.c 2009-06-11 14:19:59.000000000 +0200
+@@ -1,5 +1,6 @@
+ /* GStreamer
+ * Copyright (C) 2005 Jan Schmidt <thaytan@mad.scientist.com>
++ * 2009 Wim Taymans <wim.taymans@gmail.com>
+ *
+ * gstsegment.c: Unit test for segments
+ *
+@@ -1341,17 +1342,25 @@
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 0);
+ fail_unless (result == 0);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 0);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 100);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 100);
+
+ /* at edge is exactly the segment duration */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 200);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 200);
+
+ /* outside of the segment */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 300);
+ fail_unless (result == -1);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 300);
++ fail_unless (result == -1);
+
+ /***********************************************************
+ * time shifted by 500, check if accumulation worked.
+@@ -1371,13 +1380,19 @@
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 0);
+ fail_unless (result == 200);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 0);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 250);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 100);
+
+ /* outside of the segment */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 500);
+ fail_unless (result == -1);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 310);
++ fail_unless (result == -1);
+
+ /********************************************
+ * time offset by 500
+@@ -1397,19 +1412,29 @@
+ /* before segment is invalid */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 400);
+ fail_unless (result == -1);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 200);
++ fail_unless (result == -1);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 500);
+ fail_unless (result == 300);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 500);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 600);
+ fail_unless (result == 400);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 600);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 700);
+ fail_unless (result == 500);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 700);
+
+ /* outside of the segment */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 800);
+ fail_unless (result == -1);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 600);
++ fail_unless (result == -1);
+
+ /**********************************************************
+ * time offset by 500, shifted by 200
+@@ -1429,19 +1454,29 @@
+ /* before segment is invalid */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 400);
+ fail_unless (result == -1);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 400);
++ fail_unless (result == -1);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 500);
+ fail_unless (result == 700);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 500);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 600);
+ fail_unless (result == 600);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 600);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 700);
+ fail_unless (result == 500);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 700);
+
+ /* outside of the segment */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 800);
+ fail_unless (result == -1);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 800);
++ fail_unless (result == -1);
+
+ /**********************************************************
+ * time offset by 500, shifted by 200
+@@ -1461,20 +1496,30 @@
+ /* before segment is invalid */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 400);
+ fail_unless (result == -1);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 600);
++ fail_unless (result == -1);
+
+ /* total scaled segment time is 100, accum is 700, so we get 800 */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 500);
+ fail_unless (result == 800);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 500);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 600);
+ fail_unless (result == 750);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 600);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 700);
+ fail_unless (result == 700);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 700);
+
+ /* outside of the segment */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 800);
+ fail_unless (result == -1);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 900);
++ fail_unless (result == -1);
+
+ /* see if negative rate closed segment correctly */
+ gst_segment_set_newsegment_full (&segment, FALSE, -2.0, -1.0,
+@@ -1482,6 +1527,8 @@
+
+ /* previous segment lasted 100, and was at 700 so we should get 800 */
+ fail_unless (segment.accum == 800);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, 800);
++ fail_unless (result == 700);
+ }
+
+ GST_END_TEST;
+@@ -1517,9 +1564,13 @@
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 0);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 200);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 150);
+ fail_unless (result == 50);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 150);
+
+ /* update segment, this accumulates 50 from the previous segment. */
+ gst_segment_set_newsegment_full (&segment, TRUE, -2.0, 1.0,
+@@ -1538,10 +1589,14 @@
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 150);
+ fail_unless (result == 50);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 150);
+
+ /* 50 accumulated + 50 / 2 */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 75);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 100);
+
+ /* update segment, this does not accumulate anything. */
+ gst_segment_set_newsegment_full (&segment, TRUE, 1.0, 1.0,
+@@ -1560,9 +1615,13 @@
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 100);
+ fail_unless (result == 50);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 100);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 150);
+ fail_unless (result == 100);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 150);
+ }
+
+ GST_END_TEST;
+@@ -1595,12 +1654,18 @@
+ /* invalid time gives invalid result */
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, -1);
+ fail_unless (result == -1);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == -1);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 0);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 200);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 150);
+ fail_unless (result == 50);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 150);
+
+ /* close segment, this accumulates nothing. */
+ gst_segment_set_newsegment_full (&segment, TRUE, -1.0, 1.0,
+@@ -1638,9 +1703,13 @@
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 150);
+ fail_unless (result == 50);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 150);
+
+ result = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, 200);
+ fail_unless (result == 100);
++ result = gst_segment_to_position (&segment, GST_FORMAT_TIME, result);
++ fail_unless (result == 200);
+ }
+
+ GST_END_TEST;
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/check/gst/gststructure.c gstreamer-0.10.23/tests/check/gst/gststructure.c
+--- gstreamer-0.10.23.orig/tests/check/gst/gststructure.c 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/tests/check/gst/gststructure.c 2009-06-11 14:19:59.000000000 +0200
+@@ -349,30 +349,33 @@
+ GstStructure *sp, *sc1, *sc2;
+ gchar *str;
+
+- sc1 =
+- gst_structure_new ("Camera", "XResolution", G_TYPE_INT, 72, "YResolution",
+- G_TYPE_INT, 73, NULL);
++ sc1 = gst_structure_new ("Camera",
++ "XResolution", G_TYPE_INT, 72, "YResolution", G_TYPE_INT, 73, NULL);
+ fail_unless (sc1 != NULL);
+
+- sc2 =
+- gst_structure_new ("Image-Data", "Orientation", G_TYPE_STRING, "top-left",
+- NULL);
++ sc2 = gst_structure_new ("Image-Data",
++ "Orientation", G_TYPE_STRING, "top-left",
++ "Comment", G_TYPE_STRING, "super photo", NULL);
+ fail_unless (sc2 != NULL);
+
+ sp = gst_structure_new ("Exif", "Camera", GST_TYPE_STRUCTURE, sc1,
+ "Image Data", GST_TYPE_STRUCTURE, sc2, NULL);
+ fail_unless (sp != NULL);
+
++ fail_unless (gst_structure_n_fields (sp) == 2);
++
+ fail_unless (gst_structure_has_field_typed (sp, "Camera",
+ GST_TYPE_STRUCTURE));
+
+ str = gst_structure_to_string (sp);
+ fail_unless (str != NULL);
+
++ GST_DEBUG ("serialized to '%s'", str);
++
+ fail_unless (g_str_equal (str,
+ "Exif"
+- ", Camera=(structure)Camera, XResolution=(int)72, YResolution=(int)73;"
+- ", Image Data=(structure)Image-Data, Orientation=(string)top-left;;"));
++ ", Camera=(structure)\"Camera\\,\\ XResolution\\=\\(int\\)72\\,\\ YResolution\\=\\(int\\)73\\;\""
++ ", Image Data=(structure)\"Image-Data\\,\\ Orientation\\=\\(string\\)top-left\\,\\ Comment\\=\\(string\\)\\\"super\\\\\\ photo\\\"\\;\";"));
+
+ g_free (str);
+ str = NULL;
+@@ -380,7 +383,154 @@
+ gst_structure_free (sc1);
+ gst_structure_free (sc2);
+ gst_structure_free (sp);
++}
++
++GST_END_TEST;
++
++GST_START_TEST (test_structure_nested_from_and_to_string)
++{
++ GstStructure *s;
++ gchar *str1, *str2, *end = NULL;
++
++ str1 = "main"
++ ", main-sub1=(structure)\"type-b\\,\\ machine-type\\=\\(int\\)0\\;\""
++ ", main-sub2=(structure)\"type-a\\,\\ plugin-filename\\=\\(string\\)\\\"/home/user/lib/lib\\\\\\ with\\\\\\ spaces.dll\\\"\\,\\ machine-type\\=\\(int\\)1\\;\""
++ ", main-sub3=(structure)\"type-b\\,\\ plugin-filename\\=\\(string\\)/home/user/lib/lib_no_spaces.so\\,\\ machine-type\\=\\(int\\)1\\;\""
++ ";";
++
++ s = gst_structure_from_string (str1, &end);
++ fail_unless (s != NULL);
++
++ GST_DEBUG ("not parsed part : %s", end);
++ fail_unless (*end == '\0');
++
++ fail_unless (gst_structure_n_fields (s) == 3);
++
++ fail_unless (gst_structure_has_field_typed (s, "main-sub1",
++ GST_TYPE_STRUCTURE));
++
++ str2 = gst_structure_to_string (s);
++ fail_unless (str2 != NULL);
++
++ fail_unless (g_str_equal (str1, str2));
++
++ g_free (str2);
++
++ gst_structure_free (s);
++}
++
++GST_END_TEST;
++
++GST_START_TEST (test_empty_string_fields)
++{
++ GstStructure *s;
++
++ s = gst_structure_empty_new ("con/struct");
++ ASSERT_WARNING (gst_structure_set (s, "layout", G_TYPE_STRING, "", NULL));
++ gst_structure_set (s, "debug-string", G_TYPE_STRING, NULL, NULL);
++ gst_structure_free (s);
++}
++
++GST_END_TEST;
++
++GST_START_TEST (test_vararg_getters)
++{
++ GstStructure *s;
++ GstBuffer *buf, *buf2;
++ gboolean ret;
++ GstCaps *caps, *caps2;
++ gdouble d;
++ gint64 i64;
++ gchar *c;
++ gint i, num, denom;
++
++ buf = gst_buffer_new_and_alloc (3);
++ GST_BUFFER_DATA (buf)[0] = 0xf0;
++ GST_BUFFER_DATA (buf)[1] = 0x66;
++ GST_BUFFER_DATA (buf)[2] = 0x0d;
++
++ caps = gst_caps_new_simple ("video/x-foo", NULL);
++
++ s = gst_structure_new ("test", "int", G_TYPE_INT, 12345678, "string",
++ G_TYPE_STRING, "Hello World!", "buf", GST_TYPE_BUFFER, buf, "caps",
++ GST_TYPE_CAPS, caps, "int64", G_TYPE_INT64, G_GINT64_CONSTANT (-99),
++ "double", G_TYPE_DOUBLE, G_MAXDOUBLE, "frag", GST_TYPE_FRACTION, 39, 14,
++ NULL);
+
++ /* first the plain one */
++ ret = gst_structure_get (s, "double", G_TYPE_DOUBLE, &d, "string",
++ G_TYPE_STRING, &c, "caps", GST_TYPE_CAPS, &caps2, "buf",
++ GST_TYPE_BUFFER, &buf2, "frag", GST_TYPE_FRACTION, &num, &denom, "int",
++ G_TYPE_INT, &i, "int64", G_TYPE_INT64, &i64, NULL);
++
++ fail_unless (ret);
++ fail_unless_equals_string (c, "Hello World!");
++ fail_unless_equals_int (i, 12345678);
++ fail_unless_equals_float (d, G_MAXDOUBLE);
++ fail_unless_equals_int (num, 39);
++ fail_unless_equals_int (denom, 14);
++ fail_unless (i64 == -99);
++ fail_unless (caps == caps2);
++ fail_unless (buf == buf2);
++
++ /* expected failures */
++ ASSERT_CRITICAL (gst_structure_get (s, NULL, G_TYPE_INT, &i, NULL));
++ fail_if (gst_structure_get (s, "int", G_TYPE_INT, &i, "double",
++ G_TYPE_FLOAT, &d, NULL));
++ fail_if (gst_structure_get (s, "int", G_TYPE_INT, &i, "dooble",
++ G_TYPE_DOUBLE, &d, NULL));
++
++ g_free (c);
++ c = NULL;
++ gst_caps_unref (caps2);
++ caps2 = NULL;
++ gst_buffer_unref (buf2);
++ buf2 = NULL;
++
++ /* and now the _id variant */
++ ret = gst_structure_id_get (s, g_quark_from_static_string ("double"),
++ G_TYPE_DOUBLE, &d, g_quark_from_static_string ("string"), G_TYPE_STRING,
++ &c, g_quark_from_static_string ("caps"), GST_TYPE_CAPS, &caps2,
++ g_quark_from_static_string ("buf"), GST_TYPE_BUFFER, &buf2,
++ g_quark_from_static_string ("int"), G_TYPE_INT, &i,
++ g_quark_from_static_string ("int64"), G_TYPE_INT64, &i64, NULL);
++
++ fail_unless (ret);
++ fail_unless_equals_string (c, "Hello World!");
++ fail_unless_equals_int (i, 12345678);
++ fail_unless_equals_float (d, G_MAXDOUBLE);
++ fail_unless (i64 == -99);
++ fail_unless (caps == caps2);
++ fail_unless (buf == buf2);
++
++ /* expected failures */
++ ASSERT_CRITICAL (gst_structure_get (s, 0, G_TYPE_INT, &i, NULL));
++ fail_if (gst_structure_id_get (s, g_quark_from_static_string ("int"),
++ G_TYPE_INT, &i, g_quark_from_static_string ("double"), G_TYPE_FLOAT,
++ &d, NULL));
++ fail_if (gst_structure_id_get (s, g_quark_from_static_string ("int"),
++ G_TYPE_INT, &i, g_quark_from_static_string ("dooble"), G_TYPE_DOUBLE,
++ &d, NULL));
++
++ g_free (c);
++ gst_caps_unref (caps2);
++ gst_buffer_unref (buf2);
++
++ /* finally make sure NULL as return location is handled gracefully */
++ ret = gst_structure_get (s, "double", G_TYPE_DOUBLE, NULL, "string",
++ G_TYPE_STRING, NULL, "caps", GST_TYPE_CAPS, NULL, "buf",
++ GST_TYPE_BUFFER, NULL, "int", G_TYPE_INT, &i, "frag", GST_TYPE_FRACTION,
++ NULL, NULL, "int64", G_TYPE_INT64, &i64, NULL);
++
++ ASSERT_WARNING (gst_structure_get (s, "frag", GST_TYPE_FRACTION, NULL,
++ &denom, NULL));
++ ASSERT_WARNING (gst_structure_get (s, "frag", GST_TYPE_FRACTION, &num,
++ NULL, NULL));
++
++ /* clean up */
++ gst_caps_unref (caps);
++ gst_buffer_unref (buf);
++ gst_structure_free (s);
+ }
+
+ GST_END_TEST;
+@@ -401,6 +551,9 @@
+ tcase_add_test (tc_chain, test_fixate);
+ tcase_add_test (tc_chain, test_fixate_frac_list);
+ tcase_add_test (tc_chain, test_structure_nested);
++ tcase_add_test (tc_chain, test_structure_nested_from_and_to_string);
++ tcase_add_test (tc_chain, test_empty_string_fields);
++ tcase_add_test (tc_chain, test_vararg_getters);
+ return s;
+ }
+
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/check/gst/gstsystemclock.c gstreamer-0.10.23/tests/check/gst/gstsystemclock.c
+--- gstreamer-0.10.23.orig/tests/check/gst/gstsystemclock.c 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/tests/check/gst/gstsystemclock.c 2009-06-11 14:19:59.000000000 +0200
+@@ -263,7 +263,7 @@
+ GstClockTime base;
+ GstClockReturn result;
+
+- store_lock = g_mutex_new ();;
++ store_lock = g_mutex_new ();
+
+ clock = gst_system_clock_obtain ();
+ fail_unless (clock != NULL, "Could not create instance of GstSystemClock");
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/check/gst/gsttag.c gstreamer-0.10.23/tests/check/gst/gsttag.c
+--- gstreamer-0.10.23.orig/tests/check/gst/gsttag.c 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/tests/check/gst/gsttag.c 2009-06-11 14:19:59.000000000 +0200
+@@ -383,6 +383,21 @@
+
+ GST_END_TEST;
+
++GST_START_TEST (test_empty_tags)
++{
++ GstTagList *tags;
++
++ tags = gst_tag_list_new ();
++ ASSERT_WARNING (gst_tag_list_add (tags, GST_TAG_MERGE_APPEND,
++ GST_TAG_ARTIST, NULL, NULL));
++ ASSERT_WARNING (gst_tag_list_add (tags, GST_TAG_MERGE_APPEND,
++ GST_TAG_ARTIST, "", NULL));
++ gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, GST_TAG_ARTIST, "xyz", NULL);
++ gst_tag_list_free (tags);
++}
++
++GST_END_TEST;
++
+ static Suite *
+ gst_tag_suite (void)
+ {
+@@ -397,6 +412,7 @@
+ tcase_add_test (tc_chain, test_type);
+ tcase_add_test (tc_chain, test_set_non_utf8_string);
+ tcase_add_test (tc_chain, test_buffer_tags);
++ tcase_add_test (tc_chain, test_empty_tags);
+
+ return s;
+ }
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/check/libs/adapter.c gstreamer-0.10.23/tests/check/libs/adapter.c
+--- gstreamer-0.10.23.orig/tests/check/libs/adapter.c 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/tests/check/libs/adapter.c 2009-06-11 14:19:59.000000000 +0200
+@@ -149,6 +149,44 @@
+ */
+ GST_START_TEST (test_take1)
+ {
++ GstAdapter *adapter;
++ GstBuffer *buffer, *buffer2;
++ guint avail;
++ guint8 *data, *data2;
++
++ adapter = gst_adapter_new ();
++ fail_unless (adapter != NULL);
++
++ buffer = gst_buffer_new_and_alloc (100);
++ fail_unless (buffer != NULL);
++ fail_unless (GST_BUFFER_DATA (buffer) != NULL);
++ fail_unless (GST_BUFFER_SIZE (buffer) == 100);
++
++ data = GST_BUFFER_DATA (buffer);
++
++ /* push in the adapter */
++ gst_adapter_push (adapter, buffer);
++
++ avail = gst_adapter_available (adapter);
++ fail_unless (avail == 100);
++
++ /* take out buffer */
++ buffer2 = gst_adapter_take_buffer (adapter, 100);
++ fail_unless (buffer2 != NULL);
++ fail_unless (GST_BUFFER_DATA (buffer2) != NULL);
++ fail_unless (GST_BUFFER_SIZE (buffer2) == 100);
++ data2 = GST_BUFFER_DATA (buffer2);
++
++ avail = gst_adapter_available (adapter);
++ fail_unless (avail == 0);
++
++ /* the buffer should be the same */
++ fail_unless (buffer == buffer2);
++ fail_unless (data == data2);
++
++ gst_buffer_unref (buffer2);
++
++ g_object_unref (adapter);
+ }
+
+ GST_END_TEST;
+@@ -244,6 +282,325 @@
+
+ GST_END_TEST;
+
++GST_START_TEST (test_timestamp)
++{
++ GstAdapter *adapter;
++ GstBuffer *buffer;
++ guint avail;
++ GstClockTime timestamp;
++ guint64 dist;
++
++ adapter = gst_adapter_new ();
++ fail_unless (adapter != NULL);
++
++ buffer = gst_buffer_new_and_alloc (100);
++
++ /* push in the adapter */
++ gst_adapter_push (adapter, buffer);
++ avail = gst_adapter_available (adapter);
++ fail_unless (avail == 100);
++
++ /* timestamp is now undefined */
++ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
++ fail_unless (timestamp == GST_CLOCK_TIME_NONE);
++ fail_unless (dist == 0);
++
++ gst_adapter_flush (adapter, 50);
++ avail = gst_adapter_available (adapter);
++ fail_unless (avail == 50);
++
++ /* still undefined, dist changed, though */
++ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
++ fail_unless (timestamp == GST_CLOCK_TIME_NONE);
++ fail_unless (dist == 50);
++
++ buffer = gst_buffer_new_and_alloc (100);
++ GST_BUFFER_TIMESTAMP (buffer) = 1 * GST_SECOND;
++
++ /* push in the adapter */
++ gst_adapter_push (adapter, buffer);
++ avail = gst_adapter_available (adapter);
++ fail_unless (avail == 150);
++
++ /* timestamp is still undefined */
++ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
++ fail_unless (timestamp == GST_CLOCK_TIME_NONE);
++ fail_unless (dist == 50);
++
++ /* flush out first buffer we are now at the second buffer timestamp */
++ gst_adapter_flush (adapter, 50);
++ avail = gst_adapter_available (adapter);
++ fail_unless (avail == 100);
++
++ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
++ fail_unless (timestamp == 1 * GST_SECOND);
++ fail_unless (dist == 0);
++
++ /* move some more, still the same timestamp but further away */
++ gst_adapter_flush (adapter, 50);
++ avail = gst_adapter_available (adapter);
++ fail_unless (avail == 50);
++
++ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
++ fail_unless (timestamp == 1 * GST_SECOND);
++ fail_unless (dist == 50);
++
++ /* push a buffer without timestamp in the adapter */
++ buffer = gst_buffer_new_and_alloc (100);
++ gst_adapter_push (adapter, buffer);
++ avail = gst_adapter_available (adapter);
++ fail_unless (avail == 150);
++ /* push a buffer with timestamp in the adapter */
++ buffer = gst_buffer_new_and_alloc (100);
++ GST_BUFFER_TIMESTAMP (buffer) = 2 * GST_SECOND;
++ gst_adapter_push (adapter, buffer);
++ avail = gst_adapter_available (adapter);
++ fail_unless (avail == 250);
++
++ /* timestamp still as it was before the push */
++ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
++ fail_unless (timestamp == 1 * GST_SECOND);
++ fail_unless (dist == 50);
++
++ /* flush away buffer with the timestamp */
++ gst_adapter_flush (adapter, 50);
++ avail = gst_adapter_available (adapter);
++ fail_unless (avail == 200);
++ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
++ fail_unless (timestamp == 1 * GST_SECOND);
++ fail_unless (dist == 100);
++
++ /* move into the second buffer */
++ gst_adapter_flush (adapter, 50);
++ avail = gst_adapter_available (adapter);
++ fail_unless (avail == 150);
++ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
++ fail_unless (timestamp == 1 * GST_SECOND);
++ fail_unless (dist == 150);
++
++ /* move to third buffer we move to the new timestamp */
++ gst_adapter_flush (adapter, 50);
++ avail = gst_adapter_available (adapter);
++ fail_unless (avail == 100);
++ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
++ fail_unless (timestamp == 2 * GST_SECOND);
++ fail_unless (dist == 0);
++
++ /* move everything out */
++ gst_adapter_flush (adapter, 100);
++ avail = gst_adapter_available (adapter);
++ fail_unless (avail == 0);
++ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
++ fail_unless (timestamp == 2 * GST_SECOND);
++ fail_unless (dist == 100);
++
++ /* clear everything */
++ gst_adapter_clear (adapter);
++ avail = gst_adapter_available (adapter);
++ fail_unless (avail == 0);
++ timestamp = gst_adapter_prev_timestamp (adapter, &dist);
++ fail_unless (timestamp == GST_CLOCK_TIME_NONE);
++ fail_unless (dist == 0);
++
++ g_object_unref (adapter);
++}
++
++GST_END_TEST;
++
++GST_START_TEST (test_scan)
++{
++ GstAdapter *adapter;
++ GstBuffer *buffer;
++ guint8 *data;
++ guint offset;
++ guint i;
++
++ adapter = gst_adapter_new ();
++ fail_unless (adapter != NULL);
++
++ buffer = gst_buffer_new_and_alloc (100);
++ data = GST_BUFFER_DATA (buffer);
++ /* fill with pattern */
++ for (i = 0; i < 100; i++)
++ data[i] = i;
++
++ gst_adapter_push (adapter, buffer);
++
++ /* find first bytes */
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x00010203, 0, 100);
++ fail_unless (offset == 0);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x01020304, 0, 100);
++ fail_unless (offset == 1);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x01020304, 1, 99);
++ fail_unless (offset == 1);
++ /* offset is past the pattern start */
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x01020304, 2, 98);
++ fail_unless (offset == -1);
++ /* not enough bytes to find the pattern */
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x02030405, 2, 3);
++ fail_unless (offset == -1);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x02030405, 2, 4);
++ fail_unless (offset == 2);
++ /* size does not include the last scanned byte */
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x40414243, 0, 0x41);
++ fail_unless (offset == -1);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x40414243, 0, 0x43);
++ fail_unless (offset == -1);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x40414243, 0, 0x44);
++ fail_unless (offset == 0x40);
++ /* past the start */
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x40414243, 65, 10);
++ fail_unless (offset == -1);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x40414243, 64, 5);
++ fail_unless (offset == 64);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x60616263, 65, 35);
++ fail_unless (offset == 0x60);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x60616263, 0x60, 4);
++ fail_unless (offset == 0x60);
++ /* past the start */
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x60616263, 0x61, 3);
++ fail_unless (offset == -1);
++
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x60616263, 99, 1);
++ fail_unless (offset == -1);
++
++ /* add another buffer */
++ buffer = gst_buffer_new_and_alloc (100);
++ data = GST_BUFFER_DATA (buffer);
++ /* fill with pattern */
++ for (i = 0; i < 100; i++)
++ data[i] = i + 100;
++
++ gst_adapter_push (adapter, buffer);
++
++ /* past the start */
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x60616263, 0x61, 6);
++ fail_unless (offset == -1);
++ /* this should work */
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x61626364, 0x61, 4);
++ fail_unless (offset == 0x61);
++ /* not enough data */
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x62636465, 0x61, 4);
++ fail_unless (offset == -1);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x62636465, 0x61, 5);
++ fail_unless (offset == 0x62);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x62636465, 0, 120);
++ fail_unless (offset == 0x62);
++
++ /* border conditions */
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x62636465, 0, 200);
++ fail_unless (offset == 0x62);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x63646566, 0, 200);
++ fail_unless (offset == 0x63);
++ /* we completely searched the first list */
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x64656667, 0, 200);
++ fail_unless (offset == 0x64);
++ /* skip first buffer */
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x64656667, 0x64,
++ 100);
++ fail_unless (offset == 0x64);
++ /* past the start */
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x64656667, 0x65,
++ 10);
++ fail_unless (offset == -1);
++ /* not enough data to scan */
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x64656667, 0x63, 4);
++ fail_unless (offset == -1);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x64656667, 0x63, 5);
++ fail_unless (offset == 0x64);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 0, 199);
++ fail_unless (offset == -1);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 0x62,
++ 102);
++ fail_unless (offset == 0xc4);
++ /* different masks */
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0x00ffffff, 0x00656667, 0x64,
++ 100);
++ fail_unless (offset == 0x64);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0x000000ff, 0x00000000, 0, 100);
++ fail_unless (offset == -1);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0x000000ff, 0x00000003, 0, 100);
++ fail_unless (offset == 0);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0x000000ff, 0x00000061, 0x61,
++ 100);
++ fail_unless (offset == -1);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xff000000, 0x61000000, 0, 0x62);
++ fail_unless (offset == -1);
++ /* does not even exist */
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0x00ffffff, 0xffffffff, 0x65,
++ 99);
++ fail_unless (offset == -1);
++
++ /* flush some bytes */
++ gst_adapter_flush (adapter, 0x20);
++
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x20212223, 0, 100);
++ fail_unless (offset == 0);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x20212223, 0, 4);
++ fail_unless (offset == 0);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 0x62,
++ 70);
++ fail_unless (offset == 0xa4);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 0, 168);
++ fail_unless (offset == 0xa4);
++
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 164, 4);
++ fail_unless (offset == 0xa4);
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 0x44,
++ 100);
++ fail_unless (offset == 0xa4);
++ /* not enough bytes */
++ offset =
++ gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0xc4c5c6c7, 0x44,
++ 99);
++ fail_unless (offset == -1);
++
++ g_object_unref (adapter);
++}
++
++GST_END_TEST;
++
+ static Suite *
+ gst_adapter_suite (void)
+ {
+@@ -259,6 +616,8 @@
+ tcase_add_test (tc_chain, test_take3);
+ tcase_add_test (tc_chain, test_take_order);
+ tcase_add_test (tc_chain, test_take_buf_order);
++ tcase_add_test (tc_chain, test_timestamp);
++ tcase_add_test (tc_chain, test_scan);
+
+ return s;
+ }
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/check/libs/controller.c gstreamer-0.10.23/tests/check/libs/controller.c
+--- gstreamer-0.10.23.orig/tests/check/libs/controller.c 2009-04-15 21:18:17.000000000 +0200
++++ gstreamer-0.10.23/tests/check/libs/controller.c 2009-06-11 14:19:59.000000000 +0200
+@@ -797,6 +797,66 @@
+
+ GST_END_TEST;
+
++/* test timed value handling with cubic interpolation */
++GST_START_TEST (controller_interpolate_cubic_too_few_cp)
++{
++ GstController *ctrl;
++ GstInterpolationControlSource *csource;
++ GstElement *elem;
++ gboolean res;
++ GValue val_double = { 0, };
++
++ gst_controller_init (NULL, NULL);
++
++ elem = gst_element_factory_make ("testmonosource", "test_source");
++
++ /* that property should exist and should be controllable */
++ ctrl = gst_controller_new (G_OBJECT (elem), "double", NULL);
++ fail_unless (ctrl != NULL, NULL);
++
++ /* Get interpolation control source */
++ csource = gst_interpolation_control_source_new ();
++
++ fail_unless (csource != NULL);
++ fail_unless (gst_controller_set_control_source (ctrl, "double",
++ GST_CONTROL_SOURCE (csource)));
++
++ /* set interpolation mode */
++ fail_unless (gst_interpolation_control_source_set_interpolation_mode (csource,
++ GST_INTERPOLATE_CUBIC));
++
++ /* set 2 control values */
++ g_value_init (&val_double, G_TYPE_DOUBLE);
++ g_value_set_double (&val_double, 0.0);
++ res =
++ gst_interpolation_control_source_set (csource, 0 * GST_SECOND,
++ &val_double);
++ fail_unless (res, NULL);
++ g_value_set_double (&val_double, 4.0);
++ res =
++ gst_interpolation_control_source_set (csource, 2 * GST_SECOND,
++ &val_double);
++ fail_unless (res, NULL);
++
++ g_object_unref (G_OBJECT (csource));
++
++ /* now pull in values for some timestamps and verify that it used linear
++ * interpolation as we don't gave enough control points
++ */
++ gst_controller_sync_values (ctrl, 0 * GST_SECOND);
++ fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_double, 0.0);
++ gst_controller_sync_values (ctrl, 1 * GST_SECOND);
++ fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_double, 2.0);
++ gst_controller_sync_values (ctrl, 2 * GST_SECOND);
++ fail_unless_equals_float (GST_TEST_MONO_SOURCE (elem)->val_double, 4.0);
++
++ GST_INFO ("controller->ref_count=%d", G_OBJECT (ctrl)->ref_count);
++ g_object_unref (ctrl);
++ gst_object_unref (elem);
++}
++
++GST_END_TEST;
++
+ /* make sure we don't crash when someone sets an unsupported interpolation
+ * mode */
+ GST_START_TEST (controller_interpolate_unimplemented)
+@@ -2139,6 +2199,7 @@
+ tcase_add_test (tc, controller_interpolate_trigger);
+ tcase_add_test (tc, controller_interpolate_linear);
+ tcase_add_test (tc, controller_interpolate_cubic);
++ tcase_add_test (tc, controller_interpolate_cubic_too_few_cp);
+ tcase_add_test (tc, controller_interpolate_unimplemented);
+ tcase_add_test (tc, controller_interpolation_unset);
+ tcase_add_test (tc, controller_interpolation_unset_all);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/check/libs/transform1.c gstreamer-0.10.23/tests/check/libs/transform1.c
+--- gstreamer-0.10.23.orig/tests/check/libs/transform1.c 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/tests/check/libs/transform1.c 2009-06-11 14:19:59.000000000 +0200
+@@ -76,7 +76,7 @@
+ buffer = gst_buffer_new_and_alloc (20);
+
+ buffer_alloc_pt1_called = FALSE;
+- set_caps_pt1_called = FALSE;;
++ set_caps_pt1_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_OK);
+ /* FIXME, passthough without pad-alloc, do pad-alloc on the srcpad */
+@@ -95,7 +95,7 @@
+
+ buffer = gst_buffer_new_and_alloc (10);
+ buffer_alloc_pt1_called = FALSE;
+- set_caps_pt1_called = FALSE;;
++ set_caps_pt1_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_OK);
+ /* FIXME, passthough without pad-alloc, do pad-alloc on the srcpad */
+@@ -114,7 +114,7 @@
+ GST_DEBUG_OBJECT (trans, "alloc without caps, size 20");
+
+ buffer_alloc_pt1_called = FALSE;
+- set_caps_pt1_called = FALSE;;
++ set_caps_pt1_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, NULL, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_pt1_called == TRUE);
+@@ -126,7 +126,7 @@
+
+ caps = gst_caps_new_simple ("foo/x-bar", NULL);
+ buffer_alloc_pt1_called = FALSE;
+- set_caps_pt1_called = FALSE;;
++ set_caps_pt1_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 10, caps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_pt1_called == TRUE);
+@@ -135,7 +135,7 @@
+
+ /* once more */
+ buffer_alloc_pt1_called = FALSE;
+- set_caps_pt1_called = FALSE;;
++ set_caps_pt1_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 10, caps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_pt1_called == TRUE);
+@@ -207,7 +207,7 @@
+ GST_DEBUG_OBJECT (trans, "alloc with caps, size 20");
+
+ buffer_alloc_pt1_called = FALSE;
+- set_caps_pt2_called = FALSE;;
++ set_caps_pt2_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, caps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_pt1_called == TRUE);
+@@ -247,7 +247,7 @@
+ GST_DEBUG_OBJECT (trans, "alloc with caps, size 20");
+
+ buffer_alloc_pt1_called = FALSE;
+- set_caps_pt2_called = FALSE;;
++ set_caps_pt2_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, caps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_pt1_called == TRUE);
+@@ -262,7 +262,7 @@
+ GST_DEBUG_OBJECT (trans, "alloc with superset caps, size 20");
+
+ buffer_alloc_pt1_called = FALSE;
+- set_caps_pt2_called = FALSE;;
++ set_caps_pt2_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 20, caps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_pt1_called == TRUE);
+@@ -308,8 +308,8 @@
+
+ buffer = gst_buffer_new_and_alloc (20);
+
+- transform_ip_1_called = FALSE;;
+- transform_ip_1_writable = TRUE;;
++ transform_ip_1_called = FALSE;
++ transform_ip_1_writable = TRUE;
+ buffer_alloc_pt1_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_OK);
+@@ -331,8 +331,8 @@
+
+ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 2);
+
+- transform_ip_1_called = FALSE;;
+- transform_ip_1_writable = FALSE;;
++ transform_ip_1_called = FALSE;
++ transform_ip_1_writable = FALSE;
+ buffer_alloc_pt1_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_OK);
+@@ -430,10 +430,10 @@
+
+ GST_DEBUG_OBJECT (trans, "buffer without caps, size 20");
+
+- transform_ip_1_called = FALSE;;
+- transform_ip_1_writable = FALSE;;
++ transform_ip_1_called = FALSE;
++ transform_ip_1_writable = FALSE;
+ buffer_alloc_pt1_called = FALSE;
+- set_caps_1_called = FALSE;;
++ set_caps_1_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_NOT_NEGOTIATED);
+ fail_unless (transform_ip_1_called == FALSE);
+@@ -449,7 +449,7 @@
+
+ transform_ip_1_called = FALSE;
+ transform_ip_1_writable = FALSE;
+- set_caps_1_called = FALSE;;
++ set_caps_1_called = FALSE;
+ buffer_alloc_pt1_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_OK);
+@@ -487,8 +487,8 @@
+
+ fail_unless (GST_MINI_OBJECT_REFCOUNT_VALUE (buffer) == 2);
+
+- transform_ip_1_called = FALSE;;
+- transform_ip_1_writable = FALSE;;
++ transform_ip_1_called = FALSE;
++ transform_ip_1_writable = FALSE;
+ buffer_alloc_pt1_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_OK);
+@@ -548,7 +548,7 @@
+ fail_unless (gst_caps_is_equal (incaps, caps1));
+ fail_unless (gst_caps_is_equal (outcaps, caps2));
+
+- set_caps_ct1_called = TRUE;;
++ set_caps_ct1_called = TRUE;
+
+ gst_caps_unref (caps1);
+ gst_caps_unref (caps2);
+@@ -678,9 +678,9 @@
+
+ GST_DEBUG_OBJECT (trans, "buffer without caps");
+
+- transform_ct1_called = FALSE;;
+- transform_ct1_writable = FALSE;;
+- set_caps_ct1_called = FALSE;;
++ transform_ct1_called = FALSE;
++ transform_ct1_writable = FALSE;
++ set_caps_ct1_called = FALSE;
+ buffer_alloc_ct1_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_NOT_NEGOTIATED);
+@@ -697,7 +697,7 @@
+
+ transform_ct1_called = FALSE;
+ transform_ct1_writable = FALSE;
+- set_caps_ct1_called = FALSE;;
++ set_caps_ct1_called = FALSE;
+ buffer_alloc_ct1_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_OK);
+@@ -721,8 +721,8 @@
+
+ GST_DEBUG_OBJECT (trans, "buffer with caps %" GST_PTR_FORMAT, incaps);
+
+- transform_ct1_called = FALSE;;
+- transform_ct1_writable = FALSE;;
++ transform_ct1_called = FALSE;
++ transform_ct1_writable = FALSE;
+ buffer_alloc_ct1_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_OK);
+@@ -797,7 +797,7 @@
+ fail_unless (gst_caps_is_equal (incaps, caps1));
+ fail_unless (gst_caps_is_equal (outcaps, caps2));
+
+- set_caps_ct2_called = TRUE;;
++ set_caps_ct2_called = TRUE;
+
+ gst_caps_unref (caps1);
+ gst_caps_unref (caps2);
+@@ -958,9 +958,9 @@
+
+ GST_DEBUG_OBJECT (trans, "buffer without caps");
+
+- transform_ct2_called = FALSE;;
+- transform_ct2_writable = FALSE;;
+- set_caps_ct2_called = FALSE;;
++ transform_ct2_called = FALSE;
++ transform_ct2_writable = FALSE;
++ set_caps_ct2_called = FALSE;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_NOT_NEGOTIATED);
+@@ -979,7 +979,7 @@
+ set_caps_ct2_case = 1;
+ transform_ct2_called = FALSE;
+ transform_ct2_writable = FALSE;
+- set_caps_ct2_called = FALSE;;
++ set_caps_ct2_called = FALSE;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_OK);
+@@ -1003,8 +1003,8 @@
+
+ GST_DEBUG_OBJECT (trans, "buffer with caps %" GST_PTR_FORMAT, incaps);
+
+- transform_ct2_called = FALSE;;
+- transform_ct2_writable = FALSE;;
++ transform_ct2_called = FALSE;
++ transform_ct2_writable = FALSE;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_OK);
+@@ -1111,9 +1111,9 @@
+
+ GST_DEBUG_OBJECT (trans, "buffer without caps");
+
+- transform_ct2_called = FALSE;;
+- transform_ct2_writable = FALSE;;
+- set_caps_ct2_called = FALSE;;
++ transform_ct2_called = FALSE;
++ transform_ct2_writable = FALSE;
++ set_caps_ct2_called = FALSE;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_NOT_NEGOTIATED);
+@@ -1131,7 +1131,7 @@
+ buffer_alloc_ct2_case = 1;
+ set_caps_ct2_case = 1;
+ transform_ct2_called = FALSE;
+- set_caps_ct2_called = FALSE;;
++ set_caps_ct2_called = FALSE;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_OK);
+@@ -1154,7 +1154,7 @@
+
+ GST_DEBUG_OBJECT (trans, "buffer with caps %" GST_PTR_FORMAT, incaps);
+
+- transform_ct2_called = FALSE;;
++ transform_ct2_called = FALSE;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_OK);
+@@ -1205,7 +1205,7 @@
+ /* don't suggest anything else */
+ buffer_alloc_ct2_case = 1;
+ set_caps_ct2_case = 2;
+- transform_ct2_called = FALSE;;
++ transform_ct2_called = FALSE;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_OK);
+@@ -1232,7 +1232,7 @@
+ set_caps_ct2_case = 0;
+ buffer_alloc_ct2_case = 1;
+ buffer_alloc_ct2_called = FALSE;
+- set_caps_ct2_called = FALSE;;
++ set_caps_ct2_called = FALSE;
+ res = gst_pad_alloc_buffer (trans->srcpad, 0, 10, incaps, &buffer);
+ fail_unless (res == GST_FLOW_OK);
+ fail_unless (buffer_alloc_ct2_called == TRUE);
+@@ -1251,7 +1251,7 @@
+ /* don't suggest anything else */
+ buffer_alloc_ct2_suggest = FALSE;
+ buffer_alloc_ct2_case = 0;
+- transform_ct2_called = FALSE;;
++ transform_ct2_called = FALSE;
+ buffer_alloc_ct2_called = FALSE;
+ res = gst_test_trans_push (trans, buffer);
+ fail_unless (res == GST_FLOW_OK);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/check/Makefile.am gstreamer-0.10.23/tests/check/Makefile.am
+--- gstreamer-0.10.23.orig/tests/check/Makefile.am 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/tests/check/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -76,6 +76,7 @@
+ check_PROGRAMS = \
+ gst/gstabi \
+ gst/gstbuffer \
++ gst/gstbufferlist \
+ gst/gstbus \
+ gst/gstcaps \
+ gst/gstinfo \
+@@ -151,6 +152,10 @@
+ elements_fdsrc_CFLAGS=$(GST_OBJ_CFLAGS) $(CHECK_CFLAGS) -DTESTFILE=\"$(top_srcdir)/configure.ac\"
+ elements_filesrc_CFLAGS=$(GST_OBJ_CFLAGS) $(CHECK_CFLAGS) -DTESTFILE=\"$(top_srcdir)/configure.ac\"
+
++elements_fakesink_LDADD = \
++ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
++ $(LDADD)
++
+ libs_basesrc_LDADD = \
+ $(top_builddir)/libs/gst/base/libgstbase-@GST_MAJORMINOR@.la \
+ $(LDADD)
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/check/pipelines/cleanup.c gstreamer-0.10.23/tests/check/pipelines/cleanup.c
+--- gstreamer-0.10.23.orig/tests/check/pipelines/cleanup.c 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/tests/check/pipelines/cleanup.c 2009-06-11 14:19:59.000000000 +0200
+@@ -91,7 +91,7 @@
+
+ run_pipeline (pipeline, s,
+ GST_MESSAGE_NEW_CLOCK | GST_MESSAGE_STATE_CHANGED |
+- GST_MESSAGE_ASYNC_DONE, GST_MESSAGE_EOS);
++ GST_MESSAGE_STREAM_STATUS | GST_MESSAGE_ASYNC_DONE, GST_MESSAGE_EOS);
+ while (GST_OBJECT_REFCOUNT_VALUE (src) > 1)
+ THREAD_SWITCH ();
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/check/pipelines/simple-launch-lines.c gstreamer-0.10.23/tests/check/pipelines/simple-launch-lines.c
+--- gstreamer-0.10.23.orig/tests/check/pipelines/simple-launch-lines.c 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/tests/check/pipelines/simple-launch-lines.c 2009-06-11 14:19:59.000000000 +0200
+@@ -102,27 +102,28 @@
+ s = "fakesrc can-activate-push=false ! fakesink can-activate-pull=true";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_NEW_CLOCK | GST_MESSAGE_STATE_CHANGED |
+- GST_MESSAGE_ASYNC_DONE, GST_MESSAGE_UNKNOWN);
++ GST_MESSAGE_STREAM_STATUS | GST_MESSAGE_ASYNC_DONE, GST_MESSAGE_UNKNOWN);
+
+ s = "fakesrc can-activate-push=true ! fakesink can-activate-pull=false";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_NEW_CLOCK | GST_MESSAGE_STATE_CHANGED |
+- GST_MESSAGE_ASYNC_DONE, GST_MESSAGE_UNKNOWN);
++ GST_MESSAGE_STREAM_STATUS | GST_MESSAGE_ASYNC_DONE, GST_MESSAGE_UNKNOWN);
+
+ s = "fakesrc can-activate-push=false num-buffers=10 ! fakesink can-activate-pull=true";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_NEW_CLOCK | GST_MESSAGE_STATE_CHANGED |
+- GST_MESSAGE_ASYNC_DONE, GST_MESSAGE_EOS);
++ GST_MESSAGE_STREAM_STATUS | GST_MESSAGE_ASYNC_DONE, GST_MESSAGE_EOS);
+
+ s = "fakesrc can-activate-push=true num-buffers=10 ! fakesink can-activate-pull=false";
+ run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_NEW_CLOCK | GST_MESSAGE_STATE_CHANGED |
+- GST_MESSAGE_ASYNC_DONE, GST_MESSAGE_EOS);
++ GST_MESSAGE_STREAM_STATUS | GST_MESSAGE_ASYNC_DONE, GST_MESSAGE_EOS);
+
+ s = "fakesrc can-activate-push=false ! fakesink can-activate-pull=false";
+ ASSERT_CRITICAL (run_pipeline (setup_pipeline (s), s,
+ GST_MESSAGE_NEW_CLOCK | GST_MESSAGE_STATE_CHANGED |
+- GST_MESSAGE_ASYNC_DONE, GST_MESSAGE_UNKNOWN));
++ GST_MESSAGE_STREAM_STATUS | GST_MESSAGE_ASYNC_DONE,
++ GST_MESSAGE_UNKNOWN));
+ }
+
+ GST_END_TEST;
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/examples/controller/audio-example.c gstreamer-0.10.23/tests/examples/controller/audio-example.c
+--- gstreamer-0.10.23.orig/tests/examples/controller/audio-example.c 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/tests/examples/controller/audio-example.c 2009-06-11 14:19:59.000000000 +0200
+@@ -31,7 +31,16 @@
+ bin = gst_pipeline_new ("pipeline");
+ clock = gst_pipeline_get_clock (GST_PIPELINE (bin));
+ src = gst_element_factory_make ("audiotestsrc", "gen_audio");
+- sink = gst_element_factory_make ("alsasink", "play_audio");
++ if (!src) {
++ GST_WARNING ("need audiotestsrc from gst-plugins-base");
++ goto Error;
++ }
++ sink = gst_element_factory_make ("autoaudiosink", "play_audio");
++ if (!sink) {
++ GST_WARNING ("need autoaudiosink from gst-plugins-base");
++ goto Error;
++ }
++
+ gst_bin_add_many (GST_BIN (bin), src, sink, NULL);
+ if (!gst_element_link (src, sink)) {
+ GST_WARNING ("can't link elements");
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/examples/Makefile.am gstreamer-0.10.23/tests/examples/Makefile.am
+--- gstreamer-0.10.23.orig/tests/examples/Makefile.am 2009-01-21 11:11:04.000000000 +0100
++++ gstreamer-0.10.23/tests/examples/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -17,12 +17,20 @@
+ ADAPTER_TEST_DIR =
+ endif
+
++# streams test needs pthreads
++if HAVE_PTHREAD_H
++ STREAMS_TEST_DIR = streams
++else
++ STREAMS_TEST_DIR =
++endif
++
+ always_dirs = \
+ controller \
+ helloworld \
+ manual \
+ metadata \
+- queue
++ queue \
++ stepping
+
+ #appreader
+ #cutter
+@@ -43,7 +51,8 @@
+ SUBDIRS = \
+ $(always_dirs) \
+ $(ADAPTER_TEST_DIR) \
++ $(STREAMS_TEST_DIR) \
+ $(GST_PARSE_DIRS) \
+ $(GST_LOADSAVE_DIRS)
+
+-DIST_SUBDIRS = $(always_dirs) adapter xml typefind launch
++DIST_SUBDIRS = $(always_dirs) adapter streams xml typefind launch
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/examples/stepping/framestep1.c gstreamer-0.10.23/tests/examples/stepping/framestep1.c
+--- gstreamer-0.10.23.orig/tests/examples/stepping/framestep1.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/examples/stepping/framestep1.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,157 @@
++#include <stdlib.h>
++#include <gst/gst.h>
++
++static void
++event_loop (GstElement * pipe)
++{
++ GstBus *bus;
++ GstMessage *message = NULL;
++
++ bus = gst_element_get_bus (GST_ELEMENT (pipe));
++
++ while (TRUE) {
++ message = gst_bus_timed_pop_filtered (bus, GST_MESSAGE_ANY, -1);
++
++ g_assert (message != NULL);
++
++ switch (message->type) {
++ case GST_MESSAGE_EOS:
++ g_message ("got EOS");
++ gst_message_unref (message);
++ return;
++ case GST_MESSAGE_WARNING:
++ case GST_MESSAGE_ERROR:
++ {
++ GError *gerror;
++ gchar *debug;
++
++ gst_message_parse_error (message, &gerror, &debug);
++ gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
++ gst_message_unref (message);
++ g_error_free (gerror);
++ g_free (debug);
++ return;
++ }
++ case GST_MESSAGE_STEP_DONE:
++ {
++ GstFormat format;
++ guint64 amount;
++ gdouble rate;
++ gboolean flush, intermediate;
++ guint64 duration;
++
++ gst_message_parse_step_done (message, &format, &amount, &rate,
++ &flush, &intermediate, &duration);
++
++ if (format == GST_FORMAT_DEFAULT) {
++ g_message ("step done: %" GST_TIME_FORMAT " skipped in %"
++ G_GUINT64_FORMAT " frames", GST_TIME_ARGS (duration), amount);
++ } else {
++ g_message ("step done: %" GST_TIME_FORMAT " skipped",
++ GST_TIME_ARGS (duration));
++ }
++
++ return;
++ }
++ default:
++ gst_message_unref (message);
++ break;
++ }
++ }
++}
++
++/* signalled when a new preroll buffer is available */
++static void
++new_preroll (GstElement * appsink, gpointer user_data)
++{
++ GstBuffer *buffer;
++
++ g_signal_emit_by_name (appsink, "pull-preroll", &buffer);
++
++ g_message ("have new-preroll buffer %p, timestamp %" GST_TIME_FORMAT, buffer,
++ GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)));
++
++ gst_buffer_unref (buffer);
++}
++
++int
++main (int argc, char *argv[])
++{
++ GstElement *bin, *videotestsrc, *appsink;
++ GstFormat format;
++ gint64 pos;
++
++ gst_init (&argc, &argv);
++
++ /* create a new bin to hold the elements */
++ bin = gst_pipeline_new ("pipeline");
++ g_assert (bin);
++
++ /* create a fake source */
++ videotestsrc = gst_element_factory_make ("videotestsrc", "videotestsrc");
++ g_assert (videotestsrc);
++ g_object_set (videotestsrc, "num-buffers", 10, NULL);
++
++ /* and a fake sink */
++ appsink = gst_element_factory_make ("appsink", "appsink");
++ g_assert (appsink);
++ g_object_set (appsink, "emit-signals", TRUE, NULL);
++ g_object_set (appsink, "sync", TRUE, NULL);
++ g_signal_connect (appsink, "new-preroll", (GCallback) new_preroll, NULL);
++
++ /* add objects to the main pipeline */
++ gst_bin_add (GST_BIN (bin), videotestsrc);
++ gst_bin_add (GST_BIN (bin), appsink);
++
++ /* link the elements */
++ gst_element_link_many (videotestsrc, appsink, NULL);
++
++ /* go to the PAUSED state and wait for preroll */
++ g_message ("prerolling first frame");
++ gst_element_set_state (bin, GST_STATE_PAUSED);
++ gst_element_get_state (bin, NULL, NULL, -1);
++
++ /* step two frames, flush so that new preroll is queued */
++ g_message ("stepping three frames");
++ g_assert (gst_element_send_event (bin,
++ gst_event_new_step (GST_FORMAT_BUFFERS, 2, 1.0, TRUE, FALSE)));
++
++ /* blocks and returns when we received the step done message */
++ event_loop (bin);
++
++ /* wait for step to really complete */
++ gst_element_get_state (bin, NULL, NULL, -1);
++
++ format = GST_FORMAT_TIME;
++ gst_element_query_position (bin, &format, &pos);
++ g_message ("stepped two frames, now at %" GST_TIME_FORMAT,
++ GST_TIME_ARGS (pos));
++
++ /* step 3 frames, flush so that new preroll is queued */
++ g_message ("stepping 120 milliseconds ");
++ g_assert (gst_element_send_event (bin,
++ gst_event_new_step (GST_FORMAT_TIME, 120 * GST_MSECOND, 1.0, TRUE,
++ FALSE)));
++
++ /* blocks and returns when we received the step done message */
++ event_loop (bin);
++
++ /* wait for step to really complete */
++ gst_element_get_state (bin, NULL, NULL, -1);
++
++ format = GST_FORMAT_TIME;
++ gst_element_query_position (bin, &format, &pos);
++ g_message ("stepped 120ms frames, now at %" GST_TIME_FORMAT,
++ GST_TIME_ARGS (pos));
++
++ g_message ("playing until EOS");
++ gst_element_set_state (bin, GST_STATE_PLAYING);
++ /* Run event loop listening for bus messages until EOS or ERROR */
++ event_loop (bin);
++ g_message ("finished");
++
++ /* stop the bin */
++ gst_element_set_state (bin, GST_STATE_NULL);
++
++ exit (0);
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/examples/stepping/Makefile.am gstreamer-0.10.23/tests/examples/stepping/Makefile.am
+--- gstreamer-0.10.23.orig/tests/examples/stepping/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/examples/stepping/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,4 @@
++noinst_PROGRAMS = framestep1
++
++framestep1_LDADD = $(GST_OBJ_LIBS)
++framestep1_CFLAGS = $(GST_OBJ_CFLAGS)
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/examples/streams/Makefile.am gstreamer-0.10.23/tests/examples/streams/Makefile.am
+--- gstreamer-0.10.23.orig/tests/examples/streams/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/examples/streams/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,9 @@
++noinst_PROGRAMS = stream-status rtpool-test
++
++stream_status_SOURCES = stream-status.c
++stream_status_LDADD = $(GST_OBJ_LIBS)
++stream_status_CFLAGS = $(GST_OBJ_CFLAGS)
++
++rtpool_test_SOURCES = rtpool-test.c testrtpool.h testrtpool.c
++rtpool_test_LDADD = $(GST_OBJ_LIBS)
++rtpool_test_CFLAGS = $(GST_OBJ_CFLAGS)
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/examples/streams/rtpool-test.c gstreamer-0.10.23/tests/examples/streams/rtpool-test.c
+--- gstreamer-0.10.23.orig/tests/examples/streams/rtpool-test.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/examples/streams/rtpool-test.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,161 @@
++#include <stdlib.h>
++#include <gst/gst.h>
++
++#include "testrtpool.h"
++
++static GstTaskPool *pool;
++
++static void
++event_loop (GstBus * bus, GstElement * pipe)
++{
++ GstMessage *message = NULL;
++
++ while (TRUE) {
++ message = gst_bus_poll (bus, GST_MESSAGE_ANY, -1);
++
++ g_assert (message != NULL);
++
++ switch (message->type) {
++ case GST_MESSAGE_EOS:
++ g_message ("received EOS");
++ gst_message_unref (message);
++ return;
++ case GST_MESSAGE_WARNING:
++ {
++ GError *gerror;
++ gchar *debug;
++
++ gst_message_parse_warning (message, &gerror, &debug);
++ gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
++ gst_message_unref (message);
++ g_error_free (gerror);
++ g_free (debug);
++ return;
++ }
++ case GST_MESSAGE_ERROR:{
++ GError *gerror;
++ gchar *debug;
++
++ gst_message_parse_error (message, &gerror, &debug);
++ gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
++ gst_message_unref (message);
++ g_error_free (gerror);
++ g_free (debug);
++ return;
++ }
++ default:
++ gst_message_unref (message);
++ break;
++ }
++ }
++}
++
++static GstBusSyncReply
++sync_bus_handler (GstBus * bus, GstMessage * message, GstElement * bin)
++{
++ switch (GST_MESSAGE_TYPE (message)) {
++ case GST_MESSAGE_STREAM_STATUS:
++ {
++ GstStreamStatusType type;
++ GstElement *owner;
++ const GValue *val;
++ gchar *path;
++ GstTask *task = NULL;
++
++ g_message ("received STREAM_STATUS");
++ gst_message_parse_stream_status (message, &type, &owner);
++
++ val = gst_message_get_stream_status_object (message);
++
++ g_message ("type: %d", type);
++ path = gst_object_get_path_string (GST_MESSAGE_SRC (message));
++ g_message ("source: %s", path);
++ g_free (path);
++ path = gst_object_get_path_string (GST_OBJECT (owner));
++ g_message ("owner: %s", path);
++ g_free (path);
++ g_message ("object: type %s, value %p", G_VALUE_TYPE_NAME (val),
++ g_value_get_object (val));
++
++ /* see if we know how to deal with this object */
++ if (G_VALUE_TYPE (val) == GST_TYPE_TASK) {
++ task = g_value_get_object (val);
++ }
++
++ switch (type) {
++ case GST_STREAM_STATUS_TYPE_CREATE:
++ if (task) {
++ g_message ("created task %p, setting pool", task);
++ gst_task_set_pool (task, pool);
++ }
++ break;
++ case GST_STREAM_STATUS_TYPE_ENTER:
++ break;
++ case GST_STREAM_STATUS_TYPE_LEAVE:
++ break;
++ default:
++ break;
++ }
++ break;
++ }
++ default:
++ break;
++ }
++ /* pass all messages on the async queue */
++ return GST_BUS_PASS;
++}
++
++int
++main (int argc, char *argv[])
++{
++ GstElement *bin, *alsasrc, *alsasink;
++ GstBus *bus;
++ GstStateChangeReturn ret;
++
++ gst_init (&argc, &argv);
++
++ /* create a custom thread pool */
++ pool = test_rt_pool_new ();
++
++ /* create a new bin to hold the elements */
++ bin = gst_pipeline_new ("pipeline");
++ g_assert (bin);
++
++ /* create a source */
++ alsasrc = gst_element_factory_make ("alsasrc", "alsasrc");
++ g_assert (alsasrc);
++ g_object_set (alsasrc, "device", "hw:0", NULL);
++ g_object_set (alsasrc, "latency-time", (gint64) 2000, NULL);
++ g_object_set (alsasrc, "slave-method", 2, NULL);
++
++ /* and a sink */
++ alsasink = gst_element_factory_make ("alsasink", "alsasink");
++ g_assert (alsasink);
++ g_object_set (alsasink, "device", "hw:0", NULL);
++ g_object_set (alsasink, "latency-time", (gint64) 2000, NULL);
++ g_object_set (alsasink, "buffer-time", (gint64) 10000, NULL);
++
++ /* add objects to the main pipeline */
++ gst_bin_add_many (GST_BIN (bin), alsasrc, alsasink, NULL);
++
++ /* link the elements */
++ gst_element_link (alsasrc, alsasink);
++
++ /* get the bus, we need to install a sync handler */
++ bus = gst_pipeline_get_bus (GST_PIPELINE (bin));
++ gst_bus_set_sync_handler (bus, (GstBusSyncHandler) sync_bus_handler, bin);
++
++ /* start playing */
++ ret = gst_element_set_state (bin, GST_STATE_PLAYING);
++ if (ret == GST_STATE_CHANGE_FAILURE)
++ return 0;
++
++ /* Run event loop listening for bus messages until EOS or ERROR */
++ event_loop (bus, bin);
++
++ /* stop the bin */
++ gst_element_set_state (bin, GST_STATE_NULL);
++ gst_object_unref (bus);
++
++ exit (0);
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/examples/streams/stream-status.c gstreamer-0.10.23/tests/examples/streams/stream-status.c
+--- gstreamer-0.10.23.orig/tests/examples/streams/stream-status.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/examples/streams/stream-status.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,136 @@
++#include <stdlib.h>
++#include <gst/gst.h>
++
++static void
++event_loop (GstBus * bus, GstElement * pipe)
++{
++ GstMessage *message = NULL;
++
++ while (TRUE) {
++ message = gst_bus_poll (bus, GST_MESSAGE_ANY, -1);
++
++ g_assert (message != NULL);
++
++ switch (message->type) {
++ case GST_MESSAGE_EOS:
++ g_message ("received EOS");
++ gst_message_unref (message);
++ return;
++ case GST_MESSAGE_WARNING:
++ case GST_MESSAGE_ERROR:{
++ GError *gerror;
++ gchar *debug;
++
++ gst_message_parse_error (message, &gerror, &debug);
++ gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
++ gst_message_unref (message);
++ g_error_free (gerror);
++ g_free (debug);
++ return;
++ }
++ default:
++ gst_message_unref (message);
++ break;
++ }
++ }
++}
++
++static GstBusSyncReply
++sync_bus_handler (GstBus * bus, GstMessage * message, GstElement * bin)
++{
++ switch (GST_MESSAGE_TYPE (message)) {
++ case GST_MESSAGE_STREAM_STATUS:
++ {
++ GstStreamStatusType type;
++ GstElement *owner;
++ const GValue *val;
++ gchar *path;
++ GstTask *task = NULL;
++
++ g_message ("received STREAM_STATUS");
++ gst_message_parse_stream_status (message, &type, &owner);
++
++ val = gst_message_get_stream_status_object (message);
++
++ g_message ("type: %d", type);
++ path = gst_object_get_path_string (GST_MESSAGE_SRC (message));
++ g_message ("source: %s", path);
++ g_free (path);
++ path = gst_object_get_path_string (GST_OBJECT (owner));
++ g_message ("owner: %s", path);
++ g_free (path);
++ g_message ("object: type %s, value %p", G_VALUE_TYPE_NAME (val),
++ g_value_get_object (val));
++
++ /* see if we know how to deal with this object */
++ if (G_VALUE_TYPE (val) == GST_TYPE_TASK) {
++ task = g_value_get_object (val);
++ }
++
++ switch (type) {
++ case GST_STREAM_STATUS_TYPE_CREATE:
++ g_message ("created task %p", task);
++ break;
++ case GST_STREAM_STATUS_TYPE_ENTER:
++ if (task) {
++ g_message ("raising task priority for %p", task);
++ gst_task_set_priority (task, G_THREAD_PRIORITY_HIGH);
++ }
++ break;
++ case GST_STREAM_STATUS_TYPE_LEAVE:
++ break;
++ default:
++ break;
++ }
++ break;
++ }
++ default:
++ break;
++ }
++ /* pass all messages on the async queue */
++ return GST_BUS_PASS;
++}
++
++int
++main (int argc, char *argv[])
++{
++ GstElement *bin, *fakesrc, *fakesink;
++ GstBus *bus;
++
++ gst_init (&argc, &argv);
++
++ /* create a new bin to hold the elements */
++ bin = gst_pipeline_new ("pipeline");
++ g_assert (bin);
++
++ /* create a source */
++ fakesrc = gst_element_factory_make ("fakesrc", "fakesrc");
++ g_assert (fakesrc);
++ g_object_set (fakesrc, "num-buffers", 50, NULL);
++
++ /* and a sink */
++ fakesink = gst_element_factory_make ("fakesink", "fakesink");
++ g_assert (fakesink);
++
++ /* add objects to the main pipeline */
++ gst_bin_add_many (GST_BIN (bin), fakesrc, fakesink, NULL);
++
++ /* link the elements */
++ gst_element_link (fakesrc, fakesink);
++
++ /* get the bus, we need to install a sync handler */
++ bus = gst_pipeline_get_bus (GST_PIPELINE (bin));
++ gst_bus_set_sync_handler (bus, (GstBusSyncHandler) sync_bus_handler, bin);
++
++ /* start playing */
++ gst_element_set_state (bin, GST_STATE_PLAYING);
++
++ /* Run event loop listening for bus messages until EOS or ERROR */
++ event_loop (bus, bin);
++
++ /* stop the bin */
++ gst_element_set_state (bin, GST_STATE_NULL);
++ gst_object_unref (bus);
++
++ exit (0);
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/examples/streams/testrtpool.c gstreamer-0.10.23/tests/examples/streams/testrtpool.c
+--- gstreamer-0.10.23.orig/tests/examples/streams/testrtpool.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/examples/streams/testrtpool.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,137 @@
++/* GStreamer
++ * Copyright (C) 2009 Wim Taymans <wim.taymans@gmail.com>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#include <pthread.h>
++
++#include "testrtpool.h"
++
++static void test_rt_pool_class_init (TestRTPoolClass * klass);
++static void test_rt_pool_init (TestRTPool * pool);
++static void test_rt_pool_finalize (GObject * object);
++
++typedef struct
++{
++ pthread_t thread;
++} TestRTId;
++
++G_DEFINE_TYPE (TestRTPool, test_rt_pool, GST_TYPE_TASK_POOL);
++
++static void
++default_prepare (GstTaskPool * pool, GError ** error)
++{
++ /* we don't do anything here. We could construct a pool of threads here that
++ * we could reuse later but we don't */
++ g_message ("prepare Realtime pool %p", pool);
++}
++
++static void
++default_cleanup (GstTaskPool * pool)
++{
++ g_message ("cleanup Realtime pool %p", pool);
++}
++
++static gpointer
++default_push (GstTaskPool * pool, GstTaskPoolFunction func, gpointer data,
++ GError ** error)
++{
++ TestRTId *tid;
++ gint res;
++ pthread_attr_t attr;
++ struct sched_param param;
++
++ g_message ("pushing Realtime pool %p, %p", pool, func);
++
++ tid = g_slice_new0 (TestRTId);
++
++ g_message ("set policy");
++ pthread_attr_init (&attr);
++ if ((res = pthread_attr_setschedpolicy (&attr, SCHED_RR)) != 0)
++ g_warning ("setschedpolicy: failure: %p", g_strerror (res));
++
++ g_message ("set prio");
++ param.sched_priority = 50;
++ if ((res = pthread_attr_setschedparam (&attr, ¶m)) != 0)
++ g_warning ("setschedparam: failure: %p", g_strerror (res));
++
++ g_message ("set inherit");
++ if ((res = pthread_attr_setinheritsched (&attr, PTHREAD_EXPLICIT_SCHED)) != 0)
++ g_warning ("setinheritsched: failure: %p", g_strerror (res));
++
++ g_message ("create thread");
++ res = pthread_create (&tid->thread, &attr, (void *(*)(void *)) func, data);
++
++ if (res != 0) {
++ g_set_error (error, G_THREAD_ERROR, G_THREAD_ERROR_AGAIN,
++ "Error creating thread: %s", g_strerror (res));
++ g_slice_free (TestRTId, tid);
++ tid = NULL;
++ }
++
++ return tid;
++}
++
++static void
++default_join (GstTaskPool * pool, gpointer id)
++{
++ TestRTId *tid = (TestRTId *) id;
++
++ g_message ("joining Realtime pool %p", pool);
++
++ pthread_join (tid->thread, NULL);
++
++ g_slice_free (TestRTId, tid);
++}
++
++static void
++test_rt_pool_class_init (TestRTPoolClass * klass)
++{
++ GObjectClass *gobject_class;
++ GstTaskPoolClass *gsttaskpool_class;
++
++ gobject_class = (GObjectClass *) klass;
++ gsttaskpool_class = (GstTaskPoolClass *) klass;
++
++ gobject_class->finalize = GST_DEBUG_FUNCPTR (test_rt_pool_finalize);
++
++ gsttaskpool_class->prepare = default_prepare;
++ gsttaskpool_class->cleanup = default_cleanup;
++ gsttaskpool_class->push = default_push;
++ gsttaskpool_class->join = default_join;
++}
++
++static void
++test_rt_pool_init (TestRTPool * pool)
++{
++}
++
++static void
++test_rt_pool_finalize (GObject * object)
++{
++ G_OBJECT_CLASS (test_rt_pool_parent_class)->finalize (object);
++}
++
++GstTaskPool *
++test_rt_pool_new (void)
++{
++ GstTaskPool *pool;
++
++ pool = g_object_new (TEST_TYPE_RT_POOL, NULL);
++
++ return pool;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/examples/streams/testrtpool.h gstreamer-0.10.23/tests/examples/streams/testrtpool.h
+--- gstreamer-0.10.23.orig/tests/examples/streams/testrtpool.h 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/examples/streams/testrtpool.h 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,53 @@
++/* GStreamer
++ * Copyright (C) <2009> Wim Taymans <wim.taymans@gmail.com>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#ifndef __TEST_RT_POOL_H__
++#define __TEST_RT_POOL_H__
++
++#include <gst/gst.h>
++
++G_BEGIN_DECLS
++
++/* --- standard type macros --- */
++#define TEST_TYPE_RT_POOL (test_rt_pool_get_type ())
++#define TEST_RT_POOL(pool) (G_TYPE_CHECK_INSTANCE_CAST ((pool), TEST_TYPE_RT_POOL, TestRTPool))
++#define TEST_IS_RT_POOL(pool) (G_TYPE_CHECK_INSTANCE_TYPE ((pool), TEST_TYPE_RT_POOL))
++#define TEST_RT_POOL_CLASS(pclass) (G_TYPE_CHECK_CLASS_CAST ((pclass), TEST_TYPE_RT_POOL, TestRTPoolClass))
++#define TEST_IS_RT_POOL_CLASS(pclass) (G_TYPE_CHECK_CLASS_TYPE ((pclass), TEST_TYPE_RT_POOL))
++#define TEST_RT_POOL_GET_CLASS(pool) (G_TYPE_INSTANCE_GET_CLASS ((pool), TEST_TYPE_RT_POOL, TestRTPoolClass))
++#define TEST_RT_POOL_CAST(pool) ((TestRTPool*)(pool))
++
++typedef struct _TestRTPool TestRTPool;
++typedef struct _TestRTPoolClass TestRTPoolClass;
++
++struct _TestRTPool {
++ GstTaskPool object;
++};
++
++struct _TestRTPoolClass {
++ GstTaskPoolClass parent_class;
++};
++
++GType test_rt_pool_get_type (void);
++
++GstTaskPool * test_rt_pool_new (void);
++
++G_END_DECLS
++
++#endif /* __TEST_RT_POOL_H__ */
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/appreader/appreader.c gstreamer-0.10.23/tests/old/examples/appreader/appreader.c
+--- gstreamer-0.10.23.orig/tests/old/examples/appreader/appreader.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/appreader/appreader.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,76 @@
++/* GStreamer
++ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#include <gst/gst.h>
++
++static void
++fill_queue (GstElement * queue, gint level, GstBin * pipeline)
++{
++ /* this needs to iterate till something is pushed
++ * in the queue */
++ gst_bin_iterate (pipeline);
++}
++
++gint
++main (gint argc, gchar * argv[])
++{
++ GstElement *queue, *src, *pipeline;
++ GstBuffer *buffer;
++ gboolean done = FALSE;
++ GstPad *pad;
++
++ gst_init (&argc, &argv);
++
++ queue = gst_element_factory_make ("queue", "queue");
++ g_object_set (G_OBJECT (queue), "signal_marks", TRUE, NULL);
++
++ src = gst_element_factory_make ("filesrc", "src");
++ g_object_set (G_OBJECT (src), "location", "appreader.c", NULL);
++
++ pipeline = gst_pipeline_new ("pipeline");
++
++ gst_bin_add_many (GST_BIN (pipeline), src, queue, NULL);
++
++ gst_element_link_many (src, queue, NULL);
++
++ pad = gst_element_get_pad (queue, "src");
++ g_signal_connect (G_OBJECT (queue), "low_watermark", G_CALLBACK (fill_queue),
++ pipeline);
++
++ gst_element_set_state (pipeline, GST_STATE_PLAYING);
++
++ do {
++ /* get buffer into the app */
++ buffer = GST_RPAD_GETFUNC (pad) (pad);
++
++ /* just exit on any event */
++ if (GST_IS_EVENT (buffer)) {
++ done = TRUE;
++ } else {
++ gst_util_dump_mem (GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer));
++ }
++ gst_data_unref (GST_DATA (buffer));
++
++ } while (!done);
++
++ gst_element_set_state (pipeline, GST_STATE_NULL);
++ gst_object_unref (pipeline);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/appreader/Makefile.am gstreamer-0.10.23/tests/old/examples/appreader/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/examples/appreader/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/appreader/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,5 @@
++noinst_PROGRAMS = appreader
++
++appreader_LDADD = $(GST_OBJ_LIBS)
++appreader_CFLAGS = $(GST_OBJ_CFLAGS)
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/cutter/cutter.c gstreamer-0.10.23/tests/old/examples/cutter/cutter.c
+--- gstreamer-0.10.23.orig/tests/old/examples/cutter/cutter.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/cutter/cutter.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,203 @@
++/*
++ * cutter.c - cut audio into pieces based on silence - thomas@apestaart.org
++ *
++ * construct a simple pipeline osssrc ! cutter ! filesink
++ * pause when necessary, change output
++ *
++ * Latest change : 03/06/2001
++ *
++ * Version : 0.3
++ */
++
++#include <stdlib.h>
++#include <gst/gst.h>
++#include <unistd.h>
++#include <time.h>
++
++#define DEBUG
++
++gboolean playing = TRUE;
++gboolean cut_start_signalled = FALSE;
++gboolean cut_stop_signalled = FALSE;
++
++int id = 0; /* increment this for each new cut */
++GstElement *main_bin;
++GstElement *audiosrc;
++GstElement *queue;
++GstElement *thread;
++GstElement *cutter;
++GstElement *filesink;
++GstElement *encoder;
++char buffer[255];
++
++/* signal callbacks */
++
++void
++cut_start (GstElement * element)
++{
++ g_print ("\nDEBUG: main: cut start\n");
++ /* we should pause the pipeline, unlink cutter and filesink
++ * create a new filesink to a real file, relink, and set to play
++ */
++ g_print ("DEBUG: cut_start: main_bin pausing\n");
++ gst_element_set_state (main_bin, GST_STATE_PAUSED);
++ g_print ("DEBUG: cut_start: main_bin paused\n");
++
++ {
++ time_t seconds;
++ struct tm *ct;
++
++ time (&seconds);
++ ct = localtime (&seconds);
++/* sprintf (buffer, "/news/incoming/audio/cutter.%06d.wav", id); */
++ sprintf (buffer,
++ "/news/incoming/audio/cutter.%04d%02d%02d.%02d%02d%02d.wav",
++ ct->tm_year + 1900, ct->tm_mon, ct->tm_mday, ct->tm_hour, ct->tm_min,
++ ct->tm_sec);
++ }
++ g_print ("DEBUG: cut_start: setting new location to %s\n", buffer);
++ g_object_set (G_OBJECT (filesink), "location", buffer, NULL);
++ g_object_set (G_OBJECT (filesink), "type", 4, NULL);
++
++ gst_element_set_state (main_bin, GST_STATE_PLAYING);
++ ++id;
++ g_print ("start_cut_signal done\n");
++ return;
++}
++
++void
++cut_start_signal (GstElement * element)
++{
++ g_print ("\nDEBUG: main: cut start signal\n");
++ cut_start_signalled = TRUE;
++}
++
++void
++cut_stop (GstElement * element)
++{
++ g_print ("\nDEBUG: main: cut stop\n");
++ /* we should pause the pipeline, unlink filesink, create a fake filesink,
++ * link to pipeline, and set to play
++ */
++ g_print ("DEBUG: cut_stop: main_bin paused\n");
++ gst_element_set_state (main_bin, GST_STATE_PAUSED);
++
++ g_print ("DEBUG: cut_stop: setting new location\n");
++ g_object_set (G_OBJECT (filesink), "location", "/dev/null", NULL);
++
++ gst_element_set_state (main_bin, GST_STATE_PLAYING);
++ g_print ("stop_cut_signal done\n");
++ return;
++}
++
++void
++cut_stop_signal (GstElement * element)
++{
++ g_print ("\nDEBUG: main: cut stop signal\n");
++ cut_stop_signalled = TRUE;
++}
++
++int
++main (int argc, char *argv[])
++{
++ /*int i, j; */
++ /*gboolean done; */
++
++ /*char buffer[20]; */
++
++ /*output_channel_t *channel_out; */
++
++ GstElement *audiosrc;
++
++ gst_init (&argc, &argv);
++/*
++ if (argc == 1)
++ {
++ g_print("usage: %s <filename1> <filename2> <...>\n", argv[0]);
++ exit(-1);
++ }*/
++
++ /* set up input channel and main bin */
++
++ g_print ("creating main bin\n");
++ /* create cutter */
++ cutter = gst_element_factory_make ("cutter", "cutter");
++
++ g_object_set (G_OBJECT (cutter),
++ "threshold_dB", -40.0, "runlength", 0.5, "prelength", 1.0, NULL);
++
++ /* create an audio src */
++ if (!(audiosrc = gst_element_factory_make ("osssrc", "audio_src")))
++ g_error ("Could not create 'osssrc' element !\n");
++
++ /* set params */
++
++ g_object_set (G_OBJECT (audiosrc), "frequency", 44100,
++ "channels", 1, "format", 16, NULL);
++
++ if (!(encoder = gst_element_factory_make ("passthrough", "encoder")))
++ g_error ("Could not create 'passthrough' element !\n");
++
++ if (!(filesink = gst_element_factory_make ("afsink", "disk_sink")))
++ g_error ("Could not create 'afsink' element !\n");
++
++ g_object_set (G_OBJECT (filesink), "location", "/dev/null", NULL);
++
++ thread = gst_thread_new ("thread");
++ g_assert (thread != NULL);
++
++ /* create main bin */
++ main_bin = gst_pipeline_new ("bin");
++ g_assert (main_bin != NULL);
++
++ queue = gst_element_factory_make ("queue", "queue");
++ g_assert (queue);
++
++ /* add elements to bin */
++ gst_bin_add (GST_BIN (main_bin), audiosrc);
++ gst_bin_add (GST_BIN (thread), queue);
++
++ gst_bin_add_many (GST_BIN (thread), cutter, encoder, filesink, NULL);
++
++ gst_element_link_many (audiosrc, queue, cutter, encoder, filesink, NULL);
++ gst_bin_add (GST_BIN (main_bin), thread);
++
++ /* set signal handlers */
++ g_print ("setting signal handlers\n");
++ g_signal_connect (G_OBJECT (cutter), "cut_start",
++ (GCallback) cut_start_signal, NULL);
++ g_signal_connect (G_OBJECT (cutter), "cut_stop",
++ (GCallback) cut_stop_signal, NULL);
++
++ /* start playing */
++ g_print ("setting to play\n");
++ gst_element_set_state (main_bin, GST_STATE_PLAYING);
++/*
++ g_print ("setting thread to play\n");
++ gst_element_set_state (GST_ELEMENT (thread), GST_STATE_PLAYING);
++*/
++ while (playing) {
++/* g_print ("> "); */
++ gst_bin_iterate (GST_BIN (main_bin));
++/* g_print (" <"); */
++ if (cut_start_signalled) {
++ g_print ("\nDEBUG: main: cut_start_signalled true !\n");
++ cut_start (cutter);
++ cut_start_signalled = FALSE;
++ }
++ if (cut_stop_signalled) {
++ g_print ("\nDEBUG: main: cut_stop_signalled true !\n");
++ cut_stop (cutter);
++ cut_stop_signalled = FALSE;
++ }
++ }
++ g_print ("we're done iterating.\n");
++ /* stop the bin */
++
++ gst_element_set_state (main_bin, GST_STATE_NULL);
++
++ gst_object_unref (filesink);
++ gst_object_unref (main_bin);
++
++ exit (0);
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/cutter/cutter.h gstreamer-0.10.23/tests/old/examples/cutter/cutter.h
+--- gstreamer-0.10.23.orig/tests/old/examples/cutter/cutter.h 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/cutter/cutter.h 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,14 @@
++/*
++ * cutter.h header file
++ * thomas@apestaart.org
++ */
++
++typedef struct
++{
++ GstElement *pipe;
++ GstElement *filesink;
++ GstElement *audiosink;
++
++ char *location;
++ int channel_id;
++} output_channel_t;
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/cutter/Makefile.am gstreamer-0.10.23/tests/old/examples/cutter/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/examples/cutter/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/cutter/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,5 @@
++noinst_PROGRAMS = cutter
++noinst_HEADERS = cutter.h
++
++cutter_LDADD = $(GST_OBJ_LIBS)
++cutter_CFLAGS = $(GST_OBJ_CFLAGS)
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/events/Makefile.am gstreamer-0.10.23/tests/old/examples/events/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/examples/events/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/events/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,4 @@
++noinst_PROGRAMS = seek
++
++LDADD = $(GST_OBJ_LIBS)
++AM_CFLAGS = $(GST_OBJ_CFLAGS)
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/events/seek.c gstreamer-0.10.23/tests/old/examples/events/seek.c
+--- gstreamer-0.10.23.orig/tests/old/examples/events/seek.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/events/seek.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,68 @@
++#include <gst/gst.h>
++
++int
++main (int argc, char *argv[])
++{
++ GstBin *bin;
++ GstElement *src, *sink;
++ GstPad *srcpad, *sinkpad;
++
++/* _gst_plugin_spew = TRUE; */
++ gst_init (&argc, &argv);
++
++ bin = GST_BIN (gst_pipeline_new ("pipeline"));
++ g_return_val_if_fail (bin != NULL, -1);
++
++ g_print ("--- creating src and sink elements\n");
++ src = gst_element_factory_make ("fakesrc", "src");
++ g_return_val_if_fail (src != NULL, -1);
++ sink = gst_element_factory_make ("fakesink", "sink");
++ g_return_val_if_fail (sink != NULL, -1);
++
++ g_print ("--- about to add the elements to the bin\n");
++ gst_bin_add (bin, GST_ELEMENT (src));
++ gst_bin_add (bin, GST_ELEMENT (sink));
++
++ g_print ("--- getting pads\n");
++ srcpad = gst_element_get_pad (src, "src");
++ g_return_val_if_fail (srcpad != NULL, -1);
++ sinkpad = gst_element_get_pad (sink, "sink");
++ g_return_val_if_fail (srcpad != NULL, -1);
++
++ g_print ("--- linking\n");
++ gst_pad_link (srcpad, sinkpad);
++
++ g_print ("--- setting up\n");
++ gst_element_set_state (GST_ELEMENT (bin), GST_STATE_PLAYING);
++
++ g_print ("--- iterating\n");
++ gst_bin_iterate (bin);
++ gst_bin_iterate (bin);
++
++ g_print ("--- seek to 100\n");
++ gst_pad_send_event (srcpad, gst_event_new_seek (GST_SEEK_ANY, 100, FALSE));
++
++ g_print ("--- seek done, iterating\n");
++ gst_bin_iterate (bin);
++ gst_bin_iterate (bin);
++
++ g_print ("--- seek to 200 with flush\n");
++ gst_pad_send_event (srcpad, gst_event_new_seek (GST_SEEK_ANY, 200, TRUE));
++
++ g_print ("--- seek done, iterating\n");
++ gst_bin_iterate (bin);
++ gst_bin_iterate (bin);
++ gst_bin_iterate (bin);
++
++ g_print ("--- flush\n");
++ gst_pad_send_event (srcpad, gst_event_new_flush ());
++
++ g_print ("--- flush done, iterating\n");
++ gst_bin_iterate (bin);
++ gst_bin_iterate (bin);
++
++ g_print ("--- cleaning up\n");
++ gst_element_set_state (GST_ELEMENT (bin), GST_STATE_NULL);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/helloworld2/helloworld2.c gstreamer-0.10.23/tests/old/examples/helloworld2/helloworld2.c
+--- gstreamer-0.10.23.orig/tests/old/examples/helloworld2/helloworld2.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/helloworld2/helloworld2.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,133 @@
++#include <gst/gst.h>
++
++static void
++gst_play_have_type (GstElement * typefind, GstCaps * caps,
++ GstElement * pipeline)
++{
++ GstElement *osssink;
++ GstElement *new_element;
++ GstAutoplug *autoplug;
++ GstElement *autobin;
++ GstElement *filesrc;
++ GstElement *cache;
++
++ GST_DEBUG ("GstPipeline: play have type");
++
++ gst_element_set_state (pipeline, GST_STATE_PAUSED);
++
++ filesrc = gst_bin_get_by_name (GST_BIN (pipeline), "disk_source");
++ autobin = gst_bin_get_by_name (GST_BIN (pipeline), "autobin");
++ cache = gst_bin_get_by_name (GST_BIN (autobin), "cache");
++
++ /* unlink_pads the typefind from the pipeline and remove it */
++ gst_element_unlink_pads (cache, "src", typefind, "sink");
++ gst_bin_remove (GST_BIN (autobin), typefind);
++
++ /* and an audio sink */
++ osssink = gst_element_factory_make ("osssink", "play_audio");
++ g_assert (osssink != NULL);
++
++ autoplug = gst_autoplug_factory_make ("staticrender");
++ g_assert (autoplug != NULL);
++
++ new_element = gst_autoplug_to_renderers (autoplug, caps, osssink, NULL);
++
++ if (!new_element) {
++ g_print ("could not autoplug, no suitable codecs found...\n");
++ exit (-1);
++ }
++
++ gst_element_set_name (new_element, "new_element");
++
++ gst_bin_add (GST_BIN (autobin), new_element);
++
++ g_object_set (G_OBJECT (cache), "reset", TRUE, NULL);
++
++ gst_element_link_pads (cache, "src", new_element, "sink");
++
++ gst_element_set_state (pipeline, GST_STATE_PLAYING);
++}
++
++static void
++gst_play_cache_empty (GstElement * element, GstElement * pipeline)
++{
++ GstElement *autobin;
++ GstElement *filesrc;
++ GstElement *cache;
++ GstElement *new_element;
++
++ fprintf (stderr, "have cache empty\n");
++
++ gst_element_set_state (pipeline, GST_STATE_PAUSED);
++
++ filesrc = gst_bin_get_by_name (GST_BIN (pipeline), "disk_source");
++ autobin = gst_bin_get_by_name (GST_BIN (pipeline), "autobin");
++ cache = gst_bin_get_by_name (GST_BIN (autobin), "cache");
++ new_element = gst_bin_get_by_name (GST_BIN (autobin), "new_element");
++
++ gst_element_unlink_pads (filesrc, "src", cache, "sink");
++ gst_element_unlink_pads (cache, "src", new_element, "sink");
++ gst_bin_remove (GST_BIN (autobin), cache);
++ gst_element_link_pads (filesrc, "src", new_element, "sink");
++
++ gst_element_set_state (pipeline, GST_STATE_PLAYING);
++
++ fprintf (stderr, "done with cache_empty\n");
++}
++
++int
++main (int argc, char *argv[])
++{
++ GstElement *filesrc;
++ GstElement *pipeline;
++ GstElement *autobin;
++ GstElement *typefind;
++ GstElement *cache;
++
++ gst_init (&argc, &argv);
++
++ if (argc != 2) {
++ g_print ("usage: %s <filename>\n", argv[0]);
++ exit (-1);
++ }
++
++ /* create a new pipeline to hold the elements */
++ pipeline = gst_pipeline_new ("pipeline");
++ g_assert (pipeline != NULL);
++
++ /* create a disk reader */
++ filesrc = gst_element_factory_make ("filesrc", "disk_source");
++ g_assert (filesrc != NULL);
++ g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
++ gst_bin_add (GST_BIN (pipeline), filesrc);
++
++ autobin = gst_bin_new ("autobin");
++ cache = gst_element_factory_make ("autoplugcache", "cache");
++ g_signal_connect (G_OBJECT (cache), "cache_empty",
++ G_CALLBACK (gst_play_cache_empty), pipeline);
++
++ typefind = gst_element_factory_make ("typefind", "typefind");
++ g_signal_connect (G_OBJECT (typefind), "have_type",
++ G_CALLBACK (gst_play_have_type), pipeline);
++ gst_bin_add (GST_BIN (autobin), cache);
++ gst_bin_add (GST_BIN (autobin), typefind);
++
++ gst_element_link_pads (cache, "src", typefind, "sink");
++ gst_element_add_ghost_pad (autobin, gst_element_get_pad (cache, "sink"),
++ "sink");
++
++ gst_bin_add (GST_BIN (pipeline), autobin);
++ gst_element_link_pads (filesrc, "src", autobin, "sink");
++
++ /* start playing */
++ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
++
++ while (gst_bin_iterate (GST_BIN (pipeline)));
++
++ /* stop the pipeline */
++ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
++
++ gst_object_unref (pipeline);
++
++ exit (0);
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/helloworld2/Makefile.am gstreamer-0.10.23/tests/old/examples/helloworld2/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/examples/helloworld2/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/helloworld2/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,5 @@
++noinst_PROGRAMS = helloworld2
++
++helloworld2_LDADD = $(GST_OBJ_LIBS)
++helloworld2_CFLAGS = $(GST_OBJ_CFLAGS)
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/Makefile.am gstreamer-0.10.23/tests/old/examples/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/examples/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,24 @@
++# these example currently don't build (see TODO)
++
++dirs =
++
++#appreader
++#cutter
++#events
++#helloworld2
++#launch
++#manual
++#mixer
++#pingpong
++#plugins
++#pwg
++#queue2
++#queue3
++#queue4
++#retag
++#thread
++
++SUBDIRS = $(dirs)
++
++DIST_SUBDIRS = $(dirs)
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/manual/extract.pl gstreamer-0.10.23/tests/old/examples/manual/extract.pl
+--- gstreamer-0.10.23.orig/tests/old/examples/manual/extract.pl 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/manual/extract.pl 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,78 @@
++#!/usr/bin/perl
++
++# extract code fragments from xml program listings
++# first argument: source code file to find
++# second argument: xml files to extract code from
++
++# main
++
++# decodes xml by translating & < > back to what they should be
++# and also ignore
++# <![CDATA[ and ]]> and <!-- and -->
++sub
++xml_decode ($)
++{
++ my $input = shift;
++
++ $input =~ s/\&/&/g;
++ $input =~ s/</</g;
++ $input =~ s/>/>/g;
++
++ if ($input =~ /<!\[CDATA\[/) { $input = ""; }
++ if ($input =~ /]]>/) { $input = ""; }
++ if ($input =~ /<!--/) { $input = ""; }
++ if ($input =~ /-->/) { $input = ""; }
++
++ #print "Returning line $input";
++ return $input;
++}
++
++# main
++my $output = shift @ARGV;
++
++$found = 0;
++%blocks = ();
++
++foreach $file (@ARGV)
++{
++ open FILE, $file or die "Cannot open file $file";
++
++ while ($line = <FILE>)
++ {
++ if ($line =~ /<!-- example-begin $output (.*?)-->/)
++ {
++ $found = 1;
++ $block_id = $1;
++ $block = "\n/*** block $block_id from $file ***/\n";
++
++ print "Extracting $output block $block_id from $file\n";
++
++ while ($line = <FILE>)
++ {
++ if ($line =~ /<!-- example-end $output (.*?)-->/)
++ {
++ last;
++ }
++ $block .= xml_decode ($line);
++ }
++ $blocks{$block_id} = $block;
++ }
++ }
++}
++
++
++if (!$found)
++{
++ print "Could not find $output example !\n";
++ exit(1);
++}
++
++# now output all the blocks in the right order
++open OUTPUT, ">$output";
++@block_ids = keys %blocks;
++foreach $block_id (sort @block_ids)
++{
++ print "Writing $output block $block_id\n";
++ print OUTPUT $blocks{$block_id};
++}
++close OUTPUT;
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/manual/Makefile.am gstreamer-0.10.23/tests/old/examples/manual/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/examples/manual/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/manual/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,104 @@
++if HAVE_LIBGNOMEUI
++GNOME=gnome
++else
++GNOME=
++endif
++
++if GST_DISABLE_LOADSAVE
++GST_LOADSAVE_SRC =
++else
++GST_LOADSAVE_SRC = xml-mp3
++endif
++
++INCLUDES = $(GST_OBJ_CFLAGS)
++
++goption_CFLAGS = -DGETTEXT_PACKAGE="\"gstreamer-0.9\""
++
++#dynamic_LDADD = $(GST_OBJ_LIBS) $(LIBGNOMEUI_LIBS)
++#dynamic_CFLAGS = $(GST_OBJ_CFLAGS) $(LIBGNOMEUI_CFLAGS)
++gnome_LDADD = $(GST_OBJ_LIBS) $(LIBGNOMEUI_LIBS)
++gnome_CFLAGS = $(GST_OBJ_CFLAGS) $(LIBGNOMEUI_CFLAGS)
++
++EXTRA_DIST = extract.pl
++
++EXAMPLES = \
++ bus \
++ dynamic \
++ $(GNOME) \
++ elementcreate \
++ elementmake \
++ elementfactory \
++ elementget \
++ elementlink \
++ bin \
++ pad \
++ ghostpad \
++ helloworld \
++ init \
++ goption \
++ query \
++ typefind \
++ probe \
++ fakesrc \
++ playbin \
++ decodebin \
++ $(GST_LOADSAVE_SRC)
++
++elementmake.c elementcreate.c elementget.c elementlink.c elementfactory.c: $(top_srcdir)/docs/manual/basics-elements.xml
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/manual/basics-elements.xml
++
++bin.c : $(top_srcdir)/docs/manual/basics-bins.xml
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/manual/basics-bins.xml
++
++bus.c: $(top_srcdir)/docs/manual/basics-bus.xml
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/manual/basics-bus.xml
++
++pad.c ghostpad.c: $(top_srcdir)/docs/manual/basics-pads.xml
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/manual/basics-pads.xml
++
++gnome.c: $(top_srcdir)/docs/manual/appendix-integration.xml
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/manual/appendix-integration.xml
++
++helloworld.c: $(top_srcdir)/docs/manual/basics-helloworld.xml
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/manual/basics-helloworld.xml
++
++init.c goption.c: $(top_srcdir)/docs/manual/basics-init.xml
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/manual/basics-init.xml
++
++query.c: $(top_srcdir)/docs/manual/advanced-position.xml
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/manual/advanced-position.xml
++
++typefind.c dynamic.c: $(top_srcdir)/docs/manual/advanced-autoplugging.xml
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/manual/advanced-autoplugging.xml
++
++probe.c fakesrc.c: $(top_srcdir)/docs/manual/advanced-dataaccess.xml
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/manual/advanced-dataaccess.xml
++
++playbin.c decodebin.c: $(top_srcdir)/docs/manual/highlevel-components.xml
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/manual/highlevel-components.xml
++
++xml-mp3.c: $(top_srcdir)/docs/manual/highlevel-xml.xml
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/manual/highlevel-xml.xml
++
++# we use some of the examples as testsuite apps, to verify that
++# they actually run
++include $(top_srcdir)/tests/old/testsuite/Rules
++
++tests_pass = elementmake elementget init goption
++tests_fail =
++tests_ignore =
++
++noinst_PROGRAMS = $(EXAMPLES)
++LDADD = $(GST_OBJ_LIBS)
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/mixer/Makefile.am gstreamer-0.10.23/tests/old/examples/mixer/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/examples/mixer/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/mixer/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,5 @@
++noinst_PROGRAMS = mixer
++noinst_HEADERS = mixer.h
++
++mixer_LDADD = $(GST_OBJ_LIBS)
++mixer_CFLAGS = $(GST_OBJ_CFLAGS)
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/mixer/mixer.c gstreamer-0.10.23/tests/old/examples/mixer/mixer.c
+--- gstreamer-0.10.23.orig/tests/old/examples/mixer/mixer.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/mixer/mixer.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,398 @@
++/*
++ * mixer.c - stereo audio mixer - thomas@apestaart.org
++ * example based on helloworld
++ * demonstrates the adder plugin and the volume envelope plugin
++ * work in progress but do try it out
++ *
++ * Latest change : 28/08/2001
++ * trying to adapt to incsched
++ * delayed start for channels > 1
++ * now works by quickhacking the
++ * adder plugin to set
++ * GST_ELEMENT_COTHREAD_STOPPING
++ * Version : 0.5.1
++ */
++
++#include <stdlib.h>
++#include <gst/gst.h>
++#include "mixer.h"
++#include <unistd.h>
++
++/*#define WITH_BUG */
++/*#define WITH_BUG2 */
++/*#define DEBUG */
++/*#define AUTOPLUG * define if you want autoplugging of input channels * */
++/* function prototypes */
++
++input_channel_t *create_input_channel (int id, char *location);
++void destroy_input_channel (input_channel_t * pipe);
++void env_register_cp (GstElement * volenv, double cp_time, double cp_level);
++
++
++gboolean playing;
++
++
++/* eos will be called when the src element has an end of stream */
++void
++eos (GstElement * element)
++{
++ g_print ("have eos, quitting ?\n");
++
++/* playing = FALSE; */
++}
++
++G_GNUC_UNUSED static GstCaps *
++gst_play_type_find (GstBin * bin, GstElement * element)
++{
++ GstElement *typefind;
++ GstElement *pipeline;
++ GstCaps *caps = NULL;
++
++ GST_DEBUG ("GstPipeline: typefind for element \"%s\"",
++ GST_ELEMENT_NAME (element));
++
++ pipeline = gst_pipeline_new ("autoplug_pipeline");
++
++ typefind = gst_element_factory_make ("typefind", "typefind");
++ g_return_val_if_fail (typefind != NULL, FALSE);
++
++ gst_pad_link (gst_element_get_pad (element, "src"),
++ gst_element_get_pad (typefind, "sink"));
++ gst_bin_add (bin, typefind);
++ gst_bin_add (GST_BIN (pipeline), GST_ELEMENT (bin));
++
++ gst_element_set_state (pipeline, GST_STATE_PLAYING);
++
++ /* push a buffer... the have_type signal handler will set the found flag */
++ gst_bin_iterate (GST_BIN (pipeline));
++
++ gst_element_set_state (pipeline, GST_STATE_NULL);
++
++ caps = gst_pad_get_caps (gst_element_get_pad (element, "src"));
++
++ gst_pad_unlink (gst_element_get_pad (element, "src"),
++ gst_element_get_pad (typefind, "sink"));
++ gst_bin_remove (bin, typefind);
++ gst_bin_remove (GST_BIN (pipeline), GST_ELEMENT (bin));
++ gst_object_unref (typefind);
++ gst_object_unref (pipeline);
++
++ return caps;
++}
++
++int
++main (int argc, char *argv[])
++{
++ int i, j;
++ int num_channels;
++
++ char buffer[20];
++
++ GList *input_channels; /* structure holding all the input channels */
++
++ input_channel_t *channel_in;
++
++ GstElement *main_bin;
++ GstElement *adder;
++ GstElement *audiosink;
++
++ GstPad *pad; /* to request pads for the adder */
++
++ gst_init (&argc, &argv);
++
++ if (argc == 1) {
++ g_print ("usage: %s <filename1> <filename2> <...>\n", argv[0]);
++ exit (-1);
++ }
++ num_channels = argc - 1;
++
++ /* set up output channel and main bin */
++
++ /* create adder */
++ adder = gst_element_factory_make ("adder", "adderel");
++
++ /* create an audio sink */
++ audiosink = gst_element_factory_make ("esdsink", "play_audio");
++
++ /* create main bin */
++ main_bin = gst_pipeline_new ("bin");
++
++ /* link adder and output to bin */
++ GST_INFO ("main: adding adder to bin");
++ gst_bin_add (GST_BIN (main_bin), adder);
++ GST_INFO ("main: adding audiosink to bin");
++ gst_bin_add (GST_BIN (main_bin), audiosink);
++
++ /* link adder and audiosink */
++
++ gst_pad_link (gst_element_get_pad (adder, "src"),
++ gst_element_get_pad (audiosink, "sink"));
++
++ /* start looping */
++ input_channels = NULL;
++
++ for (i = 1; i < argc; ++i) {
++ printf ("Opening channel %d from file %s...\n", i, argv[i]);
++ channel_in = create_input_channel (i, argv[i]);
++ input_channels = g_list_append (input_channels, channel_in);
++
++ if (i > 1)
++ gst_element_set_state (main_bin, GST_STATE_PAUSED);
++ gst_bin_add (GST_BIN (main_bin), channel_in->pipe);
++
++ /* request pads and link to adder */
++ GST_INFO ("requesting pad\n");
++ pad = gst_element_get_request_pad (adder, "sink%d");
++ printf ("\tGot new adder sink pad %s\n", gst_pad_get_name (pad));
++ sprintf (buffer, "channel%d", i);
++ gst_pad_link (gst_element_get_pad (channel_in->pipe, buffer), pad);
++
++ /* register a volume envelope */
++ printf ("\tregistering volume envelope...\n");
++
++ /*
++ * this is the volenv :
++ * each song gets a slot of 5 seconds, with a 5 second fadeout
++ * at the end of that, all audio streams play simultaneously
++ * at a level ensuring no distortion
++ * example for three songs :
++ * song1 : starts at full level, plays 5 seconds, faded out at 10 seconds,
++ * sleep until 25, fade to end level at 30
++ * song2 : starts silent, fades in at 5 seconds, full blast at 10 seconds,
++ * full level until 15, faded out at 20, sleep until 25, fade to end at 30
++ * song3 : starts muted, fades in from 15, full at 20, until 25, fade to end level
++ */
++
++ if (i == 1) {
++ /* first song gets special treatment for end style */
++ env_register_cp (channel_in->volenv, 0.0, 1.0);
++ } else {
++ env_register_cp (channel_in->volenv, 0.0, 0.0000001); /* start muted */
++ env_register_cp (channel_in->volenv, i * 10.0 - 15.0, 0.0000001); /* start fade in */
++ env_register_cp (channel_in->volenv, i * 10.0 - 10.0, 1.0);
++ }
++ env_register_cp (channel_in->volenv, i * 10.0 - 5.0, 1.0); /* end of full level */
++
++ if (i != num_channels) {
++ env_register_cp (channel_in->volenv, i * 10.0, 0.0000001); /* fade to black */
++ env_register_cp (channel_in->volenv, num_channels * 10.0 - 5.0, 0.0000001); /* start fade in */
++ }
++ env_register_cp (channel_in->volenv, num_channels * 10.0, 1.0 / num_channels); /* to end level */
++
++#ifndef GST_DISABLE_LOADSAVE
++ gst_xml_write_file (GST_ELEMENT (main_bin), fopen ("mixer.xml", "w"));
++#endif
++
++ /* start playing */
++ gst_element_set_state (main_bin, GST_STATE_PLAYING);
++
++ /* write out the schedule */
++ gst_scheduler_show (GST_ELEMENT_SCHEDULER (main_bin));
++ playing = TRUE;
++
++ j = 0;
++ /*printf ("main: start iterating from 0"); */
++ while (playing && j < 100) {
++/* printf ("main: iterating %d\n", j); */
++ gst_bin_iterate (GST_BIN (main_bin));
++ /*fprintf(stderr,"after iterate()\n"); */
++ ++j;
++ }
++ }
++ printf ("main: all the channels are open\n");
++ while (playing) {
++ gst_bin_iterate (GST_BIN (main_bin));
++ /*fprintf(stderr,"after iterate()\n"); */
++ }
++ /* stop the bin */
++ gst_element_set_state (main_bin, GST_STATE_NULL);
++
++ while (input_channels) {
++ destroy_input_channel (input_channels->data);
++ input_channels = g_list_next (input_channels);
++ }
++ g_list_free (input_channels);
++
++ gst_object_unref (audiosink);
++
++ gst_object_unref (main_bin);
++
++ exit (0);
++}
++
++input_channel_t *
++create_input_channel (int id, char *location)
++{
++ /* create an input channel, reading from location
++ * return a pointer to the channel
++ * return NULL if failed
++ */
++
++ input_channel_t *channel;
++
++ char buffer[20]; /* hold the names */
++
++/* GstAutoplug *autoplug;
++ GstCaps *srccaps; */
++ GstElement *new_element;
++ GstElement *decoder;
++
++ GST_DEBUG ("c_i_p : creating channel with id %d for file %s", id, location);
++
++ /* allocate channel */
++
++ channel = (input_channel_t *) malloc (sizeof (input_channel_t));
++ if (channel == NULL) {
++ printf ("create_input_channel : could not allocate memory for channel !\n");
++ return NULL;
++ }
++
++ /* create channel */
++
++ GST_DEBUG ("c_i_p : creating pipeline");
++
++ sprintf (buffer, "pipeline%d", id);
++ channel->pipe = gst_bin_new (buffer);
++ g_assert (channel->pipe != NULL);
++
++ /* create elements */
++
++ GST_DEBUG ("c_i_p : creating filesrc");
++
++ sprintf (buffer, "filesrc%d", id);
++ channel->filesrc = gst_element_factory_make ("filesrc", buffer);
++ g_assert (channel->filesrc != NULL);
++
++ GST_DEBUG ("c_i_p : setting location");
++ g_object_set (G_OBJECT (channel->filesrc), "location", location, NULL);
++
++ /* add filesrc to the bin before autoplug */
++ gst_bin_add (GST_BIN (channel->pipe), channel->filesrc);
++
++ /* link signal to eos of filesrc */
++ g_signal_connect (G_OBJECT (channel->filesrc), "eos", G_CALLBACK (eos), NULL);
++
++
++#ifdef DEBUG
++ printf ("DEBUG : c_i_p : creating volume envelope\n");
++#endif
++
++ sprintf (buffer, "volenv%d", id);
++ channel->volenv = gst_element_factory_make ("volenv", buffer);
++ g_assert (channel->volenv != NULL);
++
++ /* autoplug the pipe */
++
++#ifdef DEBUG
++ printf ("DEBUG : c_i_p : getting srccaps\n");
++#endif
++
++#ifdef WITH_BUG
++ srccaps = gst_play_type_find (GST_BIN (channel->pipe), channel->filesrc);
++#endif
++#ifdef WITH_BUG2
++ {
++ GstElement *pipeline;
++
++ pipeline = gst_pipeline_new ("autoplug_pipeline");
++
++ gst_bin_add (GST_BIN (pipeline), channel->pipe);
++ gst_element_set_state (pipeline, GST_STATE_PLAYING);
++ gst_element_set_state (pipeline, GST_STATE_NULL);
++ gst_bin_remove (GST_BIN (pipeline), channel->pipe);
++
++ }
++#endif
++
++#ifdef AUTOPLUG
++ if (!srccaps) {
++ g_print ("could not autoplug, unknown media type...\n");
++ exit (-1);
++ }
++#ifdef DEBUG
++ printf ("DEBUG : c_i_p : creating autoplug\n");
++#endif
++
++ autoplug = gst_autoplug_factory_make ("static");
++ g_assert (autoplug != NULL);
++
++#ifdef DEBUG
++ printf ("DEBUG : c_i_p : autoplugging\n");
++#endif
++
++ new_element = gst_autoplug_to_caps (autoplug, srccaps,
++ gst_caps_new ("audio/raw", NULL), NULL);
++
++ if (!new_element) {
++ g_print ("could not autoplug, no suitable codecs found...\n");
++ exit (-1);
++ }
++#else
++
++ new_element = gst_bin_new ("autoplug_bin");
++
++ /* static plug, use mad plugin and assume mp3 input */
++ printf ("using static plugging for input channel\n");
++ decoder = gst_element_factory_make ("mad", "mpg123");
++ if (!decoder) {
++ fprintf (stderr, "Could not get a decoder element !\n");
++ exit (1);
++ }
++ gst_bin_add (GST_BIN (new_element), decoder);
++
++ gst_element_add_ghost_pad (new_element,
++ gst_element_get_pad (decoder, "sink"), "sink");
++ gst_element_add_ghost_pad (new_element,
++ gst_element_get_pad (decoder, "src"), "src_00");
++
++#endif
++#ifndef GST_DISABLE_LOADSAVE
++ gst_xml_write_file (GST_ELEMENT (new_element), fopen ("mixer.gst", "w"));
++#endif
++
++ gst_bin_add (GST_BIN (channel->pipe), channel->volenv);
++ gst_bin_add (GST_BIN (channel->pipe), new_element);
++
++ gst_element_link_pads (channel->filesrc, "src", new_element, "sink");
++ gst_element_link_pads (new_element, "src_00", channel->volenv, "sink");
++
++ /* add a ghost pad */
++ sprintf (buffer, "channel%d", id);
++ gst_element_add_ghost_pad (channel->pipe,
++ gst_element_get_pad (channel->volenv, "src"), buffer);
++
++
++#ifdef DEBUG
++ printf ("DEBUG : c_i_p : end function\n");
++#endif
++
++ return channel;
++}
++
++void
++destroy_input_channel (input_channel_t * channel)
++{
++ /*
++ * destroy an input channel
++ */
++
++#ifdef DEBUG
++ printf ("DEBUG : d_i_p : start\n");
++#endif
++
++ /* destroy elements */
++
++ gst_object_unref (channel->pipe);
++
++ free (channel);
++}
++
++void
++env_register_cp (GstElement * volenv, double cp_time, double cp_level)
++{
++ char buffer[30];
++
++ sprintf (buffer, "%f:%f", cp_time, cp_level);
++ g_object_set (G_OBJECT (volenv), "controlpoint", buffer, NULL);
++
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/mixer/mixer.h gstreamer-0.10.23/tests/old/examples/mixer/mixer.h
+--- gstreamer-0.10.23.orig/tests/old/examples/mixer/mixer.h 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/mixer/mixer.h 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,12 @@
++/*
++ * mixer.h header file
++ * thomas@apestaart.org
++ */
++
++typedef struct
++{
++ GstElement *pipe, *filesrc, *volenv;
++
++ char *location;
++ int channel_id;
++} input_channel_t;
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/pingpong/Makefile.am gstreamer-0.10.23/tests/old/examples/pingpong/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/examples/pingpong/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/pingpong/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,5 @@
++noinst_PROGRAMS = pingpong
++
++pingpong_LDADD = $(GST_OBJ_LIBS)
++pingpong_CFLAGS = $(GST_OBJ_CFLAGS)
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/pingpong/pingpong.c gstreamer-0.10.23/tests/old/examples/pingpong/pingpong.c
+--- gstreamer-0.10.23.orig/tests/old/examples/pingpong/pingpong.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/pingpong/pingpong.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,99 @@
++/* GStreamer
++ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#include <gst/gst.h>
++
++static GstElement *
++make_bin (gint count)
++{
++ GstElement *bin;
++ GstElement *src;
++ char *name;
++
++ name = g_strdup_printf ("bin%d", count);
++ bin = gst_bin_new (name);
++ g_free (name);
++
++ name = g_strdup_printf ("fakesrc%d", count);
++ src = gst_element_factory_make ("fakesrc", name);
++ g_free (name);
++
++ gst_bin_add (GST_BIN (bin), src);
++
++ gst_element_add_ghost_pad (bin, gst_element_get_pad (src, "src"), "src");
++
++ return bin;
++}
++
++gint
++main (gint argc, gchar * argv[])
++{
++ GstElement *pipeline;
++ GstElement *aggregator, *sink;
++ GstElement *bin1, *bin2;
++ GstPad *pad1, *pad2;
++ gint i;
++
++ gst_init (&argc, &argv);
++
++ pipeline = gst_pipeline_new ("main");
++ g_signal_connect (pipeline, "deep_notify",
++ G_CALLBACK (gst_element_default_deep_notify), NULL);
++
++ aggregator = gst_element_factory_make ("aggregator", "mixer");
++ sink = gst_element_factory_make ("fakesink", "sink");
++
++ gst_bin_add (GST_BIN (pipeline), aggregator);
++ gst_bin_add (GST_BIN (pipeline), sink);
++
++ gst_element_link_pads (aggregator, "src", sink, "sink");
++
++ bin1 = make_bin (1);
++ pad1 = gst_element_get_request_pad (aggregator, "sink%d");
++ gst_pad_link (gst_element_get_pad (bin1, "src"), pad1);
++ gst_bin_add (GST_BIN (pipeline), bin1);
++
++ bin2 = make_bin (2);
++ pad2 = gst_element_get_request_pad (aggregator, "sink%d");
++ gst_pad_link (gst_element_get_pad (bin2, "src"), pad2);
++ gst_bin_add (GST_BIN (pipeline), bin2);
++
++ gst_element_set_state (pipeline, GST_STATE_PLAYING);
++ i = 2;
++ while (i--)
++ gst_bin_iterate (GST_BIN (pipeline));
++
++ g_print ("pause bin1\n");
++ gst_element_set_state (bin1, GST_STATE_PAUSED);
++
++ i = 4;
++ while (i--)
++ gst_bin_iterate (GST_BIN (pipeline));
++
++ g_print ("playing bin1\n");
++ gst_element_set_state (bin1, GST_STATE_PLAYING);
++
++ i = 4;
++ while (i--)
++ gst_bin_iterate (GST_BIN (pipeline));
++
++ gst_element_set_state (pipeline, GST_STATE_NULL);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/plugins/example.c gstreamer-0.10.23/tests/old/examples/plugins/example.c
+--- gstreamer-0.10.23.orig/tests/old/examples/plugins/example.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/plugins/example.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,426 @@
++/* GStreamer
++ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++/* First, include the header file for the plugin, to bring in the
++ * object definition and other useful things.
++ */
++#include <string.h>
++#include "example.h"
++
++/* The ElementDetails structure gives a human-readable description of the
++ * plugin, as well as author and version data. Use the GST_ELEMENT_DETAILS
++ * macro when defining it.
++ */
++static GstElementDetails example_details =
++GST_ELEMENT_DETAILS ("An example plugin",
++ "Example/FirstExample",
++ "Shows the basic structure of a plugin",
++ "your name <your.name@your.isp>");
++
++/* These are the signals that this element can fire. They are zero-
++ * based because the numbers themselves are private to the object.
++ * LAST_SIGNAL is used for initialization of the signal array.
++ */
++enum
++{
++ ASDF,
++ /* FILL ME */
++ LAST_SIGNAL
++};
++
++/* Arguments are identified the same way, but cannot be zero, so you
++ * must leave the ARG_0 entry in as a placeholder.
++ */
++enum
++{
++ ARG_0,
++ ARG_ACTIVE
++ /* FILL ME */
++};
++
++/* The PadFactory structures describe what pads the element has or
++ * can have. They can be quite complex, but for this example plugin
++ * they are rather simple.
++ */
++GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", /* The name of the pad */
++ GST_PAD_SINK, /* Direction of the pad */
++ GST_PAD_ALWAYS, /* The pad exists for every instance */
++ GST_STATIC_CAPS ("unknown/unknown, " /* The MIME media type */
++ "foo:int=1, " /* an integer property */
++ "bar:boolean=true, " /* a boolean property */
++ "baz:int={ 1, 3 }" /* a list of values */
++ )
++ );
++
++/* This factory is much simpler, and defines the source pad. */
++GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
++ GST_PAD_SRC,
++ GST_PAD_ALWAYS,
++ GST_STATIC_CAPS ("unknown/unknown")
++ );
++
++
++/* A number of function prototypes are given so we can refer to them later. */
++static void gst_example_class_init (GstExampleClass * klass);
++static void gst_example_init (GstExample * example);
++
++static void gst_example_chain (GstPad * pad, GstData * _data);
++
++static void gst_example_set_property (GObject * object, guint prop_id,
++ const GValue * value, GParamSpec * pspec);
++static void gst_example_get_property (GObject * object, guint prop_id,
++ GValue * value, GParamSpec * pspec);
++static GstStateChangeReturn gst_example_change_state (GstElement * element,
++ GstStateChange transition);
++
++/* The parent class pointer needs to be kept around for some object
++ * operations.
++ */
++static GstElementClass *parent_class = NULL;
++
++/* This array holds the ids of the signals registered for this object.
++ * The array indexes are based on the enum up above.
++ */
++static guint gst_example_signals[LAST_SIGNAL] = { 0 };
++
++/* This function is used to register and subsequently return the type
++ * identifier for this object class. On first invocation, it will
++ * register the type, providing the name of the class, struct sizes,
++ * and pointers to the various functions that define the class.
++ */
++GType
++gst_example_get_type (void)
++{
++ static GType example_type = 0;
++
++ if (!example_type) {
++ static const GTypeInfo example_info = {
++ sizeof (GstExampleClass),
++ NULL,
++ NULL,
++ (GClassInitFunc) gst_example_class_init,
++ NULL,
++ NULL,
++ sizeof (GstExample),
++ 0,
++ (GInstanceInitFunc) gst_example_init,
++ };
++ example_type =
++ g_type_register_static (GST_TYPE_ELEMENT, "GstExample", &example_info,
++ 0);
++ }
++ return example_type;
++}
++
++/* In order to create an instance of an object, the class must be
++ * initialized by this function. GObject will take care of running
++ * it, based on the pointer to the function provided above.
++ */
++static void
++gst_example_class_init (GstExampleClass * klass)
++{
++ /* Class pointers are needed to supply pointers to the private
++ * implementations of parent class methods.
++ */
++ GObjectClass *gobject_class;
++ GstElementClass *gstelement_class;
++
++ /* Since the example class contains the parent classes, you can simply
++ * cast the pointer to get access to the parent classes.
++ */
++ gobject_class = G_OBJECT_CLASS (klass);
++ gstelement_class = GST_ELEMENT_CLASS (klass);
++
++ /* The parent class is needed for class method overrides. */
++ parent_class = g_type_class_peek_parent (klass);
++
++ /* Here we add an argument to the object. This argument is an integer,
++ * and can be both read and written.
++ */
++ g_object_class_install_property (gobject_class, ARG_ACTIVE, g_param_spec_int ("active", "active", "active", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE)); /* CHECKME */
++
++ /* Here we add a signal to the object. This is a very useless signal
++ * called asdf. The signal will also pass a pointer to the listeners
++ * which happens to be the example element itself */
++ gst_example_signals[ASDF] =
++ g_signal_new ("asdf", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
++ G_STRUCT_OFFSET (GstExampleClass, asdf), NULL, NULL,
++ g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, GST_TYPE_EXAMPLE);
++
++
++ /* The last thing is to provide the functions that implement get and set
++ * of arguments.
++ */
++ gobject_class->set_property = gst_example_set_property;
++ gobject_class->get_property = gst_example_get_property;
++
++ /* we also override the default state change handler with our own
++ * implementation */
++ gstelement_class->change_state = gst_example_change_state;
++ /* We can now provide the details for this element, that we defined earlier. */
++ gst_element_class_set_details (gstelement_class, &example_details);
++ /* The pad templates can be easily generated from the factories above,
++ * and then added to the list of padtemplates for the class.
++ */
++ gst_element_class_add_pad_template (gstelement_class,
++ gst_static_pad_template_get (&sink_template));
++ gst_element_class_add_pad_template (gstelement_class,
++ gst_static_pad_template_get (&src_template));
++}
++
++/* This function is responsible for initializing a specific instance of
++ * the plugin.
++ */
++static void
++gst_example_init (GstExample * example)
++{
++ /* First we create the sink pad, which is the input to the element.
++ * We will use the template constructed by the factory.
++ */
++ example->sinkpad =
++ gst_pad_new_from_template (gst_static_pad_template_get (&sink_template),
++ "sink");
++ /* Setting the chain function allows us to supply the function that will
++ * actually be performing the work. Without this, the element would do
++ * nothing, with undefined results (assertion failures and such).
++ */
++ gst_pad_set_chain_function (example->sinkpad, gst_example_chain);
++ /* We then must add this pad to the element's list of pads. The base
++ * element class manages the list of pads, and provides accessors to it.
++ */
++ gst_element_add_pad (GST_ELEMENT (example), example->sinkpad);
++
++ /* The src pad, the output of the element, is created and registered
++ * in the same way, with the exception of the chain function. Source
++ * pads don't have chain functions, because they can't accept buffers,
++ * they only produce them.
++ */
++ example->srcpad =
++ gst_pad_new_from_template (gst_static_pad_template_get (&src_template),
++ "src");
++ gst_element_add_pad (GST_ELEMENT (example), example->srcpad);
++
++ /* Initialization of element's private variables. */
++ example->active = FALSE;
++}
++
++/* The chain function is the heart of the element. It's where all the
++ * work is done. It is passed a pointer to the pad in question, as well
++ * as the buffer provided by the peer element.
++ */
++static void
++gst_example_chain (GstPad * pad, GstData * _data)
++{
++ GstBuffer *buf = GST_BUFFER (_data);
++ GstExample *example;
++ GstBuffer *outbuf;
++
++ /* Some of these checks are of dubious value, since if there were not
++ * already true, the chain function would never be called.
++ */
++ g_return_if_fail (pad != NULL);
++ g_return_if_fail (GST_IS_PAD (pad));
++ g_return_if_fail (buf != NULL);
++
++ /* We need to get a pointer to the element this pad belongs to. */
++ example = GST_EXAMPLE (gst_pad_get_parent (pad));
++
++ /* A few more sanity checks to make sure that the element that owns
++ * this pad is the right kind of element, in case something got confused.
++ */
++ g_return_if_fail (example != NULL);
++ g_return_if_fail (GST_IS_EXAMPLE (example));
++
++ /* If we are supposed to be doing something, here's where it happens. */
++ if (example->active) {
++ /* In this example we're going to copy the buffer to another one,
++ * so we need to allocate a new buffer first. */
++ outbuf = gst_buffer_new ();
++
++ /* We need to copy the size and offset of the buffer at a minimum. */
++ GST_BUFFER_SIZE (outbuf) = GST_BUFFER_SIZE (buf);
++ GST_BUFFER_OFFSET (outbuf) = GST_BUFFER_OFFSET (buf);
++
++ /* Then allocate the memory for the new buffer */
++ GST_BUFFER_DATA (outbuf) = (guchar *) g_malloc (GST_BUFFER_SIZE (outbuf));
++
++ /* Then copy the data in the incoming buffer into the new buffer. */
++ memcpy (GST_BUFFER_DATA (outbuf), GST_BUFFER_DATA (buf),
++ GST_BUFFER_SIZE (outbuf));
++
++ /* we don't need the incomming buffer anymore so we unref it. When we are
++ * the last plugin with a handle to the buffer, its memory will be freed */
++ gst_buffer_unref (buf);
++
++ /* When we're done with the buffer, we push it on to the next element
++ * in the pipeline, through the element's source pad, which is stored
++ * in the element's structure.
++ */
++ gst_pad_push (example->srcpad, GST_DATA (outbuf));
++
++ /* For fun we'll emit our useless signal here */
++ g_signal_emit (G_OBJECT (example), gst_example_signals[ASDF], 0, example);
++
++ /* If we're not doing something, just send the original incoming buffer. */
++ } else {
++ gst_pad_push (example->srcpad, GST_DATA (buf));
++ }
++}
++
++/* Properties are part of the GLib+ object system, and these functions
++ * enable the element to respond to various properties.
++ */
++static void
++gst_example_set_property (GObject * object, guint prop_id, const GValue * value,
++ GParamSpec * pspec)
++{
++ GstExample *example;
++
++ g_return_if_fail (GST_IS_EXAMPLE (object));
++
++ /* Get a pointer of the right type. */
++ example = GST_EXAMPLE (object);
++
++ /* Check the argument id to see which argument we're setting. */
++ switch (prop_id) {
++ case ARG_ACTIVE:
++ /* Here we simply copy the value of the argument to our private
++ * storage. More complex operations can be done, but beware that
++ * they may occur at any time, possibly even while your chain function
++ * is running, if you are using threads.
++ */
++ example->active = g_value_get_int (value);
++ g_print ("example: set active to %d\n", example->active);
++ break;
++ default:
++ break;
++ }
++}
++
++/* The set function is simply the inverse of the get fuction. */
++static void
++gst_example_get_property (GObject * object, guint prop_id, GValue * value,
++ GParamSpec * pspec)
++{
++ GstExample *example;
++
++ g_return_if_fail (GST_IS_EXAMPLE (object));
++
++ example = GST_EXAMPLE (object);
++
++ switch (prop_id) {
++ case ARG_ACTIVE:
++ g_value_set_int (value, example->active);
++ break;
++ default:
++ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
++ break;
++ }
++}
++
++/* This is the state change function that will be called when
++ * the element goes through the different state changes.
++ * The plugin can prepare itself and its internal data structures
++ * in the various state transitions.
++ */
++static GstStateChangeReturn
++gst_example_change_state (GstElement * element, GstStateChange transition)
++{
++ GstExample *example;
++
++ /* cast to our plugin */
++ example = GST_EXAMPLE (element);
++
++ /* we perform our actions based on the state transition
++ * of the element */
++ switch (transition) {
++ /* The NULL to READY transition is used to
++ * create threads (if any), and/or open devices */
++ case GST_STATE_CHANGE_NULL_TO_READY:
++ break;
++ case GST_STATE_CHANGE_READY_TO_PAUSED:
++ break;
++ /* In the PAUSED to PLAYING state, the element should
++ * prepare itself for operation or continue after a PAUSE */
++ case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
++ break;
++ /* In the PLAYING to PAUSED state, the element should
++ * PAUSE itself and make sure it can resume operation */
++ case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
++ break;
++ /* In the PAUSED to READY state, the element should reset
++ * its internal state and close any devices. */
++ case GST_STATE_CHANGE_PAUSED_TO_READY:
++ break;
++ /* The element should free all resources, terminate threads
++ * and put itself into its initial state again */
++ case GST_STATE_CHANGE_READY_TO_NULL:
++ break;
++ }
++
++ /* Then we call the parent state change handler */
++ return parent_class->change_state (element, transition);
++}
++
++
++/* This is the entry into the plugin itself. When the plugin loads,
++ * this function is called to register everything that the plugin provides.
++ */
++static gboolean
++plugin_init (GstPlugin * plugin)
++{
++ /* We need to register each element we provide with the plugin. This consists
++ * of the name of the element, a rank that gives the importance of the element
++ * when compared to similar plugins and the GType identifier.
++ */
++ if (!gst_element_register (plugin, "example", GST_RANK_MARGINAL,
++ GST_TYPE_EXAMPLE))
++ return FALSE;
++
++ /* Now we can return successfully. */
++ return TRUE;
++
++ /* At this point, the GStreamer core registers the plugin, its
++ * elementfactories, padtemplates, etc., for use in your application.
++ */
++}
++
++/* This structure describes the plugin to the system for dynamically loading
++ * plugins, so that the version number and name can be checked in a uniform
++ * way.
++ *
++ * The symbol pointing to this structure is the only symbol looked up when
++ * loading the plugin.
++ */
++GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, /* The major version of the core that this was built with */
++ GST_VERSION_MINOR, /* The minor version of the core that this was built with */
++ "example", /* The name of the plugin. This must be unique: plugins with
++ * the same name will be assumed to be identical, and only
++ * one will be loaded. */
++ "an example plugin", /* a short description of the plugin in English */
++ plugin_init, /* Pointer to the initialisation function for the plugin. */
++ "0.1", /* The version number of the plugin */
++ "LGPL", /* effective license the plugin can be shipped with. Must be
++ * valid for all libraries it links to, too. */
++ "my nifty plugin package",
++ /* package this plugin belongs to. */
++ "http://www.mydomain.com"
++ /* originating URL for this plugin. This is the place to look
++ * for updates, information and so on. */
++ );
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/plugins/example.h gstreamer-0.10.23/tests/old/examples/plugins/example.h
+--- gstreamer-0.10.23.orig/tests/old/examples/plugins/example.h 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/plugins/example.h 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,87 @@
++/* GStreamer
++ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++
++#ifndef __GST_EXAMPLE_H__
++#define __GST_EXAMPLE_H__
++
++#include <gst/gst.h>
++
++G_BEGIN_DECLS
++
++/* This is the definition of the element's object structure. */
++typedef struct _GstExample GstExample;
++
++/* The structure itself is derived from GstElement, as can be seen by the
++ * fact that there's a complete instance of the GstElement structure at
++ * the beginning of the object. This allows the element to be cast to
++ * an Element or even an Object.
++ */
++struct _GstExample {
++ GstElement element;
++
++ /* We need to keep track of our pads, so we do so here. */
++ GstPad *sinkpad,*srcpad;
++
++ /* We'll use this to decide whether to do anything to the data we get. */
++ gboolean active;
++};
++
++/* The other half of the object is its class. The class also derives from
++ * the same parent, though it must be the class structure this time.
++ * Function pointers for polymophic methods and signals are placed in this
++ * structure. */
++typedef struct _GstExampleClass GstExampleClass;
++
++struct _GstExampleClass {
++ GstElementClass parent_class;
++
++ /* signals */
++ void (*asdf) (GstElement *element, GstExample *example);
++};
++
++/* Five standard preprocessing macros are used in the GLib object system.
++ * The first uses the object's _get_type function to return the GType
++ * of the object.
++ */
++#define GST_TYPE_EXAMPLE \
++ (gst_example_get_type())
++/* The second is a checking cast to the correct type. If the object passed
++ * is not the right type, a warning will be generated on stderr.
++ */
++#define GST_EXAMPLE(obj) \
++ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_EXAMPLE,GstExample))
++/* The third is a checking cast of the class instead of the object. */
++#define GST_EXAMPLE_CLASS(klass) \
++ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_EXAMPLE,GstExampleClass))
++/* The last two simply check to see if the passed pointer is an object or
++ * class of the correct type. */
++#define GST_IS_EXAMPLE(obj) \
++ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_EXAMPLE))
++#define GST_IS_EXAMPLE_CLASS(klass) \
++ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_EXAMPLE))
++
++/* This is the only prototype needed, because it is used in the above
++ * GST_TYPE_EXAMPLE macro.
++ */
++GType gst_example_get_type(void);
++
++G_END_DECLS
++
++#endif /* __GST_EXAMPLE_H__ */
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/plugins/Makefile.am gstreamer-0.10.23/tests/old/examples/plugins/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/examples/plugins/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/plugins/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,12 @@
++
++plugin_LTLIBRARIES = libgstexample.la
++
++libgstexample_la_SOURCES = example.c
++libgstexample_la_CFLAGS = $(GST_OBJ_CFLAGS)
++libgstexample_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
++
++noinst_HEADERS = example.h
++
++## ... but we don't want them installed so we override the install target
++install:
++ @true
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/pwg/extract.pl gstreamer-0.10.23/tests/old/examples/pwg/extract.pl
+--- gstreamer-0.10.23.orig/tests/old/examples/pwg/extract.pl 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/pwg/extract.pl 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,78 @@
++#!/usr/bin/perl
++
++# extract code fragments from xml program listings
++# first argument: source code file to find
++# second argument: xml files to extract code from
++
++# main
++
++# decodes xml by translating & < > back to what they should be
++# and also ignore
++# <![CDATA[ and ]]> and <!-- and -->
++sub
++xml_decode ($)
++{
++ my $input = shift;
++
++ $input =~ s/\&/&/g;
++ $input =~ s/</</g;
++ $input =~ s/>/>/g;
++
++ if ($input =~ /<!\[CDATA\[/) { $input = ""; }
++ if ($input =~ /]]>/) { $input = ""; }
++ if ($input =~ /<!--/) { $input = ""; }
++ if ($input =~ /-->/) { $input = ""; }
++
++ #print "Returning line $input";
++ return $input;
++}
++
++# main
++my $output = shift @ARGV;
++
++$found = 0;
++%blocks = ();
++
++foreach $file (@ARGV)
++{
++ open FILE, $file or die "Cannot open file $file";
++
++ while ($line = <FILE>)
++ {
++ if ($line =~ /<!-- example-begin $output (.*?)-->/)
++ {
++ $found = 1;
++ $block_id = $1;
++ $block = "\n/*** block $block_id from $file ***/\n";
++
++ print "Extracting $output block $block_id from $file\n";
++
++ while ($line = <FILE>)
++ {
++ if ($line =~ /<!-- example-end $output (.*?)-->/)
++ {
++ last;
++ }
++ $block .= xml_decode ($line);
++ }
++ $blocks{$block_id} = $block;
++ }
++ }
++}
++
++
++if (!$found)
++{
++ print "Could not find $output example !\n";
++ exit(1);
++}
++
++# now output all the blocks in the right order
++open OUTPUT, ">$output";
++@block_ids = keys %blocks;
++foreach $block_id (sort @block_ids)
++{
++ print "Writing $output block $block_id\n";
++ print OUTPUT $blocks{$block_id};
++}
++close OUTPUT;
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/pwg/Makefile.am gstreamer-0.10.23/tests/old/examples/pwg/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/examples/pwg/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/pwg/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,88 @@
++INCLUDES = $(GST_OBJ_CFLAGS) \
++ -DVERSION="\"0.0.1\""
++
++libboilerplate_la_SOURCES = boilerplate.c
++libpads_la_SOURCES = pads.c
++libchain_la_SOURCES = chain.c
++libchain2_la_SOURCES = chain2.c
++libstate_la_SOURCES = state.c
++libproperties_la_SOURCES = properties.c
++libforwardcaps_la_SOURCES = forwardcaps.c
++libconvertcaps_la_SOURCES = convertcaps.c
++libgetcaps_la_SOURCES = getcaps.c
++libtask_la_SOURCES = task.c
++librange_la_SOURCES = range.c
++DISTCLEANFILES = \
++ boilerplate.c pads.c chain.c chain2.c state.c properties.c \
++ forwardcaps.c convertcaps.c getcaps.c task.c range.c \
++ init.func caps.func chain.func state.func register.func filter.h
++
++EXTRA_DIST = extract.pl
++
++EXAMPLES = \
++ libboilerplate.la \
++ libpads.la \
++ libchain.la \
++ libchain2.la \
++ libstate.la \
++ libproperties.la \
++ libforwardcaps.la \
++ libconvertcaps.la \
++ libgetcaps.la \
++ libtask.la \
++ librange.la
++
++EXAMPLE_APPS = \
++ test
++
++filter.h register.func: $(top_srcdir)/docs/pwg/building-boiler.xml
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/pwg/building-boiler.xml
++
++boilerplate.c: $(top_srcdir)/docs/pwg/building-boiler.xml filter.h register.func
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/pwg/building-boiler.xml
++
++caps.func init.func: $(top_srcdir)/docs/pwg/building-pads.xml filter.h
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/pwg/building-pads.xml
++
++pads.c: $(top_srcdir)/docs/pwg/building-pads.xml register.func caps.func init.func
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/pwg/building-pads.xml
++
++chain.func: $(top_srcdir)/docs/pwg/building-chainfn.xml
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/pwg/building-chainfn.xml
++
++chain.c chain2.c: $(top_srcdir)/docs/pwg/building-chainfn.xml register.func caps.func init.func chain.func
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/pwg/building-chainfn.xml
++
++state.func: $(top_srcdir)/docs/pwg/building-state.xml
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/pwg/building-state.xml
++
++state.c: $(top_srcdir)/docs/pwg/building-state.xml register.func caps.func init.func chain.func state.func
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/pwg/building-state.xml
++
++properties.c: $(top_srcdir)/docs/pwg/building-props.xml filter.h register.func
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/pwg/building-props.xml
++
++test.c: $(top_srcdir)/docs/pwg/building-testapp.xml
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/pwg/building-testapp.xml
++
++forwardcaps.c convertcaps.c getcaps.c: $(top_srcdir)/docs/pwg/advanced-negotiation.xml init.func register.func chain.func state.func
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/pwg/advanced-negotiation.xml
++
++task.c range.c: $(top_srcdir)/docs/pwg/advanced-scheduling.xml register.func
++ $(PERL_PATH) $(srcdir)/extract.pl $@ \
++ $(top_srcdir)/docs/pwg/advanced-scheduling.xml
++
++noinst_PROGRAMS = $(EXAMPLE_APPS)
++noinst_LTLIBRARIES = $(EXAMPLES)
++LDADD = $(GST_OBJ_LIBS)
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/queue2/Makefile.am gstreamer-0.10.23/tests/old/examples/queue2/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/examples/queue2/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/queue2/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,5 @@
++noinst_PROGRAMS = queue2
++
++queue2_LDADD = $(GST_OBJ_LIBS)
++queue2_CFLAGS = $(GST_OBJ_CFLAGS)
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/queue2/queue2.c gstreamer-0.10.23/tests/old/examples/queue2/queue2.c
+--- gstreamer-0.10.23.orig/tests/old/examples/queue2/queue2.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/queue2/queue2.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,76 @@
++#include <stdlib.h>
++#include <gst/gst.h>
++
++gboolean playing;
++
++/* eos will be called when the src element has an end of stream */
++void
++eos (GstElement * element, gpointer data)
++{
++ g_print ("have eos, quitting\n");
++
++ playing = FALSE;
++}
++
++int
++main (int argc, char *argv[])
++{
++ GstElement *filesrc, *audiosink, *queue;
++ GstElement *pipeline;
++
++ gst_init (&argc, &argv);
++
++ if (argc != 2) {
++ g_print ("usage: %s <filename>\n", argv[0]);
++ exit (-1);
++ }
++
++ /* create a new bin to hold the elements */
++ pipeline = gst_pipeline_new ("pipeline");
++ g_assert (pipeline != NULL);
++
++ /* create a disk reader */
++ filesrc = gst_element_factory_make ("filesrc", "disk_source");
++ g_assert (filesrc != NULL);
++ g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
++ g_signal_connect (G_OBJECT (filesrc), "eos", G_CALLBACK (eos), thread);
++
++ queue = gst_element_factory_make ("queue", "queue");
++
++ /* and an audio sink */
++ audiosink = gst_element_factory_make ("alsasink", "play_audio");
++ g_assert (audiosink != NULL);
++
++ /* add objects to the main pipeline */
++ /*
++ gst_pipeline_add_src(GST_PIPELINE(pipeline), filesrc);
++ gst_pipeline_add_sink(GST_PIPELINE(pipeline), queue);
++
++ gst_bin_add(GST_BIN (pipeline), audiosink);
++
++ gst_pad_link(gst_element_get_pad(queue,"src"),
++ gst_element_get_pad(audiosink,"sink"));
++
++ if (!gst_pipeline_autoplug(GST_PIPELINE(pipeline))) {
++ g_print("cannot autoplug pipeline\n");
++ exit(-1);
++ }
++ */
++
++ gst_bin_add (GST_BIN (pipeline), thread);
++
++ /* make it ready */
++ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_READY);
++ /* start playing */
++ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
++
++ playing = TRUE;
++
++ while (playing) {
++ gst_bin_iterate (GST_BIN (pipeline));
++ }
++
++ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
++
++ exit (0);
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/queue3/Makefile.am gstreamer-0.10.23/tests/old/examples/queue3/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/examples/queue3/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/queue3/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,5 @@
++noinst_PROGRAMS = queue3
++
++queue3_LDADD = $(GST_OBJ_LIBS)
++queue3_CFLAGS = $(GST_OBJ_CFLAGS)
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/queue3/queue3.c gstreamer-0.10.23/tests/old/examples/queue3/queue3.c
+--- gstreamer-0.10.23.orig/tests/old/examples/queue3/queue3.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/queue3/queue3.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,76 @@
++#include <stdlib.h>
++#include <gst/gst.h>
++
++gboolean playing;
++
++/* eos will be called when the src element has an end of stream */
++void
++eos (GstElement * element, gpointer data)
++{
++ g_print ("have eos, quitting\n");
++
++ playing = FALSE;
++}
++
++int
++main (int argc, char *argv[])
++{
++ GstElement *filesrc, *osssink, *queue, *parse, *decode;
++ GstElement *bin;
++ GstElement *thread;
++
++ gst_init (&argc, &argv);
++
++ if (argc != 2) {
++ g_print ("usage: %s <filename>\n", argv[0]);
++ exit (-1);
++ }
++
++ /* create a new thread to hold the elements */
++ thread = gst_thread_new ("thread");
++ g_assert (thread != NULL);
++
++ /* create a new bin to hold the elements */
++ bin = gst_bin_new ("bin");
++ g_assert (bin != NULL);
++
++ /* create a disk reader */
++ filesrc = gst_element_factory_make ("filesrc", "disk_source");
++ g_assert (filesrc != NULL);
++ g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
++ g_signal_connect (G_OBJECT (filesrc), "eos", G_CALLBACK (eos), thread);
++
++ queue = gst_element_factory_make ("queue", "queue");
++
++ /* and an audio sink */
++ osssink = gst_element_factory_make ("osssink", "play_audio");
++ g_assert (osssink != NULL);
++
++ parse = gst_element_factory_make ("mp3parse", "parse");
++ decode = gst_element_factory_make ("mpg123", "decode");
++
++ /* add objects to the main bin */
++ gst_bin_add (GST_BIN (bin), filesrc);
++ gst_bin_add (GST_BIN (bin), queue);
++
++ gst_bin_add (GST_BIN (thread), parse);
++ gst_bin_add (GST_BIN (thread), decode);
++ gst_bin_add (GST_BIN (thread), osssink);
++
++ gst_element_link_many (filesrc, queue, parse, decode, osssink, NULL);
++
++ /* make it ready */
++ gst_element_set_state (GST_ELEMENT (bin), GST_STATE_READY);
++ /* start playing */
++ gst_element_set_state (GST_ELEMENT (bin), GST_STATE_PLAYING);
++
++ playing = TRUE;
++
++ while (playing) {
++ gst_bin_iterate (GST_BIN (bin));
++ }
++
++ gst_element_set_state (GST_ELEMENT (bin), GST_STATE_NULL);
++
++ exit (0);
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/queue4/Makefile.am gstreamer-0.10.23/tests/old/examples/queue4/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/examples/queue4/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/queue4/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,5 @@
++noinst_PROGRAMS = queue4
++
++queue4_LDADD = $(GST_OBJ_LIBS)
++queue4_CFLAGS = $(GST_OBJ_CFLAGS)
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/queue4/queue4.c gstreamer-0.10.23/tests/old/examples/queue4/queue4.c
+--- gstreamer-0.10.23.orig/tests/old/examples/queue4/queue4.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/queue4/queue4.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,84 @@
++#include <stdlib.h>
++#include <gst/gst.h>
++
++gboolean playing;
++
++/* eos will be called when the src element has an end of stream */
++void
++eos (GstElement * element, gpointer data)
++{
++ g_print ("have eos, quitting\n");
++
++ playing = FALSE;
++}
++
++int
++main (int argc, char *argv[])
++{
++ GstElement *filesrc, *osssink, *queue, *queue2, *parse, *decode;
++ GstElement *bin;
++ GstElement *thread, *thread2;
++
++ gst_init (&argc, &argv);
++
++ if (argc != 2) {
++ g_print ("usage: %s <filename>\n", argv[0]);
++ exit (-1);
++ }
++
++ /* create a new thread to hold the elements */
++ thread = gst_thread_new ("thread");
++ g_assert (thread != NULL);
++ thread2 = gst_thread_new ("thread2");
++ g_assert (thread2 != NULL);
++
++ /* create a new bin to hold the elements */
++ bin = gst_bin_new ("bin");
++ g_assert (bin != NULL);
++
++ /* create a disk reader */
++ filesrc = gst_element_factory_make ("filesrc", "disk_source");
++ g_assert (filesrc != NULL);
++ g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
++ g_signal_connect (G_OBJECT (filesrc), "eos", G_CALLBACK (eos), thread);
++
++ queue = gst_element_factory_make ("queue", "queue");
++ queue2 = gst_element_factory_make ("queue", "queue2");
++
++ /* and an audio sink */
++ osssink = gst_element_factory_make ("osssink", "play_audio");
++ g_assert (osssink != NULL);
++
++ parse = gst_element_factory_make ("mp3parse", "parse");
++ decode = gst_element_factory_make ("mpg123", "decode");
++
++ /* add objects to the main bin */
++ gst_bin_add (GST_BIN (bin), filesrc);
++ gst_bin_add (GST_BIN (bin), queue);
++
++ gst_bin_add (GST_BIN (thread), parse);
++ gst_bin_add (GST_BIN (thread), decode);
++ gst_bin_add (GST_BIN (thread), queue2);
++
++ gst_bin_add (GST_BIN (thread2), osssink);
++
++ gst_element_link_many (filesrc, queue, parse, decode, queue2, osssink, NULL);
++
++ gst_bin_add (GST_BIN (bin), thread);
++ gst_bin_add (GST_BIN (bin), thread2);
++
++ /* make it ready */
++ gst_element_set_state (GST_ELEMENT (bin), GST_STATE_READY);
++ /* start playing */
++ gst_element_set_state (GST_ELEMENT (bin), GST_STATE_PLAYING);
++
++ playing = TRUE;
++
++ while (playing) {
++ gst_bin_iterate (GST_BIN (bin));
++ }
++
++ gst_element_set_state (GST_ELEMENT (bin), GST_STATE_NULL);
++
++ exit (0);
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/retag/Makefile.am gstreamer-0.10.23/tests/old/examples/retag/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/examples/retag/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/retag/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,7 @@
++noinst_PROGRAMS = retag transcode
++
++retag_LDADD = $(GST_OBJ_LIBS)
++retag_CFLAGS = $(GST_OBJ_CFLAGS)
++
++transcode_LDADD = $(GST_OBJ_LIBS)
++transcode_CFLAGS = $(GST_OBJ_CFLAGS)
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/retag/retag.c gstreamer-0.10.23/tests/old/examples/retag/retag.c
+--- gstreamer-0.10.23.orig/tests/old/examples/retag/retag.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/retag/retag.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,103 @@
++/*
++ * This example shows how to use interfaces and the tag subsystem.
++ * It takes an mp3 file as input, and makes an ogg file out of it. While doing
++ * this, it parses the filename and sets artist and title in the ogg file.
++ * It assumes the filename to be "<artist> - <title>.mp3"
++ *
++ * Run the program as "retag <mp3 file>"
++ *
++ * To run this program, you need to have the gst-plugins package (specifically
++ * the vorbis and mad plugins) installed.
++ */
++
++/* main header */
++#include <gst/gst.h>
++/* and a header we need for the string manipulation */
++#include <string.h>
++
++int
++main (int argc, char *argv[])
++{
++ GstElement *bin, *filesrc, *tag_changer, *filesink;
++ gchar *artist, *title, *ext, *filename;
++
++ /* initialize GStreamer */
++ gst_init (&argc, &argv);
++
++ /* check that the argument is there */
++ if (argc != 2) {
++ g_print ("usage: %s <mp3 file>\n", argv[0]);
++ return 1;
++ }
++
++ /* parse the mp3 name */
++ artist = strrchr (argv[1], '/');
++ if (artist == NULL)
++ artist = argv[1];
++ artist = g_strdup (artist);
++ ext = strrchr (artist, '.');
++ if (ext)
++ *ext = '\0';
++ title = strstr (artist, " - ");
++ if (title == NULL) {
++ g_print ("The format of the mp3 file is invalid.\n");
++ return 1;
++ }
++ *title = '\0';
++ title += 3;
++
++
++ /* create a new bin to hold the elements */
++ bin = gst_pipeline_new ("pipeline");
++ g_assert (bin);
++
++ /* create a file reader */
++ filesrc = gst_element_factory_make ("filesrc", "disk_source");
++ g_assert (filesrc);
++
++ /* now it's time to get the tag_changer */
++ tag_changer = gst_element_factory_make ("id3tag", "tag_changer");
++ if (!tag_changer) {
++ g_print ("could not find plugin \"mad\"");
++ return 1;
++ }
++
++ /* and a file writer */
++ filesink = gst_element_factory_make ("filesink", "filesink");
++ g_assert (filesink);
++
++ /* set the filenames */
++ filename = g_strdup_printf ("%s.temp", argv[1]); /* easy solution */
++ g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
++ g_object_set (G_OBJECT (filesink), "location", filename, NULL);
++
++ /* make sure the tag setter uses our stuff
++ (though that should already be default) */
++ gst_tag_setter_set_merge_mode (GST_TAG_SETTER (tag_changer),
++ GST_TAG_MERGE_KEEP);
++ /* set the tagging information */
++ gst_tag_setter_add (GST_TAG_SETTER (tag_changer), GST_TAG_MERGE_REPLACE,
++ GST_TAG_ARTIST, artist, GST_TAG_TITLE, title, NULL);
++
++ /* add objects to the main pipeline */
++ gst_bin_add_many (GST_BIN (bin), filesrc, tag_changer, filesink, NULL);
++
++ /* link the elements */
++ if (!gst_element_link_many (filesrc, tag_changer, filesink, NULL))
++ g_assert_not_reached ();
++
++ /* start playing */
++ gst_element_set_state (bin, GST_STATE_PLAYING);
++
++ while (gst_bin_iterate (GST_BIN (bin)));
++
++ /* stop the bin */
++ gst_element_set_state (bin, GST_STATE_NULL);
++
++ /* rename the file to the correct name and remove the old one */
++ remove (argv[1]);
++ rename (filename, argv[1]);
++ g_free (filename);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/retag/transcode.c gstreamer-0.10.23/tests/old/examples/retag/transcode.c
+--- gstreamer-0.10.23.orig/tests/old/examples/retag/transcode.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/retag/transcode.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,105 @@
++/*
++ * This example shows how to use interfaces and the tag subsystem.
++ * It takes an mp3 file as input, and makes an ogg file out of it. While doing
++ * this, it parses the filename and sets artist and title in the ogg file.
++ * It assumes the filename to be "<artist> - <title>.mp3"
++ *
++ * Run the program as "transcode <mp3 file>"
++ *
++ * To run this program, you need to have the gst-plugins package (specifically
++ * the vorbis and mad plugins) installed.
++ */
++
++/* main header */
++#include <gst/gst.h>
++/* and a header we need for the string manipulation */
++#include <string.h>
++
++int
++main (int argc, char *argv[])
++{
++ GstElement *bin, *filesrc, *decoder, *encoder, *filesink;
++ gchar *artist, *title, *ext, *filename;
++
++ /* initialize GStreamer */
++ gst_init (&argc, &argv);
++
++ /* check that the argument is there */
++ if (argc != 2) {
++ g_print ("usage: %s <mp3 file>\n", argv[0]);
++ return 1;
++ }
++
++ /* parse the mp3 name */
++ artist = strrchr (argv[1], '/');
++ if (artist == NULL)
++ artist = argv[1];
++ artist = g_strdup (artist);
++ ext = strrchr (artist, '.');
++ if (ext)
++ *ext = '\0';
++ title = strstr (artist, " - ");
++ if (title == NULL) {
++ g_print ("The format of the mp3 file is invalid.\n");
++ g_print ("It needs to be in the form of artist - title.mp3.\n");
++ return 1;
++ }
++ *title = '\0';
++ title += 3;
++
++
++ /* create a new bin to hold the elements */
++ bin = gst_pipeline_new ("pipeline");
++ g_assert (bin);
++
++ /* create a file reader */
++ filesrc = gst_element_factory_make ("filesrc", "disk_source");
++ g_assert (filesrc);
++
++ /* now it's time to get the decoder */
++ decoder = gst_element_factory_make ("mad", "decode");
++ if (!decoder) {
++ g_print ("could not find plugin \"mad\"");
++ return 1;
++ }
++
++ /* create the encoder */
++ encoder = gst_element_factory_make ("vorbisenc", "encoder");
++ if (!encoder) {
++ g_print ("cound not find plugin \"vorbisenc\"");
++ return 1;
++ }
++
++ /* and a file writer */
++ filesink = gst_element_factory_make ("filesink", "filesink");
++ g_assert (filesink);
++
++ /* set the filenames */
++ filename = g_strdup_printf ("%s.ogg", argv[1]); /* easy solution */
++ g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
++ g_object_set (G_OBJECT (filesink), "location", filename, NULL);
++ g_free (filename);
++
++ /* make sure the tag setter uses our stuff
++ (though that should already be default) */
++ gst_tag_setter_set_merge_mode (GST_TAG_SETTER (encoder), GST_TAG_MERGE_KEEP);
++ /* set the tagging information */
++ gst_tag_setter_add (GST_TAG_SETTER (encoder), GST_TAG_MERGE_REPLACE,
++ GST_TAG_ARTIST, artist, GST_TAG_TITLE, title, NULL);
++
++ /* add objects to the main pipeline */
++ gst_bin_add_many (GST_BIN (bin), filesrc, decoder, encoder, filesink, NULL);
++
++ /* link the elements */
++ gst_element_link_many (filesrc, decoder, encoder, filesink, NULL);
++
++ /* start playing */
++ gst_element_set_state (bin, GST_STATE_PLAYING);
++
++ while (gst_bin_iterate (GST_BIN (bin)));
++
++ /* stop the bin */
++ gst_element_set_state (bin, GST_STATE_NULL);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/thread/Makefile.am gstreamer-0.10.23/tests/old/examples/thread/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/examples/thread/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/thread/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,5 @@
++noinst_PROGRAMS = thread
++
++thread_LDADD = $(GST_OBJ_LIBS)
++thread_CFLAGS = $(GST_OBJ_CFLAGS)
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/thread/thread.c gstreamer-0.10.23/tests/old/examples/thread/thread.c
+--- gstreamer-0.10.23.orig/tests/old/examples/thread/thread.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/thread/thread.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,79 @@
++#include <stdlib.h>
++#include <gst/gst.h>
++
++static GMainLoop *loop;
++
++/* eos will be called when the src element has an end of stream */
++void
++eos (GstElement * element, gpointer data)
++{
++ GstThread *thread = GST_THREAD (data);
++
++ g_print ("have eos, quitting\n");
++
++ /* stop the bin */
++ gst_element_set_state (GST_ELEMENT (thread), GST_STATE_NULL);
++
++ g_main_loop_quit (loop);
++ g_main_loop_unref (loop);
++}
++
++int
++main (int argc, char *argv[])
++{
++ GstElement *filesrc, *osssink;
++ GstElement *pipeline;
++ GstElement *thread;
++
++ gst_init (&argc, &argv);
++
++ if (argc != 2) {
++ g_print ("usage: %s <filename>\n", argv[0]);
++ exit (-1);
++ }
++
++ /* create a new thread to hold the elements */
++ thread = gst_thread_new ("thread");
++ g_assert (thread != NULL);
++
++ /* create a new bin to hold the elements */
++ pipeline = gst_pipeline_new ("pipeline");
++ g_assert (pipeline != NULL);
++
++ /* create a disk reader */
++ filesrc = gst_element_factory_make ("filesrc", "disk_source");
++ g_assert (filesrc != NULL);
++ g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
++ g_signal_connect (G_OBJECT (filesrc), "eos", G_CALLBACK (eos), thread);
++
++ /* and an audio sink */
++ osssink = gst_element_factory_make ("osssink", "play_audio");
++ g_assert (osssink != NULL);
++
++ /* add objects to the main pipeline */
++ /*
++ gst_pipeline_add_src(GST_PIPELINE(pipeline), filesrc);
++ gst_pipeline_add_sink(GST_PIPELINE(pipeline), osssink);
++
++ if (!gst_pipeline_autoplug(GST_PIPELINE(pipeline))) {
++ g_print("unable to handle stream\n");
++ exit(-1);
++ }
++ */
++
++ /*gst_bin_remove(GST_BIN(pipeline), filesrc); */
++
++ /*gst_bin_add(GST_BIN(thread), filesrc); */
++ gst_bin_add (GST_BIN (thread), GST_ELEMENT (pipeline));
++
++ /* make it ready */
++ gst_element_set_state (GST_ELEMENT (thread), GST_STATE_READY);
++ /* start playing */
++ gst_element_set_state (GST_ELEMENT (thread), GST_STATE_PLAYING);
++
++ loop = g_main_loop_new (NULL, FALSE);
++
++ gst_object_unref (thread);
++
++ exit (0);
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/examples/TODO gstreamer-0.10.23/tests/old/examples/TODO
+--- gstreamer-0.10.23.orig/tests/old/examples/TODO 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/examples/TODO 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,66 @@
++state of the examples:
++
++appreader
++controller
++ okay
++cutter
++events
++helloworld
++helloworld2
++manual
++metadata
++mixer
++pingpong
++plugins
++pwg
++queue
++queue2
++queue3
++queue4
++retag
++typefind
++xml
++
++----
++
++appreader
++ gst_bin_iterate
++
++cutter
++ gst_bin_iterate
++
++events
++ gst_bin_iterate
++ gst_event_new_seek
++ gst_event_new_flush
++
++helloworld
++ GstAutoplug
++
++manual
++ dynamic
++ gst_registry_pool_feature_filter
++
++mixer
++ gst_bin_iterate
++ gst_scheduler_show
++ gst_element_add_ghost_pad
++
++pingpong
++ gst_bin_iterate
++ gst_element_add_ghost_pad
++ gst_element_default_deep_notify
++
++plugins
++ lots of errors
++
++pwg
++ lots of errors
++
++retag
++ gst_tag_setter_
++ gst_bin_iterate
++
++thread
++ obsolete, uses gst_thread_new
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/app_fixate.c gstreamer-0.10.23/tests/old/testsuite/caps/app_fixate.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/app_fixate.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/app_fixate.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,51 @@
++
++#include <gst/gst.h>
++
++
++static GstCaps *
++handler (GObject * object, GstCaps * caps, gpointer user_data)
++{
++ g_print ("in handler %p, %p, %p\n", object, caps, user_data);
++
++ g_assert (GST_IS_PAD (object));
++
++ g_print ("caps: %s\n", gst_caps_to_string (caps));
++
++ if (gst_caps_is_any (caps)) {
++ return gst_caps_new_simple ("application/x-foo",
++ "field", GST_TYPE_INT_RANGE, 1, 10, NULL);
++ }
++
++ return NULL;
++}
++
++
++int
++main (int argc, char *argv[])
++{
++ GstElement *a;
++ GstElement *b;
++ GstElement *pipeline;
++ GstPad *pad;
++
++ gst_init (&argc, &argv);
++
++ pipeline = gst_pipeline_new (NULL);
++
++ a = gst_element_factory_make ("fakesrc", NULL);
++ g_assert (a);
++ b = gst_element_factory_make ("fakesink", NULL);
++ g_assert (b);
++
++ gst_bin_add_many (GST_BIN (pipeline), a, b, NULL);
++ gst_element_link (a, b);
++
++ pad = gst_element_get_pad (a, "src");
++ g_signal_connect (G_OBJECT (pad), "fixate", G_CALLBACK (handler),
++ (void *) 0xdeadbeef);
++
++ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
++
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/audioscale.c gstreamer-0.10.23/tests/old/testsuite/caps/audioscale.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/audioscale.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/audioscale.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,174 @@
++/* GStreamer
++ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++/* Element-Checklist-Version: 5 */
++
++
++#ifdef HAVE_CONFIG_H
++#include "config.h"
++#endif
++#include <string.h>
++#include <math.h>
++
++#include <gst/gst.h>
++
++
++static void
++gst_audioscale_expand_value (GValue * dest, const GValue * src)
++{
++ int rate_min, rate_max;
++
++ if (G_VALUE_TYPE (src) == G_TYPE_INT ||
++ G_VALUE_TYPE (src) == GST_TYPE_INT_RANGE) {
++ if (G_VALUE_TYPE (src) == G_TYPE_INT) {
++ rate_min = g_value_get_int (src);
++ rate_max = rate_min;
++ } else {
++ rate_min = gst_value_get_int_range_min (src);
++ rate_max = gst_value_get_int_range_max (src);
++ }
++
++ rate_min /= 2;
++ if (rate_min < 1)
++ rate_min = 1;
++ if (rate_max < G_MAXINT / 2) {
++ rate_max *= 2;
++ } else {
++ rate_max = G_MAXINT;
++ }
++
++ g_value_init (dest, GST_TYPE_INT_RANGE);
++ gst_value_set_int_range (dest, rate_min, rate_max);
++ return;
++ }
++
++ if (G_VALUE_TYPE (src) == GST_TYPE_LIST) {
++ int i;
++
++ g_value_init (dest, GST_TYPE_LIST);
++ for (i = 0; i < gst_value_list_get_size (src); i++) {
++ const GValue *s = gst_value_list_get_value (src, i);
++ GValue d = { 0 };
++ int j;
++
++ gst_audioscale_expand_value (&d, s);
++
++ for (j = 0; j < gst_value_list_get_size (dest); j++) {
++ const GValue *s2 = gst_value_list_get_value (dest, j);
++ GValue d2 = { 0 };
++
++ gst_value_union (&d2, &d, s2);
++ if (G_VALUE_TYPE (&d2) == GST_TYPE_INT_RANGE) {
++ g_value_unset ((GValue *) s2);
++ gst_value_init_and_copy ((GValue *) s2, &d2);
++ break;
++ }
++ g_value_unset (&d2);
++ }
++ if (j == gst_value_list_get_size (dest)) {
++ gst_value_list_append_value (dest, &d);
++ }
++ g_value_unset (&d);
++ }
++
++ if (gst_value_list_get_size (dest) == 1) {
++ const GValue *s = gst_value_list_get_value (dest, 0);
++ GValue d = { 0 };
++
++ gst_value_init_and_copy (&d, s);
++ g_value_unset (dest);
++ gst_value_init_and_copy (dest, &d);
++ g_value_unset (&d);
++ }
++
++ return;
++ }
++
++ GST_ERROR ("unexpected value type");
++}
++
++static GstCaps *
++gst_audioscale_getcaps (const GstCaps * othercaps)
++{
++ GstCaps *caps;
++ int i;
++
++ caps = gst_caps_copy (othercaps);
++
++ /* we do this hack, because the audioscale lib doesn't handle
++ * rate conversions larger than a factor of 2 */
++ for (i = 0; i < gst_caps_get_size (caps); i++) {
++ GstStructure *structure = gst_caps_get_structure (caps, i);
++ const GValue *value;
++ GValue dest = { 0 };
++
++ value = gst_structure_get_value (structure, "rate");
++ if (value == NULL) {
++ GST_ERROR ("caps structure doesn't have required rate field");
++ return NULL;
++ }
++
++ gst_audioscale_expand_value (&dest, value);
++
++ gst_structure_set_value (structure, "rate", &dest);
++ }
++
++ return caps;
++}
++
++
++void
++test_caps (const char *s)
++{
++ GstCaps *caps;
++ GstCaps *caps2;
++ char *s2;
++
++ caps = gst_caps_from_string (s);
++ caps2 = gst_audioscale_getcaps (caps);
++ s2 = gst_caps_to_string (caps2);
++
++ g_print ("original: %s\nfiltered: %s\n\n", s, s2);
++
++ g_free (s2);
++ gst_caps_unref (caps);
++ gst_caps_unref (caps2);
++}
++
++
++int
++main (int argc, char *argv[])
++{
++
++ gst_init (&argc, &argv);
++
++ test_caps ("audio/x-raw-int, rate=(int)1");
++ test_caps ("audio/x-raw-int, rate=(int)10");
++ test_caps ("audio/x-raw-int, rate=(int)100");
++ test_caps ("audio/x-raw-int, rate=(int)10000");
++ test_caps ("audio/x-raw-int, rate=(int)2000000000");
++
++ test_caps ("audio/x-raw-int, rate=(int)[1,100]");
++ test_caps ("audio/x-raw-int, rate=(int)[1000,40000]");
++
++ test_caps ("audio/x-raw-int, rate=(int){1,100}");
++ test_caps ("audio/x-raw-int, rate=(int){100,200,300}");
++ test_caps ("audio/x-raw-int, rate=(int){[100,200],1000}");
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/caps.c gstreamer-0.10.23/tests/old/testsuite/caps/caps.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/caps.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/caps.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,159 @@
++
++#include <gst/gst.h>
++
++
++void
++test1 (void)
++{
++ GstCaps *caps;
++ GstCaps *caps2;
++
++ g_print ("type is %d\n", (int) gst_caps_get_type ());
++
++ caps = gst_caps_new_empty ();
++ g_assert (caps != NULL);
++ gst_caps_unref (caps);
++
++ caps = gst_caps_new_any ();
++ g_assert (caps != NULL);
++ gst_caps_unref (caps);
++
++ caps = gst_caps_new_simple ("audio/raw", "_int", G_TYPE_INT, 100, NULL);
++ g_assert (caps != NULL);
++ g_assert (gst_caps_is_empty (caps) == FALSE);
++ g_assert (gst_caps_is_any (caps) == FALSE);
++ g_assert (GST_CAPS_IS_SIMPLE (caps) == TRUE);
++ g_assert (gst_caps_is_fixed (caps) == TRUE);
++ g_print ("%s\n", gst_caps_to_string (caps));
++ gst_caps_unref (caps);
++
++ caps = gst_caps_new_simple ("audio/raw",
++ "_double", G_TYPE_DOUBLE, 100.0, NULL);
++ g_assert (caps != NULL);
++ g_assert (gst_caps_is_empty (caps) == FALSE);
++ g_assert (gst_caps_is_any (caps) == FALSE);
++ g_assert (GST_CAPS_IS_SIMPLE (caps) == TRUE);
++ g_assert (gst_caps_is_fixed (caps) == TRUE);
++ g_print ("%s\n", gst_caps_to_string (caps));
++ gst_caps_unref (caps);
++
++ caps = gst_caps_new_simple ("audio/raw",
++ "_fourcc", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('a', 'b', 'c', 'd'), NULL);
++ g_assert (caps != NULL);
++ g_assert (gst_caps_is_empty (caps) == FALSE);
++ g_assert (gst_caps_is_any (caps) == FALSE);
++ g_assert (GST_CAPS_IS_SIMPLE (caps) == TRUE);
++ g_assert (gst_caps_is_fixed (caps) == TRUE);
++ g_print ("%s\n", gst_caps_to_string (caps));
++ gst_caps_unref (caps);
++
++ caps = gst_caps_new_simple ("audio/raw",
++ "_boolean", G_TYPE_BOOLEAN, TRUE, NULL);
++ g_assert (caps != NULL);
++ g_assert (gst_caps_is_empty (caps) == FALSE);
++ g_assert (gst_caps_is_any (caps) == FALSE);
++ g_assert (GST_CAPS_IS_SIMPLE (caps) == TRUE);
++ g_assert (gst_caps_is_fixed (caps) == TRUE);
++ g_print ("%s\n", gst_caps_to_string (caps));
++ gst_caps_unref (caps);
++
++ caps =
++ gst_caps_new_full (gst_structure_new ("audio/raw", "_int", G_TYPE_INT,
++ 100, NULL), gst_structure_new ("audio/raw2", "_int", G_TYPE_INT, 100,
++ NULL), NULL);
++ g_assert (caps != NULL);
++ g_assert (gst_caps_is_empty (caps) == FALSE);
++ g_assert (gst_caps_is_any (caps) == FALSE);
++ g_assert (GST_CAPS_IS_SIMPLE (caps) == FALSE);
++ g_assert (gst_caps_is_fixed (caps) == FALSE);
++ g_print ("%s\n", gst_caps_to_string (caps));
++ gst_caps_unref (caps);
++
++ caps = gst_caps_new_simple ("audio/raw", "_int", G_TYPE_INT, 100, NULL);
++ g_assert (caps != NULL);
++ caps2 = gst_caps_copy (caps);
++ g_assert (caps2 != NULL);
++ g_assert (gst_caps_is_empty (caps2) == FALSE);
++ g_assert (gst_caps_is_any (caps2) == FALSE);
++ g_assert (GST_CAPS_IS_SIMPLE (caps2) == TRUE);
++ g_assert (gst_caps_is_fixed (caps2) == TRUE);
++ g_print ("%s\n", gst_caps_to_string (caps));
++ g_print ("%s\n", gst_caps_to_string (caps2));
++ gst_caps_unref (caps);
++ gst_caps_unref (caps2);
++
++ caps = gst_caps_new_simple ("audio/raw", "_int", G_TYPE_INT, 100, NULL);
++ gst_caps_append (caps,
++ gst_caps_new_simple ("audio/raw", "_int", G_TYPE_INT, 200, NULL));
++ g_assert (caps != NULL);
++ g_assert (gst_caps_is_empty (caps) == FALSE);
++ g_assert (gst_caps_is_any (caps) == FALSE);
++ g_assert (GST_CAPS_IS_SIMPLE (caps) == FALSE);
++ g_assert (gst_caps_is_fixed (caps) == FALSE);
++ g_print ("%s\n", gst_caps_to_string (caps));
++ gst_caps_unref (caps);
++
++ caps = gst_caps_new_simple ("audio/raw", "_int", G_TYPE_INT, 100, NULL);
++ g_assert (caps != NULL);
++ gst_caps_append_structure (caps,
++ gst_structure_new ("audio/raw", "_int", G_TYPE_INT, 200, NULL));
++ g_assert (gst_caps_is_empty (caps) == FALSE);
++ g_assert (gst_caps_is_any (caps) == FALSE);
++ g_assert (GST_CAPS_IS_SIMPLE (caps) == FALSE);
++ g_assert (gst_caps_is_fixed (caps) == FALSE);
++ g_print ("%s\n", gst_caps_to_string (caps));
++ gst_caps_unref (caps);
++}
++
++void
++test2 (void)
++{
++ GstCaps *caps1;
++ GstCaps *caps2;
++ GstCaps *caps;
++
++ caps1 =
++ gst_caps_new_full (gst_structure_new ("audio/raw", "_int", G_TYPE_INT,
++ 100, NULL), gst_structure_new ("audio/raw", "_int", G_TYPE_INT, 200,
++ NULL), NULL);
++ caps2 =
++ gst_caps_new_full (gst_structure_new ("audio/raw", "_int", G_TYPE_INT,
++ 100, NULL), gst_structure_new ("audio/raw", "_int", G_TYPE_INT, 300,
++ NULL), NULL);
++ caps = gst_caps_intersect (caps1, caps2);
++ g_print ("%s\n", gst_caps_to_string (caps));
++ gst_caps_unref (caps);
++ gst_caps_unref (caps1);
++ gst_caps_unref (caps2);
++
++}
++
++void
++test3 (void)
++{
++ GstCaps *caps1;
++ GstCaps *caps2;
++
++ caps1 = gst_caps_new_any ();
++ caps2 = gst_caps_new_simple ("audio/raw", NULL);
++
++ gst_caps_append (caps1, caps2);
++ g_print ("%s\n", gst_caps_to_string (caps1));
++
++ g_assert (gst_caps_is_any (caps1));
++ g_assert (gst_caps_get_size (caps1) == 0);
++
++ gst_caps_unref (caps1);
++}
++
++int
++main (int argc, char *argv[])
++{
++ gst_init (&argc, &argv);
++
++ test1 ();
++ test2 ();
++ test3 ();
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/caps.h gstreamer-0.10.23/tests/old/testsuite/caps/caps.h
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/caps.h 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/caps.h 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,18 @@
++#include <glib.h>
++
++/* defines an array of strings named caps_list, that contains a list of caps for
++ general tests. So if you don't know what caps to use to write a test, just
++ include this file */
++
++static const gchar *caps_list[] = {
++ "audio/x-adpcm, layout=(string)quicktime; audio/x-adpcm, layout=(string)quicktime; audio/x-adpcm, layout=(string)wav; audio/x-adpcm, layout=(string)wav; audio/x-adpcm, layout=(string)dk3; audio/x-adpcm, layout=(string)dk3; audio/x-adpcm, layout=(string)dk4; audio/x-adpcm, layout=(string)dk4; audio/x-adpcm, layout=(string)westwood; audio/x-adpcm, layout=(string)westwood; audio/x-adpcm, layout=(string)smjpeg; audio/x-adpcm, layout=(string)smjpeg; audio/x-adpcm, layout=(string)microsoft; audio/x-adpcm, layout=(string)microsoft; audio/x-adpcm, layout=(string)4xm; audio/x-adpcm, layout=(string)4xm; audio/x-adpcm, layout=(string)xa; audio/x-adpcm, layout=(string)xa; audio/x-adpcm, layout=(string)adx; audio/x-adpcm, layout=(string)adx; audio/x-adpcm, layout=(string)ea; audio/x-adpcm, layout=(string)ea; audio/x-adpcm, layout=(string)g726; audio/x-adpcm, layout=(string)g726",
++ "video/x-raw-yuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], format=(fourcc)I420; video/x-raw-yuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], format=(fourcc)YUY2; video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], bpp=(int)24, depth=(int)24, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, endianness=(int)4321; video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], bpp=(int)24, depth=(int)24, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, endianness=(int)4321; video/x-raw-yuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], format=(fourcc)Y42B; video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], bpp=(int)32, depth=(int)24, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, endianness=(int)4321; video/x-raw-yuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], format=(fourcc)YUV9; video/x-raw-yuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], format=(fourcc)Y41B; video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], bpp=(int)16, depth=(int)16, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, endianness=(int)1234; video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], bpp=(int)16, depth=(int)15, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, endianness=(int)1234",
++ "video/x-raw-yuv, format=(fourcc){ YUY2, I420 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-jpeg, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-divx, divxversion=(int)[ 3, 5 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-xvid, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-3ivx, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-msmpeg, msmpegversion=(int)[ 41, 43 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/mpeg, mpegversion=(int)1, systemstream=(boolean)false, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h263, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-dv, systemstream=(boolean)false, width=(int)720, height=(int){ 576, 480 }; video/x-huffyuv, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]",
++ "video/x-raw-yuv, format=(fourcc){ YUY2, I420 }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; image/jpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-divx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], divxversion=(int)[ 3, 5 ]; video/x-xvid, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-3ivx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-msmpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], msmpegversion=(int)[ 41, 43 ]; video/mpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], mpegversion=(int)1, systemstream=(boolean)false; video/x-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-dv, width=(int)720, height=(int){ 576, 480 }, systemstream=(boolean)false; video/x-huffyuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]",
++ "video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]",
++ "video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]",
++ "video/x-raw-yuv, format=(fourcc){ I420 }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]",
++ "ANY",
++ "EMPTY"
++};
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/caps_strings gstreamer-0.10.23/tests/old/testsuite/caps/caps_strings
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/caps_strings 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/caps_strings 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,263 @@
++ANY
++EMPTY
++image/bmp
++image/gif
++image/png
++audio/x-au
++image/jpeg
++text/plain
++audio/x-ac3
++audio/x-m4a
++audio/x-mod
++audio/x-sid
++audio/x-wav
++image/x-jng
++image/x-xcf
++video/x-4xm
++video/x-fli
++video/x-mng
++audio/x-aiff
++audio/x-flac
++video/x-cdxa
++audio/x-speex
++text/uri-list
++audio/x-vorbis
++video/x-ms-asf
++video/x-theora
++application/ogg
++application/zip
++audio/x-shorten
++image/x-xpixmap
++video/quicktime
++video/x-msvideo
++video/x-matroska
++application/x-ape
++application/x-id3
++application/x-rtp
++application/x-bzip
++application/x-gzip
++image/x-sun-raster
++video/x-pn-realvideo
++application/x-compress
++video/x-dvd-subpicture
++audio/x-gst_ff-vmdaudio
++application/x-gst_ff-RoQ
++application/x-gst_ff-ffm
++application/x-gst_ff-flv
++application/x-gst_ff-gif
++application/x-gst_ff-mp3
++application/x-gst_ff-nut
++application/x-gst_ff-sdp
++application/x-gst_ff-vmd
++application/x-gst_ff-flic
++application/x-gst_ff-rtsp
++application/x-gst_ff-idcin
++application/x-gst_ff-redir
++application/x-gst_ff-wsaud
++application/x-gst_ff-wsvqa
++application/x-gst_ff-psxstr
++application/vnd.rn-realmedia
++application/x-gst_ff-ipmovie
++video/quicktime; audio/x-m4a
++application/x-gst_ff-film_cpk
++application/x-gst_ff-wc3movie
++application/x-shockwave-flash
++audio/mpeg, mpegversion=(int)1
++text/x-pango-markup; text/plain
++audio/x-adpcm, layout=(string)ea
++audio/x-adpcm, layout=(string)xa
++audio/x-dpcm, layout=(string)roq
++audio/x-dpcm, layout=(string)xan
++audio/x-mace, maceversion=(int)3
++audio/x-mace, maceversion=(int)6
++application/x-gst_ff-yuv4mpegpipe
++audio/x-adpcm, layout=(string)4xm
++audio/x-adpcm, layout=(string)adx
++audio/x-adpcm, layout=(string)dk3
++audio/x-adpcm, layout=(string)dk4
++audio/x-adpcm, layout=(string)dvi
++audio/x-adpcm, layout=(string)g726
++audio/x-adpcm, layout=(string)smjpeg
++audio/x-flac; application/x-gst-tags
++audio/x-aiff; audio/x-wav; audio/x-au
++audio/x-adpcm, layout=(string)westwood
++audio/x-dpcm, layout=(string)interplay
++audio/x-gsm, rate=(int)[ 1000, 48000 ]
++audio/x-pn-realaudio, raversion=(int)1
++audio/x-pn-realaudio, raversion=(int)2
++audio/x-vorbis; application/x-gst-tags
++video/mpeg, systemstream=(boolean)true
++video/x-dv, systemstream=(boolean)true
++audio/x-adpcm, layout=(string)microsoft
++audio/x-adpcm, layout=(string)quicktime
++video/mpeg, systemstream=(boolean)false
++video/mpegts, systemstream=(boolean)true
++application/x-yuv4mpeg, y4mversion=(int)1
++image/tiff, endianness=(int){ 4321, 1234 }
++audio/mpeg, mpegversion=(int)1, layer=(int)2
++audio/mpeg, mpegversion=(int)1; audio/x-flac
++audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 2 ]
++audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ]
++application/x-pn-realmedia, systemstream=(boolean)true
++audio/x-gsm, rate=(int)[ 1000, 48000 ], channels=(int)1
++audio/x-speex, rate=(int)[ 1000, 48000 ], channels=(int)1
++video/mpeg, mpegversion=(int)1, systemstream=(boolean)false
++audio/x-ac3, channels=(int)[ 1, 6 ], rate=(int)[ 32000, 48000 ]
++audio/x-alaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]
++audio/x-mulaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]
++video/mpeg, mpegversion=(int)[ 1, 2 ], systemstream=(boolean)true
++video/mpeg, mpegversion=(int){ 1, 2 }, systemstream=(boolean)true
++video/mpeg, systemstream=(boolean)true, mpegversion=(int)[ 1, 2 ]
++audio/mpeg, systemstream=(boolean)false, mpegversion=(int){ 2, 4 }
++video/mpeg, mpegversion=(int)[ 1, 2 ], systemstream=(boolean)false
++video/mpeg, mpegversion=(int){ 1, 2 }, systemstream=(boolean)false
++audio/x-raw-int, signed=(boolean)true, endianness=(int)1234, width=(int)16, depth=(int)16
++video/x-raw-yuv, format=(fourcc){ I420 }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]
++video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]
++audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 2 ], channels=(int)[ 1, 2 ], rate=(int)[ 8000, 96000 ]
++audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]
++video/x-raw-rgb, framerate=(double)[ 1, 100 ], width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ]
++video/x-dv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++image/jpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 1, 1.7976931348623157e+308 ]
++video/x-4xm, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-png, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-vp3, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-h264, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-jpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-theora, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-cinepak, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-huffyuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-gst_ff-flv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-gst_ff-smc, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-apple-video, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-gst_ff-8bps, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-gst_ff-asv1, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-gst_ff-asv2, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-gst_ff-cljr, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-gst_ff-cyuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-gst_ff-flic, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-gst_ff-mdec, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-gst_ff-mszh, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-gst_ff-vcr1, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-gst_ff-zlib, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-gst_ff-qtrle, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234, buffer-frames=(int)[ 1, 2147483647 ]
++audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)16000, channels=(int)1
++audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)44100, channels=(int)2
++video/x-gst_ff-xan_wc3, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-jpeg, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-jpeg, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-xvid, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-gst_ff-roqvideo, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-gst_ff-vmdvideo, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-gst_ff-vqavideo, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-gst_ff-idcinvideo, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-gst_ff-truemotion1, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++audio/x-raw-float, rate=(int)[ 11025, 48000 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)32, buffer-frames=(int)0
++video/x-gst_ff-interplayvideo, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-ffv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], ffvversion=(int)1
++video/x-svq, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], svqversion=(int)1
++video/x-wmv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], wmvversion=(int)1
++video/x-wmv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], wmvversion=(int)2
++audio/x-raw-int, depth=(int)16, width=(int)16, signed=(boolean)true, channels=(int)2, endianness=(int)1234, rate=(int)[ 4000, 48000 ]
++audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1000, 48000 ], channels=(int)1
++audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 8000, 96000 ], channels=(int)1
++audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)1
++audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)2, endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
++video/x-indeo, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], indeoversion=(int)3
++video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-msmpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], msmpegversion=(int)41
++video/x-msmpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], msmpegversion=(int)42
++video/x-msmpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], msmpegversion=(int)43
++audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1000, 48000 ], channels=(int)[ 1, 2 ]
++audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 4000, 48000 ], channels=(int)[ 1, 6 ]
++audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]
++audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 11025, 48000 ], channels=(int)[ 1, 2 ]
++audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int)1234, signed=(boolean)true, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]
++audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)44100, channels=(int)2, chunksize=(int)2352
++video/x-msvideocodec, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], msvideoversion=(int)1
++video/x-raw-yuv, format=(fourcc)I420, height=(int)[ 1, 2147483647 ], width=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-raw-yuv, format=(fourcc){ I420, YV12 }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int){ 32000, 44100, 48000 }, channels=(int)[ 1, 2 ]
++audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32, buffer-frames=(int)[ 0, 2147483647 ]
++video/mpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], mpegversion=(int)1, systemstream=(boolean)false
++video/mpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], mpegversion=(int)2, systemstream=(boolean)false
++video/mpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], systemstream=(boolean)false, mpegversion=(int)4
++video/x-rle, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], layout=(string)microsoft, depth=(int)[ 1, 64 ]
++audio/x-raw-int, rate=(int)44100, channels=(int)2, endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true, buffer-frames=(int)[ 1, 2147483647 ]
++video/x-raw-yuv, format=(fourcc){ YV12, I420, IYUV }, height=(int)[ 1, 2147483647 ], width=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]
++audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, signed=(boolean)true
++video/x-raw-yuv, format=(fourcc){ YUY2, I420, YV12, YUYV, UYVY }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ]
++video/x-pn-realvideo, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], systemstream=(boolean)false, rmversion=(int)1
++video/x-pn-realvideo, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], systemstream=(boolean)false, rmversion=(int)2
++video/x-raw-yuv, format=(fourcc){ I420, YV12, YUY2, YVYU, UYVY }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++audio/x-wma, wmaversion=(int)1, flags1=(int)[ -2147483648, 2147483647 ], flags2=(int)[ -2147483648, 2147483647 ], block_align=(int)[ 0, 2147483647 ], bitrate=(int)[ 0, 2147483647 ]
++audio/x-wma, wmaversion=(int)2, flags1=(int)[ -2147483648, 2147483647 ], flags2=(int)[ -2147483648, 2147483647 ], block_align=(int)[ 0, 2147483647 ], bitrate=(int)[ 0, 2147483647 ]
++video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double){ 23.976023976, 24, 25, 29.97002997, 30, 50, 59.94005994, 60 }
++audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }
++audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, signed=(boolean){ true, false }, buffer-frames=(int)[ 1, 2147483647 ]
++audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-mulaw, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]
++audio/mpeg, mpegversion=(int)1; audio/x-raw-int, endianness=(int)4321, signed=(boolean)true, width=(int){ 16, 20, 24 }, depth=(int){ 16, 20, 24 }, rate=(int){ 48000, 96000 }, channels=(int)[ 1, 8 ]; audio/x-ac3
++audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, signed=(boolean){ true, false }, buffer-frames=(int)[ 1, 2147483647 ]
++video/x-raw-rgb, framerate=(double)[ 1, 100 ], width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ]; video/x-raw-yuv, framerate=(double)[ 1, 100 ], width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ]
++video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 1, 60 ]
++video/mpeg, mpegversion=(int)1, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 1, 255 ], pixel_height=(int)[ 1, 255 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/mpeg, mpegversion=(int){ 1, 4 }, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double){ 23.976023976, 24, 25, 29.97002997, 30, 50, 59.94005994, 60 }
++video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)256, height=(int)128, framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++audio/x-raw-float, depth=(int)32, endianness=(int)1234, rate=(int)[ 11025, 48000 ], channels=(int)2; audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 11025, 48000 ], channels=(int)[ 1, 2 ]
++video/x-svq, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], svqversion=(int)3, halfpel_flag=(int)[ 0, 1 ], thirdpel_flag=(int)[ 0, 1 ], low_delay=(int)[ 0, 1 ], unknown_svq3_flag=(int)[ 0, 1 ]
++video/x-raw-rgb, depth=(int)24, bpp=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, height=(int)[ 1, 2147483647 ], width=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }; audio/x-alaw, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]
++audio/x-raw-int, endianess=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-raw-int, signed=(boolean)false, width=(int)8, depth=(int)8, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]
++audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-raw-int, signed=(boolean)false, width=(int)8, depth=(int)8, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]
++video/x-raw-yuv, format=(fourcc){ YV12, I420, Y42B }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 1, 255 ], pixel_height=(int)[ 1, 255 ], framerate=(double){ 23.976023976, 24, 25, 29.97002997, 30, 50, 59.94005994, 60 }
++audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 4000, 96000 ], channels=(int)1; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234, width=(int)32, buffer-frames=(int)[ 0, 2147483647 ]
++video/x-divx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], divxversion=(int)3; video/x-msmpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], msmpegversion=(int)43
++audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int){ 16, 24, 32 }, depth=(int){ 16, 24, 32 }, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 6 ]; audio/x-raw-float, endianness=(int)1234, depth=(int){ 32, 64 }, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 6 ]
++audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean){ true, false }; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234, width=(int)32, buffer-frames=(int)[ 0, 2147483647 ]
++audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int){ 8000, 11025, 22050, 44100 }, channels=(int)[ 1, 2 ]; audio/x-raw-int, signed=(boolean)false, width=(int)8, depth=(int)8, rate=(int){ 8000, 11025, 22050, 44100 }, channels=(int)[ 1, 2 ]
++audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32, buffer-frames=(int)[ 1, 2147483647 ]; audio/x-raw-int, channels=(int)[ 1, 2147483647 ], rate=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
++audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32, buffer-frames=(int)[ 0, 2147483647 ]
++audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234, buffer-frames=(int)[ 1, 2147483647 ]
++audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean){ true, false }; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int)1234, width=(int)32, buffer-frames=(int)[ 0, 2147483647 ]
++audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int)1234, width=(int)32, buffer-frames=(int)[ 0, 2147483647 ]
++image/png; image/jpeg; image/gif; image/x-icon; application/x-navi-animation; image/x-cmu-raster; image/x-sun-raster; image/x-pixmap; image/tiff; image/x-portable-anymap; image/x-portable-bitmap; image/x-portable-graymap; image/x-portable-pixmap; image/bmp; image/x-bmp; image/x-MS-bmp; image/vnd.wap.wbmp; image/x-bitmap; image/x-tga
++audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 8, 16, 32 }, depth=(int)[ 1, 32 ], signed=(boolean){ true, false }; audio/x-raw-float, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], endianness=(int){ 1234, 4321 }, width=(int){ 32, 64 }, buffer-frames=(int)[ 1, 2147483647 ]
++audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-vorbis, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-ac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]
++audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)1, layer=(int){ 1, 3 }, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-vorbis, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-ac3, rate=(int)[ 1000, 96000 ], channels=(int)[ 1, 2 ]
++audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], channels=(int)[ 1, 8 ], rate=(int)[ 8000, 96000 ]; audio/mpeg, mpegversion=(int){ 2, 4 }, channels=(int)[ 1, 8 ], rate=(int)[ 8000, 96000 ]; audio/x-ac3, channels=(int)[ 1, 8 ], rate=(int)[ 8000, 96000 ]; audio/x-raw-int, width=(int){ 8, 16, 24 }, depth=(int){ 8, 16, 24 }, endianness=(int){ 4321, 1234 }, signed=(boolean){ true, false }, channels=(int)[ 1, 8 ], rate=(int)[ 8000, 96000 ]
++video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/mpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], mpegversion=(int)4, systemstream=(boolean)false; video/x-3ivx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-divx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], divxversion=(int)[ 4, 5 ]; video/x-xvid, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-raw-yuv, format=(fourcc)YUY2, width=(int)720, height=(int){ 480, 576 }, framerate=(double){ 25, 29.97002997 }; video/x-raw-rgb, bpp=(int)32, depth=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)720, height=(int){ 480, 576 }, framerate=(double){ 25, 29.97002997 }; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)720, height=(int){ 480, 576 }, framerate=(double){ 25, 29.97002997 }
++audio/mpeg, mpegversion=(int)1, layer=(int){ 3, 2 }, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-ac3, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)microsoft, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-alaw, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-mulaw, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-vorbis, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]
++audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-alaw, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-mulaw, rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)microsoft, block_align=(int)[ 1, 8192 ], rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]; audio/x-adpcm, layout=(string)dvi, block_align=(int)[ 1, 8192 ], rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ]
++video/x-raw-rgb, depth=(int)24, bpp=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, height=(int)[ 1, 2147483647 ], width=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, depth=(int)24, bpp=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, height=(int)[ 1, 2147483647 ], width=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-yuv, format=(fourcc)I420, height=(int)[ 1, 2147483647 ], width=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++audio/mpeg, mpegversion=(int)1, layer=(int){ 3, 2 }, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-ac3, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-raw-int, endianness=(int)1234, signed=(boolean){ true, false }, width=(int){ 8, 16 }, depth=(int){ 8, 16 }, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-vorbis, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-wma, wmaversion=(int){ 1, 2 }, flags1=(int)[ -2147483648, 2147483647 ], flags2=(int)[ -2147483648, 2147483647 ], block_align=(int)[ 0, 2147483647 ], bitrate=(int)[ 0, 2147483647 ], rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]; audio/x-wma, wmaversion=(int)9, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 2 ]
++audio/mpeg, mpegversion=(int)1, layer=(int){ 3, 2 }; audio/x-ac3; audio/x-adpcm, layout=(string){ g726, ea, adx, xa, 4xm, microsoft, smjpeg, westwood, dk4, dk3, dvi, quicktime }; audio/x-alaw; audio/x-dpcm, layout=(string){ roq, interplay, xan }; audio/x-gst_ff-vmdaudio; audio/x-mace, maceversion=(int){ 3, 6 }; audio/x-mulaw; audio/x-pn-realaudio, raversion=(int){ 1, 2 }; audio/x-raw-int, width=(int)16, depth=(int)16, endianness=(int){ 4321, 1234 }, signed=(boolean){ false, true }; audio/x-raw-int, width=(int)8, depth=(int)8, endianness=(int)1234, signed=(boolean){ false, true }; audio/x-wma, wmaversion=(int){ 1, 2 }, flags1=(int)[ -2147483648, 2147483647 ], flags2=(int)[ -2147483648, 2147483647 ], block_align=(int)[ 0, 2147483647 ], bitrate=(int)[ 0, 2147483647 ]
++video/mpeg, mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-divx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-xvid, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-msmpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-jpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-yuv, format=(fourcc){ YUY2, I420 }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-raw-yuv, format=(fourcc){ YUY2, I420 }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; image/jpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-divx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], divxversion=(int)[ 3, 5 ]; video/x-xvid, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-3ivx, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-msmpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], msmpegversion=(int)[ 41, 43 ]; video/mpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], mpegversion=(int)1, systemstream=(boolean)false; video/x-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-dv, width=(int)720, height=(int){ 576, 480 }, systemstream=(boolean)false; video/x-huffyuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]
++audio/mpeg, mpegversion=(int)1, layer=(int){ 1, 2, 3 }, channels=(int)[ 1, 6 ], rate=(int)[ 4000, 96000 ]; audio/mpeg, mpegversion=(int){ 2, 4 }, channels=(int)[ 1, 6 ], rate=(int)[ 4000, 96000 ]; audio/x-ac3, channels=(int)[ 1, 6 ], rate=(int)[ 4000, 96000 ]; audio/x-adpcm, layout=(string)microsoft, rate=(int)[ 4000, 96000 ], channels=(int)[ 1, 6 ]; audio/x-alaw, rate=(int)[ 4000, 96000 ], channels=(int)[ 1, 6 ]; audio/x-mulaw, rate=(int)[ 4000, 96000 ], channels=(int)[ 1, 6 ]; audio/x-raw-float, endianness=(int)1234, buffer-frames=(int)[ 1, 2147483647 ], width=(int)[ 32, 64 ], channels=(int)[ 1, 6 ], rate=(int)[ 4000, 96000 ]; audio/x-raw-int, signed=(boolean){ true, false }, depth=(int){ 8, 16 }, width=(int){ 8, 16 }, endianness=(int){ 4321, 1234 }, channels=(int)[ 1, 6 ], rate=(int)[ 4000, 96000 ]; audio/x-vorbis, rate=(int)[ 4000, 96000 ], channels=(int)[ 1, 6 ]
++video/x-raw-yuv, format=(fourcc){ YUY2, I420 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-jpeg, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-divx, divxversion=(int)[ 3, 5 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-xvid, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-3ivx, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-msmpeg, msmpegversion=(int)[ 41, 43 ], width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/mpeg, mpegversion=(int)1, systemstream=(boolean)false, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-h263, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]; video/x-dv, systemstream=(boolean)false, width=(int)720, height=(int){ 576, 480 }; video/x-huffyuv, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ]
++video/x-divx, divxversion=(int){ 3, 5 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(double)[ 25, 1.7976931348623157e+308 ]; video/x-dv, systemstream=(boolean)false, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(double)[ 25, 1.7976931348623157e+308 ]; video/x-jpeg, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(double)[ 25, 1.7976931348623157e+308 ]; video/x-msmpeg, msmpegversion=(int){ 41, 42, 43 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(double)[ 25, 1.7976931348623157e+308 ]; video/x-raw-yuv, format=(fourcc){ I420, YUY2 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(double)[ 25, 1.7976931348623157e+308 ]; video/x-wmv, wmvversion=(int){ 1, 2 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(double)[ 25, 1.7976931348623157e+308 ]
++video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-raw-rgb, depth=(int)24, bpp=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, height=(int)[ 1, 2147483647 ], width=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, depth=(int)24, bpp=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, height=(int)[ 1, 2147483647 ], width=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, depth=(int)24, bpp=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, height=(int)[ 1, 2147483647 ], width=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, depth=(int)24, bpp=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, height=(int)[ 1, 2147483647 ], width=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++audio/x-alaw, rate=(int)[ 8000, 192000 ], channels=(int)1; audio/x-mulaw, rate=(int)[ 8000, 192000 ], channels=(int)1; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 8000, 192000 ], channels=(int)1; audio/x-raw-int, width=(int)16, depth=(int)16, signed=(boolean){ false, true }, endianness=(int){ 1234, 4321 }, rate=(int)[ 8000, 192000 ], channels=(int)1; audio/x-raw-int, width=(int)32, depth=(int)24, signed=(boolean){ false, true }, endianness=(int){ 1234, 4321 }, rate=(int)[ 8000, 192000 ], channels=(int)1; audio/x-raw-int, width=(int)32, depth=(int)32, signed=(boolean){ false, true }, endianness=(int){ 1234, 4321 }, rate=(int)[ 8000, 192000 ], channels=(int)1; audio/x-raw-int, width=(int)24, depth=(int)24, signed=(boolean){ false, true }, endianness=(int){ 1234, 4321 }, rate=(int)[ 8000, 192000 ], channels=(int)1; audio/x-raw-int, width=(int)24, depth=(int)20, signed=(boolean){ false, true }, endianness=(int){ 1234, 4321 }, rate=(int)[ 8000, 192000 ], channels=(int)1; audio/x-raw-int, width=(int)24, depth=(int)18, signed=(boolean){ false, true }, endianness=(int){ 1234, 4321 }, rate=(int)[ 8000, 192000 ], channels=(int)1; audio/x-raw-int, width=(int)8, depth=(int)8, signed=(boolean){ true, false }, rate=(int)[ 8000, 192000 ], channels=(int)1
++video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], bpp=(int)24, depth=(int)24, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, endianness=(int)4321; video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], bpp=(int)24, depth=(int)24, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, endianness=(int)4321; video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], bpp=(int)32, depth=(int)24, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, endianness=(int)4321; video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], bpp=(int)16, depth=(int)16, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, endianness=(int)1234; video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], bpp=(int)16, depth=(int)15, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, endianness=(int)1234; video/x-raw-yuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], format=(fourcc){ I420, YUY2, Y42B, YUV9, Y41B }
++audio/x-alaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 32 ]; audio/x-mulaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 32 ]; audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, width=(int)16, depth=(int)16, signed=(boolean){ false, true }, endianness=(int){ 1234, 4321 }, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, width=(int)32, depth=(int)24, signed=(boolean){ false, true }, endianness=(int){ 1234, 4321 }, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, width=(int)32, depth=(int)32, signed=(boolean){ false, true }, endianness=(int){ 1234, 4321 }, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, width=(int)24, depth=(int)24, signed=(boolean){ false, true }, endianness=(int){ 1234, 4321 }, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, width=(int)24, depth=(int)20, signed=(boolean){ false, true }, endianness=(int){ 1234, 4321 }, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, width=(int)24, depth=(int)18, signed=(boolean){ false, true }, endianness=(int){ 1234, 4321 }, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 32 ]; audio/x-raw-int, width=(int)8, depth=(int)8, signed=(boolean){ true, false }, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 32 ]
++video/x-raw-rgb, bpp=(int){ 32, 24 }, endianness=(int)4321, depth=(int)24, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int){ 32, 24 }, endianness=(int)4321, depth=(int)24, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)32, endianness=(int)4321, depth=(int)24, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)32, endianness=(int)4321, depth=(int)24, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)16, endianness=(int)1234, depth=(int)16, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)16, endianness=(int)1234, depth=(int)15, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-yuv, format=(fourcc){ YUY2, UYVY, Y422, UYNV, YVYU, IYU2, YVU9, YUV9, YV12, I420, Y800 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-raw-rgb, depth=(int)24, bpp=(int){ 32, 24 }, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 100, 2147483647 ], height=(int)[ 100, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, depth=(int)24, bpp=(int){ 32, 24 }, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 100, 2147483647 ], height=(int)[ 100, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, depth=(int)24, bpp=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 100, 2147483647 ], height=(int)[ 100, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, depth=(int)24, bpp=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 100, 2147483647 ], height=(int)[ 100, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, depth=(int)16, bpp=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 100, 2147483647 ], height=(int)[ 100, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, depth=(int)15, bpp=(int)16, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 100, 2147483647 ], height=(int)[ 100, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-yuv, format=(fourcc){ YUY2, UYVY, Y422, UYNV, YVYU, YV12, I420, Y800 }, width=(int)[ 100, 2147483647 ], height=(int)[ 100, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-dv, systemstream=(boolean)true, width=(int)[ 1, 4096 ], height=(int)[ 1, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-jpeg, width=(int)[ 1, 4096 ], height=(int)[ 1, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)8, depth=(int)8, red_mask=(int)224, green_mask=(int)28, blue_mask=(int)3, endianness=(int)1234, width=(int)[ 1, 4096 ], height=(int)[ 1, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)15, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, endianness=(int){ 1234, 4321 }, width=(int)[ 1, 4096 ], height=(int)[ 1, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, endianness=(int)4321, width=(int)[ 1, 4096 ], height=(int)[ 1, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, endianness=(int)4321, width=(int)[ 1, 4096 ], height=(int)[ 1, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, endianness=(int)4321, width=(int)[ 1, 4096 ], height=(int)[ 1, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)32, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, endianness=(int)4321, width=(int)[ 1, 4096 ], height=(int)[ 1, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-yuv, format=(fourcc){ YVU9, YV12, YUY2, UYVY, Y42B, Y41B, Y41P, YUV9, I420 }, width=(int)[ 1, 4096 ], height=(int)[ 1, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-raw-yuv, format=(fourcc){ I420, YUY2, YV12, YVYU, UYVY }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], depth=(int)24, bpp=(int)32, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255; video/x-raw-rgb, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], depth=(int)24, bpp=(int)32, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280; video/x-raw-rgb, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], depth=(int)24, bpp=(int)32, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216; video/x-raw-rgb, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], depth=(int)24, bpp=(int)32, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680; video/x-raw-rgb, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], depth=(int)24, bpp=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680; video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++image/jpeg, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/mpeg, systemstream=(boolean)false, mpegversion=(int)1, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-3ivx, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-cinepak, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-divx, divxversion=(int){ 3, 4 }, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-dv, systemstream=(boolean)false, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-h263, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-huffyuv, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-msmpeg, msmpegversion=(int){ 41, 42, 43 }, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-msvideocodec, msvideoversion=(int)1, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-raw-yuv, format=(fourcc){ I420, YUY2 }, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-rle, layout=(string)microsoft, depth=(int)[ 1, 64 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-wmv, wmvversion=(int){ 1, 2 }, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]; video/x-xvid, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ]
++video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)24, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)-16777216, green_mask=(int)16711680, blue_mask=(int)65280, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)32, depth=(int)24, endianness=(int)4321, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)16, endianness=(int)1234, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-rgb, bpp=(int)16, depth=(int)15, endianness=(int)1234, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-raw-yuv, format=(fourcc){ I420, YV12, YUY2, YVYU, UYVY, YUV9, YVU9, Y800, Y41P, Y41B, Y42B, IUY2 }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]
++image/jpeg, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 0, 255 ], pixel_height=(int)[ 0, 255 ]; video/mpeg, mpegversion=(int){ 4, 2, 1 }, systemstream=(boolean)false, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 0, 255 ], pixel_height=(int)[ 0, 255 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-3ivx, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 0, 255 ], pixel_height=(int)[ 0, 255 ]; video/x-cinepak, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 0, 255 ], pixel_height=(int)[ 0, 255 ]; video/x-divx, divxversion=(int){ 5, 4, 3 }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 0, 255 ], pixel_height=(int)[ 0, 255 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-dv, systemstream=(boolean)false, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 0, 255 ], pixel_height=(int)[ 0, 255 ]; video/x-h263, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 0, 255 ], pixel_height=(int)[ 0, 255 ]; video/x-huffyuv, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 0, 255 ], pixel_height=(int)[ 0, 255 ]; video/x-jpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 0, 255 ], pixel_height=(int)[ 0, 255 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-msmpeg, msmpegversion=(int){ 41, 42, 43 }, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 0, 255 ], pixel_height=(int)[ 0, 255 ]; video/x-msvideocodec, msvideoversion=(int)1, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 0, 255 ], pixel_height=(int)[ 0, 255 ]; video/x-raw-yuv, format=(fourcc){ YV12, YUY2, I420 }, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 0, 255 ], pixel_height=(int)[ 0, 255 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-rle, layout=(string)microsoft, depth=(int)[ 1, 64 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 0, 255 ], pixel_height=(int)[ 0, 255 ]; video/x-wmv, wmvversion=(int){ 1, 2 }, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 0, 255 ], pixel_height=(int)[ 0, 255 ]; video/x-xvid, framerate=(double)[ 0, 1.7976931348623157e+308 ], width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], pixel_width=(int)[ 0, 255 ], pixel_height=(int)[ 0, 255 ]
++video/x-dv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/mpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false; video/x-4xm, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-apple-video, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-cinepak, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-ffv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], ffvversion=(int)1; video/x-gst_ff-8bps, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-gst_ff-asv1, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-gst_ff-asv2, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-gst_ff-cljr, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-gst_ff-cyuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-gst_ff-flic, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-gst_ff-flv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-gst_ff-idcinvideo, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-gst_ff-interplayvideo, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-gst_ff-mdec, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-gst_ff-mszh, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-gst_ff-qtrle, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-gst_ff-roqvideo, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-gst_ff-smc, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-gst_ff-truemotion1, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-gst_ff-vcr1, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-gst_ff-vmdvideo, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-gst_ff-vqavideo, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-gst_ff-xan_wc3, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-gst_ff-zlib, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-h263, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-h264, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-huffyuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-indeo, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], indeoversion=(int)3; video/x-jpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-msmpeg, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], msmpegversion=(int){ 41, 42, 43 }; video/x-msvideocodec, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], msvideoversion=(int)1; video/x-pn-realvideo, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], systemstream=(boolean)false, rmversion=(int){ 2, 1 }; video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], bpp=(int)24, depth=(int)24, red_mask=(int)16711680, green_mask=(int)65280, blue_mask=(int)255, endianness=(int)4321; video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], bpp=(int)24, depth=(int)24, red_mask=(int)255, green_mask=(int)65280, blue_mask=(int)16711680, endianness=(int)4321; video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], bpp=(int)32, depth=(int)24, red_mask=(int)65280, green_mask=(int)16711680, blue_mask=(int)-16777216, endianness=(int)4321; video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], bpp=(int)16, depth=(int)16, red_mask=(int)63488, green_mask=(int)2016, blue_mask=(int)31, endianness=(int)1234; video/x-raw-rgb, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], bpp=(int)16, depth=(int)15, red_mask=(int)31744, green_mask=(int)992, blue_mask=(int)31, endianness=(int)1234; video/x-raw-yuv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], format=(fourcc){ I420, YUY2, Y42B, YUV9, Y41B }; video/x-rle, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], layout=(string)microsoft, depth=(int)[ 1, 64 ]; video/x-svq, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], svqversion=(int)3, halfpel_flag=(int)[ 0, 1 ], thirdpel_flag=(int)[ 0, 1 ], low_delay=(int)[ 0, 1 ], unknown_svq3_flag=(int)[ 0, 1 ]; video/x-svq, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], svqversion=(int)1; video/x-theora, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-vp3, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ]; video/x-wmv, width=(int)[ 16, 4096 ], height=(int)[ 16, 4096 ], framerate=(double)[ 0, 1.7976931348623157e+308 ], wmvversion=(int){ 1, 2 }
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/compatibility.c gstreamer-0.10.23/tests/old/testsuite/caps/compatibility.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/compatibility.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/compatibility.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,93 @@
++#include <gst/gst.h>
++
++/* these caps all have a non empty intersection */
++GstStaticCaps sinkcaps = GST_STATIC_CAPS ("video/mpeg, " "mpegtype=(int)[1,2]");
++
++GstStaticCaps mp1parsecaps = GST_STATIC_CAPS ("video/mpeg, " "mpegtype=(int)1");
++
++GstStaticCaps rawcaps = GST_STATIC_CAPS ("video/raw, "
++ "fourcc=(fourcc){YV12,YUY2}, "
++ "width=(int)[16,4096], " "height=(int)[16,4096]");
++
++GstStaticCaps rawcaps2 = GST_STATIC_CAPS ("video/raw, "
++ "fourcc=(fourcc)YUY2, " "height=(int)[16,256]");
++
++GstStaticCaps rawcaps3 = GST_STATIC_CAPS ("video/raw, "
++ "fourcc=(fourcc){YV12,YUY2}, " "height=(int)[16,4096]");
++
++#if 0
++/* these caps aren't used yet */
++GstStaticCaps rawcaps4 = GST_STATIC_CAPS ("video/raw, "
++ "fourcc=(fourcc){\"YV12\", \"YUYV\"}, " "height=(int)[16,4096]");
++
++GstStaticCaps rawcaps4 = GST_STATIC_CAPS ("video/raw, "
++ "fourcc=(fourcc){\"YUYV\", \"YUY2\"}, " "height=(int)[16,4096]");
++#endif
++
++GstStaticCaps rawcaps6 = GST_STATIC_CAPS ("video/raw, "
++ "format=(fourcc)\"I420\"; " "video/raw, " "format=(fourcc)\"YUYV\"");
++
++GstStaticCaps rawcaps7 = GST_STATIC_CAPS ("video/raw, "
++ "format=(fourcc)\"I420\"; " "video/raw, " "format=(fourcc)\"YV12\"");
++
++
++int
++main (int argc, char *argv[])
++{
++ gboolean testret;
++ gint ret = 0;
++
++ gst_init (&argc, &argv);
++
++ testret = gst_caps_is_always_compatible (gst_static_caps_get (&mp1parsecaps),
++ gst_static_caps_get (&rawcaps));
++ g_print ("4 <-> 2 == %d (invalid, wrong major type)\n", testret);
++ ret = ret + (testret == FALSE) ? 0 : 1;
++
++ testret = gst_caps_is_always_compatible (gst_static_caps_get (&mp1parsecaps),
++ gst_static_caps_get (&sinkcaps));
++ g_print ("4 <-> 1 == %d (valid, subset)\n", testret);
++ ret = ret + (testret == TRUE) ? 0 : 1;
++
++ testret = gst_caps_is_always_compatible (gst_static_caps_get (&sinkcaps),
++ gst_static_caps_get (&mp1parsecaps));
++ g_print ("1 <-> 4 == %d (invalid, superset)\n", testret);
++ ret = ret + (testret == FALSE) ? 0 : 1;
++
++ testret = gst_caps_is_always_compatible (gst_static_caps_get (&rawcaps),
++ gst_static_caps_get (&rawcaps2));
++ g_print ("2 <-> 3 == %d (invalid, ranges)\n", testret);
++ ret = ret + (testret == FALSE) ? 0 : 1;
++
++ testret = gst_caps_is_always_compatible (gst_static_caps_get (&rawcaps),
++ gst_static_caps_get (&rawcaps3));
++ g_print ("2 <-> 5 == %d (valid)\n", testret);
++ ret = ret + (testret == TRUE) ? 0 : 1;
++
++ testret = gst_caps_is_always_compatible (gst_static_caps_get (&rawcaps3),
++ gst_static_caps_get (&rawcaps));
++ g_print ("5 <-> 2 == %d (invalid)\n", testret);
++ ret = ret + (testret == FALSE) ? 0 : 1;
++
++ testret = gst_caps_is_always_compatible (gst_static_caps_get (&rawcaps2),
++ gst_static_caps_get (&rawcaps3));
++ g_print ("3 <-> 5 == %d (valid)\n", testret);
++ ret = ret + (testret == TRUE) ? 0 : 1;
++
++ testret = gst_caps_is_always_compatible (gst_static_caps_get (&rawcaps2),
++ gst_static_caps_get (&rawcaps));
++ g_print ("3 <-> 2 == %d (invalid, property missing in source)\n", testret);
++ ret = ret + (testret == FALSE) ? 0 : 1;
++
++ testret = gst_caps_is_always_compatible (gst_static_caps_get (&rawcaps),
++ gst_static_caps_get (&rawcaps));
++ g_print ("2 <-> 2 == %d (valid, same caps)\n", testret);
++ ret = ret + (testret == TRUE) ? 0 : 1;
++
++ testret = gst_caps_is_always_compatible (gst_static_caps_get (&rawcaps6),
++ gst_static_caps_get (&rawcaps7));
++ g_print ("6 <-> 7 == %d (invalid, second caps doesn't fit)\n", testret);
++ ret = ret + (testret == FALSE) ? 0 : 1;
++
++ return ret;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/deserialize.c gstreamer-0.10.23/tests/old/testsuite/caps/deserialize.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/deserialize.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/deserialize.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,85 @@
++
++#include <gst/gst.h>
++#include <string.h>
++
++/* The caps_strings file is created using:
++ *
++ * grep '^.caps' /home/ds/.gstreamer-0.8/registry.xml | \
++ * sed 's/^.caps.\(.*\)..caps.$/\1/' | awk '{print length($ln) " " $ln; }' | \
++ * sort -n | uniq | sed 's/^[^ ]* //' >caps_strings
++ *
++ */
++
++
++int
++main (int argc, char *argv[])
++{
++ char *filename;
++ char *data;
++ char **list;
++ int i;
++ guint length;
++ GstCaps *caps;
++
++ gst_init (&argc, &argv);
++
++ if (argc > 1) {
++ filename = g_strdup (argv[1]);
++ } else {
++ const char *srcdir = g_getenv ("srcdir");
++
++ if (srcdir) {
++ filename = g_build_filename (srcdir, "caps_strings", NULL);
++ } else {
++ filename = g_strdup ("caps_strings");
++ }
++ }
++
++ if (!g_file_get_contents (filename, &data, &length, NULL)) {
++ g_print ("could not open file %s\n", filename);
++ abort ();
++ }
++
++ list = g_strsplit (data, "\n", 0);
++
++ for (i = 0; list[i] != NULL; i++) {
++ if (list[i][0] == 0) {
++ g_free (list[i]);
++ continue;
++ }
++
++ caps = gst_caps_from_string (list[i]);
++ if (caps == NULL) {
++ char **list2;
++ int j;
++
++ g_print ("Could not parse: %s\n", list[i]);
++ g_print ("Trying each structure...\n");
++
++ list2 = g_strsplit (list[i], ";", 0);
++
++ for (j = 0; list2[j] != NULL; j++) {
++ caps = gst_caps_from_string (list2[j]);
++
++ if (caps == NULL) {
++ g_print ("Could not parse %s\n", list2[j]);
++ abort ();
++ }
++
++ gst_caps_unref (caps);
++ }
++
++ g_print ("parsed each structure individually\n");
++ abort ();
++ }
++
++ gst_caps_unref (caps);
++ g_free (list[i]);
++ }
++
++ g_free (list);
++ g_free (data);
++ g_free (filename);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/enumcaps.c gstreamer-0.10.23/tests/old/testsuite/caps/enumcaps.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/enumcaps.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/enumcaps.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,95 @@
++/* GStreamer test
++ * (c) 2004 Ronald Bultje <rbultje@ronald.bitfreak.net>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#ifdef HAVE_CONFIG_H
++#include <config.h>
++#endif
++
++#include <gst/gst.h>
++
++typedef enum
++{
++ TEST_YES,
++ TEST_NO
++}
++TestBool;
++
++#define TEST_BOOL_TYPE (test_bool_get_type ())
++GType
++test_bool_get_type (void)
++{
++ static GType etype = 0;
++
++ if (etype == 0) {
++ static const GEnumValue values[] = {
++ {TEST_YES, "TEST_YES", "yes"},
++ {TEST_NO, "TEST_NO", "no"},
++ {0, NULL, NULL}
++ };
++
++ etype = g_enum_register_static ("TestBool", values);
++ }
++ return etype;
++}
++
++gint
++main (gint argc, gchar * argv[])
++{
++ gchar *str;
++ GstCaps *caps, *res_caps;
++ GstStructure *strc;
++ GValue value = { 0 };
++ TestBool yes, no;
++
++ /* register multichannel type */
++ gst_init (&argc, &argv);
++ test_bool_get_type ();
++
++ /* test some caps */
++ caps = gst_caps_new_simple ("application/x-gst-test", NULL);
++ str = gst_caps_to_string (caps);
++ g_assert (str);
++ g_free (str);
++
++ /* set enums in list */
++ strc = gst_caps_get_structure (caps, 0);
++ g_value_init (&value, TEST_BOOL_TYPE);
++ g_value_set_enum (&value, TEST_YES);
++ gst_structure_set_value (strc, "yes", &value);
++ g_value_set_enum (&value, TEST_NO);
++ gst_structure_set_value (strc, "no", &value);
++ g_value_unset (&value);
++
++ /* test to-/from-string conversions for enums */
++ str = gst_caps_to_string (caps);
++ g_assert (str);
++ res_caps = gst_caps_from_string (str);
++ g_free (str);
++
++ /* see if all worked */
++ strc = gst_caps_get_structure (res_caps, 0);
++ yes = g_value_get_enum (gst_structure_get_value (strc, "yes"));
++ no = g_value_get_enum (gst_structure_get_value (strc, "no"));
++ g_assert (yes == TEST_YES && no == TEST_NO);
++ gst_caps_unref (caps);
++ gst_caps_unref (res_caps);
++
++ /* yes */
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/eratosthenes.c gstreamer-0.10.23/tests/old/testsuite/caps/eratosthenes.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/eratosthenes.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/eratosthenes.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,71 @@
++/*
++ * Copyright (C) 2004 Benjamin Otte <in7y118@public.uni-hamburg.de>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <gst/gst.h>
++#include <stdlib.h>
++
++#define MAX_SIEVE 20
++
++static void
++eratosthenes (GValue * sieve, gboolean up, int size)
++{
++ guint i, j;
++ GValue temp = { 0, };
++ GValue list = { 0, };
++
++ g_value_init (sieve, GST_TYPE_INT_RANGE);
++ gst_value_set_int_range (sieve, 2, size * size);
++ for (i = up ? 2 : size; up ? (i <= size) : (i >= 2); i += up ? 1 : -1) {
++ g_value_init (&list, GST_TYPE_LIST);
++ for (j = 2 * i; j <= size * size; j += i) {
++ GValue v = { 0, };
++
++ g_value_init (&v, G_TYPE_INT);
++ g_value_set_int (&v, j);
++ gst_value_list_append_value (&list, &v);
++ g_value_unset (&v);
++ }
++ gst_value_subtract (&temp, sieve, &list);
++ g_value_unset (sieve);
++ gst_value_init_and_copy (sieve, &temp);
++ g_value_unset (&temp);
++ g_value_unset (&list);
++ /* g_print ("%2u: %s\n", i, gst_value_serialize (sieve)); */
++ }
++
++ g_print ("%s\n", gst_value_serialize (sieve));
++}
++
++gint
++main (gint argc, gchar ** argv)
++{
++ GValue up = { 0, };
++ GValue down = { 0, };
++ guint size = MAX_SIEVE;
++
++ gst_init (&argc, &argv);
++
++ if (argc > 1)
++ size = atol (argv[1]);
++
++ eratosthenes (&up, TRUE, size);
++ eratosthenes (&down, FALSE, size);
++
++ g_assert (gst_value_compare (&up, &down) == GST_VALUE_EQUAL);
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/filtercaps.c gstreamer-0.10.23/tests/old/testsuite/caps/filtercaps.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/filtercaps.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/filtercaps.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,49 @@
++/*
++ * Copyright (C) 2004 Benjamin Otte <in7y118@public.uni-hamburg.de>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <gst/gst.h>
++
++gint
++main (gint argc, gchar ** argv)
++{
++ GstCaps *caps;
++ GstElement *sink, *identity;
++ GstElement *pipeline;
++
++ gst_init (&argc, &argv);
++
++ pipeline = gst_pipeline_new ("pipeline");
++ g_assert (pipeline);
++ identity = gst_element_factory_make ("identity", NULL);
++ g_assert (identity);
++ sink = gst_element_factory_make ("fakesink", NULL);
++ g_assert (sink);
++ gst_bin_add_many (GST_BIN (pipeline), identity, sink, NULL);
++ gst_element_link_filtered (identity, sink,
++ gst_caps_new_simple ("audio/x-raw-int", NULL));
++ caps = gst_pad_get_caps (gst_element_get_pad (identity, "sink"));
++ g_print ("caps: %s\n", gst_caps_to_string (caps));
++ g_assert (!gst_caps_is_any (caps));
++
++ caps = gst_pad_get_allowed_caps (gst_element_get_pad (identity, "sink"));
++ g_print ("allowed caps: %s\n", gst_caps_to_string (caps));
++ /* get_allowed_caps doesn't mean anything if you aren't connected */
++ g_assert (!caps);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/fixed.c gstreamer-0.10.23/tests/old/testsuite/caps/fixed.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/fixed.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/fixed.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,82 @@
++/* GStreamer
++ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#include <gst/gst.h>
++
++gint
++main (gint argc, gchar * argv[])
++{
++#if 0
++ GstCaps *caps;
++
++ gst_init (&argc, &argv);
++
++ caps = GST_CAPS_NEW ("testcaps", "unknown/unknown", NULL);
++
++ /* newly crrated caps without props is fixed */
++ g_assert (GST_CAPS_IS_FIXED (caps));
++
++ entry = gst_props_entry_new ("foo", GST_PROPS_INT (5));
++ /* this entry is fixed */
++ g_assert (gst_props_entry_is_fixed (entry));
++
++ props = gst_props_empty_new ();
++ /* props are fixed when created */
++ g_assert (GST_PROPS_IS_FIXED (props));
++
++ gst_props_add_entry (props, entry);
++ /* props should still be fixed */
++ g_assert (GST_PROPS_IS_FIXED (props));
++
++ gst_caps_set_props (caps, props);
++ /* caps should still be fixed */
++ g_assert (GST_CAPS_IS_FIXED (caps));
++
++ entry = gst_props_entry_new ("bar", GST_PROPS_INT_RANGE (1, 5));
++ /* this entry is variable */
++ g_assert (!gst_props_entry_is_fixed (entry));
++
++ gst_props_add_entry (props, entry);
++ /* props should be variable now */
++ g_assert (!GST_PROPS_IS_FIXED (props));
++ /* caps too */
++ g_assert (!GST_CAPS_IS_FIXED (caps));
++
++ gst_props_remove_entry_by_name (props, "bar");
++ /* props should be fixed again now */
++ g_assert (GST_PROPS_IS_FIXED (props));
++ /* caps too */
++ g_assert (GST_CAPS_IS_FIXED (caps));
++
++ gst_props_set (props, "foo", GST_PROPS_INT_RANGE (1, 5));
++ /* props should be variable again now */
++ g_assert (!GST_PROPS_IS_FIXED (props));
++ /* caps too */
++ g_assert (!GST_CAPS_IS_FIXED (caps));
++
++ gst_props_set (props, "foo", GST_PROPS_INT (5));
++ /* props should be fixed again now */
++ g_assert (GST_PROPS_IS_FIXED (props));
++ /* caps too */
++ g_assert (GST_CAPS_IS_FIXED (caps));
++
++#endif
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/fraction-convert.c gstreamer-0.10.23/tests/old/testsuite/caps/fraction-convert.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/fraction-convert.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/fraction-convert.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,139 @@
++/* GStreamer
++ *
++ * fraction-convert.c: test for GstFraction transform
++ *
++ * Copyright (C) <2004> Thomas Vander Stichele <thomas at apestaart dot org>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#include <math.h>
++#include <gst/gst.h>
++#include <glib.h>
++
++static void
++check_from_double_convert (gdouble value, gint num, gint denom, gdouble prec)
++{
++ GValue value1 = { 0 };
++ GValue value2 = { 0 };
++ gdouble check;
++ gint res_num, res_denom;
++
++ g_value_init (&value1, G_TYPE_DOUBLE);
++ g_value_init (&value2, GST_TYPE_FRACTION);
++
++ g_value_set_double (&value1, value);
++ g_value_transform (&value1, &value2);
++ g_print ("%s = %s ? (expected: %d/%d )\n",
++ gst_value_serialize (&value1), gst_value_serialize (&value2), num, denom);
++
++ res_num = gst_value_get_fraction_numerator (&value2);
++ res_denom = gst_value_get_fraction_denominator (&value2);
++ if (res_num == num && res_denom == denom) {
++ g_print ("best conversion.\n");
++ } else {
++ if (fabs (value - res_num / (gdouble) res_denom) <= prec) {
++ g_print ("acceptable suboptimal conversion.\n");
++ } else {
++ g_print ("unacceptable suboptimal conversion.\n");
++ g_assert_not_reached ();
++ }
++ }
++ g_value_transform (&value2, &value1);
++ g_print ("%s = %s\n",
++ gst_value_serialize (&value2), gst_value_serialize (&value1));
++ check = g_value_get_double (&value1);
++ g_assert (fabs (value - check) <= prec);
++}
++
++static void
++check_from_fraction_convert (gint num, gint denom, gdouble prec)
++{
++ GValue value1 = { 0 };
++ GValue value2 = { 0 };
++ gdouble value;
++ gint res_num, res_denom;
++
++ g_value_init (&value1, GST_TYPE_FRACTION);
++ g_value_init (&value2, G_TYPE_DOUBLE);
++
++ gst_value_set_fraction (&value1, num, denom);
++ g_value_transform (&value1, &value2);
++
++ value = g_value_get_double (&value2);
++ g_assert (fabs (value - ((gdouble) num) / denom) < prec);
++
++ g_print ("%s = %s, %2.50lf as double\n",
++ gst_value_serialize (&value1), gst_value_serialize (&value2), value);
++
++ g_value_transform (&value2, &value1);
++ g_print ("%s = %s ? (expected: %d/%d )\n",
++ gst_value_serialize (&value2), gst_value_serialize (&value1), num, denom);
++ value = g_value_get_double (&value2);
++
++ res_num = gst_value_get_fraction_numerator (&value1);
++ res_denom = gst_value_get_fraction_denominator (&value1);
++ if (res_num == num && res_denom == denom) {
++ g_print ("best conversion.\n");
++ } else {
++ if (fabs (value - res_num / (gdouble) res_denom) <= prec) {
++ g_print ("acceptable suboptimal conversion.\n");
++ } else {
++ g_print ("unacceptable suboptimal conversion.\n");
++ g_assert_not_reached ();
++ }
++ }
++
++ g_value_unset (&value2);
++ g_value_unset (&value1);
++}
++
++static void
++transform_test (void)
++{
++ check_from_fraction_convert (30000, 1001, 1.0e-9);
++ check_from_fraction_convert (1, G_MAXINT, 1.0e-9);
++ check_from_fraction_convert (G_MAXINT, 1, 1.0e-9);
++
++ check_from_double_convert (0.0, 0, 1, 1.0e-9);
++ check_from_double_convert (1.0, 1, 1, 1.0e-9);
++ check_from_double_convert (-1.0, -1, 1, 1.0e-9);
++ check_from_double_convert (M_PI, 1881244168, 598818617, 1.0e-9);
++ check_from_double_convert (-M_PI, -1881244168, 598818617, 1.0e-9);
++
++ check_from_double_convert (G_MAXDOUBLE, G_MAXINT, 1, G_MAXDOUBLE);
++ check_from_double_convert (G_MINDOUBLE, 0, 1, G_MAXDOUBLE);
++ check_from_double_convert (-G_MAXDOUBLE, -G_MAXINT, 1, G_MAXDOUBLE);
++ check_from_double_convert (-G_MINDOUBLE, 0, 1, G_MAXDOUBLE);
++
++ check_from_double_convert (((gdouble) G_MAXINT) + 1, G_MAXINT, 1,
++ G_MAXDOUBLE);
++ check_from_double_convert (((gdouble) G_MININT) - 1, G_MININT + 1, 1,
++ G_MAXDOUBLE);
++
++ check_from_double_convert (G_MAXINT - 1, G_MAXINT - 1, 1, 0);
++ check_from_double_convert (G_MININT + 1, G_MININT + 1, 1, 0);
++}
++
++int
++main (int argc, char *argv[])
++{
++ gst_init (&argc, &argv);
++
++ transform_test ();
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/fraction-multiply-and-zero.c gstreamer-0.10.23/tests/old/testsuite/caps/fraction-multiply-and-zero.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/fraction-multiply-and-zero.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/fraction-multiply-and-zero.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,131 @@
++/* GStreamer
++ *
++ * fraction.c: test for all GstFraction operations
++ *
++ * Copyright (C) <2004> Thomas Vander Stichele <thomas at apestaart dot org>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#include <gst/gst.h>
++#include <glib.h>
++
++static void
++check_multiplication (int num1, int den1, int num2, int den2, int num_result,
++ int den_result)
++{
++ GValue value1 = { 0 };
++ GValue value2 = { 0 };
++ GValue value3 = { 0 };
++
++ g_value_init (&value1, GST_TYPE_FRACTION);
++ g_value_init (&value2, GST_TYPE_FRACTION);
++ g_value_init (&value3, GST_TYPE_FRACTION);
++
++ gst_value_set_fraction (&value1, num1, den1);
++ gst_value_set_fraction (&value2, num2, den2);
++ g_print ("%d/%d * %d/%d = ", num1, den1, num2, den2);
++ gst_value_fraction_multiply (&value3, &value1, &value2);
++ g_print ("%d/%d (should be %d/%d)\n",
++ gst_value_get_fraction_numerator (&value3),
++ gst_value_get_fraction_denominator (&value3), num_result, den_result);
++ g_assert (gst_value_get_fraction_numerator (&value3) == num_result);
++ g_assert (gst_value_get_fraction_denominator (&value3) == den_result);
++
++ g_value_unset (&value1);
++ g_value_unset (&value2);
++ g_value_unset (&value3);
++}
++
++static void
++check_equal (int num1, int den1, int num2, int den2)
++{
++ GValue value1 = { 0 };
++ GValue value2 = { 0 };
++
++ g_value_init (&value1, GST_TYPE_FRACTION);
++ g_value_init (&value2, GST_TYPE_FRACTION);
++
++ gst_value_set_fraction (&value1, num1, den1);
++ gst_value_set_fraction (&value2, num2, den2);
++ g_print ("%d/%d == %d/%d ? ", num1, den1, num2, den2);
++ g_assert (gst_value_compare (&value1, &value2) == GST_VALUE_EQUAL);
++ g_print ("yes\n");
++
++ g_value_unset (&value1);
++ g_value_unset (&value2);
++}
++
++static void
++zero_test (void)
++{
++ GValue value1 = { 0 };
++
++ g_value_init (&value1, GST_TYPE_FRACTION);
++
++ /* fractions are initialized at 0 */
++ g_assert (gst_value_get_fraction_numerator (&value1) == 0);
++ g_assert (gst_value_get_fraction_denominator (&value1) == 1);
++
++ /* every zero value is set to 0/1 */
++ gst_value_set_fraction (&value1, 0, 235);
++ g_assert (gst_value_get_fraction_numerator (&value1) == 0);
++ g_assert (gst_value_get_fraction_denominator (&value1) == 1);
++ gst_value_set_fraction (&value1, 0, -G_MAXINT);
++ g_assert (gst_value_get_fraction_numerator (&value1) == 0);
++ g_assert (gst_value_get_fraction_denominator (&value1) == 1);
++
++ g_value_unset (&value1);
++}
++
++int
++main (int argc, char *argv[])
++{
++ GValue value1 = { 0 };
++ GValue value2 = { 0 };
++ GValue value3 = { 0 };
++
++ gst_init (&argc, &argv);
++
++ g_value_init (&value1, GST_TYPE_FRACTION);
++ g_value_init (&value2, GST_TYPE_FRACTION);
++ g_value_init (&value3, GST_TYPE_FRACTION);
++
++ /*** zeroes ***/
++
++ /* basic zero tests */
++ zero_test ();
++
++ /* check all zeroes are zeroes */
++ check_equal (0, 1, 0, 12345);
++ check_equal (0, 1, 0, -1);
++
++ /* check multiplying with zeroes results in zeroes */
++ check_multiplication (0, 1, 17, 18, 0, 1);
++ check_multiplication (0, -13, -G_MAXINT, 2736, 0, 1);
++
++ /*** large numbers ***/
++
++ /* check multiplying large numbers works */
++ check_multiplication (G_MAXINT, 1, G_MAXINT - 1, G_MAXINT, G_MAXINT - 1, 1);
++ check_multiplication (-G_MAXINT, 1, -G_MAXINT + 1, -G_MAXINT, -G_MAXINT + 1,
++ 1);
++ check_multiplication (G_MAXINT / 28, 459, -28, -G_MAXINT / 459,
++ G_MAXINT / 28 * 28, G_MAXINT / 459 * 459);
++ check_multiplication (3117 * 13, -17, 3117 * 17, 13, -3117 * 3117, 1);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/intersect2.c gstreamer-0.10.23/tests/old/testsuite/caps/intersect2.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/intersect2.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/intersect2.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,121 @@
++#include <gst/gst.h>
++
++GstStaticCaps rawcaps1 = GST_STATIC_CAPS ("video/x-raw-yuv, "
++ "fourcc:fourcc=\"YUYV\", "
++ "height:int=640, "
++ "width:int=480, "
++ "framerate:float=30.0; "
++ "video/x-raw-yuv, "
++ "fourcc:fourcc=\"I420\", "
++ "height:int=640, " "width:int=480, " "framerate:float=30.0");
++
++GstStaticCaps rawcaps2 = GST_STATIC_CAPS ("video/x-raw-yuv");
++
++GstStaticCaps rawcaps3 =
++GST_STATIC_CAPS ("video/x-raw-yuv, height=(int) [ 0, MAX ]");
++
++GstStaticCaps rawcaps4 =
++ GST_STATIC_CAPS
++ ("video/x-raw-yuv, format=(fourcc)YUY2; video/x-raw-yuv, format=(fourcc)UYVY");
++
++GstStaticCaps rawcaps5 =
++ GST_STATIC_CAPS
++ ("video/x-raw-yuv, format=(fourcc)YUY2, framerate=(double)[0,1.79769e+308], width=(int)[0,2147483647], height=(int)[0,2147483647]; video/x-raw-yuv, format=(fourcc)UYVY, framerate=(double)[0,1.79769e+308], width=(int)[0,2147483647], height=(int)[0,2147483647]");
++
++GstStaticCaps rawcaps6 =
++ GST_STATIC_CAPS
++ ("video/x-raw-yuv, format=(fourcc)YUY2, width=(int)320, height=(int)240");
++
++GstStaticCaps rawcaps7 =
++ GST_STATIC_CAPS
++ ("video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[0,2147483647], height=(int)[0,2147483647], framerate=(double)[0,1.79769e+308]");
++
++GstStaticCaps rawcaps8 =
++ GST_STATIC_CAPS
++ ("video/x-raw-yuv, format=(fourcc)YUY2, width=(int)320, height=(int)240");
++
++GstStaticCaps rawcaps9 =
++ GST_STATIC_CAPS
++ ("audio/x-raw-float, "
++ "channel-positions=(int)< "
++ "{ 1, 2, 3, 4, 5, 6 }, "
++ "{ 1, 2 }, "
++ "{ 1, 2, 3, 4, 5, 6 }, " "{ 1, 2, 3, 4, 5, 6 }, " "{ 4, 5, 6 }, " "6 >");
++
++GstStaticCaps rawcaps10 =
++ GST_STATIC_CAPS
++ ("audio/x-raw-float, "
++ "channel-positions=(int)< 1, { 2, 3, 4, 5, 6 }, 3, 4, {4, 5, 6 }, "
++ "{ 4, 5, 6 } >");
++
++
++int
++main (int argc, char *argv[])
++{
++ GstCaps *caps1;
++ GstCaps *caps2;
++ GstCaps *caps3;
++ GstCaps *caps4;
++ GstCaps *caps;
++
++ gst_init (&argc, &argv);
++
++ caps1 = gst_caps_copy (gst_static_caps_get (&rawcaps1));
++ caps2 =
++ gst_caps_new_full (gst_structure_copy (gst_caps_get_structure
++ (gst_static_caps_get (&rawcaps1), 0)), NULL);
++
++#if 0
++ gst_caps_set (caps1, "height", GST_PROPS_INT (640));
++ gst_caps_set (caps1, "width", GST_PROPS_INT (480));
++ gst_caps_set (caps1, "framerate", GST_PROPS_FLOAT (30.0));
++#endif
++
++ caps = gst_caps_intersect (caps1, caps2);
++ g_print ("caps %s\n", gst_caps_to_string (caps));
++ if (gst_caps_is_empty (caps))
++ return 1;
++ gst_caps_unref (caps1);
++ gst_caps_unref (caps2);
++
++ caps1 = gst_caps_copy (gst_static_caps_get (&rawcaps2));
++ caps2 = gst_caps_copy (gst_static_caps_get (&rawcaps3));
++ caps = gst_caps_intersect (caps1, caps2);
++ g_print ("caps %s\n", gst_caps_to_string (caps));
++ if (gst_caps_is_empty (caps))
++ return 1;
++ gst_caps_unref (caps1);
++ gst_caps_unref (caps2);
++
++ caps1 = gst_caps_copy (gst_static_caps_get (&rawcaps4));
++ caps2 = gst_caps_copy (gst_static_caps_get (&rawcaps5));
++ caps3 = gst_caps_copy (gst_static_caps_get (&rawcaps6));
++ caps4 = gst_caps_intersect (caps1, caps2);
++ caps = gst_caps_intersect (caps3, caps4);
++ g_print ("caps4 %s\n", gst_caps_to_string (caps4));
++ g_print ("caps %s\n", gst_caps_to_string (caps));
++ gst_caps_unref (caps1);
++ gst_caps_unref (caps2);
++ gst_caps_unref (caps3);
++ gst_caps_unref (caps4);
++
++ caps1 = gst_caps_copy (gst_static_caps_get (&rawcaps7));
++ caps2 = gst_caps_copy (gst_static_caps_get (&rawcaps8));
++ caps = gst_caps_intersect (caps1, caps2);
++ g_print ("caps %s\n", gst_caps_to_string (caps));
++ if (gst_caps_is_empty (caps))
++ return 1;
++ gst_caps_unref (caps1);
++ gst_caps_unref (caps2);
++
++ caps1 = gst_caps_copy (gst_static_caps_get (&rawcaps9));
++ caps2 = gst_caps_copy (gst_static_caps_get (&rawcaps10));
++ caps = gst_caps_intersect (caps1, caps2);
++ g_print ("caps %s\n", gst_caps_to_string (caps));
++ if (gst_caps_is_empty (caps))
++ return 1;
++ gst_caps_unref (caps1);
++ gst_caps_unref (caps2);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/intersection.c gstreamer-0.10.23/tests/old/testsuite/caps/intersection.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/intersection.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/intersection.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,109 @@
++#include <gst/gst.h>
++
++/* these caps all have a non empty intersection */
++GstStaticCaps sinkcaps = GST_STATIC_CAPS ("video/mpeg, "
++ "mpegtype=(int)1, "
++ "foo1=(int)[20,40], " "foo2=(int)[20,40], " "foo3=(int)[10,20]");
++
++GstStaticCaps mp1parsecaps = GST_STATIC_CAPS ("video/mpeg, "
++ "mpegtype=(int)1, "
++ "foo1=(int)30, " "foo2=(int)[20,30], " "foo3=(int)[20,30]");
++
++
++
++GstStaticCaps rawcaps = GST_STATIC_CAPS ("video/raw, "
++ "width=(int)[16,4096], " "height=(int)[16,4096]");
++
++GstStaticCaps rawcaps2 = GST_STATIC_CAPS ("video/raw, "
++ "height=(int)[16,256], " "depth=(int)16");
++
++GstStaticCaps rawcaps3 = GST_STATIC_CAPS ("video/raw, "
++ "fourcc=(fourcc){\"YUY2\", \"YV12\" }, " "height=(int)[16,4096]");
++
++GstStaticCaps rawcaps4 = GST_STATIC_CAPS ("video/raw, "
++ "fourcc=(fourcc){\"YUY2\",\"YV12\",\"YUYV\" }, " "height=(int)[16,4096]");
++
++GstStaticCaps rawcaps5 = GST_STATIC_CAPS ("video/raw, "
++ "fourcc=(fourcc){\"YUYV\",\"YUY2\"}, " "height=(int)[16,4096]");
++
++GstStaticCaps rawcaps6 = GST_STATIC_CAPS ("video/raw, "
++ "fourcc=(fourcc)\"YUYV\", "
++ "height=(int)640, "
++ "width=(int)480, "
++ "framerate=(double)30.0; "
++ "video/raw, "
++ "fourcc=(fourcc)\"I420\", "
++ "height=(int)640, " "width=(int)480, " "framerate=(double)30.0");
++
++GstStaticCaps rawcaps7 =
++ GST_STATIC_CAPS
++ ("video/x-raw-yuv, format=(fourcc)YUY2, width=(int)[1,2147483647], height=(int)[1,2147483647], framerate=(double)[0,1.79769e+308]");
++
++GstStaticCaps rawcaps8 =
++ GST_STATIC_CAPS
++ ("video/x-raw-yuv, format=(fourcc){ I420, YV12, YUY2 }, width=(int)[16,4096], height=(int)[16,4096], framerate=(double)[0,1.79769e+308]");
++
++int
++main (int argc, char *argv[])
++{
++ xmlDocPtr doc;
++ xmlNodePtr parent;
++ GstCaps *caps;
++
++ gst_init (&argc, &argv);
++
++ doc = xmlNewDoc ((const xmlChar *) "1.0");
++ doc->xmlRootNode =
++ xmlNewDocNode (doc, NULL, (const xmlChar *) "Capabilities", NULL);
++
++ /*
++ for (i = 0; i<100000; i++) {
++ caps = gst_caps_intersect (gst_static_caps_get (rawcaps3), GST_CAPS_GET (rawcaps4));
++ gst_caps_unref (caps);
++ }
++ */
++
++ caps = gst_caps_intersect (gst_static_caps_get (&sinkcaps),
++ gst_static_caps_get (&mp1parsecaps));
++ parent =
++ xmlNewChild (doc->xmlRootNode, NULL, (const xmlChar *) "Capabilities1",
++ NULL);
++ gst_caps_save_thyself (caps, parent);
++
++ caps = gst_caps_intersect (gst_static_caps_get (&rawcaps),
++ gst_static_caps_get (&rawcaps2));
++ parent =
++ xmlNewChild (doc->xmlRootNode, NULL, (const xmlChar *) "Capabilities2",
++ NULL);
++ gst_caps_save_thyself (caps, parent);
++
++ caps = gst_caps_intersect (gst_static_caps_get (&rawcaps3),
++ gst_static_caps_get (&rawcaps4));
++ parent =
++ xmlNewChild (doc->xmlRootNode, NULL, (const xmlChar *) "Capabilities3",
++ NULL);
++ gst_caps_save_thyself (caps, parent);
++
++ caps = gst_caps_intersect (gst_static_caps_get (&rawcaps3),
++ gst_static_caps_get (&rawcaps5));
++ parent =
++ xmlNewChild (doc->xmlRootNode, NULL, (const xmlChar *) "Capabilities4",
++ NULL);
++ gst_caps_save_thyself (caps, parent);
++
++ caps = gst_caps_intersect (gst_static_caps_get (&rawcaps6),
++ gst_caps_new_full (gst_structure_copy (gst_caps_get_structure
++ (gst_static_caps_get (&rawcaps6), 0)), NULL));
++ parent =
++ xmlNewChild (doc->xmlRootNode, NULL, (const xmlChar *) "Capabilities5",
++ NULL);
++ gst_caps_save_thyself (caps, parent);
++
++ caps = gst_caps_intersect (gst_static_caps_get (&rawcaps7),
++ gst_static_caps_get (&rawcaps8));
++ g_print ("intersection: %s\n", gst_caps_to_string (caps));
++
++ xmlDocDump (stdout, doc);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/Makefile.am gstreamer-0.10.23/tests/old/testsuite/caps/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,33 @@
++include ../Rules
++
++tests_pass = \
++ app_fixate \
++ enumcaps \
++ intersection \
++ compatibility \
++ deserialize \
++ normalisation \
++ union \
++ string-conversions \
++ fixed \
++ fraction-convert \
++ fraction-multiply-and-zero \
++ intersect2 \
++ caps \
++ audioscale \
++ filtercaps \
++ eratosthenes \
++ renegotiate \
++ subtract \
++ sets \
++ simplify \
++ random \
++ structure
++
++EXTRA_DIST = caps_strings
++
++noinst_HEADERS = \
++ caps.h
++
++tests_fail =
++tests_ignore =
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/normalisation.c gstreamer-0.10.23/tests/old/testsuite/caps/normalisation.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/normalisation.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/normalisation.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,85 @@
++#include <gst/gst.h>
++
++/* these caps all have a non empty intersection */
++GstStaticCaps sinkcaps = GST_STATIC_CAPS ("video/mpeg, "
++ "fourcc=(fourcc){\"YV12\",\"YUY2\"}, "
++ "foo1=(int)[20,40], " "foo2=(int)[20,40], " "foo3=(int)[10,20]");
++
++GstStaticCaps mp1parsecaps = GST_STATIC_CAPS ("video/mpeg, "
++ "fourcc=(fourcc){\"YV12\",\"YUY2\"}, " "foo4=(fourcc){\"YV12\",\"YUY2\"}");
++
++GstStaticCaps rawcaps = GST_STATIC_CAPS ("video/raw, "
++ "width=(int)[16,4096], "
++ "height=(int)[16,4096], " "fourcc=(fourcc){\"YV12\",\"YUY2\"}");
++
++GstStaticCaps rawcaps2 = GST_STATIC_CAPS ("video/raw, "
++ "width=(int)[16,256], "
++ "height=(int)16; " "video/raw, " "width=(int)[16,256], " "height=(int)16");
++
++GstStaticCaps rawcaps3 = GST_STATIC_CAPS ("video/raw, "
++ "width=(int)[16,256], "
++ "height=(int)16; "
++ "video/raw, "
++ "width=(int)[16,256], "
++ "height=(int)16; "
++ "video/raw, "
++ "fourcc=(fourcc){\"YV12\",\"YUY2\"}, " "height=(int)[16,4096]");
++
++GstStaticCaps rawcaps4 = GST_STATIC_CAPS ("x, "
++ "y=(int){1,2}, " "z=(int){3,4}; " "a, " "b=(int){5,6}, " "c=(int){7,8}");
++
++/* defined, not used
++GST_CAPS_FACTORY (rawcaps4,
++ GST_CAPS_NEW (
++ "raw2_sink_caps",
++ "video/raw",
++ "fourcc", GST_PROPS_LIST (
++ GST_PROPS_FOURCC (GST_STR_FOURCC ("YUY2")),
++ GST_PROPS_FOURCC (GST_STR_FOURCC ("YV12")),
++ GST_PROPS_FOURCC (GST_STR_FOURCC ("YUYV"))
++ ),
++ "height", GST_PROPS_INT_RANGE (16, 4096)
++ )
++);
++
++GST_CAPS_FACTORY (rawcaps5,
++ GST_CAPS_NEW (
++ "raw2_sink_caps",
++ "video/raw",
++ "fourcc", GST_PROPS_LIST (
++ GST_PROPS_FOURCC (GST_STR_FOURCC ("YUYV")),
++ GST_PROPS_FOURCC (GST_STR_FOURCC ("YUY2"))
++ ),
++ "height", GST_PROPS_INT_RANGE (16, 4096)
++ )
++);
++*/
++
++int
++main (int argc, char *argv[])
++{
++ GstCaps *caps;
++
++ gst_init (&argc, &argv);
++
++ caps = gst_caps_normalize (gst_static_caps_get (&sinkcaps));
++ g_print ("\n%s\n", gst_caps_to_string (caps));
++
++ caps = gst_caps_normalize (gst_static_caps_get (&mp1parsecaps));
++ g_print ("\n%s\n", gst_caps_to_string (caps));
++
++ caps = gst_caps_normalize (gst_static_caps_get (&rawcaps));
++ g_print ("\n%s\n", gst_caps_to_string (caps));
++
++ caps = gst_caps_normalize (gst_static_caps_get (&rawcaps2));
++ g_print ("\n%s\n", gst_caps_to_string (caps));
++
++ caps = gst_caps_normalize (gst_static_caps_get (&rawcaps3));
++ g_print ("\n%s\n", gst_caps_to_string (caps));
++
++ caps = gst_caps_normalize (gst_static_caps_get (&rawcaps4));
++ g_assert (gst_caps_get_size (caps) == 8);
++ g_print ("\n%s\n", gst_caps_to_string (caps));
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/random.c gstreamer-0.10.23/tests/old/testsuite/caps/random.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/random.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/random.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,69 @@
++/* GStreamer
++ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#include <gst/gst.h>
++
++void
++assert_on_error (GstDebugCategory * category, GstDebugLevel level,
++ const gchar * file, const gchar * function, gint line, GObject * object,
++ GstDebugMessage * message, gpointer data)
++{
++ g_assert (level != GST_LEVEL_ERROR);
++}
++
++gint
++main (gint argc, gchar * argv[])
++{
++ /* this file contains random tests for stuff that went wrong in some version
++ * and should be tested so we're sure it works right now
++ * Please add what exactly the code tests for in your test */
++
++ gst_init (&argc, &argv);
++
++ /* TEST 1:
++ * gstcaps.c 1.120 used a code path that caused a GST_ERROR for the tested
++ * caps when simplifying even though that is absolutely valid */
++ {
++ GstCaps *caps =
++ gst_caps_from_string
++ ("some/type, a=(int)2, b=(int)3, c=bla; some/type, a=(int)2, c=bla");
++ gst_debug_add_log_function (assert_on_error, NULL);
++ gst_caps_do_simplify (caps);
++ gst_debug_remove_log_function (assert_on_error);
++ gst_caps_unref (caps);
++ }
++
++ /* TEST 2:
++ * gstvalue.c 1.34 had a broken comparison function for int ranges that
++ * returned GST_VALUE_EQUAL even though the range end was different */
++ {
++ GValue v1 = { 0, };
++ GValue v2 = { 0, };
++
++ g_value_init (&v1, GST_TYPE_INT_RANGE);
++ g_value_init (&v2, GST_TYPE_INT_RANGE);
++ gst_value_set_int_range (&v1, 1, 2);
++ gst_value_set_int_range (&v2, 1, 3);
++ g_assert (gst_value_compare (&v1, &v2) != GST_VALUE_EQUAL);
++ g_value_unset (&v1);
++ g_value_unset (&v2);
++ }
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/renegotiate.c gstreamer-0.10.23/tests/old/testsuite/caps/renegotiate.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/renegotiate.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/renegotiate.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,150 @@
++
++#include <gst/gst.h>
++#include <string.h>
++#include <unistd.h>
++
++
++static GstPad *sinesrcpad;
++
++static GstStaticCaps caps1 = GST_STATIC_CAPS ("audio/x-raw-int, "
++ "endianness=(int)1234, "
++ "signed=(boolean)true, "
++ "width=(int)16, " "depth=(int)16, " "rate=(int)48000, " "channels=(int)1");
++static GstStaticCaps caps2 = GST_STATIC_CAPS ("audio/x-raw-int, "
++ "endianness=(int)1234, "
++ "signed=(boolean)true, "
++ "width=(int)16, " "depth=(int)16, " "rate=(int)44100, " "channels=(int)1");
++
++int stage = 0;
++
++static GstCaps *
++my_fixate (GstPad * pad, GstCaps * caps, gpointer user_data)
++{
++ const char *element_name;
++ const char *pad_name;
++
++ element_name = gst_element_get_name (gst_pad_get_parent (pad));
++ pad_name = gst_pad_get_name (pad);
++
++ g_print ("%s:%s: %s\n", element_name, pad_name, gst_caps_to_string (caps));
++
++ if (strcmp (element_name, "sinesrc0") == 0 && strcmp (pad_name, "src") == 0) {
++ GstCaps *icaps;
++ const GstCaps *mycaps;
++ int rate;
++
++ sinesrcpad = pad;
++
++ if (stage == 0) {
++ mycaps = gst_static_caps_get (&caps1);
++ rate = 48000;
++ } else {
++ mycaps = gst_static_caps_get (&caps2);
++ rate = 44100;
++ }
++ icaps = gst_caps_intersect (caps, mycaps);
++ if (!gst_caps_is_empty (icaps)) {
++ gst_caps_unref (icaps);
++ g_print ("returning %d\n", rate);
++ return gst_caps_copy (mycaps);
++ }
++ gst_caps_unref (icaps);
++ }
++
++ return NULL;
++}
++
++int
++main (int argc, char *argv[])
++{
++ GstElement *pipeline;
++ GError *error = NULL;
++ GstIterator *iter1, *iter2;
++ gint done1 = FALSE, done2 = FALSE;
++ gpointer element;
++
++ gst_init (&argc, &argv);
++
++ /* change sinesrk to sinesrc once gst_parse_launch is fixed */
++ pipeline = gst_parse_launch ("sinesrc ! audioconvert ! "
++ "audio/x-raw-int, channels=2, rate=48000;"
++ "audio/x-raw-int, channels=1, rate=44100 !" "fakesink", &error);
++
++ if (error != NULL) {
++ g_print
++ ("oops, couldn't build pipeline. You probably don't have audioconvert or sinesrc\n"
++ "the error was: %s\n", error->message);
++ g_error_free (error);
++ exit (0);
++ }
++
++ iter1 = gst_bin_iterate_elements (GST_BIN (pipeline));
++ while (!done1) {
++ switch (gst_iterator_next (iter1, &element)) {
++ case GST_ITERATOR_OK:
++ {
++ gpointer pad;
++
++ iter2 = gst_element_iterate_pads (element);
++ while (!done2) {
++ switch (gst_iterator_next (iter2, &pad)) {
++ case GST_ITERATOR_OK:
++ if (gst_pad_get_direction (pad) == GST_PAD_SRC) {
++ g_signal_connect (G_OBJECT (pad), "fixate",
++ G_CALLBACK (my_fixate), NULL);
++ }
++ gst_object_unref (pad);
++ break;
++ case GST_ITERATOR_DONE:
++ done2 = TRUE;
++ break;
++ case GST_ITERATOR_RESYNC:
++ case GST_ITERATOR_ERROR:
++ exit (1);
++ break;
++ }
++ }
++ gst_iterator_free (iter2);
++
++ gst_object_unref (element);
++ break;
++ }
++ case GST_ITERATOR_DONE:
++ done1 = TRUE;
++ break;
++ case GST_ITERATOR_RESYNC:
++ case GST_ITERATOR_ERROR:
++ exit (1);
++ break;
++ }
++ }
++ gst_iterator_free (iter1);
++
++ /*g_signal_connect (pipeline, "deep_notify",
++ G_CALLBACK (gst_element_default_deep_notify), NULL); */
++
++ gst_element_set_state (pipeline, GST_STATE_PLAYING);
++
++ /*
++ i = 0;
++ while (1) {
++ gst_bin_iterate (GST_BIN (pipeline));
++ i++;
++ if (i == 10) {
++ stage = 1;
++ g_print ("10 iterations\n");
++ ret = gst_pad_renegotiate (sinesrcpad);
++ g_print ("negotiation returned %d\n", ret);
++ }
++ if (i == 20) {
++ g_print ("20 iterations\n");
++ exit (0);
++ }
++ }
++ */
++ /* Like totally not sure how to do this in THREADED. Punting for now! */
++
++ sleep (5);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/sets.c gstreamer-0.10.23/tests/old/testsuite/caps/sets.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/sets.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/sets.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,81 @@
++/*
++ * Copyright (C) 2004 Benjamin Otte <in7y118@public.uni-hamburg.de>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <gst/gst.h>
++#include <string.h>
++#include "caps.h"
++
++static void
++check_caps (const gchar * eins, const gchar * zwei)
++{
++ GstCaps *one, *two, *test, *test2, *test3, *test4;
++
++ one = gst_caps_from_string (eins);
++ two = gst_caps_from_string (zwei);
++ g_print (" A = %u\n", strlen (eins));
++ g_print (" B = %u\n", strlen (zwei));
++
++ test = gst_caps_intersect (one, two);
++ if (gst_caps_is_equal (one, two)) {
++ g_print (" EQUAL\n\n");
++ g_assert (gst_caps_is_equal (one, test));
++ g_assert (gst_caps_is_equal (two, test));
++ } else if (!gst_caps_is_any (one) || gst_caps_is_empty (two)) {
++ test2 = gst_caps_subtract (one, test);
++ g_print (" A - B = %u\n", strlen (gst_caps_to_string (test2)));
++ /* test2 = one - (one A two) = one - two */
++ test3 = gst_caps_intersect (test2, two);
++ g_print (" empty = %s\n", gst_caps_to_string (test3));
++ g_assert (gst_caps_is_empty (test3));
++ gst_caps_unref (test3);
++ test3 = gst_caps_union (test2, two);
++ g_print (" A + B = %u\n", strlen (gst_caps_to_string (test3)));
++ /* test3 = one - two + two = one + two */
++ g_print (" A + B = %s\n", gst_caps_to_string (gst_caps_subtract (one,
++ test3)));
++ g_assert (gst_caps_is_subset (one, test3));
++ test4 = gst_caps_union (one, two);
++ g_assert (gst_caps_is_equal (test3, test4));
++ g_print (" NOT EQUAL\n\n");
++ gst_caps_unref (test2);
++ gst_caps_unref (test3);
++ gst_caps_unref (test4);
++ } else {
++ g_print (" ANY CAPS\n\n");
++ }
++ gst_caps_unref (test);
++ gst_caps_unref (two);
++ gst_caps_unref (one);
++}
++
++gint
++main (gint argc, gchar ** argv)
++{
++ guint i, j;
++
++ gst_init (&argc, &argv);
++
++ for (i = 0; i < G_N_ELEMENTS (caps_list); i++) {
++ for (j = 0; j < G_N_ELEMENTS (caps_list); j++) {
++ g_print ("%u - %u\n", i, j);
++ check_caps (caps_list[i], caps_list[j]);
++ }
++ }
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/simplify.c gstreamer-0.10.23/tests/old/testsuite/caps/simplify.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/simplify.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/simplify.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,125 @@
++/*
++ * Copyright (C) 2004 Benjamin Otte <in7y118@public.uni-hamburg.de>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <gst/gst.h>
++#include <string.h>
++#include "caps.h"
++
++/* statistics junkie!!! */
++static guint size_before = 0, size_after = 0;
++static guint length_before = 0, length_after = 0;
++static guint impossible = 0, success = 0, failure = 0;
++
++static void
++check_caps (GstCaps * caps)
++{
++ gchar *before, *after;
++ GstCaps *old;
++
++ before = gst_caps_to_string (caps);
++ old = gst_caps_copy (caps);
++ gst_caps_do_simplify (caps);
++ after = gst_caps_to_string (caps);
++ g_assert (gst_caps_get_size (caps) <= gst_caps_get_size (old));
++ if (gst_caps_get_size (caps) == gst_caps_get_size (old))
++ g_assert (strlen (after) <= strlen (before));
++ g_assert (gst_caps_is_equal (caps, old));
++ g_print ("%s %2u/%-4u => %2u/%-4u\n",
++ gst_caps_get_size (caps) < gst_caps_get_size (old) ||
++ strlen (after) < strlen (before) ? "REDUCED" :
++ (gst_caps_get_size (old) < 2 ? " --- " : " "),
++ gst_caps_get_size (old), strlen (before),
++ gst_caps_get_size (caps), strlen (after));
++
++ size_before += gst_caps_get_size (old);
++ size_after += gst_caps_get_size (caps);
++ length_before += strlen (before);
++ length_after += strlen (after);
++ if (gst_caps_get_size (old) < 2) {
++ impossible++;
++ } else if (gst_caps_get_size (caps) < gst_caps_get_size (old) ||
++ strlen (after) < strlen (before)) {
++ success++;
++ } else {
++ failure++;
++ }
++
++ g_free (before);
++ g_free (after);
++ gst_caps_unref (old);
++}
++
++gint
++main (gint argc, gchar ** argv)
++{
++ guint i, j;
++
++ gst_init (&argc, &argv);
++
++ for (i = 0; i < G_N_ELEMENTS (caps_list); i++) {
++ GstCaps *caps = gst_caps_from_string (caps_list[i]);
++
++ g_print (" %2u ", i);
++ check_caps (caps);
++ if (!gst_caps_is_any (caps)) {
++ for (j = 0; j < G_N_ELEMENTS (caps_list); j++) {
++ GstCaps *temp, *temp2;
++ GstCaps *caps2 = gst_caps_from_string (caps_list[j]);
++
++ /* subtraction */
++ temp = gst_caps_subtract (caps, caps2);
++
++ g_print ("%2u - %2u ", i, j);
++ check_caps (temp);
++ gst_caps_unref (temp);
++ /* union */
++ temp = gst_caps_union (caps, caps2);
++ g_print ("%2u + %2u ", i, j);
++ check_caps (temp);
++ if (i == j)
++ g_assert (gst_caps_get_size (caps) == gst_caps_get_size (temp));
++ g_assert (gst_caps_is_subset (caps, temp));
++ g_assert (gst_caps_is_subset (caps2, temp));
++ /* appending (union without simplifying) */
++ temp2 = gst_caps_copy (caps);
++ gst_caps_append (temp2, caps2);
++ g_assert (gst_caps_is_equal (temp, temp2));
++ gst_caps_unref (temp2);
++ gst_caps_unref (temp);
++ }
++ }
++ gst_caps_unref (caps);
++ }
++ g_print ("\n\nSTATISTICS:\n");
++ g_print ("\nOf all caps tried\n");
++ g_print ("%3u (%02.4g%%) caps were already at minimum size.\n", impossible,
++ 100.0 * ((double) impossible) / (impossible + success + failure));
++ g_print ("%3u (%02.4g%%) caps were successfully reduced.\n", success,
++ 100.0 * ((double) success) / (impossible + success + failure));
++ g_print ("%3u (%02.4g%%) caps could not be reduced.\n", failure,
++ 100.0 * ((double) failure) / (impossible + success + failure));
++ g_print ("\nOf all caps that could possibly be reduced\n");
++ g_print ("%02.4g%% were reduced\n",
++ 100.0 * ((double) success) / (success + failure));
++ g_print ("%02.4g%% average reduction in caps structure amount\n",
++ 100.0 * (1.0 - ((double) size_after) / size_before));
++ g_print ("%02.4g%% average reduction in caps serialization length\n",
++ 100.0 * (1.0 - ((double) length_after) / length_before));
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/string-conversions.c gstreamer-0.10.23/tests/old/testsuite/caps/string-conversions.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/string-conversions.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/string-conversions.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,205 @@
++#include <gst/gst.h>
++#include <string.h>
++
++GstStaticCaps caps1 = GST_STATIC_CAPS ("video/mpeg, " "mpegtype=(int){1,2}");
++
++GstStaticCaps caps2 = GST_STATIC_CAPS ("video/mpeg, " "mpegtype=(int){1}");
++
++GstStaticCaps caps3 = GST_STATIC_CAPS ("video/raw, "
++ "fourcc=(fourcc){\"YV12\",\"YUY2\"}, "
++ "width=(int)[16,4096], " "height=(int)[16,4096]");
++
++GstStaticCaps caps4 = GST_STATIC_CAPS ("video/raw, "
++ "fourcc=(fourcc)\"YV12\", " "height=(int)[16,256]");
++
++GstStaticCaps caps5 = GST_STATIC_CAPS ("video/raw, "
++ "fourcc=(fourcc){\"YV12\",\"YUY2\"}, " "height=(int)[16,4096]");
++
++GstStaticCaps caps6 = GST_STATIC_CAPS ("video/raw, "
++ "fourcc=(fourcc){\"YV12\",\"YUYV\"}, " "height=(int)[16,4096]");
++
++GstStaticCaps caps7 = GST_STATIC_CAPS ("video/raw, "
++ "fourcc=(fourcc){\"YVYV\",\"YUY2\"}, " "height=(int)[16,4096],"
++ "pixel-aspect-ratio=(fraction)16/15");
++
++GstStaticCaps caps8 = GST_STATIC_CAPS ("video/raw, "
++ "format=(fourcc)\"I420\"; " "video/raw, " "format=(fourcc)\"YUYV\"");
++
++GstStaticCaps caps9 = GST_STATIC_CAPS ("video/raw, "
++ "format=(fourcc)\"I420\"; " "video/raw, " "format=(fourcc)\"YV12\"");
++
++static gint test = 0;
++static gint failures = 0;
++
++#define TEST_START g_print ("%3d, START\n", ++test)
++#define TEST_FAIL g_print ("%3d, FAIL : failure %d\n", test, ++failures)
++#define TEST_SUCCESS g_print ("%3d, SUCCESS\n", test)
++#define TEST_END(result) G_STMT_START{ \
++ if (result) { \
++ TEST_SUCCESS; \
++ } else { \
++ TEST_FAIL; \
++ } \
++}G_STMT_END
++static void
++test_caps_func (const GstCaps * caps)
++{
++ gchar *str1, *str2;
++ gboolean ret = FALSE;
++
++ str1 = gst_caps_to_string (caps);
++ caps = gst_caps_from_string (str1);
++ if (!caps) {
++ g_print ("%3d, INFO : no caps from %s\n", test, str1);
++ TEST_END (ret);
++ return;
++ }
++ str2 = gst_caps_to_string (caps);
++ g_print ("%3d, INFO : %s <==> %s\n", test, str1, str2);
++ ret = strcmp (str1, str2) == 0;
++ g_free (str1);
++ g_free (str2);
++ TEST_END (ret);
++}
++static void
++test_caps (const GstCaps * caps)
++{
++ TEST_START;
++ test_caps_func (caps);
++}
++static void
++test_string (gchar * str)
++{
++ GstCaps *caps;
++
++ TEST_START;
++ g_print ("%3d, INFO : checking %s\n", test, str);
++ caps = gst_caps_from_string (str);
++ if (!caps) {
++ g_print ("%3d, INFO : no caps from %s\n", test, str);
++ TEST_FAIL;
++ return;
++ }
++ test_caps_func (caps);
++}
++static void
++test_string_fail (gchar * str)
++{
++ GstCaps *caps;
++
++ TEST_START;
++ g_print ("%3d, INFO : checking %s for failure\n", test, str);
++ caps = gst_caps_from_string (str);
++ g_print ("got %p\n", caps);
++ TEST_END (caps == NULL);
++}
++
++int
++main (int argc, char *argv[])
++{
++ gst_init (&argc, &argv);
++ goto bla;
++bla:
++ /* stupidity tests */
++ test_caps (gst_caps_new_simple ("audio/raw", NULL));
++
++ /* all sorts of caps */
++ test_caps (gst_static_caps_get (&caps1));
++ test_caps (gst_static_caps_get (&caps2));
++ test_caps (gst_static_caps_get (&caps3));
++ test_caps (gst_static_caps_get (&caps4));
++ test_caps (gst_static_caps_get (&caps5));
++ test_caps (gst_static_caps_get (&caps6));
++ test_caps (gst_static_caps_get (&caps7));
++ test_caps (gst_static_caps_get (&caps8));
++ test_caps (gst_static_caps_get (&caps9));
++
++ /* mime types */
++ test_string ("audio/raw");
++ test_string ("\"audio/raw\"");
++
++ /* fixed props entries */
++ test_string ("audio/raw ,test=(int)1");
++ test_string ("audio/raw ,test=(double) 1");
++ test_string ("audio/raw, test=(fourcc )1");
++ test_string ("audio/raw ,test=(i)1");
++ test_string ("audio/raw ,test=(d) 1");
++ test_string ("audio/raw, test=(4 )1");
++ test_string ("audio/raw,test=( fourcc ) 0x0000001");
++ test_string ("audio/raw,test =(fourcc) \"RGB \"");
++ test_string ("audio/raw , test=( string)1");
++ test_string ("audio/raw,test= 1");
++ test_string ("audio/raw,test = 1.0");
++ test_string ("audio/raw ,test= \"1.0\"");
++ test_string ("audio/raw,test=( str) \"1\"");
++ test_string ("audio/raw ,test=(b)False");
++ test_string ("audio/raw ,test =(bool) trUE");
++ test_string ("audio/raw ,test=(b ) yes");
++ test_string ("audio/raw ,test =( boolean)no");
++ test_string ("audio/raw ,test = < 1, 2, 3 >");
++ test_string ("video/raw ,test =( fraction)9/8");
++
++ /* buffers */
++ test_string ("audio/raw ,test=(buffer)0123456789abcdef");
++ test_string ("audio/raw ,test= < (buffer)0123, (buffer)4567 >");
++
++ /* unfixed props entries */
++ test_string ("audio/raw, test= [ 1, 2 ]");
++ test_string_fail ("audio/raw, test= [ 1.0 , 2]");
++ test_string_fail ("audio/raw, test = [1, 2.5 ]");
++ test_string ("audio/raw, test= [1.3, 2.1 ]");
++ test_string ("audio/raw, test =(int ) [1,2]");
++ test_string ("audio/raw, test =(double ) [1,2]");
++ test_string ("audio/raw, test= [(int) 1, 2 ]");
++ test_string ("audio/raw, test=(d) [ (double)1.0 , 2]");
++ test_string ("audio/raw, test=(double) [1.3, (double)2.1 ]");
++ test_string ("audio/raw, test =(i) [(int)1,2]");
++ test_string ("audio/raw, test={(int)1,2}");
++ test_string
++ ("audio/raw, test= {(int)1 ,2,3 ,(int) 4 , 5 ,6 , (int )7 ,8 , (int ) 9, 10}");
++ test_string ("audio/raw, test= {1.0}");
++ test_string ("audio/raw, test= {\"hi\", \"i dig ya\", dude}");
++ test_string ("audio/raw, test= {(int)1,2}");
++ test_string ("audio/raw, test= {(int)1,2}");
++
++ /* prop concatenations */
++ test_string ("audio/raw, test=(double) [1.3, (double)2.1 ], test2= [ 1, 2 ]");
++ test_string ("audio/raw , test=(fourcc) \"RGB \",test2=(int)1");
++ test_string
++ ("audio/raw, test= [(int ) 1, 2 ] ,test2 =(fourcc) \"RGB \"");
++ test_string ("audio/raw, test= [1.3, 2.1 ] , test2= {1.0}");
++ test_string
++ ("audio/raw, test= {(int)1 ,2,3 ,(int) 4 , 5 ,6 , (int )7 ,8 , (int ) 9, 10}, test2 = [1.0, 2.5 ] , test3= (string)1 ,test4=(i)1");
++
++ /* caps concatenations */
++ test_string
++ ("audio/raw, test= [(int ) 1, 2 ] ,test2 =(fourcc) \"RGB \";\"audio/raw\"");
++ test_string
++ ("audio/raw, test =(double ) [1,2] ; audio/raw, test=(fourcc )1 ;audio/raw, test= {\"hi\", \"i dig ya\", dude}");
++ test_string
++ ("audio/raw, test=(double) [1.3, (double)2.1 ];audio/raw, test =(i) [(int)1,2]");
++
++
++ /* mimes */
++ test_string_fail ("audio/raw\\");
++ test_string_fail ("'audio/raw");
++ test_string_fail ("'audio/raw\"");
++ /* wrong type */
++ test_string_fail ("audio/raw, test=(int) [1.0,2]");
++ test_string_fail ("audio/raw, test=(int) [1 ,0.2]");
++ test_string_fail ("audio/raw, test=(int) [1.0, 2.000]");
++ test_string_fail ("audio/raw, test=(int) <1.0, 2.000>");
++ /* unmatched */
++ test_string_fail ("audio/raw, test=(int = [");
++ test_string_fail ("audio/raw, test= {");
++ test_string_fail ("audio/raw, test= <");
++ test_string_fail ("audio/raw, test = \"dood'");
++ test_string_fail ("audio/raw, test= '");
++
++ if (failures) {
++ g_print ("\n FAILURES : %d\n", failures);
++ } else {
++ g_print ("\n DONE\n");
++ }
++ return failures;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/structure.c gstreamer-0.10.23/tests/old/testsuite/caps/structure.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/structure.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/structure.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,25 @@
++
++#include <gst/gst.h>
++
++
++void
++test1 (void)
++{
++ GstStructure *structure;
++
++ g_print ("type is %d\n", (int) gst_structure_get_type ());
++
++ structure = gst_structure_empty_new ("moo");
++ g_assert (structure != NULL);
++ g_assert (GST_IS_STRUCTURE (structure));
++}
++
++int
++main (int argc, char *argv[])
++{
++ gst_init (&argc, &argv);
++
++ test1 ();
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/subtract.c gstreamer-0.10.23/tests/old/testsuite/caps/subtract.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/subtract.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/subtract.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,63 @@
++/*
++ * Copyright (C) 2004 Benjamin Otte <in7y118@public.uni-hamburg.de>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <gst/gst.h>
++
++static void
++check_caps (const gchar * set, const gchar * subset)
++{
++ GstCaps *one, *two, *test, *test2;
++
++ g_print (" A = %s\n", set);
++ one = gst_caps_from_string (set);
++ g_print (" B = %s\n", subset);
++ two = gst_caps_from_string (subset);
++ /* basics */
++ test = gst_caps_subtract (one, one);
++ g_assert (gst_caps_is_empty (test));
++ gst_caps_unref (test);
++ test = gst_caps_subtract (two, two);
++ g_assert (gst_caps_is_empty (test));
++ gst_caps_unref (test);
++ test = gst_caps_subtract (two, one);
++ g_assert (gst_caps_is_empty (test));
++ gst_caps_unref (test);
++ /* now the nice part */
++ test = gst_caps_subtract (one, two);
++ g_assert (!gst_caps_is_empty (test));
++ g_print (" A - B = %s\n", gst_caps_to_string (test));
++ test2 = gst_caps_union (test, two);
++ g_print ("A - B + B = %s\n", gst_caps_to_string (test2));
++ gst_caps_unref (test);
++ test = gst_caps_subtract (test2, one);
++ g_assert (gst_caps_is_empty (test));
++ gst_caps_unref (test);
++}
++
++gint
++main (gint argc, gchar ** argv)
++{
++ gst_init (&argc, &argv);
++
++ check_caps ("some/mime, _int = [ 1, 2 ], list = { \"A\", \"B\", \"C\" }",
++ "some/mime, _int = 1, list = \"A\"");
++ check_caps ("some/mime, _double = (double) 1.0; other/mime, _int = { 1, 2 }",
++ "some/mime, _double = (double) 1.0");
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/caps/union.c gstreamer-0.10.23/tests/old/testsuite/caps/union.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/caps/union.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/caps/union.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,34 @@
++#include <gst/gst.h>
++
++/* these caps all have a non empty intersection */
++GstStaticCaps sinkcaps = GST_STATIC_CAPS ("video/mpeg, "
++ "mpegtype:int=1, "
++ "foo1:int=[20,40], " "foo2:int=[20,40], " "foo3:int=[10,20]");
++
++GstStaticCaps mp1parsecaps = GST_STATIC_CAPS ("video/mpeg, "
++ "mpegtype:int=1, " "foo1:int=30, " "foo2:int=[20,30], " "foo3:int=[20,30]");
++
++int
++main (int argc, char *argv[])
++{
++ xmlDocPtr doc;
++ xmlNodePtr parent;
++ GstCaps *caps;
++
++ gst_init (&argc, &argv);
++
++ doc = xmlNewDoc ((const xmlChar *) "1.0");
++ doc->xmlRootNode =
++ xmlNewDocNode (doc, NULL, (const xmlChar *) "Capabilities", NULL);
++
++ caps = gst_caps_union (gst_static_caps_get (&sinkcaps),
++ gst_static_caps_get (&mp1parsecaps));
++ parent =
++ xmlNewChild (doc->xmlRootNode, NULL, (const xmlChar *) "Capabilities1",
++ NULL);
++ gst_caps_save_thyself (caps, parent);
++
++ xmlDocDump (stdout, doc);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/debug/category.c gstreamer-0.10.23/tests/old/testsuite/debug/category.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/debug/category.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/debug/category.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,84 @@
++/*
++ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
++ *
++ * category.c: test the categories
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <gst/gst.h>
++#include <string.h>
++
++GST_DEBUG_CATEGORY (cat);
++#define GST_CAT_DEFAULT cat
++GST_DEBUG_CATEGORY_STATIC (cat_static);
++
++gint
++main (gint argc, gchar * argv[])
++{
++ GSList *before, *after;
++
++ unsetenv ("GST_DEBUG");
++ gst_init (&argc, &argv);
++
++ before = gst_debug_get_all_categories ();
++ GST_DEBUG_CATEGORY_INIT (cat, "cat", GST_DEBUG_FG_GREEN,
++ "default category for this test");
++ GST_DEBUG_CATEGORY_INIT (cat_static, "cat_static",
++ GST_DEBUG_BOLD | GST_DEBUG_FG_BLUE | GST_DEBUG_BG_RED,
++ "static category for this test");
++ after = gst_debug_get_all_categories ();
++
++ g_print ("removing default log function\n");
++#ifdef GST_DISABLE_GST_DEBUG
++ g_assert (gst_debug_remove_log_function (gst_debug_log_default) == 0);
++#else
++ g_assert (gst_debug_remove_log_function (gst_debug_log_default) == 1);
++ g_print
++ ("checking, if the two new categories are put into the category list correctly...\n");
++ g_assert (g_slist_length (after) - g_slist_length (before) == 2);
++ /* check the _get stuff */
++ g_print
++ ("checking, if the gst_debug_category_get_* stuff works with the categories...\n");
++ g_assert (strcmp (gst_debug_category_get_name (cat), "cat") == 0);
++ g_assert (gst_debug_category_get_color (cat) == GST_DEBUG_FG_GREEN);
++ g_assert (strcmp (gst_debug_category_get_description (cat),
++ "default category for this test") == 0);
++ g_assert (gst_debug_category_get_threshold (cat) ==
++ gst_debug_get_default_threshold ());
++ g_assert (strcmp (gst_debug_category_get_name (cat_static),
++ "cat_static") == 0);
++ g_assert (gst_debug_category_get_color (cat_static) | GST_DEBUG_FG_GREEN);
++ g_assert (gst_debug_category_get_color (cat_static) | GST_DEBUG_BG_RED);
++ g_assert (gst_debug_category_get_color (cat_static) | GST_DEBUG_BOLD);
++ g_assert (strcmp (gst_debug_category_get_description (cat_static),
++ "static category for this test") == 0);
++ g_assert (gst_debug_category_get_threshold (cat_static) ==
++ gst_debug_get_default_threshold ());
++ /* check if setting levels for names work */
++ g_print
++ ("checking if changing threshold for names affects existing categories...\n");
++ gst_debug_set_threshold_for_name ("cat", GST_LEVEL_DEBUG);
++ g_assert (gst_debug_category_get_threshold (cat) == GST_LEVEL_DEBUG);
++ g_assert (gst_debug_category_get_threshold (cat_static) ==
++ gst_debug_get_default_threshold ());
++ gst_debug_set_threshold_for_name ("cat_static", GST_LEVEL_INFO);
++ g_assert (gst_debug_category_get_threshold (cat) == GST_LEVEL_DEBUG);
++ g_assert (gst_debug_category_get_threshold (cat_static) == GST_LEVEL_INFO);
++#endif
++
++ g_print ("everything ok.\n");
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/debug/commandline.c gstreamer-0.10.23/tests/old/testsuite/debug/commandline.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/debug/commandline.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/debug/commandline.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,118 @@
++/*
++ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
++ *
++ * commandline.c: Test if the command line arguments work
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#ifdef HAVE_CONFIG_H
++#include "config.h"
++#endif
++#include <gst/gst.h>
++
++GST_DEBUG_CATEGORY (cat);
++GST_DEBUG_CATEGORY_STATIC (cat_static);
++
++#ifndef GST_DISABLE_GST_DEBUG
++static const gchar *lines[] = {
++ "--gst-debug-disable",
++ "--gst-debug-no-color",
++ "--gst-debug-level=4",
++ "--gst-debug=cat:4,cat_*:3",
++ "--gst-debug-level=4 --gst-debug=cat_*:5"
++};
++
++static void
++debug_not_reached (GstDebugCategory * category, GstDebugLevel level,
++ const gchar * file, const gchar * function, gint line, GObject * object,
++ GstDebugMessage * message, gpointer thread)
++{
++ g_assert_not_reached ();
++}
++#endif
++
++gint
++main (gint argc, gchar * argv[])
++{
++ if (argc == 1) {
++ /* this is the main run that calls the others */
++
++ unsetenv ("GST_DEBUG");
++ gst_init (&argc, &argv);
++#ifndef GST_DISABLE_GST_DEBUG
++ {
++ gint i, runs, exit;
++ gchar *command;
++
++ runs = G_N_ELEMENTS (lines);
++ for (i = 0; i < runs; i++) {
++ int ret;
++
++ command = g_strdup_printf ("./commandline %s %d", lines[i], i);
++ g_print ("running \"%s\"\n", command);
++ ret = g_spawn_command_line_sync (command, NULL, NULL, &exit, NULL);
++ g_assert (ret == TRUE);
++ g_assert (exit == 0);
++ g_print ("\"%s\" worked as expected.\n", command);
++ g_free (command);
++ }
++ }
++#endif
++
++ return 0;
++ } else {
++ gst_init (&argc, &argv);
++ if (argc != 2) {
++ g_print
++ ("something funny happened to the command line arguments, aborting.\n");
++ return 1;
++ }
++#ifndef GST_DISABLE_GST_DEBUG
++ g_assert (gst_debug_remove_log_function (gst_debug_log_default) == 1);
++#endif
++ GST_DEBUG_CATEGORY_INIT (cat, "cat", 0, "non-static category");
++ GST_DEBUG_CATEGORY_INIT (cat_static, "cat_static", 0, "static category");
++ switch (argv[1][0]) {
++ case '0':
++ g_assert (gst_debug_is_active () == FALSE);
++#ifndef GST_DISABLE_GST_DEBUG
++ gst_debug_add_log_function (debug_not_reached, NULL);
++#endif
++ GST_ERROR ("This will not be seen");
++ return 0;
++ case '1':
++ return gst_debug_is_colored ()? 1 : 0;
++ case '2':
++ g_assert (gst_debug_get_default_threshold () == 4);
++ g_assert (gst_debug_category_get_threshold (cat) == 4);
++ return 0;
++ case '3':
++ g_assert (gst_debug_get_default_threshold () == GST_LEVEL_DEFAULT);
++ g_assert (gst_debug_category_get_threshold (cat) == 4);
++ g_assert (gst_debug_category_get_threshold (cat_static) == 3);
++ return 0;
++ case '4':
++ g_assert (gst_debug_get_default_threshold () == 4);
++ g_assert (gst_debug_category_get_threshold (cat) == 4);
++ g_assert (gst_debug_category_get_threshold (cat_static) == 5);
++ return 0;
++ default:
++ g_print ("usupported command, aborting...\n");
++ return -1;
++ }
++ }
++ g_assert_not_reached ();
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/debug/global.c gstreamer-0.10.23/tests/old/testsuite/debug/global.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/debug/global.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/debug/global.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,112 @@
++/*
++ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
++ *
++ * global.c: Test global parameter setting/getting
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#ifdef HAVE_CONFIG_H
++#include "config.h"
++#endif
++
++#include <gst/gst.h>
++
++#define THREAD_COUNT 5
++#define ITERATIONS 20
++
++/* stupid logging functions */
++static void
++gst_debug_log_one (GstDebugCategory * category,
++ GstDebugLevel level,
++ const gchar * file,
++ const gchar * function,
++ gint line, GObject * object, GstDebugMessage * message, gpointer data)
++ G_GNUC_NO_INSTRUMENT;
++ static void gst_debug_log_two (GstDebugCategory * category,
++ GstDebugLevel level,
++ const gchar * file,
++ const gchar * function,
++ gint line, GObject * object, GstDebugMessage * message, gpointer thread)
++ G_GNUC_NO_INSTRUMENT;
++
++ static void
++ gst_debug_log_one (GstDebugCategory * category, GstDebugLevel level,
++ const gchar * file, const gchar * function, gint line, GObject * object,
++ GstDebugMessage * message, gpointer data)
++{
++}
++static void
++gst_debug_log_two (GstDebugCategory * category, GstDebugLevel level,
++ const gchar * file, const gchar * function, gint line, GObject * object,
++ GstDebugMessage * message, gpointer data)
++{
++}
++
++static gpointer
++thread_main (gpointer threadnum)
++{
++ gint num;
++ gint i;
++
++ num = GPOINTER_TO_INT (threadnum);
++ for (i = 0; i < ITERATIONS; i++) {
++ g_print ("iteration %d of thread %d starting\n", i, num);
++ /* do some stuff with global settings */
++ gst_debug_set_default_threshold (GST_LEVEL_DEBUG);
++ gst_debug_add_log_function (gst_debug_log_one, g_thread_self ());
++ gst_debug_add_log_function (gst_debug_log_two, NULL);
++
++ /* reset all the stuff we did */
++ gst_debug_set_default_threshold (GST_LEVEL_DEFAULT);
++ g_assert (gst_debug_remove_log_function_by_data (g_thread_self ()) == 1);
++ }
++
++ g_print ("Thread %d is done.\n", num);
++ return threadnum;
++}
++
++gint
++main (gint argc, gchar * argv[])
++{
++ gint i;
++ GThread *threads[THREAD_COUNT];
++
++ g_print ("initializing GStreamer\n");
++ gst_init (&argc, &argv);
++ g_assert (gst_debug_remove_log_function (gst_debug_log_default) == 1);
++
++ /* some checks for defaults */
++ g_print ("Doing startup checks\n");
++ g_assert (gst_debug_get_default_threshold () == GST_LEVEL_DEFAULT);
++
++ g_print ("creating %d threads\n", THREAD_COUNT);
++ for (i = 0; i < THREAD_COUNT; i++) {
++ g_assert ((threads[i] =
++ g_thread_create (thread_main, GINT_TO_POINTER (i), TRUE, NULL)));
++ }
++ g_print ("joining %d threads\n", THREAD_COUNT);
++ for (i = 0; i < THREAD_COUNT; i++) {
++ g_assert (GPOINTER_TO_INT (g_thread_join (threads[i])) == i);
++ }
++
++ /* some checks if everything worked */
++ g_print ("Doing shutdown checks\n");
++ g_assert (gst_debug_get_default_threshold () == GST_LEVEL_DEFAULT);
++ g_assert (gst_debug_remove_log_function (gst_debug_log_two) ==
++ THREAD_COUNT * ITERATIONS);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/debug/Makefile.am gstreamer-0.10.23/tests/old/testsuite/debug/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/testsuite/debug/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/debug/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,5 @@
++include ../Rules
++
++tests_pass = commandline category output printf_extension
++tests_fail =
++tests_ignore = global
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/debug/output.c gstreamer-0.10.23/tests/old/testsuite/debug/output.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/debug/output.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/debug/output.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,127 @@
++/*
++ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
++ *
++ * output.c: Test if the debugging output macros work
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <gst/gst.h>
++
++GST_DEBUG_CATEGORY_STATIC (cat_default);
++#define GST_CAT_DEFAULT cat_default
++GST_DEBUG_CATEGORY_STATIC (cat2);
++
++static gint count = -1;
++static GstElement *pipeline;
++
++#ifndef GST_DISABLE_GST_DEBUG
++static void
++check_message (GstDebugCategory * category, GstDebugLevel level,
++ const gchar * file, const gchar * function, gint line, GObject * object,
++ GstDebugMessage * message, gpointer unused)
++{
++ gint temp;
++
++ /* these checks require count to be set right. So the order in the main
++ funtion is actually important. */
++ /* <0 means no checks */
++ if (count < 0)
++ return;
++
++ g_print ("expecting \"%s\"...", (gchar *) message);
++ /* level */
++ temp = (count % 5) + 1;
++ g_assert (level == temp);
++ /* category */
++ temp = (count % 10) / 5;
++ g_assert (category == (temp ? cat2 : cat_default));
++ /* object */
++ temp = (count % 20) / 10;
++ g_assert (object == (GObject *) (temp ? pipeline : NULL));
++ g_print ("[OK]\n");
++}
++#endif
++
++gint
++main (gint argc, gchar * argv[])
++{
++
++ gst_init (&argc, &argv);
++
++ GST_DEBUG_CATEGORY_INIT (cat_default, "GST_Check_default", 0,
++ "default category for this test");
++ GST_DEBUG_CATEGORY_INIT (cat2, "GST_Check_2", 0,
++ "second category for this test");
++#ifndef GST_DISABLE_GST_DEBUG
++ g_assert (gst_debug_remove_log_function (gst_debug_log_default) == 1);
++#endif
++ gst_debug_add_log_function (check_message, NULL);
++
++ count = 0;
++ GST_ERROR ("This is an error.");
++ ++count;
++ GST_WARNING ("This is a warning.");
++ ++count;
++ GST_INFO ("This is an info message.");
++ ++count;
++ GST_DEBUG ("This is a debug message.");
++ ++count;
++ GST_LOG ("This is a log message.");
++ ++count;
++ GST_CAT_ERROR (cat2, "This is an error with category.");
++ ++count;
++ GST_CAT_WARNING (cat2, "This is a warning with category.");
++ ++count;
++ GST_CAT_INFO (cat2, "This is an info message with category.");
++ ++count;
++ GST_CAT_DEBUG (cat2, "This is a debug message with category.");
++ ++count;
++ GST_CAT_LOG (cat2, "This is a log message with category.");
++ count = -1;
++ pipeline = gst_element_factory_make ("pipeline", "testelement");
++ count = 10;
++ GST_ERROR_OBJECT (pipeline, "This is an error with object.");
++ ++count;
++ GST_WARNING_OBJECT (pipeline, "This is a warning with object.");
++ ++count;
++ GST_INFO_OBJECT (pipeline, "This is an info message with object.");
++ ++count;
++ GST_DEBUG_OBJECT (pipeline, "This is a debug message with object.");
++ ++count;
++ GST_LOG_OBJECT (pipeline, "This is a log message with object.");
++ ++count;
++ GST_CAT_ERROR_OBJECT (cat2, pipeline,
++ "This is an error with category and object.");
++ ++count;
++ GST_CAT_WARNING_OBJECT (cat2, pipeline,
++ "This is a warning with category and object.");
++ ++count;
++ GST_CAT_INFO_OBJECT (cat2, pipeline,
++ "This is an info message with category and object.");
++ ++count;
++ GST_CAT_DEBUG_OBJECT (cat2, pipeline,
++ "This is a debug message with category and object.");
++ ++count;
++ GST_CAT_LOG_OBJECT (cat2, pipeline,
++ "This is a log message with category and object.");
++ count = -1;
++
++#ifndef GST_DISABLE_GST_DEBUG
++ g_assert (gst_debug_remove_log_function (check_message) == 1);
++#endif
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/debug/printf_extension.c gstreamer-0.10.23/tests/old/testsuite/debug/printf_extension.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/debug/printf_extension.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/debug/printf_extension.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,48 @@
++/*
++ * Copyright (C) 2004 David A. Schleef <ds@schleef.org>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <gst/gst.h>
++
++gint
++main (gint argc, gchar * argv[])
++{
++ GstCaps *caps;
++ GstElement *element;
++ G_GNUC_UNUSED gpointer null = NULL;
++
++ /* G_GNUC_UNUSED int zero = 0; */
++
++ gst_init (&argc, &argv);
++
++ caps = gst_caps_from_string ("audio/x-raw-int, rate=44100");
++
++ element = gst_element_factory_make ("identity", NULL);
++
++ GST_ERROR ("This should print caps: %" GST_PTR_FORMAT, caps);
++ GST_ERROR ("This should print an object: %" GST_PTR_FORMAT, element);
++ GST_ERROR ("This should print null: %" GST_PTR_FORMAT, NULL);
++ GST_ERROR ("This should print a pointer: %" GST_PTR_FORMAT, &null);
++ /* 64 bit address to a 32 bit int will cause the GObject interpretation
++ * to segfault; since GST_PTR_FORMAT only works on stuff with
++ * sizeof(gpointer) */
++ /* GST_ERROR ("This should print a pointer: %" GST_PTR_FORMAT, &zero); */
++
++ /* GST_ERROR ("This should print a pointer: %" GST_PTR_FORMAT, (void *)1); */
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/dlopen/dlopen_gst.c gstreamer-0.10.23/tests/old/testsuite/dlopen/dlopen_gst.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/dlopen/dlopen_gst.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/dlopen/dlopen_gst.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,28 @@
++
++#include <gmodule.h>
++
++
++int
++main (int argc, char *argv[])
++{
++ GModule *module;
++ void (*symbol) (void);
++ gboolean ret;
++
++ module = g_module_open (".libs/libloadgst.so",
++#ifdef HAVE_G_MODULE_BIND_LOCAL
++ G_MODULE_BIND_LOCAL |
++#endif
++ G_MODULE_BIND_LAZY);
++ g_assert (module != NULL);
++
++ ret = g_module_symbol (module, "gst_init", (gpointer *) & symbol);
++ g_print ("'gst_init' is %s\n", ret ? "visible" : "not visible");
++
++ ret = g_module_symbol (module, "do_test", (gpointer *) & symbol);
++ g_assert (ret);
++
++ symbol ();
++
++ exit (0);
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/dlopen/loadgst.c gstreamer-0.10.23/tests/old/testsuite/dlopen/loadgst.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/dlopen/loadgst.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/dlopen/loadgst.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,26 @@
++
++#include <gst/gst.h>
++
++
++void
++do_test (void)
++{
++ GstElement *pipeline;
++ int i;
++
++ gst_init (NULL, NULL);
++
++ pipeline = gst_parse_launch ("fakesrc ! fakesink", NULL);
++ g_assert (pipeline != NULL);
++
++ gst_element_set_state (pipeline, GST_STATE_PLAYING);
++
++ for (i = 0; i < 100; i++) {
++ g_usleep (1000);
++ g_print ("%s", (i & 1) ? "+" : "-");
++ }
++ g_print ("\n");
++
++ gst_element_set_state (pipeline, GST_STATE_NULL);
++ gst_object_unref (pipeline);
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/dlopen/Makefile.am gstreamer-0.10.23/tests/old/testsuite/dlopen/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/testsuite/dlopen/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/dlopen/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,41 @@
++# ../Rules is not included because we specifically don't want the normal
++# AM_CFLAGS, etc.
++
++plugin_LTLIBRARIES = libloadgst.la
++
++tests_pass = dlopen_gst
++tests_fail =
++tests_ignore =
++
++libloadgst_la_SOURCES = loadgst.c
++libloadgst_la_CFLAGS = $(GST_OBJ_CFLAGS)
++libloadgst_la_LDFLAGS = -module -avoid-version $(GST_OBJ_LIBS)
++
++dlopen_gst_CFLAGS = $(GLIB_CFLAGS)
++dlopen_gst_LDFLAGS = $(GLIB_LIBS)
++
++TESTS_ENVIRONMENT= \
++ G_DEBUG=fatal_warnings \
++ GST_PLUGIN_PATH=$(top_builddir)/gst:. \
++ GST_REGISTRY=$(top_builddir)/testsuite/test-registry.xml
++
++check_PROGRAMS = $(tests_pass) $(tests_fail) $(tests_ignore)
++
++# make all tests depend on the versioned gst-register
++$(tests_pass) $(tests_fail): $(top_builddir)/tools/gst-register-@GST_MAJORMINOR@
++
++# rebuild gst-register-@GST_MAJORMINOR@ if needed
++# the EXEEXT is because am 1.6 complained about overrides
++$(top_builddir)/tools/gst-register-@GST_MAJORMINOR@$(EXEEXT):
++ cd $(top_builddir)/tools && make
++
++TESTS = $(top_builddir)/tools/gst-register-@GST_MAJORMINOR@ \
++ $(tests_pass) $(tests_fail)
++XFAIL_TESTS = $(tests_fail)
++
++# override to _not_ install the test plugins
++install-pluginLTLIBRARIES:
++
++# This rule is here so make distcheck works on machines where core
++# dumps have PIDs appended
++CLEANFILES = core.*
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/elements/gst-inspect-check.in gstreamer-0.10.23/tests/old/testsuite/elements/gst-inspect-check.in
+--- gstreamer-0.10.23.orig/tests/old/testsuite/elements/gst-inspect-check.in 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/elements/gst-inspect-check.in 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,90 @@
++#!/usr/bin/perl -w
++
++# checks all built plugins by running gst-inspect on each element
++# and checking for warnings on stderr
++
++### packages
++
++use File::Basename;
++
++print " _______\n";
++print " (__) / \\\n";
++print " (oo) ( M O O )\n";
++print " /-------\\/ --'\\_______/\n";
++print " / | ||\n";
++print "* ||----||\n";
++print " ^^ ^^\n";
++
++my $num_warnings = 0;
++my $path = `dirname $0`;
++chomp $path;
++$path = "../../tools";
++
++$gst_inspect = "$path/gst-inspect-@GST_MAJORMINOR@";
++
++sub check_all_elements
++{
++ #send stderr to /dev/null
++ my $command = "$gst_inspect 2>/dev/null";
++ my @lines = `$command`;
++
++ if (!@lines) {
++ print ("gst-inspect returned nothing\n");
++ return -1;
++ }
++ while ($_ = shift(@lines)){
++ my @matches = m/^\w+:\s+(\w+):/;
++ if(@matches){
++ check_element($matches[0]);
++ }
++ }
++ if ($num_warnings > 0){
++ print("there are $num_warnings warnings to be fixed\n");
++ return -1;
++ }
++ return 0;
++}
++
++sub check_element($)
++{
++ my ($element) = @_;
++ print "running inspect on $element\n";
++
++ # capture stderr, send stdout to /dev/null
++ my $command = "$gst_inspect $element 2>&1 1>/dev/null";
++
++ my @lines = `$command`;
++
++ while ($_ = shift(@lines)){
++ # ignore INFO lines, they are ok
++ if (! /INFO/){
++ print $_;
++
++ # do this to ignore empty lines
++ if (length > 1){
++ $num_warnings++;
++ }
++ }
++ }
++ system("$gst_inspect $element 2>/dev/null 1>/dev/null");
++ if ($? != 0){
++ my $exit_value = $? >> 8;
++ my $signal_num = $? & 127;
++ my $dumped_core = $? & 128;
++ if ($exit_value){
++ print("error value on exit: $exit_value\n");
++ }
++ if ($signal_num){
++ print("signal caused exit: $signal_num\n");
++ }
++ if ($dumped_core){
++ print("dumped core: $dumped_core\n");
++ }
++ $num_warnings++
++ }
++}
++
++### main
++
++exit check_all_elements ();
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/elements/Makefile.am gstreamer-0.10.23/tests/old/testsuite/elements/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/testsuite/elements/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/elements/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,15 @@
++include ../Rules
++
++tests_pass = gst-inspect-check struct_size
++tests_fail =
++tests_ignore =
++
++noinst_HEADERS = struct_i386.h
++
++gst_inspect_check_SOURCES =
++gst-inspect-check$(EXEEXT): $(srcdir)/gst-inspect-check.in
++ sed s/@[G]ST_MAJORMINOR@/@GST_MAJORMINOR@/ \
++ $(srcdir)/gst-inspect-check.in >gst-inspect-check$(EXEEXT)
++ chmod +x gst-inspect-check$(EXEEXT)
++
++EXTRA_DIST = gst-inspect-check.in
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/elements/struct_i386.h gstreamer-0.10.23/tests/old/testsuite/elements/struct_i386.h
+--- gstreamer-0.10.23.orig/tests/old/testsuite/elements/struct_i386.h 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/elements/struct_i386.h 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,148 @@
++/* Generated by GStreamer-0.8.4.1 */
++Struct list[] = {
++ {"GstPoptOption", sizeof (GstPoptOption), 28}
++ ,
++ {"GstBuffer", sizeof (GstBuffer), 108}
++ ,
++ {"GstCaps", sizeof (GstCaps), 28}
++ ,
++ {"GstStaticCaps", sizeof (GstStaticCaps), 48}
++ ,
++ {"GstClockEntry", sizeof (GstClockEntry), 36}
++ ,
++ {"GstClock", sizeof (GstClock), 128}
++ ,
++ {"GstClockClass", sizeof (GstClockClass), 172}
++ ,
++ {"GstData", sizeof (GstData), 40}
++ ,
++ {"GstElementDetails", sizeof (GstElementDetails), 32}
++ ,
++ {"GstElementFactory", sizeof (GstElementFactory), 112}
++ ,
++ {"GstElementFactoryClass", sizeof (GstElementFactoryClass), 104}
++ ,
++ {"GstFormatDefinition", sizeof (GstFormatDefinition), 12}
++ ,
++ {"GstIndexEntry", sizeof (GstIndexEntry), 20}
++ ,
++ {"GstIndexGroup", sizeof (GstIndexGroup), 16}
++ ,
++ {"GstIndex", sizeof (GstIndex), 100}
++ ,
++ {"GstIndexClass", sizeof (GstIndexClass), 156}
++ ,
++ {"GstIndexAssociation", sizeof (GstIndexAssociation), 12}
++ ,
++ {"GstIndexFactory", sizeof (GstIndexFactory), 64}
++ ,
++ {"GstIndexFactoryClass", sizeof (GstIndexFactoryClass), 104}
++ ,
++ {"GstDebugCategory", sizeof (GstDebugCategory), 16}
++ ,
++ {"GstRealPad", sizeof (GstRealPad), 196}
++ ,
++ {"GstRealPadClass", sizeof (GstRealPadClass), 168}
++ ,
++ {"GstGhostPad", sizeof (GstGhostPad), 88}
++ ,
++ {"GstGhostPadClass", sizeof (GstGhostPadClass), 152}
++ ,
++ {"GstStaticPadTemplate", sizeof (GstStaticPadTemplate), 60}
++ ,
++ {"GstPipeline", sizeof (GstPipeline), 180}
++ ,
++ {"GstPipelineClass", sizeof (GstPipelineClass), 328}
++ ,
++ {"GstPlugin", sizeof (GstPlugin), 92}
++ ,
++ {"GstPluginDesc", sizeof (GstPluginDesc), 56}
++ ,
++ {"GstPluginFeature", sizeof (GstPluginFeature), 40}
++ ,
++ {"GstPluginFeatureClass", sizeof (GstPluginFeatureClass), 88}
++ ,
++ {"GstProbe", sizeof (GstProbe), 12}
++ ,
++ {"GstProbeDispatcher", sizeof (GstProbeDispatcher), 8}
++ ,
++ {"GstQueryTypeDefinition", sizeof (GstQueryTypeDefinition), 12}
++ ,
++ {"GstQueue", sizeof (GstQueue), 252}
++ ,
++ {"GstQueueSize", sizeof (GstQueueSize), 16}
++ ,
++ {"GstQueueClass", sizeof (GstQueueClass), 300}
++ ,
++ {"GstRegistry", sizeof (GstRegistry), 56}
++ ,
++ {"GstRegistryClass", sizeof (GstRegistryClass), 116}
++ ,
++ {"GstSchedulerFactory", sizeof (GstSchedulerFactory), 64}
++ ,
++ {"GstSchedulerFactoryClass", sizeof (GstSchedulerFactoryClass), 104}
++ ,
++ {"GstStructure", sizeof (GstStructure), 28}
++ ,
++ {"GstSystemClock", sizeof (GstSystemClock), 152}
++ ,
++ {"GstSystemClockClass", sizeof (GstSystemClockClass), 188}
++ ,
++ {"GstTagSetterIFace", sizeof (GstTagSetterIFace), 8}
++ ,
++ {"GstThread", sizeof (GstThread), 196}
++ ,
++ {"GstThreadClass", sizeof (GstThreadClass), 332}
++ ,
++ {"GstTrace", sizeof (GstTrace), 20}
++ ,
++ {"GstTraceEntry", sizeof (GstTraceEntry), 128}
++ ,
++ {"GstAllocTrace", sizeof (GstAllocTrace), 16}
++ ,
++ {"GstTrashStack", sizeof (GstTrashStack), 12}
++ ,
++ {"GstTrashStackElement", sizeof (GstTrashStackElement), 4}
++ ,
++ {"GstTypeFind", sizeof (GstTypeFind), 32}
++ ,
++ {"GstTypeFindFactory", sizeof (GstTypeFindFactory), 72}
++ ,
++ {"GstTypeFindFactoryClass", sizeof (GstTypeFindFactoryClass), 104}
++ ,
++ {"GstObject", sizeof (GstObject), 44}
++ ,
++ {"GstObjectClass", sizeof (GstObjectClass), 120}
++ ,
++ {"GstPad", sizeof (GstPad), 68}
++ ,
++ {"GstPadClass", sizeof (GstPadClass), 136}
++ ,
++ {"GstPadTemplate", sizeof (GstPadTemplate), 76}
++ ,
++ {"GstPadTemplateClass", sizeof (GstPadTemplateClass), 140}
++ ,
++ {"GstElement", sizeof (GstElement), 124}
++ ,
++ {"GstElementClass", sizeof (GstElementClass), 272}
++ ,
++ {"GstBin", sizeof (GstBin), 164}
++ ,
++ {"GstBinClass", sizeof (GstBinClass), 312}
++ ,
++ {"GstScheduler", sizeof (GstScheduler), 92}
++ ,
++ {"GstSchedulerClass", sizeof (GstSchedulerClass), 216}
++ ,
++ {"GstEvent", sizeof (GstEvent), 176}
++ ,
++ {"GstURIHandlerInterface", sizeof (GstURIHandlerInterface), 44}
++ ,
++ {"GstValueTable", sizeof (GstValueTable), 32}
++ ,
++ {"GstXML", sizeof (GstXML), 68}
++ ,
++ {"GstXMLClass", sizeof (GstXMLClass), 144}
++ ,
++ {NULL, 0, 0}
++};
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/elements/struct_size.c gstreamer-0.10.23/tests/old/testsuite/elements/struct_size.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/elements/struct_size.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/elements/struct_size.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,69 @@
++
++#ifdef HAVE_CONFIG_H
++#include "config.h"
++#endif
++
++#include <gst/gst.h>
++#include <gst/gstqueue.h>
++#include <gst/gsttrashstack.h>
++#include <stdlib.h>
++
++typedef struct
++{
++ char *name;
++ int size;
++ int abi_size;
++}
++Struct;
++
++#ifdef HAVE_CPU_I386
++#include "struct_i386.h"
++#define HAVE_ABI_SIZES
++#else
++/* in case someone wants to generate a new arch */
++#include "struct_i386.h"
++#endif
++
++int
++main (int argc, char *argv[])
++{
++ int i;
++
++ if (argc > 1) {
++ g_print ("/* Generated by GStreamer-%s */\n", GST_VERSION);
++ g_print ("Struct list[] = {\n");
++ for (i = 0; list[i].name; i++) {
++ g_print (" { \"%s\", sizeof (%s), %d },\n",
++ list[i].name, list[i].name, list[i].size);
++ }
++ g_print (" { NULL, 0, 0}\n");
++ g_print ("};\n");
++ } else {
++ g_print ("Run './struct_size regen' to regenerate structs.h\n");
++
++#ifdef HAVE_ABI_SIZES
++ {
++ gboolean ok = TRUE;
++
++ for (i = 0; list[i].name; i++) {
++ if (list[i].size != list[i].abi_size) {
++ ok = FALSE;
++ g_print ("sizeof(%s) is %d, expected %d\n",
++ list[i].name, list[i].size, list[i].abi_size);
++ }
++ }
++ if (ok) {
++ g_print ("All structures expected size\n");
++ } else {
++ g_print ("failed\n");
++ exit (1);
++ }
++ }
++#else
++ g_print ("No structure size list was generated for this architecture\n");
++ g_print ("ignoring\n");
++#endif
++ }
++
++ exit (0);
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/indexers/cache1.c gstreamer-0.10.23/tests/old/testsuite/indexers/cache1.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/indexers/cache1.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/indexers/cache1.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,114 @@
++/* GStreamer
++ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#include <gst/gst.h>
++
++static void
++lookup (GstIndex * index, GstIndexLookupMethod method,
++ GstFormat src_format, gint64 src_value,
++ GstFormat dest_format, gint64 expecting)
++{
++ GstIndexEntry *entry;
++ gint64 result;
++
++ entry = gst_index_get_assoc_entry (index, 0, method, 0,
++ src_format, src_value);
++ if (entry) {
++ gst_index_entry_assoc_map (entry, dest_format, &result);
++
++ if (result == expecting) {
++ g_print ("OK (%" G_GINT64_FORMAT ")\n", result);
++ } else {
++ g_print ("FAIL - expecting %" G_GINT64_FORMAT ", got %" G_GINT64_FORMAT
++ "\n", expecting, result);
++ }
++ } else {
++ const GstFormatDefinition *def = gst_format_get_details (src_format);
++
++ if (expecting == -1)
++ g_print ("OK (not found)\n");
++ else
++ g_print ("FAIL - no index entry found for %" G_GINT64_FORMAT
++ " %s, expecting %" G_GINT64_FORMAT "\n", src_value, def->nick,
++ expecting);
++ }
++}
++
++typedef struct _GstIndexTestCase
++{
++ GstIndexLookupMethod method;
++ GstFormat src_format;
++ gint64 src_value;
++ GstFormat dest_format;
++ gint64 expecting;
++} GstIndexTestCase;
++
++const static GstIndexTestCase cases[] = {
++ {GST_INDEX_LOOKUP_EXACT, GST_FORMAT_BYTES, 3, GST_FORMAT_TIME, 3000},
++ {GST_INDEX_LOOKUP_EXACT, GST_FORMAT_TIME, 5000, GST_FORMAT_BYTES, 5},
++ {GST_INDEX_LOOKUP_EXACT, GST_FORMAT_TIME, 5010, GST_FORMAT_BYTES, -1},
++ {GST_INDEX_LOOKUP_BEFORE, GST_FORMAT_TIME, 5010, GST_FORMAT_BYTES, 5},
++ {GST_INDEX_LOOKUP_AFTER, GST_FORMAT_TIME, 5010, GST_FORMAT_BYTES, 6},
++ {GST_INDEX_LOOKUP_BEFORE, GST_FORMAT_TIME, 0, GST_FORMAT_BYTES, 0},
++ {GST_INDEX_LOOKUP_AFTER, GST_FORMAT_TIME, G_MAXINT64, GST_FORMAT_BYTES, -1},
++ {GST_INDEX_LOOKUP_AFTER, GST_FORMAT_TIME, 0, GST_FORMAT_BYTES, 0},
++ {GST_INDEX_LOOKUP_BEFORE, GST_FORMAT_TIME, -1, GST_FORMAT_BYTES, -1},
++ {GST_INDEX_LOOKUP_BEFORE, GST_FORMAT_TIME, G_MAXINT64, GST_FORMAT_BYTES,
++ 99999},
++ {GST_INDEX_LOOKUP_AFTER, GST_FORMAT_TIME, G_MAXINT64, GST_FORMAT_BYTES, -1},
++};
++
++gint
++main (gint argc, gchar * argv[])
++{
++ GstIndex *index;
++ GstElement *element;
++ gint i, id;
++
++ gst_init (&argc, &argv);
++
++ if (argc != 2) {
++ g_print ("usage: cache1 (memindex | fileindex)\n");
++ exit (0);
++ }
++
++ index = gst_index_factory_make (argv[1]);
++ g_assert (index != NULL);
++
++ element = gst_element_factory_make ("identity", "element");
++ g_assert (element != NULL);
++
++ gst_index_get_writer_id (index, GST_OBJECT (element), &id);
++
++ g_print ("Building index...\n");
++
++ for (i = 0; i < 100000; i++) {
++ gst_index_add_association (index, 0, 0, GST_FORMAT_BYTES, (gint64) i,
++ GST_FORMAT_TIME, (gint64) (i * 1000), 0);
++ }
++
++ g_print ("Testing index...\n");
++
++ for (i = 0; i < (sizeof (cases) / sizeof (GstIndexTestCase)); i++) {
++ lookup (index, cases[i].method, cases[i].src_format, cases[i].src_value,
++ cases[i].dest_format, cases[i].expecting);
++ }
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/indexers/indexdump.c gstreamer-0.10.23/tests/old/testsuite/indexers/indexdump.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/indexers/indexdump.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/indexers/indexdump.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,81 @@
++/* GStreamer
++ * Copyright (C) 2003 Erik Walthinsen <omega@cse.ogi.edu>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#include <gst/gst.h>
++
++static void
++my_resolver (GstIndex * index, GstObject * _ign, gchar ** writer_string,
++ gpointer user_data)
++{
++ *writer_string = user_data;
++}
++
++gint
++main (gint argc, gchar * argv[])
++{
++ GstIndex *index;
++ GstObject *identity;
++ gint id;
++ gint64 cur;
++
++ gst_init (&argc, &argv);
++
++ if (argc != 3) {
++ g_print ("usage: dumpfileindex /path/to/fileindex writer_id\n");
++ exit (0);
++ }
++
++ index = gst_index_factory_make ("fileindex");
++ g_assert (index != NULL);
++
++ g_object_set (index, "location", argv[1], NULL);
++ gst_index_set_resolver (index, (GstIndexResolver) my_resolver, argv[2]);
++
++ identity = (GstObject *) gst_element_factory_make ("identity", "element");
++ g_assert (identity);
++ gst_index_get_writer_id (index, identity, &id);
++
++ cur = 0;
++ while (1) {
++ gint fx;
++ GstIndexEntry *entry =
++ gst_index_get_assoc_entry (index, id, GST_INDEX_LOOKUP_AFTER, 0,
++ GST_FORMAT_TIME, cur);
++
++ if (!entry)
++ break;
++
++ g_print ("%x", GST_INDEX_ASSOC_FLAGS (entry));
++ for (fx = 0; fx < GST_INDEX_NASSOCS (entry); fx++) {
++ GstFormat fmt = GST_INDEX_ASSOC_FORMAT (entry, fx);
++ const GstFormatDefinition *def = gst_format_get_details (fmt);
++
++ if (fmt == GST_FORMAT_TIME) {
++ cur = GST_INDEX_ASSOC_VALUE (entry, fx) + 1;
++ g_print (" time %.4f",
++ GST_INDEX_ASSOC_VALUE (entry, fx) / (double) GST_SECOND);
++ } else
++ g_print (" %s %" G_GINT64_FORMAT, def->nick,
++ GST_INDEX_ASSOC_VALUE (entry, fx));
++ }
++ g_print ("\n");
++ }
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/indexers/Makefile.am gstreamer-0.10.23/tests/old/testsuite/indexers/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/testsuite/indexers/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/indexers/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,5 @@
++include ../Rules
++
++tests_pass = cache1 indexdump
++tests_fail =
++tests_ignore =
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/Makefile.am gstreamer-0.10.23/tests/old/testsuite/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/testsuite/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,38 @@
++include Rules
++
++
++if GST_DISABLE_PARSE
++GST_PARSE_DIRS =
++else
++GST_PARSE_DIRS = parse
++endif
++
++if GST_DISABLE_GST_DEBUG
++GST_DEBUG_DIRS =
++else
++GST_DEBUG_DIRS = debug
++endif
++
++SUBDIRS = \
++ caps \
++ $(GST_DEBUG_DIRS) \
++ dlopen \
++ elements indexers \
++ $(GST_PARSE_DIRS) \
++ plugin refcounting states threads
++
++DIST_SUBDIRS = \
++ caps \
++ debug \
++ dlopen \
++ elements indexers \
++ parse \
++ plugin refcounting states threads
++
++tests_pass =
++tests_fail =
++tests_ignore =
++
++# we makes them, we gots to clean them
++CLEANFILES += test-registry.xml
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/parse/Makefile.am gstreamer-0.10.23/tests/old/testsuite/parse/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/testsuite/parse/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/parse/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,5 @@
++include ../Rules
++
++tests_pass = parse1 parse2
++tests_fail =
++tests_ignore =
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/parse/parse1.c gstreamer-0.10.23/tests/old/testsuite/parse/parse1.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/parse/parse1.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/parse/parse1.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,229 @@
++/*
++ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
++ *
++ * parse1.c: Test various parsing stuff
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <gst/gst.h>
++
++#include <string.h>
++#include <unistd.h>
++
++/* variables used by the TEST_* macros */
++static gint test = 0;
++static guint iterations;
++static GstElement *cur = NULL;
++static GError *error = NULL;
++
++/* variables needed for checking */
++static gint i;
++static gboolean b;
++static gchar *s;
++
++#define TEST_CHECK_FAIL(condition) G_STMT_START{ \
++ if (condition) { \
++ g_print ("TEST %2d line %3d OK\n", test, __LINE__); \
++ } else { \
++ g_print ("TEST %2d line %3d FAILED : %s\n", test, __LINE__, \
++ #condition); \
++ return -test; \
++ } \
++}G_STMT_END
++
++#define TEST_START(pipeline) G_STMT_START{ \
++ g_print ("TEST %2d line %3d START : %s\n", ++test, __LINE__, \
++ pipeline); \
++ cur = gst_parse_launch (pipeline, &error); \
++ if (error == NULL) { \
++ g_print ("TEST %2d line %3d CREATED\n", test, __LINE__); \
++ } else { \
++ g_print ("TEST %2d line %3d FAILED : %s\n", test, __LINE__, \
++ error->message); \
++ g_error_free (error); \
++ return -test; \
++ } \
++}G_STMT_END
++
++#define TEST_OK G_STMT_START{ \
++ gst_object_unref (cur); \
++ cur = NULL; \
++ g_print ("TEST %2d line %3d COMPLETE\n", test, __LINE__); \
++}G_STMT_END
++
++#define TEST_RUN G_STMT_START{ \
++ alarm(10); \
++ g_print ("TEST %2d line %3d RUN\n", test, __LINE__); \
++ if (gst_element_set_state (cur, GST_STATE_PLAYING) \
++ == GST_STATE_CHANGE_FAILURE) { \
++ g_print ("TEST %2d line %3d FAILED : " \
++ "pipeline could not be set to PLAYING\n", test, __LINE__); \
++ return -test; \
++ } \
++ iterations = 0; \
++ while (gst_bin_iterate (GST_BIN (cur))) iterations++; \
++ if (gst_element_set_state (cur, GST_STATE_NULL) \
++ == GST_STATE_CHANGE_FAILURE) { \
++ g_print ("TEST %2d line %3d FAILED : " \
++ "pipeline could not be reset to state NULL\n", test, __LINE__); \
++ return -test; \
++ } \
++ g_print ("TEST %2d line %3d STOPPED : %u iterations\n", \
++ test, __LINE__, iterations); \
++ alarm(0); \
++}G_STMT_END
++
++#define PIPELINE1 "fakesrc"
++#define PIPELINE2 "fakesrc name=donald num-buffers= 27 silent =TruE sizetype = 3 eos = falSe data= Subbuffer\\ data"
++#define PIPELINE3 "fakesrc identity fakesink"
++#define PIPELINE4 "fakesrc num-buffers=4 .src ! identity !.sink identity .src ! .sink fakesink"
++#define PIPELINE5 "fakesrc num-buffers=4 name=src identity name=id1 identity name = id2 fakesink name =sink src. ! id1. id1.! id2.sink id2.src!sink.sink"
++#define PIPELINE6 "pipeline.(name=\"john\" fakesrc num-buffers=4 ( thread. ( ! queue ! identity !{ queue ! fakesink }) ))"
++#define PIPELINE7 "fakesrc num-buffers=4 ! tee name=tee .src%d! fakesink tee.src%d ! fakesink fakesink name =\"foo\" tee.src%d ! foo."
++/* aggregator is borked
++#define PIPELINE8 "fakesrc num-buffers=4 ! tee name=tee1 .src0,src1 ! .sink0, sink1 aggregator ! fakesink"
++*/
++#define PIPELINE8 "fakesrc num-buffers=4 ! fakesink"
++#define PIPELINE9 "fakesrc num-buffers=4 ! test. fakesink name=test"
++#define PIPELINE10 "( fakesrc num-buffers=\"4\" ! ) identity ! fakesink"
++#define PIPELINE11 "fakesink name = sink identity name=id ( fakesrc num-buffers=\"4\" ! id. ) id. ! sink."
++#define PIPELINE12 "fakesrc num-buffers=4 name=a:b a:b. ! fakesink"
++
++gint
++main (gint argc, gchar * argv[])
++{
++ gst_init (&argc, &argv);
++
++ /**
++ * checks:
++ * - specifying an element works :)
++ * - if only 1 element is requested, no bin is returned, but the element
++ */
++ TEST_START (PIPELINE1);
++ TEST_CHECK_FAIL (G_OBJECT_TYPE (cur) == g_type_from_name ("GstFakeSrc"));
++ TEST_OK;
++
++ /**
++ * checks:
++ * - properties works
++ * - string, int, boolean and enums can be properly set
++ * (note: eos should be false)
++ * - first test of escaping strings
++ */
++ TEST_START (PIPELINE2);
++ g_object_get (G_OBJECT (cur), "name", &s, "num-buffers", &i, "silent", &b,
++ NULL);
++ TEST_CHECK_FAIL (strcmp (s, "donald") == 0);
++ TEST_CHECK_FAIL (i == 27);
++ TEST_CHECK_FAIL (b == TRUE);
++ g_object_get (G_OBJECT (cur), "eos", &b, "sizetype", &i, NULL);
++ TEST_CHECK_FAIL (i == 3);
++ TEST_CHECK_FAIL (b == FALSE);
++ g_object_get (G_OBJECT (cur), "data", &i, NULL);
++ TEST_CHECK_FAIL (i == 2);
++ TEST_OK;
++
++ /**
++ * checks:
++ * - specifying multiple elements without links works
++ * - if multiple toplevel elements exist, a pipeline is returned
++ */
++ TEST_START (PIPELINE3);
++ TEST_CHECK_FAIL (GST_BIN (cur)->numchildren == 3); /* a bit hacky here */
++ TEST_CHECK_FAIL (GST_IS_PIPELINE (cur));
++ TEST_OK;
++
++ /**
++ * checks:
++ * - test default link "!"
++ * - test if specifying pads on links works
++ */
++ TEST_START (PIPELINE4);
++ TEST_RUN;
++ TEST_OK;
++
++ /**
++ * checks:
++ * - test if appending the links works, too
++ * - check if the pipeline constructed works the same as the one before (how?)
++ */
++ TEST_START (PIPELINE5);
++ TEST_RUN;
++ TEST_OK;
++
++ /**
++ * checks:
++ * - test various types of bins
++ * - test if linking across bins works
++ * - test if escaping strings works
++ */
++ TEST_START (PIPELINE6);
++ TEST_CHECK_FAIL (GST_IS_PIPELINE (cur));
++ g_object_get (G_OBJECT (cur), "name", &s, NULL);
++ TEST_CHECK_FAIL (strcmp (s, "john") == 0);
++ TEST_RUN;
++ TEST_OK;
++
++ /**
++ * checks:
++ * - test request pads
++ */
++ TEST_START (PIPELINE7);
++ TEST_RUN;
++ TEST_OK;
++
++ /**
++ * checks:
++ * - multiple pads on 1 link
++ */
++ TEST_START (PIPELINE8);
++ TEST_RUN;
++ TEST_OK;
++
++ /**
++ * checks:
++ * - failed in grammar.y cvs version 1.17
++ */
++ TEST_START (PIPELINE9);
++ TEST_RUN;
++ TEST_OK;
++
++ /**
++ * checks:
++ * - failed in grammar.y cvs version 1.17
++ */
++ TEST_START (PIPELINE10);
++ TEST_RUN;
++ TEST_OK;
++
++ /**
++ * checks:
++ * - failed in grammar.y cvs version 1.18
++ */
++ TEST_START (PIPELINE11);
++ TEST_RUN;
++ TEST_OK;
++
++ /**
++ * checks:
++ * - fails because a:b. is not a valid element reference in parse.l cvs rev 1.29
++ */
++ TEST_START (PIPELINE12);
++ TEST_RUN;
++ TEST_OK;
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/parse/parse2.c gstreamer-0.10.23/tests/old/testsuite/parse/parse2.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/parse/parse2.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/parse/parse2.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,212 @@
++/*
++ * Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
++ *
++ * parse1.c: Test common pipelines (need various plugins)
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public
++ * License along with this library; if not, write to the Free
++ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <gst/gst.h>
++
++#include <string.h>
++
++/* variables used by the TEST_* macros */
++static gint test = 0;
++static guint iterations;
++static GstElement *cur = NULL;
++static GError *error = NULL;
++static char *audio_file = NULL;
++static char *video_file = NULL;
++
++/* variables needed for checking */
++
++#define TEST_CHECK_FAIL(condition) G_STMT_START{ \
++ if (condition) { \
++ g_print ("TEST %2d line %3d OK\n", test, __LINE__); \
++ } else { \
++ g_print ("TEST %2d line %3d FAILED : %s\n", test, __LINE__, #condition); \
++ return -test; \
++ } \
++}G_STMT_END
++#ifdef G_HAVE_ISO_VARARGS
++#define TEST_START(...) G_STMT_START{ \
++ gchar *pipeline = g_strdup_printf (__VA_ARGS__); \
++ g_print ("TEST %2d line %3d START : %s\n", ++test, __LINE__, pipeline); \
++ cur = gst_parse_launch (pipeline, &error); \
++ if (error == NULL) { \
++ g_print ("TEST %2d line %3d CREATED\n", test, __LINE__); \
++ } else { \
++ g_print ("TEST %2d line %3d FAILED : %s\n", test, __LINE__, error->message); \
++ g_error_free (error); \
++ return -test; \
++ } \
++ g_free (pipeline); \
++}G_STMT_END
++#elif defined(G_HAVE_GNUC_VARARGS)
++#define TEST_START(pipe...) G_STMT_START{ \
++ gchar *pipeline = g_strdup_printf ( ## pipe ); \
++ g_print ("TEST %2d line %3d START : %s\n", ++test, __LINE__, pipeline); \
++ cur = gst_parse_launch (pipeline, &error); \
++ if (error == NULL) { \
++ g_print ("TEST %2d line %3d CREATED\n", test, __LINE__); \
++ } else { \
++ g_print ("TEST %2d line %3d FAILED : %s\n", test, __LINE__, error->message); \
++ g_error_free (error); \
++ return -test; \
++ } \
++ g_free (pipeline); \
++}G_STMT_END
++#else
++#error Please fix this macro here
++#define TEST_START(pipe...) G_STMT_START{ \
++ gchar *pipeline = g_strdup_printf (__VA_ARGS__); \
++ g_print ("TEST %2d line %3d START : %s\n", ++test, __LINE__, pipeline); \
++ cur = gst_parse_launch (pipeline, &error); \
++ if (error == NULL) { \
++ g_print ("TEST %2d line %3d CREATED\n", test, __LINE__); \
++ } else { \
++ g_print ("TEST %2d line %3d FAILED : %s\n", test, __LINE__, error->message); \
++ g_error_free (error); \
++ return -test; \
++ } \
++ g_free (pipeline); \
++}G_STMT_END
++#endif
++#define TEST_OK G_STMT_START{ \
++ gst_object_unref (cur); \
++ cur = NULL; \
++ g_print ("TEST %2d line %3d COMPLETE\n", test, __LINE__); \
++}G_STMT_END
++#define TEST_RUN(iters) G_STMT_START{ \
++ gint it = iters; \
++ g_print ("TEST %2d line %3d RUN\n", test, __LINE__); \
++ if (gst_element_set_state (cur, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) { \
++ g_print ("TEST %2d line %3d FAILED : pipeline could not be set to state PLAYING\n", test, __LINE__); \
++ return -test; \
++ } \
++ iterations = 0; \
++ while (gst_bin_iterate (GST_BIN (cur)) && it != 0) { \
++ iterations++; \
++ it--; \
++ } \
++ if (gst_element_set_state (cur, GST_STATE_NULL) == GST_STATE_CHANGE_FAILURE) { \
++ g_print ("TEST %2d line %3d FAILED : pipeline could not be reset to state NULL\n", test, __LINE__); \
++ return -test; \
++ } \
++ g_print ("TEST %2d line %3d STOPPED : %u iterations\n", test, __LINE__, iterations); \
++}G_STMT_END
++#define TEST_FINISH G_STMT_START{ \
++ g_print("\n"); \
++ g_print("To run this test there are things required that you do not have. (see above)\n"); \
++ g_print("Please correct the above mentioned problem if you want to run this test.\n"); \
++ g_print("Currently the following tests will be ignored.\n"); \
++ g_print("\n"); \
++ exit (0); \
++}G_STMT_END
++#define TEST_REQUIRE(condition, error) G_STMT_START{ \
++ if (condition) { \
++ g_print ("REQUIRE line %3d OK\n", __LINE__); \
++ } else { \
++ g_print ("REQUIRE line %3d EXIT : %s\n", __LINE__, (error)); \
++ TEST_FINISH; \
++ } \
++}G_STMT_END
++#define TEST_REQUIRE_ELEMENT(element_name) G_STMT_START{ \
++ GstElement *element = gst_element_factory_make ((element_name), NULL); \
++ if (element) { \
++ g_print ("REQUIRE line %3d OK\n", __LINE__); \
++ gst_object_unref (element); \
++ } else { \
++ g_print ("REQUIRE line %3d EXIT : No element of type \"%s\" available. Exiting.\n", __LINE__, (element_name)); \
++ TEST_FINISH; \
++ } \
++}G_STMT_END
++
++#define PIPELINE1 "filesrc blocksize =8192 location=%s ! mad ! osssink"
++#define PIPELINE2 "filesrc location=%s ! mpegdemux ! mpeg2dec ! xvimagesink"
++#define PIPELINE3 "filesrc location=%s ! mpegdemux name = demux ! mpeg2dec ! { queue ! xvimagesink } demux.audio_00 ! mad ! osssink"
++#define PIPELINE4 "pipeline. ( { filesrc location=%s ! spider name=spider ! { queue ! volume ! ( tee name=tee ! { queue ! ( goom ) ! colorspace ! ( xvimagesink ) } tee. ! { queue ! ( osssink ) } ) } spider. ! { queue ! colorspace ( xvimagesink ) } } )"
++#define PIPELINE5 "pipeline. ( { filesrc location=%s ! spider name=spider ! ( tee name=tee ! { queue ! spider ! ( goom ) ! colorspace ! ( xvimagesink ) } tee. ! { queue ! volume ! ( osssink ) } ) spider. ! { queue! colorspace ( xvimagesink ) } } )"
++
++/* FIXME: Should this run, too?
++#define PIPELINE3 "filesrc location=%s ! mpegdemux name = demux ! mpeg2dec ! { queue ! xvimagesink } demux.audio_%%02d ! mad ! osssink"
++*/
++
++gint
++main (gint argc, gchar * argv[])
++{
++ gst_init (&argc, &argv);
++
++ goto here;
++here:
++
++ /**
++ * checks:
++ * - default playback pipeline
++ * - unsigned parameters
++ */
++ audio_file = g_build_filename (g_get_home_dir (), "music.mp3", NULL);
++ TEST_REQUIRE (g_file_test (audio_file, G_FILE_TEST_EXISTS),
++ "The following tests requires a valid mp3 file music.mp3 in your home directory.");
++ TEST_REQUIRE_ELEMENT ("mad");
++ TEST_REQUIRE_ELEMENT ("osssink");
++ TEST_START (PIPELINE1, audio_file);
++ TEST_RUN (10);
++ TEST_OK;
++
++ /**
++ * checks:
++ * - default video playback pipeline (without audio)
++ * - SOMETIMES pads
++ */
++ video_file = g_build_filename (g_get_home_dir (), "video.mpeg", NULL);
++ TEST_REQUIRE (g_file_test (video_file, G_FILE_TEST_EXISTS),
++ "The following tests requires a valid mpeg file video.mpeg in your home directory.");
++ TEST_REQUIRE_ELEMENT ("mpegdemux");
++ TEST_REQUIRE_ELEMENT ("mpeg2dec");
++ TEST_REQUIRE_ELEMENT ("xvimagesink");
++ TEST_START (PIPELINE2, video_file);
++ TEST_RUN (50);
++ TEST_OK;
++
++ /**
++ * checks:
++ * - default video playback pipeline (with audio)
++ * - more SOMETIMES pads
++ */
++ TEST_START (PIPELINE3, video_file);
++ TEST_RUN (200);
++ TEST_OK;
++
++ /**
++ * checks:
++ * - default new gst-player pipeline
++ */
++ TEST_START (PIPELINE4, video_file);
++ TEST_RUN (500);
++ TEST_OK;
++
++ /**
++ * checks:
++ * - default old gst-player pipeline
++ */
++ TEST_START (PIPELINE5, video_file);
++ TEST_RUN (500);
++ TEST_OK;
++
++ g_free (audio_file);
++ g_free (video_file);
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/plugin/dynamic.c gstreamer-0.10.23/tests/old/testsuite/plugin/dynamic.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/plugin/dynamic.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/plugin/dynamic.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,23 @@
++
++#include <gst/gst.h>
++
++int
++main (int argc, char *argv[])
++{
++ GstPlugin *plugin;
++ GError *error = NULL;
++
++ gst_init (&argc, &argv);
++
++ plugin = gst_plugin_load_file (".libs/libtestplugin.so", &error);
++ if (error) {
++ g_print ("ERROR loading plug-in: %s\n", error->message);
++ g_free (error);
++ return 1;
++ }
++ g_assert (plugin != NULL);
++
++ g_print ("testplugin: %s\n", gst_plugin_get_name (plugin));
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/plugin/linked.c gstreamer-0.10.23/tests/old/testsuite/plugin/linked.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/plugin/linked.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/plugin/linked.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,22 @@
++
++#include <gst/gst.h>
++
++int
++main (int argc, char *argv[])
++{
++ GstPlugin *plugin;
++
++ gst_init (&argc, &argv);
++
++ plugin = gst_registry_pool_find_plugin ("testplugin");
++ g_assert (plugin != NULL);
++
++ g_print ("testplugin: %p %s\n", plugin, gst_plugin_get_name (plugin));
++
++ plugin = gst_registry_pool_find_plugin ("testplugin2");
++ g_assert (plugin != NULL);
++
++ g_print ("testplugin2: %p %s\n", plugin, gst_plugin_get_name (plugin));
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/plugin/loading.c gstreamer-0.10.23/tests/old/testsuite/plugin/loading.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/plugin/loading.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/plugin/loading.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,55 @@
++
++#include <gst/gst.h>
++
++int
++main (int argc, char *argv[])
++{
++ GstPlugin *plugin;
++ gboolean loaded = FALSE;
++ gint numplugins;
++
++ gst_init (&argc, &argv);
++
++ numplugins = g_list_length (gst_registry_pool_plugin_list ());
++ g_print ("%d plugins loaded\n", numplugins);
++
++ plugin = gst_registry_pool_find_plugin ("testplugin");
++ g_assert (plugin != NULL);
++
++ g_print ("%d features in plugin\n",
++ g_list_length (gst_plugin_get_feature_list (plugin)));
++
++
++ g_print ("testplugin: %p loaded: %s\n", plugin,
++ (gst_plugin_is_loaded (plugin) ? "true" : "false"));
++
++ loaded = gst_plugin_load (gst_plugin_get_name (plugin));
++ g_assert (loaded == TRUE);
++
++ numplugins = g_list_length (gst_registry_pool_plugin_list ());
++ g_print ("%d plugins loaded\n", numplugins);
++
++ plugin = gst_registry_pool_find_plugin ("testplugin");
++ g_assert (plugin != NULL);
++ g_print ("testplugin: %p loaded: %s\n", plugin,
++ (gst_plugin_is_loaded (plugin) ? "true" : "false"));
++
++ g_print ("%d features in plugin\n",
++ g_list_length (gst_plugin_get_feature_list (plugin)));
++
++ loaded = gst_plugin_load (gst_plugin_get_name (plugin));
++ g_assert (loaded == TRUE);
++
++ numplugins = g_list_length (gst_registry_pool_plugin_list ());
++ g_print ("%d plugins loaded\n", numplugins);
++
++ g_print ("%d features in plugin\n",
++ g_list_length (gst_plugin_get_feature_list (plugin)));
++
++ plugin = gst_registry_pool_find_plugin ("testplugin");
++ g_assert (plugin != NULL);
++ g_print ("testplugin: %p loaded: %s\n", plugin,
++ (gst_plugin_is_loaded (plugin) ? "true" : "false"));
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/plugin/Makefile.am gstreamer-0.10.23/tests/old/testsuite/plugin/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/testsuite/plugin/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/plugin/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,16 @@
++include ../Rules
++
++plugin_LTLIBRARIES = libtestplugin.la libtestplugin2.la
++
++tests_pass = dynamic linked loading registry static static2
++tests_fail =
++tests_ignore =
++
++libtestplugin_la_SOURCES = testplugin.c
++libtestplugin_la_CFLAGS = $(GST_OBJ_CFLAGS)
++libtestplugin_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
++libtestplugin2_la_SOURCES = testplugin2.c
++libtestplugin2_la_CFLAGS = $(GST_OBJ_CFLAGS)
++libtestplugin2_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
++
++linked_LIBS = libtestplugin.la libtestplugin2.la
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/plugin/README gstreamer-0.10.23/tests/old/testsuite/plugin/README
+--- gstreamer-0.10.23.orig/tests/old/testsuite/plugin/README 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/plugin/README 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,59 @@
++The following plugin modes are supported:
++
++1) registry based
++-----------------
++
++All known plugins are listed in the registry file.
++
++ gst_plugin_find ("pluginname");
++
++Works right after gst_init (), along with the elements in it.
++dynamic loading of the plugin is performed when a feature inside
++it is requested.
++
++example: registry.c. (You might want to run gstreamer-register with
++the --gst-plugin-path=. to added the test dir to the plugin path so
++that the testplugins can be found)
++
++
++2) non registry based, dynmic loading
++-------------------------------------
++
++Plugins are know after a gst_plugin_load ("pluginname"). This
++function will scan de plugin paths, so you might want to perform
++a gst_plugin_add_path ("path").
++
++After the gst_plugin_load(), the features are available without any
++further actions.
++
++example: dynamic.c
++
++
++3) non registry based, shared linking
++-------------------------------------
++
++You can add the plugin .so (or equivalent) file to the LDFLAGS at
++compile time. The plugin will be known after the gst_init() without
++any further actions.
++
++example: linked.c
++
++
++4) non registry based, static linking
++-------------------------------------
++
++Plugin compiled with the GST_PLUGIN_STATIC defined can be statically
++linked to the executable. The plugin is available after gst_init ()
++without any further actions.
++
++example: static.c (plugins are statically linked from another file)
++ static2.c (plugins are included in the main file)
++
++
++Any combination of the above is possible too, for example, you can use
++a registry, have some plugins load dynamically and have another few
++linked in as a shared lib.
++
++You cannot statically link multiple plugins that are compiled without the
++GST_PLUGIN_STATIC symbol defined (this will cause multiple defined at link
++time for obvious reasons)
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/plugin/registry.c gstreamer-0.10.23/tests/old/testsuite/plugin/registry.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/plugin/registry.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/plugin/registry.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,17 @@
++
++#include <gst/gst.h>
++
++int
++main (int argc, char *argv[])
++{
++ GstPlugin *plugin;
++
++ gst_init (&argc, &argv);
++
++ plugin = gst_registry_pool_find_plugin ("testplugin");
++ g_assert (plugin != NULL);
++
++ g_print ("testplugin: %s\n", gst_plugin_get_name (plugin));
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/plugin/static2.c gstreamer-0.10.23/tests/old/testsuite/plugin/static2.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/plugin/static2.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/plugin/static2.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,49 @@
++
++#ifdef HAVE_CONFIG_H
++#include "config.h"
++#endif
++#include <gst/gst.h>
++
++static gboolean
++plugin_init (GstPlugin * plugin)
++{
++ return TRUE;
++}
++
++GST_PLUGIN_DEFINE_STATIC (GST_VERSION_MAJOR,
++ GST_VERSION_MINOR,
++ "testplugin",
++ "a plugin for testing",
++ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN);
++
++static gboolean
++plugin2_init (GstPlugin * plugin)
++{
++ return TRUE;
++}
++
++GST_PLUGIN_DEFINE_STATIC (GST_VERSION_MAJOR,
++ GST_VERSION_MINOR,
++ "testplugin2",
++ "a second plugin for testing",
++ plugin2_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN);
++
++int
++main (int argc, char *argv[])
++{
++ GstPlugin *plugin;
++
++ gst_init (&argc, &argv);
++
++ plugin = gst_registry_pool_find_plugin ("testplugin");
++ g_assert (plugin != NULL);
++
++ g_print ("testplugin: %p %s\n", plugin, gst_plugin_get_name (plugin));
++
++ plugin = gst_registry_pool_find_plugin ("testplugin2");
++ g_assert (plugin != NULL);
++
++ g_print ("testplugin2: %p %s\n", plugin, gst_plugin_get_name (plugin));
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/plugin/static.c gstreamer-0.10.23/tests/old/testsuite/plugin/static.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/plugin/static.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/plugin/static.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,22 @@
++
++#include <gst/gst.h>
++
++int
++main (int argc, char *argv[])
++{
++ GstPlugin *plugin;
++
++ gst_init (&argc, &argv);
++
++ plugin = gst_registry_pool_find_plugin ("testplugin");
++ g_assert (plugin != NULL);
++
++ g_print ("testplugin: %p %s\n", plugin, gst_plugin_get_name (plugin));
++
++ plugin = gst_registry_pool_find_plugin ("testplugin2");
++ g_assert (plugin != NULL);
++
++ g_print ("testplugin2: %p %s\n", plugin, gst_plugin_get_name (plugin));
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/plugin/testplugin2.c gstreamer-0.10.23/tests/old/testsuite/plugin/testplugin2.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/plugin/testplugin2.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/plugin/testplugin2.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,18 @@
++
++#ifdef HAVE_CONFIG_H
++# include "config.h"
++#endif
++
++#include <gst/gst.h>
++
++static gboolean
++plugin_init (GstPlugin * plugin)
++{
++ return TRUE;
++}
++
++GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
++ GST_VERSION_MINOR,
++ "testplugin2",
++ "another testplugin for testing",
++ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/plugin/testplugin2_s.c gstreamer-0.10.23/tests/old/testsuite/plugin/testplugin2_s.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/plugin/testplugin2_s.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/plugin/testplugin2_s.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,18 @@
++
++#ifdef HAVE_CONFIG_H
++# include "config.h"
++#endif
++
++#include <gst/gst.h>
++
++static gboolean
++plugin_init (GstPlugin * plugin)
++{
++ return TRUE;
++}
++
++GST_PLUGIN_DEFINE_STATIC (GST_VERSION_MAJOR,
++ GST_VERSION_MINOR,
++ "testplugin2",
++ "another testplugin for testing",
++ plugin_init, VERSION, GST_LICENSE, GST_COPYRIGHT, GST_PACKAGE, GST_ORIGIN);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/plugin/testplugin.c gstreamer-0.10.23/tests/old/testsuite/plugin/testplugin.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/plugin/testplugin.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/plugin/testplugin.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,18 @@
++
++#ifdef HAVE_CONFIG_H
++# include "config.h"
++#endif
++
++#include <gst/gst.h>
++
++static gboolean
++plugin_init (GstPlugin * plugin)
++{
++ return TRUE;
++}
++
++GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
++ GST_VERSION_MINOR,
++ "testplugin",
++ "a plugin for testing",
++ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/plugin/testplugin_s.c gstreamer-0.10.23/tests/old/testsuite/plugin/testplugin_s.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/plugin/testplugin_s.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/plugin/testplugin_s.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,18 @@
++
++#ifdef HAVE_CONFIG_H
++# include "config.h"
++#endif
++
++#include <gst/gst.h>
++
++static gboolean
++plugin_init (GstPlugin * plugin)
++{
++ return TRUE;
++}
++
++GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
++ GST_VERSION_MINOR,
++ "testplugin",
++ "a plugin for testing",
++ plugin_init, VERSION, GST_LICENSE, GST_COPYRIGHT, GST_PACKAGE, GST_ORIGIN);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/bin.c gstreamer-0.10.23/tests/old/testsuite/refcounting/bin.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/bin.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/refcounting/bin.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,318 @@
++#include <gst/gst.h>
++
++#define ITERS 100
++#include <stdlib.h>
++
++static GstElement *
++create_bin (void)
++{
++ GstElement *bin;
++ GstElement *element;
++
++ bin = gst_bin_new ("testbin");
++ g_assert (GST_IS_BIN (bin));
++ element = gst_element_factory_make ("fakesrc", NULL);
++ g_assert (GST_IS_ELEMENT (element));
++ gst_element_set_name (element, "test1");
++ gst_bin_add (GST_BIN (bin), element);
++ element = gst_element_factory_make ("fakesrc", NULL);
++ g_assert (GST_IS_ELEMENT (element));
++ gst_element_set_name (element, "test2");
++ gst_bin_add (GST_BIN (bin), element);
++
++ return bin;
++}
++
++static GstElement *
++create_bin_ghostpads (void)
++{
++ GstElement *bin;
++ GstElement *element1, *element2;
++
++ bin = gst_bin_new ("testbin");
++ element1 = gst_element_factory_make ("identity", NULL);
++ gst_bin_add (GST_BIN (bin), element1);
++ element2 = gst_element_factory_make ("fakesink", NULL);
++ gst_bin_add (GST_BIN (bin), element2);
++ gst_element_link_pads (element1, "src", element2, "sink");
++ gst_element_add_ghost_pad (bin, gst_element_get_pad (element1, "sink"),
++ "ghost_sink");
++
++ return bin;
++}
++
++static void
++add_remove_test1 (void)
++{
++ GstElement *bin;
++ GstElement *element;
++
++ bin = gst_bin_new ("testbin");
++ element = gst_element_factory_make ("fakesrc", NULL);
++ gst_element_set_name (element, "test1");
++ g_assert (GST_OBJECT_IS_FLOATING (element));
++ gst_bin_add (GST_BIN (bin), element);
++ g_assert (!GST_OBJECT_IS_FLOATING (element));
++ gst_bin_remove (GST_BIN (bin), element);
++
++ gst_object_unref (bin);
++}
++
++static void
++add_remove_test2 (void)
++{
++ GstElement *bin;
++ GstElement *element;
++
++ bin = gst_bin_new ("testbin");
++ element = gst_element_factory_make ("fakesrc", NULL);
++ gst_element_set_name (element, "test1");
++ gst_object_ref (element);
++ g_assert (GST_OBJECT_IS_FLOATING (element));
++ gst_bin_add (GST_BIN (bin), element);
++ g_assert (!GST_OBJECT_IS_FLOATING (element));
++ gst_bin_remove (GST_BIN (bin), element);
++ g_assert (!GST_OBJECT_IS_FLOATING (element));
++ g_assert (!GST_OBJECT_IS_DESTROYED (element));
++
++ gst_object_unref (element);
++#if 0
++ g_assert (GST_OBJECT_IS_DESTROYED (element));
++ gst_object_unref (element);
++#endif
++
++ gst_object_unref (bin);
++}
++
++#if 0
++/* This code is bogus */
++static void
++add_remove_test3 (void)
++{
++ GstElement *bin;
++ GstElement *element;
++
++ bin = gst_bin_new ("testbin");
++ element = gst_element_factory_make ("fakesrc", NULL);
++ gst_element_set_name (element, "test1");
++ g_assert (GST_OBJECT_FLOATING (element));
++ gst_bin_add (GST_BIN (bin), element);
++ g_assert (!GST_OBJECT_FLOATING (element));
++
++ gst_object_unref (element);
++ g_assert (gst_bin_get_by_name (GST_BIN (bin), "test1") == NULL);
++
++ gst_object_unref (bin);
++}
++#endif
++
++#if 0
++/* This code is bogus */
++static void
++add_remove_test4 (void)
++{
++ GstElement *bin, *bin2;
++ GstElement *element;
++
++ bin = gst_bin_new ("testbin");
++ element = gst_element_factory_make ("fakesrc", NULL);
++ gst_element_set_name (element, "test1");
++ g_assert (GST_OBJECT_FLOATING (element));
++ gst_bin_add (GST_BIN (bin), element);
++ g_assert (!GST_OBJECT_FLOATING (element));
++
++ bin2 = create_bin ();
++ g_assert (GST_OBJECT_FLOATING (bin2));
++ gst_bin_add (GST_BIN (bin), bin2);
++ g_assert (!GST_OBJECT_FLOATING (bin2));
++
++ gst_object_unref (bin2);
++ g_assert (gst_bin_get_by_name (GST_BIN (bin), "testbin") == NULL);
++ gst_object_unref (element);
++ g_assert (gst_bin_get_by_name (GST_BIN (bin), "test1") == NULL);
++
++ gst_object_unref (bin);
++}
++#endif
++
++int
++main (int argc, gchar * argv[])
++{
++ GstElement *bin;
++ int usage1;
++ gint i, iters;
++
++ gst_alloc_trace_set_flags_all (GST_ALLOC_TRACE_LIVE);
++
++ gst_init (&argc, &argv);
++
++ if (argc == 2)
++ iters = atoi (argv[1]);
++ else
++ iters = ITERS;
++
++
++ g_print ("starting test\n");
++
++ usage1 = gst_alloc_trace_live_all ();
++ //gst_alloc_trace_print_all ();
++
++ bin = gst_bin_new ("somebin");
++ gst_object_unref (bin);
++ g_print ("create/unref new bin %d\n", gst_alloc_trace_live_all () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ bin = gst_bin_new ("somebin");
++ gst_object_unref (bin);
++ }
++ g_print ("create/unref %d bins %d\n", iters,
++ gst_alloc_trace_live_all () - usage1);
++
++ bin = gst_bin_new ("somebin");
++ g_assert (GST_OBJECT_IS_FLOATING (bin));
++ gst_object_ref (bin);
++ gst_object_sink (GST_OBJECT (bin));
++ g_assert (!GST_OBJECT_IS_FLOATING (bin));
++ gst_object_unref (bin);
++ g_print ("create/ref/sink/unref new bin %d\n",
++ gst_alloc_trace_live_all () - usage1);
++
++
++ for (i = 0; i < iters; i++) {
++ bin = gst_bin_new ("somebin");
++ gst_object_ref (bin);
++ gst_object_sink (GST_OBJECT (bin));
++ gst_object_unref (bin);
++ }
++ g_print ("create/ref/sink/unref %d bins %d\n", iters,
++ gst_alloc_trace_live_all () - usage1);
++
++ bin = gst_bin_new ("somebin");
++ g_assert (!GST_OBJECT_IS_DESTROYED (bin));
++ gst_object_unref (bin);
++#if 0
++ g_assert (GST_OBJECT_IS_DESTROYED (bin));
++ gst_object_unref (bin);
++#endif
++ g_print ("create/destroy/unref new bin %d\n",
++ gst_alloc_trace_live_all () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ bin = gst_bin_new ("somebin");
++ gst_object_unref (bin);
++#if 0
++ gst_object_unref (bin);
++#endif
++ }
++ g_print ("create/destroy/unref %d bin %d\n", iters,
++ gst_alloc_trace_live_all () - usage1);
++
++ bin = gst_bin_new ("somebin");
++ gst_object_ref (bin);
++ gst_object_unref (bin);
++ gst_object_unref (bin);
++ g_print ("create/ref/unref/unref new bin %d\n",
++ gst_alloc_trace_live_all () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ bin = gst_bin_new ("somebin");
++ gst_object_ref (bin);
++ gst_object_unref (bin);
++ gst_object_unref (bin);
++ }
++ g_print ("create/ref/unref/unref %d bin %d\n", iters,
++ gst_alloc_trace_live_all () - usage1);
++
++ bin = gst_bin_new ("somebin");
++ gst_object_ref (bin);
++ gst_object_unref (bin);
++ gst_object_unref (bin);
++#if 0
++ gst_object_unref (bin);
++#endif
++ g_print ("craete/ref/destroy/unref/unref new bin %d\n",
++ gst_alloc_trace_live_all () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ bin = gst_bin_new ("somebin");
++ gst_object_ref (bin);
++ gst_object_unref (bin);
++ gst_object_unref (bin);
++#if 0
++ gst_object_unref (bin);
++#endif
++ }
++ g_print ("craete/ref/destroy/unref/unref %d bins %d\n", iters,
++ gst_alloc_trace_live_all () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ bin = gst_bin_new ("somebin");
++ gst_object_ref (bin);
++ gst_element_set_name (bin, "testing123");
++ gst_object_unref (bin);
++ gst_element_set_name (bin, "testing123");
++ gst_object_unref (bin);
++#if 0
++ gst_object_unref (bin);
++#endif
++ }
++ g_print ("craete/ref/destroy/unref/unref %d bins with name %d\n", iters,
++ gst_alloc_trace_live_all () - usage1);
++
++ bin = gst_bin_new ("somebin");
++ for (i = 0; i < iters; i++) {
++ gst_element_set_name (bin, "testing");
++ }
++ gst_object_unref (bin);
++ g_print ("set name %d times %d\n", iters,
++ gst_alloc_trace_live_all () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ bin = create_bin ();
++ gst_object_unref (bin);
++ }
++ g_print ("create/unref %d bin with children %d\n", iters,
++ gst_alloc_trace_live_all () - usage1);
++
++ for (i = 0; i < iters / 2; i++) {
++ bin = create_bin_ghostpads ();
++ gst_object_unref (bin);
++ }
++ g_print ("create/unref %d bin with children and ghostpads %d\n", iters / 2,
++ gst_alloc_trace_live_all () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ add_remove_test1 ();
++ }
++ g_print ("add/remove test1 %d in bin %d\n", iters,
++ gst_alloc_trace_live_all () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ add_remove_test2 ();
++ }
++ g_print ("add/remove test2 %d in bin %d\n", iters,
++ gst_alloc_trace_live_all () - usage1);
++
++#if 0
++ for (i = 0; i < iters; i++) {
++ add_remove_test3 ();
++ }
++ g_print ("add/destroy/remove test3 %d in bin %d\n", iters,
++ gst_alloc_trace_live_all () - usage1);
++#endif
++
++#if 0
++ for (i = 0; i < iters; i++) {
++ add_remove_test4 ();
++ }
++ g_print ("add/destroy/remove test4 %d in bin %d\n", iters,
++ gst_alloc_trace_live_all () - usage1);
++#endif
++
++ g_print ("leaked: %d\n", gst_alloc_trace_live_all () - usage1);
++
++ //gst_alloc_trace_print_all ();
++
++ //return (gst_alloc_trace_live_all () - usage1 ? -1 : 0);
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/element.c gstreamer-0.10.23/tests/old/testsuite/refcounting/element.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/element.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/refcounting/element.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,139 @@
++#include <gst/gst.h>
++
++#define ITERS 100
++#include <stdlib.h>
++
++int
++main (int argc, gchar * argv[])
++{
++ GstElement *element;
++ int usage1;
++ gint i, iters;
++
++ gst_init (&argc, &argv);
++
++ if (argc == 2)
++ iters = atoi (argv[1]);
++ else
++ iters = ITERS;
++
++ g_print ("starting test\n");
++
++ usage1 = gst_alloc_trace_live_all ();
++ //gst_alloc_trace_print_all ();
++
++ element = gst_element_factory_make ("fakesrc", NULL);
++ gst_object_unref (element);
++ g_print ("create/unref new element %d\n",
++ gst_alloc_trace_live_all () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ element = gst_element_factory_make ("fakesrc", NULL);
++ gst_object_unref (element);
++ }
++ g_print ("create/unref %d elements %d\n", iters,
++ gst_alloc_trace_live_all () - usage1);
++
++ element = gst_element_factory_make ("fakesrc", NULL);
++ g_assert (GST_OBJECT_IS_FLOATING (element));
++ gst_object_ref (element);
++ gst_object_sink (GST_OBJECT (element));
++ g_assert (!GST_OBJECT_IS_FLOATING (element));
++ gst_object_unref (element);
++ g_print ("create/ref/sink/unref new element %d\n",
++ gst_alloc_trace_live_all () - usage1);
++
++
++ for (i = 0; i < iters; i++) {
++ element = gst_element_factory_make ("fakesrc", NULL);
++ gst_object_ref (element);
++ gst_object_sink (GST_OBJECT (element));
++ gst_object_unref (element);
++ }
++ g_print ("create/ref/sink/unref %d elements %d\n", iters,
++ gst_alloc_trace_live_all () - usage1);
++
++#if 0
++ element = gst_element_factory_make ("fakesrc", NULL);
++ g_assert (!GST_OBJECT_IS_DESTROYED (element));
++ gst_object_unref (element);
++ g_assert (GST_OBJECT_IS_DESTROYED (element));
++ gst_object_unref (element);
++ g_print ("create/destroy/unref new element %d\n",
++ gst_alloc_trace_live_all () - usage1);
++#endif
++
++#if 0
++ for (i = 0; i < iters; i++) {
++ element = gst_element_factory_make ("fakesrc", NULL);
++ gst_object_unref (element);
++ gst_object_unref (element);
++ }
++ g_print ("create/destroy/unref %d element %d\n", iters,
++ gst_alloc_trace_live_all () - usage1);
++#endif
++
++ element = gst_element_factory_make ("fakesrc", NULL);
++ gst_object_ref (element);
++ gst_object_unref (element);
++ gst_object_unref (element);
++ g_print ("create/ref/unref/unref new element %d\n",
++ gst_alloc_trace_live_all () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ element = gst_element_factory_make ("fakesrc", NULL);
++ gst_object_ref (element);
++ gst_object_unref (element);
++ gst_object_unref (element);
++ }
++ g_print ("create/ref/unref/unref %d element %d\n", iters,
++ gst_alloc_trace_live_all () - usage1);
++
++#if 0
++ element = gst_element_factory_make ("fakesrc", NULL);
++ gst_object_ref (element);
++ gst_object_unref (element);
++ gst_object_unref (element);
++ gst_object_unref (element);
++ g_print ("craete/ref/destroy/unref/unref new element %d\n",
++ gst_alloc_trace_live_all () - usage1);
++#endif
++
++#if 0
++ for (i = 0; i < iters; i++) {
++ element = gst_element_factory_make ("fakesrc", NULL);
++ gst_object_ref (element);
++ gst_object_unref (element);
++ gst_object_unref (element);
++ gst_object_unref (element);
++ }
++ g_print ("craete/ref/destroy/unref/unref %d elements %d\n", iters,
++ gst_alloc_trace_live_all () - usage1);
++#endif
++
++#if 0
++ for (i = 0; i < iters; i++) {
++ element = gst_element_factory_make ("fakesrc", NULL);
++ gst_object_ref (element);
++ gst_element_set_name (element, "testing123");
++ gst_object_unref (element);
++ gst_element_set_name (element, "testing123");
++ gst_object_unref (element);
++ gst_object_unref (element);
++ }
++ g_print ("craete/ref/destroy/unref/unref %d elements with name %d\n", iters,
++ gst_alloc_trace_live_all () - usage1);
++#endif
++
++ element = gst_element_factory_make ("fakesrc", NULL);
++ for (i = 0; i < iters; i++) {
++ gst_element_set_name (element, "testing");
++ }
++ gst_object_unref (element);
++ g_print ("set name %d times %d\n", iters,
++ gst_alloc_trace_live_all () - usage1);
++
++ g_print ("leaked: %d\n", gst_alloc_trace_live_all () - usage1);
++
++ return (gst_alloc_trace_live_all () - usage1 ? -1 : 0);
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/element_pad.c gstreamer-0.10.23/tests/old/testsuite/refcounting/element_pad.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/element_pad.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/refcounting/element_pad.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,115 @@
++#include <gst/gst.h>
++
++#define ITERS 100
++#include <stdlib.h>
++#include "mem.h"
++
++int
++main (int argc, gchar * argv[])
++{
++ GstElement *element;
++ GstElement *element2;
++ GstPad *pad;
++ long usage1;
++ gint i, iters;
++
++ gst_init (&argc, &argv);
++
++ if (argc == 2)
++ iters = atoi (argv[1]);
++ else
++ iters = ITERS;
++
++ g_print ("starting element with pad test with %d iterations\n", iters);
++ usage1 = vmsize ();
++
++ element = gst_element_factory_make ("fakesink", NULL);;
++ g_assert (GST_IS_ELEMENT (element));
++ pad = gst_element_get_pad (element, "sink");
++ g_assert (GST_IS_PAD (pad));
++ g_assert (GST_OBJECT_IS_FLOATING (element));
++ g_assert (!GST_OBJECT_IS_FLOATING (pad));
++ g_assert (gst_pad_get_parent (pad) == element);
++ gst_object_unref (element);
++ g_print ("create/addpad/unref 1 new element: %ld\n", vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ element = gst_element_factory_make ("fakesink", NULL);;
++ g_assert (GST_IS_ELEMENT (element));
++ gst_object_unref (element);
++ }
++ g_print ("create/unref %d elements: %ld\n", iters, vmsize () - usage1);
++
++ for (i = 0; i < iters / 2; i++) {
++ element = gst_element_factory_make ("fakesink", NULL);
++ g_assert (GST_IS_ELEMENT (element));
++ element2 = gst_element_factory_make ("fakesrc", NULL);
++ g_assert (GST_IS_ELEMENT (element2));
++ gst_element_link_pads (element2, "src", element, "sink");
++ g_assert (GST_PAD_IS_LINKED (gst_element_get_pad (element2, "src")));
++ g_assert (GST_PAD_IS_LINKED (gst_element_get_pad (element, "sink")));
++ gst_object_unref (element);
++ g_assert (!GST_PAD_IS_LINKED (gst_element_get_pad (element2, "src")));
++ gst_object_unref (element2);
++ }
++ g_print ("create/link/unref %d element duos: %ld\n", iters / 2,
++ vmsize () - usage1);
++
++ element = gst_element_factory_make ("fakesink", NULL);;
++ g_assert (GST_IS_ELEMENT (element));
++ pad = gst_element_get_pad (element, "sink");
++ g_assert (GST_IS_PAD (pad));
++ gst_element_remove_pad (element, pad);
++ g_assert (gst_element_get_pad (element, "sink") == NULL);
++ gst_object_unref (element);
++
++ g_print ("pad removal on one element: %ld\n", vmsize () - usage1);
++
++ for (i = 0; i < iters / 2; i++) {
++ element = gst_element_factory_make ("fakesink", NULL);;
++ g_assert (GST_IS_ELEMENT (element));
++ pad = gst_element_get_pad (element, "sink");
++ g_assert (GST_IS_PAD (pad));
++ gst_element_remove_pad (element, pad);
++ g_assert (gst_element_get_pad (element, "sink") == NULL);
++ gst_object_unref (element);
++ }
++ g_print ("pad removal loop on %d elements: %ld\n", iters / 2,
++ vmsize () - usage1);
++
++ for (i = 0; i < iters / 2; i++) {
++ element = gst_element_factory_make ("fakesink", NULL);;
++ g_assert (GST_IS_ELEMENT (element));
++ pad = gst_element_get_pad (element, "sink");
++ g_assert (GST_IS_PAD (pad));
++ gst_object_ref (pad);
++ gst_element_remove_pad (element, pad);
++ g_assert (gst_pad_get_parent (pad) == NULL);
++ gst_object_unref (pad);
++ gst_object_unref (element);
++ }
++ g_print ("pad ref/removal/test loop on %d elements: %ld\n", iters / 2,
++ vmsize () - usage1);
++
++ element = gst_element_factory_make ("fakesink", NULL);;
++ g_assert (GST_IS_ELEMENT (element));
++ pad = gst_element_get_pad (element, "sink");
++ g_assert (GST_IS_PAD (pad));
++ gst_object_unref (element);
++
++ g_print ("pad unref on one element: %ld\n", vmsize () - usage1);
++
++ for (i = 0; i < iters / 2; i++) {
++ element = gst_element_factory_make ("fakesink", NULL);
++ g_assert (GST_IS_ELEMENT (element));
++ pad = gst_element_get_pad (element, "sink");
++ g_assert (GST_IS_PAD (pad));
++ gst_object_unref (element);
++ }
++ g_print ("pad unref loop on %d elements: %ld\n", iters / 2,
++ vmsize () - usage1);
++
++ g_print ("leaked: %ld\n", vmsize () - usage1);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/mainloop.c gstreamer-0.10.23/tests/old/testsuite/refcounting/mainloop.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/mainloop.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/refcounting/mainloop.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,32 @@
++#include <gst/gst.h>
++
++/* test to make sure that we can do gst_main and gst_main_quit in succession */
++/* FIXME: use mutexes */
++
++gboolean mainloop = FALSE;
++
++static gboolean
++quit_main (gpointer data)
++{
++ if (mainloop) {
++ mainloop = FALSE;
++ g_print ("-");
++ gst_main_quit ();
++ }
++ return TRUE;
++}
++
++int
++main (int argc, gchar * argv[])
++{
++ int i;
++
++ g_timeout_add (1, quit_main, NULL);
++ for (i = 0; i < 1000; ++i) {
++ mainloop = TRUE;
++ g_print ("+");
++ gst_main ();
++ }
++ g_print ("\n");
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/Makefile.am gstreamer-0.10.23/tests/old/testsuite/refcounting/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/refcounting/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,14 @@
++include ../Rules
++
++tests_pass = bin element mainloop pad element_pad
++tests_fail =
++tests_ignore = sched
++
++element_SOURCES = element.c mem.c
++pad_SOURCES = pad.c mem.c
++element_pad_SOURCES = element_pad.c mem.c
++bin_SOURCES = bin.c mem.c
++
++EXTRA_DIST = thread.c object.c
++
++noinst_HEADERS = mem.h
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/mem.c gstreamer-0.10.23/tests/old/testsuite/refcounting/mem.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/mem.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/refcounting/mem.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,31 @@
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <fcntl.h>
++#include <unistd.h>
++
++int
++vmsize ()
++{
++ int pid, fd, size, i, mem;
++ char filename[17], buf[256], *ptr, *end;
++
++ pid = getpid ();
++ snprintf (filename, 17, "/proc/%d/stat", pid);
++ fd = open (filename, O_RDONLY);
++ if (fd == -1) {
++ fprintf (stderr, "warning: could not open %s\n", filename);
++ return -1;
++ }
++ size = read (fd, buf, 240);
++ if (size == -1)
++ return -1;
++ ptr = buf;
++ for (i = 0; i < 22; i++)
++ ptr = (char *) strchr (ptr, ' ') + 1;
++ end = (char *) strchr (ptr, ' ');
++ *end = 0;
++ sscanf (ptr, "%d", &mem);
++ close (fd);
++ return mem;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/mem.h gstreamer-0.10.23/tests/old/testsuite/refcounting/mem.h
+--- gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/mem.h 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/refcounting/mem.h 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1 @@
++int vmsize();
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/object.c gstreamer-0.10.23/tests/old/testsuite/refcounting/object.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/object.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/refcounting/object.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,160 @@
++#include <gst/gst.h>
++
++#define ITERS 100000
++#include <stdlib.h>
++#include "mem.h"
++
++int
++main (int argc, gchar * argv[])
++{
++ GstObject *object, *object2;
++ long usage1;
++ gint i, iters;
++
++ gst_init (&argc, &argv);
++
++ if (argc == 2)
++ iters = atoi (argv[1]);
++ else
++ iters = ITERS;
++
++ g_print ("starting test with %d iterations\n", iters);
++ usage1 = vmsize ();
++ object = gst_object_new ();
++ gst_object_unref (object);
++ g_print ("create/unref new object %ld\n", vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ object = gst_object_new ();
++ gst_object_unref (object);
++
++ }
++ g_print ("create/unref %d object %ld\n", iters, vmsize () - usage1);
++
++ object = gst_object_new ();
++ g_assert (GST_OBJECT_FLOATING (object));
++ gst_object_ref (object);
++ gst_object_sink (object);
++ g_assert (!GST_OBJECT_FLOATING (object));
++ gst_object_unref (object);
++ g_print ("create/ref/sink/unref new object %ld\n", vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ object = gst_object_new ();
++ gst_object_ref (object);
++ gst_object_sink (object);
++ gst_object_unref (object);
++ }
++ g_print ("create/ref/sink/unref %d object %ld\n", iters, vmsize () - usage1);
++
++ object = gst_object_new ();
++ g_assert (!GST_OBJECT_DESTROYED (object));
++ gst_object_unref (object);
++ g_assert (GST_OBJECT_DESTROYED (object));
++ gst_object_unref (object);
++ g_print ("create/destroy/unref new object %ld\n", vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ object = gst_object_new ();
++ gst_object_unref (object);
++ gst_object_unref (object);
++ }
++ g_print ("destroy/unref %d object %ld\n", iters, vmsize () - usage1);
++
++ object = gst_object_new ();
++ gst_object_ref (object);
++ gst_object_unref (object);
++ gst_object_unref (object);
++ g_print ("create/ref/unref/unref new object %ld\n", vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ object = gst_object_new ();
++ gst_object_ref (object);
++ gst_object_unref (object);
++ gst_object_unref (object);
++ }
++ g_print ("create/ref/unref/unref %d object %ld\n", iters, vmsize () - usage1);
++
++ object = gst_object_new ();
++ gst_object_ref (object);
++ gst_object_unref (object);
++ gst_object_unref (object);
++ gst_object_unref (object);
++ g_print ("create/ref/destroy/unref/unref new object %ld\n",
++ vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ object = gst_object_new ();
++ gst_object_ref (object);
++ gst_object_unref (object);
++ gst_object_unref (object);
++ gst_object_unref (object);
++ }
++ g_print ("create/ref/destroy/unref/unref %d object %ld\n", iters,
++ vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ object = gst_object_new ();
++ gst_object_ref (object);
++ gst_object_set_name (object, "testing123");
++ gst_object_unref (object);
++ gst_object_set_name (object, "testing123");
++ gst_object_unref (object);
++ gst_object_unref (object);
++ }
++ g_print ("create/ref/destroy/unref/unref %d object with name %ld\n", iters,
++ vmsize () - usage1);
++
++ object = gst_object_new ();
++ for (i = 0; i < iters; i++) {
++ gst_object_set_name (object, "testing");
++ }
++ gst_object_unref (object);
++ g_print ("create/set name/unref %d object %ld\n", iters, vmsize () - usage1);
++
++ object = gst_object_new ();
++ object2 = gst_object_new ();
++ g_assert (GST_OBJECT_FLOATING (object));
++ g_assert (GST_OBJECT_FLOATING (object2));
++
++ gst_object_set_parent (object, object2);
++ g_assert (GST_OBJECT_FLOATING (object2));
++ g_assert (!GST_OBJECT_FLOATING (object));
++
++ g_print ("parentage flags set_parent ok %ld\n", vmsize () - usage1);
++
++ gst_object_ref (object);
++ gst_object_unparent (object);
++ g_assert (GST_OBJECT_FLOATING (object2));
++ g_assert (!GST_OBJECT_FLOATING (object));
++ g_assert (gst_object_get_parent (object) == NULL);
++
++ g_print ("parentage flags unparent ok %ld\n", vmsize () - usage1);
++
++ gst_object_set_parent (object, object2);
++ g_assert (GST_OBJECT_FLOATING (object2));
++ g_assert (!GST_OBJECT_FLOATING (object));
++ g_assert (gst_object_get_parent (object) == object2);
++
++ gst_object_unref (object);
++ g_assert (GST_OBJECT_DESTROYED (object));
++ g_assert (!GST_OBJECT_FLOATING (object));
++ g_assert (gst_object_get_parent (object) == NULL);
++ gst_object_unref (object);
++
++ g_print ("parentage flags destroy ok %ld\n", vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ object = gst_object_new ();
++ object2 = gst_object_new ();
++ gst_object_set_parent (object2, object);
++ gst_object_unref (object);
++ gst_object_unref (object2);
++ }
++ g_print ("create/unref %d 2 parented objects %ld\n", iters,
++ vmsize () - usage1);
++
++ g_print ("leaked: %ld\n", vmsize () - usage1);
++
++ return (vmsize () - usage1 ? -1 : 0);
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/pad.c gstreamer-0.10.23/tests/old/testsuite/refcounting/pad.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/pad.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/refcounting/pad.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,153 @@
++#include <gst/gst.h>
++
++#define ITERS 100
++#include <stdlib.h>
++#include "mem.h"
++
++GstStaticPadTemplate templ = GST_STATIC_PAD_TEMPLATE ("default",
++ GST_PAD_SINK,
++ GST_PAD_ALWAYS,
++ GST_STATIC_CAPS_ANY);
++
++int
++main (int argc, gchar * argv[])
++{
++ GstPad *pad;
++ GstPadTemplate *padtempl;
++ long usage1;
++ gint i, iters;
++
++ gst_alloc_trace_set_flags_all (GST_ALLOC_TRACE_LIVE);
++
++ gst_init (&argc, &argv);
++
++ g_mem_profile ();
++
++ if (argc == 2)
++ iters = atoi (argv[1]);
++ else
++ iters = ITERS;
++
++ //gst_alloc_trace_print_all ();
++
++ g_print ("starting pad test\n");
++ usage1 = vmsize ();
++
++ g_print ("DEBUG: creating new pad with name padname\n");
++ pad =
++ gst_pad_new_from_template (gst_static_pad_template_get (&templ),
++ "padname");
++ g_print ("DEBUG: unreffing new pad with name padname\n");
++ gst_object_unref (pad);
++ g_print ("create/unref new pad %ld\n", vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ pad =
++ gst_pad_new_from_template (gst_static_pad_template_get (&templ),
++ "padname");
++ gst_object_unref (pad);
++ }
++ g_print ("create/unref %d pads %ld\n", iters, vmsize () - usage1);
++
++ pad =
++ gst_pad_new_from_template (gst_static_pad_template_get (&templ),
++ "padname");
++ g_assert (GST_OBJECT_IS_FLOATING (pad));
++ gst_object_ref (pad);
++ gst_object_sink (GST_OBJECT (pad));
++ g_assert (!GST_OBJECT_IS_FLOATING (pad));
++ gst_object_unref (pad);
++ g_print ("create/ref/sink/unref new pad %ld\n", vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ pad =
++ gst_pad_new_from_template (gst_static_pad_template_get (&templ),
++ "padname");
++ gst_object_ref (pad);
++ gst_object_sink (GST_OBJECT (pad));
++ gst_object_unref (pad);
++ }
++ g_print ("create/ref/sink/unref %d pads %ld\n", iters, vmsize () - usage1);
++
++ pad =
++ gst_pad_new_from_template (gst_static_pad_template_get (&templ),
++ "padname");
++ gst_object_ref (pad);
++ gst_object_unref (pad);
++ gst_object_unref (pad);
++ g_print ("create/ref/unref/unref pad %ld\n", vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ pad =
++ gst_pad_new_from_template (gst_static_pad_template_get (&templ),
++ "padname");
++ gst_object_ref (pad);
++ gst_object_unref (pad);
++ gst_object_unref (pad);
++ }
++ g_print ("create/ref/unref/unref %d pads %ld\n", iters, vmsize () - usage1);
++
++ pad =
++ gst_pad_new_from_template (gst_static_pad_template_get (&templ),
++ "padname");
++ gst_object_ref (pad);
++ gst_object_unref (pad);
++ gst_object_unref (pad);
++ g_print ("create/ref/unref/unref pad %ld\n", vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ pad =
++ gst_pad_new_from_template (gst_static_pad_template_get (&templ),
++ "padname");
++ gst_object_ref (pad);
++ gst_object_unref (pad);
++ gst_object_unref (pad);
++ }
++ g_print ("create/ref/unref/unref %d pads %ld\n", iters, vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ pad =
++ gst_pad_new_from_template (gst_static_pad_template_get (&templ),
++ "padname");
++ gst_object_ref (pad);
++ gst_pad_set_name (pad, "testing123");
++ gst_object_unref (pad);
++ gst_pad_set_name (pad, "testing123");
++ gst_object_unref (pad);
++ }
++ g_print ("create/ref/unref/unref %d pads %ld with name\n", iters,
++ vmsize () - usage1);
++
++ pad =
++ gst_pad_new_from_template (gst_static_pad_template_get (&templ),
++ "padname");
++ for (i = 0; i < iters; i++) {
++ gst_pad_set_name (pad, "testing");
++ }
++ gst_object_unref (pad);
++ g_print ("set name %d times %ld\n", iters, vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ padtempl =
++ gst_pad_template_new ("sink%d", GST_PAD_SINK, GST_PAD_SOMETIMES,
++ gst_caps_new_any ());
++ gst_object_unref (padtempl);
++ }
++ g_print ("%d padtemplates create/unref %ld\n", iters, vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ padtempl =
++ gst_pad_template_new ("sink%d", GST_PAD_SINK, GST_PAD_SOMETIMES,
++ gst_caps_new_any ());
++ pad = gst_pad_new_from_template (padtempl, "sink1");
++ gst_object_unref (pad);
++ }
++ g_print ("%d pads create/unref from padtemplate %ld\n", iters,
++ vmsize () - usage1);
++
++ g_print ("leaked: %ld\n", vmsize () - usage1);
++
++ //gst_alloc_trace_print_all ();
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/sched.c gstreamer-0.10.23/tests/old/testsuite/refcounting/sched.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/sched.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/refcounting/sched.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,77 @@
++#include <gst/gst.h>
++
++gint i = 0;
++GstElement *pipeline;
++GstPadChainFunction oss_chain;
++
++static GstElement *
++make_and_check_element (gchar * type, gchar * name)
++{
++ GstElement *element = gst_element_factory_make (type, name);
++
++ if (element == NULL) {
++ g_warning
++ ("Could not run test, because element type \"%s\" is not installed. Please retry when it is. Assuming it works for now...",
++ type);
++ exit (1);
++ }
++
++ return element;
++}
++
++static void
++create_pipeline (void)
++{
++ GstElement *src;
++ GstElement *sink;
++ GstElement *id;
++
++ pipeline = gst_pipeline_new ("pipeline");
++ src = make_and_check_element ("sinesrc", "src");
++ /**
++ * You need a sink with a loop-based element in here, if you want to kill opt, too.
++ * Osssink (chain-based) only breaks the basic scheduler.
++ */
++ sink = make_and_check_element ("alsasink", "sink");
++
++
++ gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
++ gst_element_link (src, sink);
++
++ /**
++ * now make the bug appear
++ * I believe it has something to do with 2 chains being created in the scheduler
++ * but I haven't looked at it yet
++ * If you comment out the next 4 lines, everything works fine.
++ * And no, it's not because of identity, you may use any other element.
++ */
++ gst_element_unlink (src, sink);
++ id = make_and_check_element ("identity", "id");
++ gst_bin_add (GST_BIN (pipeline), id);
++ gst_element_link_many (src, id, sink, NULL);
++
++ /* This pipeline will not be removed properly once we unref it */
++ gst_element_set_state (pipeline, GST_STATE_PLAYING);
++}
++
++gint
++main (gint argc, gchar * argv[])
++{
++ gst_init (&argc, &argv);
++ create_pipeline ();
++
++ while (i < 300) {
++ /**
++ * only inc i when it works, so the program hangs when _iterate returns false,
++ * which it does after the first pipeline isn't unref'd properly and the next
++ * osssink refuses to work.
++ */
++ if (gst_bin_iterate (GST_BIN (pipeline)))
++ i++;
++ if (i % 50 == 0) {
++ gst_object_unref (pipeline);
++ create_pipeline ();
++ }
++ }
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/thread.c gstreamer-0.10.23/tests/old/testsuite/refcounting/thread.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/refcounting/thread.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/refcounting/thread.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,304 @@
++#include <gst/gst.h>
++
++#define ITERS 100000
++#include <stdlib.h>
++#include "mem.h"
++
++GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
++ GST_PAD_SRC,
++ GST_PAD_ALWAYS,
++ GST_STATIC_CAPS_ANY);
++
++GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
++ GST_PAD_SINK,
++ GST_PAD_ALWAYS,
++ GST_STATIC_CAPS_ANY);
++
++static GstElement *
++create_thread (void)
++{
++ GstElement *thread;
++ GstElement *element;
++
++ thread = gst_thread_new ("testthread");
++ element = gst_element_new ();
++ gst_element_set_name (element, "test1");
++ gst_bin_add (GST_BIN (thread), element);
++ element = gst_element_new ();
++ gst_element_set_name (element, "test2");
++ gst_bin_add (GST_BIN (thread), element);
++
++ return thread;
++}
++
++static GstElement *
++create_thread_ghostpads (void)
++{
++ GstElement *thread;
++ GstElement *element1, *element2;
++
++ thread = gst_thread_new ("testthread");
++ element1 = gst_element_new ();
++ gst_element_set_name (element1, "test1");
++ gst_element_add_pad (element1,
++ gst_pad_new_from_template (gst_static_pad_template_get (&srctemplate),
++ "src1"));
++ gst_bin_add (GST_BIN (thread), element1);
++ element2 = gst_element_new ();
++ gst_element_set_name (element2, "test2");
++ gst_element_add_pad (element1,
++ gst_pad_new_from_template (gst_static_pad_template_get (&sinktemplate),
++ "sink1"));
++ gst_bin_add (GST_BIN (thread), element2);
++ gst_element_link (element1, "src1", element2, "sink1");
++ gst_element_add_ghost_pad (thread, gst_element_get_pad (element2, "sink1"),
++ "sink1");
++
++ return thread;
++}
++
++static void
++add_remove_test1 (void)
++{
++ GstElement *thread;
++ GstElement *element;
++
++ thread = gst_thread_new ("testthread");
++ element = gst_element_new ();
++ gst_element_set_name (element, "test1");
++ g_assert (GST_OBJECT_FLOATING (element));
++ gst_bin_add (GST_BIN (thread), element);
++ g_assert (!GST_OBJECT_FLOATING (element));
++ gst_bin_remove (GST_BIN (thread), element);
++
++ gst_object_unref (thread);
++}
++
++static void
++add_remove_test2 (void)
++{
++ GstElement *thread;
++ GstElement *element;
++
++ thread = gst_thread_new ("testthread");
++ element = gst_element_new ();
++ gst_element_set_name (element, "test1");
++ gst_object_ref (element);
++ g_assert (GST_OBJECT_FLOATING (element));
++ gst_bin_add (GST_BIN (thread), element);
++ g_assert (!GST_OBJECT_FLOATING (element));
++ gst_bin_remove (GST_BIN (thread), element);
++ g_assert (!GST_OBJECT_FLOATING (element));
++ g_assert (!GST_OBJECT_DESTROYED (element));
++
++ gst_object_unref (element);
++ g_assert (GST_OBJECT_DESTROYED (element));
++ gst_object_unref (element);
++
++ gst_object_unref (thread);
++}
++
++static void
++add_remove_test3 (void)
++{
++ GstElement *thread;
++ GstElement *element;
++
++ thread = gst_thread_new ("testthread");
++ element = gst_element_new ();
++ gst_element_set_name (element, "test1");
++ g_assert (GST_OBJECT_FLOATING (element));
++ gst_bin_add (GST_BIN (thread), element);
++ g_assert (!GST_OBJECT_FLOATING (element));
++
++ gst_object_unref (element);
++ g_assert (gst_bin_get_by_name (GST_BIN (thread), "test1") == NULL);
++
++ gst_object_unref (thread);
++}
++
++static void
++add_remove_test4 (void)
++{
++ GstElement *thread, *thread2;
++ GstElement *element;
++
++ thread = gst_thread_new ("testthread");
++ element = gst_element_new ();
++ gst_element_set_name (element, "test1");
++ g_assert (GST_OBJECT_FLOATING (element));
++ gst_bin_add (GST_BIN (thread), element);
++ g_assert (!GST_OBJECT_FLOATING (element));
++
++ thread2 = create_thread ();
++ g_assert (GST_OBJECT_FLOATING (thread2));
++ gst_bin_add (GST_BIN (thread), thread2);
++ g_assert (!GST_OBJECT_FLOATING (thread2));
++
++ gst_object_unref (thread2);
++ g_assert (gst_bin_get_by_name (GST_BIN (thread), "testthread") == NULL);
++ gst_object_unref (element);
++ g_assert (gst_bin_get_by_name (GST_BIN (thread), "test1") == NULL);
++
++ gst_object_unref (thread);
++}
++
++int
++main (int argc, gchar * argv[])
++{
++ GstElement *thread, *element;
++ long usage1;
++ gint i, iters;
++
++ gst_init (&argc, &argv);
++
++ if (argc == 2)
++ iters = atoi (argv[1]);
++ else
++ iters = ITERS;
++
++ g_print ("starting test\n");
++ usage1 = vmsize ();
++
++ thread = gst_thread_new ("somethread");
++ gst_object_unref (thread);
++ g_print ("create/unref new thread %ld\n", vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ thread = gst_thread_new ("somethread");
++ gst_object_unref (thread);
++ }
++ g_print ("create/unref %d threads %ld\n", iters, vmsize () - usage1);
++
++ thread = gst_thread_new ("somethread");
++ g_assert (GST_OBJECT_FLOATING (thread));
++ gst_object_ref (thread);
++ gst_object_sink (GST_OBJECT (thread));
++ g_assert (!GST_OBJECT_FLOATING (thread));
++ gst_object_unref (thread);
++ g_print ("create/ref/sink/unref new thread %ld\n", vmsize () - usage1);
++
++
++ for (i = 0; i < iters; i++) {
++ thread = gst_thread_new ("somethread");
++ gst_object_ref (thread);
++ gst_object_sink (GST_OBJECT (thread));
++ gst_object_unref (thread);
++ }
++ g_print ("create/ref/sink/unref %d threads %ld\n", iters, vmsize () - usage1);
++
++ thread = gst_thread_new ("somethread");
++ g_assert (!GST_OBJECT_DESTROYED (thread));
++ gst_object_unref (thread);
++ g_assert (GST_OBJECT_DESTROYED (thread));
++ gst_object_unref (thread);
++ g_print ("create/destroy/unref new thread %ld\n", vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ thread = gst_thread_new ("somethread");
++ gst_object_unref (thread);
++ gst_object_unref (thread);
++ }
++ g_print ("create/destroy/unref %d thread %ld\n", iters, vmsize () - usage1);
++
++ thread = gst_thread_new ("somethread");
++ gst_object_ref (thread);
++ gst_object_unref (thread);
++ gst_object_unref (thread);
++ g_print ("create/ref/unref/unref new thread %ld\n", vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ thread = gst_thread_new ("somethread");
++ gst_object_ref (thread);
++ gst_object_unref (thread);
++ gst_object_unref (thread);
++ }
++ g_print ("create/ref/unref/unref %d thread %ld\n", iters, vmsize () - usage1);
++
++ thread = gst_thread_new ("somethread");
++ gst_object_ref (thread);
++ gst_object_unref (thread);
++ gst_object_unref (thread);
++ gst_object_unref (thread);
++ g_print ("craete/ref/destroy/unref/unref new thread %ld\n",
++ vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ thread = gst_thread_new ("somethread");
++ gst_object_ref (thread);
++ gst_object_unref (thread);
++ gst_object_unref (thread);
++ gst_object_unref (thread);
++ }
++ g_print ("craete/ref/destroy/unref/unref %d threads %ld\n", iters,
++ vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ thread = gst_thread_new ("somethread");
++ gst_object_ref (thread);
++ gst_element_set_name (thread, "testing123");
++ gst_object_unref (thread);
++ gst_element_set_name (thread, "testing123");
++ gst_object_unref (thread);
++ gst_object_unref (thread);
++ }
++ g_print ("craete/ref/destroy/unref/unref %d threads with name %ld\n", iters,
++ vmsize () - usage1);
++
++ thread = gst_thread_new ("somethread");
++ for (i = 0; i < iters; i++) {
++ gst_element_set_name (thread, "testing");
++ }
++ gst_object_unref (thread);
++ g_print ("set name %d times %ld\n", iters, vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ thread = gst_thread_new ("somethread");
++ element = gst_element_new ();
++ gst_element_set_name (element, "test1");
++ gst_bin_add (GST_BIN (thread), element);
++ gst_object_unref (thread);
++ }
++ g_print ("create/unref %d thread with one element %ld\n", iters,
++ vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ thread = create_thread ();
++ gst_object_unref (thread);
++ }
++ g_print ("create/unref %d thread with children %ld\n", iters,
++ vmsize () - usage1);
++
++ for (i = 0; i < iters / 2; i++) {
++ thread = create_thread_ghostpads ();
++ gst_object_unref (thread);
++ }
++ g_print ("create/unref %d thread with children and ghostpads %ld\n",
++ iters / 2, vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ add_remove_test1 ();
++ }
++ g_print ("add/remove test1 %d in thread %ld\n", iters, vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ add_remove_test2 ();
++ }
++ g_print ("add/remove test2 %d in thread %ld\n", iters, vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ add_remove_test3 ();
++ }
++ g_print ("add/destroy/remove test3 %d in thread %ld\n", iters,
++ vmsize () - usage1);
++
++ for (i = 0; i < iters; i++) {
++ add_remove_test4 ();
++ }
++ g_print ("add/destroy/remove test4 %d in thread %ld\n", iters,
++ vmsize () - usage1);
++
++ g_print ("leaked: %ld\n", vmsize () - usage1);
++
++ return (vmsize () - usage1 ? -1 : 0);
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/Rules gstreamer-0.10.23/tests/old/testsuite/Rules
+--- gstreamer-0.10.23.orig/tests/old/testsuite/Rules 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/Rules 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,33 @@
++
++TESTS_ENVIRONMENT=\
++ G_DEBUG=fatal_warnings \
++ GST_PLUGIN_PATH=$(top_builddir)/gst:$(top_builddir)/testsuite \
++ GST_REGISTRY=$(top_builddir)/testsuite/test-registry.xml
++
++
++plugindir = $(libdir)/gstreamer-@GST_MAJORMINOR@
++
++check_PROGRAMS = $(tests_pass) $(tests_fail) $(tests_ignore)
++
++# make all tests depend on the versioned gst-register
++$(tests_pass) $(tests_fail): $(top_builddir)/tools/gst-register-@GST_MAJORMINOR@
++
++# rebuild gst-register-@GST_MAJORMINOR@ if needed
++# the EXEEXT is because am 1.6 complained about overrides
++$(top_builddir)/tools/gst-register-@GST_MAJORMINOR@$(EXEEXT):
++ cd $(top_builddir)/tools && make
++
++TESTS = $(top_builddir)/tools/gst-register-@GST_MAJORMINOR@ \
++ $(tests_pass) $(tests_fail)
++XFAIL_TESTS = $(tests_fail)
++
++AM_CFLAGS = $(GST_OBJ_CFLAGS)
++LIBS = $(GST_OBJ_LIBS)
++
++# override to _not_ install the test plugins
++install-pluginLTLIBRARIES:
++
++# This rule is here so make distcheck works on machines where core
++# dumps have PIDs appended
++CLEANFILES = core.*
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/states/bin.c gstreamer-0.10.23/tests/old/testsuite/states/bin.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/states/bin.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/states/bin.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,158 @@
++/* GStreamer
++ * Copyright (C) <2004> Benjamin Otte <otte@gnome.org>
++ *
++ * bin.c:
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#include <gst/gst.h>
++
++#define RETURN_NAME(x) ((x) == GST_STATE_CHANGE_SUCCESS ? "GST_STATE_CHANGE_SUCCESS" : \
++ (x) == GST_STATE_CHANGE_ASYNC ? "GST_STATE_CHANGE_ASYNC" : "GST_STATE_CHANGE_FAILURE")
++static void
++assert_state (GstElement * element, GstState state)
++{
++ GstState current, pending;
++
++ gst_element_get_state (element, ¤t, &pending, NULL);
++ if (current != state) {
++ g_printerr ("%s: state is %s instead of %s",
++ GST_OBJECT_NAME (element),
++ gst_element_state_get_name (GST_STATE (element)),
++ gst_element_state_get_name (state));
++ g_assert_not_reached ();
++ }
++}
++
++static void
++assert_state_change (GstElement * element, GstState new_state,
++ GstStateChangeReturn result, GstState result_state)
++{
++ GstStateChangeReturn ret = gst_element_set_state (element, new_state);
++
++ if (ret != result) {
++ g_printerr ("%s: change state to %s returned %s instead of %s",
++ GST_OBJECT_NAME (element), gst_element_state_get_name (new_state),
++ RETURN_NAME (ret), RETURN_NAME (result));
++ g_assert_not_reached ();
++ }
++ assert_state (element, result_state);
++}
++
++static void
++empty_bin (gchar * bin_name)
++{
++ /* Test the behaviour of empty bins. Since a bin's state is always the state
++ * of its highest child, nothing should change in here
++ * Return values when no error occured but the state didn't change should be
++ * GST_STATE_CHANGE_ASYNC */
++ GstElement *bin = gst_element_factory_make (bin_name, NULL);
++
++ g_assert (bin);
++ /* obvious */
++ assert_state (bin, GST_STATE_NULL);
++ /* see above */
++ assert_state_change (bin, GST_STATE_READY, GST_STATE_CHANGE_SUCCESS,
++ GST_STATE_READY);
++ assert_state_change (bin, GST_STATE_PAUSED, GST_STATE_CHANGE_SUCCESS,
++ GST_STATE_PAUSED);
++ assert_state_change (bin, GST_STATE_PLAYING, GST_STATE_CHANGE_SUCCESS,
++ GST_STATE_PLAYING);
++}
++
++static void
++test_adding_one_element (GstElement * bin)
++{
++ /* Tests behaviour of adding/removing elements to/from bins. It makes sure the
++ * state of the bin is always the highest of all contained children. */
++ GstState test_states[] = { GST_STATE_READY, GST_STATE_PAUSED,
++ GST_STATE_PLAYING, GST_STATE_PAUSED, GST_STATE_READY, GST_STATE_NULL
++ };
++ GstElement *test = gst_element_factory_make ("identity", NULL);
++ GstState bin_state;
++ gint i;
++
++ gst_element_get_state (bin, &bin_state, NULL, NULL);
++ g_assert (test);
++ gst_object_ref (test);
++ assert_state (test, GST_STATE_NULL);
++ gst_bin_add (GST_BIN (bin), test);
++ assert_state (bin, MAX (bin_state, GST_STATE_NULL));
++ for (i = 0; i < G_N_ELEMENTS (test_states); i++) {
++ GstState test_state = test_states[i];
++
++ assert_state_change (test, test_state, GST_STATE_CHANGE_SUCCESS,
++ test_state);
++ assert_state (test, test_state);
++ assert_state (bin, MAX (bin_state, test_state));
++ gst_bin_remove (GST_BIN (bin), test);
++ assert_state (bin, bin_state);
++ gst_bin_add (GST_BIN (bin), test);
++ assert_state (test, test_state);
++ assert_state (bin, MAX (bin_state, test_state));
++ }
++ gst_bin_remove (GST_BIN (bin), test);
++ gst_object_unref (test);
++ assert_state (bin, bin_state);
++}
++
++static void
++test_element_in_bin (gchar * bin_name)
++{
++ gint i;
++ GstState test_states[] = { GST_STATE_NULL, GST_STATE_READY,
++ GST_STATE_PAUSED, GST_STATE_PLAYING
++ };
++ GstElement *id, *bin = gst_element_factory_make (bin_name, NULL);
++
++ g_assert (bin);
++
++ /* test correct behaviour in empty bins */
++ test_adding_one_element (bin);
++
++ id = gst_element_factory_make ("identity", NULL);
++ g_assert (id);
++ assert_state (id, GST_STATE_NULL);
++ gst_bin_add (GST_BIN (bin), id);
++ /* test correct behaviour in bins which contain elements in various states */
++ for (i = 0; i < G_N_ELEMENTS (test_states); i++) {
++ GstState test_state = test_states[i];
++
++ assert_state_change (bin, test_state, GST_STATE_CHANGE_SUCCESS, test_state);
++ assert_state (id, test_state);
++ test_adding_one_element (bin);
++ }
++
++ gst_object_unref (bin);
++}
++
++gint
++main (gint argc, gchar * argv[])
++{
++ gst_init (&argc, &argv);
++
++ /* test behaviour of empty bins */
++ empty_bin ("bin");
++ empty_bin ("pipeline");
++
++ g_print ("how far\n");
++ /* test behaviour of adding/removing elements to/from all core bin types */
++ test_element_in_bin ("bin");
++ test_element_in_bin ("pipeline");
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/states/locked.c gstreamer-0.10.23/tests/old/testsuite/states/locked.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/states/locked.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/states/locked.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,105 @@
++/* GStreamer
++ * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#include "unistd.h"
++
++#include <gst/gst.h>
++
++static GMainLoop *loop;
++
++static gboolean
++message_received (GstBus * bus, GstMessage * message, GstPipeline * pipeline)
++{
++ g_print ("message %p\n", message);
++
++ if (message->type == GST_MESSAGE_EOS) {
++ g_print ("EOS!!\n");
++ if (g_main_loop_is_running (loop))
++ g_main_loop_quit (loop);
++ }
++ gst_message_unref (message);
++
++ return TRUE;
++}
++
++gint
++main (gint argc, gchar * argv[])
++{
++ GstElement *pipeline;
++ GstElement *fakesrc1, *fakesink1;
++ GstElement *fakesrc2, *fakesink2;
++ GstBus *bus;
++
++ gst_init (&argc, &argv);
++
++ pipeline = gst_pipeline_new ("pipeline");
++
++ loop = g_main_loop_new (NULL, FALSE);
++ bus = gst_element_get_bus (pipeline);
++ gst_bus_add_watch (bus, GST_MESSAGE_EOS, (GstBusFunc) message_received,
++ (gpointer) pipeline);
++ gst_object_unref (bus);
++
++ fakesrc1 = gst_element_factory_make ("fakesrc", "fakesrc1");
++ g_object_set (G_OBJECT (fakesrc1), "num_buffers", 5, NULL);
++ fakesink1 = gst_element_factory_make ("fakesink", "fakesink1");
++
++ gst_bin_add (GST_BIN (pipeline), fakesrc1);
++ gst_bin_add (GST_BIN (pipeline), fakesink1);
++ gst_pad_link (gst_element_get_pad (fakesrc1, "src"),
++ gst_element_get_pad (fakesink1, "sink"));
++
++ fakesrc2 = gst_element_factory_make ("fakesrc", "fakesrc2");
++ g_object_set (G_OBJECT (fakesrc2), "num_buffers", 5, NULL);
++ fakesink2 = gst_element_factory_make ("fakesink", "fakesink2");
++
++ gst_bin_add (GST_BIN (pipeline), fakesrc2);
++ gst_bin_add (GST_BIN (pipeline), fakesink2);
++ gst_pad_link (gst_element_get_pad (fakesrc2, "src"),
++ gst_element_get_pad (fakesink2, "sink"));
++
++ g_signal_connect (G_OBJECT (pipeline), "deep_notify",
++ G_CALLBACK (gst_object_default_deep_notify), NULL);
++
++ GST_OBJECT_FLAG_SET (fakesrc2, GST_ELEMENT_LOCKED_STATE);
++ GST_OBJECT_FLAG_SET (fakesink2, GST_ELEMENT_LOCKED_STATE);
++
++ g_print ("play..\n");
++ gst_element_set_state (pipeline, GST_STATE_PLAYING);
++
++ g_main_loop_run (loop);
++
++ g_object_set (G_OBJECT (fakesrc1), "num_buffers", 5, NULL);
++
++ gst_element_set_state (pipeline, GST_STATE_READY);
++
++ GST_OBJECT_FLAG_UNSET (fakesrc2, GST_ELEMENT_LOCKED_STATE);
++ GST_OBJECT_FLAG_UNSET (fakesink2, GST_ELEMENT_LOCKED_STATE);
++
++ g_print ("play..\n");
++ gst_element_set_state (pipeline, GST_STATE_PLAYING);
++
++ g_main_loop_run (loop);
++
++ gst_element_set_state (pipeline, GST_STATE_NULL);
++
++ gst_object_unref (pipeline);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/states/Makefile.am gstreamer-0.10.23/tests/old/testsuite/states/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/testsuite/states/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/states/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,5 @@
++include ../Rules
++
++tests_pass = locked parent
++tests_fail =
++tests_ignore = bin
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/states/parent.c gstreamer-0.10.23/tests/old/testsuite/states/parent.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/states/parent.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/states/parent.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,111 @@
++/* GStreamer
++ *
++ * parent.c: test to check that setting state on a parent sets same state
++ * recursively on children
++ *
++ * Copyright (C) <2004> Thomas Vander Stichele <thomas at apestaart dot org>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Library General Public
++ * License as published by the Free Software Foundation; either
++ * version 2 of the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Library General Public License for more details.
++ *
++ * You should have received a copy of the GNU Library General Public
++ * License along with this library; if not, write to the
++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++ * Boston, MA 02111-1307, USA.
++ */
++
++#include <gst/gst.h>
++
++gint
++main (gint argc, gchar * argv[])
++{
++ GstElement *pipeline;
++ GstElement *bin1, *bin2;
++ GstElement *fakesrc, *identity, *fakesink;
++
++ gst_init (&argc, &argv);
++
++ /*
++ * +-pipeline----------------------------------------+
++ * | +-bin2----------------------------------------+ |
++ * | | +-bin1-----------------------+ | |
++ * | | | +---------+ +----------+ | +----------+ | |
++ * | | | | fakesrc |---| identity |---| fakesink | | |
++ * | | | +---------+ +----------- | +----------+ | |
++ * | | +----------------------------+ | |
++ * | +---------------------------------------------+ |
++ * +-------------------------------------------------+
++ */
++
++ pipeline = gst_pipeline_new ("pipeline");
++ g_assert (pipeline);
++ bin1 = gst_bin_new ("bin1");
++ g_assert (bin1);
++ bin2 = gst_bin_new ("bin2");
++ g_assert (bin2);
++
++ fakesrc = gst_element_factory_make ("fakesrc", "fakesrc");
++ g_assert (fakesrc);
++ g_object_set (G_OBJECT (fakesrc), "num_buffers", 5, NULL);
++ identity = gst_element_factory_make ("identity", "identity");
++ g_assert (identity);
++ fakesink = gst_element_factory_make ("fakesink", "fakesink");
++ g_assert (fakesink);
++
++ gst_bin_add_many (GST_BIN (bin1), fakesrc, identity, NULL);
++ g_assert (gst_element_link (fakesrc, identity));
++
++ gst_bin_add_many (GST_BIN (bin2), bin1, fakesink, NULL);
++ g_assert (gst_element_link (identity, fakesink));
++
++ gst_bin_add (GST_BIN (pipeline), bin2);
++ g_signal_connect (G_OBJECT (pipeline), "deep_notify",
++ G_CALLBACK (gst_object_default_deep_notify), NULL);
++
++ /* setting pipeline to READY should bring in all children to READY */
++ gst_element_set_state (pipeline, GST_STATE_READY);
++ g_assert (GST_STATE (bin1) == GST_STATE_READY);
++ g_assert (GST_STATE (bin2) == GST_STATE_READY);
++ g_assert (GST_STATE (fakesrc) == GST_STATE_READY);
++ g_assert (GST_STATE (identity) == GST_STATE_READY);
++ g_assert (GST_STATE (fakesink) == GST_STATE_READY);
++
++ /* setting fakesink to PAUSED should not affect pipeline and bin2 */
++ gst_element_set_state (fakesink, GST_STATE_PAUSED);
++ g_assert (GST_STATE (bin1) == GST_STATE_READY);
++ g_assert (GST_STATE (bin2) == GST_STATE_READY);
++ g_assert (GST_STATE (fakesrc) == GST_STATE_READY);
++ g_assert (GST_STATE (identity) == GST_STATE_READY);
++ g_assert (GST_STATE (fakesink) == GST_STATE_READY);
++
++ /* setting fakesrc to PAUSED should not affect bin1 */
++ gst_element_set_state (fakesrc, GST_STATE_PAUSED);
++ g_assert (GST_STATE (bin1) == GST_STATE_READY);
++ g_assert (GST_STATE (bin2) == GST_STATE_READY);
++ g_assert (GST_STATE (fakesrc) == GST_STATE_PAUSED);
++ g_assert (GST_STATE (identity) == GST_STATE_READY);
++ g_assert (GST_STATE (fakesink) == GST_STATE_READY);
++
++ /* setting bin1 to PAUSED, even though it is already, should set
++ * identity to PAUSED as well */
++ gst_element_set_state (bin1, GST_STATE_PAUSED);
++ gst_element_get_state (bin2, NULL, NULL, NULL);
++ g_assert (GST_STATE (bin1) == GST_STATE_PAUSED);
++ g_assert (GST_STATE (bin2) == GST_STATE_READY);
++ g_assert (GST_STATE (fakesrc) == GST_STATE_PAUSED);
++ g_assert (GST_STATE (identity) == GST_STATE_PAUSED);
++ g_assert (GST_STATE (fakesink) == GST_STATE_PAUSED);
++
++ gst_element_set_state (pipeline, GST_STATE_PLAYING);
++ g_usleep (1000000);
++
++ g_print ("passed.\n");
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/threads/159566.c gstreamer-0.10.23/tests/old/testsuite/threads/159566.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/threads/159566.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/threads/159566.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,96 @@
++#include <string.h>
++#include <unistd.h>
++#include <gst/gst.h>
++
++static GstElement *src1, *sink1;
++static gboolean need_src1 = TRUE;
++static gint iter = 0;
++
++static void
++object_deep_notify (GObject * object, GstObject * orig,
++ GParamSpec * pspec, gchar ** excluded_props)
++{
++ GValue value = { 0, }; /* the important thing is that value.type = 0 */
++ gchar *str = NULL;
++
++ if (strcmp (pspec->name, "last-message") != 0)
++ return;
++
++ if (GST_ELEMENT (orig) != src1 && GST_ELEMENT (orig) != sink1)
++ return;
++
++ g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec));
++ g_object_get_property (G_OBJECT (orig), pspec->name, &value);
++
++ str = g_strdup_value_contents (&value);
++ g_value_unset (&value);
++
++ if (strstr (str, "E (type:") != NULL) {
++ g_free (str);
++ return;
++ }
++
++ if (iter++ == 100) {
++ g_print (".");
++ iter = 0;
++ }
++ g_free (str);
++ if (need_src1 && GST_ELEMENT (orig) != src1) {
++ g_assert_not_reached ();
++ } else if (!need_src1 && GST_ELEMENT (orig) != sink1) {
++ g_assert_not_reached ();
++ }
++ need_src1 = !need_src1;
++}
++
++
++int
++main (int argc, char **argv)
++{
++ GstElement *thread1, *thread2, *pipeline;
++ GstElement *src2, *sink2;
++
++ gst_init (&argc, &argv);
++
++ pipeline = gst_element_factory_make ("pipeline", "pipeline");
++ thread1 = gst_element_factory_make ("thread", "thread1");
++ g_assert (thread1);
++
++ src1 = gst_element_factory_make ("fakesrc", "src1");
++ g_assert (src1);
++ sink1 = gst_element_factory_make ("fakesink", "sink1");
++ g_assert (sink1);
++
++ thread2 = gst_element_factory_make ("thread", "thread2");
++ g_assert (thread2);
++
++ src2 = gst_element_factory_make ("fakesrc", "src2");
++ g_assert (src2);
++ sink2 = gst_element_factory_make ("fakesink", "sink2");
++ g_assert (sink2);
++
++ gst_bin_add_many (GST_BIN (thread1), src1, sink1, NULL);
++ gst_bin_add_many (GST_BIN (thread2), src2, sink2, NULL);
++
++ gst_bin_add (GST_BIN (pipeline), thread1);
++ gst_bin_add (GST_BIN (pipeline), thread2);
++
++ g_signal_connect (G_OBJECT (pipeline), "deep_notify",
++ G_CALLBACK (object_deep_notify), NULL);
++
++ if (!gst_element_link_many (src1, sink1, NULL))
++ g_assert_not_reached ();
++
++ if (!gst_element_link_many (src2, sink2, NULL))
++ g_assert_not_reached ();
++
++ /* run a bit */
++ if (gst_element_set_state (pipeline,
++ GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
++ g_assert_not_reached ();
++
++ sleep (10000);
++ g_print ("done\n");
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/threads/159852.c gstreamer-0.10.23/tests/old/testsuite/threads/159852.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/threads/159852.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/threads/159852.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,33 @@
++#include <unistd.h>
++#include <gst/gst.h>
++
++
++
++static gpointer
++iterate_bin (GstBin * bin)
++{
++ while (TRUE) {
++ gst_bin_iterate (bin);
++ }
++ return NULL;
++}
++
++int
++main (int argc, char **argv)
++{
++ gint i;
++ GstElement *bin;
++
++ gst_init (&argc, &argv);
++
++ for (i = 0; i < 20; i++) {
++ bin = gst_element_factory_make ("bin", "bin");
++ gst_scheduler_factory_make (NULL, GST_ELEMENT (bin));
++
++ g_thread_create ((GThreadFunc) iterate_bin, bin, TRUE, NULL);
++ }
++
++ sleep (5);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/threads/Makefile.am gstreamer-0.10.23/tests/old/testsuite/threads/Makefile.am
+--- gstreamer-0.10.23.orig/tests/old/testsuite/threads/Makefile.am 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/threads/Makefile.am 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,33 @@
++include ../Rules
++
++tests_pass = thread1 thread2 thread3 thread4 thread5 threade threadf signal1 159852 threadg threadi-123775
++tests_fail = 159566 signal2 signal3
++
++# threadh
++
++tests_ignore = queue threadb threadc threadd staticrec threadi-nfy1 threadi-nfy2
++
++thread1_SOURCES = thread.c
++thread1_CFLAGS = -DTESTNUM=1 $(AM_CFLAGS)
++thread2_SOURCES = thread.c
++thread2_CFLAGS = -DTESTNUM=2 $(AM_CFLAGS)
++thread3_SOURCES = thread.c
++thread3_CFLAGS = -DTESTNUM=3 $(AM_CFLAGS)
++thread4_SOURCES = thread.c
++thread4_CFLAGS = -DTESTNUM=4 $(AM_CFLAGS)
++thread5_SOURCES = thread.c
++thread5_CFLAGS = -DTESTNUM=5 $(AM_CFLAGS)
++
++signal1_SOURCES = signals.c
++signal1_CFLAGS = -DTESTNUM=1 $(AM_CFLAGS)
++signal2_SOURCES = signals.c
++signal2_CFLAGS = -DTESTNUM=2 $(AM_CFLAGS)
++signal3_SOURCES = signals.c
++signal3_CFLAGS = -DTESTNUM=3 $(AM_CFLAGS)
++
++threadi_123775_SOURCES = threadi.c
++threadi_123775_CFLAGS = -DTESTNUM=123775 $(AM_CFLAGS)
++threadi_nfy1_SOURCES = threadi.c
++threadi_nfy1_CFLAGS = -DTESTNUM=999998 $(AM_CFLAGS)
++threadi_nfy2_SOURCES = threadi.c
++threadi_nfy2_CFLAGS = -DTESTNUM=999999 $(AM_CFLAGS)
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/threads/queue.c gstreamer-0.10.23/tests/old/testsuite/threads/queue.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/threads/queue.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/threads/queue.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,89 @@
++#include <gst/gst.h>
++
++#include <unistd.h>
++
++/*
++ * queue test code
++ * starts a fakesrc num_buffers=50 ! { queue ! fakesink } thread
++ * by first setting the output thread to play, then the whole pipeline
++ */
++
++static volatile gint handoff_count = 0;
++
++/* handoff callback */
++static void
++handoff (GstElement * element, gpointer data)
++{
++ ++handoff_count;
++ g_print ("handoff (%d) ", handoff_count);
++}
++
++static void
++construct_pipeline (GstElement * pipeline, GstElement * thread)
++{
++ GstElement *src, *sink, *queue;
++
++ src = gst_element_factory_make ("fakesrc", NULL);
++ sink = gst_element_factory_make ("fakesink", "sink");
++ queue = gst_element_factory_make ("queue", NULL);
++
++ gst_bin_add_many (GST_BIN (thread), queue, sink, NULL);
++ gst_bin_add_many (GST_BIN (pipeline), src, thread, NULL);
++
++ gst_element_link_many (src, queue, sink, NULL);
++
++ g_object_set (G_OBJECT (src), "num_buffers", 50, NULL);
++
++ g_object_set (G_OBJECT (sink), "signal-handoffs", TRUE, NULL);
++ g_signal_connect (G_OBJECT (sink), "handoff", G_CALLBACK (handoff), NULL);
++}
++
++void
++change_state (GstElement * element, GstBuffer * buf, GstElement * pipeline)
++{
++ gst_element_set_state (pipeline, GST_STATE_NULL);
++}
++
++int
++main (gint argc, gchar * argv[])
++{
++ GstElement *pipeline;
++ GstElement *thread = NULL;
++
++ gst_init (&argc, &argv);
++
++ pipeline = gst_thread_new ("main_pipeline");
++ thread = gst_element_factory_make ("thread", NULL);
++ construct_pipeline (pipeline, thread);
++
++ g_print ("First run: to show the pipeline works\n");
++ gst_element_set_state (pipeline, GST_STATE_PLAYING);
++ g_print ("SLEEPING 1 sec\n");
++ sleep (1);
++
++ g_print ("Pipeline done. Resetting to NULL.\n");
++ gst_element_set_state (pipeline, GST_STATE_NULL);
++
++ if (handoff_count == 0) {
++ g_print ("ERROR: no buffers have passed\n");
++ return -1;
++ }
++
++ handoff_count = 0;
++
++ g_print
++ ("Second run: setting consumer thread to playing, then complete pipeline\n");
++ gst_element_set_state (thread, GST_STATE_PLAYING);
++ g_print ("SLEEPING 1 sec\n");
++ sleep (1);
++ gst_element_set_state (pipeline, gst_element_get_state (pipeline));
++ g_print ("SLEEPING 2 sec\n");
++ sleep (2);
++
++ if (handoff_count == 0) {
++ g_print ("ERROR: no buffers have passed\n");
++ return -1;
++ }
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/threads/signals.c gstreamer-0.10.23/tests/old/testsuite/threads/signals.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/threads/signals.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/threads/signals.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,231 @@
++#include <unistd.h>
++#include <gst/gst.h>
++
++#define GST_TYPE_TEST (gst_test_get_type ())
++#define GST_TEST(test) (G_TYPE_CHECK_INSTANCE_CAST ((test), GST_TYPE_TEST, GstTest))
++#define GST_IS_TEST(test) (G_TYPE_CHECK_INSTANCE_TYPE ((test), GST_TYPE_TEST))
++#define GST_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_CAST ((tclass), GST_TYPE_TEST, GstTestClass))
++#define GST_IS_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_TYPE ((tclass), GST_TYPE_TEST))
++#define GST_TEST_GET_CLASS(test) (G_TYPE_INSTANCE_GET_CLASS ((test), GST_TYPE_TEST, GstTestClass))
++
++typedef struct _GstTest GstTest;
++typedef struct _GstTestClass GstTestClass;
++
++struct _GstTest
++{
++ GstObject object;
++};
++
++struct _GstTestClass
++{
++ GstObjectClass parent_class;
++
++ void (*test_signal1) (GstTest * test, gint an_int);
++ void (*test_signal2) (GstTest * test, gint an_int);
++};
++
++static GType gst_test_get_type (void);
++
++/* Element signals and args */
++enum
++{
++ TEST_SIGNAL1,
++ TEST_SIGNAL2,
++ /* add more above */
++ LAST_SIGNAL
++};
++
++enum
++{
++ ARG_0,
++ ARG_TEST_PROP
++};
++
++static void gst_test_class_init (GstTestClass * klass);
++static void gst_test_init (GstTest * test);
++static void gst_test_dispose (GObject * object);
++
++static void signal2_handler (GstTest * test, gint anint);
++
++static void gst_test_set_property (GObject * object, guint prop_id,
++ const GValue * value, GParamSpec * pspec);
++static void gst_test_get_property (GObject * object, guint prop_id,
++ GValue * value, GParamSpec * pspec);
++
++static GstObjectClass *parent_class = NULL;
++
++static guint gst_test_signals[LAST_SIGNAL] = { 0 };
++
++static GType
++gst_test_get_type (void)
++{
++ static GType test_type = 0;
++
++ if (!test_type) {
++ static const GTypeInfo test_info = {
++ sizeof (GstTestClass),
++ NULL,
++ NULL,
++ (GClassInitFunc) gst_test_class_init,
++ NULL,
++ NULL,
++ sizeof (GstTest),
++ 0,
++ (GInstanceInitFunc) gst_test_init,
++ NULL
++ };
++
++ test_type = g_type_register_static (GST_TYPE_OBJECT, "GstTest",
++ &test_info, 0);
++ }
++ return test_type;
++}
++
++static void
++gst_test_class_init (GstTestClass * klass)
++{
++ GObjectClass *gobject_class;
++ GstObjectClass *gstobject_class;
++
++ gobject_class = G_OBJECT_CLASS (klass);
++ gstobject_class = GST_OBJECT_CLASS (klass);
++
++ parent_class = g_type_class_peek_parent (klass);
++
++ if (!g_thread_supported ())
++ g_thread_init (NULL);
++
++ gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_test_dispose);
++ gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_test_set_property);
++ gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_test_get_property);
++
++ gst_test_signals[TEST_SIGNAL1] =
++ g_signal_new ("test-signal1", G_TYPE_FROM_CLASS (klass),
++ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstTestClass, test_signal1), NULL,
++ NULL, gst_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
++ gst_test_signals[TEST_SIGNAL2] =
++ g_signal_new ("test-signal2", G_TYPE_FROM_CLASS (klass),
++ G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstTestClass, test_signal2), NULL,
++ NULL, gst_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
++
++ g_object_class_install_property (gobject_class, ARG_TEST_PROP,
++ g_param_spec_int ("test-prop", "Test Prop", "Test property",
++ 0, 1, 0, G_PARAM_READWRITE));
++
++ klass->test_signal2 = signal2_handler;
++}
++
++static void
++gst_test_init (GstTest * test)
++{
++}
++
++static void
++gst_test_dispose (GObject * object)
++{
++ GstTest *test;
++
++ test = GST_TEST (object);
++
++ G_OBJECT_CLASS (parent_class)->dispose (object);
++}
++
++static void
++gst_test_set_property (GObject * object, guint prop_id,
++ const GValue * value, GParamSpec * pspec)
++{
++ GstTest *test;
++
++ test = GST_TEST (object);
++
++ switch (prop_id) {
++ case ARG_TEST_PROP:
++ g_value_get_int (value);
++ break;
++ default:
++ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
++ break;
++ }
++}
++
++static void
++gst_test_get_property (GObject * object, guint prop_id,
++ GValue * value, GParamSpec * pspec)
++{
++ GstTest *test;
++
++ test = GST_TEST (object);
++
++ switch (prop_id) {
++ case ARG_TEST_PROP:
++ g_value_set_int (value, 0);
++ break;
++ default:
++ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
++ break;
++ }
++}
++
++static void
++gst_test_do_signal1 (GstTest * test)
++{
++ g_signal_emit (G_OBJECT (test), gst_test_signals[TEST_SIGNAL1], 0, 0);
++}
++
++static void
++signal2_handler (GstTest * test, gint anint)
++{
++}
++
++static void
++gst_test_do_signal2 (GstTest * test)
++{
++ g_signal_emit (G_OBJECT (test), gst_test_signals[TEST_SIGNAL2], 0, 0);
++}
++
++static void
++gst_test_do_prop (GstTest * test)
++{
++ g_object_notify (G_OBJECT (test), "test-prop");
++}
++
++static gpointer
++run_thread (GstTest * test)
++{
++ gint i = 0;
++
++ while (TRUE) {
++ if (TESTNUM == 1)
++ gst_test_do_signal1 (test);
++ if (TESTNUM == 2)
++ gst_test_do_signal2 (test);
++ if (TESTNUM == 3)
++ gst_test_do_prop (test);
++ if ((i++ % 10000) == 0) {
++ g_print (".");
++ g_usleep (1); /* context switch */
++ }
++ }
++
++ return NULL;
++}
++
++int
++main (int argc, char **argv)
++{
++ gint i;
++ GstTest *test1, *test2;
++
++ gst_init (&argc, &argv);
++
++ test1 = g_object_new (GST_TYPE_TEST, NULL);
++ test2 = g_object_new (GST_TYPE_TEST, NULL);
++
++ for (i = 0; i < 20; i++) {
++ g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL);
++ g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL);
++ }
++ sleep (5);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/threads/staticrec.c gstreamer-0.10.23/tests/old/testsuite/threads/staticrec.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/threads/staticrec.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/threads/staticrec.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,49 @@
++#include <glib.h>
++
++GStaticRecMutex mutex = G_STATIC_REC_MUTEX_INIT;
++
++static void *
++thread1 (void *t)
++{
++ gint i = 0;
++
++ while (TRUE) {
++ g_static_rec_mutex_lock (&mutex);
++ if (i++ % 100000 == 0)
++ g_print ("*");
++ g_static_rec_mutex_unlock (&mutex);
++ if (i++ % 100000 == 0)
++ g_print ("*");
++ }
++ return NULL;
++}
++
++static void *
++thread2 (void *t)
++{
++ gint i = 0;
++
++ while (TRUE) {
++ g_static_rec_mutex_lock (&mutex);
++ if (i++ % 100000 == 0)
++ g_print (".");
++ g_static_rec_mutex_unlock (&mutex);
++ if (i++ % 100000 == 0)
++ g_print (".");
++ }
++ return NULL;
++}
++
++int
++main (gint argc, gchar * argv[])
++{
++ g_thread_init (NULL);
++ g_thread_create_full (thread1,
++ NULL, 0x200000, FALSE, TRUE, G_THREAD_PRIORITY_NORMAL, NULL);
++ g_thread_create_full (thread2,
++ NULL, 0x200000, FALSE, TRUE, G_THREAD_PRIORITY_NORMAL, NULL);
++
++ g_usleep (G_MAXLONG);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/threads/threadb.c gstreamer-0.10.23/tests/old/testsuite/threads/threadb.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/threads/threadb.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/threads/threadb.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,80 @@
++#include <gst/gst.h>
++
++/* threadb.c
++ * this tests if we can make a GstThread, put some stuff in it,
++ * dispatch it, and let it run from a main gst loop
++ * we repeat the main loop a hundred times to test thread reuse
++ * underneath GstThread
++ */
++
++gboolean running = FALSE;
++
++static void
++construct_pipeline (GstElement * pipeline)
++{
++ GstElement *src, *sink, *identity;
++
++ src = gst_element_factory_make ("fakesrc", NULL);
++ identity = gst_element_factory_make ("identity", NULL);
++ sink = gst_element_factory_make ("fakesink", NULL);
++ g_assert (src);
++ g_assert (identity);
++ g_assert (sink);
++
++ gst_element_link_many (src, identity, sink, NULL);
++
++ gst_bin_add_many (GST_BIN (pipeline), src, identity, sink, NULL);
++
++ g_object_set (G_OBJECT (src), "num_buffers", 5, NULL);
++}
++
++void
++state_changed (GstElement * el, gint arg1, gint arg2, gpointer user_data)
++{
++ GstState state = gst_element_get_state (el);
++
++ g_print ("element %s has changed state to %s\n",
++ GST_ELEMENT_NAME (el), gst_element_state_get_name (state));
++ if (state == GST_STATE_PLAYING)
++ running = TRUE;
++ /* if we move from PLAYING to PAUSED, we're done */
++ if (state == GST_STATE_PAUSED && running) {
++ running = FALSE;
++ gst_main_quit ();
++ }
++}
++
++int
++main (gint argc, gchar * argv[])
++{
++ int runs = 100;
++ int i;
++ gulong id;
++ GstElement *thread;
++
++ gst_init (&argc, &argv);
++
++ for (i = 0; i < runs; ++i) {
++ thread = gst_thread_new ("main_thread");
++ g_assert (thread);
++
++ /* connect state change signal */
++ id = g_signal_connect (G_OBJECT (thread), "state_change",
++ G_CALLBACK (state_changed), NULL);
++ construct_pipeline (thread);
++
++ g_print ("Setting thread to play\n");
++ gst_element_set_state (thread, GST_STATE_PLAYING);
++
++ g_print ("Going into the main GStreamer loop\n");
++ gst_main ();
++ g_print ("Coming out of the main GStreamer loop\n");
++ g_signal_handler_disconnect (G_OBJECT (thread), id);
++ gst_element_set_state (thread, GST_STATE_NULL);
++ g_print ("Unreffing thread\n");
++ g_object_unref (G_OBJECT (thread));
++ running = FALSE;
++ }
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/threads/thread.c gstreamer-0.10.23/tests/old/testsuite/threads/thread.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/threads/thread.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/threads/thread.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,128 @@
++#include <gst/gst.h>
++
++/*
++ * FIXME:
++ * these tests should have a maximum run length, so that they get killed
++ * if they lock up, which they're bound to do.
++ */
++
++void
++usage (void)
++{
++ g_print ("compile this test with TESTNUM defined.\n"
++ " available TESTNUMs: \n"
++ " 1: stress test state change \n"
++ " 2: iterate once \n"
++ " 3: iterate twice \n"
++ " 4: state change while running \n"
++ " 5: state change in thread context\n");
++}
++
++static void
++construct_pipeline (GstElement * pipeline)
++{
++ GstElement *src, *sink, *queue, *identity, *thread;
++
++ src = gst_element_factory_make ("fakesrc", NULL);
++ sink = gst_element_factory_make ("fakesink", "sink");
++ identity = gst_element_factory_make ("identity", NULL);
++ queue = gst_element_factory_make ("queue", NULL);
++ thread = gst_element_factory_make ("thread", NULL);
++
++ gst_element_link_many (src, queue, identity, sink, NULL);
++
++ gst_bin_add_many (GST_BIN (pipeline), src, queue, thread, NULL);
++ gst_bin_add_many (GST_BIN (thread), identity, sink, NULL);
++
++ g_object_set (G_OBJECT (src), "num_buffers", 5, NULL);
++ //g_object_set (sink, "signal-handoffs", TRUE, NULL);
++}
++
++void
++change_state (GstElement * element, GstBuffer * buf, GstPad * pad,
++ GstElement * pipeline)
++{
++ gst_element_set_state (pipeline, GST_STATE_NULL);
++}
++
++int
++main (gint argc, gchar * argv[])
++{
++ GstElement *pipeline;
++
++ gst_init (&argc, &argv);
++
++#ifndef TESTNUM
++ usage ();
++ return -1;
++#endif
++
++ pipeline = gst_pipeline_new ("main_pipeline");
++ construct_pipeline (pipeline);
++
++ if (TESTNUM == 1) {
++ g_print ("thread test 1: stress test state changes...\n");
++
++ g_print ("NULL\n");
++ gst_element_set_state (pipeline, GST_STATE_NULL);
++ g_print ("READY\n");
++ gst_element_set_state (pipeline, GST_STATE_READY);
++ g_print ("NULL\n");
++ gst_element_set_state (pipeline, GST_STATE_NULL);
++ g_print ("PAUSED\n");
++ gst_element_set_state (pipeline, GST_STATE_PAUSED);
++ g_print ("READY\n");
++ gst_element_set_state (pipeline, GST_STATE_READY);
++ g_print ("PAUSED\n");
++ gst_element_set_state (pipeline, GST_STATE_PAUSED);
++ g_print ("PLAYING\n");
++ gst_element_set_state (pipeline, GST_STATE_PLAYING);
++ /* element likely hits EOS and does a state transition to PAUSED */
++ g_print ("READY\n");
++ gst_element_set_state (pipeline, GST_STATE_READY);
++ g_print ("NULL\n");
++ gst_element_set_state (pipeline, GST_STATE_NULL);
++ }
++
++ if (TESTNUM == 2 || TESTNUM == 3) {
++ gst_element_set_state (pipeline, GST_STATE_PLAYING);
++ g_print ("running ...\n");
++ while (gst_bin_iterate (GST_BIN (pipeline)));
++ g_print ("done ...\n");
++ gst_element_set_state (pipeline, GST_STATE_NULL);
++ }
++ if (TESTNUM == 3) {
++ gst_element_set_state (pipeline, GST_STATE_PLAYING);
++ g_print ("running ...\n");
++ while (gst_bin_iterate (GST_BIN (pipeline)));
++ g_print ("done ...\n");
++ gst_element_set_state (pipeline, GST_STATE_NULL);
++ }
++ if (TESTNUM == 4) {
++ gint run;
++
++ gst_element_set_state (pipeline, GST_STATE_PLAYING);
++ g_print ("running ...\n");
++ for (run = 0; run < 3; run++) {
++ gst_bin_iterate (GST_BIN (pipeline));
++ }
++ gst_element_set_state (pipeline, GST_STATE_NULL);
++ }
++ if (TESTNUM == 5) {
++ /* I don't think this test is supposed to work */
++ GstElement *sink;
++
++ sink = gst_bin_get_by_name (GST_BIN (pipeline), "sink");
++ g_assert (sink);
++
++ g_signal_connect (G_OBJECT (sink), "handoff",
++ G_CALLBACK (change_state), pipeline);
++ gst_element_set_state (pipeline, GST_STATE_PLAYING);
++ g_print ("running ...\n");
++ while (gst_bin_iterate (GST_BIN (pipeline)));
++ g_print ("stopping ...\n");
++ gst_element_set_state (pipeline, GST_STATE_NULL);
++ }
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/threads/threadc.c gstreamer-0.10.23/tests/old/testsuite/threads/threadc.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/threads/threadc.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/threads/threadc.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,93 @@
++#include <gst/gst.h>
++
++/* threadc.c
++ * this tests if we can make a GstThread, with enough cothreads to stress it
++ */
++
++gboolean running = FALSE;
++gboolean can_quit = FALSE;
++
++static void
++construct_pipeline (GstElement * pipeline, gint identities)
++{
++ GstElement *src, *sink;
++ GstElement *identity = NULL;
++ GstElement *from;
++ int i;
++
++ identity = NULL;
++ src = gst_element_factory_make ("fakesrc", NULL);
++ sink = gst_element_factory_make ("fakesink", NULL);
++ g_assert (src);
++ g_assert (sink);
++ gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
++ from = src;
++
++ for (i = 0; i < identities; ++i) {
++ identity = gst_element_factory_make ("identity", NULL);
++ g_assert (identity);
++ gst_bin_add (GST_BIN (pipeline), identity);
++ gst_element_link (from, identity);
++ from = identity;
++ }
++ gst_element_link (identity, sink);
++
++ g_object_set (G_OBJECT (src), "num_buffers", 10, "sizetype", 3, NULL);
++}
++
++void
++state_changed (GstElement * el, gint arg1, gint arg2, gpointer user_data)
++{
++ GstState state = gst_element_get_state (el);
++
++ g_print ("element %s has changed state to %s\n",
++ GST_ELEMENT_NAME (el), gst_element_state_get_name (state));
++ if (state == GST_STATE_PLAYING)
++ running = TRUE;
++ /* if we move from PLAYING to PAUSED, we're done */
++ if (state == GST_STATE_PAUSED && running) {
++ while (!can_quit);
++ can_quit = FALSE;
++ g_print ("quitting main loop\n");
++ gst_main_quit ();
++ }
++}
++
++int
++main (gint argc, gchar * argv[])
++{
++ int runs = 290;
++ int i;
++ gulong id;
++ GstElement *thread;
++
++ gst_init (&argc, &argv);
++
++ for (i = 90; i < runs; ++i) {
++ thread = gst_thread_new ("main_thread");
++ g_assert (thread);
++
++ /* connect state change signal */
++ id = g_signal_connect (G_OBJECT (thread), "state_change",
++ G_CALLBACK (state_changed), NULL);
++ construct_pipeline (thread, i / 10 + 1);
++
++ g_print ("Setting thread to play with %d identities\n", i / 10 + 1);
++ if (gst_element_set_state (thread,
++ GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) {
++ g_error ("Failed setting thread to play\n");
++ } else {
++ g_print ("Going into the main GStreamer loop\n");
++ can_quit = TRUE; /* we don't want gst_main_quit called before gst_main */
++ gst_main ();
++ }
++ running = FALSE;
++ g_print ("Coming out of the main GStreamer loop\n");
++ g_signal_handler_disconnect (G_OBJECT (thread), id);
++ gst_element_set_state (thread, GST_STATE_NULL);
++ g_print ("Unreffing thread\n");
++ g_object_unref (G_OBJECT (thread));
++ }
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/threads/threadd.c gstreamer-0.10.23/tests/old/testsuite/threads/threadd.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/threads/threadd.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/threads/threadd.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,95 @@
++#include <gst/gst.h>
++#include <unistd.h>
++
++/* threadc.c
++ * this tests if we can make a GstThread, with enough cothreads to stress it
++ */
++
++#define MAX_IDENTITIES 29
++#define RUNS_PER_IDENTITY 5
++
++volatile gboolean running = FALSE;
++
++/* must be volatile, we're going to fool the compiler */
++volatile gboolean done = FALSE;
++
++static void
++construct_pipeline (GstElement * pipeline, gint identities)
++{
++ GstElement *src, *sink, *identity = NULL;
++ GstElement *from;
++ int i;
++
++ src = gst_element_factory_make ("fakesrc", NULL);
++ sink = gst_element_factory_make ("fakesink", NULL);
++ g_assert (src);
++ g_assert (sink);
++ gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
++ from = src;
++
++ for (i = 0; i < identities; ++i) {
++ identity = gst_element_factory_make ("identity", NULL);
++ g_assert (identity);
++ gst_bin_add (GST_BIN (pipeline), identity);
++ gst_element_link (from, identity);
++ from = identity;
++ }
++ gst_element_link (identity, sink);
++
++ g_object_set (G_OBJECT (src), "num_buffers", 10, "sizetype", 3, NULL);
++}
++
++void
++state_changed (GstElement * el, gint arg1, gint arg2, gpointer user_data)
++{
++ GstState state = gst_element_get_state (el);
++
++ g_print ("element %s has changed state to %s\n",
++ GST_ELEMENT_NAME (el), gst_element_state_get_name (state));
++ if (state == GST_STATE_PLAYING)
++ running = TRUE;
++ /* if we move from PLAYING to PAUSED, we're done */
++ if (state == GST_STATE_PAUSED && running)
++ done = TRUE;
++}
++
++int
++main (gint argc, gchar * argv[])
++{
++ int runs = MAX_IDENTITIES * RUNS_PER_IDENTITY;
++ int i;
++ gulong id;
++ GstElement *thread;
++
++ gst_init (&argc, &argv);
++
++ for (i = 0; i < runs; ++i) {
++ thread = gst_thread_new ("main_thread");
++ g_assert (thread);
++
++ /* connect state change signal */
++ id = g_signal_connect (G_OBJECT (thread), "state_change",
++ G_CALLBACK (state_changed), NULL);
++ construct_pipeline (thread, i / RUNS_PER_IDENTITY + 1);
++
++ g_print ("Setting thread to play with %d identities\n",
++ i / RUNS_PER_IDENTITY + 1);
++ done = FALSE;
++ if (gst_element_set_state (thread,
++ GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) {
++ g_warning ("failed to go to PLAYING");
++ } else {
++ g_print ("Waiting for thread PLAYING->PAUSED\n");
++ while (!done) /* do nothing */
++ ;
++ }
++ running = FALSE;
++ g_print ("Coming out of the main GStreamer loop\n");
++ g_signal_handler_disconnect (G_OBJECT (thread), id);
++ gst_element_set_state (thread, GST_STATE_NULL);
++ g_print ("Unreffing thread\n");
++ g_object_unref (G_OBJECT (thread));
++ }
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/threads/threade.c gstreamer-0.10.23/tests/old/testsuite/threads/threade.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/threads/threade.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/threads/threade.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,81 @@
++#include <gst/gst.h>
++#include <unistd.h>
++
++/* threadc.c
++ * this tests if we can make a GstBin and iterate it inside a GThread
++ */
++
++#define MAX_IDENTITIES 29
++#define RUNS_PER_IDENTITY 5
++
++volatile gboolean running = FALSE;
++volatile gboolean done = FALSE;
++
++static void
++construct_pipeline (GstElement * pipeline, gint identities)
++{
++ GstElement *src, *sink, *identity = NULL;
++ GstElement *from;
++ int i;
++
++ src = gst_element_factory_make ("fakesrc", NULL);
++ sink = gst_element_factory_make ("fakesink", NULL);
++ g_assert (src);
++ g_assert (sink);
++ gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
++ from = src;
++
++ for (i = 0; i < identities; ++i) {
++ identity = gst_element_factory_make ("identity", NULL);
++ g_assert (identity);
++ gst_bin_add (GST_BIN (pipeline), identity);
++ gst_element_link (from, identity);
++ from = identity;
++ }
++ gst_element_link (identity, sink);
++
++ g_object_set (G_OBJECT (src), "num_buffers", 10, "sizetype", 3, NULL);
++}
++
++static void
++iterator (GstElement * bin)
++{
++ gst_element_set_state (bin, GST_STATE_PLAYING);
++ while (gst_bin_iterate (GST_BIN (bin)))
++ g_print ("+");
++ gst_element_set_state (bin, GST_STATE_NULL);
++ g_print ("\n");
++ done = TRUE;
++}
++
++int
++main (gint argc, gchar * argv[])
++{
++ int runs = MAX_IDENTITIES * RUNS_PER_IDENTITY;
++ int i;
++ GstElement *pipeline;
++
++ g_thread_init (NULL);
++ gst_init (&argc, &argv);
++
++ for (i = 0; i < runs; ++i) {
++ pipeline = gst_pipeline_new ("main_pipeline");
++ g_assert (pipeline);
++
++ /* connect state change signal */
++ construct_pipeline (pipeline, i / RUNS_PER_IDENTITY + 1);
++
++ done = FALSE;
++ g_thread_create ((GThreadFunc) iterator, pipeline, FALSE, NULL);
++ g_print ("Created GThread\n");
++
++ g_print ("Waiting for thread PLAYING->PAUSED\n");
++ while (!done) /* do nothing */
++ ;
++ running = FALSE;
++ g_print ("Unreffing pipeline\n");
++ g_object_unref (G_OBJECT (pipeline));
++ }
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/threads/threadf.c gstreamer-0.10.23/tests/old/testsuite/threads/threadf.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/threads/threadf.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/threads/threadf.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,83 @@
++#include <gst/gst.h>
++
++/* threadf.c
++ * this tests if we can make a GThread and construct and interate a pipeline
++ * inside it
++ * used to fail because of cothread ctx key not being reset on context
++ * destroy
++ */
++
++#define MAX_IDENTITIES 29
++#define RUNS_PER_IDENTITY 5
++
++volatile gboolean running = FALSE;
++volatile gboolean done = FALSE;
++
++static void
++construct_pipeline (GstElement * pipeline, gint identities)
++{
++ GstElement *src, *sink;
++ GstElement *identity = NULL;
++ GstElement *from;
++ int i;
++
++ identity = NULL;
++ src = gst_element_factory_make ("fakesrc", NULL);
++ sink = gst_element_factory_make ("fakesink", NULL);
++ g_assert (src);
++ g_assert (sink);
++ gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
++ from = src;
++
++ for (i = 0; i < identities; ++i) {
++ identity = gst_element_factory_make ("identity", NULL);
++ g_assert (identity);
++ gst_bin_add (GST_BIN (pipeline), identity);
++ if (!(gst_element_link (from, identity)))
++ g_print ("Warning: can't link identity with previous element\n");
++ from = identity;
++ }
++ gst_element_link (identity, sink);
++
++ g_object_set (G_OBJECT (src), "num_buffers", 10, "sizetype", 3, NULL);
++}
++
++static void
++thread (void)
++{
++ int runs = MAX_IDENTITIES * RUNS_PER_IDENTITY;
++ int i;
++ GstElement *pipeline;
++
++ for (i = 30; i < runs; ++i) {
++ pipeline = gst_pipeline_new ("main_pipeline");
++ g_assert (pipeline);
++
++ g_print ("Run %d, using %d identities\n", i, i / RUNS_PER_IDENTITY + 1);
++ construct_pipeline (pipeline, i / RUNS_PER_IDENTITY + 1);
++ if (!gst_element_set_state (pipeline, GST_STATE_PLAYING))
++ g_print ("WARNING: can't set pipeline to play\n");
++ while (gst_bin_iterate (GST_BIN (pipeline)))
++ g_print ("+");
++ g_print ("\n");
++ g_print ("Unreffing pipeline\n");
++ g_object_unref (G_OBJECT (pipeline));
++ }
++ done = TRUE;
++}
++
++int
++main (gint argc, gchar * argv[])
++{
++ done = FALSE;
++
++ g_thread_init (NULL);
++ gst_init (&argc, &argv);
++
++ g_thread_create ((GThreadFunc) thread, NULL, FALSE, NULL);
++ g_print ("main: created GThread\n");
++ while (!done)
++ g_usleep (G_USEC_PER_SEC);
++ g_print ("main: done\n");
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/threads/threadg.c gstreamer-0.10.23/tests/old/testsuite/threads/threadg.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/threads/threadg.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/threads/threadg.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,67 @@
++/* this tests if the GstThread is ok after removing all elements from it
++ * in PAUSED rather than NULL state. Currently it crashes with a mutex
++ * error
++ */
++
++#include <gst/gst.h>
++
++int
++main (int argc, char **argv)
++{
++ GstElement *thread, *pipeline;
++ GstElement *src, *sink, *queue;
++ int i;
++
++ gst_init (&argc, &argv);
++
++ pipeline = gst_element_factory_make ("pipeline", "pipeline");
++
++ src = gst_element_factory_make ("fakesrc", "src");
++ g_assert (src);
++
++ gst_bin_add (GST_BIN (pipeline), src);
++
++ thread = gst_element_factory_make ("thread", "thread");
++ g_assert (thread);
++ sink = gst_element_factory_make ("fakesink", "sink");
++ g_assert (sink);
++ queue = gst_element_factory_make ("queue", "queue");
++ g_assert (queue);
++
++ gst_bin_add_many (GST_BIN (thread), queue, sink, NULL);
++
++ gst_bin_add (GST_BIN (pipeline), thread);
++
++ if (!gst_element_link_many (src, queue, sink, NULL))
++ g_assert_not_reached ();
++
++
++ if (gst_element_set_state (pipeline,
++ GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
++ g_assert_not_reached ();
++
++ for (i = 0; i < 100; i++) {
++ if (!gst_bin_iterate (GST_BIN (pipeline)))
++ g_assert_not_reached ();
++ g_print ("%d\n", i);
++ }
++
++ if (gst_element_set_state (pipeline,
++ GST_STATE_PAUSED) != GST_STATE_CHANGE_SUCCESS)
++ g_assert_not_reached ();
++
++ gst_bin_remove_many (GST_BIN (thread), queue, sink, NULL);
++
++ if (gst_element_set_state (thread,
++ GST_STATE_NULL) != GST_STATE_CHANGE_SUCCESS)
++ g_assert_not_reached ();
++
++ gst_bin_remove (GST_BIN (pipeline), thread);
++
++ if (gst_element_set_state (pipeline,
++ GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
++ g_assert_not_reached ();
++
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/threads/threadh.c gstreamer-0.10.23/tests/old/testsuite/threads/threadh.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/threads/threadh.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/threads/threadh.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,53 @@
++#include <unistd.h>
++#include <gst/gst.h>
++
++static GstElement *thread, *pipeline;
++static GstElement *src, *sink;
++
++static void
++handoff_src (GstElement * element)
++{
++ g_print ("identity handoff\n");
++
++ if (gst_element_set_state (thread,
++ GST_STATE_PAUSED) != GST_STATE_CHANGE_SUCCESS)
++ g_assert_not_reached ();
++
++ if (gst_element_set_state (sink, GST_STATE_READY) != GST_STATE_CHANGE_SUCCESS)
++ g_assert_not_reached ();
++
++ gst_bin_remove (GST_BIN (thread), src);
++}
++
++int
++main (int argc, char **argv)
++{
++ gst_init (&argc, &argv);
++
++ pipeline = gst_element_factory_make ("pipeline", "pipeline");
++
++ thread = gst_element_factory_make ("thread", "thread");
++ g_assert (thread);
++
++ src = gst_element_factory_make ("fakesrc", "src");
++ g_assert (src);
++ g_signal_connect (G_OBJECT (src), "handoff", (GCallback) handoff_src, NULL);
++ g_object_set (G_OBJECT (src), "signal-handoffs", TRUE, NULL);
++ sink = gst_element_factory_make ("fakesink", "sink");
++ g_assert (sink);
++
++ gst_bin_add (GST_BIN (pipeline), thread);
++
++ gst_bin_add_many (GST_BIN (thread), src, sink, NULL);
++ if (!gst_element_link_many (src, sink, NULL))
++ g_assert_not_reached ();
++
++ /* run a bit */
++ if (gst_element_set_state (pipeline,
++ GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
++ g_assert_not_reached ();
++
++ sleep (2);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tests/old/testsuite/threads/threadi.c gstreamer-0.10.23/tests/old/testsuite/threads/threadi.c
+--- gstreamer-0.10.23.orig/tests/old/testsuite/threads/threadi.c 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tests/old/testsuite/threads/threadi.c 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,139 @@
++/*
++ * Test three ways of going non-lineairly to PLAYING. Both tests have a
++ * thread containing a fakesrc/sink.
++ *
++ * Test1 tests by adding fakesrc/fakesink, setting fakesrc to PLAYING
++ * (which should increment the container state) and then synchronizing
++ * state and see if the bin iterates. This reflects bug #123775.
++ *
++ * Test2 does the same, but emits EOS directly. This will (in case of
++ * race conditions) sometimes lead to a state-change before the previous
++ * one succeeded. This bug is not fixed yet (999998).
++ *
++ * Test3 tests by adding fakesrc, putting thread to PLAYING, adding
++ * fakesink, syncing state and see if it iterates. The group is sometimes
++ * activated before fakesink is added to the bin, which is a bug in opt
++ * and a race in core that is not fixed yet (999999).
++ */
++
++#include <gst/gst.h>
++
++static GstElement *pipeline, *fakesrc, *fakesink;
++
++static gboolean
++cb_timeout (gpointer data)
++{
++ g_assert_not_reached ();
++
++ return FALSE;
++}
++
++static gboolean
++cb_quit (gpointer data)
++{
++ gst_main_quit ();
++
++ g_print ("Quit mainloop\n");
++
++ /* once */
++ return FALSE;
++}
++
++#if TESTNUM != 123775
++static void
++cb_eos (gpointer data)
++{
++ g_print ("Received EOS\n");
++
++ g_idle_add ((GSourceFunc) cb_quit, NULL);
++}
++#else
++static void
++cb_data (gpointer data)
++{
++ static gboolean first = TRUE;
++
++ g_print ("Received data\n");
++
++ if (first) {
++ first = FALSE;
++ g_idle_add ((GSourceFunc) cb_quit, NULL);
++ }
++}
++#endif
++
++static void
++cb_state (GstElement * element, GstState old_state,
++ GstState new_state, gpointer data)
++{
++ g_print ("Changed state from %d to %d\n", old_state, new_state);
++}
++
++static gboolean
++cb_play (gpointer data)
++{
++ GstStateChangeReturn res;
++
++#if TESTNUM != 999999
++ g_print ("Setting state on fakesrc\n");
++ gst_element_set_state (fakesrc, GST_STATE_PLAYING);
++ g_print ("Done\n");
++#else
++ g_print ("Setting state on pipeline w/o fakesink\n");
++ gst_element_set_state (pipeline, GST_STATE_PLAYING);
++ g_print ("Adding fakesink\n");
++ gst_bin_add (GST_BIN (pipeline), fakesink);
++ g_print ("Done\n");
++#endif
++ g_print ("Syncing state in pipeline\n");
++ res = gst_bin_sync_children_state (GST_BIN (data));
++ g_assert (res == GST_STATE_CHANGE_SUCCESS);
++ g_print ("Set to playing correctly: %d\n", GST_STATE (pipeline));
++
++ /* once */
++ return FALSE;
++}
++
++gint
++main (gint argc, gchar * argv[])
++{
++ gint id;
++
++ gst_init (&argc, &argv);
++
++ g_print ("Will do a test to see if bug %d is fixed\n", TESTNUM);
++
++ pipeline = gst_thread_new ("p");
++ g_signal_connect (pipeline, "state-change", G_CALLBACK (cb_state), NULL);
++ fakesrc = gst_element_factory_make ("fakesrc", "src");
++ fakesink = gst_element_factory_make ("fakesink", "sink");
++#if TESTNUM != 123775
++ g_object_set (G_OBJECT (fakesrc), "num-buffers", 0, NULL);
++ g_signal_connect (pipeline, "eos", G_CALLBACK (cb_eos), NULL);
++#else
++ g_object_set (G_OBJECT (fakesink), "signal-handoffs", TRUE, NULL);
++ g_signal_connect (fakesink, "handoff", G_CALLBACK (cb_data), NULL);
++#endif
++
++#if TESTNUM != 999999
++ gst_bin_add_many (GST_BIN (pipeline), fakesrc, fakesink, NULL);
++#else
++ gst_bin_add (GST_BIN (pipeline), fakesrc);
++#endif
++
++ gst_element_link (fakesrc, fakesink);
++ g_idle_add ((GSourceFunc) cb_play, pipeline);
++
++ /* give 5 seconds */
++ id = g_timeout_add (5000, (GSourceFunc) cb_timeout, NULL);
++ g_print ("Enter mainloop\n");
++ gst_main ();
++ g_source_remove (id);
++
++ gst_element_set_state (pipeline, GST_STATE_NULL);
++ gst_object_unref (pipeline);
++
++ g_print ("Done with test to show bug %d, fixed correctly\n", TESTNUM);
++
++ return 0;
++}
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tools/BUGS gstreamer-0.10.23/tools/BUGS
+--- gstreamer-0.10.23.orig/tools/BUGS 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tools/BUGS 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1 @@
++gst-launch should not crash with bad options
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tools/gst-launch.1.in gstreamer-0.10.23/tools/gst-launch.1.in
+--- gstreamer-0.10.23.orig/tools/gst-launch.1.in 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/tools/gst-launch.1.in 2009-06-11 14:19:59.000000000 +0200
+@@ -272,14 +272,19 @@
+ Convert a .WAV file containing raw audio data into an Ogg Vorbis or mp3 file
+
+ .B
+- gst\-launch cdparanoia ! lame ! filesink location=cd.mp3
++ gst\-launch cdparanoiasrc mode=continuous ! audioconvert ! lame ! id3v2mux ! filesink location=cd.mp3
+ .br
+ rips all tracks from compact disc and convert them into a single mp3 file
+
+-Using \fBgst\-inspect\fR(1), it is possible to discover settings for cdparanoia
+-that will tell it to rip individual tracks. Alternatively, you can use an URI
+-and gst-launch will find an element (such as cdparanoia) that supports that
+-protocol for you, e.g.:
++.B
++ gst\-launch cdparanoiasrc track=5 ! audioconvert ! lame ! id3v2mux ! filesink location=track5.mp3
++.br
++rips track 5 from the CD and converts it into a single mp3 file
++
++Using \fBgst\-inspect\fR(1), it is possible to discover settings like the above
++for cdparanoiasrc that will tell it to rip the entire cd or only tracks of it.
++Alternatively, you can use an URI and gst-launch will find an element (such as
++cdparanoia) that supports that protocol for you, e.g.:
+ .B
+ gst\-launch cdda://5 ! lame vbr=new vbr-quality=6 ! filesink location=track5.mp3
+
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tools/gst-launch.c gstreamer-0.10.23/tools/gst-launch.c
+--- gstreamer-0.10.23.orig/tools/gst-launch.c 2009-04-21 21:12:19.000000000 +0200
++++ gstreamer-0.10.23/tools/gst-launch.c 2009-06-11 14:19:59.000000000 +0200
+@@ -406,6 +406,7 @@
+
+ /* check if we need to dump messages to the console */
+ if (messages) {
++ GstObject *src_obj;
+ const GstStructure *s;
+ guint32 seqnum;
+
+@@ -413,10 +414,25 @@
+
+ s = gst_message_get_structure (message);
+
+- g_print (_("Got Message #%" G_GUINT32_FORMAT
+- " from element \"%s\" (%s): "), seqnum,
+- GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message))),
+- gst_message_type_get_name (GST_MESSAGE_TYPE (message)));
++ src_obj = GST_MESSAGE_SRC (message);
++
++ if (GST_IS_ELEMENT (src_obj)) {
++ g_print (_("Got message #%u from element \"%s\" (%s): "),
++ (guint) seqnum, GST_ELEMENT_NAME (src_obj),
++ GST_MESSAGE_TYPE_NAME (message));
++ } else if (GST_IS_PAD (src_obj)) {
++ g_print (_("Got message #%u from pad \"%s:%s\" (%s): "),
++ (guint) seqnum, GST_DEBUG_PAD_NAME (src_obj),
++ GST_MESSAGE_TYPE_NAME (message));
++ } else if (GST_IS_OBJECT (src_obj)) {
++ g_print (_("Got message #%u from object \"%s\" (%s): "),
++ (guint) seqnum, GST_OBJECT_NAME (src_obj),
++ GST_MESSAGE_TYPE_NAME (message));
++ } else {
++ g_print (_("Got message #%u (%s): "), (guint) seqnum,
++ GST_MESSAGE_TYPE_NAME (message));
++ }
++
+ if (s) {
+ gchar *sstr;
+
+@@ -448,19 +464,30 @@
+ gst_element_set_state (pipeline, GST_STATE_PLAYING);
+ #endif
+ break;
+- case GST_MESSAGE_EOS:
++ case GST_MESSAGE_EOS:{
+ waiting_eos = FALSE;
+- g_print (_
+- ("Got EOS from element \"%s\".\n"),
+- GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message))));
++ g_print (_("Got EOS from element \"%s\".\n"),
++ GST_MESSAGE_SRC_NAME (message));
+ goto exit;
++ }
+ case GST_MESSAGE_TAG:
+ if (tags) {
+ GstTagList *tags;
+
++ if (GST_IS_ELEMENT (GST_MESSAGE_SRC (message))) {
++ g_print (_("FOUND TAG : found by element \"%s\".\n"),
++ GST_MESSAGE_SRC_NAME (message));
++ } else if (GST_IS_PAD (GST_MESSAGE_SRC (message))) {
++ g_print (_("FOUND TAG : found by pad \"%s:%s\".\n"),
++ GST_DEBUG_PAD_NAME (GST_MESSAGE_SRC (message)));
++ } else if (GST_IS_OBJECT (GST_MESSAGE_SRC (message))) {
++ g_print (_("FOUND TAG : found by object \"%s\".\n"),
++ GST_MESSAGE_SRC_NAME (message));
++ } else {
++ g_print (_("FOUND TAG\n"));
++ }
++
+ gst_message_parse_tag (message, &tags);
+- g_print (_("FOUND TAG : found by element \"%s\".\n"),
+- GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message))));
+ gst_tag_list_foreach (tags, print_tag, NULL);
+ gst_tag_list_free (tags);
+ }
+@@ -744,7 +771,7 @@
+ if (verbose) {
+ gchar **exclude_list =
+ exclude_args ? g_strsplit (exclude_args, ",", 0) : NULL;
+- g_signal_connect (pipeline, "deep_notify",
++ g_signal_connect (pipeline, "deep-notify",
+ G_CALLBACK (gst_object_default_deep_notify), exclude_list);
+ }
+ #ifndef GST_DISABLE_LOADSAVE
+@@ -850,13 +877,14 @@
+ g_print (_("Execution ended after %" G_GUINT64_FORMAT " ns.\n"), diff);
+ }
+
+- /* iterate mainloop to process pending stuff */
+- while (g_main_context_iteration (NULL, FALSE));
+-
+ PRINT (_("Setting pipeline to PAUSED ...\n"));
+ gst_element_set_state (pipeline, GST_STATE_PAUSED);
+ if (caught_error == ELR_NO_ERROR)
+ gst_element_get_state (pipeline, &state, &pending, GST_CLOCK_TIME_NONE);
++
++ /* iterate mainloop to process pending stuff */
++ while (g_main_context_iteration (NULL, FALSE));
++
+ PRINT (_("Setting pipeline to READY ...\n"));
+ gst_element_set_state (pipeline, GST_STATE_READY);
+ gst_element_get_state (pipeline, &state, &pending, GST_CLOCK_TIME_NONE);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tools/gstreamer-completion gstreamer-0.10.23/tools/gstreamer-completion
+--- gstreamer-0.10.23.orig/tools/gstreamer-completion 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tools/gstreamer-completion 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,27 @@
++#
++# Put this in /etc/bash_completion.d/
++#
++
++_gst_launch()
++{
++ local cur
++
++ : ${GST_REGISTRY:=~/.gstreamer-0.10/registry.xml}
++ : ${GST_COMPLETE:=~/.gstreamer-0.10/complete}
++
++ if [ ! -f "${GST_REGISTRY}" ] ; then
++ return 0
++ fi
++
++ if [ ! -f "${GST_COMPLETE}" \
++ -o "${GST_REGISTRY}" -nt "${GST_COMPLETE}" ] ; then
++ sed -n 's/^..<name>\(.*\)<\/name>/\1/ p' ${GST_REGISTRY} >${GST_COMPLETE}
++ fi
++
++ cur=${COMP_WORDS[COMP_CWORD]}
++ COMPREPLY=( $(grep ^$cur $GST_COMPLETE) )
++
++ return 0
++}
++complete -F _gst_launch -o default gst-launch
++
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/tools/xml2text.xsl gstreamer-0.10.23/tools/xml2text.xsl
+--- gstreamer-0.10.23.orig/tools/xml2text.xsl 1970-01-01 01:00:00.000000000 +0100
++++ gstreamer-0.10.23/tools/xml2text.xsl 2009-06-11 14:19:59.000000000 +0200
+@@ -0,0 +1,456 @@
++<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
++
++ <xsl:output method="text" encoding="us-ascii" omit-xml-declaration="yes" indent="no"/>
++ <xsl:variable name="padding" select="string(' ')"/>
++
++ <xsl:template match="/element">
++ <xsl:apply-templates select="name"/>
++ <xsl:apply-templates select="details"/>
++ <xsl:apply-templates select="object"/>
++ <xsl:apply-templates select="pad-templates"/>
++ <xsl:apply-templates select="element-flags"/>
++ <xsl:apply-templates select="element-implementation"/>
++ <xsl:apply-templates select="clocking-interaction"/>
++ <xsl:apply-templates select="indexing-capabilities"/>
++ <xsl:apply-templates select="pads"/>
++ <xsl:apply-templates select="element-properties"/>
++ <xsl:apply-templates select="dyn-params"/>
++ <xsl:apply-templates select="element-signals"/>
++ <xsl:apply-templates select="element-actions"/>
++ </xsl:template>
++
++ <xsl:template match="name">
++ <xsl:text>Element Name: </xsl:text><xsl:value-of select="."/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="details">
++ <xsl:text>Factory Details: </xsl:text>
++ <xsl:text> Long Name:	</xsl:text> <xsl:value-of select="long-name"/> <xsl:text> </xsl:text>
++ <xsl:text> Class:	</xsl:text> <xsl:value-of select="class"/> <xsl:text> </xsl:text>
++ <xsl:text> License:	</xsl:text> <xsl:value-of select="license"/> <xsl:text> </xsl:text>
++ <xsl:text> Description:	</xsl:text> <xsl:value-of select="description"/> <xsl:text> </xsl:text>
++ <xsl:text> Version:	</xsl:text> <xsl:value-of select="version"/> <xsl:text> </xsl:text>
++ <xsl:text> Author(s):	</xsl:text> <xsl:value-of select="authors"/> <xsl:text> </xsl:text>
++ <xsl:text> Copyright:	</xsl:text> <xsl:value-of select="copyright"/> <xsl:text> </xsl:text>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template name="object">
++ <xsl:param name="i"/>
++ <xsl:param name="j"/>
++ <xsl:if test="count($i/*) > 0">
++ <xsl:call-template name="object">
++ <xsl:with-param name="i" select="$i/object"/>
++ <xsl:with-param name="j" select="$j - 1"/>
++ </xsl:call-template>
++ <xsl:value-of select="substring ($padding, 1, $j * 6)"/>
++ <xsl:text> +----</xsl:text>
++ </xsl:if>
++ <xsl:value-of select="$i/@name"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="object">
++ <xsl:call-template name="object">
++ <xsl:with-param name="i" select="."/>
++ <xsl:with-param name="j" select="count(.//object[(*)])"/>
++ </xsl:call-template>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="pad-templates">
++ <xsl:text>Pad Templates </xsl:text>
++ <xsl:apply-templates select="./pad-template"/>
++ </xsl:template>
++
++ <xsl:template match="pad-template">
++ <xsl:text> </xsl:text>
++ <xsl:value-of select="direction"/>
++ <xsl:text> template: </xsl:text>
++ <xsl:value-of select="name"/>
++ <xsl:text> </xsl:text>
++ <xsl:text> Availability: </xsl:text> <xsl:value-of select="presence"/>
++ <xsl:text> </xsl:text>
++ <xsl:text> Capabilities: </xsl:text> <xsl:apply-templates select="./capscomp"/>
++ </xsl:template>
++
++ <xsl:template match="capscomp">
++ <xsl:apply-templates select="./caps"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="caps">
++ <xsl:text> '</xsl:text>
++ <xsl:value-of select="name"/>
++ <xsl:text>' </xsl:text>
++ <xsl:text> MIME type: </xsl:text>
++ <xsl:value-of select="type"/>
++ <xsl:text>' </xsl:text>
++ <xsl:apply-templates select="./properties"/>
++ </xsl:template>
++
++ <xsl:template match="properties">
++ <xsl:apply-templates select="*"/>
++ </xsl:template>
++
++ <xsl:template match="list">
++ <xsl:text> </xsl:text>
++ <xsl:value-of select="@name"/>
++ <xsl:text>	:List </xsl:text>
++ <xsl:apply-templates select="*" mode="list"/>
++ </xsl:template>
++
++ <!-- propety entries in list mode -->
++ <xsl:template match="string" mode="list">
++ <xsl:text> String: '</xsl:text>
++ <xsl:value-of select="@value"/>
++ <xsl:text>' </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="fourcc" mode="list">
++ <xsl:text> FourCC: '</xsl:text>
++ <xsl:value-of select="@hexvalue"/>
++ <xsl:text>' </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="int" mode="list">
++ <xsl:text> Integer: </xsl:text>
++ <xsl:value-of select="@value"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="range" mode="list">
++ <xsl:text> Integer range: </xsl:text>
++ <xsl:value-of select="concat(@min, ' - ', @max)"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="float" mode="list">
++ <xsl:text> Float: </xsl:text>
++ <xsl:value-of select="@value"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="floatrange" mode="list">
++ <xsl:text> Float range: </xsl:text>
++ <xsl:value-of select="concat(@min, ' - ', @max)"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <!-- propety entries in normal mode -->
++ <xsl:template match="string">
++ <xsl:text> </xsl:text>
++ <xsl:value-of select="substring (concat (@name, $padding), 1, 15)"/>
++ <xsl:text> : String: '</xsl:text>
++ <xsl:value-of select="@value"/>
++ <xsl:text>' </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="fourcc">
++ <xsl:text> </xsl:text>
++ <xsl:value-of select="substring (concat (@name, $padding), 1, 15)"/>
++ <xsl:text> : FourCC: '</xsl:text>
++ <xsl:value-of select="@hexvalue"/>
++ <xsl:text>' </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="int">
++ <xsl:text> </xsl:text>
++ <xsl:value-of select="substring (concat (@name, $padding), 1, 15)"/>
++ <xsl:text> : Integer: </xsl:text>
++ <xsl:value-of select="@value"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="range">
++ <xsl:text> </xsl:text>
++ <xsl:value-of select="substring (concat (@name, $padding), 1, 15)"/>
++ <xsl:text> : Integer range: </xsl:text>
++ <xsl:value-of select="concat(@min, ' - ', @max)"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="float">
++ <xsl:text> </xsl:text>
++ <xsl:value-of select="substring (concat (@name, $padding), 1, 15)"/>
++ <xsl:text> : Float: </xsl:text>
++ <xsl:value-of select="@value"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="floatrange">
++ <xsl:text> </xsl:text>
++ <xsl:value-of select="substring (concat (@name, $padding), 1, 15)"/>
++ <xsl:text> : Float range: </xsl:text>
++ <xsl:value-of select="concat(@min, ' - ', @max)"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="flag">
++ <xsl:text> </xsl:text>
++ <xsl:value-of select="."/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="element-flags">
++ <xsl:text>Element Flags: </xsl:text>
++ <xsl:apply-templates select="./flag"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="state-change">
++ <xsl:text> Has change_state() function: </xsl:text>
++ <xsl:value-of select="@function"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="load">
++ <xsl:text> Has custom restore_thyself() function: </xsl:text>
++ <xsl:value-of select="@function"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="save">
++ <xsl:text> Has custom save_thyself() function: </xsl:text>
++ <xsl:value-of select="@function"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="element-implementation">
++ <xsl:text>Element Implementation: </xsl:text>
++ <xsl:apply-templates select="*"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="requires-clock">
++ <xsl:text> element requires a clock </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="provides-clock">
++ <xsl:text> element provides a clock: </xsl:text>
++ <xsl:value-of select="@name"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="clocking-interaction">
++ <xsl:text>Clocking Interaction: </xsl:text>
++ <xsl:choose>
++ <xsl:when test="count(*) = 0">
++ <xsl:text> none </xsl:text>
++ </xsl:when>
++ <xsl:otherwise>
++ <xsl:apply-templates select="*"/>
++ </xsl:otherwise>
++ </xsl:choose>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="indexing-capabilities">
++ <xsl:text> element can do indexing</xsl:text>
++ </xsl:template>
++
++ <xsl:template match="dyn-params">
++ <xsl:text>Dynamic Parameters: </xsl:text>
++ <xsl:choose>
++ <xsl:when test="count(*) = 0">
++ <xsl:text> none </xsl:text>
++ </xsl:when>
++ <xsl:otherwise>
++ <xsl:apply-templates select="dyn-param"/>
++ </xsl:otherwise>
++ </xsl:choose>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="pads">
++ <xsl:text>Pads: </xsl:text>
++ <xsl:apply-templates select="pad"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="pad">
++ <xsl:text> </xsl:text>
++ <xsl:value-of select="direction"/>
++ <xsl:text>: '</xsl:text>
++ <xsl:value-of select="name"/>
++ <xsl:text>' </xsl:text>
++ <xsl:apply-templates select="implementation"/>
++ <xsl:text> Pad Template: '</xsl:text>
++ <xsl:value-of select="template"/>
++ <xsl:text>' </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="implementation">
++ <xsl:text> Implementation: </xsl:text>
++ <xsl:apply-templates select="*"/>
++ </xsl:template>
++
++ <xsl:template match="chain-based">
++ <xsl:text> Has chainfunc(): </xsl:text>
++ <xsl:value-of select="@function"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="bufferpool-function">
++ <xsl:text> Has bufferpoolfunc(): </xsl:text>
++ <xsl:value-of select="@function"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="format">
++ <xsl:text> (</xsl:text>
++ <xsl:value-of select="@id"/>
++ <xsl:text>)	</xsl:text>
++ <xsl:value-of select="@nick"/>
++ <xsl:text> (</xsl:text>
++ <xsl:value-of select="."/>
++ <xsl:text>) </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="formats-function">
++ <xsl:text> Supports seeking/conversion/query formats: </xsl:text>
++ <xsl:value-of select="@function"/>
++ <xsl:text> </xsl:text>
++ <xsl:apply-templates select="format"/>
++ </xsl:template>
++
++ <xsl:template match="convert-function">
++ <xsl:text> Has custom convertfunc(): </xsl:text>
++ <xsl:value-of select="@function"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="query-function">
++ <xsl:text> Has custom queryfunc(): </xsl:text>
++ <xsl:value-of select="@function"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="event-function">
++ <xsl:text> Has custom eventfunc(): </xsl:text>
++ <xsl:value-of select="@function"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="event">
++ <xsl:text> </xsl:text>
++ <xsl:value-of select="@type"/>
++ <xsl:for-each select="flag">
++ <xsl:text> | </xsl:text>
++ <xsl:value-of select='.'/>
++ </xsl:for-each>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="event-mask-func">
++ <xsl:text> Provides event masks: </xsl:text>
++ <xsl:value-of select="@function"/>
++ <xsl:text> </xsl:text>
++ <xsl:apply-templates select="event"/>
++ </xsl:template>
++
++ <xsl:template match="query-type">
++ <xsl:text> (</xsl:text>
++ <xsl:value-of select="@id"/>
++ <xsl:text>)	</xsl:text>
++ <xsl:value-of select="@nick"/>
++ <xsl:text> (</xsl:text>
++ <xsl:value-of select="."/>
++ <xsl:text>) </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="query-type-func">
++ <xsl:text> Provides query types: </xsl:text>
++ <xsl:value-of select="@function"/>
++ <xsl:text> </xsl:text>
++ <xsl:apply-templates select="query-type"/>
++ </xsl:template>
++
++ <xsl:template match="element-properties">
++ <xsl:text>Element Arguments: </xsl:text>
++ <xsl:apply-templates select="element-property"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="default">
++ <xsl:text>. (Default </xsl:text>
++ <xsl:value-of select="."/>
++ <xsl:text>)</xsl:text>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="range" mode="params">
++ <xsl:value-of select="substring ($padding, 1, 25)"/>
++ <xsl:text>Range : </xsl:text>
++ <xsl:value-of select="concat(@min, ' - ', @max)"/>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="element-property|dyn-param">
++ <xsl:text> </xsl:text>
++ <xsl:value-of select="substring (concat(name, $padding), 1, 20)"/>
++ <xsl:text> : </xsl:text>
++ <xsl:value-of select="blurb"/>
++ <xsl:text> </xsl:text>
++ <xsl:value-of select="substring ($padding, 1, 25)"/>
++ <xsl:value-of select="type"/>
++ <xsl:apply-templates select="default"/>
++ <xsl:apply-templates select="range" mode="params"/>
++ </xsl:template>
++
++ <xsl:template match="params">
++ <xsl:for-each select="type">
++ <xsl:text>, </xsl:text>
++ <xsl:value-of select="substring ($padding, 1, 25)"/>
++ <xsl:value-of select="substring ($padding, 1, 20)"/>
++ <xsl:value-of select="."/>
++ <xsl:text> arg</xsl:text>
++ <xsl:value-of select="position()"/>
++ </xsl:for-each>
++ </xsl:template>
++
++ <xsl:template match="signal">
++ <xsl:value-of select="substring (concat('"', name, '"', $padding), 1, 25)"/>
++ <xsl:value-of select="return-type"/>
++ <xsl:text> user_function </xsl:text>
++ <xsl:value-of select="concat ('(', object-type, '* object')"/>
++ <xsl:apply-templates select="params"/>
++ </xsl:template>
++
++ <xsl:template match="element-signals">
++ <xsl:text>Element Signals: </xsl:text>
++ <xsl:choose>
++ <xsl:when test="count(*) = 0">
++ <xsl:text> none </xsl:text>
++ </xsl:when>
++ <xsl:otherwise>
++ <xsl:for-each select="signal">
++ <xsl:apply-templates select="."/>
++ <xsl:text>, </xsl:text>
++ <xsl:value-of select="substring ($padding, 1, 25)"/>
++ <xsl:value-of select="substring ($padding, 1, 20)"/>
++ <xsl:text>gpointer user_data); </xsl:text>
++ </xsl:for-each>
++ </xsl:otherwise>
++ </xsl:choose>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++ <xsl:template match="element-actions">
++ <xsl:text>Element Actions: </xsl:text>
++ <xsl:choose>
++ <xsl:when test="count(*) = 0">
++ <xsl:text> none </xsl:text>
++ </xsl:when>
++ <xsl:otherwise>
++ <xsl:for-each select="signal">
++ <xsl:apply-templates select="."/>
++ <xsl:text>); </xsl:text>
++ </xsl:for-each>
++ </xsl:otherwise>
++ </xsl:choose>
++ <xsl:text> </xsl:text>
++ </xsl:template>
++
++</xsl:stylesheet>
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/win32/common/config.h gstreamer-0.10.23/win32/common/config.h
+--- gstreamer-0.10.23.orig/win32/common/config.h 2009-05-10 23:15:58.000000000 +0200
++++ gstreamer-0.10.23/win32/common/config.h 2009-06-11 14:19:59.000000000 +0200
+@@ -44,7 +44,7 @@
+ #define GST_MAJORMINOR "0.10"
+
+ /* package name in plugins */
+-#define GST_PACKAGE_NAME "GStreamer source release"
++#define GST_PACKAGE_NAME "GStreamer git/prerelease"
+
+ /* package origin */
+ #define GST_PACKAGE_ORIGIN "Unknown package origin"
+@@ -178,7 +178,7 @@
+ /* defined if the compiler implements __PRETTY_FUNCTION__ */
+ #undef HAVE_PRETTY_FUNCTION
+
+-/* Defined if we have register_printf_function () */
++/* Defined if we have printf specifier extensions available */
+ #undef HAVE_PRINTF_EXTENSION
+
+ /* Define to 1 if you have the <process.h> header file. */
+@@ -190,6 +190,12 @@
+ /* Define if RDTSC is available */
+ #undef HAVE_RDTSC
+
++/* Define to 1 if you have the `register_printf_function' function. */
++#undef HAVE_REGISTER_PRINTF_FUNCTION
++
++/* Define to 1 if you have the `register_printf_specifier' function. */
++#undef HAVE_REGISTER_PRINTF_SPECIFIER
++
+ /* Define to 1 if you have the `sigaction' function. */
+ #undef HAVE_SIGACTION
+
+@@ -277,13 +283,13 @@
+ #define PACKAGE_NAME "GStreamer"
+
+ /* Define to the full name and version of this package. */
+-#define PACKAGE_STRING "GStreamer 0.10.23"
++#define PACKAGE_STRING "GStreamer 0.10.23.1"
+
+ /* Define to the one symbol short name of this package. */
+ #define PACKAGE_TARNAME "gstreamer"
+
+ /* Define to the version of this package. */
+-#define PACKAGE_VERSION "0.10.23"
++#define PACKAGE_VERSION "0.10.23.1"
+
+ /* directory where plugins are located */
+ #ifdef _DEBUG
+@@ -295,14 +301,11 @@
+ /* Define to 1 if you have the ANSI C header files. */
+ #undef STDC_HEADERS
+
+-/* Define if we should use binary registry instead xml registry */
+-#define USE_BINARY_REGISTRY
+-
+ /* Define if we should poison deallocated memory */
+ #undef USE_POISONING
+
+ /* Version number of package */
+-#define VERSION "0.10.23"
++#define VERSION "0.10.23.1"
+
+ /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+@@ -327,9 +330,3 @@
+
+ /* We need at least WinXP SP2 for __stat64 */
+ #undef __MSVCRT_VERSION__
+-
+-/* Define to `__inline__' or `__inline' if that's what the C compiler
+- calls it, or to nothing if 'inline' is not supported under any name. */
+-#ifndef __cplusplus
+-#undef inline
+-#endif
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/win32/common/gstenumtypes.c gstreamer-0.10.23/win32/common/gstenumtypes.c
+--- gstreamer-0.10.23.orig/win32/common/gstenumtypes.c 2009-05-10 23:16:10.000000000 +0200
++++ gstreamer-0.10.23/win32/common/gstenumtypes.c 2009-06-11 14:19:59.000000000 +0200
+@@ -518,6 +518,7 @@
+ {C_ENUM (GST_EVENT_SEEK), "GST_EVENT_SEEK", "seek"},
+ {C_ENUM (GST_EVENT_NAVIGATION), "GST_EVENT_NAVIGATION", "navigation"},
+ {C_ENUM (GST_EVENT_LATENCY), "GST_EVENT_LATENCY", "latency"},
++ {C_ENUM (GST_EVENT_STEP), "GST_EVENT_STEP", "step"},
+ {C_ENUM (GST_EVENT_CUSTOM_UPSTREAM), "GST_EVENT_CUSTOM_UPSTREAM",
+ "custom-upstream"},
+ {C_ENUM (GST_EVENT_CUSTOM_DOWNSTREAM), "GST_EVENT_CUSTOM_DOWNSTREAM",
+@@ -895,6 +896,36 @@
+ return (GType) id;
+ }
+
++GType
++gst_stream_status_type_get_type (void)
++{
++ static gsize id = 0;
++ static const GEnumValue values[] = {
++ {C_ENUM (GST_STREAM_STATUS_TYPE_CREATE), "GST_STREAM_STATUS_TYPE_CREATE",
++ "create"},
++ {C_ENUM (GST_STREAM_STATUS_TYPE_ENTER), "GST_STREAM_STATUS_TYPE_ENTER",
++ "enter"},
++ {C_ENUM (GST_STREAM_STATUS_TYPE_LEAVE), "GST_STREAM_STATUS_TYPE_LEAVE",
++ "leave"},
++ {C_ENUM (GST_STREAM_STATUS_TYPE_DESTROY), "GST_STREAM_STATUS_TYPE_DESTROY",
++ "destroy"},
++ {C_ENUM (GST_STREAM_STATUS_TYPE_START), "GST_STREAM_STATUS_TYPE_START",
++ "start"},
++ {C_ENUM (GST_STREAM_STATUS_TYPE_PAUSE), "GST_STREAM_STATUS_TYPE_PAUSE",
++ "pause"},
++ {C_ENUM (GST_STREAM_STATUS_TYPE_STOP), "GST_STREAM_STATUS_TYPE_STOP",
++ "stop"},
++ {0, NULL, NULL}
++ };
++
++ if (g_once_init_enter (&id)) {
++ GType tmp = g_enum_register_static ("GstStreamStatusType", values);
++ g_once_init_leave (&id, tmp);
++ }
++
++ return (GType) id;
++}
++
+ /* enumerations from "gstminiobject.h" */
+ GType
+ gst_mini_object_flags_get_type (void)
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/win32/common/gstenumtypes.h gstreamer-0.10.23/win32/common/gstenumtypes.h
+--- gstreamer-0.10.23.orig/win32/common/gstenumtypes.h 2009-05-10 23:15:58.000000000 +0200
++++ gstreamer-0.10.23/win32/common/gstenumtypes.h 2009-06-11 14:19:59.000000000 +0200
+@@ -109,6 +109,8 @@
+ #define GST_TYPE_MESSAGE_TYPE (gst_message_type_get_type())
+ GType gst_structure_change_type_get_type (void);
+ #define GST_TYPE_STRUCTURE_CHANGE_TYPE (gst_structure_change_type_get_type())
++GType gst_stream_status_type_get_type (void);
++#define GST_TYPE_STREAM_STATUS_TYPE (gst_stream_status_type_get_type())
+
+ /* enumerations from "gstminiobject.h" */
+ GType gst_mini_object_flags_get_type (void);
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/win32/common/gstversion.h gstreamer-0.10.23/win32/common/gstversion.h
+--- gstreamer-0.10.23.orig/win32/common/gstversion.h 2009-05-10 23:15:58.000000000 +0200
++++ gstreamer-0.10.23/win32/common/gstversion.h 2009-06-11 14:19:59.000000000 +0200
+@@ -64,7 +64,7 @@
+ * 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:
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/win32/common/libgstbase.def gstreamer-0.10.23/win32/common/libgstbase.def
+--- gstreamer-0.10.23.orig/win32/common/libgstbase.def 2009-04-01 13:45:44.000000000 +0200
++++ gstreamer-0.10.23/win32/common/libgstbase.def 2009-06-11 14:19:59.000000000 +0200
+@@ -5,8 +5,10 @@
+ gst_adapter_copy
+ gst_adapter_flush
+ gst_adapter_get_type
++ gst_adapter_masked_scan_uint32
+ gst_adapter_new
+ gst_adapter_peek
++ gst_adapter_prev_timestamp
+ gst_adapter_push
+ gst_adapter_take
+ gst_adapter_take_buffer
+diff -Naur -x '*gitignore*' -x '*.po*' gstreamer-0.10.23.orig/win32/common/libgstreamer.def gstreamer-0.10.23/win32/common/libgstreamer.def
+--- gstreamer-0.10.23.orig/win32/common/libgstreamer.def 2009-04-15 21:18:17.000000000 +0200
++++ gstreamer-0.10.23/win32/common/libgstreamer.def 2009-06-11 14:19:59.000000000 +0200
+@@ -2,6 +2,7 @@
+ GST_CAT_AUTOPLUG DATA
+ GST_CAT_AUTOPLUG_ATTEMPT DATA
+ GST_CAT_BUFFER DATA
++ GST_CAT_BUFFER_LIST DATA
+ GST_CAT_BUS DATA
+ GST_CAT_CALL_TRACE DATA
+ GST_CAT_CAPS DATA
+@@ -32,6 +33,7 @@
+ __gst_debug_enabled DATA
+ __gst_debug_min DATA
+ _gst_alloc_trace_register
++ _gst_buffer_list_initialize
+ _gst_debug_bin_to_dot_file
+ _gst_debug_bin_to_dot_file_with_ts
+ _gst_debug_category_new
+@@ -39,6 +41,7 @@
+ _gst_debug_nameof_funcptr
+ _gst_debug_register_funcptr
+ _gst_element_error_printf
++ _gst_elementclass_factory DATA
+ _gst_plugin_register_static
+ _gst_trace_add_entry
+ _gst_trace_on DATA
+@@ -84,6 +87,22 @@
+ gst_buffer_is_metadata_writable
+ gst_buffer_is_span_fast
+ gst_buffer_join
++ gst_buffer_list_get_type
++ gst_buffer_list_iterate
++ gst_buffer_list_iterator_add
++ gst_buffer_list_iterator_add_group
++ gst_buffer_list_iterator_do
++ gst_buffer_list_iterator_do_data
++ gst_buffer_list_iterator_free
++ gst_buffer_list_iterator_merge_group
++ gst_buffer_list_iterator_n_buffers
++ gst_buffer_list_iterator_next
++ gst_buffer_list_iterator_next_group
++ gst_buffer_list_iterator_remove
++ gst_buffer_list_iterator_steal
++ gst_buffer_list_iterator_take
++ gst_buffer_list_n_groups
++ gst_buffer_list_new
+ gst_buffer_make_metadata_writable
+ gst_buffer_merge
+ gst_buffer_new
+@@ -273,6 +292,7 @@
+ gst_element_get_pad
+ gst_element_get_query_types
+ gst_element_get_request_pad
++ gst_element_get_start_time
+ gst_element_get_state
+ gst_element_get_static_pad
+ gst_element_get_type
+@@ -288,6 +308,7 @@
+ gst_element_link_pads
+ gst_element_link_pads_filtered
+ gst_element_lost_state
++ gst_element_lost_state_full
+ gst_element_make_from_uri
+ gst_element_message_full
+ gst_element_no_more_pads
+@@ -311,6 +332,7 @@
+ gst_element_set_clock
+ gst_element_set_index
+ gst_element_set_locked_state
++ gst_element_set_start_time
+ gst_element_set_state
+ gst_element_state_change_return_get_name
+ gst_element_state_get_name
+@@ -334,6 +356,7 @@
+ gst_event_new_new_segment_full
+ gst_event_new_qos
+ gst_event_new_seek
++ gst_event_new_step
+ gst_event_new_tag
+ gst_event_parse_buffer_size
+ gst_event_parse_latency
+@@ -341,6 +364,7 @@
+ gst_event_parse_new_segment_full
+ gst_event_parse_qos
+ gst_event_parse_seek
++ gst_event_parse_step
+ gst_event_parse_tag
+ gst_event_set_seqnum
+ gst_event_type_flags_get_type
+@@ -446,6 +470,7 @@
+ gst_marshal_VOID__POINTER_OBJECT
+ gst_marshal_VOID__UINT_BOXED
+ gst_message_get_seqnum
++ gst_message_get_stream_status_object
+ gst_message_get_structure
+ gst_message_get_type
+ gst_message_new_application
+@@ -467,8 +492,11 @@
+ gst_message_new_segment_start
+ gst_message_new_state_changed
+ gst_message_new_state_dirty
++ gst_message_new_step_done
++ gst_message_new_stream_status
+ gst_message_new_structure_change
+ gst_message_new_tag
++ gst_message_new_tag_full
+ gst_message_new_warning
+ gst_message_parse_async_start
+ gst_message_parse_buffering
+@@ -483,11 +511,15 @@
+ gst_message_parse_segment_done
+ gst_message_parse_segment_start
+ gst_message_parse_state_changed
++ gst_message_parse_step_done
++ gst_message_parse_stream_status
+ gst_message_parse_structure_change
+ gst_message_parse_tag
++ gst_message_parse_tag_full
+ gst_message_parse_warning
+ gst_message_set_buffering_stats
+ gst_message_set_seqnum
++ gst_message_set_stream_status_object
+ gst_message_type_get_name
+ gst_message_type_get_type
+ gst_message_type_to_quark
+@@ -511,6 +543,7 @@
+ gst_object_get_type
+ gst_object_has_ancestor
+ gst_object_ref
++ gst_object_ref_sink
+ gst_object_replace
+ gst_object_restore_thyself
+ gst_object_save_thyself
+@@ -533,6 +566,7 @@
+ gst_pad_alloc_buffer_and_set_caps
+ gst_pad_can_link
+ gst_pad_chain
++ gst_pad_chain_list
+ gst_pad_check_pull_range
+ gst_pad_direction_get_type
+ gst_pad_dispatcher
+@@ -577,6 +611,7 @@
+ gst_pad_pull_range
+ gst_pad_push
+ gst_pad_push_event
++ gst_pad_push_list
+ gst_pad_query
+ gst_pad_query_convert
+ gst_pad_query_default
+@@ -600,6 +635,7 @@
+ gst_pad_set_bufferalloc_function
+ gst_pad_set_caps
+ gst_pad_set_chain_function
++ gst_pad_set_chain_list_function
+ gst_pad_set_checkgetrange_function
+ gst_pad_set_element_private
+ gst_pad_set_event_function
+@@ -667,6 +703,7 @@
+ gst_plugin_feature_set_rank
+ gst_plugin_feature_type_name_filter
+ gst_plugin_flags_get_type
++ gst_plugin_get_cache_data
+ gst_plugin_get_description
+ gst_plugin_get_filename
+ gst_plugin_get_license
+@@ -684,6 +721,8 @@
+ gst_plugin_load_file
+ gst_plugin_name_filter
+ gst_plugin_register_static
++ gst_plugin_register_static_full
++ gst_plugin_set_cache_data
+ gst_poll_add_fd
+ gst_poll_fd_can_read
+ gst_poll_fd_can_write
+@@ -799,7 +838,9 @@
+ gst_segment_set_last_stop
+ gst_segment_set_newsegment
+ gst_segment_set_newsegment_full
++ gst_segment_set_running_time
+ gst_segment_set_seek
++ gst_segment_to_position
+ gst_segment_to_running_time
+ gst_segment_to_stream_time
+ gst_segtrap_is_enabled
+@@ -814,6 +855,7 @@
+ gst_static_pad_template_get_type
+ gst_stream_error_get_type
+ gst_stream_error_quark
++ gst_stream_status_type_get_type
+ gst_structure_change_type_get_type
+ gst_structure_copy
+ gst_structure_empty_new
+@@ -824,6 +866,7 @@
+ gst_structure_foreach
+ gst_structure_free
+ gst_structure_from_string
++ gst_structure_get
+ gst_structure_get_boolean
+ gst_structure_get_clock_time
+ gst_structure_get_date
+@@ -838,12 +881,16 @@
+ gst_structure_get_string
+ gst_structure_get_type
+ gst_structure_get_uint
++ gst_structure_get_valist
+ gst_structure_get_value
+ gst_structure_has_field
+ gst_structure_has_field_typed
+ gst_structure_has_name
+ gst_structure_id_empty_new
++ gst_structure_id_get
++ gst_structure_id_get_valist
+ gst_structure_id_get_value
++ gst_structure_id_new
+ gst_structure_id_set
+ gst_structure_id_set_valist
+ gst_structure_id_set_value
+@@ -874,6 +921,7 @@
+ gst_tag_list_add
+ gst_tag_list_add_valist
+ gst_tag_list_add_valist_values
++ gst_tag_list_add_value
+ gst_tag_list_add_values
+ gst_tag_list_copy
+ gst_tag_list_copy_value
+@@ -923,6 +971,7 @@
+ gst_tag_register
+ gst_tag_setter_add_tag_valist
+ gst_tag_setter_add_tag_valist_values
++ gst_tag_setter_add_tag_value
+ gst_tag_setter_add_tag_values
+ gst_tag_setter_add_tags
+ gst_tag_setter_get_tag_list
+@@ -933,11 +982,22 @@
+ gst_tag_setter_set_tag_merge_mode
+ gst_task_cleanup_all
+ gst_task_create
++ gst_task_get_pool
+ gst_task_get_state
+ gst_task_get_type
+ gst_task_join
+ gst_task_pause
++ gst_task_pool_cleanup
++ gst_task_pool_get_type
++ gst_task_pool_join
++ gst_task_pool_new
++ gst_task_pool_prepare
++ gst_task_pool_push
+ gst_task_set_lock
++ gst_task_set_pool
++ gst_task_set_priority
++ gst_task_set_state
++ gst_task_set_thread_callbacks
+ gst_task_start
+ gst_task_state_get_type
+ gst_task_stop