GStreamer 1.24 Release Notes

GStreamer 1.24.0 was originally released on 4 March 2024.

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

Last updated: Monday 4 March 2024, 23:00 UTC (log)

Introduction

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

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

Highlights

-   New Discourse forum and Matrix chat space
-   New Analytics and Machine Learning abstractions and elements
-   Playbin3 and decodebin3 are now stable and the default in gst-play-1.0, GstPlay/GstPlayer
-   The va plugin is now preferred over gst-vaapi and has higher ranks
-   GstMeta serialization/deserialization and other GstMeta improvements
-   New GstMeta for SMPTE ST-291M HANC/VANC Ancillary Data
-   New unixfd plugin for efficient 1:N inter-process communication on Linux
-   cudaipc source and sink for zero-copy CUDA memory sharing between processes
-   New intersink and intersrc elements for 1:N pipeline decoupling within the same process
-   Qt5 + Qt6 QML integration improvements including qml6glsrc, qml6glmixer, qml6gloverlay, and qml6d3d11sink elements
-   DRM Modifier Support for dmabufs on Linux
-   OpenGL, Vulkan and CUDA integration enhancements
-   Vulkan H.264 and H.265 video decoders
-   RTP stack improvements including new RFC7273 modes and more correct header extension handling in depayloaders
-   WebRTC improvements such as support for ICE consent freshness, and a new webrtcsrc element to complement webrtcsink
-   WebRTC signallers and webrtcsink implementations for LiveKit and AWS Kinesis Video Streams
-   WHIP server source and client sink, and a WHEP source
-   Precision Time Protocol (PTP) clock support for Windows and other additions
-   Low-Latency HLS (LL-HLS) support and many other HLS and DASH enhancements
-   New W3C Media Source Extensions library
-   Countless closed caption handling improvements including new cea608mux and cea608tocea708 elements
-   Translation support for awstranscriber
-   Bayer 10/12/14/16-bit depth support
-   MPEG-TS support for asynchronous KLV demuxing and segment seeking, plus various new muxer features
-   Capture source and sink for AJA capture and playout cards
-   SVT-AV1 and VA-API AV1 encoders, stateless AV1 video decoder
-   New uvcsink element for exporting streams as UVC camera
-   DirectWrite text rendering plugin for windows
-   Direct3D12-based video decoding, conversion, composition, and rendering
-   AMD Advanced Media Framework AV1 + H.265 video encoders with 10-bit and HDR support
-   AVX/AVX2 support and NEON support on macOS on Apple ARM64 CPUs via new liborc
-   GStreamer C# bindings have been updated
-   Rust bindings improvements and many new and improved Rust plugins
-   Lots of new plugins, features, performance improvements and bug fixes

Major new features and changes

Discourse forum and Matrix chat space

-   The new Discourse forum and Matrix chat space are now our preferred communication channels for support and developer chat.

-   The mailing lists and IRC channel are on their way to being phased out, but Discourse can be used via e-mail as well.

-   For release announcements please subscribe to the News + Announcements category on Discourse, although we will continue to
    also send announcements to the mailing list for the time being.

Playbin3, decodebin3 now stable and default

-   After a year of stability, testing and more improvements, playbin3, and its various components (uridecodebin3, decodebin3
    and urisourcebin), are now the recommended playback components.

-   Some playback components have now switched to defaulting to playbin3: gst-play-1.0 and the GstPlay / GstPlayer libraries.
    Application developers are strongly recommended to switch to using those components instead of the legacy playbin and
    (uri)decodebin.

Improvements in this cycle:

-   Better support missing/faulty decoders, attempt to use another one or gracefully un-select the stream.

-   Many fixes for more complex gapless and instant-switching scenarios

-   Lower latency for live pipelines

-   Fix for “chained” streams (ex: Ogg, or PMT update in MPEG-TS)

