
Release notes for GStreamer Bad Plugins 1.10.3

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


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


See /releases/1.10/ 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
     
      * 740101 : amcaudiodec error: 'first buffer should have OMX_BUFFERFLAG_CODECCONFIG set'
      * 775072 : memory leak in usage of gst_pad_get_current_caps() API
      * 775292 : dtls: Set openssl's threadid the 1.0.x way
      * 775970 : glimagesink: hang? on windows
      * 776072 : gleffects: found performance downgrade in gstreamer 1.10.0 compared with 1.8.1
      * 776244 : tsdemux: Taglist leak
      * 776461 : dash: Include debug of gstisoff on dashdemux category
      * 776591 : gst-plugins-bad-1.10.2 tarball missing some sys/androidmedia sources
      * 776722 : gl/egl: don't pass a GError to gst_gl_context_egl_choose_config when trying gles2
      * 776726 : autoconvert: reconfigure event leak
      * 777143 : tests/examples/gtk/glliveshader.c fails to build on systems without GL_GEOMETRY_SHADER
      * 777144 : gst-libs/gst/gl/gstglslstage.c: uses #ifdef GL_* constants instead of defining them
      * 777400 : dvdspu: fix crash when display_rect.bottom isn't even
      * 777503 : mxfdemux: use after free in gst_mini_object_unref / gst_tag_list_unref / gst_mxf_demux_update_essence_tracks
      * 777533 : tsdemux: memory leak in create_pad_for_stream / gst_static_pad_template_get
      * 777742 : avfvideosrc SEGFAULT when using GLMemory
      * 777930 : motioncells: fix mingw build

==== 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
    
      * Arun Raghavan
      * Daniel Shahaf
      * Edward Hervey
      * Fabrice Bellet
      * Garima Gaur
      * Graham Leggett
      * Haihua Hu
      * Jan Schmidt
      * Juan Pablo Ugarte
      * Matthew Waters
      * Nicola Murino
      * Reynaldo H. Verdejo Pinochet
      * Scott D Phillips
      * Sebastian Dröge
      * Seungha Yang
      * Tim-Philipp Müller
      * Ursula Maplehurst
 