=== release 1.28.9 ===

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

	* gst-plugins-base.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-29 10:09:23 -0300  Thibault Saunier <tsaunier@igalia.com>

	* gst-libs/gst/app/gstappsrc.c:
	* tests/check/elements/appsrc.c:
	  appsrc: keep queued sticky events across a flush
	  A FLUSH_STOP, or a seek on a seekable or random-access stream, dropped the
	  sticky events the application sent that were still queued, and nothing sends
	  them again. Keep the ones that go after the segment, e.g. tags, in the queue
	  after the last caps. Stream-group-done is dropped, as a flush invalidates it.
	  The events delayed until caps are known are now also unreffed on a flush;
	  they were leaked.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12986>

2026-10-27 12:53:03 -0300  Thibault Saunier <tsaunier@igalia.com>

	* gst-libs/gst/app/gstappsink.c:
	* gst-libs/gst/app/gstapputils.c:
	* gst-libs/gst/app/gstapputils.h:
	* tests/check/elements/appsink.c:
	  appsink: keep queued sticky events across a flush
	  Since serialized events can be pulled with gst_app_sink_pull_object(), the
	  queue holds them alongside the buffers, and a FLUSH_STOP dropped them all.
	  Upstream doesn't resend sticky events after a flush, as the appsink pad
	  already received them, so a pull_object() user never saw a tag or other
	  sticky event that was still queued when a flushing seek happened, e.g. the
	  image-orientation tag a parser sends once at startup.
	  Keep the queued sticky events that the pad still has after the flush, in
	  the pad's order, right after the FLUSH_STOP. The pad already dropped what
	  the flush invalidates (segment, stream-group-done), the tags of a replaced
	  stream and the older events of each sticky slot.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12986>

2026-02-02 19:28:23 +0530  Nirbheek Chauhan <nirbheek@centricular.com>

	* gst-libs/gst/gl/eagl/gstglwindow_eagl.m:
	  eagl: Remove internal_view from the superview when finalizing
	  Otherwise we will leave a dangling pointer in the UIView hierarchy,
	  and any code that encounters it will crash. This allows the iOS app to
	  reuse the UIView across pipeline instances.
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2381
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12975>

2026-10-30 09:35:43 +0100  Edward Hervey <edward@centricular.com>

	* gst-libs/gst/video/video-anc.c:
	* tests/check/libs/videoanc.c:
	  video: vbi: reject pixel widths narrower than one conversion group
	  The v210 and UYVY line converters walk whole pixel groups using a loop
	  bound of info.width - 5 (v210) or info.width - 3 (UYVY). info.width is
	  signed while the loop counter is unsigned, so a width smaller than the
	  group size makes the bound wrap to a huge value and the loop overruns
	  the work_data buffer, corrupting the heap.
	  Validate pixel_width in gst_video_vbi_parser_new() and
	  gst_video_vbi_encoder_new(), where the group size is known, so the
	  invariant holds for every consumer of info.width.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12911>

2026-10-30 11:37:08 +0100  Edward Hervey <edward@centricular.com>

	* gst-libs/gst/pbutils/gstdiscoverer.c:
	* tests/check/libs/discoverer.c:
	* tests/files/mp3-topology-uaf.bin:
	  pbutils: discoverer: Fix use-after-free when a stream reuses its parent
	  make_info() returns a reference to the parent object itself when the
	  stream being parsed has the same type as its parent. When that result
	  was then not added to a stream list, parse_stream_topology() unref'd it
	  and returned it, dropping the caller's reference while the caller still
	  wrote next->previous through the pointer.
	  Only drop the reference (and report no result) when the result is the
	  caller's own parent object, and skip the next/previous wiring when the
	  nested parse produced no stream, both for a chained stream and for the
	  substreams of a container.
	  The branches that merge a "next" node into its parent discarded the
	  result of the nested parse. As that result is now a new reference
	  whenever the parent was not re-used, capture and unref it so no stream
	  info is leaked.
	  Add a regression test pushing a stream whose topology re-exposes a node
	  with its parent's caps. The defect is in the topology parsing, so the
	  test only gates on the mp3 parser being present.
	  Found by OSS-Fuzz (testcase 4764783547842560).
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12906>

2026-10-28 17:14:25 +0100  Edward Hervey <edward@centricular.com>

	* tests/check/elements/subparse.c:
	  tests: subparse: Check unclosed SAMI tags parse linearly
	  Per the HTML 4.01 tag syntax that SAMI sync-block markup follows, a
	  dangling '<' turns everything up to the next '>' into one tag: the
	  following <SYNC> is swallowed as part of the garbage tag rather than
	  aborting the parse. Once the pending tag exceeds the parser's size cap
	  the swallow ends and parsing resumes.
	  Check both behaviours, and that unclosed '<' lines don't make parsing
	  quadratic in the input size.
	  Regression coverage for clusterfuzz-testcase-gst-subparse-5193624668405760.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12880>

