
Release notes for GStreamer Bad Plugins 1.3.91


The GStreamer team is pleased to announce the second release candidate of
the stable 1.4 release series. The 1.4 release series is adding new features
on top of the 1.0 and 1.2 series and is part of the API and ABI-stable 1.x
release series of the GStreamer multimedia framework.


This release candidate will hopefully shortly be followed by the stable 1.4.0
release if no bigger regressions or bigger issues are detected, and enough
testing of the release candidate happened. The new API that was added during
the 1.3 release series is not expected to change anymore at this point.


Binaries for Android, iOS, Mac OS X and Windows are provided together with this
release.


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



"That an accusation?"


No perfectly groomed moustache or any amount of fine clothing is going to
cover up the truth - these plugins are Bad with a capital B.
They look fine on the outside, and might even appear to get the job done, but
at the end of the day they're a black sheep. Without a golden-haired angel
to watch over them, they'll probably land in an unmarked grave at the final
showdown.


Don't bug us about their quality - exercise your Free Software rights,
patch up the offender and send us the patch on the fastest steed you can
steal from the Confederates. Because you see, in this world, there's two
kinds of people, my friend: those with loaded guns and those who dig.
You dig.


This module contains a set of plugins that aren't up to par compared to the
rest.  They might be close to being good quality, but they're missing something
- be it a good code review, some documentation, a set of tests, a real live
maintainer, or some actual wide use.  If the blanks are filled in they might be
upgraded to become part of either gst-plugins-good or gst-plugins-ugly,
depending on the other factors.
If the plugins break, you can't complain - instead, you can fix the
problem and send us a patch, or bribe someone into fixing them for you.
New contributors can start here for things to work on.


Other modules containing plugins are:


gst-plugins-base
contains a basic set of well-supported plugins
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-libav
contains a set of codecs plugins based on libav (formerly gst-ffmpeg)



  

Bugs fixed in this release
     
      * 711847 : vtenc: huge memory leaks
      * 712809 : d3dvideosink: Shows corrupted output on NVIDIA GPUs due to wrong stride
      * 723670 : applemedia: Fails to build on OSX < 10.8
      * 728435 : vtdec: fails to decode randomly
      * 730914 : mpegts lib : Ensure all functions/fields are introspectable and are not leaked
      * 732154 : h264parse: fix and optimize NAL collection function
      * 732203 : h264parse: improve handling of byte-stream/au format
      * 732207 : bad/gst-libs: Cleanup libraries before 1.4 release
      * 732335 : rtmpsrc: Report limited bandwidth
      * 732390 : glimagesink: Only shows green on iOS
      * 732445 : aggregator: Many invalid memory access to destroyed GSources in the unit test
      * 732529 : fix qglwtextureshare demo
      * 732535 : openni2src: Various fixes
      * 732553 : codecparsers: h264: fix identification of EOSEQ and EOS NALs
      * 732554 : watchdog: sometimes expire even when stopped and causes crash
      * 732661 : gl-cocoa: crash when aborting too early
      * 732715 : aiff,mimdec: Print invalid fourcc in error message in hex
      * 732741 : camerabin2: Fails reconfiguring the source
      * 732744 : configure: fix uninitialized variables with --disable-external
      * 732750 : videoaggregator: broken locking in setcaps function
      * 732756 : faceblur: Render black when input is GLMemory
      * 732789 : mpegts: don't confuse slice allocator with regular allocator
      * 732977 : tests/dccp: Unref parent after use
      * 732986 : mpegts: Add support for CAT section and CA descriptor
      * 733013 : opus: Fix a double-unref in the Opus header code

==== Download ====

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

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

==== 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
      * Arun Raghavan
      * Edward Hervey
      * Gwenole Beauchesne
      * Göran Jönsson
      * Jan Alexander Steffens (heftig)
      * Jan Schmidt
      * Julien Isorce
      * Matthew Waters
      * Matthieu Bouron
      * Nicolas Dufresne
      * Philip Withnall
      * Sebastian Dröge
      * Sebastian Rasmussen
      * Stefan Ringel
      * Thiago Santos
      * Thibault Saunier
      * Tim-Philipp Müller
      * Vincent Penquerc'h
      * Wang Xin-yu (王昕宇)
 