decklinkvideosink: Use correct numerator for 29.97fps
[platform/upstream/gstreamer.git] / NEWS
diff --git a/NEWS b/NEWS
index 1e860c4..dba9c7c 100644 (file)
--- a/NEWS
+++ b/NEWS
+GStreamer 1.18 Release Notes
 
+GStreamer 1.18.0 was originally released on 7 September 2020.
 
-GSTREAMER 1.16 RELEASE NOTES
+See https://gstreamer.freedesktop.org/releases/1.18/ for the latest
+version of this document.
 
+Last updated: Monday 7 September 2020, 10:30 UTC (log)
 
-GStreamer 1.16 has not been released yet. It is scheduled for release in
-January/February 2019.
+Introduction
 
-1.15.x is the unstable development version that is being developed in
-the git master branch and which will eventually result in 1.16.
+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!
 
-1.16 will be backwards-compatible to the stable 1.14, 1.12, 1.10, 1.8,
-1.6, 1.4, 1.2 and 1.0 release series.
+As always, this release is again packed with many new features, bug
+fixes and other improvements.
 
-See https://gstreamer.freedesktop.org/releases/1.16/ for the latest
-version of this document.
+Highlights
 
-_Last updated: Monday 14 January 2019, 13:00 UTC (log)_
+-   GstTranscoder: new high level API for applications to transcode
+    media files from one format to another
 
+-   High Dynamic Range (HDR) video information representation and
+    signalling enhancements
 
-Introduction
+-   Instant playback rate change support
 
-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!
+-   Active Format Description (AFD) and Bar Data support
 
-As always, this release is again packed with new features, bug fixes and
-other improvements.
+-   ONVIF trick modes support in both GStreamer RTSP server and client
 
+-   Hardware-accelerated video decoding on Windows via DXVA2 /
+    Direct3D11
 
-Highlights
+-   Microsoft Media Foundation plugin for video capture and
+    hardware-accelerated video encoding on Windows
+
+-   qmlgloverlay: New overlay element that renders a QtQuick scene over
+    the top of an input video stream
+
+-   New imagesequencesrc element to easily create a video stream from a
+    sequence of jpeg or png images
 
--   GStreamer WebRTC stack gained support for data channels for
-    peer-to-peer communication based on SCTP, BUNDLE support, as well as
-    support for multiple TURN servers.
+-   dashsink: Add new sink to produce DASH content
 
--   AV1 video codec support for Matroska and QuickTime/MP4 containers
-    and more configuration options and supported input formats for the
-    AOMedia AV1 encoder
+-   dvbsubenc: DVB Subtitle encoder element
 
--   Support for Closed Captions and other Ancillary Data in video
+-   TV broadcast compliant MPEG-TS muxing with constant bitrate muxing
+    and SCTE-35 support
 
--   Spport for planar (non-interleaved) raw audio
+-   rtmp2: new RTMP client source and sink element implementation
 
--   GstVideoAggregator, compositor and OpenGL mixer elements are now in
-    -base
+-   svthevcenc: new SVT-HEVC-based H.265 video encoder
 
--   New alternate fields interlace mode where each buffer carries a
-    single field
+-   vaapioverlay compositor element using VA-API
 
--   WebM and Matroska ContentEncryption support in the Matroska demuxer
+-   rtpmanager support for Google’s Transport-Wide Congestion Control
+    (twcc) RTP extension
 
--   new WebKit WPE-based web browser source element
+-   splitmuxsink and splitmuxsrc gained support for auxiliary video
+    streams
 
--   Video4Linux: HEVC encoding and decoding, JPEG encoding, and improved
-    dmabuf import/export
+-   webrtcbin now contains some initial support for renegotiation
+    involving stream addition and removal
 
--   Hardware-accelerated Nvidia video decoder gained support for VP8/VP9
-    decoding, whilst the encoder gained support for H.265/HEVC encoding.
+-   New RTP source and sink elements to easily set up RTP streaming via
+    rtp:// URIs
 
--   Many improvements to the Intel Media SDK based hardware-accelerated
-    video decoder and encoder plugin (msdk): dmabuf import/export for
-    zero-copy integration with other components; VP9 decoding; 10-bit
-    HEVC encoding; video post-processing (vpp) support including
-    deinterlacing; and the video decoder now handles dynamic resolution
-    changes.
+-   New Audio Video Transport Protocol (AVTP) plugin for Time-Sensitive
+    Applications
 
--   The ASS/SSA subtitle overlay renderer can now handle multiple
-    subtitles that overlap in time and will show them on screen
-    simultaneously
+-   Support for the Video Services Forum’s Reliable Internet Stream
+    Transport (RIST) TR-06-1 Simple Profile
 
--   The Meson build is now feature-complete (*) and it is now the
-    recommended build system on all platforms. The Autotools build is
-    scheduled to be removed in the next cycle.
+-   Universal Windows Platform (UWP) support
 
--   The GStreamer Rust bindings and Rust plugins module are now
-    officially part of upstream GStreamer.
+-   rpicamsrc element for capturing from the Raspberry Pi camera
 
--   Many performance improvements
+-   RTSP Server TCP interleaved backpressure handling improvements as
+    well as support for Scale/Speed headers
 
+-   GStreamer Editing Services gained support for nested timelines,
+    per-clip speed rate control and the OpenTimelineIO format.
+
+-   Autotools build system has been removed in favour of Meson
 
 Major new features and changes
 
-Noteworthy new API
-
--   GstAggregator has a new "min-upstream-latency" property that forces
-    a minimum aggregate latency for the input branches of an aggregator.
-    This is useful for dynamic pipelines where branches with a higher
-    latency might be added later after the pipeline is already up and
-    running and where a change in the latency would be disruptive. This
-    only applies to the case where at least one of the input branches is
-    live though, it won’t force the aggregator into live mode in the
-    absence of any live inputs.
-
--   GstBaseSink gained a "processing-deadline" property and
-    setter/getter API to configure a processing deadline for live
-    pipelines. The processing deadline is the acceptable amount of time
-    to process the media in a live pipeline before it reaches the sink.
-    This is on top of the systemic latency that is normally reported by
-    the latency query. This defaults to 20ms and should make pipelines
-    such as “v4lsrc ! xvimagesink” not claim that all frames are late in
-    the QoS events. Ideally, this should replace max_lateness for most
-    applications.
-
--   RTCP Extended Reports (XR) parsing according to RFC 3611:
-    Loss/Duplicate RLE, Packet Receipt Times, Receiver Reference Time,
-    Delay since the last Receiver (DLRR), Statistics Summary, and VoIP
-    Metrics reports.
-
--   a new mode for interlaced video was added where each buffer carries
-    a single field of interlaced video, with buffer flags indicating
-    whether the field is the top field or bottom field. Top and bottom
-    fields are expected to alternate in this mode. Caps for this
-    interlace mode must also carry a format:Interlaced caps feature to
-    ensure backwards compatibility.
-
--   The video library has gained support for three new raw pixel
-    formats:
-
-    -   Y410: packed 4:4:4 YUV, 10 bits per channel
-    -   Y210: packed 4:2:2 YUV, 10 bits per channel
-    -   NV12_10LE40: fully-packed 10-bit variant of NV12_10LE32,
-        i.e. without the padding bits
-
--   GstRTPSourceMeta is a new meta that can be used to transport
-    information about the origin of depayloaded or decoded RTP buffers,
-    e.g. when mixing audio from multiple sources into a single stream. A
-    new "source-info" property on the RTP depayloader base class
-    determines whether depayloaders should put this meta on outgoing
-    buffers. Similarly, the same property on RTP payloaders determines
-    whether they should use the information from this meta to construct
-    the CSRCs list on outgoing RTP buffers.
-
--   gst_sdp_message_from_text() is a convenience constructor to parse
-    SDPs from a string which is particularly useful for language
-    bindings.
-
-Support for Planar (Non-Interleaved) Raw Audio
-
-Raw audio samples are usually passed around in interleaved form in
-GStreamer, which means that if there are multiple audio channels the
-samples for each channel are interleaved in memory, e.g.
-|LEFT|RIGHT|LEFT|RIGHT|LEFT|RIGHT| for stereo audio. A non-interleaved
-or planar arrangement in memory would look like
-|LEFT|LEFT|LEFT|RIGHT|RIGHT|RIGHT| instead, possibly with
-|LEFT|LEFT|LEFT| and |RIGHT|RIGHT|RIGHT| residing in separate memory
-chunks or separated by some padding.
-
-GStreamer has always had signalling for non-interleaved audio, but it
-was never actually properly implemented in any elements. audioconvert
-would advertise support for it, but wasn’t actually able to handle it.
-
-With this release we now have full support for non-interleaved audio as
-well, which means more efficient integration with external APIs that
-handle audio this way, but also more efficient processing of certain
-operations like interleaving multiple 1-channel streams into a
-multi-channel stream which can be done without memory copies now.
-
-New API to support this has been added to the GStreamer Audio support
-library: There is now a new GstAudioMeta which describes how data is
-laid out inside the buffer, and buffers with non-interleaved audio must
-always carry this meta. To access the non-interleaved audio samples you
-must map such buffers with gst_audio_buffer_map() which works much like
-gst_buffer_map() or gst_video_frame_map() in that it will populate a
-little GstAudioBuffer helper structure passed to it with the number of
-samples, the number of planes and pointers to the start of each plane in
-memory. This function can also be used to map interleaved audio buffers
-in which case there will be only one plane of interleaved samples.
-
-Of course support for this has also been implemented in the various
-audio helper and conversion APIs, base classes, and in elements such as
-audioconvert, audioresample, audiotestsrc, audiorate.
-
-Support for Closed Captions and Other Ancillary Data in Video
-
-The video support library has gained support for detecting and
-extracting Ancillary Data from videos as per the SMPTE S291M
-specification, including:
-
--   a VBI (Video Blanking Interval) parser that can detect and extract
-    Ancillary Data from Vertical Blanking Interval lines of component
-    signals. This is currently supported for videos in v210 and UYVY
-    format.
-
--   a new GstMeta for closed captions: GstVideoCaptionMeta. This
-    supports the two types of closed captions, CEA-608 and CEA-708,
-    along with the four different ways they can be transported (other
-    systems are a superset of those).
-
--   a VBI (Video Blanking Interval) encoder for writing ancillary data
-    to the Vertical Blanking Interval lines of component signals.
-
-The new closedcaption plugin in gst-plugins-bad then makes use of all
-this new infrastructure and provides the following elements:
-
--   cccombiner: a closed caption combiner that takes a closed captions
-    stream and another stream and adds the closed captions as
-    GstVideoCaptionMeta to the buffers of the other stream.
-
--   ccextractor: a closed caption extractor which will take
-    GstVideoCaptionMeta from input buffers and output them as a separate
-    closed captions stream.
-
--   ccconverter: a closed caption converter that can convert between
-    different formats
-
--   line21decoder: extract line21 closed captions from SD video streams
-
--   cc708overlay: decodes CEA 608/708 captions and overlays them on
-    video
-
-Additionally, the following elements have also gained Closed Caption
-support:
-
--   qtdemux and qtmux support CEA 608/708 Closed Caption tracks
-
--   mpegvideoparse extracts Closed Captions from MPEG-2 video streams
-
--   decklinkvideosink can output closed captions and decklinkvideosrc
-    can extract closed captions
-
--   playbin and playbin3 learned how to autoplug CEA 608/708 CC overlay
-    elements
-
-The rsclosedcaption plugin in the Rust plugins collection includes a
-MacCaption (MCC) file parser and encoder.
-
-New Elements
+Noteworthy new features and API
+
+Instant playback rate changes
+
+Changing the playback rate as quickly as possible so far always required
+a flushing seek. This generally works, but has the disadvantage of
+flushing all data from the playback pipeline and requiring the demuxer
+or parser to do a full-blown seek including resetting its internal state
+and resetting the position of the data source. It might also require
+considerable decoding effort to get to the right position to resume
+playback from at the higher rate.
+
+This release adds a new mechanism to achieve quasi-instant rate changes
+in certain playback pipelines without interrupting the flow of data in
+the pipeline. This is activated by sending a seek with the
+GST_SEEK_FLAG_INSTANT_RATE_CHANGE flag and start_type = stop_type =
+GST_SEEK_TYPE_NONE. This flag does not work for all pipelines, in which
+case it is necessary to fall back to sending a full flushing seek to
+change the playback rate. When using this flag, the seek event is only
+allowed to change the current rate and can modify the trickmode flags
+(e.g. keyframe only or not), but it is not possible to change the
+current playback position, playback direction or do a flush.
+
+This is particularly useful for streaming use cases like HLS or DASH
+where the streaming download should not be interrupted when changing
+rate.
+
+Instant rate changing is handled in the pipeline in a specific sequence
+which is detailed in the seeking design docs. Most elements don’t need
+to worry about this, only elements that sync to the clock need some
+special handling which is implemented in the GstBaseSink base class, so
+should be taken care of automatically in most normal playback pipelines
+and sink elements.
+
+See Jan’s GStreamer Conference 2019 talk “Changing Playback Rate
+Instantly” for more information.
+
+You can try this feature by passing the -i command line option to
+gst-play-1.0. It is supported at least by qtdemux, tsdemux, hlsdemux,
+and dashdemux.
+
+Google Transport-Wide Congestion Control
+
+rtpmanager now supports the parsing and generating of RTCP messages for
+the Google Transport-Wide Congestion Control RTP Extension, as described
+in:
+https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01.
+
+This “just” provides the required plumbing/infrastructure, it does not
+actually make effect any actual congestion control on the sender side,
+but rather provides information for applications to use to make such
+decisions.
+
+See Håvard’s “Google Transport-Wide Congestion Control” talk for more
+information about this feature.
+
+GstTranscoder: a new high-level transcoding API for applications
+
+The new GstTranscoder library, along with transcodebin and
+uritranscodebin elements, provides high level API for applications to
+transcode media files from one format to another. Watch Thibault’s talk
+“GstTranscoder: A High Level API to Quickly Implement Transcoding
+Capabilities in your Applications” for more information.
+
+This also comes with a gst-transcoder-1.0 command line utility to
+transcode one URI into another URI based on the specified encoding
+profile.
+
+Active Format Description (AFD) and Bar Data support
+
+The GstVideo Ancillary Data API has gained support for Active Format
+Description (AFD) and Bar data.
+
+This includes various two new buffer metas: GstVideoAFDMeta and
+GstVideoBarMeta.
+
+GStreamer now also parses and extracts AFD/Bar data in the h264/h265
+video parsers, and supports both capturing them and outputting them in
+the decklink elements. See Aaron’s lightning talk at the GStreamer
+Conference for more background.
+
+ONVIF trick modes support in both GStreamer RTSP server and client
+
+-   Support for the various trick modes described in section 6 of the
+    ONVIF streaming spec has been implemented in both gst-rtsp-server
+    and rtspsrc.
+-   Various new properties in rtspsrc must be set to take advantage of
+    the ONVIF support
+-   Examples are available here: test-onvif-server.c and
+    test-onvif-client.c
+-   Watch Mathieu Duponchelle’s talk “Implementing a Trickmode Player
+    with ONVIF, RTSP and GStreamer” for more information and a live
+    demo.
+
+GStreamer Codecs library with decoder base classes
+
+This introduces a new library in gst-plugins-bad which contains a set of
+base classes that handle bitstream parsing and state tracking for the
+purpose of decoding different codecs. Currently H264, H265, VP8 and VP9
+are supported. These bases classes are meant primarily for internal use
+in GStreamer and are used in various decoder elements in connection with
+low level decoding APIs like DXVA, NVDEC, VAAPI and V4L2 State Less
+decoders. The new library is named gstreamer-codecs-1.0 /
+libgstcodecs-1.0 and is not yet guaranteed to be API stable across major
+versions.
+
+MPEG-TS muxing improvements
+
+The GStreamer MPEG-TS muxer has seen major improvements on various
+fronts in this cycle:
+
+-   It has been ported to the GstAggregator base class which means it
+    can work in defined-latency mode with live input sources and
+    continue streaming if one of the inputs stops producing data.
+
+-   atscmux, a new ATSC-specific tsmux subclass
+
+-   Constant Bit Rate (CBR) muxing support via the new bitrate property
+    which allows setting the target bitrate in bps. If this is set the
+    muxer will insert null packets as padding to achieve the desired
+    multiplex-wide constant bitrate.
+
+-   compliance fixes for TV broadcasting use cases (esp. ATSC). See
+    Jan’s talk “TV Broadcast compliant MPEG-TS” for details.
+
+-   Streams can now be added and removed at runtime: Until now, any
+    streams in tsmux had to be present when the element started
+    outputting its first buffer. Now they can appear at any point during
+    the stream, or even disappear and reappear later using the same PID.
+
+-   new pcr-interval property allows applications to configure the
+    desired interval instead of hardcoding it
+
+-   basic SCTE-35 support. This is enabled by setting the scte-35-pid
+    property on the muxer. Sending SCTE-35 commands is then done by
+    creating the appropriate SCTE-35 GstMpegtsSection and sending them
+    on the muxer.
+
+-   MPEG-2 AAC handling improvements
+
+New elements
+
+-   New qmlgloverlay element for rendering a QtQuick scene over the top
+    of a video stream. qmlgloverlay requires that Qt support adopting an
+    external OpenGL context and is known to work on X11 and Windows.
+    Wayland is known not to work due to limitations within Qt. Check out
+    the example to see how it works.
+
+-   The clocksync element is a generic element that can be placed in a
+    pipeline to synchronise passing buffers to the clock at that point.
+    This is similar to identity sync=true, but because it isn’t
+    GstBaseTransform-based, it can process GstBufferLists without
+    breaking them into separate GstBuffers. It is also more discoverable
+    than the identity option. Note that you do not need to insert this
+    element into your pipeline to make GStreamer sync to the pipeline
+    clock, this is usually handled automatically by the elements in the
+    pipeline (sources and sinks mostly). This element is useful to feed
+    non-live input such as local files into elements that expect live
+    input such as webrtcbin.`
+
+-   New imagesequencesrc element to easily create a video stream from a
+    sequence of JPEG or PNG images (or any other encoding where the type
+    can be detected), basically a multifilesrc made specifically for
+    image sequences.
+
+-   rpicamsrc element for capturing raw or encoded video (H.264, MJPEG)
+    from the Raspberry Pi camera. This works much like the popular
+    raspivid command line utility but outputs data nicely timestamped
+    and formatted in order to integrate nicely with other GStreamer
+    elements. Also comes with a device provider so applications can
+    discover the camera if available.
+
+-   aatv and cacatv video filters that transform video ASCII art style
+
+-   avtp: new Audio Video Transport Protocol (AVTP) plugin for Linux.
+    See Andre Guedes’ talk “Audio/Video Bridging (AVB) support in
+    GStreamer” for more details.
+
+-   clockselect: a pipeline element that enables clock selection/forcing
+    via gst-launch pipeline syntax.
+
+-   dashsink: Add new sink to produce DASH content. See Stéphane’s talk
+    or blog post for details.
+
+-   dvbsubenc: a DVB subtitle encoder element
+
+-   microdns: a libmicrodns-based mdns device provider to discover RTSP
+    cameras on the local network
+
+-   mlaudiosink: new audio sink element for the Magic Leap platform,
+    accompanied by an MLSDK implementation in the amc plugin
 
--   overlaycomposition: New element that allows applications to draw
-    GstVideoOverlayCompositions on a stream. The element will emit the
-    "draw" signal for each video buffer, and the application then
-    generates an overlay for that frame (or not). This is much more
-    performant than e.g. cairooverlay for many use cases, e.g. because
-    pixel format conversions can be avoided or the blitting of the
-    overlay can be delegated to downstream elements (such as
-    gloverlaycompositor). It’s particularly useful for cases where only
-    a small section of the video frame should be drawn on.
+-   msdkvp9enc: VP9 encoder element for the Intel MediaSDK
 
--   gloverlaycompositor: New OpenGL-based compositor element that
-    flattens any overlays from GstVideoOverlayCompositionMetas into the
-    video stream.
+-   rist: new plugin implementing support for the Video Services Forum’s
+    Reliable Internet Stream Transport (RIST) TR-06-1 Simple Profile.
+    See Nicolas’ blog post “GStreamer support for the RIST
+    Specification” for more details.
+
+-   rtmp2: new RTMP client source and sink elements with fully
+    asynchronous network operations, better robustness and additional
+    features such as handling ping and stats messages, and adobe-style
+    authentication. The new rtmp2src and rtmp2sink elements should be
+    API-compatible with the old rtmpsrc / rtmpsink elements and should
+    work as drop-in replacements.
 
--   glalpha: New element that adds an alpha channel to a video stream.
-    The values of the alpha channel can either be set to a constant or
-    can be dynamically calculated via chroma keying. It is similar to
-    the existing alpha element but based on OpenGL. Calculations are
-    done in floating point so results may not be identical to the output
-    of the existing alpha element.
+-   new RTP source and sink elements to easily set up RTP streaming via
+    rtp:// URIs: The rtpsink and rtpsrc elements add an URI interface so
+    that streams can be decoded with decodebin using rtp:// URIs. These
+    can be used as follows: ``` gst-launch-1.0 videotestsrc ! x264enc !
+    rtph264pay config-interval=3 ! rtpsink uri=rtp://239.1.1.1:1234
 