2026-10-28 17:14:24 +0100  Edward Hervey <edward@centricular.com>

	* gst/subparse/samiparse.c:
	  samiparse: Cap HTML context buffer size to prevent O(n^2) slowdown
	  When html_context_parse encounters a '<' with no matching '>' in the
	  buffer, it returns without consuming anything: the pending tag stays
	  buffered until later text completes it. Each subsequent call appends
	  more data and rescans the whole buffer for '>', so every line hitting
	  this path scans an ever-growing buffer: O(n^2) overall. Under the
	  address sanitizer this is effectively a hang, as observed with
	  ClusterFuzz test case clusterfuzz-testcase-gst-subparse-5193624668405760
	  (154 lines with '<' but no '>' in an ~11k-line file).
	  Cap the pending tag at 4KB. When the cap is hit, restart the pending tag
	  at the next '<' within the kept window, so the buffer keeps starting
	  with a tag: text left in front of the first '<' would be emitted as
	  caption content, and cutting a multibyte character in half would emit
	  invalid UTF-8. If the window holds no '<', drop the pending tag.
	  This bounds the damage of a dangling '<' (per the HTML 4.01 tag syntax
	  SAMI sync blocks follow, everything up to the next '>' is one tag): the
	  swallow window ends after at most 4KB of garbage and parsing resumes at
	  the following input.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12880>

2026-10-27 10:55:51 +0100  Edward Hervey <edward@centricular.com>

	* gst-libs/gst/video/video-sei.c:
	  video: add missing precondition checks to precision time stamp parsing
	  The function dereferences user_data immediately and writes both
	  out-params after the UUID checks, without validating any of them.
	  Return FALSE on NULL instead of crashing.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12867>

2026-10-27 10:55:40 +0100  Edward Hervey <edward@centricular.com>

	* gst-libs/gst/video/video-sei.c:
	  video: fix undefined behaviour on empty unregistered user data meta
	  An unregistered user data SEI whose payload is exactly the 16-byte UUID
	  carries no data. The meta add function duplicated the payload
	  unconditionally: g_malloc(0) may return NULL, and memcpy() with a NULL
	  pointer is undefined behaviour even with a zero size. Skip the copy
	  for empty payloads and keep recording the meta (data NULL, size 0).
	  Also reject a NULL uuid, and a NULL data pointer with a non-zero size:
	  both would crash in memcpy today.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12867>

2026-06-06 19:59:24 +0200  Robert Mader <robert.mader@collabora.com>

	* gst-libs/gst/allocators/gstudmabufallocator.c:
	  udmabuf: Allow disabling via env var
	  Which often comes in handy for testing and debugging purposes.
	  This is explicitly not meant for production use-cases and IMO should not
	  be stable API.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12843>

2026-10-22 10:26:38 +0200  Edward Hervey <edward@centricular.com>

	* gst/subparse/samiparse.c:
	* tests/check/elements/subparse.c:
	  samiparse: Drop already parsed text from the HTML context buffer
	  When a line ended inside a tag, the buffer kept the text that had
	  already been parsed and reported. Every following line re-scanned it,
	  making parsing quadratic in the input size, and reported it again, so
	  subtitles before a line-split tag came out duplicated. Drop the parsed
	  prefix so only the pending tag stays buffered.
	  A tag that is never closed still buffers to the end of the input; that
	  case is left as is.
	  Found while fuzzing subparse with libFuzzer.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12820>

2026-10-02 15:12:08 +0530  Nirbheek Chauhan <nirbheek.chauhan@coram.ai>

	* gst/videoconvertscale/gstvideoconvertscale.c:
	* tests/check/elements/videoconvert.c:
	  videoconvertscale: Don't scale in the padding described by GstVideoMeta
	  Hardware decoders will often output frames that are larger than the
	  coded size. The crop meta is the source of truth, but if it's missing
	  we need to ensure that the height/width are used correctly. This ensures
	  that the converter uses the padding within the decoded buffer
	  correctly, otherwise the padding will get scaled into the output.
	  This broke fluster tests where the coded size was different from the
	  display size. This regressed in
	  https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12497
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12718>

2026-03-11 13:49:27 -0300  L. E. Segovia <amy@centricular.com>

	* gst-libs/gst/gl/meson.build:
	  winrt: fix MSYS build by checking for XAML headers on egl and d3d11
	  MSYS2 has switched to a default WINVER corresponding to Windows 10. This
	  unintentionally kept WinRT working because the default WINVER made the
	  tests involving WINAPI_PARTITION_APP etc. fail early.
	  The headers involved in gluing D3D11 are not available on the MinGW CRT.
	  See https://github.com/msys2/MINGW-packages/commit/496bb7651c8168c5ad2f1ac1b88ef12c6633e395
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12757>

