
Release notes for GStreamer Good Plugins 1.4.4

The GStreamer team is pleased to announce a bugfix release of the stable
1.4 release series. The 1.4 release series is adding new features on top
of the 1.2 series and is part of the API and ABI-stable 1.x release
series of the GStreamer multimedia framework that contains new features.
The 1.4.x bugfix releases only contain important bugfixes compared to 1.4.0.


Binaries for Android, iOS, Mac OS X and Windows are provided by the
GStreamer project for this release.


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


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



"Such ingratitude.  After all the times I've saved your life."


A collection of plugins you'd want to have right next to you on the
battlefield.  Shooting sharp and making no mistakes, these plugins have it
all: good looks, good code, and good licensing.  Documented and dressed up
in tests.  If you're looking for a role model to base your own plugin on,
here it is.


If you find a plot hole or a badly lip-synced line of code in them,
let us know - it is a matter of honour for us to ensure Blondie doesn't look
like he's been walking 100 miles through the desert without water.


This module contains a set of plugins that we consider to have good quality
  code, correct functionality, our preferred license (LGPL for the plugin
  code, LGPL or LGPL-compatible for the supporting library).
We believe distributors can safely ship these plugins.
People writing elements should base their code on these elements.


Other modules containing plugins are:


gst-plugins-base
contains a basic set of well-supported plugins
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
     
      * 726329 : vp8enc: Add support for caps renegotiation
      * 736071 : audiobasesink: Don't hold object lock while calling into other objects like the clock
      * 737735 : wavenc writes broken file if caps are set
      * 737739 : souphttpclientsink: Restarting after error results in buffers being queued forever
      * 737761 : aacparse: memory leak when converting to adts
      * 737771 : souphttpclientsink: Stream header buffer lifetime assumptions are incorrect
      * 737886 : equalizer: crash when changing equalizer settings during playback
      * 738102 : v4l2bufferpool: cleanly handle streamon failure for output device
      * 738152 : v4l2sink: leak with output device
      * 738297 : DTMF telephone-event timestamps are bogus
      * 738722 : rtpmux returns EMPTY caps when query'ing
      * 738793 : speex: encoder/decoder segfault when resetting multiple times
      * 739430 : rtspsrc: mikey related memory leaks

==== Download ====

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

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

==== 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
    
      * Aleix Conchillo Flaqué
      * Ananda
      * Arun Raghavan
      * Aurélien Zanelli
      * David Sansome
      * Jose Antonio Santos Cadenas
      * Matej Knopp
      * Nicolas Dufresne
      * Nirbheek Chauhan
      * Olivier Crête
      * Sebastian Dröge
      * Sjoerd Simons
      * Tim-Philipp Müller
      * Vineeth T M
      * Wim Taymans
 