This is GStreamer 0.11.91 "I will give you five magic beans!"

New features in 0.11.91:

      * API cleanup and minor improvements
      * More hiding of structs that don't need to be public
      * Addition of SNAP flag for seek events

New features in 0.11.90:

      * Lots of bugfixes, cleanup and other improvements
      * Improvements to the buffer and memory managment API
      * A new GstTOC interface, e.g. for handling chapters
      * The GstChildProxy interface works with any GObject now

New features in 0.11.3:

      * Various bug fixes and improvements
      * Input-selector defaults to sync-streams=true
      * Queue don't just start the thread on linking
      * Add user_data and notify to gst_memory_new_wrapped()
      * Rework caps function for performance
      * Improve basetransform allocator handling
      * Implement metadata transforms
      * Metadata registration improvements
      * Use generic marshallers everywhere
      * Push Sticky events in more cases
      * Register queries like events
      * Add DRAIN serialized query
      * Add 0-padding and prefix to GstMemory
      * Rework the ALLOCATION query
      * Allow setting the allocator in a bufferpool
      * Improve pull/get_range

New features in 0.11.2:

      * Parallel installability with 0.10.x series
      * Added pts/dts to buffers
      * Moved controller into core
      * Pad probe rewrite
      * AcceptCaps and GetCaps made as queries
      * Added parent to pad functions
      * Sticky events rewrite
      * New GstSample object
      * Asynchronous state change support for basesrc
      * Added new bitmask type
      * GstMemory updates
      * Port to gio
      * Port to newest glib
      * Add stepped ranges
      * Do typefind in separate thread
      * Rework alloc tracing
      * Added STREAM_CONFIG, GAP and STREAM_START events
      * Various cleanups and leak fixes