2026-10-13 10:44:15 +0200  Edward Hervey <edward@centricular.com>

	* gst/playback/gstdecodebin3.c:
	  decodebin3: fail gracefully when a stream has no collection
	  mq_slot_handle_stream_start() asserted that every stream-start matched
	  a known stream collection, so an upstream publishing a pad whose
	  stream-collection does not cover the stream-start it then emits turned
	  a stream problem into a process abort.
	  Post a stream error naming the stream id and the pad instead, and return
	  without touching the output collection. Selection state is left as it
	  was so the remaining inputs keep working.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12716>

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

	* gst/playback/gstparsebin.c:
	  parsebin: wait for the parser to publish its stream-id before exposing
	  A chain was declared complete as soon as a parser was plugged, since
	  chain->parsed is set at plug time. Parsers create their stream-id
	  lazily, on the first data they push, so the exposed pad published a
	  stream-collection built from an earlier stream-start and then emitted a
	  different one. decodebin3 could not find a collection covering the
	  stream and aborted in mq_slot_handle_stream_start().
	  Require the endpad target to have published a stream-id before rule (c)
	  declares the chain complete. Exposure then happens from the block probe
	  on that target, once it has produced events, so the collection and the
	  stream-start agree by construction.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12716>

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-base.doap:
	* meson.build:
	  Release 1.28.8

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

	* gst-libs/gst/audio/gstaudiometa.c:
	  audio: Replace O(n²) overlap check in audio meta code with O(n log n) code
	  At least when receiving audio meta from the network, an attacker might provide a
	  big serialized meta with a couple of tens of thousands of channels which would
	  take a moment to check with the previous code.
	  For some example measurements:
	  - 128kB payload, 16k channels: 24.8ms before, 0.24ms now
	  - 1MB payload, 128k channels: 1.6s before, 2.9ms now
	  - 2MB payload, 256k channels: 6.4s before, 5.7ms now
	  This and all other meta deserialize function are checking for enough data to be
	  available before allocating arrays so triggering OOM by sending a payload that
	  declares more channels/etc than available inside the payload is not possible.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12652>

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

	* gst-libs/gst/audio/gstaudiometa.c:
	* gst-libs/gst/video/gstvideometa.c:
	* tests/check/libs/audio.c:
	* tests/check/libs/video.c:
	  audio: video: Validate audio/video meta deserialization
	  Accepting arbitrary values can lead to assertions or out-of-bounds reads/writes.
	  Also ensure enough payload data is available before allocating arrays or
	  otherwise e.g. a crafted channels value could lead to OOM.
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5257
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12652>

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

	* gst-libs/gst/audio/audio-channels.c:
	  audio: limit gst_audio_channel_positions_to_valid_order() to 64 channels
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12657>

2024-12-05 17:24:36 +0100  Kushal Arora <kusarora@amazon.com>

	* gst-libs/gst/app/gstappsink.c:
	* tests/check/elements/appsink.c:
	  appsink: Reset EOS state on PAUSED → READY
	  After an appsink received an EOS event, cycling its state through
	  PLAYING → READY → PAUSED left gst_app_sink_is_eos() returning TRUE.
	  Reset the EOS flag when appsink transitions from PAUSED to READY.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12663>

2026-09-25 09:28:59 +0200  Robert Mader <robert.mader@collabora.com>

	* gst-libs/gst/allocators/gstudmabufallocator.c:
	  udmabuf: Open device with O_RDONLY instead O_RDWR
	  udmabuf - just like dma-heaps - only need read access.
	  See also:
	  https://gitlab.freedesktop.org/camera/libcamera/-/commit/168b00eb344221c0c1ab27e418d71febc92d3086
	  Fixes: afab800737f7 ("allocators: Add a udmabuf allocator")
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12567>

2026-09-22 19:54:34 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst-libs/gst/sdp/gstsdpmessage.c:
	  sdpmessage: Avoid sign bit when hex-escaping chars
	  gchar is signed and `hex[c >> 4]` will give a negative number for negative
	  chars, indexing into the ro data segment before the array.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12532>

2026-08-03 11:32:52 -0400  Olivier Crête <olivier.crete@collabora.com>

	* gst/videoconvertscale/gstvideoconvertscale.c:
	* tests/check/elements/videoconvert.c:
	  videoconvertscale: Restore default config when clearing converter-config
	  Otherwise resetting the property does nothing
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12516>

2026-07-27 14:39:00 -0400  Olivier Crête <olivier.crete@collabora.com>

	* gst/videoconvertscale/gstvideoconvertscale.c:
	* tests/check/elements/videoconvert.c:
	  videoconvertscale: Take GstVideoMeta into account when converting
	  The the GstVideoInfo from the frame instead of from the caps, as this
	  one was initialized from the GstVideoMeta.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12516>

2026-09-21 12:12:07 +0300  Sebastian Dröge <sebastian@centricular.com>

	* tests/check/libs/audio.c:
	  audioconverter: Add tests for the NULL/silence handling issues
	  And also various tests for normal cases for completeness.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12517>

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

	* gst-libs/gst/audio/audio-converter.c:
	  audioconverter: Call gst_audio_format_info_fill_silence() with number of bytes instead of samples
	  The function takes the numbers of bytes and we were passing the number of
	  samples in many places. This was keeping the remainder of the samples
	  uninitialized with >8bpp formats.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12517>

2026-09-21 12:03:43 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst-libs/gst/audio/audio-converter.c:
	  audioconverter: Guard against NULL input in do_unpack() too
	  NULL is accepted to request silence output so treat it as silence input instead
	  of dereferencing it and crashing.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12517>

2026-09-20 22:54:28 +0000  Bruno Fournier <xxtqqtx@gmail.com>

	* gst-libs/gst/audio/audio-converter.c:
	  audioconverter: guard against NULL input in do_convert_out
	  audio_chain_get_samples() returns NULL when an upstream chain link produced
	  no samples yet, which happens for a short initial input whose frame count is
	  below the resampler latency. The sibling functions do_quantize() and
	  converter_generic() already guard against this, but do_convert_out()
	  dereferenced in[i] unconditionally, causing a NULL pointer dereference when a
	  float-to-integer conversion is combined with a sample rate change.
	  Guard the conversion loop with the same "if (in && out)" check the other
	  chain functions use.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12517>