--   rtpfunnel funnels together rtp-streams into a single session. Use
-    cases include multiplexing and bundle. webrtcbin uses it to
-    implement BUNDLE support.
+    gst-launch-1.0 videotestsrc ! x264enc ! rtph264pay config-interval=1
+    ! rtpsink uri=rtp://239.1.2.3:5000 gst-launch-1.0 rtpsrc
+    uri=rtp://239.1.2.3:5000?encoding-name=H264 ! rtph264depay !
+    avdec_h264 ! videoconvert ! xvimagesink
 
--   testsrcbin is a source element that provides an audio and/or video
-    stream and also announces them using the recently-introduced
-    GstStream API. This is useful for testing elements such as playbin3
-    or uridecodebin3 etc.
+    gst-launch-1.0 videotestsrc ! avenc_mpeg4 ! rtpmp4vpay
+    config-interval=1 ! rtpsink uri=rtp://239.1.2.3:5000 gst-launch-1.0
+    rtpsrc uri=rtp://239.1.2.3:5000?encoding-name=MP4V-ES ! rtpmp4vdepay
+    ! avdec_mpeg4 ! videoconvert ! xvimagesink ```
 
--   New closed caption elements: cccombiner, ccextractor, ccconverter,
-    line21decoder and cc708overlay (see above)
+-   svthevcenc: new SVT-HEVC-based H.265 video encoder
 
--   wpesrc: new source element acting as a Web Browser based on WebKit
-    WPE
+-   switchbin: new helper element which chooses between a set of
+    processing chains (paths) based on input caps, and changes the
+    active chain if new caps arrive. Paths are child objects, which are
+    accessed by the GstChildProxy interface. See the switchbin
+    documentation for a usage example.
 
--   Two new OpenCV-based elements: cameracalibrate and cameraundistort
-    who can communicate to figure out distortion correction parameters
-    for a camera and correct for the distortion.
+-   vah264dec: new experimental va plugin with an element for H.264
+    decoding with VA-API using GStreamer’s new stateless decoder
+    infrastructure (see Linux section below).
+
+-   v4l2codecs: introduce an V4L2 CODECs Accelerator supporting the new
+    CODECs uAPI in the Linux kernel (see Linux section below)
 
--   new sctp plugin based on usrsctp with sctpenc and sctpdec elements
+-   zxing new plugin to detect QR codes and barcodes, based on libzxing
+
+-   also see the Rust plugins section below which contains plenty of new
+    exciting plugins written in Rust!
 
 New element features and additions
 
--   playbin3, playbin and playsink have gained a new "text-offset"
-    property to adjust the positioning of the selected subtitle stream
-    vis-a-vis the audio and video streams. This uses subtitleoverlay’s
-    new "subtitle-ts-offset" property. GstPlayer has gained matching API
-    for this, namely gst_player_get_text_video_offset().
-
--   playbin3 buffering improvements: in network playback scenarios there
-    may be multiple inputs to decodebin3, and buffering will be done
-    before decodebin3 using queue2 or downloadbuffer elements inside
-    urisourcebin. Since this is before any parsers or demuxers there may
-    not be any bitrate information available for the various streams, so
-    it was difficult to configure the buffering there smartly within
-    global constraints. This was improved now: The queue2 elements
-    inside urisourcebin will now use the new bitrate query to figure out
-    a bitrate estimate for the stream if no bitrate was provided by
-    upstream, and urisourcebin will use the bitrates of the individual
-    queues to distribute the globally-set "buffer-size" budget in bytes
-    to the various queues. urisourcebin also gained "low-watermark" and
-    "high-watermark" properties which will be proxied to the internal
-    queues, as well as a read-only "statistics" property which allows
-    querying of the minimum/maximum/average byte and time levels of the
-    queues inside the urisourcebin in question.
-
--   splitmuxsink has gained a couple of new features:
-
-    -   new "async-finalize" mode: This mode is useful for muxers or
-        outputs that can take a long time to finalize a file. Instead of
-        blocking the whole upstream pipeline while the muxer is doing
-        its stuff, we can unlink it and spawn a new muxer + sink
-        combination to continue running normally. This requires us to
-        receive the muxer and sink (if needed) as factories via the new
-        "muxer-factory" and "sink-factory" properties, optionally
-        accompanied by their respective properties structures (set via
-        the new "muxer-properties" and "sink-properties" properties).
-        There are also new "muxer-added" and "sink-added" signals in
-        case custom code has to be called for them to configure them.
-
-    -   "split-at-running-time" action signal: When called by the user,
-        this action signal ends the current file (and starts a new one)
-        as soon as the given running time is reached. If called multiple
-        times, running times are queued up and processed in the order
-        they were given.
-
-    -   "split-after" action signal to finish outputting the current GOP
-        to the current file and then start a new file as soon as the GOP
-        is finished and a new GOP is opened (unlike the existing
-        "split-now" which immediately finishes the current file and
-        writes the current GOP into the next newly-started file).
-
-    -   "reset-muxer" property: when unset, the muxer is reset using
-        flush events instead of setting its state to NULL and back. This
-        means the muxer can keep state across resets, e.g. mpegtsmux
-        will keep the continuity counter continuous across segments as
-        required by hlssink2.
-
--   qtdemux gained PIFF track encryption box support in addition to the
-    already-existing PIFF sample encryption support, and also allows
-    applications to select which encryption system to use via a
-    "drm-preferred-decryption-system-id" context in case there are
-    multiple options.
-
--   qtmux: the "start-gap-threshold" property determines now whether an
-    edit list will be created to account for small gaps or offsets at
-    the beginning of a stream in case the start timestamps of tracks
-    don’t line up perfectly. Previously the threshold was hard-coded to
-    1% of the (video) frame duration, now it is 0 by default (so edit
-    list will be created even for small differences), but fully
-    configurable.
-
--   rtpjitterbuffer has improved end-of-stream handling
-
--   rtpmp4vpay will be prefered over rtpmp4gpay for MPEG-4 video in
-    autoplugging scenarios now
-
--   rtspsrc now allows applications to send RTSP SET_PARAMETER and
-    GET_PARAMETER requests using action signals.
-
--   rtspsrc also has a small (100ms) configurable teardown delay by
-    default to try and make sure an RTSP TEARDOWN request gets sent out
-    when the source element shuts down. This will block the downward
-    PAUSED to READY state change for a short time, but can be unset
-    where it’s a problem. Some servers only allow a limited number of
-    concurren clients, so if no proper TEARDOWN is sent clients may have
-    problems connecting to the server for a while.
-
--   souphttpsrc behaves better with low bitrate streams now. Before it
-    would increase the read block size too quickly which could lead to
-    it not reading any data from the socket for a very long time with
-    low bitrate streams that are output live downstream. This could lead
-    to servers kicking off the client.
-
--   filesink: do internal buffering to avoid performance regression with
-    small writes since we bypass libc buffering by using writev()
-
--   identity: add "eos-after" property and fix "error-after" property
-    when the element is reused
-
--   input-selector: lets context queries pass through, so that
-    e.g. upstream OpenGL elements can use contexts and displays
-    advertised by downstream elements
-
--   queue2: avoid ping-pong between 0% and 100% buffering messages if
-    upstream is pushing buffers larger than one of its limits, plus
-    performance optimisations
-
--   opusdec: new "phase-inversion" property to control phase inversion.
-    When enabled, this will slightly increase stereo quality, but
-    produces a stream that when downmixed to mono will suffer audio
-    distortions.
-
--   The x265enc HEVC encoder also exposes a "key-int-max" property to
-    configure the maximum allowed GOP size now.
-
--   decklinkvideosink has seen stability improvements for long-running
-    pipelines (potential crash due to overflow of leaked clock refcount)
-    and clock-slaving improvements when performing flushing seeks
-    (causing stalls in the output timeline), pausing and/or buffering.
-
--   srtpdec, srtpenc: add support for MKIs which allow multiple keys to
-    be used with a single SRTP stream
-
--   The srt Secure Reliable Transport plugin has integrated server and
-    client elements srt{client,server}{src,sink} into one (srtsrc and
-    srtsink), since SRT connection mode can be changed by uri
-    parameters.
+GStreamer core
+
+-   filesink: Add a new “full” buffer mode. Previously the default and
+    full modes were the same. Now the default mode is like before: it
+    accumulates all buffers in a buffer list until the threshold is
+    reached and then writes them all out, potentially in multiple
+    writes. The new full mode works by always copying memory to a single
+    memory area and writing everything out with a single write once the
+    threshold is reached.
+
+-   multiqueue: Add stats property and
+    current-level-{buffers, bytes, time} pad properties to query the
+    current levels of the corresponding internal queue.
+
+Plugins Base
+
+-   alsa: implement a device provider
+
+-   alsasrc: added use-driver-timestamp property to force use of
+    pipeline timestamps (and disable driver timestamps) if so desired
+
+-   audioconvert: fix changing the mix-matrix property at runtime
+
+-   appsrc: added support for segment forwarding or custom GstSegments
+    via GstSample, enabled via the handle-segment-change property. This
+    only works for segments in TIME format for now.
+
+-   compositor: various performance optimisations, checkerboard drawing
+    fixes, and support for VUYA format
+
+-   encodebin: Fix and refactor smart encoding; ensure that a single
+    segment is pushed into encoders; improve force-key-unit event
+    handling.
+
+-   opusenc: Add low delay option (audio-type=restricted-lowdelay) to
+    disable the SILK layer and achieve only 5ms delay.
+
+-   opusdec: add stats property to retrieve various decoder statistics.
 
--   h264parse and h265parse will handle SEI recovery point messages and
-    mark recovery points as keyframes as well (in addition to IDR
-    frames)
+-   uridecodebin3: Let decodebin3 do its stream selection if no one
+    answers
 
--   webrtcbin: "add-turn-server" action signal to pass multiple ICE
-    relays (TURN servers).
+-   decodebin3: Avoid overriding explicit user selection of streams
 
--   The removesilence element has received various new features and
-    properties, such as a
-    "threshold"1 property, detecting silence only after minimum   silence time/buffers, a“silent”property to control bus message   notifications as well as a“squash”`
-    property.
+-   playbin: add flag to force use of software decoders over any
+    hardware decoders that might also be available
 
--   AOMedia AV1 decoder gained support for 10/12bit decoding whilst the
-    AV1 encoder supports more image formats and subsamplings now and
-    acquired support for rate control and profile related configuration.
+-   playbin3, playbin: propagate sink context
 
--   The Fraunhofer fdkaac plugin can now be built against the 2.0.0
-    version API and has improved multichannel support
+-   rawvideoparse: Fix tiling support, allow setting colorimetry
 
--   kmssink now supports unpadded 24-bit RGB and can configure mode
-    setting from video info, which enables display of multi-planar
-    formats such as I420 or NV12 with modesetting. It has also gained a
-    number of new properties: The "restore-crtc" property does what it
-    says on the tin and is enabled by default. "plane-properties" and
-    "connector-properties" can be used to pass custom properties to the
-    DRM.
+-   subparse: output plain utf8 text instead of pango-markup formatted
+    text if downstream requires it, useful for interop with elements
+    that only accept utf8-formatted subtitles such as muxers or closed
+    caption converters.
 
