
Release notes for GStreamer Good Plugins 1.1.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.



"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)



  

Features of this release
    

Bugs fixed in this release
     
      * 672227 : qtdemux: need mapping for video/x-gst-fourcc-xdvc
      * 674626 : [rtpsession] High CPU usage in rtcp thread when setting RR bandwidth = 0
      * 696228 : mp4mux: streamable=true seeks on sink at EOS, causing errors with some sinks
      * 699791 : qtdemux: certain videos from Vivotek camera do not play - " This file is corrupt and cannot be played " 
      * 700264 : qtdemux: ignores first editlist
      * 700933 : avidemux: Wrong duration in push mode for some clips.
      * 703560 : [PATCH] rtpbin: new event for informing downstream about synchronization
      * 703901 : audioecho: Output broken if delay value got changed when playing or paused
      * 704007 : qtdemux: skips disabled tracks
      * 704053 : souphttpsrc: Don't treat errors on HEAD request as fatal
      * 704193 : avidemux: no PTS nor DTS on decoded frame
      * 704241 : souphttpsrc: Ignore all HEAD errors
      * 704255 : qtdemux: invalid base time on newsegment in push mode after a seek
      * 704272 : qtdemux: invalid seek offset used because of chapters
      * 704292 : qtdemux: does not know WRAW fourcc
      * 704294 : qtdemux: videos in Windows WRLE format don't work
      * 704357 : regression: videocrop unit test fail after adding GRAY16_BE format
      * 704547 : vpx: fix compilation when decoder or encoder package is not build
      * 704548 : qtdemux: set proper caps for mpeg-1 audio
      * 704921 : matroskademux: memory leak in check_subtitle_buffer
      * 704951 : avidemux: memory leak
      * 704996 : qtdemux: support for H264 fourcc

==== 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
    
      * Alessandro Decina
      * Andoni Morales Alastruey
      * Arnaud Vrac
      * Carlos Rafael Giani
      * Douglas Bagnall
      * Edward Hervey
      * Kyosuke Nekomura
      * Matej Knopp
      * Mathieu Duponchelle
      * Nicolas Dufresne
      * Olivier Crête
      * Sebastian Dröge
      * Thiago Santos
      * Tim-Philipp Müller
      * Vincent Penquerc'h
      * Wim Taymans
 