2026-09-15 17:50:56 -0300  L. E. Segovia <amy@centricular.com>

	* gst-libs/gst/audio/audio-resampler-neon.h:
	* meson.build:
	  audio-resampler-neon: handle Thumb1-only builds correctly
	  Fixes #5280
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12501>

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-base.doap:
	* meson.build:
	  Release 1.28.7

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

	* gst-libs/gst/rtp/gstrtpbasedepayload.c:
	  rtpbasedepayload: Don't assert if previous buffer's delayed header extensions are still queued
	  This can happen on packet loss and various other scenarios and subclasses can't
	  always flush them themselves as it also depends on internal base class state.
	  Instead of asserting, simply log this case and flush all header extensions when
	  a new buffer is received.
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5057
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12444>

2026-09-07 20:50:00 +0530  Sanchayan Maity <sanchayan@centricular.com>

	* tests/check/gst/typefindfunctions.c:
	  Revert "tests: typefindfunctions: Add test for type finding with caps"
	  This reverts commit 300e7801765d8f09ad9bb2334420961de260c2cf.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12443>

2026-09-02 16:14:23 +1000  Matthew Waters <matthew@centricular.com>

	* gst-libs/gst/rtsp/gstrtspmessage.c:
	  rtsp/message: fix crash when an auth value started with whitespace
	  When parsing a field like 'key= ",foo=bar' the space after the '=' would be
	  considered the end of the key value pair.
	  The '=' would be found and the key (before the '=') extracted. Then the value
	  parsing would skip any initial whitespace. advancing beyond the ' '. The value
	  would then be g_strndup(value, end - value). As `end < value`, This attempts to
	  copy -1 bytes and fail.
	  Fix by using the end of the item after skipping over any whitespace.
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5278
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12431>

2026-08-16 13:46:20 +0100  Colin Kinloch <colin.kinloch@collabora.com>

	* gst-libs/gst/video/video-format.c:
	  video-format: Fix annotation on component function
	  This caused PyGObject to generate bindings for the
	  `gst_video_format_info_component` function that returned a single int
	  and would SIGSEGV when called.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12425>

2026-07-18 09:08:32 +0200  Thomas Devoogdt <thomas@devoogdt.com>

	* gst-libs/gst/sdp/gstmikey.c:
	  mikey: split master key and salt in MIKEY message generation
	  gst_mikey_message_new_from_caps writes the whole key (master key and
	  session salt concatenated) into a single TEK field. RFC 3830 table 6.13.a
	  defines both TEK (2) and TEK+SALT (3); without the latter, the receiver
	  has no way to determine the key and salt lengths. I ran into this while
	  adding MIKEY support to FFmpeg, which required a workaround, see
	  https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23408.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12404>

2026-09-03 14:28:18 -0400  Thibault Saunier <tsaunier@igalia.com>

	* tests/validate/audiotestsrc/reverse.validatetest:
	* tests/validate/compositor/renogotiate_failing_unsupported_src_format.validatetest:
	* tests/validate/encodebin/set-encoder-properties.validatetest:
	* tests/validate/fakevideodec/encoded.validatetest:
	* tests/validate/fakevideodec/simple.validatetest:
	* tests/validate/giosrc/read-growing-file.validatetest:
	* tests/validate/uridecodebin/expose_raw_pad_caps.validatetest:
	* tests/validate/videorate/10_to_1fps.validatetest:
	* tests/validate/videorate/change_rate_reverse_playback.validatetest:
	* tests/validate/videorate/change_rate_while_playing.validatetest:
	* tests/validate/videorate/drop_out_of_segment.validatetest:
	* tests/validate/videorate/duplicate_on_eos.validatetest:
	* tests/validate/videorate/duplicate_on_eos_disbaled.validatetest:
	* tests/validate/videorate/duplicate_on_eos_half_sec.validatetest:
	* tests/validate/videorate/fill_segment_after_caps_changed_before_eos.validatetest:
	* tests/validate/videorate/rate_2_0.validatetest:
	* tests/validate/videorate/reverse.10_to_30fps.validatetest:
	* tests/validate/videorate/reverse.30fps.validatetest:
	* tests/validate/videorate/reverse.variable_to_10fps.validatetest:
	* tests/validate/videorate/reverse_fast.variable_to_10fps.validatetest:
	* tests/validate/videorate/reverse_slow.variable_to_10fps.validatetest:
	  validate: Reindent all validatetest files
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12343>

2026-03-03 15:02:23 +0000  Thibault Saunier <tsaunier@igalia.com>

	* tests/validate/audiotestsrc/reverse.validatetest:
	* tests/validate/fakevideodec/encoded.validatetest:
	* tests/validate/fakevideodec/simple.validatetest:
	* tests/validate/giosrc/read-growing-file.validatetest:
	* tests/validate/videorate/change_rate_reverse_playback.validatetest:
	* tests/validate/videorate/change_rate_while_playing.validatetest:
	* tests/validate/videorate/drop_out_of_segment.validatetest:
	* tests/validate/videorate/duplicate_on_eos.validatetest:
	* tests/validate/videorate/duplicate_on_eos_disbaled.validatetest:
	* tests/validate/videorate/duplicate_on_eos_half_sec.validatetest:
	* tests/validate/videorate/fill_segment_after_caps_changed_before_eos.validatetest:
	* tests/validate/videorate/reverse.variable_to_10fps.validatetest:
	* tests/validate/videorate/reverse_fast.variable_to_10fps.validatetest:
	* tests/validate/videorate/reverse_slow.variable_to_10fps.validatetest:
	  validateflow: auto-derive directories from test file path
	  Allow validateflow configs to be written as proper nested structures
	  instead of requiring the $(validateflow) variable expansion:
	  configs = {
	  [validateflow, pad=sink:sink, buffers-checksum=true],
	  }
	  instead of:
	  configs = {
	  "$(validateflow), pad=sink:sink, buffers-checksum=true",
	  }
	  When expectations-dir or actual-results-dir are not explicitly set,
	  validate_flow_override_new() now derives them from the __filename__
	  metadata field (already attached to each config structure by the
	  parser). This mirrors the path computation done in
	  gst_validate_structure_set_variables_from_struct_file().
	  The $(validateflow) variable and the old string syntax remain fully
	  supported for backward compatibility.
	  Port all existing .validatetest files to the new syntax.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12343>

