This is GStreamer 1.4.0

Changes since 1.2:

New API:
 • GstMessageType has GST_MESSAGE_EXTENDED added. All types before
   that can be used together as a flags type as before, but from
   that message onwards the types are just counted incrementally.
   This was necessary to be able to add more message types.
   In 2.0 GstMessageType will just become an enum and not a flags
   type anymore.
 • GstDeviceMonitor for device probing, e.g. to list all available
   audio or video capture devices. This is the replacement for
   GstPropertyProbe from 0.10.
 • Events accumulate the running-time offset now when travelling
   through pads, as set by the gst_pad_set_offset() function. This
   allows to compensate for this in the QOS event for example.
 • GstBuffer has a new flag "tag-memory" that is set automatically
   when memory is added or removed to a buffer. This allows buffer
   pools to detect if they can recycle a buffer or need to reset
   it first.
 • GstToc has new API to mark GstTocEntries as loops.
 • A not-authorized resource error has been defined to notify
   applications that accessing the resource has failed because
   of missing authorization and to distinguish this case from others.
   This change is actually already in 1.2.4.
 • GstPad has a new flag "accept-intersect", that will let the default
   ACCEPT_CAPS query handler do an intersection instead of subset check.
   This is interesting for parser elements that can handle incomplete
   caps.
 • GstCollectPads has support for flushing and a default handler for
   SEEK events now.
 • New GstFlowAggregator helper object that simplifies handling of
   flow returns in elements with multiple source pads. Additionally
   GstPad now always stores the last flow return and provides an
   API to retrieve it.
 • GstSegment has new API to offset the running time by a specific
   value and this is used in GstPad to allow positive and negative
   offsets in gst_pad_set_offset() in all situations.
 • Support for h265/HEVC and VP8 has been added to the codec utils and codec
   parsers library, and was integrated into various elements.
 • API for adjusting the TLS validation of RTSP connection has been added.
 • The RTSP and SDP library has MIKEY (RFC 3830) support now, and
   there is API to distinguish between the different RTSP profiles.
 • API to access RTP time information and statistics.
 • Support for auxiliary streams was added to rtpbin.
 • Support for tiled, raw video formats has been added.
 • GstVideoDecoder and GstAudioDecoder have API to help aggregating tag
   events and merge custom tags into them consistently.
 • GstBufferPool has support for flushing now.
 • playbin/playsink has support for application provided audio and video
   filters.
 • GstDiscoverer has new and simplified API to get details about missing
   plugins and information to pass to the plugin installer.
 • The GL library was merged from gst-plugins-gl to gst-plugins-bad,
   providing a generic infrastructure for handling GL inside GStreamer
   pipelines and a plugin with some elements using these, especially
   a video sink. Supported platforms currently are Android, Cocoa (OS X),
   DispManX (Raspberry Pi), EAGL (iOS), WGL (Windows) and generic X11,
   Wayland and EGL platforms.
   This replaces eglglessink and also is supposed to replace osxvideosink.
 • New GstAggregator base class in gst-plugins-bad. This is supposed to
   replace GstCollectPads in the future and fix long-known shortcomings
   in its API. Together with the base class some elements are provided
   already, like a videomixer (compositor).


Major changes:
 • New plugins and elements:
   ∘ v4l2videodec element for accessing hardware codecs on
     platforms that make them accessible via V4L2, e.g.
     Samsung Exynos. This comes together with major refactoring
     of the existing V4L2 elements and the corresponding
     infrastructure.
     The v4l2videodec element replaces the mfcdec element.
   ∘ New downloadbuffer element that replaces the download
     buffering feature of queue2. Compared to queue2's code
     it is much simpler and only for this single use case.
     A noteworthy new feature is that it's downloading gaps
     in the already downloaded stream parts when nothing else
     is to be downloaded.
     This is now used by playbin when download buffering is
     enabled.
   ∘ rtpstreampay and rtpstreamdepay elements for transmitting
     RTP packets over a stream API (e.g. TCP) according to
     RFC 4571.
   ∘ rtprtx elements for standard compliant implementation of
     retransmissions, integrated into the rtpmanager plugin.
   ∘ audiomixer element that mixes multiple audio streams together
     into a single one while keeping synchronization. This is
     planned to become the replacement of the adder element.
   ∘ OpenNI2 plugin for 3D cameras like the Kinect camera.
   ∘ OpenEXR plugin for decoding high-dynamic-range EXR images.
   ∘ curlsshsink and curlsftpsink to write files via SSH/SFTP.
   ∘ videosignal, ivfparse and sndfile plugins ported from 0.10.
   ∘ avfvideosrc, vtdec and other elements were ported from 0.10 and
     are available on OS X and iOS now.

 • Other changes:
   ∘ gst-libav now uses libav 10.2, and gained support for H265/HEVC.
   ∘ Support for hardware codecs and special memory types has been
     improved with bugfixes and feature additions in various plugins
     and base classes.
   ∘ Various bugfixes and improvements to buffering in queue2 and
     multiqueue elements.
   ∘ dvbsrc supports more delivery mechanisms and other features
     now, including DVB S2 and T2 support.
   ∘ The MPEGTS library has support for many more descriptors.
   ∘ Major improvements to tsdemux and tsparse, especially time and
     seeking related.
   ∘ souphttpsrc now has support for keep-alive connections,
     compression, configurable number of retries and configuration
     for SSL certificate validation.
   ∘ hlsdemux has undergone major refactoring and works more
     reliable now and supports more HLS features like trick modes.
     Also fragments are pushed downstream while they're downloaded
     now instead of waiting for each fragment to finish.
   ∘ dashdemux and mssdemux are now also pushing fragments downstream
     while they're downloaded instead of waiting for each fragment to
     finish.
   ∘ videoflip can automatically flip based on the orientation tag.
   ∘ openjpeg supports the OpenJPEG2 API.
   ∘ waylandsink was refactored and should be more useful now. It also
     includes a small library which most likely is going to be removed
     in the future and will result in extensions to the GstVideoOverlay
     interface.
   ∘ gst-rtsp-server supports SRTP and MIKEY now.
   ∘ gst-libav encoders are now negotiating any profile/level settings
     with downstream via caps.
   ∘ Lots of fixes for coverity warnings all over the place.
   ∘ Negotiation related performance improvements.
   ∘ 800+ fixed bug reports, and many other bug fixes and other
     improvements everywhere that had no bug report.

Things to look out for:
 • The eglglessink element was removed and replaced by the glimagesink
   element.
 • The mfcdec element was removed and replaced by v4l2videodec.
 • osxvideosink is only available in OS X 10.6 or newer.
 • On Android the namespace of the automatically generated Java class
   for initialization of GStreamer has changed from com.gstreamer to
   org.freedesktop.gstreamer to prevent namespace pollution.
 • On iOS you have to update your gst_ios_init.h and gst_ios_init.m in
   your projects from the one included in the binaries if you used the
   GnuTLS GIO module before. The loading mechanism has slightly changed.