--   waylandsink has a "fullscreen" property now.
+-   tcpserversrc, tcpclientsrc: add stats property with TCP connection
+    stats (some are only available on Linux though)
+
+-   timeoverlay: add show-times-as-dates, datetime-format and
+    datetime-epoch properties to display times with dates
+
+-   videorate: Fix changing rate property during playback; reverse
+    playback fixes; update QoS events taking into account our rate
+
+-   videoscale: pass through and transform size sensitive metas instead
+    of just dropping them
+
+Plugins Good
+
+-   avidemux can handle H.265 video now. Our advice remains to
+    immediately cease all contact and communication with anyone who
+    hands you H.265 video in an AVI container, however.
+
+-   avimux: Add support for S24LE and S32LE raw audio and v210 raw video
+    formats; support more than 2 channels of raw audio.
+
+-   souphttpsrc: disable session sharing and cookie jar when the cookies
+    property is set; correctly handle seeks past the end of the content
+
+-   deinterlace: new YADIF deinterlace method which should provide
+    better quality than the existing methods and is LGPL licensed;
+    alternate fields are supported as input to the deinterlacer as well
+    now, and there were also fixes for switching the deinterlace mode on
+    the fly.
+
+-   flvmux: in streamable mode allow adding new pads even if the initial
+    header has already been written. Old clients will only process the
+    initial stream, new clients will get a header with the new streams.
+    The skip-backwards-streams property can be used to force flvmux to
+    skip and drop a few buffers rather than produce timestamps that go
+    backward and confuse librtmp-based clients. There’s also better
+    handling for timestamp rollover when streaming for a long time.
+
+-   imagefreeze: Add live mode, which can be enabled via the new is-live
+    property. In this mode frames will only be output in PLAYING state
+    according to the negotiated framerate, skipping frames if the output
+    can’t keep up (e.g. because it’s blocked downstream). This makes it
+    possible to actually use imagefreeze in live pipelines without
+    having to manually ensure somehow that it starts outputting at the
+    current running time and without still risking to fall behind
+    without recovery.
+
+-   matroskademux, qtdemux: Provide audio lead-in for some lossy formats
+    when doing accurate seeks, to make sure we can actually decode
+    samples at the desired position. This is especially important for
+    non-linear audio/video editing use-cases.
+
+-   matroskademux, matroskamux: Handle interlaced field order (tff, bff)
+
+-   matroskamux:
+
+    -   new offset-to-zero property to offset all streams to start at
+        zero. This takes the timestamp of the earliest stream and
+        offsets it so that it starts at 0. Some software (VLC,
+        ffmpeg-based) does not properly handle Matroska files that start
+        at timestamps much bigger than zero, which could happen with
+        live streams.
+    -   added a creation-time property to explicitly set the creation
+        time to write into the file headers. Useful when remuxing, for
+        example, but also for live feeds where the DateUTC header can be
+        set a UTC timestamp corresponding to the beginning of the file.
+    -   the muxer now also always waits for caps on sparse streams, and
+        warns if caps arrive after the header has already been sent,
+        otherwise the subtitle track might be silently absent in the
+        final file. This might affect applications that send sparse data
+        into matroskamux via an appsrc element, which will usually not
+        send out the initial caps before it sends out the first buffer.
+
+-   pulseaudio: device provider improvements: fix discovery of
+    newly-added devices and hide the alsa device provider if we provide
+    alsa devices
+
+-   qtdemux: raw audio handling improvements, support for AC4 audio, and
+    key-units trickmode interval support
+
+-   qtmux:
+
+    -   was ported to the GstAggregator base class which allows for
+        better handling of live inputs, but might entail minor
+        behavioural changes for sparse inputs if inputs are not live.
+    -   has also gained a force-create-timecode-trak property to create
+        a timecode trak in non-mov flavors, which may not be supported
+        by Apple but is supported by other software such as Final Cut
+        Pro X
+    -   also a force-chunks property to force the creation of chunks
+        even in single-stream files, which is required for Apple ProRes
+        certification.
+    -   also supports 8k resolutions in prefill mode with ProRes.
+
+-   rtpbin gained a request-jitterbuffer signal which allows
+    applications to plug in their own jitterbuffer implementation such
+    as the threadsharing jitterbuffer from the Rust plugins, for
+    example.
+
+-   rtprtxsend: add clock-rate-map property to allow generic RTP input
+    caps without a clock-rate whilst still supporting the max-size-time
+    property for bundled streams.
+
+-   rtpssrcdemux: introduce max-streams property to guard against
+    attacks where the sender changes SSRC for every RTP packet.
+
+-   rtph264pay, rtph264pay: implement STAP-A and various aggregation
+    modes controled by the new aggegrate-mode property: none to not
+    aggregate NAL units (as before), zero-latency to aggregate NAL units
+    until a VCL or suffix unit is included, or max to aggregate all NAL
+    units with the same timestamp (which adds one frame of latency). The
+    default has been kept at none for backwards compatibility reasons
+    and because various RTP/RTSP implementions don’t handle aggregation
+    well. For WebRTC use cases this should be set to zero-latency,
+    however.
+
+-   rtpmp4vpay: add support for config-interval=-1 to resend headers
+    with each IDR keyframe, like other video payloaders.
+
+-   rtpvp8depay: Add wait-for-keyframe property for waiting until the
+    next keyframe after packet loss. Useful if the video stream was not
+    encoded with error resilience enabled, in which case packet loss
+    tends to cause very bad artefacts when decoding, and waiting for the
+    next keyframe instead improves user experience considerably.
+
+-   splitmuxsink and splitmuxsrc can now handle auxiliary video streams
+    in addition to the primary video stream. The primary video stream is
+    still used to select fragment cut points at keyframe boundaries.
+    Auxilliary video streams may be broken up at any packet - so
+    fragments may not start with a keyframe for those streams.
+
+-   splitmuxsink:
+
+    -   new muxer-preset and sink-preset properties for setting
+        muxer/sink presets
+    -   a new start-index property to set the initial fragment id
+    -   and a new muxer-pad-map property which explicitly maps
+        splitmuxsink pads to the muxer pads they should connect to,
+        overriding the implicit logic that tries to match pads but
+        yields arbitrary names.
+    -   Also includes the actual sink element in the fragment-opened and
+        fragment-closed element messages now, which is especially useful
+        for sinks without a location property or when finalisation of
+        the fragments is done asynchronously.
+
+-   videocrop: add support for Y444, Y41B and Y42B pixel formats
+
+-   vp8enc, vp9enc: change default value of VP8E_SET_STATIC_THRESHOLD
+    from 0 to 1 which matches what Google WebRTC does and results in
+    lower CPU usage; also added a new bit-per-pixel property to select a
+    better default bitrate
+
+-   v4l2: add support for ABGR, xBGR, RGBA, and RGBx formats and for
+    handling interlaced video in alternate fields interlace mode (one
+    field per buffer instead of one frame per picture with both fields
+    interleaved)
+
+-   v4l2: Profile and level probing support for H264, H265, MPEG-4,
+    MPEG-2, VP8, and VP9 video encoders and decoders
+
+Plugins Ugly
+
+-   asfdemux: extract more metadata: disc number and disc count
+
+-   x264enc:
+
+    -   respect YouTube bitrate recommendation when user sets the
+        YouTube profile preset
+    -   separate high-10 video formats from 8-bit formats to improve
+        depth negotiation and only advertise suitable input raw formats
+        for the desired output depth
+    -   forward downstream colorimetry and chroma-site restrictions to
+        upstream elements
+    -   support more color primaries/mappings
+
+Plugins Bad
+
+-   av1enc: add threads, row-mt and tile-{columns,rows} properties for
+    this AOMedia AV1 encoder
+
+-   ccconverter: implement support for CDP framerate conversions
+
+-   ccextractor: Add remove-caption-meta property to remove caption
+    metas from the outgoing video buffers
+
+-   decklink: add support for 2K DCI video modes, widescreen NTSC/PAL,
+    and for parsing/outputting AFD/Bar data. Also implement a simple
+    device provider for Decklink devices.
+
+-   dtlsrtpenc: add rtp-sync property which synchronises RTP streams to
+    the pipeline clock before passing them to funnel for merging with
+    RTCP.
+
+-   fdkaac: also decode MPEG-2 AAC; encoder now supports more
+    multichannel/surround sound layouts
+
+-   hlssink2: add action signals for custom playlist/fragment handling:
+    Instead of always going through the file system API we allow the
+    application to modify the behaviour. For the playlist itself and
+    fragments, the application can provide a GOutputStream. In addition
+    the sink notifies the application whenever a fragment can be
+    deleted.
+
+-   interlace: can now output data in alternate fields mode; added field
+    switching mode for 2:2 field pattern
+
+-   iqa: Add a mode property to enable strict mode that checks that all
+    the input streams have the exact same number of frames; also
+    implement the child proxy interface
+
+-   mpeg2enc: add disable-encode-retries property for lower CPU usage
+
+-   mpeg4videoparse: allow re-sending codec config at IDR via
+    config-interval=-1
+
+-   mpegtsparse: new alignment property to determine number of TS
+    packets per output buffer, useful for feeding an MPEG-TS stream for
+    sending via udpsink. This can be used in combination with the
+    split-on-rai property that makes sure to start a new output buffer
+    for any TS packet with the Random Access Indicator set. Also set
+    delta unit buffer flag on non-random-access buffers.
+
+-   mpegdemux: add an ignore-scr property to ignore the SCR in
+    non-compliant MPEG-PS streams with a broken SCR, which will work as
+    long as PTS/DTS in the PES header is consistently increasing.
+
+-   tsdemux:
+
+    -   add an ignore-pcr property to ignore MPEG-TS streams with broken
+        PCR streams on which we can’t reliably recover correct
+        timestamps.
+    -   new latency property to allow applications to lower the
+        advertised worst-case latency of 700ms if they know their
+        streams support this (must have timestamps in higher frequency
+        than required by the spec)
+    -   support for AC4 audio
+
+-   msdk - Intel Media SDK plugin for hardware-accelerated video
+    decoding and encoding on Windows and Linux:
+
+    -   mappings for more video formats: Y210, Y410, P012_LE, Y212_LE
+    -   encoders now support bitrate changes and input format changes in
+        playing state
+    -   msdkh264enc, msdkh265enc: add support for CEA708 closed caption
+        insertion
+    -   msdkh264enc, msdkh265enc: set Region of Interest (ROI) region
+        from ROI metas
+    -   msdkh264enc, msdkh265enc: new tune property to enable low-power
+        mode
+    -   msdkh265enc: add support 12-bit 4:2:0 encoding and 8-bit 4:2:2
+        encoding and VUYA, Y210, and Y410 as input formats
+    -   msdkh265enc: add support for screen content coding extension
+    -   msdkh265dec: add support for main-12/main-12-intra,
+        main-422-10/main-422-10-intra 10bit,
+        main-422-10/main-422-10-intra 8bit,
+        main-422-12/main-422-12-intra, main-444-10/main-444-10-intra,
+        main-444-12/main-444-12-intra, and main-444 profiles
+    -   msdkvp9dec: add support for 12-bit 4:4:4
+    -   msdkvpp: add support for Y410 and Y210 formats, cropping via
+        properties, and a new video-direction property.
+
+-   mxf: Add support for CEA-708 CDP from S436 essence tracks. mxfdemux
+    can now handle Apple ProRes
+
+-   nvdec: add H264 + H265 stateless codec implementation nvh264sldec
+    and nvh265sldec with fewer features but improved latency. You can
+    set the environment variable GST_USE_NV_STATELESS_CODEC=h264 to use
+    the stateless decoder variant as nvh264dec instead of the “normal”
+    NVDEC decoder implementation.
+
+-   nvdec: add support for 12-bit 4:4:4/4:2:0 and 10-bit 4:2:0 decoding
+
+-   nvenc:
+
+    -   add more rate-control options, support for B-frame encoding (if
+        device supports it), an aud property to toggle Access Unit
+        Delimiter insertion, and qp-{min,max,const}-{i,p,b} properties.
+    -   the weighted-pred property enables weighted prediction.
+    -   support for more input formats, namely 8-bit and 10-bit RGB
+        formats (BGRA, RGBA, RGB10A2, BGR10A2) and YV12 and VUYA.
+    -   on-the-fly resolution changes are now supported as well.
+    -   in case there are multiple GPUs on the system, there are also
+        per-GPU elements registered now, since different devices will
+        have different capabilities.
+    -   nvh265enc can now support 10-bit YUV 4:4:4 encoding and 8-bit
+        4:4:4 / 10-bit 4:2:0 formats up to 8K resolution (with some
+        devices). In case of HDR content HDR related SEI nals will be
+        inserted automatically.
+
+-   openjpeg: enable multi-threaded decoding and add support for
+    sub-frame encoding (for lower latency)
+
+-   rtponviftimestamp: add opt-out “drop-out-of-segment” property
+
+-   spanplc: new stats property
+
+-   srt: add support for IPv6 and for using hostnames instead of IP
+    addresses; add streamid property, but also allow passing the id via
+    the stream URI; add wait-for-connection property to srtsink
+
+-   timecodestamper: this element was rewritten with an updated API
+    (properties); it has gained many new properties, seeking support and
+    support for linear timecode (LTC) from an audio stream.
+
+-   uvch264src now comes with a device provider to advertise available
+    camera sources that support this interface (mostly Logitech C920s)
+
+-   wpe: Add software rendering support and support for mouse scroll
+    events
+
+-   x265enc: support more 8/10/12 bits 4:2:0, 4:2:2 and 4:4:4 profiles;
+    add support for mastering display info and content light level
+    encoding SEIs
+
+gst-libav
+
+-   Add mapping for SpeedHQ video codec used by NDI
+
+-   Add mapping for aptX and aptX-HD
+
+-   avivf_mux: support VP9 and AV1
+
+-   avvidenc: shift output buffer timestamps and output segment by 1h
+    just like x264enc does, to allow for negative DTS.
+
+-   avviddec: Limit default number of decoder threads on systems with
+    more than 16 cores, as the number of threads used in avdec has a
+    direct impact on the latency of the decoder, which is of as many
+    frames as threads, so a large numbers of threads can make for
+    latency levels that can be problematic in some applications.
+
+-   avviddec: Add thread-type property that allows applications to
+    specify the preferred multithreading method (auto, frame, slice).
+    Note that thread-type=frame may introduce additional latency
+    especially in live pipelines, since it introduces a decoding delay
+    of number of thread frames.
 
 Plugin and library moves
 
--   The stereo element was moved from -bad into the existing audiofx
-    plugin in -good. If you get duplicate type registration warnings
-    when upgrading, check that you don’t have a stale gststereo plugin
-    lying about somewhere.
-
-GstVideoAggregator, compositor, and OpenGL mixer elements moved from -bad to -base
-
-GstVideoAggregator is a new base class for raw video mixers and muxers
-and is based on [GstAggregator][aggregator]. It provides defined-latency
-mixing of raw video inputs and ensures that the pipeline won’t stall
-even if one of the input streams stops producing data.
-
-As part of the move to stabilise the API there were some last-minute API
-changes and clean-ups, but those should mostly affect internal elements.
-Most notably, the "ignore-eos" pad property was renamed to
-"repeat-after-eos" and the conversion code was moved to a
-GstVideoAggregatorConvertPad subclass to avoid code duplication, make
-things less awkward for subclasses like the OpenGL-based video mixer,
-and make the API more consistent with the audio aggregator API.
-
-It is used by the compositor element, which is a replacement for
-‘videomixer’ which did not handle live inputs very well. compositor
-should behave much better in that respect and generally behave as one
-would expected in most scenarios.
-
-The compositor element has gained support for per-pad blending mode
-operators (SOURCE, OVER, ADD) which determines what operator to use for
-blending this pad over the previous ones. This can be used to implement
-crossfading.
-
-A number of OpenGL-based video mixer elements (glvideomixer, glmixerbin,
-glvideomixerelement, glstereomix, glmosaic) which are built on top of
-GstVideoAggregator have also been moved from -bad to -base now. These
-elements have been merged into the existing OpenGL plugin, so if you get
-duplicate type registration warnings when upgrading, check that you
-don’t have a stale gstopenglmixers plugin lying about somewhere.
+-   There were no plugin moves or library moves in this cycle.
 
-Plugin removals
+-   The rpicamsrc element was moved into -good from an external
+    repository on github.
 
-The following plugins have been removed from gst-plugins-bad:
+Plugin removals
 
--   The experimental daala plugin has been removed, since it’s not so
-    useful now that all effort is focused on AV1 instead, and it had to
-    be enabled explicitly with --enable-experimental anyway.
+The following elements or plugins have been removed:
 
--   The spc plugin has been removed. It has been replaced by the gme
-    plugin.
+-   The yadif video deinterlacing plugin from gst-plugins-bad, which was
+    one of the few GPL licensed plugins, has been removed in favour of
+    deinterlace method=yadif.
 
--   The acmmp3dec and acmenc plugins for Windows have been removed. ACM
-    is an ancient legacy API and there was no point in keeping them
-    around for a licensed mp3 decoder now that mp3 patents have expired
-    and we have a decoder in -good. We also didn’t ship these in our
-    cerbero-built Windows packages, so it’s unlikely that they’ll be
-    missed.
+-   The avdec_cdgraphics CD Graphics video decoder element from
+    gst-libav was never usable in GStreamer and we now have a cdgdec
+    element written in Rust in gst-plugins-rs to replace it.
 
+-   The VDPAU plugin has been unmaintained and unsupported for a very
+    long time and does not have the feature set we expect from
+    hardware-accelerated video decoders. It’s been superseded by the
+    nvcodec plugin leveraging NVIDIA’s NVDEC API.
 
 Miscellaneous API additions
 
