
Release notes for GStreamer Bad Plugins 1.6.1


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



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



See http://gstreamer.freedesktop.org/releases/1.6/
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
     
      * 756207 : videoaggregator: Setting aspect ratio crops the frame
      * 756567 : Wayland crash when called from gstreamer
      * 752132 : hls/m3u8: Update current position in all cases
      * 752230 : mpdparser: Parse xlink attributes from Period, AdaptationSet and SegmentList
      * 754523 : mssdemux: fragment download errors during live playback
      * 755108 : mssdemux: playback always starts at lowest bitrate
      * 755132 : mpdparser: If no Initialization is present in the SegmentBase, assume it is before the indexRange
      * 755134 : dashdemux: Properly handle relative and non-HTTP URIs for the headers/indices
      * 755239 : dvdspu: render PGS subtitles with the correct color
      * 755623 : audiomixer: Using absolute clock times results in 0..now buffers to be rendered at once, stalling the pipeline
      * 755680 : DVD navigation not working?
      * 755738 : GtkGst : gst_object_unref on GtkDrawingArea events if current media have no audio
      * 755754 : videoaggregator doesn't compile with in openembedded dora (glib 2.36.4)
      * 755759 : assrender: leaks gap events and sample in tags
      * 755824 : dashdemux: Correctly assign earliest pts instead of overriding it with first offset
      * 755840 : audiointerleave: make check fails with segmentation fault.
      * 755850 : unbreak GL introspection build
      * 755852 : missing sys/applemedia headers in gst-plugins-bad 1.6.0 tarball
      * 755892 : dtls needs openssl > = 1.0.1
      * 755969 : gtkglsink: Assertion in gst-inspect-1.0
      * 755981 : dtls: fix printf format on win32
      * 756001 : rtmpsrc: plug memory-leaks
      * 756065 : audioaggregator: fix build error
      * 756070 : id3tag: fix sample memory leak
      * 756181 : hlssink: inconsistent segment duration since 1.5.2 onwards
      * 756186 : dashdemux: cannot advance to next period
      * 756383 : dashdemux: Incomplete configure check for libgstnet
      * 756563 : pnmdec: causes multifilesrc to return internal data flow error (caused by a gst_pad_push() error)
      * 756578 : amcvideodec: Implement support for COLOR_QCOM_FormatYVU420SemiPlanar32mMultiView for decoding
      * 756592 : dtls: fixed name conflict with openssl on win32
      * 756617 : dshowvideosink: move/resize events are not handled in 64 bit
      * 756653 : srtpdec: buffer validations may fail if SRTP packets have padding flag set
      * 756861 : hlsdemux: crash / memory leak on broken (master) playlist
      * 756876 : srtp: Fix critical warning trying to retrieve SSRC from a non fb message
      * 757251 : ivfparse: recognize the vp9 bitstream

==== 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
    
      * Aleix Conchillo Flaqué
      * André Draszik
      * Antoine Jacoutot
      * Arnaud Vrac
      * Edward Hervey
      * Florin Apostol
      * George Kiagiadakis
      * Havard Graff
      * Jan Schmidt
      * John Chang
      * Julien Isorce
      * Matthew Waters
      * Miguel París Díaz
      * Nirbheek Chauhan
      * Paul Arzelier
      * Philippe Normand
      * Polochon_street
      * Reynaldo H. Verdejo Pinochet
      * Santiago Carot-Nemesio
      * Sebastian Dröge
      * Sreerenj Balachandran
      * Tim-Philipp Müller
      * Vineeth TM
      * plamot
 