
Release notes for GStreamer 1.3.90


The GStreamer team is pleased to announce the first release candidate of
the stable 1.4 release series. The 1.4 release series is adding new features
on top of the 1.0 and 1.2 series and is part of the API and ABI-stable 1.x
release series of the GStreamer multimedia framework.


This release candidate will hopefully shortly be followed by the stable 1.4.0
release if no bigger regressions or bigger issues are detected, and enough
testing of the release candidate happened. The new API that was added during
the 1.3 release series is not expected to change anymore at this point.


Binaries for Android, iOS, Mac OS X and Windows are provided together with this
release.


The stable 1.4 release series is API and ABI compatible with 1.0.x, 1.2.x and
any other 1.x release series in the future. Compared to 1.2.x it contains some
new features and more intrusive changes that were considered too risky as a
bugfix.



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)



  

Bugs fixed in this release
     
      * 730873 : miniobject: Add missing (nullable) annotations
      * 730957 : Missing nullability annotations
      * 731303 : dataqueue: add bindings-friendly gst_data_queue_new_full()
      * 731350 : Add gst_queue_array_new variant which takes a GDestroyNotify
      * 731542 : base: introspection fixes
      * 732007 : Rename GstGlobalDeviceMonitor

==== 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
    
      * Evan Nemerson
      * George Kiagiadakis
      * Olivier Crête
      * Philip Withnall
      * Sebastian Dröge
      * Thiago Santos
      * Tim-Philipp Müller
 