=== release 1.28.9 ===

2026-11-06 12:54:37 +0000  Tim-Philipp Müller <tim@centricular.com>

	* gst-plugins-good.doap:
	* meson.build:
	  Release 1.28.9

2026-11-06 10:56:54 +0000  Tim-Philipp Müller <tim@centricular.com>

	* scripts/dist-common-files.py:
	  scripts: dist-common-files: update for new release notes formatting

2026-10-19 13:19:20 +0300  Sebastian Dröge <sebastian@centricular.com>

	* ext/adaptivedemux2/gstadaptivedemux-stream.c:
	* ext/adaptivedemux2/gstadaptivedemux.c:
	* ext/adaptivedemux2/gstadaptivedemuxutils.c:
	* ext/adaptivedemux2/gstadaptivedemuxutils.h:
	  adaptivedemux2: Fix recursive scheduler lock double unlocks on stream preparation interruption
	  When the scheduler loop was stopping, gst_adaptive_demux_loop_pause_and_lock()
	  failed and gst_adaptive_demux2_stream_wait_prepared() returned without the
	  scheduler lock. Its callers released the lock nonetheless, causing the recursive
	  mutex to be unlocked too often and popping the thread default main context too
	  often, too.
	  To solve this, track threads that temporarily unlocked the scheduler lock for
	  other operations (e.g. waiting for the stream preparation condition variable),
	  and then wait for all of them to be finished before releasing the main context.
	  Without this it can also happen that the main context would already have been
	  released while the threads are actually still using it.
	  Also add a missing scheduler unlock in handle_stream_selection() when stream
	  selection is attempted during period migration.
	  https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5202
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12974>

2026-10-17 09:46:46 +0300  Sebastian Dröge <sebastian@centricular.com>

	* ext/adaptivedemux2/gstadaptivedemux.c:
	* ext/adaptivedemux2/gstadaptivedemuxutils.c:
	  adaptivedemux2: Ensure period stream access is protected by the right mutexes everywhere
	  Otherwise this can lead to a use-after-free during element shutdown at least.
	  reset() must always be called with the manifest lock (as documented) but wasn't
	  during state changes, and that allowed periods to be freed while they're still
	  in use on other threads in e.g. handle_incoming_manifest() and prepare_streams(),
	  which shortly releases the other lock (scheduler lock) while waiting for stream
	  to be prepared.
	  As part of this it's also required to stop all period tasks that are currently
	  waiting for stream preparation, which would otherwise lead to a deadlock because
	  another thread might try locking the manifest and scheduler lock for signalling
	  the cond that loop_stop() would be waiting for.
	  In addition, make sure to not keep the context lock locked when early-returning
	  in loop_pause_and_lock() if context is NULL.
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5202
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12974>

2026-08-27 18:29:20 -0400  Nicolas Dufresne <nicolas.dufresne@collabora.com>

	* ext/adaptivedemux2/gstadaptivedemux.c:
	  adaptivedemux2: Fix TO_READY state transition
	  If an element inside the stream parsebins is waiting, it will holds on the
	  downloader mainloop, and the downloader will simply never stop, leading to
	  a deadlock. Forward the PAUSED_TO_READY state transition before attempting to
	  wait on the downloader thread to stop.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12974>

2026-10-19 13:22:41 +0300  Sebastian Dröge <sebastian@centricular.com>

	* ext/adaptivedemux2/gstadaptivedemux-private.h:
	  adaptivedemux2: Fix GST_ADAPTIVE_SCHEDULER_LOCK() to actually use its argument
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12974>

2026-11-01 23:11:12 +0200  Sebastian Dröge <sebastian@centricular.com>

	* gst/rtp/gstrtpvrawdepay.c:
	  rtpvrawdepay: Make packet bounds checks underflow-proof
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/13005>

2026-11-01 23:09:39 +0200  Sebastian Dröge <sebastian@centricular.com>

	* gst/rtp/gstrtpvrawdepay.c:
	  rtpvrawdepay: Fix theoretical use-after-free of the source caps
	  The negotiated caps were unreferenced before being passed
	  to `gst_rtp_vraw_depay_negotiate_pool()`. The caps were
	  stored on the pad so were still alive in practice.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/13005>

2026-11-01 23:01:23 +0200  Sebastian Dröge <sebastian@centricular.com>

	* gst/rtp/gstrtpvrawdepay.c:
	  rtpvrawdepay: Validate caps before using them
	  Parse fmtp integers strictly, reject dimensions below one sampling group or
	  above the 15-bit line/offset fields, and check the return value of
	  gst_video_info_set_format().
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5320
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/13005>

2026-10-26 16:34:34 +0200  Sebastian Dröge <sebastian@centricular.com>

	* gst/rtp/gstrtph264depay.c:
	  rtph264depay: Fix out of bounds read in MTAP16/MTAP24 depayloading
	  The MTAP16/MTAP24 aggregation unit loop compared the signed payload
	  length against a size_t, so a negative payload length (possible with
	  truncated packets, e.g. a single payload byte announcing MTAP16) was
	  converted to a huge positive value and the loop was entered anyway.
	  This read NAL sizes and data, and copied up to 65535 bytes, past the
	  end of the RTP buffer.
	  Require the MTAP payload header and decoding order number base to be
	  present before stripping them, and make the aggregation unit size
	  signed so the loop bounds and the NALU size clamping work as
	  intended. Also add the missing check that the STAP-A/STAP-B payload
	  header is present.
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/5310
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/13003>