--   GstBitwriter: new generic bit writer API to complement the existing
-    bit reader
-
--   gst_buffer_new_wrapped_bytes() creates a wrap buffer from a GBytes
-
--   gst_caps_set_features_simple() sets a caps feature on all the
-    structures of a GstCaps
-
--   New GST_QUERY_BITRATE query: This allows determining from downstream
-    what the expected bitrate of a stream may be which is useful in
-    queue2 for setting time based limits when upstream does not provide
-    timing information. tsdemux, qtdemux and matroskademux have basic
-    support for this query on their sink pads.
-
--   elements: there is a new “Hardware” class specifier. Elements
-    interacting with hardware devices should specify this classifier in
-    their element factory class metadata. This is useful to advertise as
-    one might need to put such elements into READY state to test if the
-    hardware is present in the system for example.
-
--   protection: Add a new definition for unspecified system protection
-
--   take functions for various mini objects that didn’t have them yet:
-    gst_query_take(), gst_message_take(), gst_tag_list_take(),
-    gst_buffer_list_take(). Unlike the various _replace() functions
-    _take() does not increase the reference count but takes ownership of
-    the mini object passed.
-
--   clear functions for various mini object types and GstObject which
-    unrefs the object or mini object (if non-NULL) and sets the variable
-    pointed to to NULL: gst_clear_structure(), gst_clear_tag_list(),
-    gst_clear_query(), gst_clear_message(), gst_clear_event(),
-    gst_clear_caps(), gst_clear_buffer_list(), gst_clear_buffer(),
-    gst_clear_mini_object(), gst_clear_object()
-
--   miniobject: new API gst_mini_object_add_parent() and
-    gst_mini_object_remove_parent()to set parent pointers on mini objects to ensure correct writability: Every container of miniobjects now needs to store itself as parent in the child object, and remove itself again later. A mini object is then only writable if there is at most one parent, that parent is writable itself, and the reference count of the mini object is 1.GstBuffer(for memories),GstBufferList(for buffers),GstSample(for caps, buffer, bufferlist), andGstVideoOverlayComposition`
-    were updated accordingly. Without this it was possible to have
-    e.g. a buffer list with a refcount of 2 used in two places at once
-    that both modify the same buffer with refcount 1 at the same time
-    wrongly thinking it is writable even though it’s really not.
-
--   poll: add API to watch for POLLPRI and stop treating POLLPRI as a
-    read. This is useful to wait for video4linux events which are
-    signalled via POLLPRI.
-
--   sample: new API to update the contents of a GstSample and make it
-    writable: gst_sample_set_buffer(), gst_sample_set_caps(),
-    gst_sample_set_segment(), gst_sample_set_info(), plus
-    gst_sample_is_writable() and gst_sample_make_writable(). This makes
-    it possible to reuse a sample object and avoid unnecessary memory
-    allocations, for example in appsink.
-
--   ClockIDs now keep a weak reference to underlying clock to avoid
-    crashes in basesink in corner cases where a clock goes away while
-    the ClockID is still in use, plus some new API
-    (gst_clock_id_get_clock(), gst_clock_id_uses_clock()) to check the
-    clock a ClockID is linked to.
-
--   The GstCheck unit test library gained a
-    fail_unless_equals_clocktime() convenience macro as well as some new
-    GstHarness API for for proposing meta APIs from the allocation
-    query: gst_harness_add_propose_allocation_meta(). ASSERT_CRITICAL()
-    checks in unit tests are now skipped if GStreamer was compiled with
-    GST_DISABLE_GLIB_CHECKS.
-
--   gst_audio_buffer_truncate() convenience function to truncate a raw
-    audio buffer
-
-
-Miscellaneous performance and memory optimisations
+GStreamer core
+
+-   gst_task_resume(): This new API allows resuming a task if it was
+    paused, while leaving it in stopped state if it was stopped or not
+    started yet. This can be useful for callback-based driver workflows,
+    where you basically want to pause and resume the task when buffers
+    are notified while avoiding the race with a gst_task_stop() coming
+    from another thread.
+
+-   info: add printf extensions GST_TIMEP_FORMAT and GST_STIMEP_FORMAT
+    for printing GstClockTime/GstClockTimeDiff pointers, which is much
+    more convenient to use in debug log statements than the usual
+    GST_TIME_FORMAT-followed-by-GST_TIME_ARGS dance. Also add an
+    explicit GST_STACK_TRACE_SHOW_NONE enum value.
+
+-   gst_element_get_current_clock_time() and
+    gst_element_get_current_running_time(): new helper functions for
+    getting an element clock’s time, and the clock time minus base time,
+    respectively. Useful when adding additional input branches to
+    elements such as compositor, audiomixer, flvmux, interleave or
+    input-selector to determine initial pad offsets and such.
+
+-   seeking: Add GST_SEEK_FLAG_TRICKMODE_FORWARD_PREDICTED to just skip
+    B-frames during trick mode, showing both keyframes + P-frame, and
+    add support for it in h264parse and h265parse.
+
+-   elementfactory: add GST_ELEMENT_FACTORY_TYPE_HARDWARE to allow
+    elements to advertise that they are hardware-based or interact with
+    hardware. This has multiple applications:
+
+    -   it makes it possible to easily differentiate hardware and
+        software based element implementations such as audio or video
+        encoders and decoders. This is useful in order to force the use
+        of software decoders for specific use cases, or to check if a
+        selected decoder is actually hardware-accelerated or not.
+    -   elements interacting with hardware and their respective drivers
+        typically don’t know the actually supported capabilities until
+        the element is set into at least READY state and can open a
+        device handle and probe the hardware.
+
+-   gst_uri_from_string_escaped(): identical to gst_uri_from_string()
+    except that the userinfo and fragment components of the URI will not
+    be unescaped while parsing. This is needed for correctly parsing
+    usernames or passwords with : in them .
+
+-   paramspecs: new GstParamSpec flag GST_PARAM_CONDITIONALLY_AVAILABLE
+    to indicate that a property might not always exist.
+
+-   gst_bin_iterate_all_by_element_factory_name() finds elements in a
+    bin by factory name
+
+-   pad: gst_pad_get_single_internal_link() is a new convenience
+    function to return the single internal link of a pad, which is
+    useful e.g. to retrieve the output pad of a new multiqueue request
+    pad.
+
+-   datetime: Add constructors to create datetimes with timestamps in
+    microseconds, gst_date_time_new_from_unix_epoch_local_time_usecs()
+    and gst_date_time_new_from_unix_epoch_utc_usecs().
+
+-   gst_debug_log_get_lines() gets debug log lines formatted in the same
+    way the default log handler would print them
+
+-   GstSystemClock: Add GST_CLOCK_TYPE_TAI as GStreamer abstraction for
+    CLOCK_TAI, to support transmission offloading features where network
+    packets are timestamped with the time they are deemed to be actually
+    transmitted. Useful in combination with the new AVTP plugin.
+
+-   miscellaneous utility functions: gst_clear_uri(),
+    gst_structure_take().
+
+-   harness: Added gst_harness_pull_until_eos()
+
+-   GstBaseSrc:
+
+    -   gst_base_src_new_segment() allows subclasses to update the
+        segment to be used at runtime from the ::create() function. This
+        deprecates gst_base_src_new_seamless_segment()
+    -   gst_base_src_negotiate() allows subclasses to trigger format
+        renegotiation at runtime from inside the ::create() or ::alloc()
+        function
+
+-   GstBaseSink: new stats property and gst_base_sink_get_stats() method
+    to retrieve various statistics such as average frame rate and
+    dropped/rendered buffers.
+
+-   GstBaseTransform: gst_base_transform_reconfigure() is now public
+    API, useful for subclasses that need to completely re-implement the
+    ::submit_input_buffer() virtual method
+
+-   GstAggregator:
+
+    -   gst_aggregator_update_segment() allows subclasses to update the
+        output segment at runtime. Subclasses should use this function
+        rather than push a segment event onto the source pad directly.
+    -   new sample selection API:
+        -   subclasses should now call gst_aggregator_selected_samples()
+            from their ::aggregate() implementation to signal that they
+            have selected the next samples they will aggregate
+        -   GstAggregator will then emit the samples-selected signal
+            where handlers can then look up samples per pad via
+            gst_aggregator_peek_next_sample().
+        -   This is useful for example to atomically update input pad
+            properties in mixer subclasses such as compositor.
+            Applications can now update properties with precise control
+            of when these changes will take effect, and for which input
+            buffer(s).
+    -   gst_aggregator_finish_buffer_list() allows subclasses to push
+        out a buffer list, improving efficiency in some cases.
+    -   a ::negotiate() virtual method was added, for consistency with
+        other base classes and to allow subclasses to completely
+        override the negotiation behaviour.
+    -   the new ::sink_event_pre_queue() and ::sink_query_pre_queue()
+        virtual methods allow subclasses to intercept or handle
+        serialized events and queries before they’re queued up
+        internally.
+
+GStreamer Plugins Base Libraries
+
+Audio library
+
+-   audioaggregator, audiomixer: new output-buffer-duration-fraction
+    property which allows use cases such as keeping the buffers output
+    by compositor on one branch and audiomixer on another perfectly
+    aligned, by requiring the compositor to output a n/d frame rate, and
+    setting output-buffer-duration-fraction to d/n on the audiomixer.
+
+-   GstAudioDecoder: new max-errors property so applications can
+    configure at what point the decoder should error out, or tell it to
+    just keep going
+
+-   gst_audio_make_raw_caps() and gst_audio_formats_raw() are
+    bindings-friendly versions of the GST_AUDIO_CAPS_MAKE() C macro.
+
+-   gst_audio_info_from_caps() now handles encoded audio formats as well
+
+PbUtils library
+
+-   GstEncodingProfile:
+    -   Do not restrict number of similar profiles in a container
+    -   add GstValue serialization function
+-   codec utils now support more H.264/H.265 profiles/levels and have
+    improved extension handling
+
+RTP library
+
+-   rtpbasepayloader: Add scale-rtptime property for scaling RTP
+    timestamp according to the segment rate (equivalent to RTSP speed
+    parameter). This is useful for ONVIF trickmodes via RTSP.
+
+-   rtpbasepayload: add experimental property for embedding twcc
+    sequencenumbers for Transport-Wide Congestion Control (gated behind
+    the GST_RTP_ENABLE_EXPERIMENTAL_TWCC_PROPERTY environment
+    variable) - more generic API for enabling this is expected to land
+    in the next development cycle.
+
+-   rtcpbuffer: add RTPFB_TYPE_TWCC for Transport-Wide Congestion
+    Control
+
+-   rtpbuffer: add
+    gst_rtp_buffer_get_extension_onebyte_header_from_bytes()``, so that one can parse theGBytes`
+    returned by gst_rtp_buffer_get_extension_bytes()
+
+-   rtpbasedepayload: Add max-reorder property to make the
+    previously-hardcoded value when to consider a sender to have
+    restarted configurable. In some scenarios it’s particularly useful
+    to set max-reorder=0 to disable the behaviour that the depayloader
+    will drop packets: when max-reorder is set to 0 all
+    reordered/duplicate packets are considered coming from a restarted
+    sender.
+
+RTSP library
+
+-   add gst_rtsp_url_get_request_uri_with_control() to create request
+    uri combined with control url
+
+-   GstRTSPConnection: add the possibility to limit the Content-Length
+    for RTSP messages via
+    gst_rtsp_connection_set_content_length_limit(). The same
+    functionality is also exposed in gst-rtsp-server.
+
+SDP library
+
+-   add support for parsing the extmap attribute from caps and storing
+    inside caps The extmap attribute allows mapping RTP extension header
+    IDs to well-known RTP extension header specifications. See RFC8285
+    for details.
+
+Tags library
+
+-   update to latest iso-code and support more languages
+
+-   add tags for acoustid id & acoustid fingerprint, plus MusicBrainz ID
+    handling fixes
+
+Video library
+
+-   High Dynamic Range (HDR) video information representation and
+    signalling enhancements:
+
+    -   New APIs for HDR video information representation and
+        signalling:
+        -   GstVideoMasteringDisplayInfo: display color volume info as
+            per SMPTE ST 2086
+        -   GstVideoContentLightLevel: content light level specified in
+            CEA-861.3, Appendix A.
+        -   plus functions to serialise/deserialise and add them to or
+            parse them from caps
+        -   gst_video_color_{matrix,primaries,transfer}_{to,from}_iso():
+            new utilility functions for conversion from/to ISO/IEC
+            23001-8
+        -   add ARIB STD-B67 transfer chracteristic function
+        -   add SMPTE ST 2084 support and BT 2100 colorimetry
+        -   define bt2020-10 transfer characteristics for clarity:
+            bt707, bt2020-10, and bt2020-12 transfer characteristics are
+            functionally identical but have their own unique values in
+            the specification.
+    -   h264parse, h265parse: Parse mastering display info and content
+        light level from SEIs.
+    -   matroskademux: parse HDR metadata
+    -   matroskamux: Write MasteringMetadata and Max{CLL,FALL}. Enable
+        muxing with HDR meta data if upstream provided it
+    -   avviddec: Extract HDR information if any and map bt2020-10, PQ
+        and HLG transfer functions
+
+-   added bt601 transfer function (for completeness)
+
+-   support for more pixel formats:
+
+    -   Y412 (packed 12 bits 4:4:4:4)
+    -   Y212 (packed 12 bits 4:2:2)
+    -   P012 (semi-planar 4:2:0)
+    -   P016_{LE,BE} (semi-planar 16 bits 4:2:0)
+    -   Y444_16{LE,BE} (planar 16 bits 4:4:4)
+    -   RGB10A2_LE (packed 10-bit RGB with 2-bit alpha channel)
+    -   NV12_32L32 (NV12 with 32x32 tiles in linear order)
+    -   NV12_4L4 (NV12 with 4x4 tiles in linear order)
+
+-   GstVideoDecoder:
+
+    -   new max-errors property so applications can configure at what
+        point the decoder should error out, or tell it to just keep
+        going
+
+    -   new qos property to disable dropping frames because of QoS, and
+        post QoS messages on the bus when dropping frames. This is
+        useful for example in a scenario where the decoded video is
+        tee-ed off to go into a live sink that syncs to the clock in one
+        branch, and an encoding and save to file pipeline in the other
+        branch. In that case one wouldn’t want QoS events from the video
+        sink make the decoder drop frames because that would also leave
+        gaps in the encoding branch then.
+
+-   GstVideoEncoder:
+
+    -   gst_video_encoder_finish_subframe() is new API to push out
+        subframes (e.g. slices), so encoders can split the encoding into
+        subframes, which can be useful to reduce the overall end-to-end
+        latency as we no longer need to wait for the full frame to be
+        encoded to start decoding or sending out the data.
+    -   new min-force-key-unit-interval property allows configuring the
+        minimum interval between force-key-unit requests and prevents a
+        big bitrate increase if a lot of key-units are requested in a
+        short period of time (as might happen in live streaming RTP
+        pipelines when packet loss is detected).
+    -   various force-key-unit event handling fixes
+
+-   GstVideoAggregator, compositor, glvideomixer: expose
+    max-last-buffer-repeat property on pads. This can be used to have a
+    compositor display either the background or a stream on a lower
+    zorder after a live input stream freezes for a certain amount of
+    time, for example because of network issues.
+
+-   gst_video_format_info_component() is new API to find out which
+    components are packed into a given plane, which is useful to prevent
+    us from assuming a 1-1 mapping between planes and components.
+
+-   gst_video_make_raw_caps() and gst_video_formats_raw() are
+    bindings-friendly versions of the GST_VIDEO_CAPS_MAKE() C macro.
+
+-   video-blend: Add support for blending on top of 16 bit per component
+    formats, which makes sure we can support every currently supported
+    raw video format for blending subtitles or logos on top of video.
+
+-   GST_VIDEO_BUFFER_IS_TOP_FIELD() and
+    GST_VIDEO_BUFFER_IS_BOTTOM_FIELD() convenience macros to check
+    whether the video buffer contains only the top field or bottom field
+    of an interlaced picture.
+
+-   GstVideoMeta now includes an alignment field with the
+    GstVideoAlignment so buffer producers can explicitly specify the
+    exact geometry of the planes, allowing users to easily know the
+    padded size and height of each plane. Default values will be used if
+    this is not set.
+
+    Use gst_video_meta_set_alignment() to set the alignment and
+    gst_video_meta_get_plane_size() or gst_video_meta_get_plane_height()
+    to compute the plane sizes or plane heights based on the information
+    in the video meta.
+
+-   gst_video_info_align_full() works like gst_video_info_align() but
+    also retrieves the plane sizes.
+
+MPEG-TS library
+
+-   support for SCTE-35 sections
+
+-   extend support for ATSC tables:
+
+    -   System Time Table (STT)
+    -   Master Guide Table (MGT)
+    -   Rating Region Table (RRT)
+
+Miscellaneous performance, latency and memory optimisations
 
 As always there have been many performance and memory usage improvements
-across all components and modules. Some of them (such as dmabuf
-import/export) have already been mentioned elsewhere so won’t be
-repeated here.
+across all components and modules. Some of them have already been
+mentioned elsewhere so won’t be repeated here.
 
 The following list is only a small snapshot of some of the more
 interesting optimisations that haven’t been mentioned in other contexts
 yet:
 
--   The GstVideoEncoder and GstVideoDecoder base classes now release the
-    STREAM_LOCK when pushing out buffers, which means (multi-threaded)
-    encoders and decoders can now receive and continue to process input
-    buffers whilst waiting for downstream elements in the pipeline to
-    process the buffer that was pushed out. This increases throughput
-    and reduces processing latency, also and especially for
-    hardware-accelerated encoder/decoder elements.
+-   caps negotiation, structure and GValue performance optimizations
+
+-   systemclock: clock waiting performance improvements (moved from
+    GstPoll to GCond for waiting), especially on Windows.
+
+-   rtpsession: add support for buffer lists on the recv path for better
+    performance with higher packet rate streams.
+
+-   rtpjitterbuffer: internal timer handling has been rewritten for
+    better performance, see Nicolas’ talk “Revisiting RTP Jitter Buffer
+    Timers” for more details.
 
--   GstQueueArray has seen a few API additions
-    (gst_queue_array_peek_nth(), gst_queue_array_set_clear_func(),
-    gst_queue_array_clear()) so that it can be used in other places like
-    GstAdapter instead of a GList, which reduces allocations and
-    improves performance.
+-   H.264/H.265 parsers and RTP payloaders/depayloaders have been
+    optimised for latency to make sure data is processed and pushed out
+    as quickly as possible
 
--   appsink now reuses the sample object in pull_sample() if possible
+-   video-scaler: correctness and performance improvements, esp. for
+    interlaced formats and GBRA
 
--   rtpsession only starts the RTCP thread when it’s actually needed now
+-   GstVideoEncoder has gained new API to push out subframes
+    (e.g. slices), so encoders can split the encoding into subframes,
+    which can be useful to reduce the overall end-to-end latency as we
+    no longer need to wait for the full frame to be encoded to start
+    decoding or sending out the data.
 
--   udpsrc uses a buffer pool now and the GstUdpSrc object structure was
-    optimised for better cache performance
+    This is complemented by the new GST_VIDEO_BUFFER_FLAG_MARKER which
+    is a video-specific buffer flag to mark the end of a video frame, so
+    elements can know that they have received all data for a frame
+    without waiting for the beginning of the next frame. This is similar
+    to how the RTP marker flag is used in many RTP video mappings.
 
-GstPlayer
+    The video encoder base class now also releases the internal stream
+    lock before pushing out data, so as to not block the input side of
+    things from processing more data in the meantime.
 
--   API was added to fine-tune the synchronisation offset between
-    subtitles and video
+Miscellaneous other changes and enhancements
 
+-   it is now possible to modify the initial rank of plugin features
+    without modifying the source code or writing code to do so
+    programmatically via the GST_PLUGIN_FEATURE_RANK environment
+    variable. Users can adjust the rank of plugin(s) by passing a
+    comma-separated list of feature:rank pairs where rank can be a
+    numerical value or one of NONE, MARGINAL, SECONDARY, PRIMARY, and
+    MAX. Example: GST_PLUGIN_FEATURE_RANK=myh264dec:MAX,avdec_h264:NONE
+    sets the rank of the myh264dec element feature to the maximum and
+    that of avdec_h264 to 0 (none), thus ensuring that myh264dec is
+    prefered as H264 decoder in an autoplugging context.
 
