
Release notes for GStreamer Ugly Plug-ins 0.11.92 "Hey You"
        

The GStreamer team is proud to announce a new release
in the 0.11.x unstable series of the
GStreamer Ugly Plug-ins.



The 0.11.x series is an unstable series targeted at developers and will
eventually lead up to the stable 1.0 series.
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.



"When you have to shoot, shoot.  Don't talk."


There are times when the world needs a color between black and white.
Quality code to match the good's, but two-timing, backstabbing and ready to
sell your freedom down the river.  These plug-ins might have a patent noose
around their neck, or a lock-up license, or any other problem that makes you
think twice about shipping them.


We don't call them ugly because we like them less.  Does a mother love her
son less because he's not as pretty as the other ones ? No  - she commends
him on his great personality.  These plug-ins are the life of the party.
And we'll still step in and set them straight if you report any unacceptable
behaviour - because there are two kinds of people in the world, my friend:
those with a rope around their neck and the people who do the cutting.


This module contains a set of plug-ins that have good quality and correct
functionality, but distributing them might pose problems.  The license
on either the plug-ins or the supporting libraries might not be how we'd
like. The code might be widely known to present patent problems.
Distributors should check if they want/can ship these plug-ins.


Other modules containing plug-ins are:


gst-plugins-base
contains a basic set of well-supported plug-ins
gst-plugins-good
contains a set of well-supported plug-ins under our preferred license
gst-plugins-bad
contains a set of less supported plug-ins that haven't passed the
    rigorous quality testing we expect



  

Features of this release
    
      * Parallel installability with 0.10.x series
      * API cleanup and minor API improvements
      * Lots of bugfixes, cleanup and other improvements
There were no bugs fixed in this release
    

Download

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

GStreamer Homepage

More details can be found on the project's website:
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

Developers

GStreamer is stored in Git, hosted at git.freedesktop.org, and can be cloned from there.
Interested developers of the core library, plug-ins, and applications should
subscribe to the gstreamer-devel list. If there is sufficient interest we
will create more lists as necessary.

        
Applications
  
Contributors to this release
    
      * Edward Hervey
      * Julien Isorce
      * Mark Nauwelaerts
      * Matej Knopp
      * Sebastian Dröge
      * Tim-Philipp Müller
      * Wim Taymans
      * Руслан Ижбулатов
 