2026-10-23 15:45:11 +0900  Qi Hou <qi.hou@nxp.com>

	* ext/adaptivedemux2/downloadhelper.c:
	* ext/adaptivedemux2/downloadhelper.h:
	* ext/adaptivedemux2/gstadaptivedemux.c:
	  adaptivedemux2: Restrict URI schemes in the download helper
	  URIs taken from the manifest (BaseURL, xlink:href, segments, keys)
	  were not scheme-checked, so a remote manifest could read local files
	  through file://.
	  Only allow http, https and data in downloadhelper_submit_request().
	  file:// is allowed only when the manifest itself is a local file.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/13002>

2026-10-02 09:46:07 -0600  Ben Ashby <mail@benashby.com>

	* sys/v4l2/gstv4l2object.c:
	  v4l2object: accept any colorimetry on coded OUTPUT caps
	  For raw formats, add_non_colorimetry_caps() appends a copy of each
	  probed structure without colorimetry, so any colorimetry from upstream
	  still negotiates. Coded formats don't get that copy, so a V4L2 decoder
	  refuses a stream whose colorimetry wasn't probed, and decodebin3 falls
	  back to software. h264parse and h265parse report such values, 2:3:0:0
	  and 2:3:0:1, for a VUI that leaves the primaries or the transfer
	  unspecified.
	  On the OUTPUT queue, coded caps are the decoder's input, and their
	  colorimetry is only a hint the decoder passes in S_FMT. Append the copy
	  for coded formats on that queue too. On CAPTURE, encoders and v4l2src
	  report what they produce, so coded caps there keep the probed list.
	  Fixes #5142
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12699>

2026-10-01 17:45:23 -0600  Ben Ashby <mail@benashby.com>

	* sys/v4l2/gstv4l2object.c:
	  v4l2object: fix IS_MUTABLE assertion in set_format
	  When the driver returns a field or a colorspace that GStreamer can't
	  map, gst_v4l2_object_set_format_full() removes interlace-mode or
	  colorimetry from the caps it was given. On S_FMT these are negotiated
	  caps, which the m2m elements pass without a writable copy, and the
	  call fails with:
	  gst_structure_remove_field: assertion 'IS_MUTABLE (structure)' failed
	  v4l2h264dec hits this on any H.264 stream without a colour description
	  when the driver keeps V4L2_COLORSPACE_DEFAULT for the coded format.
	  Only drop the fields on TRY_FMT, where v4l2src adjusts its own copy of
	  the caps during fixation, and leave negotiated caps alone.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12699>

2026-11-04 23:06:44 +0100  Mathieu Duponchelle <mathieu@centricular.com>

	* gst/rtpmanager/rtpsession.c:
	  rtpsession: fix potential ownership race condition on source removal
	  When remove_source is called, the session lock may be released
	  temporarily.
	  In that interval, another thread may remove the source from the
	  hashtable, thus invalidating the reference we got from find_source.
	  By the time remove_source returns, old_source may have been invalidated,
	  and we cannot safely access its ssrc field to remove it from the
	  hashtable.
	  Fix by using a steal variant of find_source()
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12981>

2026-11-03 15:54:12 +0100  Mathieu Duponchelle <mathieu@centricular.com>

	  rtpsession: fix source use-after-free on DoS protection
	  There were two issues at play:
	  * Reference ownership: in obtain_source, the new source is added to the
	  hashtable (ownership transfer), then add_source_to_lru_queue is called,
	  which may release the session lock temporarily when the DoS protection
	  mechanism kicks in. During that interval the source may be removed from
	  our hash table, leading to a use after free when we tried to ref
	  it afterwards. Fix by moving g_object_ref earlier.
	  * Premature timeout: with the same mechanism, the source could get
	  removed prematurely, as its last_activity fields hadn't been set yet.
	  Fix by also moving the setting before any potential unlocking of the
	  session as well
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5402
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12981>

2026-04-29 19:17:16 +0800  Qian Hu (胡骞) <qian.hu@mediatek.com>

	* sys/v4l2/gstv4l2object.c:
	  v4l2object: reject incompatible downstream allocation pool
	  When the proposed allocation parameters from downstream do not match
	  our buffer layout requirements, we must reject the pool and reset
	  allocation parameters to force an update.
	  Additionally, moved the buffer size validation to happen after
	  matching the layout to properly check if the requested buffer size
	  is at least the V4L2 object size.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12935>

2025-11-27 15:32:24 +0800  Qian Hu (胡骞) <qian.hu@mediatek.com>

	* sys/v4l2/gstv4l2object.c:
	  v4l2object: providing aligned size when propose allocation
	  for multiplane, we also calculate aligned size. otherwise size = 0, and
	  upstream gst_v4l2_object_match_buffer_layout_from_struct will fail.
	  and, since we pass driver align size for upstream element, upstream element
	  should not just return when this size not match with calculated one
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12935>

2026-10-30 19:37:36 -0300  Thibault Saunier <tsaunier@igalia.com>

	* gst/imagefreeze/gstimagefreeze.c:
	* tests/check/elements/imagefreeze.c:
	  imagefreeze: keep the caps across a flush
	  A flush from upstream reset the element, dropping the caps it had
	  received along with the buffer. The caps stay on the pads across a
	  flush though, so upstream doesn't send them again unless they change,
	  and the next buffer then failed with not-negotiated.
	  This happens when an upstream decoder is flushed and keeps producing
	  the same caps, e.g. when it is reused to decode another image of the
	  same size.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12925>

