
Release notes for GStreamer 1.0.3


The GStreamer team is proud to announce a new bug-fix release
in the 1.x stable series of the
core of the GStreamer streaming media framework.


The 1.x series is a stable series targeted at end users.
It is not API or ABI compatible with the stable 0.10.x series.
It is, however, parallel installable with the 0.10.x series and
will not affect an existing 0.10.x installation.


The 1.x series has been reworked for more flexible memory handling, improved
caps negotiation and re-negotiation, better handling of dynamic pipelines,
and increased performance in general. It also features countless other feature
additions and enhancements.


This module, gstreamer, only contains core functionality.
For actual media playback, you will need other modules.

gst-plugins-base
contains a basic set of well-supported plugins
gst-plugins-good
contains a set of well-supported plugins under our preferred license
gst-plugins-ugly
contains a set of well-supported plugins, but might pose problems for
    distributors
gst-plugins-bad
contains a set of less supported plugins that haven't passed the
    rigorous quality testing we expect, or are still missing documentation
    and/or unit tests
gst-libav
contains a set of codecs plugins based on libav (formerly gst-ffmpeg)



  

Features of this release
    
      * bufferpool: fix deadlock
      * baseparse: forward stream-start event in push mode, fixing issues with streamsynchronizer
      * basesink: reset START_TIME when needed, fixing position reporting after seeking beyond end

Bugs fixed in this release
     
      * 666053 : baseparse: prevent excessively high memory usage with large streams
      * 687896 : bufferpool: deadlock in GstBufferPool
      * 688477 : inputselector: fix clock leak in wait_running_time
      * 688511 : Windows compilers without pthreads still have testrtpool.c being built in tests
      * 688655 : baseparse: stream-start events not sent in push mode
      * 685870 : Regression with position when seeking beyond the media duration

==== Download ====

You can find source releases of gstreamer in the download
directory: http://gstreamer.freedesktop.org/src/gstreamer/

The git repository and details how to clone it can be found at
http://cgit.freedesktop.org/gstreamer/gstreamer/

==== Homepage ====

The project's website is http://gstreamer.freedesktop.org/

==== Support and Bugs ====

We use GNOME's bugzilla for bug reports and feature requests:
http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer

Please submit patches via bugzilla as well.

For help and support, please subscribe to and send questions to the
gstreamer-devel mailing list (see below for details).

There is also a #gstreamer IRC channel on the Freenode IRC network.

==== Developers ====

GStreamer is stored in Git, hosted at git.freedesktop.org, and can be cloned
from there (see link above).

Interested developers of the core library, plugins, and applications should
subscribe to the gstreamer-devel list.

        
Contributors to this release
    
      * Arnaud Vrac
      * Jan Schmidt
      * Matthew Waters
      * Tim-Philipp Müller
      * Vincent Penquerc'h
      * Wim Taymans
 