-Miscellaneous changes
+-   GstDeviceProvider now does a static probe on start as fallback for
+    providers that don’t support dynamic probing to make things easier
+    for users
 
--   As a result of moving to different FFmpeg APIs, encoder and decoder
-    elements exposed by the GStreamer FFmpeg wrapper plugin (gst-libav)
-    may have seen possibly incompatible changes to property names and/or
-    types, and not all properties exposed might be functional. We are
-    still reviewing the new properties and aim to minimise breaking
-    changes at least for the most commonly-used properties, so please
-    report any issues you run into!
+WebRTC
+
+-   webrtcbin now contains initial support for renegotiation involving
+    stream addition and removal. There are a number of caveats to this
+    initial renegotiation support and many complex scenarios are known
+    to require some work.
+
+-   webrtcbin now exposes the internal ICE object for advanced
+    configuration options. Using the internal ICE object, it is possible
+    to toggle UDP or TCP connection usage as well as provide local
+    network addresses.
+
+-   Fix a number of call flows within webrtcbin’s GstPromise handling
+    where a promise was never replied to. This has been fixed and now a
+    promise will always receive a reply.
+
+-   webrtcbin now exposes a latency property for configuring the
+    internal rtpjitterbuffer latency and buffering when receiving
+    streams.
+
+-   webrtcbin now only synchronises the RTP part of a stream, allowing
+    RTCP messages to skip synchronisation entirely.
+
+-   Fixed most of the webrtcbin state properties (connection-state,
+    ice-connection-state, signaling-state, but not ice-gathering-state
+    as that requires newer API in libnice and will be fixed in the next
+    release series) to advance through the state values correctly. Also
+    implemented DTLS connection states in the DTLS elements so that
+    peer-connection-state is not always new.
+
+-   webrtcbin now accounts for the a=ice-lite attribute in a remote SDP
+    offer and will configure the internal ICE implementation
+    accordingly.
+
+-   webrtcbin will now resolve .local candidate addresses using the
+    system DNS resolver. .local candidate addresses are now produced by
+    web browsers to help protect the privacy of users.
+
+-   webrtcbin will now add candidates found in the SDP to the internal
+    ICE agent. This was previously unsupported and required using the
+    add-ice-candidate signal manually from the application.
+
+-   webrtcbin will now correctly parse a TURN URI that contains a
+    username or password with a : in it.
+
+-   The GStreamer WebRTC library gained a GstWebRTCDataChannel object
+    roughly matching the interface exposed by the WebRTC specification
+    to allow for easier binding generation and use of data channels.
 
 OpenGL integration
 
--   The OpenGL mixer elements have been moved from -bad to
-    gst-plugins-base (see above)
+GStreamer OpenGL bindings/build related changes
 
--   The Mesa GBM backend now supports headless mode
+-   The GStreamer OpenGL library (libgstgl) now ships pkg-config files
+    for platform-specific API where libgstgl provides a public
+    integration interface and a pkg-config file for a dependency on the
+    detected OpenGL headers. The new list of pkg-config files in
+    addition to the original gstreamer-gl-1.0 are gstreamer-gl-x11-1.0,
+    gstreamer-gl-wayland-1.0, gstreamer-gl-egl-1.0, and
+    gstreamer-gl-prototypes-1.0 (for OpenGL headers when including
+    gst/gl/gstglfuncs.h).
 
--   gloverlaycompositor: New OpenGL-based compositor element that
-    flattens any overlays from GstVideoOverlayCompositionMetas into the
-    video stream.
+-   GStreamer OpenGL now ships some platform-specific introspection data
+    for platforms that have a public interface. This should allow for
+    easier integration with bindings involving platform specific
+    functionality. The new introspection data files are named
+    GstGLX11-1.0, GstGLWayland-1.0, and GstGLEGL-1.0.
 
--   glalpha: New element that adds an alpha channel to a video stream.
-    The values of the alpha channel can either be set to a constant or
-    can be dynamically calculated via chroma keying. It is similar to
-    the existing alpha element but based on OpenGL. Calculations are
-    done in floating point so results may not be identical to the output
-    of the existing alpha element.
+GStreamer OpenGL Features
 
--   glupload: Implement direct dmabuf uploader, the idea being that some
-    GPUs (like the Vivante series) can actually perform the YUV->RGB
-    conversion internally, so no custom conversion shaders are needed.
-    To make use of this feature, we need an additional uploader that can
-    import DMABUF FDs and also directly pass the pixel format, relying
-    on the GPU to do the conversion.
+-   The iOS implementation no longer accesses UIKit objects off the main
+    thread fixing a loud warning message when used in iOS applications.
 
+-   Support for mouse and keyboard handling using the GstNavigation
+    interface was added for the wayland implementation complementing the
+    already existing support for the X11 and Windows implementations.
 
-Tracing framework and debugging improvements
+-   A new helper base class for source elements, GstGLBaseSrc is
+    provided to ease writing source elements producing OpenGL video
+    frames.
 
--   There is now a GDB PRETTY PRINTER FOR VARIOUS GSTREAMER TYPES: For
-    GstObject pointers the type and name is added, e.g.
-    0x5555557e4110 [GstDecodeBin|decodebin0]. For GstMiniObject pointers
-    the object type is added, e.g. 0x7fffe001fc50 [GstBuffer]. For
-    GstClockTime and GstClockTimeDiff the time is also printed in human
-    readable form, e.g. 150116219955 [+0:02:30.116219955].
-
--   GDB EXTENSION WITH TWO CUSTOM GDB COMMANDS gst-dot AND gst-print:
-
-    -   gst-dot creates dot files that a very close to what
-        GST_DEBUG_BIN_TO_DOT_FILE() produces, but object properties and
-        buffer contents such as codec-data in caps are not available.
-
-    -   gst-print produces high-level information about a GStreamer
-        object. This is currently limited to pads for GstElements and
-        events for the pads. The output may look like this:
-
-                (gdb) gst-print pad.object.parent
-                GstMatroskaDemux (matroskademux0) {
-                    SinkPad (sink, pull) {
-                    }
-                    SrcPad (video_0, push) {
-                      events:
-                        stream-start:
-                          stream-id: 0463ccb080d00b8689bf569a435c4ff84f9ff753545318ae2328ea0763fd0bec/001:1274058367
-                        caps: video/x-theora
-                          width: 1920
-                          height: 800
-                          pixel-aspect-ratio: 1/1
-                          framerate: 24/1
-                          streamheader: < 0x5555557c7d30 [GstBuffer], 0x5555557c7e40 [GstBuffer], 0x7fffe00141d0 [GstBuffer] >
-                        segment: time
-                          rate: 1
-                        tag: global
-                          container-format: Matroska
-                    }
-                    SrcPad (audio_0, push) {
-                      events:
-                        stream-start:
-                          stream-id: 0463ccb080d00b8689bf569a435c4ff84f9ff753545318ae2328ea0763fd0bec/002:1551204875
-                        caps: audio/mpeg
-                          mpegversion: 4
-                          framed: true
-                          stream-format: raw
-                          codec_data: 0x7fffe0014500 [GstBuffer]
-                          level: 2
-                          base-profile: lc
-                          profile: lc
-                          channels: 2
-                          rate: 44100
-                        segment: time
-                          rate: 1
-                        tag: global
-                          container-format: Matroska
-                        tag: stream
-                          audio-codec: MPEG-4 AAC audio
-                          language-code: en
-                    }
-                }
-
--   gst_structure_to_string() now serialises the actual value of
-    pointers when serialising GstStructures instead of claiming they’re
-    NULL. This makes debug logging in various places less confusing,
-    because it’s clear now that structure fields actually hold valid
-    objects. Such object pointer values will never be deserialised
-    however.
+-   Support for some more 12-bit and 16-bit video formats (Y412_LE,
+    Y412_BE, Y212_LE, Y212_BE, P012_LE, P012_BE, P016, NV16, NV61) was
+    added to glcolorconvert.
+
+-   glupload can now import dma-buf’s into external-oes textures.
 
+-   A new display type for EGLDevice-based systems was added. It is
+    currently opt-in by using either the GST_GL_PLATFORM=egl-device
+    environment variable or manual construction
+    (gst_gl_display_egl_device_new*()) due to compatibility issues with
+    some platforms.
+
+-   Support was added for WinRT/UWP using the ANGLE project for running
+    OpenGL-based pipelines within a UWP application.
+
+-   Various elements now support changing the GstGLDisplay to be used at
+    runtime in simple cases. This is primarily helpful for changing or
+    adding an OpenGL-based video sink that must share an OpenGL context
+    with an external source to an already running pipeline.
+
+GStreamer Vulkan integration
+
+-   There is now a GStreamer Vulkan library to provide integration
+    points and helpers with applications and external GStreamer Vulkan
+    based elements. The structure of the library is modelled similarly
+    to the already existing GStreamer OpenGL library. Please note that
+    the API is still unstable and may change in future releases,
+    particularly around memory handling. The GStreamer Vulkan library
+    contains objects for sharing the vkInstance, vkDevice, vkQueue,
+    vkImage, VkMemory, etc with other elements and/or the application as
+    well as some helper objects for using Vulkan in an application or
+    element.
+
+-   Added support for building and running on/for the Android and
+    Windows systems to complement the existing XCB, Wayland, MacOS, and
+    iOS implementations.
+
+-   XCB gained support for mouse/keyboard events using the GstNavigation
+    API.
+
+-   New vulkancolorconvert element for converting between color formats.
+    vulkancolorconvert can currently convert to/from all 8-bit RGBA
+    formats as well as 8-bit RGBA formats to/from the YUV formats AYUV,
+    NV12, and YUY2.
+
+-   New vulkanviewconvert element for converting between stereo view
+    layouts. vulkanviewconvert can currently convert between all of the
+    single memory formats (side-by-side, top-bottom, column-interleaved,
+    row-interleaved, checkerboard, left, right, mono).
+
+-   New vulkanimageidentity element for a blit from the input vulkan
+    image/s to a new vulkan image/s.
+
+-   The vulkansink element can now scale the input image to the output
+    window/surface size where that information is available.
+
+-   The vulkanupload element can now configure a transfer from system
+    memory to VulkanImage-based memory. Previously, this required two
+    vulkanupload elements.
+
+Tracing framework and debugging improvements
+
+-   gst_tracing_get_active_tracers() returns a list of active tracer
+    objects. This can be used to interact with tracers at runtime using
+    GObject API such as action signals. This has been implemented in the
+    leaks tracer for snapshotting and retrieving leaked/active objects
+    at runtime.
+
+-   The leaks tracer can now be interacted with programmatically at
+    runtime via GObject action signals:
+
+    -   get-live-object returns a list of live (allocated) traced
+        objects
+    -   log-live-objects logs a list of live objects into the debug log.
+        This is the same as sending the SIGUSR1 signal on unix systems,
+        but works on all operating systems including Windows.
+    -   activity-start-tracking, activity-get-checkpoint,
+        activity-log-checkpoint, activity-stop-tracking: add support for
+        tracking and checkpointing objects, similar to what was
+        previously available via SIGUSR2 on unix systems, but works on
+        all operating systems including Windows.
+
+-   various GStreamer gdb debug helper improvements:
+
+    -   new ‘gst-pipeline-tree’ command
+    -   more gdb helper functions: gst_element_pad(), gst_pipeline() and
+        gst_bin_get()
+    -   support for queries and buffers
+    -   print more info for segment events, print event seqnums, object
+        pointers and structures
+    -   improve gst-print command to show more pad and element
+        information
 
 Tools
 
--   gst-inspect-1.0 has coloured output now and will automatically use a
-    pager if the output does not fit on a page. This only works in a
-    unix environment and if the output is not piped. If you don’t like
-    the colours you can disable them by setting the
-    GST_INSPECT_NO_COLORS=1 environment variable or passing the
-    --no-colors command line option.
+gst-launch-1.0
 
+-   now prints the pipeline position and duration if available when the
+    pipeline is advancing. This is hopefully more user-friendly and
+    gives visual feedback on the terminal that the pipeline is actually
+    up and running. This can be disabled with the --no-position command
+    line option.
 
-GStreamer RTSP server
+-   the parse-launch pipeline syntax now has support for presets:
+    use@preset=<preset-name>" after an element to load a preset.
 
--   Improved backlog handling when using TCP interleaved for data
-    transport. Before there was a fixed maximum size for backlog
-    messages, which was prone to deadlocks and made it difficult to
-    control memory usage with the watch backlog. The RTSP server now
-    limits queued TCP data messages to one per stream, moving queuing of
-    the data into the pipeline and leaving the RTSP connection
-    responsive to RTSP messages in both directions, preventing all those
-    problems.
+gst-inspect-1.0
 
--   Initial ULP Forward Error Correction support in rtspclientsink and
-    for RECORD mode in the server.
+-   new --color command line option to force coloured output even if not
+    connected to a tty
 
--   API to explicitly enable retransmission requests (RTX)
+gst-tester-1.0 (new)
 
--   Lots of multicast-related fixes
+-   gst-tester-1.0 is a new tool for plugin developers to launch
+    .validatetest files with TAP compatible output, meaning it can
+    easily and cleanly be integrated with the meson test harness. It
+    allows you to use gst-validate (from the gst-devtools module) to
+    write integration tests in any GStreamer repository whilst keeping
+    the tests as close as possible to the code. The tool transparently
+    handles gst-validate being installed or not: if it is not installed
+    those integration tests will simply be skipped.
 
--   rtsp-auth: Add support for parsing .htdigest files
+gst-play-1.0
 
+-   interactive keyboard controls now also work on Windows
 
-GStreamer VAAPI
+gst-transcoder-1.0 (new)
 
--   this section will be filled in in due course
+-   gst-transcoder-1.0 is a new command line tool to transcode one URI
+    into another URI based on the specified encoding profile using the
+    new GstTranscoder API (see above).
 
+GStreamer RTSP server
 
-GStreamer Editing Services and NLE
+-   Fix issue where the first few packets (i.e. keyframes) could
+    sometimes be dropped if the rtsp media pipeline had a live input.
+    This was a regression from GStreamer 1.14. There are more fixes
+    pending for that which will hopefully land in 1.18.1.
+
+-   Fix backpressure handling when sending data in TCP interleave mode
+    where RTSP requests and responses and RTP/RTCP packets flow over the
+    same RTSP TCP connection: The previous implementation would at some
+    point stop sending data to other clients when a single client
+    stopped consuming data or did not consume data fast enough. This
+    obviously created problems for shared media, where the same stream
+    from a single producer pipeline is sent to multiple clients. Instead
+    we now manage a backlog in the server’s stream-transport component
+    and remove slow clients once this backlog exceeds a maximum duration
+    (which is currently hardcoded).
+
+-   Onvif Streaming Specification trick modes support (see section at
+    the beginning)
+
+-   Scale/Speed header support: Speed will deliver the data at the
+    requested speed, which means increasing the data bandwidth for
+    speeds > 1.0. Scale will attempt to do the same without affecting
+    the overall bandwidth requirement vis-a-vis normal playback speed
+    (e.g. it might drop data for fast-forward playback).
+
+-   rtspclientsink: send buffer lists in one go for better performance
 
--   this section will be filled in in due course
+GStreamer VAAPI
 
+-   A lot of work was done adding support for media-driver (iHD), the
+    new VAAPI driver for Intel, mostly for Gen9 onwards.
 
-GStreamer validate
+-   Available color formats and frame sizes are now detected at run-time
+    according to the context configuration.
 
--   this section will be filled in in due course
+-   Gallium drivers have been re-enabled in the allowed drivers list
 
+-   Improved the mapping between VA formats and GStreamer formats by
+    generating a mapping table at run-time since even among different
+    drivers the mapping might be different, particularly for RGB with
+    little endianness.
 
-GStreamer Python Bindings
+-   The experimental Flexible Encoding Infrastructure (FEI) elements
+    have been removed since they were not really actively maintained or
+    tested.
 
--   add binding for gst_pad_set_caps()
+-   Enhanced the juggling of DMABuf buffers and VASurface metas
 
--   pygobject dependency requirement was bumped to >= 3.8
+-   New vaapioverlay element: a compositor element using VA VPP blend
+    capabilities to accelerate overlaying and compositing. Example
+    pipeline:
 
--   new audiotestsrc, audioplot, and mixer plugin examples, and a
-    dynamic pipeline example
+          gst-launch-1.0 -vf videotestsrc ! vaapipostproc ! tee name=testsrc ! queue \
+          ! vaapioverlay sink_1::xpos=300 sink_1::alpha=0.75 name=overlay ! vaapisink \
+          testsrc. ! queue ! overlay.
 
+vaapipostproc
 
-GStreamer C# Bindings
+-   added video-orientation support, supporting frame mirroring and
+    rotation
 
--   bindings for the GstWebRTC library
+-   added cropping support, either via properties (crop-left,
+    crop-right, crop-bottom and crop-top) or buffer meta.
 
+-   new skin-tone-enhancenment-level property which is the iHD
+    replacement of the i965 driver’s sink-tone-level. Both are
+    incompatible with each other, so both were kept.
 
-GStreamer Rust Bindings
+-   handle video colorimetry
 
-The GStreamer Rust bindings are now officially part of the GStreamer
-project and are also maintained in the GStreamer GitLab.
+-   support HDR10 tone mapping
 