2026-01-30 14:17:26 +0800  Qian Hu (胡骞) <qian.hu@mediatek.com>

	* sys/v4l2/gstv4l2videodec.c:
	  v4l2dec: fix POLLERR from dec loop when flush seek
	  When playback starts, a flush seek is issued. The decoder receives
	  a flush_start event, and at this moment, the decoder is in the
	  handle_frame process, performing a process_buffer operation. Because
	  the pool has been flushed, the acquire buffer operation inside fails,
	  and as a result, input streamon will not be called. Also, since capture has
	  not yet been streamon'ed, and the V4L2 framework has the following
	  requirements, this will cause capture poll to return pollerr.
	  https://elixir.bootlin.com/linux/v6.6/source/drivers/media/v4l2-core/v4l2-mem2mem.c#L925
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12921>

2026-04-14 12:24:14 +0200  Ignacio Casal Quinteiro <qignacio@amazon.com>

	* sys/v4l2/gstv4l2object.c:
	  v4l2: fix non-constant initializer in colorspace_variants
	  In C, with old compilers like the one in Amazon Linux 2,
	  const struct variables are not compile-time constants and cannot
	  be used as initializers for static/global arrays. Inline the struct
	  values directly into the colorspace_variants[] array definition.
	  ```C
	  ../sys/v4l2/gstv4l2object.c:144:3: error: initializer element is not constant
	  rec709_full_range, bt470bg_full_range, bt2020_pq, smpte170m_full_range
	  ^~~~~~~~~~~~~~~~~
	  ../sys/v4l2/gstv4l2object.c:144:3: note: (near initialization for ‘colorspace_variants[0]’)
	  ../sys/v4l2/gstv4l2object.c:144:22: error: initializer element is not constant
	  rec709_full_range, bt470bg_full_range, bt2020_pq, smpte170m_full_range
	  ^~~~~~~~~~~~~~~~~~
	  ../sys/v4l2/gstv4l2object.c:144:22: note: (near initialization for ‘colorspace_variants[1]’)
	  ../sys/v4l2/gstv4l2object.c:144:42: error: initializer element is not constant
	  rec709_full_range, bt470bg_full_range, bt2020_pq, smpte170m_full_range
	  ^~~~~~~~~
	  ../sys/v4l2/gstv4l2object.c:144:42: note: (near initialization for ‘colorspace_variants[2]’)
	  ../sys/v4l2/gstv4l2object.c:144:53: error: initializer element is not constant
	  rec709_full_range, bt470bg_full_range, bt2020_pq, smpte170m_full_range
	  ^~~~~~~~~~~~~~~~~~~~
	  ../sys/v4l2/gstv4l2object.c:144:53: note: (near initialization for ‘colorspace_variants[3]’)
	  ```
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12920>

2026-10-26 14:55:51 +0800  Qian Hu (胡骞) <qian.hu@mediatek.com>

	* sys/v4l2/gstv4l2bufferpool.c:
	  v4l2bufferpool: deactivate other pool on start failure
	  If startup fails after other_pool has been activated, the downstream
	  pool remains active. Configuration changes are then rejected and later
	  activation attempts skip its start callback, which can lead to
	  negotiation failures in appsrc + v4l2convert pipelines.
	  Deactivate other_pool in the common startup failure cleanup, including
	  buffer acquisition and import failures, so it can be reconfigured and
	  started again.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12865>

2026-10-05 15:33:24 +0200  Andreas Cord-Landwehr <andreas.cord-landwehr@claas.com>

	* ext/qt6/qt6glwindow.cc:
	  qml6glsrc: Qt6GLWindow destructor abort due to active render thread callback
	  This commit fixes a recorded abort in g_mutex_clear: The root cause is
	  that Qt6GLWindow connects with Qt::DirectConnection to Qt render
	  thread signals. Thus, connected callbacks are executed in context of
	  the render thread. The callbacks beforeRendering and afterRendering
	  further lock the priv->lock mutex. The recorded crash shows the abort
	  upon g_mutex_clear in the destructor while the mutex is still locked in
	  the render thread.
	  This commit introduces a CallbackGuard to synchronize Qt6GLWindow
	  lifetime with concurrent render thread callbacks. The new guard counts
	  active callbacks to the render thread and rejects further callbacks after
	  calling close(). By this, the Qt6GLWindow destructor can wait for all
	  callbacks running in the render thread to be finished (further callbacks
	  are not being created now because of QObject::disconnect; though this
	  does not stop currently running callbacks), before detroying the mutex
	  and destroying the object.
	  Additional change is that Qt6GLWindowPrivate now is created with
	  new/delete to call the new shared_ptr constructor/destructor.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12850>

2026-09-01 16:45:26 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/rtp/gstrtph264depay.c:
	* gst/rtp/gstrtph265depay.c:
	  rtph264depay: rtph265depay: Drop delayed header extensions when dropping packets
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12826>

2026-09-01 10:45:43 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/rtp/gstrtph264depay.c:
	* gst/rtp/gstrtph265depay.c:
	  rtph264depay: rtph265depay: Drop delayed header extensions when dropping all NALs of a packet
	  If all NALs of a non-FU packet are dropped we need to drop the delayed header
	  extensions of that packet too or otherwise they would leak into the next output
	  buffer.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12826>

2026-09-01 10:40:12 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/rtp/gstrtph265depay.c:
	  rtph265depay: Flush when dropping a buffer because of waiting for a keyframe
	  Otherwise delayed header extensions might still be queued.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12826>

2026-04-24 16:15:12 +0200  RSWilli <bartel.wilhelm@gmail.com>

	* gst/audiofx/gstscaletempo.c:
	* tests/check/elements/scaletempo.c:
	* tests/check/meson.build:
	  scaletempo: drop empty buffer instead of outputting 0-sized with no GAP
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12817>

