
Release notes for GStreamer Base 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.


This module contains a set of reference plugins, base classes for other
plugins, and helper libraries. It also includes essential elements such
as audio and video format converters, and higher-level components like playbin,
decodebin, encodebin, and discoverer.

This module is kept up-to-date together with the core developments.  Element
writers should look at the elements in this module as a reference for
their development.

This module contains elements for, among others:

  device plugins: x(v)imagesink, alsa, v4lsrc, cdparanoia
  containers: ogg
  codecs: vorbis, theora
  text: textoverlay, subparse
  sources: audiotestsrc, videotestsrc, giosrc
  network: tcp
  typefind functions
  audio processing: audioconvert, adder, audiorate, audioresample, volume
  visualisation: libvisual
  video processing: videoconvert, videoscale
  high-level components: playbin, uridecodebin, decodebin, encodebin, discoverer
  libraries: app, audio, fft, pbutils, riff, rtp, rtsp, sdp, tag, video


Other modules containing plugins are:


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
     
      * 761514 : riff: remove limits for sample rate and channel count
      * 766419 : videotimecode: Added support for SMPTE time code metadata
      * 767816 : Comparison of constant 64 with expression of type 'GstVideoFormat' is always false in Mac OS X
      * 768495 : POTFILES.in is out of date
      * 768525 : subparse: don't reset allowed tags
      * 768687 : Rework video orientation
      * 768718 : videoscale: fix leak in test
      * 768811 : decodebin3/playbin3: fix leaks
      * 768852 : appsink: add _try_pull_{sample,preroll} with timeout parameter
      * 768990 : audioclock: use GST_STIME_FORMAT for the correct argument
      * 769080 : decodebin3: fix collection refcounting
      * 769270 : decodebin3/playbin3: fix ref handling
      * 769298 : decodebin3: handle full removal of streams
      * 769299 : ogg: check return values in gst_ogg_parse_new_stream
      * 769303 : pbutils: Add more h264 scalable profiles
      * 769624 : videorate: Does not support reverse playback
      * 770053 : parsebin: sometimes sets global tags to stream

==== Download ====

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

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

==== 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
    
      * Arun Raghavan
      * Carlos Rafael Giani
      * Duncan Palmer
      * Edward Hervey
      * Guillaume Desmottes
      * Jan Schmidt
      * Joan Pau Beltran
      * Josep Torra
      * Luis de Bethencourt
      * Matej Knopp
      * Michael Olbrich
      * Nirbheek Chauhan
      * Piotr Drąg
      * Sebastian Dröge
      * Sergio Torres Soldado
      * Seungha Yang
      * Sreerenj Balachandran
      * Stefan Sauer
      * Thibault Saunier
      * Thijs Vermeir
      * Tim-Philipp Müller
      * Vincent Penquerc'h
      * Vivia Nikolaidou
      * Víctor Manuel Jáquez Leal
      * Wim Taymans
      * Xabier Rodriguez Calvar
 