
Release notes for GStreamer Good Plugins 1.0.2


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
    
      * Parallel installability with 0.10.x series
      * avidemux: fix handling of paletted and other raw RGB data
      * flacparse: ignore bad headers if we have a valid STREAMINFO header; improve coverart extraction
      * jpegdepay: store quant tables in zigzag order
      * matroskamux: do not use unoffical V_MJPEG codec id; fix subtitle request sink pad name and functionality
      * videofilter: add videomedian element
      * multiudpsink: add "force-ipv4" option and "multicast-iface" property
      * pulsesink: fix caps leak and potential crasher in acceptcaps function
      * pulsesink: start the ringbuffer on GAP events without duration
      * qtdemux: add support for 'generic' samples; allow more streams
      * qtdemux: support more ProRes variants; fix memory leak for MS/RIFF audio
      * qtdemux: with raw audio, set a default channel-mask for multichannel audio
      * rtpbin: set PTS and DTS in jitterbufffer
      * rtpbin: use running-time for NTP time when use-pipeline-clock is set
      * rtpsession: inform source when caps change
      * udpsrc: use negotiated allocator or pool
      * videobox: use out_info for out properties
      * videocrop: port to videofilter
      * videomixer2: Fix race condition where a src setcaps is ignored
      * vp8enc: fix default target-bitrate value; set DECODE_ONLY flag on invisible frames

Bugs fixed in this release
     
      * 654216 : vp8enc: tag invisible frames
      * 682481 : multiudpsink: add force-ipv4 option (problem when streaming RTP to multicast address)
      * 683782 : Segfault in pulsesink.c:2077 gst_pulsesink_pad_acceptcaps()
      * 683842 : Fix race condition in videomixer2 on 0.10
      * 684701 : flacparse: fails to parse flac file with broken header: " Invalid metablock size for STREAMINFO: 8196 " 
      * 685864 : Add multicast-iface property to multiudpsink
      * 686008 : qtdemux: crashes in push mode with gst_qtdemux_guess_bitrate: assertion failed: (size > = qtdemux- > header_size)
      * 686046 : avidemux: can't play 8-bit indexed RGB video
      * 686550 : qtdemux: no streams found for journal.pone.0030940.s002.mov, m1v video fourcc
      * 686642 : udpsrc: trivial typo causes compilation error

==== 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
    
      * Arnaud Vrac
      * Mark Nauwelaerts
      * Michael Smith
      * Oleksij Rempel
      * Rasmus Rohde
      * Sebastian Dröge
      * Sebastian Rasmussen
      * Tim-Philipp Müller
      * Wim Taymans
      * Youness Alaoui
 