
Release notes for GStreamer Bad Plugins 1.8.1

The GStreamer team is proud to announce the first bugfix release in the stable
1.8 release series of your favourite cross-platform multimedia framework!


This release only contains bugfixes and it is safe to update from 1.8.0. For a
full list of bugfixes see Bugzilla.


See /releases/1.8/ for the full release notes.



"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
     
      * 760473 : OpenCV face detection does not work with OpenCV newer than 2.4.11
      * 747633 : decklinkvideosrc: crash in ::VideoInputFrameArrived() callback with video_frame=NULL
      * 762924 : interlace: negotiation fails unexpectedly
      * 763324 : nvenc fails to compile with Nvidia video SDK 6.0
      * 763403 : bad: video sink: Post un-handled keyboard/mouse events as message to application
      * 763862 : mxfmux: Instead of releasing request pads on stop(), clear them only
      * 764148 : gtkglsink doesn't fail to create on incompatible hardware
      * 764339 : ahcsrc: g_object_class_install_property: assertion 'pspec- > flags & G_PARAM_WRITABLE' during initialization
      * 764363 : videoaggregator: Does not take into account the best output format that is computed
      * 764404 : hlsdemux: Assertion with AES encrypted stream
      * 764448 : h264parse: constrained-baseline is a subset of baseline
      * 764523 : -lole32 is missing for libgstdirectsoundsrc
      * 764545 : Crash when trying to use vulkan sink
      * 765005 : mpegtsmux: memory leak caused by pad_data- > language
      * 765194 : caopengllayersink: renders blurry content on HiDPI screens because contentsScale is ignored
      * 765241 : glimagesink: need to clean window_id when state change form READY to NULL
      * 765079 : srtpdec request-key is not signaled if roc is missing

==== Download ====

You can find source releases of gst-plugins-bad in the download
directory: https://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 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
    
      * Aleix Conchillo Flaqué
      * Damian Ziobro
      * Haihua Hu
      * Heinrich Fink
      * Jan Schmidt
      * Kouhei Sutou
      * Matthew Waters
      * Nirbheek Chauhan
      * Patricia Muscalu
      * Sebastian Dröge
      * Thiago Santos
      * Tim-Philipp Müller
      * Vincent Penquerc'h
      * Vineeth TM
 