2026-08-20 12:17:55 -0400  Thibault Saunier <tsaunier@igalia.com>

	* gst/videoconvertscale/gstvideoconvertscale.c:
	  videoconvertscale: keep input colorimetry in scale-only elements
	  videoscale does not put a colorimetry field in its output caps, so
	  gst_video_info_from_caps() derives one from the frame height: BT709 above
	  576 lines, BT601 below. Scaling across that boundary makes the input and
	  output infos disagree, which disqualifies the video converter fast paths
	  and makes videoscale apply a BT709 to BT601 matrix that was never
	  requested.
	  Take the input colorimetry when the subclass cannot convert and the output
	  caps do not ask for a specific one, so an explicit downstream request still
	  wins.
	  Scaling 1000x600 to 320x240 I420 drops from 9.3 to 1.4 G instructions.
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4425
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12378>

2026-08-24 14:05:40 +0900  Seungha Yang <seungha@centricular.com>

	* gst-libs/gst/video/video-converter.c:
	* tests/check/libs/video.c:
	  video-converter: Fix GRAY output border color
	  Border color for grayscale formats should be computed like YUV
	  and use the Y component
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12374>

2026-08-20 13:06:39 +0900  Seungha Yang <seungha@centricular.com>

	* gst-libs/gst/video/video-blend.c:
	* gst-libs/gst/video/video-overlay-composition.c:
	  overlay-composition: Don't try to scale high bitdepth rectangles
	  gst_video_blend_scale_linear_RGBA() can scale only 8-bit formats
	  correctly. Skip blending the rectangle if scaling fails
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12330>

2026-08-11 15:47:07 +1000  Matthew Waters <matthew@centricular.com>

	* gst-libs/gst/gl/gstglcolorconvert.c:
	  glcolorconvert: don't rely on integer modulus '%'
	  GLSL does not support it until GLSL 1.30 which is only available with GL 3.0.
	  GL 2.1 systems instead have to use floating point mod() so convert everything
	  needing integer modulus to float and back.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12286>

2026-08-11 22:39:39 +1000  Jan Schmidt <jan@centricular.com>

	* gst-libs/gst/app/gstappsrc.c:
	* tests/check/elements/appsrc.c:
	  appsrc: Don't push EOS directly in event handler
	  The change in
	  https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11924
	  inadvertently dropped through and sent EOS events directly through
	  the default basesrc handler after the custom handling, instead of
	  letting the appsrc EOS machinery handle everything - leading to
	  unexpected extra (even endless) blocking waiting for some applications
	  that were pushing events to a blocked pipeline.
	  Add a unit test which reliably fails before, and succeeds with this
	  patch.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12283>

2026-08-05 19:21:52 +0900  Seungha Yang <seungha@centricular.com>

	* gst-libs/gst/video/gstvideometa.c:
	* gst-libs/gst/video/gstvideotimecode.c:
	  videotimecode: Fix documentation bug and update annotations
	  The implementation does not take ownership of latest_daily_jam,
	  and it is already annotated accordingly.
	  And add missing (allow-none) annotation to other methods for
	  consistency with gst_video_time_code_new()
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12255>

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-base.doap:
	* meson.build:
	  Release 1.28.6

2026-07-18 16:19:17 +0200  Tim-Philipp Müller <tim@centricular.com>

	* ext/pango/gstbasetextoverlay.h:
	* ext/pango/gsttextrender.h:
	  pango: remove incorrect G_GNUC_CONST annotation for get_type() functions
	  G_GNUC_CONST must only be used for functions that don't modify global state.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12157>

2026-07-18 16:16:11 +0200  Tim-Philipp Müller <tim@centricular.com>

	* gst-libs/gst/video/video-format.h:
	  video: remove incorrect G_GNUC_CONST annotation for gst_video_format_from_string()
	  If the string pointer passed contains a dynamic allocation, it's entirely
	  possible that the same pointer value maps to different string values, e.g.
	  because it's re-used across free/malloc or changed between invocations of
	  the function.
	  From https://gcc.gnu.org/onlinedocs/gcc-16.1.0/gcc/Common-Attributes.html#index-const:
	  > Note that a function that has pointer arguments and examines the data
	  > pointed to must not be declared const if the pointed-to data might
	  > change between successive invocations of the function. In general,
	  > since a function cannot distinguish data that might change from data
	  > that cannot, const functions should never take pointer or, in C++,
	  > reference arguments. Likewise, a function that calls a non-const
	  > function usually must not be const itself.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12157>