-The releases will generally not be synchronized with the releases of
-other GStreamer parts due to dependencies on other projects.
+vaapisink
 
-Also unlike the other GStreamer libraries, the bindings will not commit
-to full API stability but instead will follow the approach that is
-generally taken by Rust projects, e.g.:
+-   resurrected wayland backend for non-weston compositors by extracting
+    the DMABuf from the VASurface and rendering it.
 
-1)  0.12.X will be completely API compatible with all other 0.12.Y
-    versions.
-2)  0.12.X+1 will contain bugfixes and compatible new feature additions.
-3)  0.13.0 will _not_ be backwards compatible with 0.12.X but projects
-    will be able to stay at 0.12.X without any problems as long as they
-    don’t need newer features.
+-   merged the video overlay API for wayland. Now applications can
+    define the “window” to render on.
 
-The current stable release is 0.12.2 and the next release series will be
-0.13, probably around March 2019.
+-   demoted the vaapisink element to secondary rank since libva
+    considers rendering as a second-class feature.
 
-At this point the bindings cover most of GStreamer core (except for most
-notably GstAllocator and GstMemory), and most parts of the app, audio,
-base, check, editing-services, gl, net. pbutils, player, rtsp,
-rtsp-server, sdp, video and webrtc libraries.
+VAAPI Encoders
 
-Also included is support for creating subclasses of the following types
-and writing GStreamer plugins:
+-   new common target-percentage property which is the desired target
+    percentage of bitrate for variable rate control.
 
--   gst::Element
--   gst::Bin and gst::Pipeline
--   gst::URIHandler and gst::ChildProxy
--   gst::Pad, gst::GhostPad
--   gst_base::Aggregator and gst_base::AggregatorPad
--   gst_base::BaseSrc and gst_base::BaseSink
--   gst_base::BaseTransform
+-   encoders now extract their caps from the driver at registration
+    time.
 
-Changes to 0.12.X since 0.12.0
+-   vaapivp9enc: added support for low power mode and support for
+    profile 2 (profile 0 by default)
 
-Fixed
+-   vaapih264enc: new max-qp property that sets the maximum quantization
+    value. Support for ICQ and QBVR bitrate control mode, adding a
+    quality-factor property for these modes. Support baseline profile as
+    constrained-baseline
 
--   PTP clock constructor actually creates a PTP instead of NTP clock
+-   vaapih265enc:
 
-Added
+    -   support for main-444 and main-12 encoding profiles.
+    -   new max-qp property that sets the maximum quantization value.
+    -   support for ICQ and QBVR bitrate control mode, adding a
+        quality-factor property for these modes.
+    -   handle SCC profiles.
+    -   num-tile-cols and num-tile-row properties to specify the number
+        of tiles to use.
+    -   the low-delay-b property was deprecated and is now determined
+        automatically.
+    -   improved profile selection through caps.
 
--   Bindings for GStreamer Editing Services
--   Bindings for GStreamer Check testing library
--   Bindings for the encoding profile API (encodebin)
+VAAPI Decoders
 
--   VideoFrame, VideoInfo, AudioInfo, StructureRef implements Send and
-    Sync now
--   VideoFrame has a function to get the raw FFI pointer
--   From impls from the Error/Success enums to the combined enums like
-    FlowReturn
--   Bin-to-dot file functions were added to the Bin trait
--   gst_base::Adapter implements SendUnique now
--   More complete bindings for the gst_video::VideoOverlay interface,
-    especially
-    gst_video::is_video_overlay_prepare_window_handle_message()
+-   Decoder surfaces are not bound to their context any longer and can
+    thus be created and used dynamically, removing the deadlock
+    headache.
 
-Changed
+-   Reverse playback is now fluid
 
--   All references were updated from GitHub to freedesktop.org GitLab
--   Fix various links in the README.md
--   Link to the correct location for the documentation
--   Remove GitLab badge as that only works with gitlab.com currently
+-   Forward Region-of-Interest (ROI) metas downstream
 
-Changes in git master for 0.13
+-   GLTextureUploadMeta uses DMABuf when GEM is not available. Now
+    Gallium drivers can use this meta for rendering with EGL.
 
-Fixed
+-   vaapivp9dec: support for 4:2:2 and 4:4:4 chroma type streams
 
--   gst::tag::Album is the album tag now instead of artist sortname
+-   vaapih265dec: skip all pictures prior to the first I-frame. Enable
+    passing range extension flags to the driver. Handle SCC profiles.
 
-Added
+-   vaapijpegdec: support for 4:0:0, 4:1:1, 4:2:2 and 4:4:4 chroma types
+    pictures
 
--   Subclassing infrastructure was moved directly into the bindings,
-    making the gst-plugin crate deprecated. This involves many API
-    changes but generally cleans up code and makes it more flexible.
-    Take a look at the gst-plugins-rs crate for various examples.
+-   vaapih264dec: handle baseline streams as constrained-baseline if
+    possible and make it more tolerant when encountering unknown NALs
 