2026-10-22 21:26:39 +0800  Qian Hu (胡骞) <qian.hu@mediatek.com>

	* sys/v4l2/gstv4l2videodec.c:
	  v4l2videodec: fix codec_data leak
	  Delay the extra codec_data or frame input reference until pool configuration
	  and activation succeed.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12823>

2026-10-19 17:09:50 -0400  Xavier Claessens <xclaessens@netflix.com>

	* docs/gst_plugins_cache.json:
	* gst/level/gstlevel.c:
	* tests/check/elements/level.c:
	  level: Add 24bits support
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12816>

2026-10-23 11:06:12 +0530  Nirbheek Chauhan <nirbheek.chauhan@coram.ai>

	* gst/rtsp/gstrtspsrc.c:
	  rtspsrc: Reuse non-compliant URL fallback across tracks
	  After a SETUP succeeds using an appended control URL, use that form
	  for subsequent relative control URLs in the same SETUP pass.
	  This avoids a second rejected SETUP when both video and audio need
	  the workaround, as seen with Herospeed cameras.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12813>

2021-11-15 14:43:06 +0000  Kushal Arora <kusarora@amazon.com>

	* gst/isomp4/qtdemux.c:
	* tests/check/elements/qtdemux.c:
	  qtdemux: fix seek beyond the end of file in push mode
	  When seeking past the file's duration, no segment was pushed in
	  gst_qtdemux_map_and_push_segments() and the playback froze indefinitely.
	  As a fix, always activate the last item in stream->segments[], which
	  will generate a segment event followed by EOS, finishing te playback
	  gracefully.
	  Co-authored-by: Jakub Adam <jakub.adam@collabora.com>
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12808>

2026-10-06 09:20:07 +0200  Andreas Cord-Landwehr <andreas.cord-landwehr@claas.com>

	* ext/qt6/qt6glwindow.cc:
	  qml6glsrc: fix possible race with Qt6GLWindow::onSceneGraphInvalidated
	  The onSceneGraphInvalidated callback runs in context of the Qt render
	  thread and accesses priv->produced_buffer and priv->buffer.
	  Concurrently, the priv->produced_buffer is accessed by
	  qt6_gl_window_take_buffer(). Protect access to both buffers by locking
	  the priv->lock mutex (locking priv->buffer is only for consistency).
	  This race could possibly lead to a double unref or use-after-free of
	  the produced_buffer.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12795>

2026-09-28 12:20:28 +0900  Qi Hou <qi.hou@nxp.com>

	* sys/v4l2/gstv4l2videodec.c:
	  v4l2videodec: Fix race between drain and pending source change
	  Clearing self->draining in gst_v4l2_video_dec_finish() before
	  V4L2_DEC_CMD_STOP assumed that a drain always cancels a pending
	  resolution change. However, the decoder may dequeue a source change
	  event (setting draining = TRUE) just before finish() is called. This
	  clearing causes the subsequent STREAMON after a seek to never
	  complete, hanging the decoder.
	  Remove the draining flag reset from finish() so that a pending source
	  change is no longer cancelled by a drain. Instead, unconditionally
	  clear the flag in flush(), which is the correct place: flush tears down
	  and resets all decoder state, effectively cancelling any in-progress
	  source change. This also covers the drain() path (finish + flush),
	  where flush cleans up the flag after finish preserves it.
	  Fixes #3522
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12769>

2026-10-20 11:00:47 +0200  Edward Hervey <edward@centricular.com>

	* gst/audioparsers/gstmpegaudioparse.c:
	  mpegaudioparse: Avoid OOB read when looking for Xing header
	  Found by oss-fuzz
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12774>

2026-10-10 10:16:23 +0900  Qi Hou <qi.hou@nxp.com>

	* gst/isomp4/qtdemux.c:
	  qtdemux: bound PIFF and saiz sample_count
	  sample_count in PIFF and saiz boxes is read from the file and was used
	  to size allocations unchecked. g_try_new() is no fix as large
	  allocations usually succeed with overcommit.
	  - piff: reject sample_count larger than the remaining data allows,
	  including the sub-sample encryption path.
	  - saiz: reject sample_count larger than the total trun sample count
	  of the traf.
	  - cenc_aux_info: check the total aux info size against the available
	  data and don't pre-allocate crypto_info from sample_count.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12781>

2026-10-19 12:41:53 -0400  Dominique Leroux <dominique.p.leroux@gmail.com>

	* ext/vpx/gstvpxdec.c:
	  vpxdec: Implement no-op drain callback
	  Supported libvpx versions (1.7.0 and newer) return decoded frames synchronously,
	  and GstVPXDec retrieves all available output while handling each input frame.
	  Consequently, there are no pending decoded frames to drain so a no-op is enough
	  and also avoids the GstVideoDecoder FIXME message in logs.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12768>

2026-10-14 15:27:34 +0200  Albert Sjölund <alberts@axis.com>

	* gst/rtsp/gstrtspsrc.c:
	  rtsp: unset response even on error path
	  There can still be underlying allocations on the error_path. Make sure
	  that response is unset, even on error.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12756>

2026-10-19 18:15:53 +0300  Sebastian Dröge <sebastian@centricular.com>

	* ext/adaptivedemux2/hls/gsthlsdemux-stream.c:
	  hlsdemux2: Validate PKCS7 padding before unpadding decrypted fragments
	  The padding byte comes from the decrypted ciphertext, which is
	  attacker-controlled. If it is 0, or larger than the AES block size
	  or the buffer itself, the unpadded size computation can underflow
	  and corrupt the heap when gst_buffer_resize() is called with a bogus
	  size.
	  Validate the padding byte before trusting it, and reject the
	  fragment with a warning if it looks invalid.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12753>

