This is GStreamer Base Plugins 1.2.0

Changes since 1.0:

New API:
 • GstContext negotiation / sharing / announcing for sharing a
   generic context between elements, e.g. a display handle
 • GL texture upload conversion meta for allowing different
   buffer types to be converted to an OpenGL texture
 • GstCapsFeatures as extension to GstCaps for allowing the
   negotiation of specific memory or meta requirements between
   elements
 • GstMemory flags for contiguous and non-mappable memory
 • The stream-start event has optional flags now, e.g. for signalling
   sparse streams
 • The stream-start even has an optional group-id field now to signal
   all streams that should be played together
 • Allocators library in gst-plugins-base, currently only with generic
   dmabuf memory support
 • insertbin library for easier handling of dynamically linked
   pipelines (in -bad for now)
 • EGL helper library (in -bad for now)
 • MPEG-TS data structure library (in -bad for now)
 • New GstVideoRegionOfInterestMeta to describe a region of interest on
   video frames.
 • GstVideoDecoder/Encoder has new ::flush() vfunc to replace the
   ill-defined ::reset() vfunc.
 • The URI query allows to query the redirected URI now.

Major changes:
 • New tool: gst-play-1.0 in gst-plugins-base for basic playback
   testing on the command line.
 • New plugins:
   ∘ mssdemux for Microsoft Smooth Streaming
   ∘ dashdemux for DASH adaptive streaming protocol
   ∘ bluez for interaction with Bluetooth devices
   ∘ openjpeg for JPEG2000 decoding and encoding
   ∘ daala for experimental Daala decoding and encoding
   ∘ vpx plugin has experimental VP9 decoding and encoding support
   ∘ webp plugin for WebP decoding (encoding to be added later)
   ∘ Various others: yadif, srtp, sbc, fluidsynth, midiparse,
     mfc, ivtv, accuraterip and audiofxbad

 • Moved plugins:
   ∘ dtmf, vp8rtp, scaletempo and rtpmux plugins are in
     gst-plugins-good now

 • Video:
   ∘ Fix handling of interlaced video in converters such as videoscale
     and videoconvert (e.g. scale both fields independently)
   ∘ videoconvert will try harder to minimise quality losses when
     conversion is necessary
   ∘ The experimental GstSurfaceConverter, GstSurfaceMeta and
     GstVideoContext APIs from the (confusingly-named) 
     libgstbasevideo-1.0 library in gst-plugins-bad have now been
     removed and been replaced by new APIs in GStreamer Core and
     gst-plugins-base (see above). Since that was all that was left in
     this library, the entire experimental libgstbasevideo-1.0 library
     has been removed from gst-plugins-bad
   ∘ Chroma subsampling and chroma siting conversion is better handled
     in videoconvert and the support for interlaced video was improved.
   ∘ New pinwheel and spoke patterns in videotestsrc
   ∘ videomixer can now accept different video formats on its sinkpads
     and converts to a common format during mixing

 • Audio:
   ∘ audioconvert will try harder to minimise quality losses when
     conversion is necessary
   ∘ adder now allows muting/unmuting of its input streams, and also
     per-input stream volume 
   ∘ pulseaudio elements can switch between devices during playback now
   ∘ aacparse can convert between ADTS←→RAW

 • Platform specific changes:
   ∘ Caps, events, etc. are now printed in the GStreamer debug logs
     with their content instead of just the pointer address even on
     non-glibc platforms (e.g. Windows, OSX, Android).
   ∘ Network elements (UDP/TCP) now work better with platforms,
     where IPv6 sockets can't handle IPv4 (e.g. Windows)
   ∘ Linux/BSD: v4l2 had many improvements and cleanups

 • Other changes:
   ∘ gst-libav now uses libav 9
   ∘ Static linking of plugins is supported now (also in 1.0.7)
   ∘ rtspsrc: add support for NetClientClock: when the server suggests a
     GstNetTimeProvider in the SDP, set up a GstNetClientClock that
     slaves to the remote clock and suggest this clock in provide_clock.
     Simplifies synchronized playback of a resource from an RTSP server.
     gst-rtsp-server now supports adding this to the SDP and can provide
     a network clock
   ∘ RTP retransmission / NACK support and big RTP jitterbuffer improvements
   ∘ SRTP and DTLS support
   ∘ Changes to many elements and core to use the correct sticky event
     order and also not lose any important sticky events during flushing
   ∘ >1000 fixed bug reports, and many other bug fixes and other
     improvements everywhere that had no bug report

Things to look out for:
 • Single header includes for all libraries, e.g. #include
   <gst/video/video.h> - this was needed for some bindings.
 • Stricter (correct) caps subset checking in some cases where this was
   not correct before. Caps will now always fail to be a compatible
   subset of another set of caps if the subset caps are missing some
   fields that the superset caps have. This might lead to not-negotiated
   errors if caps are incomplete now. However, it also prevents possible
   data corruption caused by piping data formatted in an
   incompatible/unexpected way into some elements. Check your h264 caps
   for stream-format and alignment fields and AAC caps for the
   stream-format field. This change will also be included in the next
   stable 1.0.8 release.
 • Stricter checking for missing events and correct sticky event order
   (stream-start, caps, segment) in some places; this is not enabled in
   stable releases by default, but you may get warnings when using git
   builds, development releases or when compiling with
   -UG_DISABLE_ASSERT in CFLAGS
 • x264enc now outputs data in byte-stream by default if downstream has
   ANY caps (e.g. appsink without caps set, filesink, udpsink,
   tcpserversink etc.)
 • The MPEG TS demuxer posts messages contain the PMT, PAT, etc. in a
   different format now. This new format uses the data structures from
   the new MPEGTS library
 • The GstContext API has changed between 1.1.4 and 1.1.90