2026-07-18 16:06:17 +0200  Tim-Philipp Müller <tim@centricular.com>

	* gst-libs/gst/audio/audio-format.h:
	  audio: remove incorrect G_GNUC_CONST annotation for gst_audio_format_from_string()
	  If the string pointer passed contains a dynamic allocation, it's entirely
	  possible that the same pointer value maps to different string values, e.g.
	  because it's re-used across free/malloc or changed between invocations of
	  the function.
	  From https://gcc.gnu.org/onlinedocs/gcc-16.1.0/gcc/Common-Attributes.html#index-const:
	  > Note that a function that has pointer arguments and examines the data
	  > pointed to must not be declared const if the pointed-to data might
	  > change between successive invocations of the function. In general,
	  > since a function cannot distinguish data that might change from data
	  > that cannot, const functions should never take pointer or, in C++,
	  > reference arguments. Likewise, a function that calls a non-const
	  > function usually must not be const itself.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12157>

2026-01-24 13:16:22 +0000  Charles <charles05@canonical.com>

	* gst/playback/gstplaysink.c:
	  playsink: don't wait for text pad block during reconfiguration
	  When subtitles are re-enabled after being disabled (e.g., cycling through
	  subtitle tracks to "off" then back to track 1), video and audio playback
	  stalls indefinitely. This occurs because reconfiguration waits for a text
	  pad blocking probe that can never fire.
	  When gst_play_sink_request_pad creates a text pad it:
	  1. Creates a ghost pad with no target (gst_ghost_pad_new_no_target)
	  2. Installs a blocking probe on the internal proxy pad
	  3. Sets PENDING_FLAG for the pad type
	  The PENDING flag causes gst_play_sink_ready_to_reconfigure_locked to wait for
	  the blocking probe to fire before allowing reconfiguration to proceed.
	  However, the ghost pad target is only set later in gst_play_sink_do_reconfigure
	  when the text rendering chain is built and linked to the stream
	  synchronizer. Without a target, anything pushed to the ghost pad returns
	  NOT_LINKED immediately... The data never reach the internal proxy pad
	  where the blocking probe is installed.
	  This appears to creates a circular dependency:
	  - Reconfiguration waits for text blocking probe to fire
	  - Blocking probe needs data to reach internal proxy pad
	  - Data can't reach proxy pad without a ghost pad target
	  - Target is only set during reconfiguration
	  Initially, I attempted to fix the root cause by creating the stream synchronizer
	  pads early (in request_pad rather than do_reconfigure), so the ghost pad would
	  have a valid target from the start. However, this doesn't resolve the deadlock.
	  The deeper issue appears that when text is reenabled via playbin3's
	  reconfigure_output, the playsink text pad is created, but the upstream source
	  pad from uridecodebin may not be linked to it. The linking happens in
	  combiner_control_pad (called from pad_added_cb), but pad_added_cb is only
	  triggered when uridecodebin adds a *new* pad, not when an existing stream is
	  re-selected.
	  Without upstream linkage, no data flows to the text pad regardless of whether
	  the ghost pad has a target. The blocking probe cannot fire, and with
	  PENDING_TEXT set the reconfiguration just waits forever
	  This commit simply doesn't set PENDING_FLAG for GST_PLAY_SINK_TYPE_TEXT pads in
	  either gst_play_sink_request_pad or gst_play_sink_refresh_pad.
	  The blocking probe is still installed, so any text data arriving during
	  reconfiguration is properly held back, reconfiguration no longer waits for it to
	  fire. This looks safe because gst_play_sink_do_reconfigure only requires
	  playsink->text_pad to exist (not to be blocked) in order to set up the text
	  rendering chain.
	  This approach looks OK to me because:
	  - Video/audio have continuous data flow, so their probes fire quickly
	  - Text/subtitles are inherently sparse and may not have data available
	  - Text is secondary to A/V; its absence shouldn't block reconfiguration
	  - The text chain is properly set up during do_reconfigure regardless
	  Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4744
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12178>

2026-01-25 23:53:43 +0000  Charles <charles05@canonical.com>

	* gst/playback/gstplaysink.c:
	  playsink: Fix logging logic
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12178>

2026-01-25 23:53:17 +0000  Charles <charles05@canonical.com>

	* gst/playback/gstplaysink.c:
	  playsink: Fix typo
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12178>

2026-07-21 15:35:44 +0530  Nirbheek Chauhan <nirbheek@centricular.com>

	* meson.build:
	  meson: Make the g-ir-scanner init section consistent across modules
	  We weren't disabling the registry correctly due to typos and missing
	  env vars.
	  This speeds up introspection builds considerably on Windows.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12163>

2026-02-13 02:58:40 +0530  Nirbheek Chauhan <nirbheek@centricular.com>

	* gst-libs/gst/gl/eagl/gstglwindow_eagl.m:
	  gl/eagl: Fix GstGLUIView leak from duplicate __bridge_retained
	  _create_gl_window() called __bridge_retained twice on the same view,
	  storing to priv->internal_view both times. Each __bridge_retained
	  increments the ObjC retain count, but the first retained reference was
	  immediately overwritten by the second. Since gst_gl_window_eagl_finalize
	  only calls CFRelease once, the GstGLUIView (and its CAEAGLLayer) leaked
	  with an extra +1 retain count.
	  Remove the first redundant __bridge_retained. The local ARC variable
	  keeps the view alive until after addSubview: and the second
	  __bridge_retained.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12118>

2026-07-10 14:41:49 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/typefind/gsttypefindfunctions.c:
	  typefind: Fix C nonsense in ipmovie typefinder
	  memcmp() returns 0 on equality, not a non-zero value. The typefinder was
	  triggering on everything that is *not* an ipmovie file.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12098>