2026-09-23 20:37:56 +0800  Leo Zhen <leo.zhen@netint.cn>

	* gst/flv/gstflvdemux.c:
	  flvdemux: Don't report EOS on AVC/audio sequence end
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12751>

2026-10-13 17:09:38 +0200  Edward Hervey <edward@centricular.com>

	* tests/check/elements/parsebin.c:
	* tests/check/meson.build:
	* tests/files/id3-tagged.mp3:
	  parsebin: Check exposed stream-starts are covered by a stream collection
	  A parser creates its stream-id when it pushes its first buffer, so a chain
	  exposed as soon as the parser is plugged publishes a stream collection built
	  from an earlier stream-start and then emits a different one. decodebin3 finds
	  no collection covering that stream and aborts.
	  Collect the stream collections and the stream-starts a parsebin source pad
	  publishes and assert every stream-start is described by one of them, which is
	  the rule decodebin3 applies in find_collection_for_stream().
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12716>

2026-08-26 09:00:14 +0200  Jens Kleintje <jens.kleintje@emlix.com>

	* sys/v4l2/gstv4l2bufferpool.c:
	  v4l2bufferpool: fix buffer leak on streamon failure
	  When gst_v4l2_buffer_pool_streamon() fails, allocated buffers are not
	  properly released on platforms such as the i.MX8MP, where the V4L2 driver
	  validates the stream format during VIDIOC_STREAMON.
	  When VIDIOC_STREAMON fails, clear the state of the buffers queued before
	  the failure and perform the necessary cleanup.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12698>

2026-10-08 17:42:50 +0200  Tim-Philipp Müller <tim@centricular.com>

	* meson.build:
	  Back to development after 1.28.8
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12673>

=== release 1.28.8 ===

2026-10-08 17:20:32 +0200  Tim-Philipp Müller <tim@centricular.com>

	* gst-plugins-good.doap:
	* meson.build:
	  Release 1.28.8

2026-10-02 16:12:33 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/rtpmanager/rtpsession.c:
	* tests/check/elements/rtpsession.c:
	  rtpsession: Ignore SDES priv RTCP packets with invalid lengths
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5307
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12659>

2026-09-24 13:19:05 +0100  Tim-Philipp Müller <tim@centricular.com>

	* gst/matroska/matroska-ids.c:
	  matroskademux: fix crash caused by bogus xiph codec data packet sizes
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5311
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12658>

2026-09-24 11:59:50 +0100  Tim-Philipp Müller <tim@centricular.com>

	* gst/rtp/gstrtpL16depay.c:
	* gst/rtp/gstrtpL24depay.c:
	* gst/rtp/gstrtpL8depay.c:
	* gst/rtp/gstrtpchannels.c:
	* gst/rtp/gstrtpchannels.h:
	  rtpL8depay, rtpL16depay, rtpL24depay: fix out of bounds write for high channel count
	  The positions array is only 64 entries large, but if a high channel count
	  is signalled in the SDP we might try to initialise more entries than are
	  available and write beyond the end of the array.
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5271
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5306
	  Fixes ZDI-CAN-31143
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12657>

2026-09-23 09:37:22 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/rtp/gstrtph265depay.c:
	  rtph265depay: Check for short packets before processing them
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5258
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12655>

2026-10-01 17:30:59 +0200  David Lincoln <dave_exile@hotmail.com>

	* gst/isomp4/gstqtmux.c:
	* gst/isomp4/gstqtmux.h:
	  qtmux: preserve earliest reordered presentation time
	  Track the earliest presentation timestamp independently from the first buffer
	  timestamp. Use it for global timeline and edit-list calculations so reordered
	  streams retain leading presentation frames.
	  This makes sure that correct edit lists and ctts are created for streams where
	  the earliest PTS is not the first PTS, e.g. when the first frame is a B-frame.
	  The Rust MP4 muxer uses the same approach.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12635>

2026-10-04 20:58:08 +0530  Sanchayan Maity <sanchayan@centricular.com>

	* gst/audiofx/audiofxbasefirfilter.c:
	* tests/check/elements/audiofirfilter.c:
	  audiofxbasefirfilter: Account for channels in FFT mode for push_residue
	  This resulted in corruption of the final EoS tail in FFT mode for channels > 1.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12615>

2026-10-04 20:52:32 +0530  Sanchayan Maity <sanchayan@centricular.com>

	* gst/audiofx/audiofxbasefirfilter.c:
	  audiofxbasefirfilter: Make sure we are not left with a dangling pointer
	  When the frequency response is not re-built after being freed, we can be
	  left with a dangling pointer resulting in a double free in finalize().
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12615>

2026-10-04 20:49:15 +0530  Sanchayan Maity <sanchayan@centricular.com>

	* gst/audiofx/audiofirfilter.c:
	  audiofirfilter: Fix minor typo in latency
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12615>

2026-09-28 19:46:40 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/audioparsers/gstflacparse.c:
	  flacparse: Fix resyncing after a seek
	  1d913768 introduced a regression in flacparse where seeking to a previously
	  unindexed position (i.e. requiring resyncing) would error out instead of
	  skipping to the next start of a frame. An invalid frame would be considered as a
	  valid frame of size 0 and then error out.
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5314
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12574>

