
Release notes for GStreamer Good Plugins 1.9.2

The GStreamer team is pleased to announce the second release of the unstable
1.9 release series, which marks the feature freeze for 1.10. The 1.9 release
series is adding new features on top of the 1.0, 1.2, 1.4, 1.6 and 1.8 series
and is part of the API and ABI-stable 1.x release series of the GStreamer
multimedia framework. The unstable 1.9 release series will lead to the stable
1.10 release series in the next weeks. Any newly added API can still change
until that point.


Binaries for Android, iOS, Mac OS X and Windows will be provided in the next days.


"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
     
      * 753760 : rtph265: sync against latest spec
      * 763038 : souphttpsrc: add http error code to element error messages
      * 767900 : multipartmux is not clearing dts timestamp.
      * 767950 : qtmux: Add support for writing timecode track
      * 768440 : flvdemux: Create per-stream tag lists
      * 768653 : rtph265pay: does not accept array_completeness=1 in codec_data
      * 768739 : tests: fix bus leaks in -good tests
      * 768787 : AG_GST_PKG_CONFIG_PATH is not called before using GST_PKG_CONFIG_PATH
      * 769117 : Regression building master
      * 769390 : wavparse: Add bitrate and container format tags
      * 769664 : splitmuxsink: Add option to split at exactly max-size-time
      * 770285 : rtpbin: fix typo in max-misorder-time property name
      * 770292 : rtpbin: introduce max-streams property
      * 770394 : rtph265pay does not set RTP marker bit
      * 770526 : osxvideo: fatal error: 'QuickTime/QuickTime.h' file not found (macOS Sierra)

==== Download ====

You can find source releases of gst-plugins-good in the download
directory: https://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 https://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
    
      * Carlos Rafael Giani
      * Edward Hervey
      * Guillaume Desmottes
      * Havard Graff
      * Jan Alexander Steffens (heftig)
      * Jan Schmidt
      * Jie Jiang
      * Jonas Holmberg
      * Josep Torra
      * Luis de Bethencourt
      * Mats Lindestam
      * Mikhail Fludkov
      * Nicolas Dufresne
      * Nirbheek Chauhan
      * Olivier Crête
      * Reynaldo H. Verdejo Pinochet
      * Sebastian Dröge
      * Stefan Sauer
      * Stian Selnes
      * Thiago Santos
      * Thibault Saunier
      * Thomas Bluemel
      * Thomas Scheuermann
      * Tim-Philipp Müller
      * Ting-Wei Lan
      * Vincent Penquerc'h
      * Vivia Nikolaidou
      * Xabier Rodriguez Calvar
 