2026-07-09 15:50:31 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/typefind/gsttypefindfunctionsplugin.c:
	  typefind: Actually register various forgotten typefinders
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12098>

2026-07-08 23:48:39 +0200  Tim-Philipp Müller <tim@centricular.com>

	* meson.build:
	  Back to development after 1.28.5

=== release 1.28.5 ===

2026-07-08 23:42:39 +0200  Tim-Philipp Müller <tim@centricular.com>

	* gst-plugins-base.doap:
	* meson.build:
	  Release 1.28.5

2026-06-16 14:10:00 -0300  L. E. Segovia <amy@centricular.com>

	* meson.build:
	  audio-resampler: Declare that NEON support also requires Thumb
	  GCC from Yocto for Beaglebone Black doesn't enable it, so it causes a
	  build time error since !5075. All other versions that I know of
	  (Godbolt, Alpine, Ubuntu) have Thumb mode enabled by default.
	  Fixes #5164
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11971>

2026-06-22 11:54:41 +0300  Arthur Chan <arthur.chan@adalogics.com>

	* gst-libs/gst/pbutils/encoding-target.c:
	  encoding-target: Validate that encoding profile name is UTF-8 before using it
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5131
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12068>

2026-06-19 13:48:16 +0300  Sebastian Dröge <sebastian@centricular.com>

	* ext/opus/gstopusdec.c:
	  opusdec: Don't use any channel positions for >64 channels
	  We don't support this.
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5122
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12067>

2026-07-06 11:52:50 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst-libs/gst/rtp/gstrtcpbuffer.c:
	* tests/check/libs/rtp.c:
	  rtcpbuffer: Make sure to check for enough available space when adding SDES items
	  Also don't use the wrong offset if this is not actually the first packet in a
	  compound RTCP packet.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12033>

2026-07-04 15:37:58 -0500  Gordon Smith <gsmith@route8.io>

	* gst-libs/gst/rtp/gstrtcpbuffer.c:
	* tests/check/libs/rtp.c:
	  rtcpbuffer: Fix parsing of SR+SDES compound packet
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12033>

2026-07-02 18:00:06 +0530  Sanchayan Maity <sanchayan@centricular.com>

	* tests/check/gst/typefindfunctions.c:
	  tests: typefindfunctions: Add test for type finding with caps
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12020>

2026-06-08 16:50:09 +0900  Qi Hou <qi.hou@nxp.com>

	* ext/gl/gstgldownloadelement.c:
	  gldownload: fix wrong DRM format negotiation causing R/B channel swap
	  The _convert_dma_drm() function in gldownloadelement uses
	  gst_gl_dma_buf_transform_gst_formats_to_drm_formats() to convert
	  GstVideo formats to DRM formats for downstream caps negotiation.
	  It was incorrectly using GST_GL_DRM_FORMAT_DIRECT_IMPORT, which is
	  designed for the upload (import) direction. With this flag, the
	  function bypasses the standard format mapping table and instead
	  queries the EGL driver for all supported DRM formats. This causes
	  gldownload to advertise formats like DRM_FORMAT_ARGB8888 (BA24)
	  alongside DRM_FORMAT_ABGR8888 (AB24).
	  Since GL internally works with RGBA byte order (R,G,B,A in memory),
	  the only correct DRM fourcc is ABGR8888 (AB24). When a downstream
	  element such as waylandsink picks ARGB8888 (BA24) instead, the R and
	  B channels are swapped, resulting in wrong purple/pink color.
	  Fix this by using GST_GL_DRM_FORMAT_INCLUDE_EMULATED, which goes
	  through the standard GstVideo-to-DRM mapping table where RGBA is
	  correctly mapped to DRM_FORMAT_ABGR8888 only.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11997>

2026-03-30 10:22:51 -0300  L. E. Segovia <amy@centricular.com>

	* gst/typefind/gsttypefindfunctions.c:
	  typefind: fix caps leaks
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11972>

2026-03-27 18:55:14 -0300  L. E. Segovia <amy@centricular.com>

	* gst/typefind/gsttypefindfunctions.c:
	  typefind: fix incorrect parsing of WBMP multibyte integers
	  Fixes #5001
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11972>

2026-03-27 17:34:17 -0300  L. E. Segovia <amy@centricular.com>

	* gst/typefind/gsttypefindfunctionsplugin.h:
	* gst/typefind/gsttypefindfunctionsstartwith.c:
	  typefind: add X Bitmap support
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11972>

2026-03-27 17:32:48 -0300  L. E. Segovia <amy@centricular.com>

	* gst/typefind/gsttypefindfunctions.c:
	* gst/typefind/gsttypefindfunctionsstartwith.c:
	  typefind: add animated PNG detection
	  See https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/4986
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11972>

2026-06-25 18:06:39 +0200  Marcus Hanestad <marlhan@proton.me>

	* gst/playback/gsturidecodebin3.c:
	  uridecodebin3: deactivate input_item in erroneous ready->paused transition
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11952>

2026-06-24 09:51:57 +0100  Philippe Normand <philn@igalia.com>

	* gst-libs/gst/app/gstappsink.c:
	  appsink: Clear local sample storage when flushing
	  Since commit d00e0b61 appsink keeps a local reference of the current sample in
	  order to reduce allocations. However not clearing its contents upon flush events
	  would prevent associated buffers from being cleared from their pool.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11947>