-   Fixes for hardware-accelerated playback with subtitles (provided the sink can handle offloading composition). This was also
    partly due to a historical confusion between subtitle “decoders” (which decode the format to text and “parsers” (which only
    do timing detection and optional seeking).

GstMeta serialization/deserialization and other GstMeta improvements

-   GstMeta serialization/deserialization allows metas to be transmitted or stored. This is used by the unixfd and cudaipc
    plugins for inter-process communication (IPC). Implemented so far for GstCustomMeta, GstVideoMeta, GstAudioMeta and
    GstReferenceTimestampMeta.

-   Simplified GstCustomMeta registration with gst_meta_register_custom_simple() for the simple case where tags and transform
    functions are not needed.

-   GstMetaClearFunction clears the content of the meta. This will be called by buffer pools when a pooled buffer is returned to
    the pool.

-   Add gst_meta_info_new() and gst_meta_info_register() to register a GstMeta in two steps for easier extensibility.

New unixfd plugin for efficient 1:N inter-process communication on Linux

-   unixfdsink and unixfdsrc are elements that, inspired by shmsink andn shmsrc, send UNIX file descriptors (e.g. memfd, dmabuf)
    from one sink to multiple source elements in other processes on Linux.

-   The unixfdsink proposes a memfd/shm allocator to upstream elements which allows for example videotestsrc to write directly
    into memory that can be transfered to other processes without copying.

New GstMeta for SMPTE ST-291M HANC/VANC Ancillary Data

-   Previously only various specific GstMeta for ancillary data were provided, such as GstVideoCaptionMeta and GstVideoAFDMeta.
    The new GstAncillaryMeta allows passing arbitrary ancillary data between elements, including custom and non-standard
    ancillary data. See GstAncillaryMeta for details.

-   Add with gst_buffer_add_ancillary_meta() and retrieve with gst_buffer_get_ancillary_meta() or
    gst_buffer_iterate_ancillary_meta().

-   Supported by the newly added AJA sink and source elements

DSD audio support

-   DSD audio is a non-PCM raw audio format representation and the GstAudio library gained support for this in form of new
    GstDsdInfo and GstDsdFormat API.

-   Support for DSD audio has been implemented in alsasink as well as the GstAudioSink and GstAudioRingBuffer base classes, and
    the gst-libav plugin to enable FFmpeg-based DSD elements and functionality.

Analytics and Machine Learning

-   A new library, GstAnalytics, has been added. It defines a GstAnalyticsRelationMeta that can efficiently hold a large number
    of observations from a data analysis process, for example from machine learning. It also contains a matrix of the
    relationship between those observations.

-   Three types of metadata are already defined in the library: object detection, classification and tracking.

-   A new objectdetectionoverlay element has been merged that draws the bounding boxes and the classes from the object detection
    and classification metadata types.

-   The onnxinference element has been split into two parts. The first part works with the ONNX Runtime library to do the actual
    inference, while the second part called ssdobjectdetector interprets the produced tensor. This new element creates
    GstAnalyticsRelationMeta.

-   The onnxinference element now accepts video frames without transformation if the module declares that it accepts the “Image”
    type and the format is something that GStreamer knows.

-   In the next release, tensor decoders such as ssdobjectdetector will live outside of the ONNX plugin so they can be used with
    other machine learning acceleration frameworks.

Qt5 + Qt6 QML integration improvements

-   The Qt5 qmlglsink, qmlgloverlay, qmlglmixer received support for directly consuming BGRA and YV12 video frames without a
    prior glcolorconvert.

-   New qml6glsrc, qml6glmixer, and qml6gloverlay elements as Qt6 counterparts to the existing Qt5 elements, also with support
    for directly consuming BGRA and YV12 video frames without a prior glcolorconvert.

-   qml6d3d11sink is a new Direct3D11 Qt6 QML sink for Windows as an alternative to the existing qml6glsink.

DRM Modifier Support for dmabufs on Linux

The Linux dmabuf subsystem provides buffer sharing across different hardware device drivers and subsystems, and is used
extensively by the DRM subsystem to exchange buffers between processes, contexts, and library APIs within the same process, and
also to exchange buffers with other subsystems such as Linux Media.

In GStreamer, it’s used on the capture side (v4l2src, pipewire), hardware-accelerated video decoders and encoders, OpenGL
integration, Wayland renderers, etc.

GStreamer has had support for dmabufs for a long time and was able to negotiate “zero-copy” paths between different components,
however it only supported and assumed simple linear formats and was not able to negotiate complex non-linear formats. This meant
that dmabuf support actually had to be disabled in many scenarios to avoid “garbled video”.

With GStreamer 1.24 there is now full DRM modifier support and complex non-linear formats can be supported and negotiated
between components.

This is achieved with an extra drm_format field in video/x-raw(memory:DMABuf), format=(string)DMA_DRM caps, e.g.
drm-format=(string)NV12:0x0x0100000000000001.

See the GStreamer DMA buffers design documentation for more details.

This is used in the VA-API va plugin, waylandsink, the MSDK plugin, and the OpenGL integration. Video4Linux support is expected
to land in one of the next minor releases.

New API has been added for easy handling of these new caps:

-   GstVideoInfoDmaDrm plus associated functions, similar to GstVideoInfo, including conversion to and from GstVideoInfo with
    gst_video_info_dma_drm_from_video_info() and gst_video_info_dma_drm_to_video_info()

-   GST_VIDEO_DMA_DRM_CAPS_MAKE

-   GST_VIDEO_FORMAT_DMA_DRM

OpenGL integration enhancements

-   When using EGL, if both OpenGL ES and OpenGL are available, OpenGL ES is preferred over OpenGL. OpenGL ES supports some
    necessary features required for dmabuf support. This does not apply if an external library/application chooses an OpenGL API
    first.

-   Improved support for dmabuf use cases. The glupload element now supports the new and improved dmabuf negotiation with
    explicit modifiers.

-   Base classes for mixing with OpenGL are now public API. GstGLBaseMixer and GstGLMixer are exposed matching the existing
    filter-based GstGLBaseFilter and GstGLFilter base classes. The new OpenGL mixer base classes are based on
    GstVideoAggregator.

-   Add support for a ‘surfaceless’ EGL context using EGL_MESA_platform_surfaceless.

-   Expose Vivante Framebuffer build-related files (pkg-config, gir) as public API

-   Add support for more video formats:

    -   A420 8/10/12/16-bit.
    -   A422 8/10/12/16-bit.
    -   A444 8/10/12/16-bit.
    -   I420 10/12 bit.
    -   RBGA.

-   Add support for tiled video formats

    -   NV12_16L32S (Mediatek format)
    -   NV12_4L4 (Verisilicon Hantro format)

-   glcolorconvert now has API for retrieving shader strings for:

    -   swizzling (reordering components).
    -   YUV->RGB conversion.
    -   RGB->YUV conversion.

-   Add more helpers for information about a particular video and/or GL format e.g. number of components, bytes used, or pixel
    ordering.

-   glvideomixer has new sink pad properties sizing-policy, xalign, yalign matching compositor.

-   GstGLBufferPool now has a configuration option for allowing a number of buffers to be always outstanding allowing for
    reducing the potential synchronisation delay when reusing OpenGL memory backed buffers.

Vulkan integration enhancements

-   Add support for the Vulkan H.264 and H.265 decoders.

-   Add support for timeline semaphores.

-   Optionally use newer Vulkan functions for format selection.

-   Add support for GPU-assisted validation.

-   Vulkan/Wayland: add support for xdg_wm_base protocol for creating a visible debug window. Required as the previous wl_shell
    interface is being removed from compositors.

CUDA / NVCODEC integration and feature additions

-   New cudaipcsrc and cudaipcsink elements for zero-copy CUDA memory sharing between processes

-   New nvJPEG library based nvjpegenc JPEG encoder element

-   The NVIDIA desktop GPU decoder nvh264sldec, nvh265sldec, nvvp8sldec, and nvvp9sldec elements were renamed to nvh264dec,
    nvh265dec, nvvp8dec, and nvvp9dec, respectively.

-   GStreamer NVIDIA H.264 and H.265 encoders except for nvh264enc and nvh265enc gained support for CEA708 Closed Caption
    inserting.

-   OpenGL memory support is added to nv{cuda,autogpu}h264enc and nv{cuda,autogpu}h265enc elements

-   CUDA stream integration: As of 1.24, CUDA stream synchronization is an application’s responsibility, and GStreamer will not
    execute unnecessary synchronization operations. If an application needs direct access to CUDA memory via GST_MAP_CUDA map
    flag, cuStreamSynchronize() or gst_cuda_memory_sync() call is required unless application-side CUDA operation is executed
    with the GstCudaMemory’s associated CUDA stream.

RTP stack improvements

-   New rtppassthroughpay element which just passes RTP packets through unchanged, but appears like an RTP payloader element.
    This is useful for relaying an RTP stream as-is through gst-rtsp-server, which expects an RTP payloader with certain
    properties at the end of an RTSP media sub-pipeline.

-   New “timeout-inactive-rtp-sources” property on rtpbin, sdpdemux and rtpsession to allow applications to disable automatic
    timeout of sources from which no data has been received for a while.

-   rtpvp8pay, rtpvp9pay: expose “picture-id” as a property, and add a “picture-id-offset” property to the VP9 payloader to
    bring it in line with the VP8 payloader.

-   rtpjitterbuffer has seen improved media clock handling (clock equality and clock setting/resetting), as well as two new
    properties that allow reconstruction of absolute PTP timestamps without actually syncing to the PTP clock, which can be
    useful in scenarios where one wants to reconstruct the absolute PTP clock timestamps on a machine that doesn’t have access
    to the network of the PTP clock provider. The two new properties are:

    -   “rfc7273-use-system-clock”: allows the jitter buffer to assume that the system clock is synced sufficiently close to the
        media clock used by an RFC7273 stream. By default the property is disabled and the jitter buffer will create a media
        clock and try to sync to it, but this is only required to determine in which wraparound period from the media clock’s
        Epoch the current RTP timestamps refer to (and thus to reconstruct absolute time stamps from them). If the property is
        enabled the wraparound period and current offset from the Epoch will be determined based on the local system clock,
        which means that no direct network connection to the media clock provider is needed to reconstruct absolute timestamps.
        There is also no start-up delay, because there’s no clock sync that needs to be established first.

    -   “rfc7273-reference-timestamp-meta-only”: If this property is enabled then the jitter buffer will do the normal timestamp
        calculations for the output buffers according to the configured mode instead of making use of the RFC7273 media clock
        for that. It will still calculate RFC7273 media clock timestamps, but only attach them to the output buffers in form of
        a clock reference meta.

-   RTP payloaders and depayloaders now have an “extensions” property for retrieving the list of currently enabled RTP header
    extensions.

-   rtpbin and webrtcbin no longer blindly set properties on the jitter buffer assuming it’s a standard rtpjitterbuffer, but
    instead check if the property is available first, to better support non-standard jitterbuffers or even an identity element
    in lieu of a jitter buffer.

-   RTP header extension handling fixes for depayloaders that aggregate multiple input buffers into a single output buffer.
    Before, only the last RTP input buffer was checked for header extensions. Now the depayloader remembers all RTP packets
    pushed before an output buffer is produced and checks all RTP input buffers for header extensions.

    -   Affected depayloaders: rtph264depay, rtph265depay, rtpvp8depay, rtpvp9depay, rtpxqtdepay, rtpasfdepay, rtpmp4gdepay,
        rtpsbcdepay, rtpvorbisdepay, rtpmp4vdepay, rtptheoradepay, rtpsv3vdepay, rtpmp4adepay, rtpklvdepay, rtpjpegdepay,
        rtpj2kdepay, rtph263pdepay, rtph263depay, rtph261depay. rtpgstdepay.

WebRTC improvements

-   Add support for ICE consent freshness (RFC 7675). This requires libnice >= 0.1.22.

-   Advertise the local side of an end-of-candidates with an empty candidate string.

-   Add the number of Data Channels opened and closed to webrtcbin’s statistics.

-   Various improvements and feature additions in the Rust webrtc plugin, which provides webrtcsrc and webrtcsink elements as
    well as specific elements for different WebRTC signalling protocols. See the Rust plugins section below for more details.

Adaptive Streaming improvements and Low-Latency HLS (LL-HLS) support

-   hlsdemux2 now supports Low-Latency HLS (LL-HLS)

-   hlsdemux2 asynchronous playlist download and update improves responsiveness and bandwith usage.

-   hlsdemux2 handles fallback variant URLs.

-   hlsdemux2 is more responsive and accurate when handling seeks.

-   dashdemux2 and hlsdemux2 have a new “start-bitrate” property, improving the decision for which initial stream variant that
    will be used.

-   dashdemux2, hlsdemux2, mssdemux2 have received many improvements regarding seeking, along with support for “early-seek”
    which allows playback to start immediately from the requested position without any previous download.

-   dashdemux2, hlsdemux2, mssdemux2 better handle errors on or near the live edge.

-   dashsink can now use the dashmp4mux muxer from the Rust plugins and will also produce better and RFC 6381-compatible codec
    strings. The “suggested-presentation-delay” property allows to set the suggested presentation delay in the MPD.

-   No development took place on the legacy demuxers (dashdemux, hlsdemux, mssdemux). Application developers are reminded to use
    the new demuxers instead. They are automatically picked up when using urisourcebin, uridecodebin3 or playbin3.

W3C Media Source Extensions library

-   A new GStreamer library (mse) implementing the W3C Media Source Extensions specification was added.

-   Applications can embed this library along with GStreamer in order to integrate software that uses the Media Source APIs
    without relying on a web browser engine. Typically an application consuming this library will wrap the C API with JavaScript
    bindings that match the Media Source API so their existing code can integrate with this library.

Closed Caption handling improvements

-   ccconverter supports converting between the two CEA-608 fields.

-   New cea608mux element for muxing multiple CEA-608 streams together.

-   Various improvements and feature additions in the Rust-based closed caption elements. Check out the Rust plugins section
    below for more details.

Precision Time Protocol (PTP) clock improvements

-   Many fixes and compatibility/interoperability improvements.

-   Better support for running on devices with multiple network interfaces.

-   Allow sync to master clock on same host.

-   PTP clock support is now also available on Windows.

-   The standalone ptp-helper binary has been rewritten in Rust for portability and security. This works on Linux, Android,
    Windows, macOS, FreeBSD, NetBSD, OpenBSD, DragonFlyBSD, Solaris and Illumos. Newly supported compared to the C version is
    Windows. Compared to the C version various error paths are handled more correctly and a couple of memory leaks are fixed.
    Otherwise it should work identically. The minimum required Rust version for compiling this is 1.48, i.e. the version
    currently in Debian stable. On Windows, Rust 1.54 is needed at least.

-   New ptp-helper Meson build option so PTP support can be disabled or required.

-   gst_ptp_init_full() allows for a more fine-grained and extensible configuration and initialization of the GStreamer PTP
    subsystem, including TTL configuration.

Bayer 10/12/14/16-bit depth support

-   bayer2rgb and rgb2bayer now support bayer with 10/12/14/16 bit depths

-   v4l2src and videotestsrc now support bayer with 10/12/14/16 bit depths

-   imagefreeze gained bayer support as well

MPEG-TS improvements

-   mpegtsdemux gained support for
    -   segment seeking for seamless non-flushing looping, and
    -   synchronous KLV
-   mpegtsmux now
    -   allows attaching PCR to non-PES streams
    -   allows setting of the PES stream number for AAC audio and AVC video streams via a new “stream-number” property on the
        muxer sink pads. Currently the PES stream number is hard-coded to zero for these stream types.
    -   allows writing arbitrary Opus channel mapping families and up to 255 channels
    -   separate handling of DVB and ATSC AC3 descriptors

New elements and plugins

-   analyticsoverlay visualises object-detection metas on a video stream.

-   autovideoflip and autodeinterlace are two new auto elements.

-   AJA source and sink elements plus device provider for AJA capture and playout cards, including support for HANC/VANC
    ancillary data.

-   New cea608mux element for muxing multiple CEA-608 streams together.

-   The codec2json plugin adds av12json, h2642json, h2652json and vp82json elements which convert AV1, H.264, H.265 and VP8
    frame parameters into human readable JSON data, which is useful for debugging and testing purposes.

-   New lc3 plugin with a decoder and encoder for the Bluetooth LC3 audio codec.

-   New onnxinference element to run ONNX inference models on video buffers.

-   New rtppassthroughpay element which just passes RTP packets through unchanged, but appears like an RTP payloader element.
    This is mostly useful for medias that simply pass through an existing RTP stream in gst-rtsp-server.

-   Qt6: qml6glsrc, qml6glmixer, qml6gloverlay, and qml6d3d11sink

-   New SVT-AV1 encoder plugin, imported from SVT-AV1 but with many fixes.

-   Many exciting new Rust elements, see Rust section below.

-   New DirectWrite text rendering and Direct3D12 plugins (see Windows section below).

-   New vaav1enc element for encoding video in AV1 (See VA-API section)

-   New uvcsink element for exporting streams as UVC camera

New element features and additions

-   alphacombine supports I420_10LE now for 10-bit WebM/alpha support.

-   The amfcodec for hardware-accelerated video encoding using the Advanced Media Framework (AMF) SDK for AMD GPUs gained some
    new features:

    -   10-bit and HDR support for H.265 / HEVC and AV1 video encoders
    -   B-frame support in the H.264 encoder
    -   Initial support of pre-analysis and pre-encoding
    -   Initial support of Smart Access Video for optimal distribution amongst multiple AMD hardware instances.

-   appsink: new “propose-allocation” signal so applications can provide a buffer pool or allocators to the upstream elements,
    as well as “max-time” and “max-buffers” properties to configure the maximum size of the appsink-internal queue in addition
    to the existing “max-bytes” property.

-   autovideoconvert exposes colorspace and scaler elements for well know elements

-   avtp: add AVTP Raw Video Format payload and de-payload support.

-   cacasink’s output driver can now be selected via the “driver” property.

-   camerabin: various fixes and stability improvements

-   clocksync: “QoS” property to optionally send QoS events upstream like a synchronising sink would.

-   cutter: can add GstAudioLevelMeta on output buffers, which can be enabled via the new “audio-level-meta” property.

-   dashdemux2 has a new “start-bitrate” property.

-   dashsink can now use the dashmp4mux muxer from the Rust plugins and will also produce better and RFC 6381-compatible codec
    strings. The “suggested-presentation-delay” property allows to set the suggested presentation delay in the MPD.

-   deinterlace: Add support for 10/12/16-bit planar YUV formats

-   The dvdspu subpicture overlay now implements GstVideoOverlayComposition support to make it work better with hardware
    decoders where the video data should ideally stay on the GPU/VPU and the overlay blitting be delegated to the renderer.

-   encodebin now automatically autoplugs timestamper elements such as h264timestamper or h265timestamper, based on new
    “Timestamper” element factory type and rank.

-   New fakevideodec element (see debugging section below).

-   filesink: “file-mode” property to allow the ability to specify rb+ file mode, which overwrites an existing file. This is
    useful in combination with splitmuxsink so that files can be pre-allocated which can be useful to reduce disk fragmentation
    over time.

-   flvmux: add “enforce-increasing-timestamps” property to allow disabling a hack that was added back in the day because
    librtmp as used in rtmpsink would get confused by timestamps going backwards, but this is no longer required with rtmpsink2.
    If set to true (still the default, for backwards compatibility), flvmux will modify buffers timestamps to ensure they are
    always strictly increasing, inside one stream and also between the audio and video streams.

-   giostreamsink: Add a property to close the stream on stop().

-   h264parse improved its AU boundary detection.

-   h264parse, h265parse, mpegvideoparse now support multiple unregistered user data SEI messages.

-   insertbin is now a registered element and available via the registry, so can be constructed via parse-launch and not just
    via the insertbin API.

-   jack: libjack is now loaded dynamically at runtime instead of linking it at build time. This means the plugin can be shipped
    on Windows and macOS and will work if there’s a user-installed JACK server/library setup.

-   jpegparse now has a rank so it will be autoplugged if needed.

-   kmssink: Add auto-detection for NXP i.MX8M Plus LCDIFv3, ST STM32 LTDC, and Texas Instruments TIDSS display controllers.

-   matroskademux and matroskamux gained support for more raw video formats, namely RGBA64_LE, BGRA64_LE, GRAY10_BE32, GRAY16_LE

-   mpg123audiodec’s rank was changed from MARGINAL to PRIMARY so it’s now higher than avdec_mp3, as it works better with
    “freeformat” MP3s.

-   msdk:

    -   DRM modifier support on Linux

    -   only expose codecs and capabilities actually supported by the platform

    -   msdkvpp video post-processing:

        -   new “hdr-tone-mapping” property to enable HDR-to-SDR tone mapping
        -   new compute scaling mode

    -   Decoders sport D3D11 and VA integration, and the VP9 decoder supports certain resolution changes.

    -   Encoders:

        -   msdkh264enc, msdkh265enc**: “pic-timing-sei” property to insert pic timing SEI
        -   msdkh264enc, msdkh265enc**: Add properties to allow different max/min-qp values for I/P/B frames
        -   msdkh264enc: Added BGRx format DMABuf support
        -   Advertise special image formats in low power mode

-   mxfdemux gained support for FFV1 demuxing

-   opusenc, opusdec now support decoding and encoding more than 8 channels, and can also handle unknown/unpositioned channel
    layouts.

-   The oss plugin gained a device provider for audio device discovery

-   pcapparse learned how to handle the Linux “cooked” capture encapsulation v2

-   Intel Quick Sync plugin improvements:

    -   qsvh264enc gained more encoding options
    -   qsvh265dec now supports GBR decoding and HEVC RExt profiles

-   qtdemux now adds audio clipping meta when playing gapless m4a content, supports CENC sample grouping, as well as the SpeedHQ
    video codec.

-   ristsrc gained support for dynamic payloads via the new “caps” and “encoding-name” properties. These can be used to make the
    ristsrc receive other payload types than MPEG-TS.

-   rtmp2src: a new “no-eof-is-error” property was added: There is currently no way for applications to know if the stream has
    been properly terminated by the server or if the network connection was disconnected, as an EOS is sent in both cases. With
    the property set, connection errors will be reported as errors, allowing applications to distinguish between both scenarios.

-   rtspsrc: new “extra-http-request-headers” property for adding custom http request headers when using http tunnelling.

-   sdpdemux now supports SDP source filters as per RFC 4570; audio-only or video-only streaming can be selected via the new
    “media” property, and RTCP feedback can be disabled via the “rtcp-mode” property.

-   splitmuxsrc uses natural ordering to sort globbed filenames now, i.e. 0, 1, 2, 10, 11 instead of 0, 1, 10, 11, 2, …

-   srt: Add more fields to the statistics to see how many packets were retransmitted and how many were dropped.

-   switchbin: many improvements, especially for caps handling and passthrough.

-   taginject: a “scope” property was added to allow injection of global tags in addition to the current default which is stream
    tags.

-   timeoverlay: add buffer-count and buffer-offset time modes.

-   udpsrc: new “multicast-source” property to support IGMPv3 Source Specific Muliticast (SSM) as per RFC 4604.

-   videoconvertscale, videoconvert: add a “converter-config” property to allow fine-tuning conversion parameters that are not
    exposed directly as property.

-   videoflip: many orientation tag handling fixes and improvements

-   videorate: add “drop-out-of-segment” property to force dropping of out-of-segment buffers.

-   volume now supports arbitrarily-large positive gains via a new “volume-full-range” property (it was not possibly to just
    allow a bigger maximum value for the existing “volume” property for GstController-related backwards-compatibility reasons).

-   waylandsink, gtkwaylandsink: improved frame scheduling reducing frame drops and improve throughput.

-   webpenc now has support for animated WebP which can be enabled via the new “animated” property. By default it will just
    output a stand-alone WebP image for each input buffer, just like before.

-   wpe: added a WebProcess crash handler; gained WPEWebKit 2.0 API support.

-   x264enc gained support for 8-bit monochrome video (GRAY8).

-   ximagesrc gained navigation support (mouse and keyboard events).

-   y4mdec now parses extended headers to support high bit depth video.

Plugin and library moves

-   The AMR-NB and AMR-WB plugins have been moved from -bad to -good.

Plugin and element removals

-   The entire gst-omx package and plugin has been retired. See the OMX section below for more details.

-   The RealServer RTSP extension, RDT handling and PNM source have been removed from the realmedia plugin.

-   The kate subtitle plugin has been removed.

Miscellaneous API additions

GStreamer Core

-   gst_pipeline_get_configured_latency() and gst_pipeline_is_live() convenience functions to query liveness and configured
    latency of a pipeline.

-   Plugins can now provide status info messages for plugins that will be displayed in gst-inspect-1.0 and is useful for dynamic
    plugins that register features at runtime. They are now able to provide information to the user why features might not be
    available. This is now used in the amfcodec, nvcodec, qsv, and va plugins.

-   GST_OBJECT_AUTO_LOCK() and GST_PAD_STREAM_AUTO_LOCK() are g_autoptr(GMutexLocker)-based helpers for GstPad and GstObject
    that unlock the mutex automatically when the helper goes out of scope. This is not portable so should not be used in
    GStreamer code that needs to be portable to e.g. Windows with MSVC.

-   gst_clear_context(), gst_clear_promise(), gst_clear_sample()

-   gst_util_ceil_log2() and gst_util_simplify_fraction() utility functions

-   New TAG_CONTAINER_SPECIFIC_TRACK_ID tag for container specific track ID as used in an HTML5 context, plus basic support in
    matroskademux, qtdemux, dashdemux and dashdemux2

-   New utility functions to create a stream-id without a pad for elements:

    -   gst_element_decorate_stream_id()
    -   gst_element_decorate_stream_id_printf_valist()
    -   gst_element_decorate_stream_id_printf()

-   GstQueueArray gained API for sorting and sorted insertion

-   Add strict GstStructure serialisation with gst_structure_serialize_full() in combination with GST_SERIALIZE_FLAG_STRICT
    which only succeeds if the result can later be fully deserialised again.

-   GstBaseSrc enhancements: the “automatic-eos” property can be used to do the equivalent to gst_base_src_set_automatic_eos().
    gst_base_src_push_segment() sends a segment event right away which can be useful for subclasses like appsrc which have their
    own internal queuing.

-   GstBaseSink gained a new custom GST_BASE_SINK_FLOW_DROPPED flow return which can be used by subclasses from the virtual
    ::render method to signal to the base class that a frame is not being rendered. This is used in e.g. waylandsink and ensures
    that elements such as fpsdisplaysink will correctly report the rate of frames rendered and dropped.

GstDiscoverer

-   New “load-serialized-info” signal to retrieve a serialized GstDiscovererInfo

GstSDP

-   Add gst_sdp_message_remove_media()

Video Library

DRM Modifier Support for dmabufs on Linux

See section above.

List of Video Formats for Passthrough

New helper API was added to get a list of all supported video formats, including DMA_DRM formats, and can be used to advertise
all supported formats for passthrough purposes:

-   GST_VIDEO_FORMATS_ANY_STR, GST_VIDEO_FORMATS_ANY
-   gst_video_formats_any() which can be used by bindings or for code that prefers GstVideoFormat values instead of strings.

New Video Formats

-   12-bit and 16-bit A420 / A422 / A444 (YUV with alpha channel) variants:

    -   A444_12BE, A444_12LE
    -   A422_12BE, A422_12LE
    -   A420_12BE, A420_12LE
    -   A444_16BE, A444_16LE
    -   A422_16BE, A422_16LE
    -   A420_16BE, A420_16LE

-   8-bit A422 / A444 (YUV with alpha channel) variant:

    -   A422
    -   A444

-   Planar 16-bit 4:4:4 RGB formats:

    -   GBR_16BE
    -   GBR_16LE

-   RBGA, intended to be used by hardware decoders where VUYA is only supported 4:4:4 decoding surface but the stream is encoded
    with GBR color space, such as HEVC and VP9 GBR streams for example.

-   Two tiled Mediatek 10-bit formats:

    -   MT2110T
    -   MT2110R

-   Tiled 10-bit NV12 format NV12_10LE40_4L4 (Verisilicon Hantro)

Miscellaneous performance, latency and memory optimisations

-   liborc 0.4.35 (latest: 0.4.38) adds support for AVX/AVX2 and contains improvements for the SSE backend.

-   liborc 0.4.37 adds support for NEON on macOS on Apple ARM64 CPUs.

-   Most direct use of the GLib GSLice allocator has been removed, as there is little evidence that it actually still provides
    much advantage over the standard system allocator on Linux or Windows in 2024. There is strong evidence however that it
    causes memory fragmentation for standard GStreamer workloads such as RTSP/RTP/WebRTC streaming.

-   As always there have been plenty of performance, latency and memory optimisations all over the place.

Tracing framework and debugging improvements

-   The gst-stats tool can now be passed a custom regular expression

-   gst-debug-viewer from the devtools module has seen minor improvements and fixes

New tracers

-   None in this release.

Debug logging system improvements

-   Nothing major in this cycle.

Fake video decoder

-   The new fakevideodec element does not decode the input bitstream, it only reads video width, height and framerate from the
    caps and then pushes out raw video frames of the expected size in RGB format.

-   It draws a snake moving from left to right in the middle of the frame, which is reasonably light weight and still provides
    an idea about how smooth the rendering is.

Tools

-   gst-launch-1.0 gained a new --prog-name command line option to set the program name, which will be used by GTK and GStreamer
    to set the class or app-id.

-   gst-play-1.0 now defaults to using playbin3, but can still be made to use the old playbin by passing the --use-playbin2
    command line argument.

GStreamer FFmpeg wrapper

-   New avvideocompare element to compare two incoming video buffers using a specified comparison method (e.g. SSIM or PSNR).

-   Prefer using FFmpeg Musepack decoder/demuxer over musepackdec as they work better with decodebin3 and playbin3 which likes
    to have parsers and decoders separate.

-   Added codec mappings for AV1, MxPEG, FFVHuff video

-   Added raw video format support for P010, VUYA, Y410, P012, Y212 and Y412.

-   Newer, non-deprecated APIs are used by the plugin when built with FFmpeg 6.0 or newer.

-   The FFmpeg meson subproject wrap has been updated to v6.1

-   Note: see Known Issues section below for known issues with FFmpeg 6.0

GStreamer RTSP server

-   New “ensure-keyunit-on-start” property: While the suspend modes NONE and PAUSED provided a low startup latency for
    connecting clients, it did not ensure that streams started on fresh data. With this new property it is possible to maintain
    the low startup latency of those suspend modes while also ensuring that a stream starts on a key unit. Furthermore, by
    setting the new “ensure-keyunit-on-start-timeout” property it is also possible to accept a key unit of a certain age, but
    discard it if too much time has passed and instead force a new key unit.

-   rtspclientsink: apply “port-range” property for RTCP port selection as well

GStreamer VA-API support

GstVA

-   vah264dec, vah265dec, vavp8dec, vavp9dec, vampeg2dec and vaav1dec were promoted to rank PRIMARY+1 on Linux

-   Improved support for dmabuf use cases. All va elements now negotiate the new and improved dmabuf capabilities with explicit
    modifiers. This supports both import and export of dmabufs.

-   Added vaav1enc element, available in recent Intel and AMD GPUs

-   Added support for the experimental VA-Win32 backend. It needs at least libva 1.18

-   Improved handling of multi-GPU systems. Still, sharing buffers among them is not advised.

-   Bumped minimum libva version to 1.12

-   Enhanced support for RadeonSI Mesa driver for 10bit decoding

-   Register elements only for allowed drivers (Intel and Mesa, for the moment)

GStreamer-VAAPI

-   The new GstVA elements (see above) should be preferred when possible.

-   Ranks of decoders were demoted to NONE so they won’t be used automatically by playbin and similar elements anymore.

-   Clean-ups and minimal fixes.

-   gstreamer-vaapi should be considered deprecated and may be discontinued as soon as the va plugin is fully feature
    equivalent. Users who rely on gstreamer-vaapi are encouraged to migrate and test the va elements at the earliest
    opportunity.

GStreamer Video4Linux2 support

-   New uvcsink element, based on v4l2sink allow streaming your pipeline as a UVC camera using Linux UVC Gadget driver.

-   v4l2src now supports 10/12/14/16-bit bayer formats.

-   Stateful decoders now pass too large encoded frames over multiple buffers.

-   AV1 Stateless video decoder.

-   Stateless decoders now tested using Virtual driver (visl), making it possible to run the tests in the cloud based CI

GStreamer OMX

-   The gst-omx module has been removed. The OpenMAX standard is long dead and even the Raspberry Pi OS no longer supports it.
    There has not been any development since 1.22 was released. Users of these elements should switch to the Video4Linux-based
    video encoders and decoders which have been the standard on embedded Linux for quite some time now.

-   Hardware vendors which still use OpenMAX are known to have non-standard forks and it is recommended that they maintain it
    while planning their move to the Video4Linux API.

GStreamer Editing Services and NLE

-   Implement a gesvideoscale effect which gives user the ability to chooses where a clip has to be scaled in the chain of
    effects. By default scaling is done in the compositor.

-   Add support for gessrc as sub-timeline element so third party can implement their own formatters and use their timelines as
    sub-timelines. Before that, only timelines serialized as files on the filesystem could be loaded as sub-timelines (using
    gesdemux).

-   Implement a new GESDiscovererManager singleton object making management of the discoverers used to discoverer media files
    cleaner and allowing to expose the following APIs:

    -   load-serialize-info signal so GstDiscovererInfo can be serialized by users the way they like and load them without
        requiring discovering the file when reloading a project.
    -   source-setup signal so user can tweak source elements during discovery

-   Expose GESFrameCompositionMeta in public API so user can implement their own effects targetting GES which take into account
    that meta.

-   Expose audioconvert:mix-matrix property in audio sources

-   Port GESPipeline rendering to use encodebin2. This allows rendering timelines directly with a muxing sink (like hlssinkX
    etc..) and leverage all new features of that new element.

ges-launch

-   Fix setting keyframes

-   Add an ignore-eos option

-   Allow overriding container profile so that the user can build encoding profiles following the media format of a specific
    media file, for example, but ensuring it is muxed using a specific format

-   Ensure sink elements are inside a GstBin and never in a GstPipeline

-   Move +effect stack effects from source to last effect added, so it feels more natural to user as adding them at the
    beginning of the chain while the syntax is +effect felt wrong

GStreamer validate

-   In action types, add a way to avoid checking property value after setting it, in case elements do it async for example.

-   Add a vmethod to free GstValidateActionParameters to be more binding friendly.

-   Allow scenarios to define the pipeline state target in the metadata instead of assuming PLAYING state.

-   Add support to run sub-pipelines/scenarios

    -   Added support to forward buffers from appsink to appsrc

-   Add a way to set pipeline base-time, start-time and force using the system clock.

-   Add a ‘fill-mode’ to the appsrc-push action type so we can create some type of streams easily using an appsrc, giving
    control when writing scenarios without requiring files with the content.

-   Add a “select-streams” action type to test “stream aware” elements.

-   Add a way to wait for a property to reach a specified value before executing an action. For example it is possible to wait
    for a pad to get some specific caps set before executing an action.

-   validate: Add support to replace variables in deeply nested structures in particular for more complex action types where
    some of the properties are inside structures.

-   Fixed compatibility with Python 3.12.

GStreamer Python Bindings

gst-python is an extension of the regular GStreamer Python bindings based on gobject-introspection information and PyGObject,
and provides “syntactic sugar” in form of overrides for various GStreamer APIs that makes them easier to use in Python and more
pythonic; as well as support for APIs that aren’t available through the regular gobject-introspection based bindings, such as
e.g. GStreamer’s fundamental GLib types such as Gst.Fraction, Gst.IntRange etc.

-   Added a GstTagList override that makes a tag list act like a dict

-   Fix build and usage in Windows

-   Various fixes for Python >= 3.12

-   Rework libpython loading to be relocatable

-   Fix libpython dlopen on macOS

GStreamer C# Bindings

-   The GStreamer C# bindings have been updated to a more recent version of GtkSharp and the bindings have been regenerated with
    that version.

-   GStreamer API added in recent GStreamer releases is now available

-   GstRtspServer bindings have been added, plus an RTSP server example

GStreamer Rust Bindings and Rust Plugins

The GStreamer Rust bindings and plugins are released separately with a different release cadence that’s tied to the twice-a-year
GNOME release cycle.

The latest release of the bindings (0.22) has already been updated for the new GStreamer 1.24 APIs, and works with any GStreamer
version starting at 1.14.

gst-plugins-rs, the module containing GStreamer plugins written in Rust, has also seen lots of activity with many new elements
and plugins. The GStreamer 1.24 binaries track the 0.12 release series of gst-plugins-rs, and fixes from newer versions will be
backported as needed to the 0.12 brach for future 1.24.x bugfix releases.

Rust plugins can be used from any programming language. To applications they look just like a plugin written in C or C++.

WebRTC

-   New element webrtcsrc that can act as a recvonly WebRTC client. Just like the opposite direction, webrtcsink, this can
    support various different WebRTC signalling protocols. Some are included with the plugin and provide their own element
    factory for easier usage but it is also possible for applications to provide new signalling protocol implementations.

-   webrtcsink now exposes the signaller as property and allows implementing a custom signaller by connecting signal handlers to
    the default signaller.

-   A new signaller and webrtcsink implementation for Janus’ VideoRoom implementation. The corresponding webrtcsrc signaller
    implementation is currently in a merge request in GitLab.

-   New whepsrc element that can receive WHEP WebRTC streams. This is currently not based on webrtcsrc but in the future a new
    element around webrtcsrc will be added.

-   New whipserversrc element around webrtcsrc for ingesting WHIP WebRTC streams in GStreamer.

-   New whipclientsink element around webrtcsink for publishing WHIP WebRTC streams from GStreamer. This deprecates the old
    whipsink element.

-   A new signaller and webrtcsink implementation for LiveKit. The corresponding webrtcsrc signaller implementation was merged
    into the git repository recently.

-   A new signaller and webrtcsink implementation for AWS Kinesis Video Streams

-   webrtcsink has a new payloader-setup signal to allow the application more fine grained control over the RTP payloader
    configuration, similar to the already existing encoder-setup signal for encoders.

-   webrtcsrc gained support for a custom navigation event protocol over the data channel, which is compatible with the
    navigation event protocol supported by webrtcsink.

-   webrtcsink supports encoded streams as input. Using encoded streams will disable webrtcsinks congestion control changing any
    encoded stream parameters.

-   webrtcsink and webrtcsrc have a new signal ‘request-encoded-filter’ to allow transformations of the encoded stream. This can
    be used, for example, for the same use-cases as the WebRTC Insertable Streams API.

-   gstwebrtc-api: JavaScript API for interacting with the default signalling protocol used by webrtcsink / webrtcsrc.

… and various other smaller improvements!

RTSP

-   New rtspsrc2 element. Only a subset of RTSP features are implemented so far:
    -   RTSP 1.0 support
    -   TCP, UDP, UDP-Multicast lower transports
    -   RTCP SR, RTCP RR, RTCP-based A/V sync
        -   Tested for correctness in multicast cases too
    -   Lower transport selection and order (NEW!)
        -   The existing rtspsrc has a hard-coded order list for lower transports
    -   Many advanced features are not implemented yet, such as non-live support. See the README for the current status.

GTK4

-   Support for rendering GL textures on X11/EGL, X11/GLX, Wayland, macOS, and WGL/EGL on Windows.

-   Create a window for testing purposes when running in gst-launch-1.0 or if GST_GTK4_WINDOW=1 is set.

-   New background-color property for setting the color of the background of the frame and the borders, if any. This also allows
    setting a fully transparent background.

-   New scale-filter property for defining how to scale the frames.

-   Add Python example application to the repository.

-   Various bugfixes, including support for the new GTK 4.14 GL renderer. The plugin needs to be built with at least the
    gtk_v4_10 feature to work with the new GTK 4.14 GL renderer, and will work best if built with the gtk_v4_14 feature.

Closed Caption

-   Add cea608tocea708 element for upconverting CEA-608 captions to their CEA-708 representation.

-   Add support for translations within transcriberbin.

-   awstranscriber supports translating the transcribed text into different languages, including multiple languages at the same
    time.

-   awstranscriber is using the new HTTP/2-based API now instead of the WebSocket-based one.

Other new elements

-   New awss3putobjectsink that works similar to awss3sink but with a different upload strategy.

-   New hlscmafsink element for writing HLS streams with CMAF/ISOBMFF fragments.

-   New inter plugin with new intersink and intersrc elements that allow to 1:N connect different pipelines in the same process.
    This is implemented around the appsrc / appsink-based StreamProducer API that is provided as part of the GStreamer Rust
    bindings, and is also used inside webrtcsrc and webrtcsink.

-   New livesync element that allows maintaining a contiguous live stream without gaps from a potentially unstable source.

-   New isomp4mux non-fragmented MP4 muxer element.

Other improvements

-   audiornnoise
    -   Attach audio level meta to output buffers.
    -   Add voice detection threshold property
-   fmp4mux
    -   Add support for CMAF-style chunking, e.g. low-latency / LL HLS and DASH
    -   Add support for muxing Opus, VP8, VP9 and AV1 streams
    -   Add ‘offset-to-zero’ property and make media/track timescales configurable
-   hlssink3
    -   Allow adding EXT-X-PROGRAM-DATE-TIME tag to the manifest.
    -   Allow generating I-frame-only playlist
-   ndi
    -   Closed Caption support in ndisrc / ndisink
    -   Zero-copy output support in ndisrc for raw video and audio
-   spotifyaudiosrc: Support configurable bitrate

For a full list of changes in the Rust plugins see the gst-plugins-rs ChangeLog between versions 0.9 (shipped with GStreamer
1.22) and 0.12 (shipped with GStreamer 1.24).

Cerbero Rust support

-   As of GStreamer 1.24, the GStreamer Rust plugins are shipped as part of our binary packages on all major platforms. This
    includes Android and iOS now in addition to macOS and Windows/MSVC.

Build and Dependencies

-   Meson >= 1.1 is now required for all modules

-   The GLib requirement has been bumped to >= 2.64

-   liborc >= 0.4.38 is strongly recommended

-   libnice >= 0.1.22 is strongly recommended, as it is required for WebRTC ICE consent freshness (RFC 7675).

-   gst-libav was updated for FFmpeg API deprecations and removals

-   libwebpmux is required for the animated WebP support

-   The wpe plugin gained support for the WPEWebKit 2.0 API version

-   Bumped minimum libva version to 1.12 for the va plugin.

-   zxing: added support for the zxing-c++ 2.0 API

-   The ptp-helper for Precision Time Protocol (PTP) support in GStreamer core has been rewritten in Rust, and the minimum
    required Rust version for building this is 1.48, i.e. the version currently in Debian stable. On Windows, at least Rust 1.54
    is needed. There is a new ptp-helper Meson feature option that can be used to make sure everything needed for PTP support is
    available (if set to ptp-helper=enabled). cargo is not required for building.

-   gst-plugins-rs requires Rust 1.70 or newer.

-   Link to libsoup at build time in all cases on non-Linux, and only load it dynamically on Linux systems where we might need
    to support a mix of applications with dependencies that might be using libsoup2 or libsoup3. A “soup-version” meson build
    option was added to prefer a specific version. Distros should make sure that libsoup is still a package dependency, since
    it’s still required at runtime for the soup and adaptivedemux2 plugins to function.

-   libjack is now dynamically loaded at runtime by the JACK audio plugin, and no longer a hard build dependency. However, it
    still is a runtime dependency, so distros should make sure it remains a package dependency.

Monorepo build (née gst-build)

-   There is now a top-level meson build option to enable/require webrtc

-   The FFmpeg subproject wrap was udpated to 6.1

-   A libvpx wrap was added (for VP8/VP9 software encoding/decoding)

gstreamer-full

-   Add full static build support, including on Windows: Allow a project to use gstreamer-full as a static library and link to
    create a binary without dependencies. Introduce the meson build option gst-full-target-type to select the build type:
    dynamic (default) or static.

-   Registers all full features in a plugin now to offer the possibility to get information at the plugin level and get it from
    the registry. All the full features are now registered in a fullstaticfeatures meta plugin instead of having a NULL plugin.

Development environment

-   add VSCode IDE integration

-   gst-env.py: Output a setting for the prompt with --only-environment

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

-   New plugins have been added
    -   codecalpha dvbsubenc rtponvif switchbin videosignal isac ivfparse inter rtspsrc2
-   JACK plugin is now available all platforms (previously only Linux), and will be loaded if the JACK library is found at
    plugin load time
-   Several recipes were ported to meson, leading to faster builds and better MSVC support
    -   ffmpeg, gperf, lame, libvpx, ogg, opencore-amr, sbc, speex, tiff, webrtc-audio-processing
    -   For more information, please see the tracker issue
-   Some recipes are now outdated or unnecessary and have been removed:
    -   intltool, libkate
-   Various recipe updated to their latest versions
-   Rust toolchain updated to 1.76.0 (latest as of writing)
-   Rust plugins are now stripped and debug info split out correctly, reducing their size
-   Fix several spurious build issues, especially with the Rust toolchain
-   CMake is picked up from the system if available
-   Cerbero will no longer OOM or consume excessive resources on low-end systems
-   Python recipes have been moved from setuptools to virtualenv
-   Fixed support for Python 3.12+

macOS

-   Minimum macOS version has been increased to 10.13 (High Sierra)
    -   Released 5½ years ago, >95% marketshare
-   Fix macOS app store validation issue caused by absolute RPATHs
-   Rosetta is automatically installed if required for universal builds on Apple Silicon
-   The official macOS binaries now also include static libs for the GStreamer Rust plugins

iOS

-   Minimum iOS version has been increased to 12.0
-   The iOS binary packages now include the GStreamer Rust plugins
-   tremor and ivorbisdec plugins are no longer shipped on iOS

Windows

-   New features shipped with the official binaries:
    -   plugins: dwrite d3d12 (MSVC) soundtouch (MSVC) taglib (MSVC) webrtcdsp (MSVC)
    -   plugin features: d3d11-wgc (Windows Graphics Capture Support)
    -   libraries: gstdxva-1.0
-   New qml6 plugin can be built on Windows with the qt6 variant enabled
    -   Similar to qt5, this plugin cannot be included in the official binaries
-   GLib process handling helpers for Windows are now shipped
-   Windows 11 SDK is now required for builds
    -   Visual Studio 2019 and newer ship this SDK
-   MSYS is now deprecated for building Windows binaries, will be removed in the next release
    -   MSYS2 is required, and the bootstrap script tools/bootstrap-windows.ps can install it for you
-   Windows bootstrap script tools/bootstrap-windows.ps1 is much more interactive and user-friendly now
-   Fixed Pango crash on 32-bit Windows
-   WiX packaging now works with cross-windows builds from linux

Linux

-   Linux packages will now also include static libs for the GStreamer Rust plugins
-   Add Python support for multiarch distributions
-   Build fixes for various recipes on multiarch distributions
-   Use arch-specific libdir correctly on multiarch distributions
-   gst-omx was removed from gstreamer, and hence is no longer shipped
-   Fixed Gentoo support
-   Added support for RHEL 9
-   Added support for Rocky Linux
-   Added support for Manjaro Linux

Android

-   Android NDK has been updated to r25c
    -   Only the Clang toolchain is used from the NDK now (both target and host)
    -   gnustl has been completely removed
-   The Android binary packages now include the GStreamer Rust plugins
-   tremor and ivorbisdec plugins are no longer shipped on Android
-   openh264 plugin no longer enables ASM optimizations on Android x86 due to relocation errors

Platform-specific changes and improvements

Android

-   Add NDK implementation of Android MediaCodec. This reduces the amount of Java <-> native calls, which should reduce
    overhead.

-   Add support for AV1 to the androidmedia video encoder and decoder.

Apple macOS and iOS

-   osxaudio: audio clock improvements (interpolate based on system time)

-   Set activation policy in gst_macos_main() and in osxvideosink and glimagesink. Setting the policy to
    NSApplicationActivationPolicyAccessory by default makes sure that we can activate windows programmatically or by clicking on
    them. Without that, windows would disappear if you clicked outside them and there would be no way to bring them to front
    again. This change also allows osxvideosink to receive navigation events correctly.

Windows

-   New DirectWrite text rendering plugin with dwriteclockoverlay, dwritetimeoverlay, dwritetextoverlay, dwritesubtitlemux, and
    dwritesubtitleoverlay elements, including closed caption overlay support in dwritetextoverlay.

-   PTP clock support is now also available on Windows

-   qml6d3d11sink is a new Direct3D11 Qt6 QML sink for Windows as an alternative to the existing qml6glsink.

-   wasapi2 audio plugin:

    -   Added an option to monitor a loopback device’s mute state
    -   Allows process loopback capture on Windows 10

-   win32ipc supports zero-copy rendering now through a shared bufferpool.

-   Add a Windows-specific plugin loader implementation (gst-plugin-scanner), so plugin loading during registry updates happens
    in an external process on Windows as well.

-   gst_video_convert_sample() which is often used for thumbnailing gained a D3D11 specific conversion path.

-   d3d11 plugin:

    -   d3d11mpeg2dec element is promoted to PRIMARY + 1 rank
    -   Added d3d11ipcsrc and d3d11ipcsink elements for zero-copy GPU memory sharing between multiple processes.
    -   Added HLSL shader pre-compilation (at binary build time) support in MSVC build.
    -   d3d11videosink and d3d11convert elements support 3D transform, MSAA (MultiSampling Anti-Aliasing) and anisotropic
        sampling method.
    -   Added support for more raw video formats by using compute shader. A list of supported raw video formats can be found in
        the d3d11videosink plugin documentation.
    -   Added d3d11overlay element for applications to be able to draw/blend an overlay image on Direct3D11 texture directly.

-   New Direct3D12 plugin: From a video decoding, conversion, composition, and rendering point of view, this new d3d12 plugin is
    feature-wise near equivalent to the d3d11 plugin. Notable differences between d3d12 and d3d11 are:
    -   The GStreamer Direct3D12 integration layer is not exposed as a GStreamer API yet. Thus, other plugins such as amfcodec,
        nvcodec, qsv, and dwrite are not integrated with d3d12 yet.
    -   H.264 video encoding support via d3d12h264enc element.
        -   Direct3D12 video encoding API requires Windows 11 or DirectX 12 Agility SDK
    -   IPC, overlay, and deinterlace elements are not implemented in d3d12
    -   Windows Graphics Capture API based screen capturing is not implemented in d3d12
    -   In this release, MSVC is the only officially supported toolchain for the d3d12 plugin build.
    -   All d3d12 elements are zero ranked for now. Users will need to adjust rank of each d3d12 element via GST_PLUGIN_RANK
        environment or appropriate plugin feature APIs if they want these elements autoplugged.

Documentation improvements

-   hotdoc has been updated to the latest version, and the theme has also been updated, which should fix various usability
    issues.

Possibly Breaking Changes

-   gst_plugin_feature_check_version() has been updated to fix unexpected version check behaviour for git versions. It would
    return TRUE if the plugin version is for a git development version (e.g. 1.24.0.1) and the check is for the “next” micro
    version (1.24.1). Now it no longer does this. This just brings the runtime version check in line with the build time version
    checks which have been fixed some time ago.

-   GstAudioAggregator and subclasses such as audiomixer now sync property values to output timestamp, which is what
    GstVideoAggregator has been doing already since 2019, and which makes sense, as the properties need to change at every
    output frame based on the output time because they may change even though the input frame is not changing.

-   rtpac3depay now outputs audio/x-ac3 instead of audio/ac3 as that is the canonical media format in GStreamer. audio/ac3 is
    still sometimes accepted as input format for backwards compatibility (e.g. in rtpac3pay or ac3parse), but shouldn’t be
    output.

-   timecodestamper: The “drop-frame” property now defaults to TRUE

-   The NVIDIA desktop GPU decoders nvh264sldec, nvh265sldec, nvvp8sldec and nvvp9sldec were renamed to nvh264dec, nvh265dec,
    nvvp8dec and nvvp9dec, respectively.

Known Issues

-   There are known issues with FFmpeg version 6.0.0 due to opaque passing being broken in that version. This affects at least
    avdec_h264, but may affect other decoders as well. Versions before 6.0.0, and 6.0.1 or higher are not affected.

Statistics

-   4643 commits

-   2405 Merge Requests

-   850 Issues

-   290+ Contributors

-   ~25% of all commits and Merge Requests were in Rust modules

-   4747 files changed

-   469633 lines added

-   209842 lines deleted

-   259791 lines added (net)

Contributors

Aaron Boxer, Aaron Huang, Acky Xu, adixonn, Adrian Fiergolski, Adrien De Coninck, Akihiro Sagawa, Albert Sjölund, Alessandro
Bono, Alexande B, Alexander Slobodeniuk, Alicia Boya García, amindfv, Amir Naghdinezhad, anaghdin, Anders Hellerup Madsen,
Andoni Morales Alastruey, Antonio Kevo, Antonio Rojas, Arnaud Rebillout, Arnaud Vrac, Arun Raghavan, badcel, Balló György, Bart
Van Severen, Bastien Nocera, Benjamin Gaignard, Bilal Elmoussaoui, Brad Hards, Camilo Celis Guzman, Carlo Cabrera, Carlos
Falgueras García, Carlos Rafael Giani, Célestin Marot, Chao Guo, Charlie Blevins, Cheah, Vincent Beng Keat, Chris Degawa, Chris
Spencer, Christian Curtis Veng, Christian Meissl, Christopher Degawa, Chris Wiggins, Cidana-Developers, Colin Kinloch, Damian
Hobson-Garcia, Daniel Almeida, Daniel Knobe, Daniel Moberg, Daniel Morin, Daniel Pendse, Daniel Stone, Daniel Ulery, Dan
Searles, Dario Marino Saccavino, Dave Patrick Caberto, David Craven, David Revay, David Rosca, David Svensson Fors, Detlev
Casanova, Diego Nieto, Dominique Leroux, Dongyun Seo, Doug Nazar, Edward Hervey, Ekwang Lee, elenril, Elliot Chen, Enrique Ocaña
González, Erik Fröbrant, Eva Pace, Evgeny Pavlov, Fabian Orccon, Felix Yan, Fernando Jiménez Moreno, Florian Zwoch, François
Laignel, Frank Dana, Georges Basile Stavracas Neto, Guillaume Desmottes, Guillaume Gomez, Gwyn Ciesla, Haihua Hu, Hassene Tmar,
hassount, Heiko Becker, He Junyan, hguermaz, Hiero32, Hosang Lee, Hou Qi, Hugo Svirak, Hugues Fruchet, Hu Qian, Hyung Song,
Ignazio Pillai, Ilie Halip, Itamar Marom, Ivan Molodetskikh, Ivan Tishchenko, JackZhouVCD, Jacob Johnsson, jainl28patel, Jakub
Adam, James Cowgill, James Hilliard, James Oliver, Jan Alexander Steffens (heftig), Jan Beich, Jan Schmidt, Jan Vermaete, Jayson
Reis, Jeff Wilson, Jeongki Kim, Jeri Li, Jimmi Holst Christensen, Jimmy Ohn, Jochen Henneberg, Johan Adam Nilsson, Johan
Sternerup, John King, Jonas Danielsson, Jonas K Danielsson, Jonas Kvinge, Jordan Petridis, Jordan Yelloz, Josef Kolář, Juan
Navarro, Julien Isorce, Jun Zhao, Jurijs Satcs, Kalev Lember, Kamal Mostafa, kelvinhu325, Kevin Song, Khem Raj, Kourosh
Firoozbakht, Leander Schulten, Leif Andersen, L. E. Segovia, Lieven Paulissen, lijing0010, Lily Foster, Link Mauve, Li Yuanheng,
Loïc Le Page, Loïc Molinari, Lukas Geiger, Luke McGartland, Maksym Khomenko, Ma, Mingyang, Manel J, Marcin Kolny, Marc Leeman,
Marc Solsona, Marc Wiblishauser, Marek Vasut, Marijn Suijten, Mark Hymers, Markus Ebner, Martin Nordholts, Martin Robinson, Mart
Raudsepp, Marvin Schmidt, Mathieu Duponchelle, Matt Feury, Matthew Waters, Matthias Fuchs, Matthieu Volat, Maxim P. Dementyev,
medithe, Mengkejiergeli Ba, Michael Bunk, Michael Gruner, Michael Grzeschik, Michael Olbrich, Michael Tretter, Michiel
Westerbeek, Mihail Ivanchev, Ming Qian, Nader Mahdi, naglis, Nick Steel, Nicolas Beland, Nicolas Dufresne, Nirbheek Chauhan,
Olivier Babasse, Olivier Blin, Olivier Crête, Omar Khlif, Onur Demiralay, Patricia Muscalu, Paul Fee, Pawel Stawicki, Peter
Stensson, Philippe Normand, Philipp Zabel, PhoenixWorthVCD, Piotr Brzeziński, Priit Laes, Qian Hu, Rabindra Harlalka, Rafał
Dzięgiel, Rahul T R, rajneeshksoni, Ratchanan Srirattanamet, renjun wang, Rhythm Narula, Robert Ayrapetyan, Robert Mader, Robert
Rosengren, Robin Gustavsson, Roman Lebedev, Rouven Czerwinski, Ruben Gonzalez, Ruslan Khamidullin, Ryan Pavlik, Sanchayan Maity,
Sangchul Lee, Scott Kanowitz, Scott Moreau, SeaDve, Sean DuBois, Sebastian Dröge, Sebastian Szczepaniak, Sergey Radionov,
Seungha Yang, Shengqi Yu, Simon Himmelbauer, Slava Andrejev, Slawomir Pawlowski, soak, Stefan Brüns, Stéphane Cerveau, Stephan
Seitz, Stijn Last, Talha Khan, Taruntej Kanakamalla, Jin Chung Teng, Théo Maillart, Thibault Saunier, Thomas Schneider,
Tim-Philipp Müller, Tobias Rapp, Tong Wu, Tristan van Berkom, ttrigui, U. Artie Eoff, utzcoz, Víctor Manuel Jáquez Leal, Vivia
Nikolaidou, Wang Chuan, William Manley, Wojciech Kapsa, Xabier Rodriguez Calvar, Xavier Claessens, Xuchen Yang, Yatin Maan,
Yinhang Liu, Yorick Smilda, Yuri Fedoseev, Gang Zhao, Jack Zhou, …

… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all!

Stable 1.24 branch

After the 1.24.0 release there will be several 1.24.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.24.x
bug-fix releases will be made from the git 1.24 branch, which will be a stable branch.

1.24.0

GStreamer 1.24.0 was released on 4 March 2024.

Schedule for 1.26

Our next major feature release will be 1.26, and 1.25 will be the unstable development version leading up to the stable 1.26
release. The development of 1.25/1.25 will happen in the git main branch of the GStreamer mono repository.

The schedule for 1.26 is yet to be decided.

1.26 will be backwards-compatible to the stable 1.24, 1.22, 1.20, 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 Edward Hervey, Matthew Waters, Nicolas
Dufresne, Nirbheek Chauhan, Olivier Crête, Sebastian Dröge, Seungha Yang, Thibault Saunier, and Víctor Manuel Jáquez Leal.

License: CC BY-SA 4.0