--   Bindings for CapsFeatures and Meta
--   Bindings for
-    ParentBufferMeta,VideoMetaandVideoOverlayCompositionMeta`
--   Bindings for VideoOverlayComposition and VideoOverlayRectangle
--   Bindings for VideoTimeCode
+GStreamer OMX
 
--   UniqueFlowCombiner and UniqueAdapter wrappers that make use of the
-    Rust compile-time mutability checks and expose more API in a safe
-    way, and as a side-effect implement Sync and Send now
+-   omxvideoenc: use new video encoder subframe API to push out slices
+    as soon as they’re ready
 
--   More complete bindings for Allocation Query
--   pbutils functions for codec descriptions
--   TagList::iter() for iterating over all tags while getting a single
-    value per tag. The old ::iter_tag_list() function was renamed to
-    ::iter_generic() and still provides access to each value for a tag
--   Bus::iter() and Bus::iter_timed() iterators around the corresponding
-    ::pop*() functions
+-   omxh264enc, omxh265enc: negotiate subframe mode via caps. To enable
+    it, force downstream caps to video/x-h264,alignment=nal or
+    video/x-h265,alignment=nal.
 
--   serde serialization of Value can also handle Buffer now
+-   omxh264enc: Add ref-frames property
 
--   Extensive comments to all examples with explanations
--   Transmuxing example showing how to use typefind, multiqueue and
-    dynamic pads
--   basic-tutorial-12 was ported and added
+-   Zynq ultrascale+ specific video encoder/decoder improvements:
 
-Changed
+    -   GRAY8 format support
+    -   support for alternate fields interlacing mode
+    -   video encoder: look-ahead, long-term-ref, and long-term-freq
+        properties
 
--   Rust 1.31 is the minimum supported Rust version now
--   Update to latest gir code generator and glib bindings
+GStreamer Editing Services and NLE
 
--   Functions returning e.g. gst::FlowReturn or other “combined” enums
-    were changed to return split enums like
-    Result<gst::FlowSuccess, gst::FlowError> to allow usage of the
-    standard Rust error handling.
+-   Added nested timelines and subproject support so that GES projects
+    can be used as clips, potentially serializing nested projects in the
+    main file or referencing external project files.
 
--   MiniObject subclasses are now newtype wrappers around the underlying
-    GstRc<FooRef> wrapper. This does not change the API in any breaking
-    way for the current usages, but allows MiniObjects to also be
-    implemented in other crates and makes sure rustdoc places the
-    documentation in the right places.
+-   Implemented an OpenTimelineIO GES formatter. This means GES and
+    GStreamer can now load and save projects in all the formats
+    supported by otio.
 
--   BinExt extension trait was renamed to GstBinExt to prevent conflicts
-    with gtk::Bin if both are imported
+-   Implemented a GESMarkerList object which allow setting timed
+    metadata on any GES object.
 
--   Buffer::from_slice() can’t possible return None
+-   Fixed audio rendering issues during clip transition by ensuring that
+    a single segment is pushed into encoders.
 
--   Various clippy warnings
+-   The GESUriClipAsset API is now MT safe.
 
+-   Added ges_meta_container_register_static_meta() to allow fixing a
+    type for a specific metadata without actually setting a value.
 
-GStreamer Rust Plugins
+-   The framepositioner element now handles resizing the project and
+    keeps the same positioning when the aspect ratio is not changed .
 
-Like the GStreamer Rust bindings, the Rust plugins are now officially
-part of the GStreamer project and are also maintained in the GStreamer
-GitLab.
+-   Reworked the documentation, making it more comprehensive and much
+    more detailed.
 
-In the 0.3.x versions this contained infrastructure for writing
-GStreamer plugins in Rust, and a set of plugins.
+-   Added APIs to retrieve natural size and framerate of a clip (for
+    example in the case of URIClip it is the framerate/size of the
+    underlying file).
 
-In git master that infrastructure was moved to the GLib and GStreamer
-bindings directly, together with many other improvements that were made
-possible by this, so the gst-plugins-rs repository only contains
-GStreamer elements now.
+-   ges_container_edit() is now deprecated and GESTimelineElement gained
+    the ges_timeline_element_edit() method so the editing API is now
+    usable from any element in the timeline.
 
-Elements included are:
+-   GESProject::loading was added so applications can be notified about
+    when a new timeline starts loading.
 
--   Tutorials plugin: identity, rgb2gray and sinesrc with extensive
-    comments
+-   Implemented the GstStream API in GESTimeline.
 
--   rsaudioecho, a port of the audiofx element
+-   Added a way to add a timeoverlay inside the test source (potentially
+    with timecodes).
 
--   rsfilesrc, rsfilesink
+-   Added APIs to convert times to frame numbers and vice versa:
 
--   rsflvdemux, a FLV demuxer. Not feature-equivalent with flvdemux yet
+    -   ges_timeline_get_frame_time()
 
--   threadshare plugin: ts-appsrc, ts-proxysrc/sink, ts-queue, ts-udpsrc
-    and ts-tcpclientsrc elements that use a fixed number of threads and
-    share them between instances. For more background about these
-    elements see Sebastian’s talk “When adding more threads adds more
-    problems - Thread-sharing between elements in GStreamer” at the
-    GStreamer Conference 2017.
+    -   ges_timeline_get_frame_at()
 
--   rshttpsrc, a HTTP source around the hyper/reqwest Rust libraries.
-    Not feature-equivalent with souphttpsrc yet.
+    -   ges_clip_asset_get_frame_time()
 
--   togglerecord, an element that allows to start/stop recording at any
-    time and keeps all audio/video streams in sync.
+    -   ges_clip_get_timeline_time_from_source_frame()
 
--   mccparse and mccenc, parsers and encoders for the MCC closed caption
-    file format.
+        Quite a few validate tests have been implemented to check the
+        behavior for various demuxer/codec formats
 
-Changes to 0.3.X since 0.3.0
+-   Added ges_layer_set_active_for_tracks() which allows muting layers
+    for the specified tracks
 
--   All references were updated from GitHub to freedesktop.org GitLab
--   Fix various links in the README.md
--   Link to the correct location for the documentation
+-   Deprecated GESImageSource and GESMultiFileSource now that we have
+    imagesequencesrc which handles the imagesequence “protocol”
 
-Changes in git master for 0.4
+-   Stopped exposing ‘deinterlacing’ children properties for clip types
+    where they do not make sense.
 
--   togglerecord: Switch to parking_lot crate for mutexes/condition
-    variables for lower overhead
--   Merge threadshare plugin here
--   New closedcaption plugin with mccparse and mccenc elements
--   New identity element for the tutorials plugin
+-   Added support for simple time remapping effects
 
--   Register plugins statically in tests instead of relying on the
-    plugin loader to find the shared library in a specific place
+GStreamer validate
 
--   Update to the latest API changes in the GLib and GStreamer bindings
--   Update to the latest versions of all crates
+-   Introduced the concept of “Test files” allowing to implement “all
+    included” test cases, meaning that inside the file the following can
+    be defined:
 
+    -   The application arguments
+    -   The validate configurations
+    -   The validate scenario
 
-Build and Dependencies
+    This replaces the previous big dictionary file in
+    gst-validate-launcher to implement specific test cases.
 
--   The MESON BUILD SYSTEM BUILD IS NOW FEATURE-COMPLETE (*) and it is
-    now the recommended build system on all platforms and also used by
-    Cerbero to build GStreamer on all platforms. The Autotools build is
-    scheduled to be removed in the next cycle. Developers who currently
-    use gst-uninstalled should move to gst-build. The build option
-    naming has been cleaned up and made consistent and there are now
-    feature options to enable/disable plugins and various other features
-    on a case-by-case basis. (*) with the exception of plugin docs which
-    will be handled differently in future
-
--   Symbol export in libraries is now controlled via explicit exports
-    using symbol visibility or export defines where supported, to ensure
-    consistency across all platforms. This also allows libraries to have
-    exports that vary based on detected platform features and configure
-    options as is the case with the GStreamer OpenGL integration library
-    for example. A few symbols that had been exported by accident in
-    earlier versions may no longer be exported. These symbols will not
-    have had declarations in any public header files then though and
-    would not have been usable.
-
--   The GStreamer FFmpeg wrapper plugin (gst-libav) now depends on
-    FFmpeg 4.x and uses the new FFmpeg 4.x API and stopped relying on
-    ancient API that was removed with the FFmpeg 4.x release. This means
-    that it is no longer possible to build this module against an older
-    system-provided FFmpeg 3.x version. Use the internal FFmpeg 4.x copy
-    instead if you build using autotools, or use gst-libav 1.14.x
-    instead which targets the FFmpeg 3.x API and _should_ work fine in
-    combination with a newer GStreamer. It’s difficult for us to support
-    both old and new FFmpeg APIs at the same time, apologies for any
-    inconvenience caused.
-
--   Hardware-accelerated Nvidia video encoder/decoder plugins nvdec and
-    nvenc can be built against CUDA Toolkit versions 9 and 10.0 now. The
-    dynlink interface has been dropped since it’s deprecated in 10.0.
-
--   The (optional) OpenCV requirement has been bumped to >= 3.0.0 and
-    the plugin can also be built against OpenCV 4.x now.
-
--   New sctp plugin based on usrsctp (for WebRTC data channels)
+    We set several variables inside the files (as well as inside
+    scenarios and config files) to make them relocatable.
 
+    The file format has been enhanced so it is easier to read and write,
+    for example line ending with a coma or (curly) brackets can now be
+    used as continuation marker so you do not need to add \ at the end
+    of lines to write a structure on several lines.
 
-Platform-specific changes and improvements
+-   Support the imagesequence “protocol” and added integration tests for
+    it.
 
-Android
+-   Added action types to allow the scenario to run the Test Clock for
+    better reproducibility of tests.
 
--   The way that GIO modules are named has changed due to upstream GLib
-    natively adding support for loading static GIO modules. This means
-    that any GStreamer application using gnutls for SSL/TLS on the
-    Android or iOS platforms (or any other setup using static libraries)
-    will fail to link looking for the g_io_module_gnutls_load_static()
-    function. The new function name is now
-    g_io_gnutls_load(gpointer data). data can be NULL for a static
-    library. Look at this commit for the necessary change in the
-    examples.
+-   Support generating tests to check that seeking is frame accurate
+    (base on ssim).
 
-macOS and iOS
+-   Added ways to record buffers checksum (in different ways) in the
+    validateflow module.
 
--   macOS binaries should be fully relocatable now
+-   Added vp9 encoding tests.
 
--   The way that GIO modules are named has changed due to upstream GLib
-    natively adding support for loading static GIO modules. This means
-    that any GStreamer application using gnutls for SSL/TLS on the
-    Android or iOS platforms (or any other setup using static libraries)
-    will fail to link looking for the g_io_module_gnutls_load_static()
-    function. The new function name is now
-    g_io_gnutls_load(gpointer data). data can be NULL for a static
-    library. Look at this commit for the necessary change in the
-    examples.
+-   Enhanced seeking action types implementation to allow support for
+    segment seeks.
 
-Windows
+-   Output improvements:
 
--   The webrtcdsp element is shipped again as part of the Windows binary
-    packages, the build system issue has been resolved.
+    -   Logs are now in markdown formats (and bat is used to dump them
+        if available).
+    -   File format issues in scenarios/configs/tests files are nicely
+        reported with the line numbers now.
 
--   ‘Inconsistent DLL linkage’ warnings when building with MSVC have
-    been fixed
+GStreamer Python Bindings
 
--   Hardware-accelerated Nvidia video encoder/decoder plugins nvdec and
-    nvenc build on Windows now, also with MSVC and using Meson.
+-   Python 2.x is no longer supported
 
--   The ksvideosrc camera capture plugin supports 16-bit grayscale video
-    now
+-   Support mapping buffers without any memcpy:
 
--   The wasapisrc audio capture element implements loopback recording
-    from another output device or sink
+    -   Added a ContextManager to make the API more pythonic
 
--   wasapisink recover from low buffer levels in shared mode and some
-    exclusive mode fixes
+            with buf.map(Gst.MapFlags.READ | Gst.MapFlags.WRITE) as info:
+                info.data[42] = 0
 
--   dshowsrc now implements the GstDeviceMonitor interface
+-   Added high-level helper API for constructing pipelines:
 
+    -   Gst.Bin.make_and_add(factory_name, instance_name=None)
+    -   Gst.Element.link_many(element, ...)
 
-Contributors
+GStreamer C# Bindings
 
-Aleix Conchillo Flaqué, Alessandro Decina, Alexandru Băluț, Alex Ashley,
-Alexey Chernov, Alicia Boya García, Amit Pandya, Andoni Morales
-Alastruey, Andreas Frisch, Andre McCurdy, Andy Green, Anthony Violo,
-Antoine Jacoutot, Antonio Ospite, Arun Raghavan, Aurelien Jarno,
-Aurélien Zanelli, ayaka, Bananahemic, Bastian Köcher, Branko Subasic,
-Brendan Shanks, Carlos Rafael Giani, Christoph Reiter, Corentin Noël,
-Daeseok Youn, Daniel Drake, Daniel Klamt, Dardo D Kleiner, David Ing,
-David Svensson Fors, Devarsh Thakkar, Dimitrios Katsaros, Edward Hervey,
-Emilio Pozuelo Monfort, Enrique Ocaña González, Ezequiel Garcia, Fabien
-Dessenne, Fabrizio Gennari, Florent Thiéry, Francisco Velazquez,
-Freyr666, Garima Gaur, Gary Bisson, George Kiagiadakis, Georg Lippitsch,
-Georg Ottinger, Geunsik Lim, Göran Jönsson, Guillaume Desmottes, H1Gdev,
-Haihao Xiang, Haihua Hu, Harshad Khedkar, Havard Graff, He Junyan,
-Hoonhee Lee, Hosang Lee, Hyunjun Ko, Ingo Randolf, Iñigo Huguet, James
-Stevenson, Jan Alexander Steffens, Jan Schmidt, Jerome Laheurte, Jimmy
-Ohn, Joakim Johansson, Jochen Henneberg, Johan Bjäreholt, John-Mark
-Bell, John Nikolaides, Jonathan Karlsson, Jonny Lamb, Jordan Petridis,
-Josep Torra, Joshua M. Doe, Jos van Egmond, Juan Navarro, Jun Xie,
-Junyan He, Justin Kim, Kai Kang, Kim Tae Soo, Kirill Marinushkin, Kyrylo
-Polezhaiev, Lars Petter Endresen, Linus Svensson, Louis-Francis
-Ratté-Boulianne, Luis de Bethencourt, Luz Paz, Lyon Wang, Maciej Wolny,
-Marc-André Lureau, Marc Leeman, Marcos Kintschner, Marian Mihailescu,
-Marinus Schraal, Mark Nauwelaerts, Marouen Ghodhbane, Martin Kelly,
-Matej Knopp, Mathieu Duponchelle, Matteo Valdina, Matthew Waters,
-Matthias Fend, memeka, Michael Drake, Michael Gruner, Michael Olbrich,
-Michael Tretter, Miguel Paris, Mike Wey, Mikhail Fludkov, Naveen
-Cherukuri, Nicola Murino, Nicolas Dufresne, Niels De Graef, Nirbheek
-Chauhan, Norbert Wesp, Ognyan Tonchev, Olivier Crête, Omar Akkila,
-Patricia Muscalu, Patrick Radizi, Patrik Nilsson, Paul Kocialkowski, Per
-Forlin, Peter Körner, Peter Seiderer, Petr Kulhavy, Philippe Normand,
-Philippe Renon, Philipp Zabel, Pierre Labastie, Roland Jon, Roman
-Sivriver, Rosen Penev, Russel Winder, Sam Gigliotti, Sean-Der, Sebastian
-Dröge, Seungha Yang, Sjoerd Simons, Snir Sheriber, Song Bing, Soon,
-Thean Siew, Sreerenj Balachandran, Stefan Ringel, Stephane Cerveau,
-Stian Selnes, Suhas Nayak, Takeshi Sato, Thiago Santos, Thibault
-Saunier, Thomas Bluemel, Tianhao Liu, Tim-Philipp Müller, Tomasz
-Andrzejak, Tomislav Tustonić, U. Artie Eoff, Ulf Olsson, Varunkumar
-Allagadapa, Víctor Guzmán, Víctor Manuel Jáquez Leal, Vincenzo Bono,
-Vineeth T M, Vivia Nikolaidou, Wang Fei, wangzq, Whoopie, Wim Taymans,
-Wind Yuan, Wonchul Lee, Xabier Rodriguez Calvar, Xavier Claessens,
-Haihao Xiang, Yacine Bandou, Yeongjin Jeong, Yuji Kuwabara, Zeeshan Ali,
+-   Bind gst_buffer_new_wrapped() manually to fix memory handling.
+
+-   Fix gst_promise_new_with_change_func() where bindgen didn’t properly
+    detect the func as a closure.
+
+-   Declare GstVideoOverlayComposition and GstVideoOverlayRectangle as
+    opaque type and subclasses of Gst.MiniObject. This changes the API
+    but without this all usage will cause memory corruption or simply
+    not work.
+
+-   on Windows, look for gstreamer, glib and gobject DLLs using the MSVC
+    naming convention (i.e. gstvideo-1.0-0.dll instead of
+    libgstvideo-1.0-0.dll).
+
+    The names of these DLLs have to be hardcoded in the bindings, and
+    most C# users will probably be using the Microsoft toolchain anyway.
+
+    This means that the MSVC compiler is now required to build the
+    bindings, MingW will no longer work out of the box.
+
+GStreamer Rust Bindings and Rust Plugins
+
+The GStreamer Rust bindings are released separately with a different
+release cadence that’s tied to gtk-rs, but the latest release has
+already been updated for the new GStreamer 1.18 API, so there’s
+absolutely no excuse why your next GStreamer application can’t be
+written in Rust anymore.
+
+gst-plugins-rs, the module containing GStreamer plugins written in Rust,
+has also seen lots of activity with many new elements and plugins.
+
+What follows is a list of elements and plugins available in
+gst-plugins-rs, so people don’t miss out on all those potentially useful
+elements that have no C equivalent.
+
+Rust audio plugins
+
+-   audiornnoise: New element for audio denoising which implements the
+    noise removal algorithm of the Xiph RNNoise library, in Rust
+-   rsaudioecho: Port of the audioecho element from gst-plugins-good
+    rsaudioloudnorm: Live audio loudness normalization element based on
+    the FFmpeg af_loudnorm filter
+-   claxondec: FLAC lossless audio codec decoder element based on the
+    pure-Rust claxon implementation
+-   csoundfilter: Audio filter that can use any filter defined via the
+    Csound audio programming language
+-   lewtondec: Vorbis audio decoder element based on the pure-Rust
+    lewton implementation
+
+Rust video plugins
+
+-   cdgdec/cdgparse: Decoder and parser for the CD+G video codec based
+    on a pure-Rust CD+G implementation, used for example by karaoke CDs
+-   cea608overlay: CEA-608 Closed Captions overlay element
+-   cea608tott: CEA-608 Closed Captions to timed-text (e.g. VTT or SRT
+    subtitles) converter
+-   tttocea608: CEA-608 Closed Captions from timed-text converter
+-   mccenc/mccparse: MacCaption Closed Caption format encoder and parser
+-   sccenc/sccparse: Scenarist Closed Caption format encoder and parser
+-   dav1dec: AV1 video decoder based on the dav1d decoder implementation
+    by the VLC project
+-   rav1enc: AV1 video encoder based on the fast and pure-Rust rav1e
+    encoder implementation
+-   rsflvdemux: Alternative to the flvdemux FLV demuxer element from
+    gst-plugins-good, not feature-equivalent yet
+-   rsgifenc/rspngenc: GIF/PNG encoder elements based on the pure-Rust
+    implementations by the image-rs project
+
+Rust text plugins
+
+-   textwrap: Element for line-wrapping timed text (e.g. subtitles) for
+    better screen-fitting, including hyphenation support for some
+    languages
+
+Rust network plugins
+
+-   reqwesthttpsrc: HTTP(S) source element based on the Rust
+    reqwest/hyper HTTP implementations and almost feature-equivalent
+    with the main GStreamer HTTP source souphttpsrc
+-   s3src/s3sink: Source/sink element for the Amazon S3 cloud storage
+-   awstranscriber: Live audio to timed text transcription element using
+    the Amazon AWS Transcribe API
+
+Generic Rust plugins
+
+-   sodiumencrypter/sodiumdecrypter: Encryption/decryption element based
+    on libsodium/NaCl
+-   togglerecord: Recording element that allows to pause/resume
+    recordings easily and considers keyframe boundaries
+-   fallbackswitch/fallbacksrc: Elements for handling potentially
+    failing (network) sources, restarting them on errors/timeout and
+    showing a fallback stream instead
+-   threadshare: Set of elements that provide alternatives for various
+    existing GStreamer elements but allow to share the streaming threads
+    between each other to reduce the number of threads
+-   rsfilesrc/rsfilesink: File source/sink elements as replacements for
+    the existing filesrc/filesink elements
 
-… and many others who have contributed bug reports, translations, sent
-suggestions or helped testing.
+Build and Dependencies
 
+-   The Autotools build system has finally been removed in favour of the
+    Meson build system. Developers who currently use gst-uninstalled
+    should move to gst-build.
+
+-   API and plugin documentation are no longer built with gtk_doc. The
+    gtk_doc documentation has been removed in favour of a new unified
+    documentation module built with hotdoc (also see “Documentation
+    improvements” section below). Distributors should use the
+    documentation release tarball instead of trying to package hotdoc
+    and building the documentation from scratch.
+
+-   gst-plugins-bad now includes an internal copy of libusrsctp, as
+    there are problems in usrsctp with global shared state, lack of API
+    stability guarantees, and the absence of any kind of release
+    process. We also can’t rely on distros shipping a version with the
+    fixes we need. Both firefox and Chrome bundle their own copies too.
+    It is still possible to build against an external copy of usrsctp if
+    so desired.
+
+-   nvcodec no longer needs the NVIDIA NVDEC/NVENC SDKs available at
+    build time, only at runtime. This allows distributions to ship this
+    plugin by default and it will just start to work when the required
+    run-time SDK libraries are installed by the user, without users
+    needing to build and install the plugin from source.
+
+-   the gst-editing-services tarball is now named gst-editing-services
+    for consistency (used to be gstreamer-editing-services).
+
+-   the gst-validate tarball has been superseded by the gst-devtools
+    tarball for consistency with the git module name.
+
+gst-build
+
+gst-build is a meta-module and serves primarily as our uninstalled
+development environment. It makes it easy to build most of GStreamer,
+but unlike Cerbero it only comes with a limited number of external
+dependencies that can be built as subprojects if they are not found on
+the system.
+
+gst-build is based on Meson and replaces the old autotools
+gst-uninstalled script.
+
+-   The ‘uninstalled’ target has been renamed to ‘devenv’
+
+-   Experimental gstreamer-full library containing all built plugins and
+    their deps when building with -Ddefault_library=static. A monolithic
+    library is easier to distribute, and may be required in some
+    environments. GStreamer core, GLib and GObject are always included,
+    but external dependencies are still dynamically linked. The
+    gst-full-libraries meson option allows adding other GStreamer
+    libraries to the gstreamer-full build. This is an experiment for now
+    and its behaviour or API may still change in future releases.
+
+-   Add glib-networking as a subproject when glib is a subproject and
+    load gio modules in the devenv, tls option control whether to use
+    openssl or gnutls.
+
+-   git-worktree: Allow multiple worktrees for subproject branches
+
+-   Guard against meson being run from inside the uninstalled devenv, as
+    this might have unexpected consequences.
+
+-   our ffmpeg and x264 meson ports have been updated to the latest
+    stable version (you might need to update the subprojects checkout
+    manually though, or just remove the checkouts so meson checks out
+    the latest version again; improvements for this are pending in
+    meson, but not merged yet).
+
+Cerbero
+
+Cerbero is a meta build system used to build GStreamer plus dependencies
+on platforms where dependencies are not readily available, such as
+Windows, Android, iOS and macOS.
+
+General improvements
+
+-   Recipe build steps are done in parallel wherever possible. This
+    leads to massive improvements in overall build time.
+-   Several recipes were ported to Meson, which improved build times
+-   Moved from using both GnuTLS and OpenSSL to only OpenSSL
+-   Moved from yasm to nasm for all assembly compilation
+-   Support zsh when running the cerbero shell command
+-   Numerous version upgrades for dependencies
+-   Default to xz for tarball binary packages. bz2 can be selected with
+    the --compress-method option to package.
+-   Added boolean variant for controlling the optimization level:
+    -v optimization
+-   Ship .pc pkgconfig files for all plugins in the binary packages
+-   CMake and nasm will only be built by Cerbero if the system versions
+    are unusable
+-   The nvcodec variant was removed and the nvcodec plugin is built by
+    default now (as it no longer requires the SDK to be installed at
+    build time, only at runtime)
+
+macOS / iOS
+
+-   Minimum iOS SDK version bumped to 11.0
+-   Minimum macOS SDK version bumped to 10.11
+-   No longer need to manually add support for newer iOS SDK versions
+-   Added Vulkan elements via MoltenVK
+-   Build times were improved by code-signing all build tools
+-   macOS framework ships all gstreamer libraries instead of an outdated
+    subset
+-   Ship pkg-config in the macOS framework package
+-   fontconfig: Fix EXC_BAD_ACCESS crash on iOS ARM64
+-   Improved App Store compatibility by setting LC_VERSION_MIN_MACOSX,
+    fixing relocations, and improved bitcode support
 
-Bugs fixed in 1.16
+Windows
 
--   this section will be filled in in due course
+-   MinGW-GCC toolchain was updated to 8.2. It uses the Universal CRT
+    instead of MSVCRT which eliminates cross-CRT issues in the Visual
+    Studio build.
+-   Require Windows 7 or newer for running binaries produced by Cerbero
+-   Require Windows x86_64 for running Cerbero to build binary packages
+-   Cerbero no longer uses C:/gstreamer/1.0 as a prefix when building.
+    That prefix is reserved for use by the MSI installers.
+-   Several recipes can now be buit with Visual Studio instead of MinGW.
+    Ported to meson: opus, libsrtp, harfbuzz, cairo, openh264, libsoup,
+    libusrsctp. Existing build system: libvpx, openssl.
+-   Support building using Visual Studio for 32-bit x86. Previously we
+    only supported building for 32-bit x86 using the MinGW toolchain.
+-   Fixed annoying msgmerge popups in the middle of cerbero builds
+-   Added configuration options vs_install_path and vs_install_version
+    for specifying custom search locations for older Visual Studio
+    versions that do not support vswhere. You can set these in
+    ~/.cerbero/cerbero.cbc where ~ is the MSYS homedir, not your Windows
+    homedir.
+-   New Windows-specific plugins: d3d11, mediafoundation, wasapi2
+-   Numerous compatibility and reliability fixes when running Cerbero on
+    Windows, especially non-English locales
+-   proxy-libintl now exports the same symbols as gettext, which makes
+    it a drop-in replacement
+-   New mapping variant for selecting the Visual Studio CRT to use:
+    -v vscrt=<value>. Valid values are md, mdd, and auto (default). A
+    separate prefix is used when building with either md (release) or
+    mdd (debug), and the outputted package will have +debug in the
+    filename. This variant is also used for selecting the correct Qt
+    libraries (debug vs release) to use when building with -v qt5 on
+    Windows.
+-   Support cross-compile on Windows to Windows ARM64 and ARMv7
+-   Support cross-compile on Windows to the Universal Windows Platform
+    (UWP). Only the subset of plugins that can be built entirely with
+    Visual Studio will be selected in this case. To do so, use the
+    config/cross-uwp-universal.cbc configuration, which will build
+    ARM64, x86, and x86_64 binaries linked to the release CRT, with
+    optimizations enabled, and debugging turned on. You can combine this
+    with -v vscrt=mdd to produce binaries linked to the debug CRT. You
+    can turn off optimizations with the -v nooptimization variant.
+
+Windows MSI installer
+
+-   Require Windows 7 or newer for running GStreamer
+-   Fixed some issues with shipping of pkg-config in the Windows
+    installers
+-   Plugin PDB debug files are now shipped in the development package,
+    not the runtime package
+-   Ship installers for 32-bit binaries built with Visual Studio
+-   Ship debug and release “universal” (ARM64, X86, and X86_64) tarballs
+    built for the Universal Windows Platform
+-   Windows MSI installers now install into separate prefixes when
+    building with MSVC and MinGW. Previously both would be installed
+    into C:/gstreamer/1.0/x86 or C:/gstreamer/1.0/x86_64. Now, the
+    installation prefixes are:
+
+  ----------------------------------------------------------------------------------------------------------------
+  Target                      Path                                 Build options
+  --------------------------- ------------------------------------ -----------------------------------------------
+  MinGW 32-bit                C:/gstreamer/1.0/mingw_x86           -c config/win32.cbc
+
+  MinGW 64-bit                C:/gstreamer/1.0/mingw_x86_64        -c config/win64.cbc
+
+  MSVC 32-bit                 C:/gstreamer/1.0/msvc_x86            -c config/win32.cbc -v visualstudio
+
+  MSVC 64-bit                 C:/gstreamer/1.0/msvc_x86_64         -c config/win64.cbc -v visualstudio
+
+  MSVC 32-bit (debug)         C:/gstreamer/1.0/msvc-debug_x86      -c config/win32.cbc -v visualstudio,vscrt=mdd
+
+  MSVC 64-bit (debug)         C:/gstreamer/1.0/msvc-debug_x86_64   -c config/win64.cbc -v visualstudio,vscrt=mdd
+  ----------------------------------------------------------------------------------------------------------------
+
+Note: UWP binary packages are tarballs, not MSI installers.
+
+Linux
+
+-   Support creating MSI installers using WiX when cross-compiling to
+    Windows
+-   Support running cross-windows binaries with Wine when using the
+    shell and runit cerbero commands
+-   Added bash-completion support inside the cerbero shell on Linux
+-   Require a system-wide installation of openssl on Linux
+-   Added variant -v vaapi to build gstreamer-vaapi and the new gstva
+    plugin
+-   Debian packaging was disabled because it does not work. Help in
+    fixing this is appreciated.
+-   Trimmed the list of packages needed for bootstrap on Linux
 
-More than XXX bugs have been fixed during the development of 1.16.
+Android
 
-This list does not include issues that have been cherry-picked into the
-stable 1.16 branch and fixed there as well, all fixes that ended up in
-the 1.16 branch are also included in 1.16.
+-   Updated to NDK r21
+-   Support Vulkan
+-   Support Qt 5.14+ binary package layout
 
-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.
+Platform-specific changes and improvements
 
+Android
 
-Stable 1.16 branch
+-   opensles: Remove hard-coded buffer-/latency-time values and allow
+    openslessink to handle 48kHz streams.
 
-After the 1.16.0 release there will be several 1.16.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.16.x bug-fix releases will be made from
-the git 1.16 branch, which is a stable branch.
+-   photography interface and camera source: Add additional settings
+    relevant to Android such as: Exposure mode property, extra colour
+    tone values (aqua, emboss, sketch, neon), extra scene modes
+    (backlight, flowers, AR, HDR), and missing virtual methods for
+    exposure mode, analog gain, lens focus, colour temperature, min &
+    max exposure time. Add new effects and scene modes to Camera
+    parameters.
 
-1.16.0
+macOS and iOS
+
+-   vtdec can now output to Vulkan-backed memory for zerocopy support
+    with the Vulkan elements.
 
-1.16.0 is scheduled to be released around January/February 2019.
+Windows
 
+-   d3d11videosink: new Direct3D11-based video sink with support for
+    HDR10 rendering if supported.
+
+-   Hardware-accelerated video decoding on Windows via DXVA2 /
+    Direct3D11 using native Windows APIs rather than per-vendor SDKs
+    (like MSDK for Intel or NVCODEC for NVidia). Plus modern Direct3D11
+    integration rather than the almost 20-year old Direct3D9 from
+    Windows XP times used in d3dvideosink. Formats supported for
+    decoding are H.264, H.265, VP8, and VP9, and zero-copy operation
+    should be supported in combination with the new d3d11videosink. See
+    Seungha’s blog post “Windows DXVA2 (via Direct3D 11) Support in
+    GStreamer 1.17” for more details.
+
+-   Microsoft Media Foundation plugin for hardware-accelerated video
+    encoding on Windows using native Windows APIs rather than per-vendor
+    SDKs. Formats supported for encoding are H.264, H.265 and VP9. Also
+    includes audio encoders for AAC and MP3. See Seungha’s blog post
+    “Bringing Microsoft Media Foundation to GStreamer” for some more
+    details about this.
+
+-   new mfvideosrc video capture source element using the latest Windows
+    APIs rather than ancient APIs used by ksvideosrc/winks. ksvideosrc
+    should be considered deprecated going forward.
+
+-   d3d11: add d3d11convert, a color space conversion and rescaling
+    element using shaders, and introduce d3d11upload and d3d11download
+    elements that work just like glupload and gldownload but for D3D11.
+
+-   Universal Windows Platform (UWP) support, including official
+    GStreamer binary packages for it. Check out Nirbheek’s latest blog
+    post “GStreamer 1.18 supports the Universal Windows Platform” for
+    more details.
+
+-   systemclock correctness and reliability fixes, and also don’t start
+    the system clock at 0 any longer (which shouldn’t make any
+    difference to anyone, as absolute clock time values are supposed to
+    be meaningless in themselves, only the rate of increase matters).
+
+-   toolchain specific plugin registry: the registry cache is now named
+    differently for MSVC and MinGW toolchains/packages, which should
+    avoid problems when switching between binaries built with a
+    different toolchain.
+
+-   new wasapi2 plugin mainly to support UWP applications. The core
+    logic of this plugin is almost identical to existing wasapi plugin,
+    but the main target is Windows 10 and UWP. This plugin uses WinRT
+    APIs, so will likely not work on Windows 8 or older. Unlike the
+    existing wasapi plugin, this plugin supports automatic stream
+    routing (auto fallback when device was removed) and device level
+    mute/volume control. Exclusive streaming mode is not supported,
+    however, and loopback features are not implemented yet. It is also
+    only possible to build this plugin with MSVC and the Windows 10 SDK,
+    it can’t be cross-compiled with the MingW toolchain.
+
+-   new dxgiscreencapsrc element which uses the Desktop Duplication API
+    to capture the desktop screen at high speed. This is only supported
+    on Windows 8 or later. Compared to the existing elements
+    dxgiscreencapsrc offers much better performance, works in High DPI
+    environments and draws an accurate mouse cursor.
+
+-   d3dvideosink was downgraded to secondary rank, d3d11videosink is
+    preferred now. Support OverlayComposition for GPU overlay
+    compositing of subtitles and logos.
+
+-   debug log output fixes, esp. with a non-UTF8 locale/codepage
+
+-   speex, jack: fixed crashes on Windows caused by cross-CRT issues
+
+-   gst-play-1.0 interactive keyboard controls now also work on Windows
+
+Linux
+
+-   kmssink: Add support for P010 and P016 formats
+
+-   vah264dec: new experimental va plugin with an element for H.264
+    decoding with VA-API. This novel approach, different from
+    gstreamer-vaapi, uses the gstcodecs library for decoder state
+    handling, which it is hoped will make for cleaner code because it
+    uses VA-API without further layers or wrappers. Check out Víctor’s
+    blog post “New VA-API H.264 decoder in gst-plugins-bad” for the full
+    lowdown and the limitations of this new plugin, and how to give it a
+    spin.
+
+-   v4l2codecs: introduce a V4L2 CODECs Accelerator. This plugin will
+    support the new CODECs uAPI in the Linux kernel, which consists of
+    an accelerator interface similar to DXVA, NVDEC, VDPAU and VAAPI. So
+    far H.264 and VP8 are supported. This is used on certain embedded
+    systems such as i.mx8m, rk3288, rk3399, Allwinner H-series SoCs.
+
+Documentation improvements
+
+-   unified documentation containing tutorials, API docs, plugin docs,
+    etc. all under one roof, shipped in form of a documentation release
+    tarball containing both devhelp and html documentation.
+
+-   all documentation is now generated using hotdoc, gtk-doc is no
+    longer used. Distributors should use the above-mentioned
+    documentation release tarball instead of trying to package hotdoc
+    and building the documentation from scratch.
+
+-   there is now documentation for wrapper plugins like gst-libav and
+    frei0r, as well as tracer plugins.
+
+-   for more info, check out Thibault’s “GStreamer Documentation”
+    lightning talk from the 2019 GStreamer Conference.
+
+-   new API for plugins to support the documentation system:
+
+    -   new GParamSpecFlag GST_PARAM_DOC_SHOW_DEFAULT to make
+        gst-inspect-1.0 (and the documentation) show the paramspec’s
+        default value rather than the actually set value as default
+    -   GstPadTemplate getter and setter for “documentation caps”,
+        gst_pad_template_set_documentation_caps() and
+        gst_pad_template_get_documentation_caps(): This can be used in
+        elements where the caps of pad templates are dynamically
+        generated and/or dependent on the environment, to override the
+        caps shown in the documentation (usually to advertise the full
+        set of possible caps).
+    -   gst_type_mark_as_plugin_api() for marking types as plugin API,
+        used for plugin-internal types like enums, flags, pad
+        subclasses, boxed types, and such.
+
+Possibly Breaking Changes
+
+-   GstVideo: the canonical list of raw video formats (for use in caps)
+    has been reordered, so video elements such as videotestsrc or
+    videoconvert might negotiate to a different format now than before.
+    The new format might be a higher-quality format or require more
+    processing overhead, which might affect pipeline performance.
+
+-   mpegtsdemux used to wrongly advertise H.264 and H.265 video
+    elementary streams as alignment=nal. This has now been fixed and
+    changed to alignment=none, which means an h264parse or h265parse
+    element is now required after tsdemux for some pipelines where there
+    wasn’t one before, e.g. in transmuxing scenarios (tsdemux ! tsmux).
+    Pipelines without such a parser may now fail to link or error out at
+    runtime. As parsers after demuxers and before muxers have been
+    generally required for a long time now it is hoped that this will
+    only affect a small number of applications or pipelines.
+
+-   The Android opensles audio source and sink used to have hard-coded
+    buffer-/latency-time values of 20ms. This is no longer needed with
+    newer Android versions and has now been removed. This means a higher
+    or lower value might now be negotiated by default, which can affect
+    pipeline performance and latency.
 
 Known Issues
 
--   possibly breaking/incompatible changes to properties of wrapped
-    FFmpeg decoders and encoders (see above).
+-   None in particular
+
+Contributors
+
+Aaron Boxer, Adam Duskett, Adam x Nilsson, Adrian Negreanu, Akinobu
+Mita, Alban Browaeys, Alcaro, Alexander Lapajne, Alexandru Băluț, Alex
+Ashley, Alex Hoenig, Alicia Boya García, Alistair Buxton, Ali Yousuf,
+Ambareesh “Amby” Balaji, Amr Mahdi, Andoni Morales Alastruey, Andreas
+Frisch, Andre Guedes, Andrew Branson, Andrey Sazonov, Antonio Ospite,
+aogun, Arun Raghavan, Askar Safin, AsociTon, A. Wilcox, Axel Mårtensson,
+Ayush Mittal, Bastian Bouchardon, Benjamin Otte, Bilal Elmoussaoui,
+Brady J. Garvin, Branko Subasic, Camilo Celis Guzman, Carlos Rafael
+Giani, Charlie Turner, Cheng-Chang Wu, Chris Ayoup, Chris Lord,
+Christoph Reiter, cketti, Damian Hobson-Garcia, Daniel Klamt, Daniel
+Molkentin, Danny Smith, David Bender, David Gunzinger, David Ing, David
+Svensson Fors, David Trussel, Debarshi Ray, Derek Lesho, Devarsh
+Thakkar, dhilshad, Dimitrios Katsaros, Dmitriy Purgin, Dmitry Shusharin,
+Dominique Leuenberger, Dong Il Park, Doug Nazar, dudengke, Dylan McCall,
+Dylan Yip, Ederson de Souza, Edward Hervey, Eero Nurkkala, Eike Hein,
+ekwange, Eric Marks, Fabian Greffrath, Fabian Orccon, Fabio D’Urso,
+Fabrice Bellet, Fabrice Fontaine, Fanchao L, Felix Yan, Fernando
+Herrrera, Francisco Javier Velázquez-García, Freyr, Fuwei Tang, Gaurav
+Kalra, George Kiagiadakis, Georgii Staroselskii, Georg Lippitsch, Georg
+Ottinger, gla, Göran Jönsson, Gordon Hart, Gregor Boirie, Guillaume
+Desmottes, Guillermo Rodríguez, Haakon Sporsheim, Haihao Xiang, Haihua
+Hu, Havard Graff, Håvard Graff, Heinrich Kruger, He Junyan, Henry
+Wilkes, Hosang Lee, Hou Qi, Hu Qian, Hyunjun Ko, ibauer, Ignacio Casal
+Quinteiro, Ilya Smelykh, Jake Barnes, Jakub Adam, James Cowgill, James
+Westman, Jan Alexander Steffens, Jan Schmidt, Jan Tojnar, Javier Celaya,
+Jeffy Chen, Jennifer Berringer, Jens Göpfert, Jérôme Laheurte, Jim
+Mason, Jimmy Ohn, J. Kim, Joakim Johansson, Jochen Henneberg, Johan
+Bjäreholt, Johan Sternerup, John Bassett, Jonas Holmberg, Jonas Larsson,
+Jonathan Matthew, Jordan Petridis, Jose Antonio Santos Cadenas, Josep
+Torra, Jose Quaresma, Josh Matthews, Joshua M. Doe, Juan Navarro,
+Juergen Werner, Julian Bouzas, Julien Isorce, Jun-ichi OKADA, Justin
+Chadwell, Justin Kim, Keri Henare, Kevin JOLY, Kevin King, Kevin Song,
+Knut Andre Tidemann, Kristofer Björkström, krivoguzovVlad, Kyrylo
+Polezhaiev, Lenny Jorissen, Linus Svensson, Loïc Le Page, Loïc Minier,
+Lucas Stach, Ludvig Rappe, Luka Blaskovic, luke.lin, Luke Yelavich,
+Marcin Kolny, Marc Leeman, Marco Felsch, Marcos Kintschner, Marek
+Olejnik, Mark Nauwelaerts, Markus Ebner, Martin Liska, Martin Theriault,
+Mart Raudsepp, Matej Knopp, Mathieu Duponchelle, Mats Lindestam, Matthew
+Read, Matthew Waters, Matus Gajdos, Maxim Paymushkin, Maxim P.
+Dementiev, Michael Bunk, Michael Gruner, Michael Olbrich, Miguel París
+Díaz, Mikhail Fludkov, Milian Wolff, Millan Castro, Muhammet Ilendemli,
+Nacho García, Nayana Topolsky, Nian Yan, Nicola Murino, Nicolas
+Dufresne, Nicolas Pernas Maradei, Niels De Graef, Nikita Bobkov, Niklas
+Hambüchen, Nirbheek Chauhan, Ognyan Tonchev, okuoku, Oleksandr
+Kvl,Olivier Crête, Ondřej Hruška, Pablo Marcos Oltra, Patricia Muscalu,
+Peter Seiderer, Peter Workman, Philippe Normand, Philippe Renon, Philipp
+Zabel, Pieter Willem Jordaan, Piotr Drąg, Ralf Sippl, Randy Li, Rasmus
+Thomsen, Ratchanan Srirattanamet, Raul Tambre, Ray Tiley, Richard
+Kreckel, Rico Tzschichholz, R Kh, Robert Rosengren, Robert Tiemann,
+Roman Shpuntov, Roman Sivriver, Ruben Gonzalez, Rubén Gonzalez,
+rubenrua, Ryan Huang, Sam Gigliotti, Santiago Carot-Nemesio, Saunier
+Thibault, Scott Kanowitz, Sebastian Dröge, Sebastiano Barrera, Seppo
+Yli-Olli, Sergey Nazaryev, Seungha Yang, Shinya Saito, Silvio
+Lazzeretti, Simon Arnling Bååth, Siwon Kang, sohwan.park, Song Bing,
+Soohyun Lee, Srimanta Panda, Stefano Buora, Stefan Sauer, Stéphane
+Cerveau, Stian Selnes, Sumaid Syed, Swayamjeet, Thiago Santos, Thibault
+Saunier, Thomas Bluemel, Thomas Coldrick, Thor Andreassen, Tim-Philipp
+Müller, Ting-Wei Lan, Tobias Ronge, trilene, Tulio Beloqui, U. Artie
+Eoff, VaL Doroshchuk, Varunkumar Allagadapa, Vedang Patel, Veerabadhran
+G, Víctor Manuel Jáquez Leal, Vivek R, Vivia Nikolaidou, Wangfei, Wang
+Zhanjun, Wim Taymans, Wonchul Lee, Xabier Rodriguez Calvar, Xavier
+Claessens, Xidorn Quan, Xu Guangxin, Yan Wang, Yatin Maan, Yeongjin
+Jeong, yychao, Zebediah Figura, Zeeshan Ali, Zeid Bekli, Zhiyuan Sraf,
+Zoltán Imets,
+
+… and many others who have contributed bug reports, translations, sent
+suggestions or helped testing.
+
+Stable 1.18 branch
+
+After the 1.18.0 release there will be several 1.18.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.18.x bug-fix releases will be made from
+the git 1.18 branch, which will be a stable branch.
 
--   The way that GIO modules are named has changed due to upstream GLib
-    natively adding support for loading static GIO modules. This means
-    that any GStreamer application using gnutls for SSL/TLS on the
-    Android or iOS platforms (or any other setup using static libraries)
-    will fail to link looking for the g_io_module_gnutls_load_static()
-    function. The new function name is now
-    g_io_gnutls_load(gpointer data). See Android/iOS sections above for
-    further details.
+1.18.0
 
+1.18.0 was released on 7 September 2020.
 
-Schedule for 1.18
+Schedule for 1.20
 
-Our next major feature release will be 1.18, and 1.17 will be the
-unstable development version leading up to the stable 1.18 release. The
-development of 1.17/1.18 will happen in the git master branch.
+Our next major feature release will be 1.20, and 1.19 will be the
+unstable development version leading up to the stable 1.20 release. The
+development of 1.19/1.20 will happen in the git master branch.
 
-The plan for the 1.18 development cycle is yet to be confirmed, but it
-is expected that feature freeze will be around July 2019 followed by
-several 1.17 pre-releases and the new 1.18 stable release in
-August/September.
+The plan for the 1.20 development cycle is yet to be confirmed, but it
+is now expected that feature freeze will take place some time in January
+2021, with the first 1.20 stable release around February/March 2021.
 
-1.18 will be backwards-compatible to the stable 1.16, 1.14, 1.12, 1.10,
-1.8, 1.6, 1.4, 1.2 and 1.0 release series.
+1.20 will be backwards-compatible to the stable 1.18, 1.16, 1.14, 1.12,
+1.10, 1.8, 1.6, 1.4, 1.2 and 1.0 release series.
 
 ------------------------------------------------------------------------
 
-_These release notes have been prepared by Tim-Philipp Müller with_
-_contributions from Sebastian Dröge._
+These release notes have been prepared by Tim-Philipp Müller with
+contributions from Mathieu Duponchelle, Matthew Waters, Nirbheek
+Chauhan, Sebastian Dröge, Thibault Saunier, and Víctor Manuel Jáquez
+Leal.
 
-_License: CC BY-SA 4.0_
+License: CC BY-SA 4.0