2026-06-15 09:54:15 +1000  Jan Schmidt <jan@centricular.com>

	* gst-libs/gst/app/gstappsrc.c:
	  appsrc: Uniformly handle EOS events being pushed
	  Treat an EOS event being sent to appsrc via gst_element_send_event()
	  the same as if the gst_app_src_end_of_stream() method / signal were used,
	  otherwise pipelines can get stuck with the appsrc pushing thread
	  having shut down, but the gst_app_src_push_*() methods not
	  returning GST_FLOW_EOS to inform the caller. The appsrc
	  ends up still accepting / queueing data it won't send.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11925>

2026-06-22 12:44:39 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst-libs/gst/tag/gstxmptag.c:
	  xmptag: Handle fractions with 0 denominator as invalid
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11922>

2026-03-30 09:44:27 -0300  L. E. Segovia <amy@centricular.com>

	* gst-libs/gst/pbutils/descriptions.c:
	* tests/check/libs/pbutils.c:
	  gdkpixbufdec: remove Sun and Andrew raster formats
	  They were both removed in 2.32.1:
	  https://github.com/GNOME/gdk-pixbuf/commit/af2fca9bba5c127ca092c3a4bf7656015d6168ad
	  Moreover, the Andrew raster format (image/x-cmu-raster) doesn't match at
	  all the Sun raster format, the former is similar to LaTeX while the
	  latter is binary.
	  As a double safety measure, let's bump the minimum gdk-pixbuf version as
	  2.32.1 was released in 2015 [1] while 2.8.0 is from 2005 [2].
	  Fixes #5004
	  [1]: https://gitlab.gnome.org/GNOME/gdk-pixbuf/-/tags/2.32.0
	  [2]: https://gitlab.gnome.org/GNOME/gdk-pixbuf/-/tags/GTK_2_8_0
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11901>

2026-06-14 21:13:47 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/subparse/gstsubparse.c:
	  subparse: Don't allow very small framerates for microdvd subtitles
	  Very small framerates close to 0.0 would become 0/1 and still lead to a division
	  by zero. Use 1/1000 as minimum and 1000/1 as maximum framerates for subtitles.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11852>

2026-06-14 21:47:25 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst-libs/gst/tag/gstxmptag.c:
	  xmptag: Don't allocate -1 bytes of memory if there's only a single tag
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11853>

2026-06-15 12:38:31 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst-libs/gst/tag/gstvorbistag.c:
	  vorbistag: Check for enough base64 data before trying to decode
	  g_base64_decode_inplace() asserts if fewer than 2 bytes are available.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11856>

2026-06-15 12:36:33 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst-libs/gst/tag/gstvorbistag.c:
	  vorbistag: Use gsize for lengths and avoid overflows
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11856>

2026-06-12 13:27:54 +0100  Tim-Philipp Müller <tim@centricular.com>

	* meson.build:
	  Back to development after 1.28.4

=== release 1.28.4 ===

2026-06-12 13:19:43 +0100  Tim-Philipp Müller <tim@centricular.com>

	* gst-plugins-base.doap:
	* meson.build:
	  Release 1.28.4

2026-06-12 13:18:19 +0100  Tim-Philipp Müller <tim@centricular.com>

	* ext/alsa/gstalsasrc.c:
	  Revert "alsa: fix deadlock during shutdown"
	  This reverts commit dd1fbc9160e5368119544394be2c16c9e57d9a22.
	  https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11690#note_3516817

2026-06-12 12:20:36 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst-libs/gst/pbutils/gstdiscoverer.c:
	  discoverer: Lock the DISCO_LOCK whenever accessing the streams list
	  The list is accessed from multiple threads, possibly at the same time.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11840>

2026-06-04 12:39:38 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst/subparse/gstsubparse.c:
	  subparse: Avoid zero and extreme fps when parsing mdvdsub subtitles
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5068
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11810>

2026-06-04 12:16:07 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst-libs/gst/tag/id3v2.c:
	* gst-libs/gst/tag/id3v2.h:
	* gst-libs/gst/tag/id3v2frames.c:
	  id3v2: Improve const-correctness and use correct size type
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11808>

2026-06-04 12:16:03 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst-libs/gst/tag/id3v2frames.c:
	  id3v2: Check for enough data when reading RVA2 tags
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5067
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11808>

2026-06-04 12:15:58 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst-libs/gst/tag/id3v2.c:
	  id3v2: Don't modify const data
	  Also actually store caps for custom ID3v2 frames in the sample.
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5045
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11808>

2026-06-04 12:04:58 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst-libs/gst/tag/gstxmptag.c:
	  xmptag: Make sure to keep the temporary array always NUL-terminated during parsing
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5066
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11806>

2026-06-04 12:04:54 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst-libs/gst/tag/gstxmptag.c:
	  xmptag: Correctly initialize pointer to the end of the input array
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5066
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11806>

2026-06-04 12:04:44 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst-libs/gst/tag/gstxmptag.c:
	  xmptag: Improve const-correctness in parser
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11806>

2026-06-02 17:52:06 +0300  Sebastian Dröge <sebastian@centricular.com>

	* gst-libs/gst/rtp/gstrtcpbuffer.c:
	* tests/check/libs/rtp.c:
	  rtcpbuffer: Add some missing bounds checks when parsing SDES
	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/work_items/5047
