
Release notes for GStreamer Good Plugins 1.7.1


The GStreamer team is pleased to announce the first 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.



"Such ingratitude.  After all the times I've saved your life."


A collection of plugins you'd want to have right next to you on the
battlefield.  Shooting sharp and making no mistakes, these plugins have it
all: good looks, good code, and good licensing.  Documented and dressed up
in tests.  If you're looking for a role model to base your own plugin on,
here it is.


If you find a plot hole or a badly lip-synced line of code in them,
let us know - it is a matter of honour for us to ensure Blondie doesn't look
like he's been walking 100 miles through the desert without water.


This module contains a set of plugins that we consider to have good quality
  code, correct functionality, our preferred license (LGPL for the plugin
  code, LGPL or LGPL-compatible for the supporting library).
We believe distributors can safely ship these plugins.
People writing elements should base their code on these elements.


Other modules containing plugins are:


gst-plugins-base
contains a basic set of well-supported plugins
gst-plugins-ugly
contains a set of well-supported plugins, but might pose problems for
    distributors
gst-plugins-bad
contains a set of less supported plugins that haven't passed the
    rigorous quality testing we expect, or are still missing documentation
    and/or unit tests
gst-libav
contains a set of codecs plugins based on libav (formerly gst-ffmpeg)



  

Bugs fixed in this release
     
      * 727305 : matroskademux: complete support for A_OPUS (SeekPreRoll, CodecDelay and DiscardPadding)
      * 729950 : matroskamux: support video/x-vp9. webmmux: support audio/x-opus
      * 734659 : qtdemux: Does not properly update base time for non-flushing seeks
      * 745372 : vpxdec: Should try to avoid copies at output
      * 746747 : rtpsession: Also report internal sources in on-new-ssrc and on-ssrc-active
      * 748680 : directsoundsink: fix sleep for buffer-time lower than 200000
      * 750456 : rtpsession: Implement sending of reduced size RTCP packets
      * 750709 : souphttpsrc: add tls-interaction property
      * 751311 : rtp: Dynamic dropout / reorder limits
      * 752669 : rtpsession: Expose RTPSource stats through stats property
      * 752694 : rtpmux: allow the ssrc-property to decide ssrc on outgoing  buffers
      * 752818 : qtdemux: add support for XML timed-text subtitles
      * 753087 : jpegdec: fix output state memory leak
      * 753484 : qtdemux: support edit lists partially in push-mode
      * 753853 : gstreamer: good: Fix memory leaks when context parse fails.
      * 754435 : flvmux: use time segment and copy timestamps when streamable
      * 754548 : rtpsource: In case of sender, doesn't need to think about probation and rtp gap.
      * 754555 : smpte: Memory leak
      * 754558 : smpte: Use video info data instead of macro
      * 754864 : qtdemux: check multi trex to find track id in mp4 (DASH) stream.
      * 755094 : avidemux: Reverse playback does not consider segment.start
      * 755125 : rtp: RTCP mapping between NTP and RTP time could be capture or send time based
      * 755326 : souphttpclientsink: Fix memory leaks and segfault crash
      * 755478 : flvdemux: output speex vorbiscomment as a GstTagList
      * 755479 : flvdemux: speex is also always 16KHz
      * 755510 : vpx: create base class for vpx encoders and decoders
      * 756219 : gdkpixbufdec: Fix pixbuf_loader leak during failures
      * 756226 : qtdemux: fix memory leak for corrupted file
      * 756231 : mpegaudioparse: Fix buffer memory leak
      * 756234 : audiofx: Remove unused variable
      * 756318 : souphttpclientsink: Add " retry " for request failures
      * 756905 : audiofx: remove unused variable
      * 757340 : audiochebband: Fix typo in example pipeline
      * 757892 : rtph264pay: add config-interval option to send PPS/SPS before every key frame
      * 758058 : v4l2object: add support of NV16, NV61 and NV24 formats
      * 758085 : v4l2: Track /dev/video* to triggered required probe
      * 758161 : qtdemux: Fix string memory leak
      * 758171 : qtdemux: Seeking in dashdemux broken since edit list changes
      * 758195 : vpxdec: Use more threads by default
      * 758258 : matroska: Missing support for prores video
      * 758260 : souphttpclientsink: Fix error leak and handle error
      * 758390 : multifilesink: fix spelling on multi_file_sink_next_type variable
      * 758826 : aacparse: Avoid over-skipping when checking LOAS config
      * 758928 : qtdemux: letting flushes pass downstream on upstream offset seeks
      * 759226 : interleave: Remove unsed field
      * 759452 : directsoundsink: check device property, don't use default if a specific device is set
      * 759614 : dvdec: Remove unused fields
      * 759615 : DTS > PTS creates invalid mp4 files
      * 759635 : progressreport: Add support for using format=buffers with do-query=false
      * 758114 : tests: souphttpsrc test_icy_stream:0: Assertion 'caps != NULL' failed

==== Download ====

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

The git repository and details how to clone it can be found at
http://cgit.freedesktop.org/gstreamer/gst-plugins-good/

==== 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
    
      * Alessandro Decina
      * Anton Bondarenko
      * Arun Raghavan
      * Aurélien Zanelli
      * Chris Bass
      * Dave Craig
      * Edward Hervey
      * Evan Callaway
      * George Kiagiadakis
      * Graham Leggett
      * Guillaume Desmottes
      * Guillaume Marquebielle
      * Havard Graff
      * Hyunjun Ko
      * Jan Schmidt
      * Josep Torra
      * Julien Isorce
      * Luis de Bethencourt
      * Manasa Athreya
      * Michael Olbrich
      * Miguel París Díaz
      * Mischa Spiegelmock
      * Nicola Murino
      * Nicolas Dufresne
      * Nirbheek Chauhan
      * Olivier Crête
      * Philipp Zabel
      * Philippe Normand
      * Prashant Gotarne
      * Ramiro Polla
      * Ravi Kiran K N
      * Reynaldo H. Verdejo Pinochet
      * Ryan Hendrickson
      * Sebastian Dröge
      * Stavros Vagionitis
      * Stian Selnes
      * Thiago Santos
      * Thibault Saunier
      * Thomas Roos
      * Tim-Philipp Müller
      * Vincent Dehors
      * Vineeth T M
      * Vineeth TM
      * William Manley
      * Wim Taymans
      * Xavier Claessens
 