2026-09-23 18:56:50 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/matroska/matroska-demux.c:
	* gst/matroska/matroska-ids.c:
	* gst/matroska/matroska-ids.h:
	* gst/matroska/matroska-mux.c:
	  matroska: Use the display unit for storing the display aspect ratio more accurately
	  With Matroska (not WebM) the display aspect ratio can be stored directly as
	  display size when setting the display unit to DAR. This allows to avoid rounding
	  errors.
	  For WebM the best we can do is the existing code as it requires pixels as
	  display unit.
	  In the demuxer, avoid some overflows in the code and also don't calculate the
	  pixel aspect ratio for unknown display units.
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5272
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12572>

2026-09-20 13:37:47 +0200  Remus Lazar <remus@lazar.info>

	* ext/adaptivedemux2/meson.build:
	  adaptivedemux2: Remove redundant hls_dep fallback
	  hls/meson.build unconditionally declares hls_dep, but the fallback
	  assignment afterwards overwrites it. This makes hls_dep.found() always
	  return false, silently skipping hlsdemux_m3u8.
	  Remove the redundant fallback so the test runs again.
	  The bug was introduced in 3de86b2b9725c111998d6e42b54a2f67582a3db7; the test
	  has not run since 2025-01-13.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12553>

2026-09-24 22:34:42 +0300  Maxandre Ogeret <maxandreogeret@gmail.com>

	* gst/rtp/gstrtph265pay.c:
	  rtph265pay: unmap the RTP header before appending the payload
	  gst_rtp_h265_pay_payload_nal_single() kept the RTP header buffer mapped
	  for writing while appending the payload. With aggregate-mode=zero-latency
	  an aggregation packet can carry 16 memories, so the append merges all
	  memories, the read map of the still write-mapped header fails, and the
	  buffer ends up with a dangling memory.
	  Unmap before appending, as the FU path and rtph264pay already do.
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/5327
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12549>

2026-09-23 15:31:30 +0900  Qi Hou <qi.hou@nxp.com>

	* sys/v4l2/gstv4l2object.c:
	  v4l2: object: Don't corrupt the caller's filter caps when probing
	  In gst_v4l2_object_probe_caps(), the DMABuf candidate branch built the
	  temporary format_caps with gst_caps_append_structure() and then called
	  gst_caps_set_features() on the incoming filter caps to attach
	  GST_CAPS_FEATURE_MEMORY_DMABUF.
	  That is wrong for three reasons:
	  - filter is owned by the caller (the pad caps query), so modifying it
	  leaks a side effect back to the caller and can hit a writability
	  assertion when the caps refcount is greater than one.
	  - only structure index 0 was touched, leaving any other structure in
	  the filter untouched.
	  - the feature belongs on the candidate caps we are about to intersect
	  against the filter, not on the filter itself, so the pre-probe
	  intersection test could pick the wrong formats.
	  Attach the memory:DMABuf feature to the candidate structure directly via
	  gst_caps_append_structure_full(), which is what the rest of the file
	  (gst_v4l2_object_get_caps_helper(), gst_v4l2_object_update_and_append())
	  already does, and leave filter untouched.
	  No functional change intended for the resulting probed caps; this only
	  fixes the filter corruption and makes the cheap pre-probe rejection test
	  behave as documented.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12537>

2026-09-23 09:55:11 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/rtp/gstrtph263depay.c:
	  rtph263depay: Make payload buffer writable before modifying its content
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12533>

2026-09-23 09:47:00 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/rtp/gstrtpvp9depay.c:
	  rtpvp9depay: Check for enough data before parsing scalability structure with PG description
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12533>

2026-09-23 09:44:55 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/rtp/gstrtpmparobustdepay.c:
	  rtpmparobustdepay: Check for enough available data in all cases before parsing payload descriptor
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12533>

2026-09-23 09:43:48 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/rtp/gstrtpsv3vdepay.c:
	  rtpsv3vdepay: Check for enough available data before parsing extending width/height
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12533>

2026-09-23 09:42:36 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/rtp/gstrtph261depay.c:
	  rtph261depay: Check for enough available data before checking for picture start code
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12533>

2026-09-23 09:38:46 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/rtp/gstrtptheoradepay.c:
	* gst/rtp/gstrtpvorbisdepay.c:
	  rtpvorbisdepay: rtptheoradepay: Copy only the out-of-band config and not the whole payload
	  This should be harmless because the length is included in the data but including
	  unnecessary garbage at the end is not very clean.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12533>

2026-09-14 18:59:25 +0530  Sanchayan Maity <sanchayan@centricular.com>

	* gst/rtsp/gstrtspsrc.c:
	  rtspsrc: Fix handling of missing control attribute with multiple media sections
	  Issue reported and fix suggested by Jeremiah Morrill.
	  https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5270
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12504>

2026-09-11 16:37:53 +0800  Zhaoxuan Zhai <zhai.zhaoxuan@canonical.com>

	* sys/v4l2/gstv4l2object.c:
	* sys/v4l2/gstv4l2object.h:
	  v4l2: Fix sizeimage when VIDIOC_ENUM_FRAMESIZES is not supported
	  This patch changes the behavior of calculate_max_sizeimage, it now
	  calculates the sizeimage based on requested frame size instead of the
	  probed max image size. And this patch also removed max_width/max_height
	  field from GstV4l2Object, as they are no longer used.
	  The new calculate_max_sizeimage uses guint64 to do the calculation to
	  avoid overflow in `width * height * pixel_bitdepth`. For example,
	  if width = height = 32768 (2^15) and pixel_bitdepth = 8,
	  width * height * pixel_bitdepth = 8589934592 (2^33).
	  And the return value is guarded by G_MAXSIZE in-case the return
	  value is too large.
	  Before this patch, when VIDIOC_ENUM_FRAMESIZES is not implemented
	  by the V4L2 device driver, the `default_frame_sizes:` path in
	  gst_v4l2_object_probe_caps_for_format() uses max_w = max_h =
	  GST_V4L2_MAX_SIZE. And it results a overflow error in
	  calculate_max_sizeimage().
	  As a result, calculate_max_sizeimage() always returning 256 KiB when
	  VIDIOC_ENUM_FRAMESIZES is not supported. And 256KiB is not sufficient
	  for images with 4K resolution.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12494>

