i# GStreamer 1.12 Release Notes

GStreamer 1.12.0 was originally released on 4th May 2017.
The latest bug-fix release in the 1.12 series is [1.12.2](#1.12.2) and was
released on 14 July 2017.

The GStreamer team is proud to announce a new major feature release in the
stable 1.x API series of your favourite cross-platform multimedia framework!

As always, this release is again packed with new features, bug fixes and other
improvements.

See [https://gstreamer.freedesktop.org/releases/1.12/][latest] for the latest
version of this document.

*Last updated: Friday 14 July 2017, 10:00 UTC [(log)][gitlog]*

[latest]: https://gstreamer.freedesktop.org/releases/1.12/
[gitlog]: https://cgit.freedesktop.org/gstreamer/www/log/src/htdocs/releases/1.12/release-notes-1.12.md

## Introduction

The GStreamer team is proud to announce a new major feature release in the
stable 1.x API series of your favourite cross-platform multimedia framework!

As always, this release is again packed with new features, bug fixes and other
improvements.

## Highlights

- new `msdk` plugin for Intel's Media SDK for hardware-accelerated video
  encoding and decoding on Intel graphics hardware on Windows or Linux.

- `x264enc` can now use multiple x264 library versions compiled for different
  bit depths at runtime, to transparently provide support for multiple bit
  depths.

- `videoscale` and `videoconvert` now support multi-threaded scaling and
  conversion, which is particularly useful with higher resolution video.

- `h264parse` will now automatically insert AU delimiters if needed when
  outputting byte-stream format, which improves standard compliance and
  is needed in particular for HLS playback on iOS/macOS.

- `rtpbin` has acquired bundle support for incoming streams

## Major new features and changes

### Noteworthy new API

- The video library gained support for a number of new video formats:

  - `GBR_12LE`, `GBR_12BE`, `GBRA_12LE`, `GBRA_12BE` (planar 4:4:4 RGB/RGBA, 12 bits per channel)
  - `GBRA_10LE`, `GBRA_10BE` (planar 4:4:4:4 RGBA, 10 bits per channel)
  - `GBRA` (planar 4:4:4:4 ARGB, 8 bits per channel)
  - `I420_12BE`, `I420_12LE` (planar 4:2:0 YUV, 12 bits per channel)
  - `I422_12BE`,`I422_12LE` (planar 4:2:2 YUV, 12 bits per channel)
  - `Y444_12BE`, `Y444_12LE` (planar 4:4:4 YUV, 12 bits per channel)
  - `VYUY` (another packed 4:2:2 YUV format)

- The high-level `GstPlayer` API was extended with functions for taking video
  snapshots and enabling accurate seeking. It can optionally also use the
  still-experimental `playbin3` element now.

### New Elements

- msdk: new plugin for Intel's Media SDK for hardware-accelerated video encoding
  and decoding on Intel graphics hardware on Windows or Linux. This includes
  an H.264 encoder/decoder (`msdkh264dec`, `msdkh264enc`),
  an H.265 encoder/decoder (`msdkh265dec`, `msdkh265enc`),
  an MJPEG encoder/encoder (`msdkmjpegdec`, `msdkmjpegenc`),
  an MPEG-2 video encoder (`msdkmpeg2enc`) and a VP8 encoder (`msdkvp8enc`).

- `iqa` is a new Image Quality Assessment plugin based on [DSSIM][dssim],
  similar to the old (unported) videomeasure element.

- The `faceoverlay` element, which allows you to overlay SVG graphics over
  a detected face in a video stream, has been ported from 0.10.

- our `ffmpeg` wrapper plugin now exposes/maps the ffmpeg Opus audio decoder
  (`avdec_opus`) as well as the GoPro CineForm HD / CFHD decoder (`avdec_cfhd`),
  and also a parser/writer for the IVF format (`avdemux_ivf` and `avmux_ivf`).

- `audiobuffersplit` is a new element that splits raw audio buffers into
  equal-sized buffers

- `audiomixmatrix` is a new element that mixes N:M audio channels according to
  a configured mix matrix.

- The `timecodewait` element got renamed to `avwait` and can operate in
  different modes now.

- The `opencv` video processing plugin has gained a new `dewarp` element that
  dewarps fisheye images.

- `ttml` is a new plugin for parsing and rendering subtitles in Timed Text
  Markup Language (TTML) format. For the time being these elements will not
  be autoplugged during media playback however, unless the `GST_TTML_AUTOPLUG=1`
  environment variable is set. Only the EBU-TT-D profile is supported at this
  point.

[dssim]: https://github.com/pornel/dssim

### New element features and additions

- `x264enc` can now use multiple x264 library versions compiled for different
  bit depths at runtime, to transparently provide support for multiple bit
  depths. A new configure parameter `--with-x264-libraries` has been added to
  specify additional paths to look for additional x264 libraries to load.
  Background is that the libx264 library is always compile for one specific
  bit depth and the `x264enc` element would simply support the depth supported
  by the underlying library. Now we can support multiple depths.

- `x264enc` also picks up the interlacing mode automatically from the input
  caps now and passed interlacing/TFF information correctly to the library.

- `videoscale` and `videoconvert` now support multi-threaded scaling and
  conversion, which is particularly useful with higher resolution video.
  This has to be enabled explicitly via the `"n-threads"` property.

- `videorate`'s new `"rate"` property lets you set a speed factor
  on the output stream

- `splitmuxsink`'s buffer collection and scheduling was rewritten to make
  processing and splitting deterministic; before it was possible for a buffer
  to end up in a different file chunk in different runs. `splitmuxsink` also
  gained a new `"format-location-full"` signal that works just like the existing
  `"format-location"` signal only that it is also passed the primary stream's
  first buffer as argument, so that it is possible to construct the file name
  based on metadata such as the buffer timestamp or any GstMeta attached to
  the buffer. The new `"max-size-timecode"` property allows for timecode-based
  splitting. `splitmuxsink` will now also automatically start a new file if the
  input caps change in an incompatible way.

- `fakesink` has a new `"drop-out-of-segment"` property to not drop
  out-of-segment buffers, which is useful for debugging purposes.

- `identity` gained a `"ts-offset"` property.

- both `fakesink` and `identity` now also print what kind of metas are attached
  to buffers when printing buffer details via the `"last-message"` property
  used by `gst-launch-1.0 -v`.

- multiqueue: made `"min-interleave-time"` a configurable property.

- video nerds will be thrilled to know that `videotestsrc`'s snow is now
  deterministic. `videotestsrc` also gained some new properties to make the
  ball pattern based on system time, and invert colours each second
  (`"animation-mode"`, `"motion"`, and `"flip"` properties).

- `oggdemux` reverse playback should work again now. You're welcome.

- `playbin3` and `urisourcebin` now have buffering enabled by default, and
  buffering message aggregation was fixed.

- `tcpclientsrc` now has a `"timeout"` property

- `appsink` has gained support for buffer lists. For backwards compatibility
  reasons users need to enable this explicitly with `gst_app_sink_set_buffer_list_support()`,
  however. Once activated, a pulled `GstSample` can contain either a buffer
  list or a single buffer.

- `splitmuxsrc` reverse playback was fixed and handling of sparse streams, such
  as subtitle tracks or metadata tracks, was improved.

- `matroskamux` has acquired support for muxing G722 audio; it also marks all
  buffers as keyframes now when streaming only audio, so that `tcpserversink`
  will behave properly with audio-only streams.

- `qtmux` gained support for ProRes 4444 XQ, HEVC/H.265 and CineForm (GoPro) formats,
  and generally writes more video stream-related metadata into the track headers.
  It is also allows configuration of the maximum interleave size in bytes and
  time now. For fragmented mp4 we always write the `tfdt` atom now as required
  by the DASH spec.

- `qtdemux` supports FLAC, xvid, mp2, S16L and CineForm (GoPro) tracks now, and
  generally tries harder to extract more video-related information from track
  headers, such as colorimetry or interlacing details. It also received a
  couple of fixes for the scenario where upstream operates in TIME format and
  feeds chunks to qtdemux (e.g. DASH or MSE).

- `audioecho` has two new properties to apply a delay only to certain channels
  to create a surround effect, rather than an echo on all channels. This is
  useful when upmixing from stereo, for example. The `"surround-delay"` property
  enables this, and the `"surround-mask"` property controls which channels
  are considered surround sound channels in this case.

- `webrtcdsp` gained various new properties for gain control and also exposes
  voice activity detection now, in which case it will post `"voice-activity"`
  messages on the bus whenever the voice detection status changes.

- The `decklink` capture elements for Blackmagic Decklink cards have seen a
  number of improvements:

  - `decklinkvideosrc` will post a warning message on "no signal" and an info
    message when the signal lock has been (re)acquired. There is also a new
    read-only `"signal"` property that can be used to query the signal lock
    status. The `GAP` flag will be set on buffers that are captured without
    a signal lock. The new `drop-no-signal-frames` will make `decklinkvideosrc`
    drop all buffers that have been captured without an input signal. The
    `"skip-first-time"` property will make the source drop the first few
    buffers, which is handy since some devices will at first output buffers
    with the wrong resolution before they manage to figure out the right input
    format and decide on the actual output caps.

  - `decklinkaudiosrc` supports more than just 2 audio channels now.

  - The capture sources no longer use the "hardware" timestamps which turn
    out to be useless and instead just use the pipeline clock directly.

- `srtpdec` now also has a readonly `"stats"` property, just like `srtpenc`.

- `rtpbin` gained RTP bundle support, as used by e.g. WebRTC. The first
   rtpsession will have a `rtpssrcdemux` element inside splitting the streams
   based on their SSRC and potentially dispatch to a different rtpsession.
   Because retransmission SSRCs need to be merged with the corresponding media
   stream the `::on-bundled-ssrc` signal is emitted on `rtpbin` so that the
   application can find out to which session the SSRC belongs.

- `rtprtxqueue` gained two new properties exposing retransmission
  statistics (`"requests"` and `"fulfilled-requests"`)

- `kmssink` will now use the preferred mode for the monitor and render to the
  base plane if nothing else has set a mode yet. This can also be done forcibly
  in any case via the new `"force-modesetting"` property. Furthermore, `kmssink`
  now allows only the supported connector resolutions as input caps in order to
  avoid scaling or positioning of the input stream, as `kmssink` can't know
  whether scaling or positioning would be more appropriate for the use case at
  hand.

- `waylandsink` can now take DMAbuf buffers as input in the presence
  of a compatible Wayland compositor. This enables zero-copy transfer
  from a decoder or source that outputs DMAbuf. It will also set surface
  opacity hint to allow better rendering optimization in the compositor.

- `udpsrc` can be bound to more than one interface when joining a
  multicast group, this is done by giving a comma separate list of
  interfaces such as multicast-iface="eth0,eth1".

### Plugin moves

- `dataurisrc` moved from gst-plugins-bad to core

- The `rawparse` plugin containing the `rawaudioparse` and `rawvideoparse`
  elements moved from gst-plugins-bad to gst-plugins-base. These elements
  supersede the old `videoparse` and `audioparse` elements. They work the
  same, with just some minor API changes. The old legacy elements still
  exist in gst-plugins-bad, but may be removed at some point in the future.

- `timecodestamper` is an element that attaches time codes to video buffers
  in form of `GstVideoTimeCodeMeta`s. It had a `"clock-source"` property
  which has now been removed because it was fairly useless in practice. It
  gained some new properties however: the `"first-timecode"` property can
  be used to set the inital timecode; alternatively `"first-timecode-to-now"`
  can be set, and then the current system time at the time the first buffer
  arrives is used as base time for the time codes.


### Plugin removals

- The `mad` mp1/mp2/mp3 decoder plugin was removed from gst-plugins-ugly,
  as libmad is GPL licensed, has been unmaintained for a very long time, and
  there are better alternatives available. Use the `mpg123audiodec` element
  from the `mpg123` plugin in gst-plugins-ugly instead, or `avdec_mp3` from
  the `gst-libav` module which wraps the ffmpeg library. We expect that we
  will be able to move mp3 decoding to gst-plugins-good in the next cycle
  seeing that most patents around mp3 have expired recently or are about to
  expire.

- The `mimic` plugin was removed from gst-plugins-bad. It contained a decoder
  and encoder for a video codec used by MSN messenger many many years ago (in
  a galaxy far far away). The underlying library is unmaintained and no one
  really needs to use this codec any more. Recorded videos can still be played
  back with the MIMIC decoder in gst-libav.

## Miscellaneous API additions

- Request pad name templates passed to `gst_element_request_pad()` may now
  contain multiple specifiers, such as e.g. `src_%u_%u`.

- [`gst_buffer_iterate_meta_filtered()`][buffer-iterate-meta-filtered] is a
  variant of `gst_buffer_iterate_meta()` that only returns metas of the
  requested type and skips all other metas.

- [`gst_pad_task_get_state()`][pad-task-get-state] gets the current state of
  a task in a thread-safe way.

- [`gst_uri_get_media_fragment_table()`][uri-get-fragment-table] provides the
  media fragments of an URI as a table of key=value pairs.

- [`gst_print()`][print], [`gst_println()`][println], [`gst_printerr()`][printerr],
  and [`gst_printerrln()`][printerrln] can be used to print to stdout or stderr.
  These functions are similar to `g_print()` and `g_printerr()` but they also
  support all the additional format specifiers provided by the GStreamer
  logging system, such as e.g. `GST_PTR_FORMAT`.

- a `GstParamSpecArray` has been added, for elements who want to have array
  type properties, such as the `audiomixmatrix` element for example. There are
  also two new functions to set and get properties of this type from bindings:
   - gst_util_set_object_array()
   - gst_util_get_object_array()

- various helper functions have been added to make it easier to set or get
  GstStructure fields containing caps-style array or list fields from language
  bindings (which usually support GValueArray but don't know about the GStreamer
  specific fundamental types):
   - [`gst_structure_get_array()`][get-array]
   - [`gst_structure_set_array()`][set-array]
   - [`gst_structure_get_list()`][get-list]
   - [`gst_structure_set_list()`][set-list]

- a new ['dynamic type' registry factory type][dynamic-type] was added to
  register dynamically loadable GType types. This is useful for automatically
  loading enum/flags types that are used in caps, such as for example the
  `GstVideoMultiviewFlagsSet` type used in multiview video caps.

- there is a new [`GstProxyControlBinding`][proxy-control-binding] for use
  with GstController. This allows proxying the control interface from one
  property on one GstObject to another property (of the same type) in another
  GstObject. So e.g. in parent-child relationship, one may need to call
  `gst_object_sync_values()` on the child and have a binding (set elsewhere)
  on the parent update the value. This is used in `glvideomixer` and `glsinkbin`
  for example, where `sync_values()` on the child pad or element will call
  `sync_values()` on the exposed bin pad or element.

  Note that this doesn't solve GObject property forwarding, that must
  be taken care of by the implementation manually or using GBinding.

- `gst_base_parse_drain()` has been made public for subclasses to use.

- `gst_base_sink_set_drop_out_of_segment()' can be used by subclasses to
  prevent GstBaseSink from dropping buffers that fall outside of the segment.

- [`gst_calculate_linear_regression()`][calc-lin-regression] is a new utility
  function to calculate a linear regression.

- [`gst_debug_get_stack_trace`][get-stack-trace] is an easy way to retrieve a
  stack trace, which can be useful in tracer plugins.

- allocators: the dmabuf allocator is now sub-classable, and there is a new
  `GST_CAPS_FEATURE_MEMORY_DMABUF` define.

- video decoder subclasses can use the newly-added function
  `gst_video_decoder_allocate_output_frame_with_params()` to
  pass a `GstBufferPoolAcquireParams` to the buffer pool for
  each buffer allocation.

- the video time code API has gained a dedicated [`GstVideoTimeCodeInterval`][timecode-interval]
  type plus related API, including functions to add intervals to timecodes.

- There is a new `libgstbadallocators-1.0` library in gst-plugins-bad, which
  may go away again in future releases once the `GstPhysMemoryAllocator`
  interface API has been validated by more users and was moved to
  `libgstallocators-1.0` from gst-plugins-base.

[timecode-interval]: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#gst-video-time-code-interval-new
[buffer-iterate-meta-filtered]: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html#gst-buffer-iterate-meta-filtered
[pad-task-get-state]: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#gst-pad-task-get-state
[uri-get-fragment-table]: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstUri.html#gst-uri-get-media-fragment-table
[print]: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstInfo.html#gst-print
[println]: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstInfo.html#gst-println
[printerr]: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstInfo.html#gst-printerr
[printerrln]: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstInfo.html#gst-printerrln
[get-array]: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstStructure.html#gst-structure-get-array
[set-array]: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstStructure.html#gst-structure-set-array
[get-list]: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstStructure.html#gst-structure-get-list
[set-list]: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstStructure.html#gst-structure-set-list
[dynamic-type]: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstDynamicTypeFactory.html
[proxy-control-binding]: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/gstreamer-libs-GstProxyControlBinding.html
[calc-lin-regression]: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstUtils.html#gst-calculate-linear-regression
[get-stack-trace]: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstUtils.html#gst-debug-get-stack-trace

### GstPlayer

New API has been added to:

 - get the number of audio/video/subtitle streams:
   - `gst_player_media_info_get_number_of_streams()`
   - `gst_player_media_info_get_number_of_video_streams()`
   - `gst_player_media_info_get_number_of_audio_streams()`
   - `gst_player_media_info_get_number_of_subtitle_streams()`

 - enable accurate seeking: `gst_player_config_set_seek_accurate()`
   and `gst_player_config_get_seek_accurate()`

 - get a snapshot image of the video in RGBx, BGRx, JPEG, PNG or
   native format: [`gst_player_get_video_snapshot()`][snapshot]

 - selecting use of a specific video sink element
   ([`gst_player_video_overlay_video_renderer_new_with_sink()`][renderer-with-vsink])

 - If the environment variable `GST_PLAYER_USE_PLAYBIN3` is set, GstPlayer will
   use the still-experimental `playbin3` element and the `GstStreams` API for
   playback.

[snapshot]: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-libs/html/gst-plugins-bad-libs-gstplayer.html#gst-player-get-video-snapshot
[renderer-with-vsink]: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-libs/html/gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html#gst-player-video-overlay-video-renderer-new-with-sink

## Miscellaneous changes

- video caps for interlaced video may contain an optional `"field-order"` field
  now in the case of `interlaced-mode=interleaved` to signal that the field
  order is always the same throughout the stream. This is useful to signal to
  muxers such as mp4mux. The new field is parsed from/to `GstVideoInfo` of course.

- video decoder and video encoder base classes try harder to proxy
  interlacing, colorimetry and chroma-site related fields in caps properly.

- The buffer stored in the `PROTECTION` events is now left unchanged. This is a
  change of behaviour since 1.8, especially for the mssdemux element which used to
  decode the base64 parsed data wrapped in the protection events emitted by the
  demuxer.

- `PROTECTION` events can now be injected into the pipeline from the application;
  source elements deriving from GstBaseSrc will forward those downstream now.

- The DASH demuxer is now correctly parsing the MSPR-2.0 ContentProtection nodes
  and emits Protection events accordingly. Applications relying on those events
  might need to decode the base64 data stored in the event buffer before using it.

- The registry can now also be disabled by setting the environment variable
  `GST_REGISTRY_DISABLE=yes`, with similar effect as the `GST_DISABLE_REGISTRY`
  compile time switch.

- Seeking performance with gstreamer-vaapi based decoders was improved. It would
  recreate the decoder and surfaces on every seek which can be quite slow.

- more robust handling of input caps changes in videoaggregator-based elements
  such as `compositor`.

- Lots of adaptive streaming-related fixes across the board (DASH, MSS, HLS). Also:

  - `mssdemux`, the Microsoft Smooth Streaming demuxer, has seen various
    fixes for live streams, duration reporting and seeking.

  - The DASH manifest parser now extracts MS PlayReady ContentProtection objects
    from manifests and sends them downstream as `PROTECTION` events. It also
    supports multiple Period elements in external xml now.

- gst-libav was updated to ffmpeg 3.3 but should still work with any 3.x
  version.

- GstEncodingProfile has been generally enhanced so it can, for
  example, be used to get possible profiles for a given file
  extension. It is now possible to define profiles based on element
  factory names or using a path to a `.gep` file containing a
  serialized profile.

- `audioconvert` can now do endianness conversion in-place. All other
  conversions still require a copy, but e.g. sign conversion and a few others
  could also be implemented in-place now.

- The new, experimental `playbin3` and `urisourcebin` elements got many
  bugfixes and improvements and should generally be closer to a full
  replacement of the old elements.

- `interleave` now supports > 64 channels.

- OpenCV elements, `grabcut` and `retinex` has been ported to use
  `GstOpencvVideoFilter` base class, increasing code reuse and fixing buffer
  map/unmap issues. Redundant copie of images has been removed in `edgedetect`,
  `cvlaplace` and `cvsobel`. This comes with various cleanup and Meson support.

### OpenGL integration

- As usual the GStreamer OpenGL integration library has seen numerous
  fixes and performance improvements all over the place, and is hopefully
  ready now to become API stable and be moved to gst-plugins-base during the
  1.14 release cycle.

- The GStreamer OpenGL integration layer has also gained support for the
  Vivante EGL FB windowing system, which improves performance on platforms
  such as Freescale iMX.6 for those who are stuck with the proprietary driver.
  The `qmlglsink` element also supports this now if Qt is used with eglfs or
  wayland backend, and it works in conjunction with [gstreamer-imx][gstreamer-imx]
  of course.

- various `qmlglsrc` improvements

[gstreamer-imx]: https://github.com/Freescale/gstreamer-imx

## Tracing framework and debugging improvements

- New tracing hooks have been added to track GstMiniObject and GstObject
  ref/unref operations.

- The memory leaks tracer can optionally use this to retrieve stack traces if
  enabled with e.g. `GST_TRACERS=leaks(filters="GstEvent,GstMessage",stack-traces-flags=full)`

- The `GST_DEBUG_FILE` environment variable, which can be used to write the
  debug log output to a file instead of printing it to stderr, can now contain
  a name pattern, which is useful for automated testing and continuous
  integration systems. The following format specifiers are supported:

   - `%p`: will be replaced with the PID
   - `%r`: will be replaced with a random number, which is useful for instance
     when running two processes with the same PID but in different containers.

## Tools

- `gst-inspect-1.0` can now list elements by type with the new `--types`
   command-line option, e.g. `gst-inspect-1.0 --types=Audio/Encoder` will
   show a list of audio encoders.

- `gst-launch-1.0` and `gst_parse_launch()` have gained a new operator (`:`)
   that allows linking all pads between two elements. This is useful in cases
   where the exact number of pads or type of pads is not known beforehand, such
   as in the `uridecodebin : encodebin` scenario, for example. In this case,
   multiple links will be created if the encodebin has multiple profiles
   compatible with the output of uridecodebin.

- `gst-device-monitor-1.0` now shows a `gst-launch-1.0` snippet for each
  device that shows how to make use of it in a `gst-launch-1.0` pipeline string.

## GStreamer RTSP server

- The RTSP server now also supports Digest authentication in addition to Basic
  authentication.

- The `GstRTSPClient` class has gained a `pre-*-request` signal and virtual
  method for each client request type, emitted in the beginning of each rtsp
  request. These signals or virtual methods let the application validate the
  requests, configure the media/stream in a certain way and also generate error
  status codes in case of an error or a bad request.

## GStreamer VAAPI

- GstVaapiDisplay now inherits from GstObject, thus the VA display logging
  messages are better and tracing the context sharing is more readable.

- When uploading raw images into a VA surfaces now VADeriveImages are tried
  fist, improving the upload performance, if it is possible.

- The decoders and the post-processor now can push dmabuf-based buffers to
  downstream under certain conditions. For example:

  `GST_GL_PLATFORM=egl gst-play-1.0 video-sample.mkv --videosink=glimagesink`

- Refactored the wrapping of VA surface into gstreamer memory, adding lock
  when mapping and unmapping, and many other fixes.

- Now `vaapidecodebin` loads `vaapipostproc` dynamically. It is possible to
  avoid it usage with the environment variable `GST_VAAPI_DISABLE_VPP=1`.

- Regarding encoders: they have primary rank again, since they can discover,
  in run-time, the color formats they can use for upstream raw buffers and
  caps renegotiation is now possible. Also the encoders push encoding info
  downstream via tags.

- About specific encoders: added constant bit-rate encoding mode for VP8 and
  H265 encoder handles P010_10LE color format.

- Regarding decoders, flush operation has been improved, now the internal VA
  encoder is not recreated at each flush. Also there are several improvements
  in the handling of H264 and H265 streams.

- VAAPI plugins try to create their on GstGL context (when available) if they
  cannot find it in the pipeline, to figure out what type of VA Display they
  should create.

- Regarding `vaapisink` for X11, if the backend reports that it is unable to
  render correctly the current color format, an internal VA post-processor, is
  instantiated (if available) and converts the color format.

## GStreamer Editing Services and NLE

- Enhanced auto transition behaviour

- Fix some races in `nlecomposition`

- Allow building with msvc

- Added a UNIX manpage for `ges-launch`

- API changes:
  - Added ges_deinit (allowing the leak tracer to work properly)
  - Added ges_layer_get_clips_in_interval
  - Finally hide internal symbols that should never have been exposed

## GStreamer validate

- Port `gst-validate-launcher` to python 3

- `gst-validate-launcher` now checks if blacklisted bugs have been fixed on
  bugzilla and errors out if it is the case

- Allow building with msvc

- Add ability for the launcher to run GStreamer unit tests

- Added a way to activate the leaks tracer on our tests and fix leaks

- Make the http server multithreaded

- New testsuite for running various test scenarios on the DASH-IF test vectors

## GStreamer Python Bindings

- Overrides has been added for IntRange, Int64Range, DoubleRange,
  FractionRange, Array and List. This finally enables Python programmers
  to fully read and write GstCaps objects.

## Build and Dependencies

- Meson build files are now disted in tarballs, for jhbuild and so distro
  packagers can start using it. Note that the Meson-based build system is not
  100% feature-equivalent with the autotools-based one yet.

- Some plugin filenames have been changed to match the plugin names: for example
  the file name of the `encoding` plugin in gst-plugins-base containing the
  `encodebin` element was `libgstencodebin.so` and has been changed to
  `libgstencoding.so`. This affects only a handful of plugins across modules.

  **Developers who install GStreamer from source and just do `make install`**
  **after updating the source code, without doing `make uninstall` first, will**
  **have to manually remove the old installed plugin files from the installation**
  **prefix, or they will get 'Cannot register existing type' critical warnings.**

- Most of the docbook-based documentation (FAQ, Application Development Manual,
  Plugin Writer's Guide, design documents) has been converted to markdown and
  moved into a new gst-docs module. The gtk-doc library API references and
  the plugins documentation are still built as part of the source modules though.

- GStreamer core now optionally uses libunwind and libdw to generate backtraces.
  This is useful for tracer plugins used during debugging and development.

- There is a new `libgstbadallocators-1.0` library in gst-plugins-bad (which
  may go away again in future releases once the `GstPhysMemoryAllocator`
  interface API has been validated by more users).

- `gst-omx` and `gstreamer-vaapi` modules can now also be built using the
  Meson build system.

- The `qtkitvideosrc` element for macOS was removed. The API is deprecated
  since 10.9 and it wasn't shipped in the binaries since a few releases.

## Platform-specific improvements

### Android

- androidmedia: add support for VP9 video decoding/encoding and Opus audio
  decoding (where supported)

### OS/X and iOS

- `avfvideosrc`, which represents an iPhone camera or, on a Mac, a screencapture
  session, so far allowed you to select an input device by device index only.
  New API adds the ability to select the position (front or back facing) and
  device-type (wide angle, telephoto, etc.). Furthermore, you can now also
  specify the orientation (portrait, landscape, etc.) of the videostream.

### Windows

- `dx9screencapsrc` can now optionally also capture the cursor.

## Contributors

Aleix Conchillo Flaque, Alejandro G. Castro, Aleksandr Slobodeniuk, Alexandru
Băluț, Alex Ashley, Andre McCurdy, Andrew, Anton Eliasson, Antonio Ospite,
Arnaud Vrac, Arun Raghavan, Aurélien Zanelli, Axel Menzel, Benjamin Otte,
Branko Subasic, Brendan Shanks, Carl Karsten, Carlos Rafael Giani, ChangBok
Chae, Chris Bass, Christian Schaller, christophecvr, Claudio Saavedra,
Corentin Noël, Dag Gullberg, Daniel Garbanzo, Daniel Shahaf, David Evans,
David Schleef, David Warman, Dominique Leuenberger, Dongil Park, Douglas
Bagnall, Edgard Lima, Edward Hervey, Emeric Grange, Enrico Jorns, Enrique
Ocaña González, Evan Nemerson, Fabian Orccon, Fabien Dessenne, Fabrice Bellet,
Florent Thiéry, Florian Zwoch, Francisco Velazquez, Frédéric Dalleau, Garima
Gaur, Gaurav Gupta, George Kiagiadakis, Georg Lippitsch, Göran Jönsson, Graham
Leggett, Guillaume Desmottes, Gurkirpal Singh, Haihua Hu, Hanno Boeck, Havard
Graff, Heekyoung Seo, hoonhee.lee, Hyunjun Ko, Imre Eörs, Iñaki García
Etxebarria, Jagadish, Jagyum Koo, Jan Alexander Steffens (heftig), Jan
Schmidt, Jean-Christophe Trotin, Jochen Henneberg, Jonas Holmberg, Joris
Valette, Josep Torra, Juan Pablo Ugarte, Julien Isorce, Jürgen Sachs, Koop
Mast, Kseniia Vasilchuk, Lars Wendler, leigh123linux@googlemail.com, Luis de
Bethencourt, Lyon Wang, Marcin Kolny, Marinus Schraal, Mark Nauwelaerts,
Mathieu Duponchelle, Matthew Waters, Matt Staples, Michael Dutka, Michael
Olbrich, Michael Smith, Michael Tretter, Miguel París Díaz, namanyadav12, Neha
Arora, Nick Kallen, Nicola Murino, Nicolas Dechesne, Nicolas Dufresne, Nicolas
Huet, Nirbheek Chauhan, Ole André Vadla Ravnås, Olivier Crête, Patricia
Muscalu, Peter Korsgaard, Peter Seiderer, Petr Kulhavy, Philippe Normand,
Philippe Renon, Philipp Zabel, Rahul Bedarkar, Reynaldo H. Verdejo Pinochet,
Ricardo Ribalda Delgado, Rico Tzschichholz, Руслан Ижбулатов, Samuel Maroy,
Santiago Carot-Nemesio, Scott D Phillips, Sean DuBois, Sebastian Dröge, Sergey
Borovkov, Seungha Yang, shakin chou, Song Bing, Søren Juul, Sreerenj
Balachandran, Stefan Kost, Stefan Sauer, Stepan Salenikovich, Stian Selnes,
Stuart Weaver, suhas2go, Thiago Santos, Thibault Saunier, Thomas Bluemel,
Thomas Petazzoni, Tim-Philipp Müller, Ting-Wei Lan, Tobias Mueller, Todor
Tomov, Tomasz Zajac, Ulf Olsson, Ursula Maplehurst, Víctor Manuel Jáquez Leal,
Victor Toso, Vincent Penquerc'h, Vineeth TM, Vinod Kesti, Vitor Massaru Iha,
Vivia Nikolaidou, WeiChungChang, William Manley, Wim Taymans, Wojciech
Przybyl, Wonchul Lee, Xavier Claessens, Yasushi SHOJI

... and many others who have contributed bug reports, translations, sent
suggestions or helped testing.

## Bugs fixed in 1.12

More than [635 bugs][bugs-fixed-in-1.12] have been fixed during
the development of 1.12.

This list does not include issues that have been cherry-picked into the
stable 1.10 branch and fixed there as well, all fixes that ended up in the
1.10 branch are also included in 1.12.

This list also does not include issues that have been fixed without a bug
report in bugzilla, so the actual number of fixes is much higher.

[bugs-fixed-in-1.12]: https://bugzilla.gnome.org/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&classification=Platform&limit=0&list_id=213265&order=bug_id&product=GStreamer&query_format=advanced&resolution=FIXED&target_milestone=1.10.1&target_milestone=1.10.2&target_milestone=1.10.3&target_milestone=1.10.4&target_milestone=1.11.1&target_milestone=1.11.2&target_milestone=1.11.3&target_milestone=1.11.4&target_milestone=1.11.90&target_milestone=1.11.91&target_milestone=1.12.0

## Stable 1.12 branch

After the 1.12.0 release there will be several 1.12.x bug-fix releases which
will contain bug fixes which have been deemed suitable for a stable branch,
but no new features or intrusive changes will be added to a bug-fix release
usually. The 1.12.x bug-fix releases will be made from the git 1.12 branch, which
is a stable branch.

### 1.12.0

1.12.0 was released on 4th May 2017.

<a name="1.12.1"></a>

### 1.12.1

The first 1.12 bug-fix release (1.12.1) was released on 20 June 2017.
This release only contains bugfixes and it should be safe to update from 1.12.x.

#### Major bugfixes in 1.12.1

 - Various fixes for crashes, assertions, deadlocks and memory leaks
 - Fix for regression when seeking to the end of ASF files
 - Fix for regression in (raw)videoparse that caused it to omit video metadata
 - Fix for regression in discoverer that made it show more streams than
   actually available
 - Numerous bugfixes to the adaptive demuxer base class and the DASH demuxer
 - Various playbin3/urisourcebin related bugfixes
 - Vivante DirectVIV (imx6) texture uploader works with single-plane (e.g.
   RGB) video formats now
 - Intel Media SDK encoder now outputs valid PTS and keyframe flags
 - OpenJPEG2000 plugin can be loaded again on MacOS and correctly displays
   8 bit RGB images now
 - Fixes to DirectSound source/sink for high CPU usage and wrong
   latency/buffer size calculations
 - gst-libav was updated to ffmpeg n3.3.2
 - ... and many, many more!

For a full list of bugfixes see [Bugzilla][buglist-1.12.1]. Note that this is
not the full list of changes. For the full list of changes please refer to the
GIT logs or ChangeLogs of the particular modules.

[buglist-1.12.1]: https://bugzilla.gnome.org/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&classification=Platform&limit=0&list_id=225693&order=bug_id&product=GStreamer&query_format=advanced&resolution=FIXED&target_milestone=1.12.1

<a name="1.12.2"></a>

### 1.12.2

The second 1.12 bug-fix release (1.12.2) was released on 14 July 2017.
This release only contains bugfixes and it should be safe to update from 1.12.x.

#### Major bugfixes in 1.12.2

 - Various fixes for crashes, assertions, deadlocks and memory leaks
 - Regression fix for playback of live HLS streams
 - Regression fix for crash when playing back a tunneled RTSP stream
 - Regression fix for playback of RLE animations in MOV containers
 - Regression fix for RTP GSM payloading producing corrupted output
 - Major bugfixes to the MXF demuxer, mostly related to seeking and
   fixes to the frame reordering handling in the MXF muxer and demuxer
 - Fix for playback of mono streams on MacOS
 - More fixes for index handling of ASF containers
 - Various fixes to adaptivedemux, DASH and HLS demuxers
 - Fix deadlock in gstreamer-editing-services during class initialization
 - ... and many, many more!

For a full list of bugfixes see [Bugzilla][buglist-1.12.2]. Note that this is
not the full list of changes. For the full list of changes please refer to the
GIT logs or ChangeLogs of the particular modules.

[buglist-1.12.2]: https://bugzilla.gnome.org/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&classification=Platform&limit=0&list_id=225693&order=bug_id&product=GStreamer&query_format=advanced&resolution=FIXED&target_milestone=1.12.2

## Known Issues

- The `webrtcdsp` element is currently not shipped as part of the Windows
  binary packages due to a [build system issue][bug-770264].

[bug-770264]: https://bugzilla.gnome.org/show_bug.cgi?id=770264

## Schedule for 1.14

Our next major feature release will be 1.14, and 1.13 will be the unstable
development version leading up to the stable 1.14 release. The development
of 1.13/1.14 will happen in the git master branch.

The plan for the 1.14 development cycle is yet to be confirmed, but it is
expected that feature freeze will be around September 2017
followed by several 1.13 pre-releases and the new 1.14 stable release
in October.

1.14 will be backwards-compatible to the stable 1.12, 1.10, 1.8, 1.6, 1.4,
1.2 and 1.0 release series.

- - -

*These release notes have been prepared by Olivier Crête, Sebastian Dröge,
Nicolas Dufresne, Víctor Manuel Jáquez Leal, Tim-Philipp Müller, Philippe
Normand and Thibault Saunier.*

*License: [CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/)*
