
Release notes for GStreamer Bad Plugins 1.7.2

The GStreamer team is pleased to announce the second release of the unstable
1.7 release series. The 1.7 release series is adding new features on top of
the 1.0, 1.2, 1.4 and 1.6 series and is part of the API and ABI-stable 1.x release
series of the GStreamer multimedia framework. The unstable 1.7 release series
will lead to the stable 1.8 release series in the next weeks. Any newly added
API can still change until that point.


Binaries for Android, iOS, Mac OS X and Windows will be provided separately
during the unstable 1.7 release series.


"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
     
      * 719849 : [PLUGIN-MOVE] move mpg123 to -ugly
      * 729485 : avfvideosrc: Cannot reconfigure caps
      * 733959 : hlsdemux: download bitrate algorithms don't reflect real download rate
      * 737786 : android: Upstream one of the android video source implementations
      * 744367 : mpegtsmux: add HEVC support
      * 748507 : mpegtsmux: set non-0 payload length in PES header if video ES packet is small enough
      * 752374 : dashdemux: gst_dash_demux_get_live_seek_range should not return negative values
      * 752688 : wayland: improve check for wayland-scanner
      * 756207 : videoaggregator: Setting aspect ratio crops the frame
      * 756252 : Resurrect NetSim
      * 757597 : codecparsers: Add VP9 parser
      * 757602 : adaptivedemux: improved error message if availabilityStartTime is missing for a live stream
      * 757655 : dashdemux: cannot get segment availability start time if segment duration is not present
      * 757951 : adaptivedemux: set src element to ready before flushing the input pad
      * 758516 : mpegtsbase: Add condition to check for non working negative rate
      * 759158 : dashdemux/mssdemux: add support for snapping seek flags
      * 759679 : gl: unused function '_get_plane_width'
      * 759743 : dashdemux: getting clock compensation using HTTP HEAD uses an incorrect year
      * 759860 : glupload: Attaches composition overlay when not supported
      * 759869 : glimagesink: navigation messages are not posted on the bus
      * 759902 : glshader: fix usage documentation
      * 759913 : glbufferpool: Fix build error
      * 760090 : gst-plugins-bad: implicit declaration of function ‘gst_init’
      * 760120 : dashdemux: memory leak in gst_dash_demux_update_manifest_data
      * 760242 : rtmpsink: should get streamheaders from caps instead of first buffer.
      * 760270 : videoparse: add support of padded video
      * 760328 : adaptivedemux: tests: clean tests
      * 760559 : glvideomixer ! glimagesink deadlocks on resize
      * 760594 : decklinkvideosrc: does not support capture in RGB mode
      * 760600 : tests: memory leak in test HTTP source
      * 760696 : gl: Regression with caps ref-couting
      * 760873 : GstGLVideoMixerPad vertex_buffer leaks when pad dynamic removed
      * 760936 : dash, mpdparser: Fix the bug when getting the URL of index segment by SegmentBase
      * 760972 : glwindow: Fix android build
      * 760982 : adaptivedemux: memory leak of stream- > internal_pad
      * 761014 : h264parse: sends unnecessary caps events/queries for every (unchanging) SPS/PPS when converting to byte-stream (android mediacodec)
      * 761108 : uvch264_src: Fix caps memory leak
      * 761109 : acmenc/acmmp3dec: remove unnecessary break after return
      * 761230 : tinyalsa: Add a new sink plugin using tinyalsa
      * 761458 : adaptivedemux: Unused GstSegment variable in download loop
      * 761460 : player: Makefile does not use configured PKG_CONFIG_PATH when performing introspection scan
      * 761519 : gl: Activate " qos " in filters
      * 761538 : gst_gl_insert_debug_marker called with no current context
      * 761578 : GstGLContext  didn't get unref correctly
      * 761606 : Move H.265 RTP payloader/depayloader from -bad to -good
      * 761704 : POTFILES.skip is out of date
      * 762013 : curlhttpsink: Problem in curlhttpsink when qtmux uses faststart, don't send empty buffers
      * 762171 : soundtouch plugin is not shipped
      * 758158 : opusdec: in-band FEC has no effect

==== 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
    
      * Alessandro Decina
      * Alex Ashley
      * Arun Raghavan
      * Aurélien Zanelli
      * Bob Holcomb
      * David Fernandez
      * David Waring
      * Florent Thiéry
      * Florin Apostol
      * George Kiagiadakis
      * Haihua Hu
      * Holger Kaelberer
      * Hyunjun Ko
      * Ilya Konstantinov
      * Jan Schmidt
      * John Chang
      * Julien Isorce
      * Julien MOUTTE
      * Julien Moutte
      * Justin Kim
      * Luis de Bethencourt
      * Matt Crane
      * Matthew Waters
      * Nicolas Dufresne
      * Philippe Normand
      * Piotr Drąg
      * Reynaldo H. Verdejo Pinochet
      * Sebastian Dröge
      * Sergey Borovkov
      * Sreerenj Balachandran
      * Stian Selnes
      * Thiago Santos
      * Thibault Saunier
      * Tim Sheridan
      * Tim-Philipp Müller
      * Vincent Penquerc'h
      * Vineeth TM
      * Wang Xin-yu (王昕宇)
      * Youness Alaoui
 