2026-09-10 13:30:56 +0300  Sebastian Dröge <sebastian@centricular.com>

	* ext/adaptivedemux2/downloadhelper.c:
	  adaptivedemux2: Drain downloadhelper main context with the main context as the thread default
	  The draining was introduced in 0fcb93a087cdc085563b52e9c2a0ac9610acd181 and not
	  making the main context the thread default will lead to assertions in libsoup if
	  a transfer was still running at this time.
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5296
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12472>

2026-09-07 20:17:18 +0100  Tim-Philipp Müller <tim@centricular.com>

	* meson.build:
	  Back to development after 1.28.7

=== release 1.28.7 ===

2026-09-07 20:11:13 +0100  Tim-Philipp Müller <tim@centricular.com>

	* gst-plugins-good.doap:
	* meson.build:
	  Release 1.28.7

2026-07-10 20:47:29 +0200  Mathieu Duponchelle <mathieu@centricular.com>

	* docs/gst_plugins_cache.json:
	* gst/rtpmanager/rtpsession.c:
	* gst/rtpmanager/rtpsession.h:
	* gst/rtpmanager/rtpsource.c:
	* gst/rtpmanager/rtpsource.h:
	* tests/check/elements/rtpsession.c:
	  rtpsession: implement DoS protection mechanisms
	  Prior to this commit, the number of sources tracked by RTPSession
	  was unlimited, opening it up to malicious attacks.
	  This implements two mechanisms:
	  * A global maximum for the total number of non-internal sources, with
	  a LRU mechanism for discarding the least-recently seen SSRC / CSRC.
	  Selected default: 150
	  * A per SSRC maximum for limiting the number of contributing sources
	  for a single synchronization source, with a LRU mechanism for
	  discarding the least-recently seen CSRC.
	  Selected default: 15
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12436>

2026-08-31 15:03:59 +0300  Sebastian Dröge <sebastian@centricular.com>

	* ext/adaptivedemux2/downloadhelper.c:
	* ext/adaptivedemux2/downloadhelper.h:
	* ext/adaptivedemux2/gstadaptivedemux.c:
	* ext/meson.build:
	* ext/soup/gstsouploader.c:
	* ext/soup/gstsouploader.h:
	* ext/soup/stub/soup.h:
	  adaptivedemux2: Use a SoupCookieJar and keep track of cookie origins correctly
	  This makes sure we're not leaking cookies to different origins. Same fix as for
	  souphttpsrc but not behind a property, which should be unnecessary here.
	  Require libsoup 2.68 (released in 2019) for the soup_cookie_jar_add_cookie_full() API.
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5174
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12438>

2026-08-12 20:48:37 +0300  Sebastian Dröge <sebastian@centricular.com>

	* docs/gst_plugins_cache.json:
	* ext/soup/gstsouphttpsrc.c:
	* ext/soup/gstsouphttpsrc.h:
	* ext/soup/gstsouploader.c:
	* ext/soup/gstsouploader.h:
	  souphttpsrc: Add new `location-trusted` property
	  When disabled (default), explicitly set cookies or extra-headers or
	  authentication information are not set when handling automatic redirects to a
	  different origin.
	  This is the same as CVE-2018-1000007 in curl and CVE-2021-31879 in wget, and the
	  solution is the same as in curl.
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5174
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12438>

2026-08-07 16:21:42 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/isomp4/qtdemux.c:
	  qtdemux: Don't try splitting CEA608 samples without known framerate
	  Splitting them would lead to invalid sized buffers and divisions by zero for the
	  timestamp calculations.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12437>

2026-08-07 16:21:05 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/isomp4/qtdemux.c:
	  qtdemux: Ensure enough data is available for reading closed caption boxes
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5235
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12437>

2026-08-31 12:55:53 +0800  aisuneko icecat <aicecat@igalia.com>

	* gst/effectv/gstquark.c:
	* gst/effectv/gstquark.h:
	  effectv: quarktv: apply proper stride for pixel iteration
	  Iterate row by row with GST_VIDEO_FRAME_PLANE_STRIDE to ensure
	  the last row is touched and the pixels are correctly indexed.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12422>

2026-08-31 12:48:18 +0800  aisuneko icecat <aicecat@igalia.com>

	* gst/effectv/gstquark.c:
	  effectv: quarktv: add error checking for gst_buffer_map
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12422>

2026-08-19 22:42:20 +0800  aisuneko icecat <aicecat@igalia.com>

	* gst/effectv/gstquark.c:
	  effectv: quarktv: read from mapped memory to improve performance
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12422>

2026-08-12 11:13:39 +0200  Frank Wennerdahl <frank.wennerdahl@soundtrack.io>

	* ext/soup/gstsouphttpsrc.c:
	  soup: fix redirect uri when not using automatic redirects
	  If `automatic-redirects` is set to `false`, the resulting
	  error should contain the redirect URI in the field
	  `"http-redirect-uri"`. This isn't the case, as
	  `src->redirection_uri` is never set before the error
	  is constructed.
	  This fix ensures that the URI is set when the status
	  is a redirect, allowing manual handling of redirects.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12391>

2026-09-01 10:51:50 +0200  Edward Hervey <edward@centricular.com>

	* gst/flx/gstflxdec.c:
	  flxdec: Actually read full palette
	  The default 0 in file means there's a full 256 palette
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12387>

2026-09-01 10:47:12 +0200  Edward Hervey <edward@centricular.com>

	* gst/flx/gstflxdec.c:
	  flxdec: Check for invalid header values
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12387>

2026-08-25 10:55:23 -0400  Eric <eric.chandrasekhar@ipconfigure.com>

	* gst/rtpmanager/gstrtpbin.c:
	* gst/rtpmanager/gstrtpjitterbuffer.c:
	* gst/rtpmanager/rtpsession.c:
	  rtpmanager: Fix malformed SDES processing segfault
	  gst_rtcp_packet_sdes_get_entry can return FALSE when the SDES entry is
	  malformed, and this wasn't being handled by the callers.
	  Now if gst_rtcp_packet_sdes_get_entry returns FALSE, the rest of the
	  SDES packet is skipped.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12375>

2026-04-14 13:08:55 +0200  Pablo García <pgarcia@fluendo.com>

	* gst/isomp4/qtdemux.c:
	  qtdemux: Add 'stream-format' field for AC-4 caps
	  According to Annex G of the AC-4 spec, the syncframe is an optional
	  layer for encapsulating AC-4 raw frames. This demuxer always outputs
	  raw frames, but the AC-4 parser/decoder needs to know.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12371>

2026-04-14 13:08:34 +0200  Pablo García <pgarcia@fluendo.com>

	* gst/isomp4/fourcc.h:
	* gst/isomp4/qtdemux_types.c:
	  qtdemux: Add AC-4 atoms
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12371>

2026-08-19 18:05:11 +1000  Matthew Waters <matthew@centricular.com>

	* ext/qt6/qt6glrenderer.cc:
	* ext/qt6/qt6glrenderer.h:
	  qt6renderer: keep output GL memory alive until next render
	  Qml seems to not correctly render an output if the output texture id is
	  the same as previously set. This can easily happen if the output texture
	  is destroyed and a new texture created with the same ID. This is
	  particularly evident with a downstream element that reads from the
	  texture and then unrefs it causing the texture to be destroyed.
	  Fix by keeping the output texture alive until we have rendered the next
	  frame.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12342>

2026-08-19 15:13:43 +1000  Matthew Waters <matthew@centricular.com>

	* ext/qt6/qt6glrenderer.cc:
	  qml6gloverlay: map output memory write|gl
	  So that if a gldownload is downstream, it can successfully transfer the
	  contents.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12342>

2026-08-06 21:28:28 +0200  Marcus Hanestad <marlhan@proton.me>

	* gst/audiofx/gstscaletempo.c:
	  scaletempo: fix integer overflow in output_overlap_s16
	  The blend weights and sample delta can each approach 65535, so their product
	  overflows the 32-bit intermediate.
	  Compute the product and shift in 64 bits.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12265>

2026-08-05 13:04:46 +0100  Tim-Philipp Müller <tim@centricular.com>

	* meson.build:
	  Back to development after 1.28.6

=== release 1.28.6 ===

2026-08-05 12:59:39 +0100  Tim-Philipp Müller <tim@centricular.com>

	* gst-plugins-good.doap:
	* meson.build:
	  Release 1.28.6

2026-08-04 20:05:57 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/rtp/gstrtph264depay.c:
	* gst/rtp/gstrtph265depay.c:
	  rtph264depay: rtph265depay: Reset missing fields when resetting during fragmentation unit handling
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12244>

2026-07-29 17:39:56 +0300  Sebastian Dröge <sebastian@centricular.com>

	* docs/gst_plugins_cache.json:
	* gst/rtp/gstrtph264depay.c:
	* gst/rtp/gstrtph264depay.h:
	* gst/rtp/gstrtph265depay.c:
	* gst/rtp/gstrtph265depay.h:
	  rtph264depay: rtph265depay: Limit the maximum fragmentation unit size
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5224
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12244>

2026-07-20 13:12:48 +0100  Tim-Philipp Müller <tim@centricular.com>

	* gst/rtp/gstrtpqcelpdepay.c:
	  rtpqcelpdepay: use clear_packets also in finalize function
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12237>

2026-07-09 10:28:00 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/rtp/gstrtpqcelpdepay.c:
	  rtpqcelp: Clear queued packets on invalid input packets
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12237>

2026-07-09 10:26:20 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/rtp/gstrtpqcelpdepay.c:
	  rtpqcelpdepay: Don't push NULL buffers downstream
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12237>

2026-07-09 10:24:34 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/rtp/gstrtpqcelpdepay.c:
	* gst/rtp/gstrtpqcelpdepay.h:
	  rtpqcelpdepay: Handle changes in interleave value correctly
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5194
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12237>

2026-07-14 13:39:30 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/matroska/matroska-ids.c:
	  matroskademux: Make sure enough data is available when parsing FLAC headers
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5206
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12242>

2026-07-14 13:22:38 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/avi/gstavidemux.c:
	  avidemux: Don't read a subindex with too many items
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12241>

2026-07-14 13:22:04 +0300  Sebastian Dröge <sebastian@centricular.com>
