[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1092940: release.debian.org: package gstreamer1.0/1.22.12-0~deb12u1



Package: release.debian.org
Severity: normal

[Reason]
Discussion during DSA preparation where 1.22.12 carries CVE fixes and
important bugfixes.

[ Impact ]
CVE/segfaults, stability improvements

[ Tests ]
Only selected patches not yet in the LTE 1.22.12 release have been
added. Respective issues have been tested in the upstream stable release
(1.24.x) and the LTS releases.

[ Risks ]
Low. The LTS 1.22.12 is very selective in the patches added (bugfixes
and CVEs)

[ Checklist ]
  [ ] The changes are documented in detail in the changelog
      (/usr/share/doc/libgstreamer1.0-0/changelog.gz)
  [X] The changes were reviewed together with the GStreamer packaging
      team
  [X] attach debdiff against the package in (old)stable
  [X] the issue is verified as fixed in unstable

[ Changes ]
Bump release base LTS release from 1.22.0 to 1.22.12+
diff -Nru gstreamer1.0-1.22.0/ChangeLog gstreamer1.0-1.22.12/ChangeLog
--- gstreamer1.0-1.22.0/ChangeLog	2023-01-23 20:29:57.703900600 +0100
+++ gstreamer1.0-1.22.12/ChangeLog	2024-04-29 21:10:09.511509200 +0200
@@ -1,3 +1,751 @@
+=== release 1.22.12 ===
+
+2024-04-29 20:09:52 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* NEWS:
+	* RELEASE:
+	* gstreamer.doap:
+	* meson.build:
+	  Release 1.22.12
+
+2024-03-27 17:05:09 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* libs/gst/base/gstbasesrc.c:
+	  basesrc: Clear submitted buffer lists consistently with buffers
+	  And handle the case of a NULL buffer being returned cleanly, which is
+	  valid as long as a buffer list is returned instead. Previously this
+	  would cause an assertion because of calling gst_buffer_unref() with
+	  NULL.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6462>
+
+2024-03-19 08:57:43 -0400  Thomas Goodwin <thomas.goodwin@laerdal.com>
+
+	* tests/check/tools/gstinspect.c:
+	* tools/gst-inspect.c:
+	  gst-inspect: fix --atleast-version to be implicitly applied to --exists
+	  The --atleast-version implies --exists, but the implementation in
+	  earlier commits had the version check applied any time the --exists was
+	  checked, and the default value of the major and minor versions were set
+	  to the GStreamer major and minor versions.  The resulting behavior would
+	  have gst-inspect return '1' if the plugin's version didn't match
+	  gstreamer's even when --atleast-version was not specified in the command
+	  line args.  The change in this patch removes that behavior and adds
+	  tests to verify that if --exists is specified WITHOUT --atleast-version
+	  the version check will NOT be applied.  If both arguments are specified
+	  and the version does not match the arg-supplied version number, a new
+	  return code of '2' is used to uniquely identify the failure.
+	  Fixes #3246
+	  Signed-off-by: Thomas Goodwin <thomas.goodwin@laerdal.com>
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6415>
+
+2024-03-26 14:28:28 +0100  Arnaud Vrac <avrac@freebox.fr>
+
+	* plugins/elements/gstinputselector.c:
+	  inputselector: fix possible clock leak on shutdown
+	  Avoid leaking a GstClock object on shutdown, bail out before taking the ref when
+	  not playing.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6458>
+
+2024-03-26 19:40:04 +0530  Taruntej Kanakamalla <taruntej@asymptotic.io>
+
+	* libs/gst/net/gstptpclock.c:
+	  net/gstptpclock: fix double free of domain data during deinit
+	  The attempt to free the domain data is happeing twice during the ptp deinit.
+	  Once while iterating through the list domain_data and second while iterating
+	  through the list domain_clocks, so this is crashing the application
+	  trying to gst_ptp_deinit
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6459>
+
+2024-03-20 00:07:00 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* meson.build:
+	  Back to development
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6408>
+
+=== release 1.22.11 ===
+
+2024-03-19 22:01:08 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* NEWS:
+	* RELEASE:
+	* gstreamer.doap:
+	* meson.build:
+	  Release 1.22.11
+
+2024-03-13 19:12:48 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* libs/gst/net/gstptpclock.c:
+	  ptp: Initialize expected DELAY_REQ seqnum to an invalid value
+	  This allows distinguishing pending syncs that didn't have a DELAY_REQ
+	  sent from ones that did but used a seqnum of 0, like the very first one.
+	  Specifically, if the first one or more syncs are still pending and we
+	  send the first DELAY_REQ for a later pending sync, then the DELAY_RESP
+	  would've been wrongly associated to the very first pending sync because
+	  of the seqnum.
+	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3383
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6368>
+
+2024-02-27 18:59:41 +0530  Nirbheek Chauhan <nirbheek@centricular.com>
+
+	* gst/gsturi.c:
+	  gsturi: Sort by feature name to break a feature rank tie
+	  This matches autoplug in other places such as decodebin, otherwise we
+	  will pick "randomly" based on the order in which plugins are
+	  registered, which is mostly dependent on the order in which readdir()
+	  returns items.
+	  So let's make it predictable.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6348>
+
+2024-03-08 17:05:34 +1100  Jan Schmidt <jan@centricular.com>
+
+	* plugins/elements/gstidentity.c:
+	  identity: Don't refuse seeks unless single-segment=true
+	  identity only needs to configure the internal seek segment if it's
+	  aggregating upstream segments into 1. If it's not, don't break
+	  other seek behaviour by refusing (for example) instant-rate change
+	  seeks.
+	  Fixes: #3363
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6307>
+
+2024-02-25 04:26:21 +1100  Jan Schmidt <jan@centricular.com>
+
+	* gst/gstsegment.c:
+	  gstsegment: Don't use g_return_val_if_fail()
+	  Don't use g_return_val_if_fail() to catch the
+	  open-ended segment or empty segment cases in
+	  gst_segment_to_running_time_full()
+	  g_return_val_if_fail() is for programmer errors,
+	  and can be compiled out with a flag.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6279>
+
+2024-02-13 16:27:38 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* meson.build:
+	  Back to development
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6111>
+
+=== release 1.22.10 ===
+
+2024-02-13 14:39:08 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* NEWS:
+	* RELEASE:
+	* gstreamer.doap:
+	* meson.build:
+	  Release 1.22.10
+
+2024-01-26 19:12:18 +0100  Piotr Brzeziński <piotr@centricular.com>
+
+	* gst/gstmacos.m:
+	  macos: Fix gst_macos_main() terminating whole process before returning a value
+	  Removes the usage of [NSApp terminate] to avoid killing the process and thus never actually returning a value.
+	  The new way is just to use [NSApp stop] and send an event, since stop only happens after an event is processed.
+	  Unlike terminate, stop will only halt the event loop, not the whole process.
+	  This uses an NSApplicationDelegate to listen for NSApp finishing the launch process, and then signals the 'main' thread
+	  to proceed. That makes sure to never call [NSApp stop] before NSApp is actually running, which could happen if the
+	  provided 'main' function finished quickly enough.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6103>
+
+2023-04-03 13:51:38 +0100  Lukas Geiger <lukas.geiger94@gmail.com>
+
+	* gst/gstmacos.m:
+	  macos: Set activation policy in `gst_macos_main`
+	  Setting the policy to NSApplicationActivationPolicyAccessory by default makes
+	  sure that we can activate windows programmatically or by clicking on them.
+	  Without that, windows would disappear if you clicked outside them and there
+	  would be no way to bring them to front again. This change also allows osxvideosink
+	  to receive navigation events correctly.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6103>
+
+2024-02-05 18:37:59 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/gstpad.c:
+	  pad: Copy over seqnum when creating a new segment event for applying pad offset
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6067>
+
+2023-11-21 19:54:32 -0300  Thibault Saunier <tsaunier@igalia.com>
+
+	* libs/gst/base/gstbasesink.c:
+	  basesink: Preroll on out of segment buffers when not dropping them
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6045>
+
+2024-01-25 00:18:12 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* meson.build:
+	  Back to development
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5990>
+
+=== release 1.22.9 ===
+
+2024-01-24 18:21:13 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* NEWS:
+	* RELEASE:
+	* gstreamer.doap:
+	* meson.build:
+	  Release 1.22.9
+
+2023-12-12 23:55:04 +0100  Alexander Slobodeniuk <aslobodeniuk@fluendo.com>
+
+	* libs/gst/base/gstaggregator.c:
+	* tests/check/libs/aggregator.c:
+	  aggregator: fix use-after-free in queries processing
+	  Test included.
+	  The problem appears when aggregator drops the query while
+	  it's being proccessed by the klass->sink_query handler.
+	  This can happen on FLUSH_START event. If the query is still
+	  in the queue, it can be safely dropped, but if it's already
+	  in the klass->sink_query() handler, then sink pad has no
+	  choice and has to wait for the proccessing to complete.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5958>
+
+2023-12-10 03:25:57 +1100  Jan Schmidt <jan@centricular.com>
+
+	* plugins/elements/gstmultiqueue.c:
+	  multiqueue: Ignore queue fullness for most events
+	  Use gst_data_queue_push_force() for most events so they
+	  are immediately enqueued. Only gap events and actual buffer
+	  data will now block when the queue is full.
+	  This fixes a problem with non-flushing seek handling
+	  where events following a segment-done event would block
+	  if they precede the SEGMENT event, since only SEGMENT
+	  events would clear the 'eos' state of the multiqueue
+	  queue.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5954>
+
+2023-12-18 13:52:12 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* meson.build:
+	  Back to development
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5826>
+
+=== release 1.22.8 ===
+
+2023-12-18 12:09:37 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* NEWS:
+	* RELEASE:
+	* gstreamer.doap:
+	* meson.build:
+	  Release 1.22.8
+
+2023-11-27 13:16:47 +0100  Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com>
+
+	* libs/gst/base/gstbaseparse.c:
+	  baseparse: Reset metadata for reverse playback fragment buffers
+	  Don't let the adapter leak uncontrollable values.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5720>
+
+2023-11-27 12:29:08 +0100  Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com>
+
+	* libs/gst/base/gstbaseparse.c:
+	  baseparse: Add missing gst_buffer_make_writable
+	  When the subclass attempts to finish without an explicit `out_buffer`,
+	  we take a buffer from our adapter. We need to make this buffer writable
+	  before copying the metadata.
+	  This led to data races such as in the following pipeline, which randomly
+	  messed up the buffer PTS:
+	  gst-launch-1.0 -e audiotestsrc timestamp-offset=5555 num-buffers=100 \
+	  ! opusenc ! tee name=t ! queue ! opusparse ! fakesink silent=0 \
+	  t. ! queue ! opusparse ! fakesink silent=0 -v | grep '0000, dur'
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5720>
+
+2023-03-15 09:11:51 -0400  Xavier Claessens <xavier.claessens@collabora.com>
+
+	* gst/gstbuffer.c:
+	* tests/check/gst/gstbufferpool.c:
+	  gstbuffer: Add parent meta when a copy shares memory with parent
+	  When copying a buffer, for example with gst_buffer_make_writable(), the
+	  new buffer might reference the same GstMemory as the src buffer,
+	  making those memories not writable. If the src buffer gets disposed
+	  first it should return to its buffer pool, but since some of its
+	  memories are not writable it gets discarded and new buffer/memory gets
+	  allocated.
+	  Solves this by making the new buffer keep a reference to the src buffer,
+	  that ensures that by the time the src buffer gets disposed no other
+	  buffer are referencing its memories and it can thus return safely to its
+	  pool.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5696>
+
+2023-03-09 22:18:12 -0800  Xavier Claessens <xavier.claessens@collabora.com>
+
+	* gst/gstbuffer.c:
+	* tests/check/gst/gstbufferpool.c:
+	  gstbuffer: Unref memories before metas
+	  gst_buffer_add_parent_buffer_meta() is used when a GstBuffer uses
+	  GstMemory from another buffer that was allocated from a pool. In that
+	  case we want to make sure the buffer returns to the pool when the memory
+	  is writable again, otherwise a copy of the memory is created. That means
+	  the child buffer must drop its ref to the memory first, then drop the
+	  ref to parent buffer so it can return to the pool when it is the only
+	  owner of the memory.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5696>
+
+2023-11-15 10:03:52 +0000  Daniel Moberg <daniemob@axis.com>
+
+	* gst/gstpad.c:
+	  gstpad: Recheck pads when linking after temporary unlock
+	  This commit makes sure that pads are valid for linking
+	  after the pads has been temporarily unlocked in the linking process.
+	  Not doing this opens up for a race condition where
+	  pads potentially can be linked twice.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5678>
+
+2023-11-13 14:57:09 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* meson.build:
+	  Back to development
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5650>
+
+=== release 1.22.7 ===
+
+2023-11-13 11:04:22 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* NEWS:
+	* RELEASE:
+	* gstreamer.doap:
+	* meson.build:
+	  Release 1.22.7
+
+2023-10-25 13:58:55 +0100  Philippe Normand <philn@igalia.com>
+
+	* gst/gstdebugutils.c:
+	  debugutils: Ensure we always expose a bin_to_dot_data implementation
+	  Fixes a linking issue when building with `-Dgst_debug=false`.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5563>
+
+2023-10-19 19:44:21 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* libs/gst/base/gstaggregator.c:
+	  aggregator: Allow passing unparented pads to gst_aggregator_pad_is_inactive()
+	  It's very difficult to ensure that a pad is still child of the
+	  aggregator during aggregation, so simply consider unparented pads as
+	  inactive instead of asserting.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5553>
+
+2023-10-19 19:43:26 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* libs/gst/base/gstaggregator.c:
+	  aggregator: Also release clipped buffer when releasing an aggregator pad
+	  Instead of waiting until the pad is actually finalized.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5553>
+
+2023-10-19 19:43:26 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* libs/gst/base/gstaggregator.c:
+	  aggregator: Take pad lock while releasing buffers when removing pads
+	  Accessing the buffers in all other places requires the pad lock and not
+	  taking it here can cause access to already freed buffers if there's
+	  concurrent access from another thread.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5553>
+
+2023-09-20 19:41:00 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* meson.build:
+	  Back to development
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5371>
+
+=== release 1.22.6 ===
+
+2023-09-20 18:10:57 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* NEWS:
+	* RELEASE:
+	* gstreamer.doap:
+	* meson.build:
+	  Release 1.22.6
+
+2023-03-28 19:58:30 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* tools/gst-inspect.c:
+	  tools: gst-inspect: print action signals as emit_by_name() invocations
+	  It's quite confusing to print a function callback signature for
+	  action signals when people need to do a g_signal_by_name() invocation
+	  in order to use this feature. Requires too much background knowledge
+	  about how GObject works under the hood to make sense of that.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5206>
+
+2023-03-29 16:46:43 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* tools/gst-inspect.c:
+	  tools: gst-inspect: prettify type names for strings
+	  'gchararray' and 'GStrv' are not types used anywhere else
+	  and are just confusing. Map that to 'const gchar *' and 'gchar *'
+	  etc. depending on context.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5206>
+
+2023-03-28 19:56:14 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* tools/gst-inspect.c:
+	  tools: gst-inspect: add vertical spacing between properties and signals
+	  Makes it easier to read and less squashed.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5206>
+
+2023-08-15 16:01:28 +0200  Piotr Brzeziński <piotr@centricular.com>
+
+	* tools/gst-launch.c:
+	  tools: Disable fault signal handlers in gst-launch/gst-validate on macOS
+	  By default, macOS attempts to run lldb against a misbehaving process to handle the crash. This does not play well
+	  with the SISEGV/SIGQUIT handler we add in gst-launch/gst-validate. The 'spinning' mechanism causes the lldb
+	  and debugserver processes ran by macOS to misbehave, taking 100% CPU and rendering both themselves and the GStreamer
+	  instance frozen and very hard to effectively kill. macOS's Activity Monitor is also unusable while this is happening.
+	  This patch takes the quickest possible solution of just disabling those signal handlers entirely on macOS.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5201>
+
+2023-07-20 16:57:47 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* meson.build:
+	  Back to development
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5082>
+
+=== release 1.22.5 ===
+
+2023-07-20 15:22:48 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* NEWS:
+	* RELEASE:
+	* gstreamer.doap:
+	* meson.build:
+	  Release 1.22.5
+
+2023-07-17 15:18:39 +0100  Philippe Normand <philn@igalia.com>
+
+	* gst/gstquery.c:
+	  query: Add a quark for SELECTABLE query type
+	  So that `gst_query_type_get_name()` won't return "unknown" for this type.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5067>
+
+2023-03-26 16:40:28 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* gst/gsttaglist.c:
+	  taglist, plugins: fix compiler warnings with GLib >= 2.76
+	  Fix compiler warnings about not using the return value when
+	  freeing the GString segment with g_string_free(.., FALSE):
+	  ignoring return value of ‘g_string_free_and_steal’ declared with attribute ‘warn_unused_result’
+	  which we get with newer GLib versions. These were all harmless.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5015>
+
+2023-07-06 18:08:57 +0200  Théo Maillart <tmaillart@freebox.fr>
+
+	* plugins/elements/gstinputselector.c:
+	  inputselector: fix playing variable is never set
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4988>
+
+2023-02-16 13:44:50 +0100  Guillaume Desmottes <guillaume.desmottes@onestream.live>
+
+	* gst/gsttracerutils.c:
+	  tracerutils: allow casting parameters types
+	  It was impossible to have an u32 parameter such as
+	  'max-buffer-size=(uint)5' because the parentheses were not properly
+	  parsed.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4941>
+
+2023-06-20 19:10:38 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* meson.build:
+	  Back to development
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4907>
+
+=== release 1.22.4 ===
+
+2023-06-20 17:42:25 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* NEWS:
+	* RELEASE:
+	* gstreamer.doap:
+	* meson.build:
+	  Release 1.22.4
+
+2023-06-09 17:51:28 +0800  Elliot Chen <elliot.chen@nxp.com>
+
+	* libs/gst/base/gsttypefindhelper.c:
+	  typefindhelper: avoid printing error log
+	  some plugins such as wavparse may need find if type of media
+	  contained in the given data and will print error log if there
+	  is no matching factory.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4859>
+
+2023-06-09 10:28:43 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* libs/gst/helpers/gst-ptp-helper.c:
+	  ptp: Correctly parse clock ID from the commandline parameters in the helper
+	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2652
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4813>
+
+2023-06-08 20:52:21 +0900  Seungha Yang <seungha@centricular.com>
+
+	* plugins/elements/gstelements_private.c:
+	* tests/check/elements/filesink.c:
+	  filesink: Fix buffered mode writing
+	  Fixing miscalculated buffer index when a buffer holds multiple
+	  memories and it's not aligned to the vector size 16
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4817>
+
+2023-06-06 20:44:02 +0900  Seungha Yang <seungha@centricular.com>
+
+	* tests/check/libs/basesink.c:
+	  tests: basesink: Add STREAM-START after EOS test
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4797>
+
+2023-06-06 04:42:05 +0900  Seungha Yang <seungha@centricular.com>
+
+	* libs/gst/base/gstbasesink.c:
+	  basesink: Clear EOS flag on STREAM-START event
+	  EOS -> STREAM-START -> new data flow is valid scenario
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4797>
+
+2023-06-01 14:49:06 +0530  Nirbheek Chauhan <nirbheek@centricular.com>
+
+	* gst/gstinfo.c:
+	  docs: Use backticks to escape * in markdown
+	  Otherwise it's interpreted as emphasis.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4763>
+
+2023-05-17 10:01:30 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* libs/gst/net/gstptpclock.c:
+	  ptp: Work around bug in ptpd in default configuration
+	  ptpd is defaulting to the hybrid mode, and was sending invalid multicast
+	  PTP messages in that configuration until ce96c742a88792a8d92deebaf03927e1b367f4a9.
+	  While this commit was made in 2015 there was no release in the meantime.
+	  Work around this by detecting this case and defaulting to the default
+	  values for the given intervals as given by the PTP standard.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4683>
+
+2023-05-19 12:36:19 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* meson.build:
+	  Back to development
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4679>
+
+=== release 1.22.3 ===
+
+2023-05-19 09:23:19 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* NEWS:
+	* README.md:
+	* RELEASE:
+	* gstreamer.doap:
+	* meson.build:
+	  Release 1.22.3
+
+2023-05-12 18:35:48 +0200  Mathieu Duponchelle <mathieu@centricular.com>
+
+	* gst/parse/grammar.y.in:
+	  parse/grammar: fix missing unref of looked up child
+	  the target parameter of gst_child_proxy_lookup() is (transfer full)
+	  Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2560
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4624>
+
+2023-03-28 16:13:51 +0200  Juan Navarro <juan.navarro@gmx.es>
+
+	* gst/gstutils.c:
+	  gstutils: Add category and object to most logging messages
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4615>
+
+2023-04-12 10:58:31 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/gst.c:
+	  gst: tracer: Initialize tracing infrastructure even if the debug system is not compiled in
+	  There is a separate #define for the tracing infrastructure.
+	  Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2467
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4424>
+
+2023-04-12 00:31:17 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* meson.build:
+	  Back to development
+
+=== release 1.22.2 ===
+
+2023-04-11 17:29:28 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* NEWS:
+	* RELEASE:
+	* gstreamer.doap:
+	* meson.build:
+	  Release 1.22.2
+
+2023-04-10 13:49:41 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* po/sr.po:
+	  gstreamer: update translations
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4390>
+
+2023-03-31 04:40:58 +0900  Seungha Yang <seungha@centricular.com>
+
+	* tools/gst-inspect.c:
+	* tools/gst-launch.c:
+	* tools/gst-stats.c:
+	* tools/gst-typefind.c:
+	  tools: Count argc after parsing GOption on Windows
+	  Existing codes rely on modified argc value by g_option_context_parse()
+	  but g_option_context_parse_strv() is used in case of Windows.
+	  Count arguments after the option parsing manually.
+	  Fixing command "gst-inspect-1.0.exe -b"
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4322>
+
+2023-03-24 18:34:36 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/gstdatetime.c:
+	  datetime: Return G_MAXFLOAT instead of G_MAXDOUBLE for no timezone offset
+	  Returning G_MAXDOUBLE from a function returning a float is not going to
+	  work well and MSVC also correctly warns about this.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4285>
+
+2023-03-16 12:38:23 +0200  Vivia Nikolaidou <vivia@ahiru.eu>
+
+	* plugins/elements/gstinputselector.c:
+	  inputselector: Wake up streaming thread before PLAYING_TO_PAUSED transition
+	  Also take object lock before iterating the pads.
+	  https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1772
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4196>
+
+2023-03-04 16:13:04 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* meson.build:
+	  Back to development
+
+=== release 1.22.1 ===
+
+2023-03-04 13:42:32 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* NEWS:
+	* RELEASE:
+	* gstreamer.doap:
+	* meson.build:
+	  Release 1.22.1
+
+2023-03-02 15:51:08 +0200  Vivia Nikolaidou <vivia@ahiru.eu>
+
+	* plugins/elements/gstinputselector.c:
+	* plugins/elements/gstinputselector.h:
+	  inputselector: Avoid deadlock when shutting down
+	  Transition from PLAYING to PAUSED unschedules any pending clock wait,
+	  but there was no guard that prevented another input buffer then waiting
+	  again while in PAUSED before dataflow stops. Use a new `playing` flag to
+	  avoid this, and exit the chain function if instead of playing we're now
+	  flushing. Basically the same as the clocksync element.
+	  Closes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1772
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4099>
+
+2023-01-28 02:32:13 +0900  Seungha Yang <seungha@centricular.com>
+
+	* tools/gst-inspect.c:
+	* tools/gst-launch.c:
+	* tools/gst-stats.c:
+	* tools/gst-typefind.c:
+	  tools: Make sure UTF-8 encoded command line arguments on Windows
+	  On Windows, arguments passed in main() are system codepage
+	  encoded and might not be valid UTF-8 string.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4072>
+
+2023-02-21 20:13:57 -0700  James Hilliard <james.hilliard1@gmail.com>
+
+	* gst/gstbuffer.c:
+	  buffer: fix copy meta reference debug log formatting
+	  Fixes the following valgrind error:
+	  ==616== Conditional jump or move depends on uninitialised value(s)
+	  ==616==    at 0x4900E34: gst_debug_print_object (gstinfo.c:1143)
+	  ==616==    by 0x49010B6: gst_info_printf_pointer_extension_func (gstinfo.c:1215)
+	  ==616==    by 0x4959FDB: __gst_printf_pointer_extension_serialize (printf-extension.c:47)
+	  ==616==    by 0x495A487: printf_postprocess_args (vasnprintf.c:258)
+	  ==616==    by 0x495A52C: __gst_vasnprintf (vasnprintf.c:290)
+	  ==616==    by 0x4959F8F: __gst_vasprintf (printf.c:154)
+	  ==616==    by 0x4901C1F: gst_debug_message_get (gstinfo.c:791)
+	  ==616==    by 0x4901C75: _gst_debug_log_preamble (gstinfo.c:1431)
+	  ==616==    by 0x4903208: gst_debug_log_default (gstinfo.c:1575)
+	  ==616==    by 0x49020BA: gst_debug_log_full_valist (gstinfo.c:624)
+	  ==616==    by 0x490211D: gst_debug_log_valist (gstinfo.c:656)
+	  ==616==    by 0x49021AD: gst_debug_log (gstinfo.c:533)
+	  ==616==    by 0x48DDC11: gst_buffer_copy_into (gstbuffer.c:693)
+	  ==616==    by 0x48DF5F1: gst_buffer_copy_with_flags (gstbuffer.c:727)
+	  ==616==    by 0x48DF640: gst_buffer_copy_deep (gstbuffer.c:756)
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4038>
+
+2023-02-22 11:51:58 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* po/fur.po:
+	  gstreamer: update translations
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4041>
+
+2023-02-09 13:53:48 +0100  Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com>
+
+	* gst/gstpad.c:
+	  pad: Don't leak user_data in gst_pad_start_task
+	  When the task already exists, we forgot to free the passed `user_data`.
+	  This wasn't an issue for most C code, which doesn't pass a
+	  `GDestroyNotify`, but bindings such as gstreamer-rs do!
+	  That said, allocating a trampoline in gstreamer-rs just for it to get
+	  thrown away again is awkward. Maybe we need a `gst_pad_resume_task`?
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3925>
+
+2023-02-07 13:43:06 +0000  medithe <medithe@gmx.at>
+
+	* gst/gstbin.c:
+	  gstreamer: bin: Don't unlock unlocked mutex in gst_bin_remove_func()
+	  Calling `g_mutex_unlock(mutex)` leads to an undefined behavior if the
+	  mutex is not locked by the current thread.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3910>
+
+2023-01-27 19:29:24 +0100  Mathieu Duponchelle <mathieu@centricular.com>
+
+	* libs/gst/base/gstbasesrc.h:
+	  BaseSrc: fix transfer annotation for fixate virtual method
+	  The fixate virtual method has the same semantics as gst_caps_fixate(),
+	  so the caps parameter must be marked as (transfer full).
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3839>
+
+2023-01-26 15:42:18 +0100  Mathieu Duponchelle <mathieu@centricular.com>
+
+	* libs/gst/base/gstbasesrc.h:
+	* libs/gst/base/gstpushsrc.h:
+	  BaseSrc, PushSrc: add nullable annotations to virtual methods
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3833>
+
+2023-01-26 10:33:26 +0100  Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com>
+
+	* libs/gst/base/gstaggregator.c:
+	  aggregator: Warn about the right segment's format
+	  We were checking the head segment here, not the current segment.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3819>
+
+2020-09-02 17:59:30 +0200  Jan Alexander Steffens (heftig) <jan.steffens@ltnglobal.com>
+
+	* libs/gst/base/gstaggregator.c:
+	  aggregator: Always lock aggpad around update_time_level
+	  `aggpad->segment` is protected by the `aggpad`'s object lock. We need to
+	  take the lock before calling `update_time_level`.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3819>
+
+2023-01-25 13:26:08 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/gsttypefind.c:
+	  gst: Fix gst_type_find_peek() return value annotation
+	  It's not possible to annotate a in-parameter for a return value array as
+	  the array length. Both are assumed to have the same direction and the
+	  current annotation causes the size parameter to be considered an out
+	  parameter.
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3814>
+
+2023-01-23 17:26:07 +0100  Edward Hervey <edward@centricular.com>
+
+	* plugins/elements/gstmultiqueue.c:
+	  multiqueue: Handle use-interleave latency live pipelines
+	  Due to the dynamic nature of multiqueue, when `use-interleave` is used we can't
+	  report a maximum tolerated latency (when queried) since it is calculated
+	  dynamically.
+	  When in such live pipelines, we need to make sure multiqueue can handle the
+	  lowest global latency (provided by this event). Failure to do that would
+	  result in not providing enough buffering for a realtime pipeline.
+	  Fixes #1732
+	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3810>
+
+2023-01-25 16:46:42 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* meson.build:
+	  Back to development
+
 === release 1.22.0 ===
 
 2023-01-23 19:29:34 +0000  Tim-Philipp Müller <tim@centricular.com>
diff -Nru gstreamer1.0-1.22.0/debian/changelog gstreamer1.0-1.22.12/debian/changelog
--- gstreamer1.0-1.22.0/debian/changelog	2024-12-13 06:13:42.000000000 +0100
+++ gstreamer1.0-1.22.12/debian/changelog	2025-01-03 18:28:30.000000000 +0100
@@ -1,9 +1,95 @@
-gstreamer1.0 (1.22.0-2+deb12u1) bookworm-security; urgency=high
+gstreamer1.0 (1.22.12-0+deb12u1) stable; urgency=medium
 
-  * Non-maintainer upload by the Security Team.
-  * allocator: Avoid integer overflow when allocating sysmem (CVE-2024-47606)
+  * d/patches: import stable release patch
+  * d/gbp: adjust for bookworm import
+  * New upstream version 1.22.12
 
- -- Salvatore Bonaccorso <carnil@debian.org>  Fri, 13 Dec 2024 06:13:42 +0100
+ -- Marc Leeman <marc.leeman@gmail.com>  Fri, 03 Jan 2025 18:28:30 +0100
+
+gstreamer1.0 (1.22.10-1) unstable; urgency=medium
+
+  * d/watch: pin master releases on 1.22.x
+  * New upstream version 1.22.10
+  * d/control: pkg-config is transitional
+
+ -- Marc Leeman <marc.leeman@gmail.com>  Wed, 14 Feb 2024 10:19:25 +0100
+
+gstreamer1.0 (1.22.9-1) unstable; urgency=medium
+
+  * New upstream version 1.22.9
+
+ -- Marc Leeman <m.leeman@televic.com>  Thu, 01 Feb 2024 10:05:16 +0100
+
+gstreamer1.0 (1.22.8-1) unstable; urgency=medium
+
+  * Team upload.
+  * New upstream version 1.22.8
+
+ -- Marc Leeman <marc.leeman@gmail.com>  Mon, 18 Dec 2023 15:41:12 +0100
+
+gstreamer1.0 (1.22.7-1) unstable; urgency=medium
+
+  [ Marc Leeman ]
+  * New upstream version 1.22.7
+  * d/lintian-overrides: hide warnings
+  * Team upload.
+
+  [ Aurelien Jarno ]
+  * Enable libunwind on riscv64 (Closes: #1057048)
+
+  [ Debian Janitor ]
+  * Remove constraints unnecessary since buster (oldstable)
+
+ -- Marc Leeman <marc.leeman@gmail.com>  Tue, 14 Nov 2023 14:01:28 +0100
+
+gstreamer1.0 (1.22.6-1) unstable; urgency=medium
+
+  * Team upload
+  * New upstream bugfix release
+
+ -- Jeremy Bícha <jbicha@ubuntu.com>  Mon, 25 Sep 2023 13:04:27 -0400
+
+gstreamer1.0 (1.22.5-1) unstable; urgency=medium
+
+  * Team upload
+  * New upstream release
+
+ -- Jeremy Bícha <jbicha@ubuntu.com>  Tue, 15 Aug 2023 11:15:42 -0400
+
+gstreamer1.0 (1.22.4-1) unstable; urgency=medium
+
+  * Team upload
+  * New upstream release
+
+ -- Jeremy Bícha <jbicha@ubuntu.com>  Fri, 30 Jun 2023 11:36:07 -0400
+
+gstreamer1.0 (1.22.3-2) unstable; urgency=medium
+
+  * Team upload
+  * Release to unstable
+
+ -- Jeremy Bícha <jbicha@ubuntu.com>  Mon, 12 Jun 2023 14:48:37 -0400
+
+gstreamer1.0 (1.22.3-1) experimental; urgency=medium
+
+  * Team upload
+  * New upstream release
+
+ -- Jeremy Bícha <jbicha@ubuntu.com>  Fri, 19 May 2023 12:06:27 -0400
+
+gstreamer1.0 (1.22.2-1) experimental; urgency=medium
+
+  * Team upload
+  * New upstream bugfix release (LP: #2015943)
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Wed, 12 Apr 2023 11:47:38 -0400
+
+gstreamer1.0 (1.22.1-1) experimental; urgency=medium
+
+  * Team upload
+  * New upstream bugfix release (LP: #2015129)
+
+ -- Jeremy Bicha <jbicha@ubuntu.com>  Mon, 03 Apr 2023 16:03:42 -0400
 
 gstreamer1.0 (1.22.0-2) unstable; urgency=medium
 
diff -Nru gstreamer1.0-1.22.0/debian/control gstreamer1.0-1.22.12/debian/control
--- gstreamer1.0-1.22.0/debian/control	2024-12-13 06:09:16.000000000 +0100
+++ gstreamer1.0-1.22.12/debian/control	2025-01-03 17:45:54.000000000 +0100
@@ -3,22 +3,22 @@
 Priority: optional
 Maintainer: Maintainers of GStreamer packages <gstreamer1.0@packages.debian.org>
 Uploaders: Sebastian Dröge <slomo@debian.org>,
-           Sjoerd Simons <sjoerd@debian.org>
+           Sjoerd Simons <sjoerd@debian.org>,
+           Marc Leeman <marc.leeman@gmail.com>,
 Build-Depends: debhelper-compat (= 13),
                dh-sequence-gir,
-               dpkg-dev (>= 1.15.1),
                meson (>= 0.62),
-               pkg-config (>= 0.11.0),
+               pkgconf,
                perl-doc,
-               zlib1g-dev (>= 1:1.1.4),
-               libglib2.0-dev (>= 2.62.0),
+               zlib1g-dev,
+               libglib2.0-dev,
                libgmp-dev <!nocheck> | libgmp3-dev <!nocheck>,
                libgsl-dev <!nocheck> | libgsl0-dev <!nocheck>,
-               libunwind-dev [i386 amd64 armel armhf arm64 powerpc ppc64 ppc64el mipsel mips64el],
-               libdw-dev [i386 amd64 armel armhf arm64 powerpc ppc64 ppc64el mipsel mips64el],
-               bison (>= 1:2.4),
-               flex (>= 2.5.34),
-               libgirepository1.0-dev (>= 0.9.12-4~),
+               libunwind-dev [i386 amd64 armel armhf arm64 powerpc ppc64 ppc64el mipsel mips64el riscv64],
+               libdw-dev [i386 amd64 armel armhf arm64 powerpc ppc64 ppc64el mipsel mips64el riscv64],
+               bison,
+               flex,
+               libgirepository1.0-dev,
                gir1.2-glib-2.0,
                gir1.2-freedesktop,
                bash-completion,
@@ -38,9 +38,6 @@
          ${misc:Depends},
          libcap2-bin [linux-any]
 Suggests: gstreamer1.0-tools,
-Breaks: gstreamer1.0-plugins-base (<< 1.8.0),
-        gstreamer1.0-plugins-bad (<< 1.11.1),
-        libgstreamer-plugins-bad1.0-0 (<< 1.13.1)
 Description: Core GStreamer libraries and elements
  GStreamer is a streaming media framework, based on graphs of filters
  which operate on media data.  Applications using this library can do
@@ -57,15 +54,13 @@
 Section: libdevel
 Depends: libgstreamer1.0-0 (= ${binary:Version}),
          libc6-dev | libc-dev,
-         pkg-config,
+         pkgconf,
          libglib2.0-dev,
-         libunwind-dev [i386 amd64 armel armhf arm64 powerpc ppc64 ppc64el mipsel mips64el],
-         libdw-dev [i386 amd64 armel armhf arm64 powerpc ppc64 ppc64el mipsel mips64el],
+         libunwind-dev [i386 amd64 armel armhf arm64 powerpc ppc64 ppc64el mipsel mips64el riscv64],
+         libdw-dev [i386 amd64 armel armhf arm64 powerpc ppc64 ppc64el mipsel mips64el riscv64],
          ${shlibs:Depends},
          ${misc:Depends},
          gir1.2-gstreamer-1.0 (= ${binary:Version})
-Conflicts: libgstreamer-plugins-bad1.0-dev (<< 1.13.1)
-Replaces: libgstreamer-plugins-bad1.0-dev (<< 1.13.1)
 Suggests: gstreamer1.0-doc
 Description: GStreamer core development files
  GStreamer is a streaming media framework, based on graphs of filters
diff -Nru gstreamer1.0-1.22.0/debian/gbp.conf gstreamer1.0-1.22.12/debian/gbp.conf
--- gstreamer1.0-1.22.0/debian/gbp.conf	2024-12-13 06:09:16.000000000 +0100
+++ gstreamer1.0-1.22.12/debian/gbp.conf	2025-01-03 18:24:29.000000000 +0100
@@ -1,6 +1,6 @@
 [DEFAULT]
-upstream-branch = upstream
-debian-branch = master
+upstream-branch = upstream-bookworm
+debian-branch = debian/bookworm
 pristine-tar = True
 upstream-tag = upstream/%(version)s
 debian-tag = debian/%(version)s
diff -Nru gstreamer1.0-1.22.0/debian/libgstreamer1.0-0.lintian-overrides gstreamer1.0-1.22.12/debian/libgstreamer1.0-0.lintian-overrides
--- gstreamer1.0-1.22.0/debian/libgstreamer1.0-0.lintian-overrides	1970-01-01 01:00:00.000000000 +0100
+++ gstreamer1.0-1.22.12/debian/libgstreamer1.0-0.lintian-overrides	2024-12-04 09:07:53.000000000 +0100
@@ -0,0 +1,2 @@
+# gstreamer package naming vs major api release
+libgstreamer1.0-0: package-name-doesnt-match-sonames
diff -Nru gstreamer1.0-1.22.0/debian/patches/0002-allocator-Avoid-integer-overflow-when-allocating-sys.patch gstreamer1.0-1.22.12/debian/patches/0002-allocator-Avoid-integer-overflow-when-allocating-sys.patch
--- gstreamer1.0-1.22.0/debian/patches/0002-allocator-Avoid-integer-overflow-when-allocating-sys.patch	1970-01-01 01:00:00.000000000 +0100
+++ gstreamer1.0-1.22.12/debian/patches/0002-allocator-Avoid-integer-overflow-when-allocating-sys.patch	2025-01-03 18:05:22.000000000 +0100
@@ -0,0 +1,52 @@
+From 69f71e2addd5d3d3243efa6d9d5fac9b27071e9d Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= <sebastian@centricular.com>
+Date: Thu, 26 Sep 2024 22:07:22 +0300
+Subject: [PATCH] allocator: Avoid integer overflow when allocating sysmem
+
+Thanks to Antonio Morales for finding and reporting the issue.
+
+Fixes GHSL-2024-166
+Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3851
+
+Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8094>
+---
+ gst/gstallocator.c | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+diff --git a/gst/gstallocator.c b/gst/gstallocator.c
+index f3cd20e86d..e8f21ba3f8 100644
+--- a/gst/gstallocator.c
++++ b/gst/gstallocator.c
+@@ -430,8 +430,20 @@ _sysmem_new_block (GstMemoryFlags flags,
+   /* ensure configured alignment */
+   align |= gst_memory_alignment;
+   /* allocate more to compensate for alignment */
++  if (align > G_MAXSIZE || maxsize > G_MAXSIZE - align) {
++    GST_CAT_WARNING (GST_CAT_MEMORY,
++        "Allocating %" G_GSIZE_FORMAT " bytes with alignment %" G_GSIZE_FORMAT
++        "x overflows", maxsize, align);
++    return NULL;
++  }
+   maxsize += align;
+   /* alloc header and data in one block */
++  if (maxsize > G_MAXSIZE - sizeof (GstMemorySystem)) {
++    GST_CAT_WARNING (GST_CAT_MEMORY,
++        "Allocating %" G_GSIZE_FORMAT " bytes with alignment %" G_GSIZE_FORMAT
++        "x overflows", maxsize, align);
++    return NULL;
++  }
+   slice_size = sizeof (GstMemorySystem) + maxsize;
+
+   mem = g_slice_alloc (slice_size);
+@@ -481,6 +493,8 @@ _sysmem_copy (GstMemorySystem * mem, gssize offset, gsize size)
+     size = mem->mem.size > offset ? mem->mem.size - offset : 0;
+
+   copy = _sysmem_new_block (0, size, mem->mem.align, 0, size);
++  if (!copy)
++    return NULL;
+   GST_CAT_DEBUG (GST_CAT_PERFORMANCE,
+       "memcpy %" G_GSIZE_FORMAT " memory %p -> %p", size, mem, copy);
+   memcpy (copy->data, mem->data + mem->mem.offset + offset, size);
+--
+2.45.2
+
diff -Nru gstreamer1.0-1.22.0/debian/patches/allocator-Avoid-integer-overflow-when-allocating-sys.patch gstreamer1.0-1.22.12/debian/patches/allocator-Avoid-integer-overflow-when-allocating-sys.patch
--- gstreamer1.0-1.22.0/debian/patches/allocator-Avoid-integer-overflow-when-allocating-sys.patch	2024-12-13 06:12:17.000000000 +0100
+++ gstreamer1.0-1.22.12/debian/patches/allocator-Avoid-integer-overflow-when-allocating-sys.patch	1970-01-01 01:00:00.000000000 +0100
@@ -1,48 +0,0 @@
-From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= <sebastian@centricular.com>
-Date: Thu, 26 Sep 2024 22:07:22 +0300
-Subject: allocator: Avoid integer overflow when allocating sysmem
-Origin: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/commit/72af11b248b4cb60d3dfe4e9459eec0d20052c9b
-Bug-Debian-Security: https://security-tracker.debian.org/tracker/CVE-2024-47606
-
-Thanks to Antonio Morales for finding and reporting the issue.
-
-Fixes GHSL-2024-166
-Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3851
-
-Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8044>
----
- subprojects/gstreamer/gst/gstallocator.c | 14 ++++++++++++++
- 1 file changed, 14 insertions(+)
-
---- a/gst/gstallocator.c
-+++ b/gst/gstallocator.c
-@@ -430,8 +430,20 @@ _sysmem_new_block (GstMemoryFlags flags,
-   /* ensure configured alignment */
-   align |= gst_memory_alignment;
-   /* allocate more to compensate for alignment */
-+  if (align > G_MAXSIZE || maxsize > G_MAXSIZE - align) {
-+    GST_CAT_WARNING (GST_CAT_MEMORY,
-+        "Allocating %" G_GSIZE_FORMAT " bytes with alignment %" G_GSIZE_FORMAT
-+        "x overflows", maxsize, align);
-+    return NULL;
-+  }
-   maxsize += align;
-   /* alloc header and data in one block */
-+  if (maxsize > G_MAXSIZE - sizeof (GstMemorySystem)) {
-+    GST_CAT_WARNING (GST_CAT_MEMORY,
-+        "Allocating %" G_GSIZE_FORMAT " bytes with alignment %" G_GSIZE_FORMAT
-+        "x overflows", maxsize, align);
-+    return NULL;
-+  }
-   slice_size = sizeof (GstMemorySystem) + maxsize;
- 
-   mem = g_slice_alloc (slice_size);
-@@ -481,6 +493,8 @@ _sysmem_copy (GstMemorySystem * mem, gss
-     size = mem->mem.size > offset ? mem->mem.size - offset : 0;
- 
-   copy = _sysmem_new_block (0, size, mem->mem.align, 0, size);
-+  if (!copy)
-+    return NULL;
-   GST_CAT_DEBUG (GST_CAT_PERFORMANCE,
-       "memcpy %" G_GSIZE_FORMAT " memory %p -> %p", size, mem, copy);
-   memcpy (copy->data, mem->data + mem->mem.offset + offset, size);
diff -Nru gstreamer1.0-1.22.0/debian/patches/series gstreamer1.0-1.22.12/debian/patches/series
--- gstreamer1.0-1.22.0/debian/patches/series	2024-12-13 06:11:22.000000000 +0100
+++ gstreamer1.0-1.22.12/debian/patches/series	2025-01-03 18:05:34.000000000 +0100
@@ -1,2 +1,2 @@
 0001-registrybinary-Update-magic-version-string.patch
-allocator-Avoid-integer-overflow-when-allocating-sys.patch
+0002-allocator-Avoid-integer-overflow-when-allocating-sys.patch
diff -Nru gstreamer1.0-1.22.0/debian/rules gstreamer1.0-1.22.12/debian/rules
--- gstreamer1.0-1.22.0/debian/rules	2024-12-13 06:09:16.000000000 +0100
+++ gstreamer1.0-1.22.12/debian/rules	2025-01-03 17:45:54.000000000 +0100
@@ -40,7 +40,7 @@
 	-Dptp-helper-setuid-user=nobody -Dptp-helper-setuid-group=nobody
 endif
 
-ifeq (,$(filter $(DEB_HOST_ARCH),i386 amd64 armel armhf arm64 powerpc ppc64 ppc64el mipsel mips64el))
+ifeq (,$(filter $(DEB_HOST_ARCH),i386 amd64 armel armhf arm64 powerpc ppc64 ppc64el mipsel mips64el riscv64))
 conf_flags += -Dlibunwind=disabled -Dlibdw=disabled
 endif
 
diff -Nru gstreamer1.0-1.22.0/debian/watch gstreamer1.0-1.22.12/debian/watch
--- gstreamer1.0-1.22.0/debian/watch	2024-12-13 06:09:16.000000000 +0100
+++ gstreamer1.0-1.22.12/debian/watch	2025-01-03 17:45:54.000000000 +0100
@@ -1,3 +1,3 @@
 version=4
 opts=pgpmode=auto \
-https://gstreamer.freedesktop.org/src/gstreamer/ gstreamer-(1\.[\d]+\.[\d]+)@ARCHIVE_EXT@
+https://gstreamer.freedesktop.org/src/gstreamer/ gstreamer-(1\.22+\.[\d]+)@ARCHIVE_EXT@
diff -Nru gstreamer1.0-1.22.0/gst/gstbin.c gstreamer1.0-1.22.12/gst/gstbin.c
--- gstreamer1.0-1.22.0/gst/gstbin.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/gst/gstbin.c	2024-04-29 21:09:52.000000000 +0200
@@ -1567,8 +1567,10 @@
   GST_OBJECT_LOCK (element);
   elem_name = g_strdup (GST_ELEMENT_NAME (element));
 
-  if (GST_OBJECT_PARENT (element) != GST_OBJECT_CAST (bin))
+  if (GST_OBJECT_PARENT (element) != GST_OBJECT_CAST (bin)) {
+    GST_OBJECT_UNLOCK (element);
     goto not_in_bin;
+  }
 
   /* remove the parent ref */
   GST_OBJECT_PARENT (element) = NULL;
@@ -1819,7 +1821,6 @@
   /* ERROR handling */
 not_in_bin:
   {
-    GST_OBJECT_UNLOCK (element);
     GST_OBJECT_UNLOCK (bin);
     GST_WARNING_OBJECT (bin, "Element '%s' is not in bin", elem_name);
     g_free (elem_name);
diff -Nru gstreamer1.0-1.22.0/gst/gstbuffer.c gstreamer1.0-1.22.12/gst/gstbuffer.c
--- gstreamer1.0-1.22.0/gst/gstbuffer.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/gst/gstbuffer.c	2024-04-29 21:09:52.000000000 +0200
@@ -546,6 +546,7 @@
   GstMetaItem *walk;
   gsize bufsize;
   gboolean region = FALSE;
+  gboolean sharing_mem = FALSE;
 
   g_return_val_if_fail (dest != NULL, FALSE);
   g_return_val_if_fail (src != NULL, FALSE);
@@ -649,6 +650,9 @@
           return FALSE;
         }
 
+        /* Indicates if dest references any of src memories. */
+        sharing_mem |= (newmem == mem);
+
         _memory_add (dest, -1, newmem);
         left -= tocopy;
       }
@@ -662,6 +666,10 @@
         gst_buffer_remove_memory_range (dest, dest_len, -1);
         return FALSE;
       }
+
+      /* If we were sharing memory and the merge is no-op, we are still sharing. */
+      sharing_mem &= (mem == GST_BUFFER_MEM_PTR (dest, 0));
+
       _replace_memory (dest, len, 0, len, mem);
     }
   }
@@ -691,7 +699,8 @@
       } else if (deep && gst_meta_api_type_has_tag (info->api,
               _gst_meta_tag_memory_reference)) {
         GST_CAT_DEBUG (GST_CAT_BUFFER,
-            "don't copy meta with memory references %" GST_PTR_FORMAT, meta);
+            "don't copy memory reference meta %p of API type %s", meta,
+            g_type_name (info->api));
       } else if (info->transform_func) {
         GstMetaTransformCopy copy_data;
 
@@ -709,6 +718,14 @@
     }
   }
 
+  if (sharing_mem && src->pool != NULL) {
+    /* The new buffer references some of src's memories. We have to ensure that
+     * src buffer does not return to its buffer pool as long as its memories are
+     * used by other buffers. That would cause the buffer to be discarted by the
+     * pool because its memories are not writable. */
+    gst_buffer_add_parent_buffer_meta (dest, src);
+  }
+
   return TRUE;
 }
 
@@ -788,6 +805,15 @@
 
   GST_CAT_LOG (GST_CAT_BUFFER, "finalize %p", buffer);
 
+  /* free our memory */
+  len = GST_BUFFER_MEM_LEN (buffer);
+  for (i = 0; i < len; i++) {
+    gst_memory_unlock (GST_BUFFER_MEM_PTR (buffer, i), GST_LOCK_FLAG_EXCLUSIVE);
+    gst_mini_object_remove_parent (GST_MINI_OBJECT_CAST (GST_BUFFER_MEM_PTR
+            (buffer, i)), GST_MINI_OBJECT_CAST (buffer));
+    gst_memory_unref (GST_BUFFER_MEM_PTR (buffer, i));
+  }
+
   /* free metadata */
   for (walk = GST_BUFFER_META (buffer); walk; walk = next) {
     GstMeta *meta = &walk->meta;
@@ -806,15 +832,6 @@
    * itself */
   msize = GST_BUFFER_SLICE_SIZE (buffer);
 
-  /* free our memory */
-  len = GST_BUFFER_MEM_LEN (buffer);
-  for (i = 0; i < len; i++) {
-    gst_memory_unlock (GST_BUFFER_MEM_PTR (buffer, i), GST_LOCK_FLAG_EXCLUSIVE);
-    gst_mini_object_remove_parent (GST_MINI_OBJECT_CAST (GST_BUFFER_MEM_PTR
-            (buffer, i)), GST_MINI_OBJECT_CAST (buffer));
-    gst_memory_unref (GST_BUFFER_MEM_PTR (buffer, i));
-  }
-
   /* we set msize to 0 when the buffer is part of the memory block */
   if (msize) {
 #ifdef USE_POISONING
diff -Nru gstreamer1.0-1.22.0/gst/gst.c gstreamer1.0-1.22.12/gst/gst.c
--- gstreamer1.0-1.22.0/gst/gst.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/gst/gst.c	2024-04-29 21:09:52.000000000 +0200
@@ -812,7 +812,7 @@
    * environment variable */
   _priv_gst_plugin_feature_rank_initialize ();
 
-#ifndef GST_DISABLE_GST_DEBUG
+#ifndef GST_DISABLE_GST_TRACER_HOOKS
   _priv_gst_tracing_init ();
 #endif
 
diff -Nru gstreamer1.0-1.22.0/gst/gstdatetime.c gstreamer1.0-1.22.12/gst/gstdatetime.c
--- gstreamer1.0-1.22.0/gst/gstdatetime.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/gst/gstdatetime.c	2024-04-29 21:09:52.000000000 +0200
@@ -334,7 +334,7 @@
  * values, timezones before (to the west) of UTC have negative values.
  * If @datetime represents UTC time, then the offset is zero.
  *
- * Return value: the offset from UTC in hours, or %G_MAXDOUBLE if none is set.
+ * Return value: the offset from UTC in hours, or %G_MAXFLOAT if none is set.
  */
 gfloat
 gst_date_time_get_time_zone_offset (const GstDateTime * datetime)
@@ -342,7 +342,7 @@
   g_return_val_if_fail (datetime != NULL, 0.0);
 
   if (!gst_date_time_has_time (datetime))
-    return G_MAXDOUBLE;
+    return G_MAXFLOAT;
 
   return (g_date_time_get_utc_offset (datetime->datetime) /
       G_USEC_PER_SEC) / 3600.0;
diff -Nru gstreamer1.0-1.22.0/gst/gstdebugutils.c gstreamer1.0-1.22.12/gst/gstdebugutils.c
--- gstreamer1.0-1.22.0/gst/gstdebugutils.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/gst/gstdebugutils.c	2024-04-29 21:09:52.000000000 +0200
@@ -922,6 +922,13 @@
 }
 #else /* !GST_DISABLE_GST_DEBUG */
 #ifndef GST_REMOVE_DISABLED
+
+gchar *
+gst_debug_bin_to_dot_data (GstBin * bin, GstDebugGraphDetails details)
+{
+  return g_strdup ("");
+}
+
 void
 gst_debug_bin_to_dot_file (GstBin * bin, GstDebugGraphDetails details,
     const gchar * file_name)
diff -Nru gstreamer1.0-1.22.0/gst/gstinfo.c gstreamer1.0-1.22.12/gst/gstinfo.c
--- gstreamer1.0-1.22.0/gst/gstinfo.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/gst/gstinfo.c	2024-04-29 21:09:52.000000000 +0200
@@ -2387,8 +2387,8 @@
  * %FALSE if adding the threshold described by @list to the one already set.
  *
  * Sets the debug logging wanted in the same form as with the GST_DEBUG
- * environment variable. You can use wildcards such as '*', but note that
- * the order matters when you use wild cards, e.g. "foosrc:6,*src:3,*:2" sets
+ * environment variable. You can use wildcards such as `*`, but note that
+ * the order matters when you use wild cards, e.g. `foosrc:6,*src:3,*:2` sets
  * everything to log level 2.
  *
  * Since: 1.2
diff -Nru gstreamer1.0-1.22.0/gst/gstmacos.m gstreamer1.0-1.22.12/gst/gstmacos.m
--- gstreamer1.0-1.22.0/gst/gstmacos.m	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/gst/gstmacos.m	2024-04-29 21:09:52.000000000 +0200
@@ -9,11 +9,37 @@
   char **argv;
   gpointer user_data;
   gboolean is_simple;
+  GMutex nsapp_mutex;
+  GCond nsapp_cond;
 };
 
+@interface GstCocoaApplicationDelegate : NSObject <NSApplicationDelegate>
+@property (assign) GMutex *nsapp_mutex;
+@property (assign) GCond *nsapp_cond;
+@end
+
+@implementation GstCocoaApplicationDelegate
+
+- (void)applicationDidFinishLaunching:(NSNotification *)notification
+{
+  g_mutex_lock (self.nsapp_mutex);
+  g_cond_signal (self.nsapp_cond);
+  g_mutex_unlock (self.nsapp_mutex);
+}
+
+@end
+
 int
 gst_thread_func (ThreadArgs *args)
 {
+  /* Only proceed once NSApp is running, otherwise we could
+   * attempt to call [NSApp: stop] before it's even started. */
+  g_mutex_lock (&args->nsapp_mutex);
+  while (![[NSRunningApplication currentApplication] isFinishedLaunching]) {
+    g_cond_wait (&args->nsapp_cond, &args->nsapp_mutex);
+  }
+  g_mutex_unlock (&args->nsapp_mutex);
+
   int ret;
   if (args->is_simple) {
     ret = ((GstMainFuncSimple) args->main_func) (args->user_data);
@@ -21,7 +47,20 @@
     ret = ((GstMainFunc) args->main_func) (args->argc, args->argv, args->user_data);
   }
 
-  [NSApp terminate: nil];
+  /* Post a message so we'll break out of the message loop */
+  NSEvent *event = [NSEvent otherEventWithType: NSEventTypeApplicationDefined
+                       location: NSZeroPoint
+                  modifierFlags: 0
+                      timestamp: 0
+                   windowNumber: 0
+                        context: nil
+                        subtype: NSEventSubtypeApplicationActivated
+                          data1: 0 
+                          data2: 0];
+
+  [NSApp postEvent:event atStart:YES];
+  [NSApp stop:nil];
+
   return ret;
 }
 
@@ -29,12 +68,31 @@
 run_main_with_nsapp (ThreadArgs args)
 {
   GThread *gst_thread;
+  GstCocoaApplicationDelegate* delegate;
+  int result;
+
+  g_mutex_init (&args.nsapp_mutex);
+  g_cond_init (&args.nsapp_cond);
+
+  [NSApplication sharedApplication];
+  delegate = [[GstCocoaApplicationDelegate alloc] init];
+  delegate.nsapp_mutex = &args.nsapp_mutex;
+  delegate.nsapp_cond = &args.nsapp_cond;
+  [NSApp setDelegate:delegate];
+
+  /* This lets us show an icon in the dock and correctly focus opened windows */
+  if ([NSApp activationPolicy] == NSApplicationActivationPolicyProhibited) {
+    [NSApp setActivationPolicy:NSApplicationActivationPolicyAccessory];
+  }
 
-  [NSApplication sharedApplication]; 
   gst_thread = g_thread_new ("macos-gst-thread", (GThreadFunc) gst_thread_func, &args);
   [NSApp run];
+  result = GPOINTER_TO_INT (g_thread_join (gst_thread));
+
+  g_mutex_clear (&args.nsapp_mutex);
+  g_cond_clear (&args.nsapp_cond);
 
-  return GPOINTER_TO_INT (g_thread_join (gst_thread));
+  return result;
 }
 
 /**
diff -Nru gstreamer1.0-1.22.0/gst/gstpad.c gstreamer1.0-1.22.12/gst/gstpad.c
--- gstreamer1.0-1.22.0/gst/gstpad.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/gst/gstpad.c	2024-04-29 21:09:52.000000000 +0200
@@ -659,15 +659,18 @@
 
   if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) {
     GstSegment segment;
+    guint32 seqnum;
 
     g_assert (!upstream);
 
     /* copy segment values */
     gst_event_copy_segment (event, &segment);
+    seqnum = gst_event_get_seqnum (event);
     gst_event_unref (event);
 
     gst_segment_offset_running_time (&segment, segment.format, pad_offset);
     event = gst_event_new_segment (&segment);
+    gst_event_set_seqnum (event, seqnum);
   }
 
   event = gst_event_make_writable (event);
@@ -2378,22 +2381,18 @@
   }
 }
 
-/* FIXME leftover from an attempt at refactoring... */
-/* call with the two pads unlocked, when this function returns GST_PAD_LINK_OK,
- * the two pads will be locked in the srcpad, sinkpad order. */
+/* check that pads does not have any exisiting links
+ * and that hierarchy is valid for linking.
+ *
+ * The LOCK should be held on both pads
+ */
 static GstPadLinkReturn
-gst_pad_link_prepare (GstPad * srcpad, GstPad * sinkpad, GstPadLinkCheck flags)
+gst_pad_link_check_relations (GstPad * srcpad, GstPad * sinkpad,
+    GstPadLinkCheck flags)
 {
-  GST_CAT_INFO (GST_CAT_PADS, "trying to link %s:%s and %s:%s",
-      GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
-
-  GST_OBJECT_LOCK (srcpad);
-
   if (G_UNLIKELY (GST_PAD_PEER (srcpad) != NULL))
     goto src_was_linked;
 
-  GST_OBJECT_LOCK (sinkpad);
-
   if (G_UNLIKELY (GST_PAD_PEER (sinkpad) != NULL))
     goto sink_was_linked;
 
@@ -2403,12 +2402,6 @@
       && !gst_pad_link_check_hierarchy (srcpad, sinkpad))
     goto wrong_hierarchy;
 
-  /* check pad caps for non-empty intersection */
-  if (!gst_pad_link_check_compatible_unlocked (srcpad, sinkpad, flags))
-    goto no_format;
-
-  /* FIXME check pad scheduling for non-empty intersection */
-
   return GST_PAD_LINK_OK;
 
 src_was_linked:
@@ -2418,7 +2411,6 @@
         GST_DEBUG_PAD_NAME (GST_PAD_PEER (srcpad)));
     /* we do not emit a warning in this case because unlinking cannot
      * be made MT safe.*/
-    GST_OBJECT_UNLOCK (srcpad);
     return GST_PAD_LINK_WAS_LINKED;
   }
 sink_was_linked:
@@ -2428,23 +2420,57 @@
         GST_DEBUG_PAD_NAME (GST_PAD_PEER (sinkpad)));
     /* we do not emit a warning in this case because unlinking cannot
      * be made MT safe.*/
-    GST_OBJECT_UNLOCK (sinkpad);
-    GST_OBJECT_UNLOCK (srcpad);
     return GST_PAD_LINK_WAS_LINKED;
   }
 wrong_hierarchy:
   {
     GST_CAT_INFO (GST_CAT_PADS, "pads have wrong hierarchy");
-    GST_OBJECT_UNLOCK (sinkpad);
-    GST_OBJECT_UNLOCK (srcpad);
     return GST_PAD_LINK_WRONG_HIERARCHY;
   }
-no_format:
-  {
+}
+
+/* FIXME leftover from an attempt at refactoring... */
+/* call with the two pads unlocked, when this function returns GST_PAD_LINK_OK,
+ * the two pads will be locked in the srcpad, sinkpad order. */
+static GstPadLinkReturn
+gst_pad_link_prepare (GstPad * srcpad, GstPad * sinkpad, GstPadLinkCheck flags)
+{
+  GstPadLinkReturn result;
+
+  GST_CAT_INFO (GST_CAT_PADS, "trying to link %s:%s and %s:%s",
+      GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
+
+  GST_OBJECT_LOCK (srcpad);
+  GST_OBJECT_LOCK (sinkpad);
+
+  /* Check pads state, not already linked and correct hierachy. */
+  result = gst_pad_link_check_relations (srcpad, sinkpad, flags);
+  if (result != GST_PAD_LINK_OK)
+    goto unlock_and_return;
+
+  /* check pad caps for non-empty intersection */
+  if (!gst_pad_link_check_compatible_unlocked (srcpad, sinkpad, flags)) {
     GST_CAT_INFO (GST_CAT_PADS, "caps are incompatible");
+    result = GST_PAD_LINK_NOFORMAT;
+    goto unlock_and_return;
+  }
+
+  /* Need to recheck our pads since gst_pad_link_check_compatible_unlocked might have temporarily unlocked them.
+     Keeping the first check, because gst_pad_link_check_compatible_unlocked potentially is an expensive operation
+     which gst_pad_link_check_relations is not. */
+  result = gst_pad_link_check_relations (srcpad, sinkpad, flags);
+  if (result != GST_PAD_LINK_OK)
+    goto unlock_and_return;
+
+  /* FIXME check pad scheduling for non-empty intersection */
+
+  return GST_PAD_LINK_OK;
+
+unlock_and_return:
+  {
     GST_OBJECT_UNLOCK (sinkpad);
     GST_OBJECT_UNLOCK (srcpad);
-    return GST_PAD_LINK_NOFORMAT;
+    return result;
   }
 }
 
@@ -6324,6 +6350,7 @@
   task = GST_PAD_TASK (pad);
   if (task == NULL) {
     task = gst_task_new (func, user_data, notify);
+    notify = NULL;
     gst_task_set_lock (task, GST_PAD_GET_STREAM_LOCK (pad));
     gst_task_set_enter_callback (task, pad_enter_thread, pad, NULL);
     gst_task_set_leave_callback (task, pad_leave_thread, pad, NULL);
@@ -6345,6 +6372,10 @@
   res = gst_task_set_state (task, GST_TASK_STARTED);
   GST_OBJECT_UNLOCK (pad);
 
+  /* free user_data if it wasn't used for gst_task_new */
+  if (notify)
+    notify (user_data);
+
   return res;
 
   /* ERRORS */
diff -Nru gstreamer1.0-1.22.0/gst/gstquery.c gstreamer1.0-1.22.12/gst/gstquery.c
--- gstreamer1.0-1.22.0/gst/gstquery.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/gst/gstquery.c	2024-04-29 21:09:52.000000000 +0200
@@ -106,6 +106,7 @@
   {GST_QUERY_DRAIN, "drain", 0},
   {GST_QUERY_CONTEXT, "context", 0},
   {GST_QUERY_BITRATE, "bitrate", 0},
+  {GST_QUERY_SELECTABLE, "selectable", 0},
 
   {0, NULL, 0}
 };
diff -Nru gstreamer1.0-1.22.0/gst/gstsegment.c gstreamer1.0-1.22.12/gst/gstsegment.c
--- gstreamer1.0-1.22.0/gst/gstsegment.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/gst/gstsegment.c	2024-04-29 21:09:52.000000000 +0200
@@ -769,8 +769,8 @@
       stop = segment->start + segment->duration;
 
     /* cannot continue if no stop position set or invalid offset */
-    g_return_val_if_fail (stop != -1, 0);
-    g_return_val_if_fail (stop >= offset, 0);
+    if (stop == -1 || stop < offset)
+      return 0;
 
     stop -= offset;
 
diff -Nru gstreamer1.0-1.22.0/gst/gsttaglist.c gstreamer1.0-1.22.12/gst/gsttaglist.c
--- gstreamer1.0-1.22.0/gst/gsttaglist.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/gst/gsttaglist.c	2024-04-29 21:09:52.000000000 +0200
@@ -455,8 +455,7 @@
   }
 
   g_value_init (dest, G_TYPE_STRING);
-  g_value_take_string (dest, str->str);
-  g_string_free (str, FALSE);
+  g_value_take_string (dest, g_string_free (str, FALSE));
 }
 
 static GstTagInfo *
diff -Nru gstreamer1.0-1.22.0/gst/gsttracerutils.c gstreamer1.0-1.22.12/gst/gsttracerutils.c
--- gstreamer1.0-1.22.0/gst/gsttracerutils.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/gst/gsttracerutils.c	2024-04-29 21:09:52.000000000 +0200
@@ -100,7 +100,21 @@
     while (t[i]) {
       // check t[i] for params
       if ((params = strchr (t[i], '('))) {
-        gchar *end = strchr (&params[1], ')');
+        // params can contain multiple '(' when using this kind of parameter: 'max-buffer-size=(uint)5'
+        guint n_par = 1, j;
+        gchar *end = NULL;
+
+        for (j = 1; params[j] != '\0'; j++) {
+          if (params[j] == '(')
+            n_par++;
+          else if (params[j] == ')') {
+            n_par--;
+            if (n_par == 0) {
+              end = &params[j];
+              break;
+            }
+          }
+        }
         *params = '\0';
         params++;
         if (end)
diff -Nru gstreamer1.0-1.22.0/gst/gsttypefind.c gstreamer1.0-1.22.12/gst/gsttypefind.c
--- gstreamer1.0-1.22.0/gst/gsttypefind.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/gst/gsttypefind.c	2024-04-29 21:09:52.000000000 +0200
@@ -115,7 +115,7 @@
  * the stream. The returned memory is valid until the typefinding function
  * returns and must not be freed.
  *
- * Returns: (transfer none) (array length=size) (nullable): the
+ * Returns: (transfer none) (nullable): the
  *     requested data, or %NULL if that data is not available.
  */
 const guint8 *
diff -Nru gstreamer1.0-1.22.0/gst/gsturi.c gstreamer1.0-1.22.12/gst/gsturi.c
--- gstreamer1.0-1.22.0/gst/gsturi.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/gst/gsturi.c	2024-04-29 21:09:52.000000000 +0200
@@ -564,8 +564,12 @@
 static gint
 sort_by_rank (GstPluginFeature * first, GstPluginFeature * second)
 {
-  return gst_plugin_feature_get_rank (second) -
+  int diff = gst_plugin_feature_get_rank (second) -
       gst_plugin_feature_get_rank (first);
+  if (diff == 0)
+    diff = g_strcmp0 (gst_plugin_feature_get_name (first),
+        gst_plugin_feature_get_name (second));
+  return diff;
 }
 
 static GList *
diff -Nru gstreamer1.0-1.22.0/gst/gstutils.c gstreamer1.0-1.22.12/gst/gstutils.c
--- gstreamer1.0-1.22.0/gst/gstutils.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/gst/gstutils.c	2024-04-29 21:09:52.000000000 +0200
@@ -199,7 +199,8 @@
 
   value_type = pspec->value_type;
 
-  GST_DEBUG ("pspec->flags is %d, pspec->value_type is %s",
+  GST_CAT_DEBUG_OBJECT (GST_CAT_PARAMS, object,
+      "pspec->flags is %d, pspec->value_type is %s",
       pspec->flags, g_type_name (value_type));
 
   if (!(pspec->flags & G_PARAM_WRITABLE))
@@ -1145,9 +1146,8 @@
   g_return_val_if_fail (GST_IS_ELEMENT (element), NULL);
   g_return_val_if_fail (GST_IS_PAD (pad), NULL);
 
-  GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
-      "finding pad in %s compatible with %s:%s",
-      GST_ELEMENT_NAME (element), GST_DEBUG_PAD_NAME (pad));
+  GST_CAT_DEBUG_OBJECT (GST_CAT_ELEMENT_PADS, element,
+      "finding pad compatible with %s:%s", GST_DEBUG_PAD_NAME (pad));
 
   g_return_val_if_fail (GST_PAD_PEER (pad) == NULL, NULL);
 
@@ -1173,8 +1173,8 @@
 
         current = g_value_get_object (&padptr);
 
-        GST_CAT_LOG (GST_CAT_ELEMENT_PADS, "examining pad %s:%s",
-            GST_DEBUG_PAD_NAME (current));
+        GST_CAT_LOG_OBJECT (GST_CAT_ELEMENT_PADS, element,
+            "examining pad %s:%s", GST_DEBUG_PAD_NAME (current));
 
         if (GST_PAD_IS_SRC (current)) {
           srcpad = current;
@@ -1204,7 +1204,7 @@
           gst_caps_unref (intersection);
 
           if (compatible) {
-            GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
+            GST_CAT_DEBUG_OBJECT (GST_CAT_ELEMENT_PADS, element,
                 "found existing unlinked compatible pad %s:%s",
                 GST_DEBUG_PAD_NAME (current));
             gst_iterator_free (pads);
@@ -1262,7 +1262,7 @@
   gst_object_unref (templ);
 
   if (foundpad) {
-    GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
+    GST_CAT_DEBUG_OBJECT (GST_CAT_ELEMENT_PADS, element,
         "found existing request pad %s:%s", GST_DEBUG_PAD_NAME (foundpad));
     return foundpad;
   }
@@ -1618,13 +1618,15 @@
   e2 = GST_OBJECT_PARENT (*sink);
 
   if (G_UNLIKELY (e1 == NULL)) {
-    GST_WARNING ("Trying to ghost a pad that doesn't have a parent: %"
-        GST_PTR_FORMAT, *src);
+    GST_CAT_WARNING (GST_CAT_ELEMENT_PADS,
+        "Trying to ghost a pad that doesn't have a parent: %" GST_PTR_FORMAT,
+        *src);
     return FALSE;
   }
   if (G_UNLIKELY (e2 == NULL)) {
-    GST_WARNING ("Trying to ghost a pad that doesn't have a parent: %"
-        GST_PTR_FORMAT, *sink);
+    GST_CAT_WARNING (GST_CAT_ELEMENT_PADS,
+        "Trying to ghost a pad that doesn't have a parent: %" GST_PTR_FORMAT,
+        *sink);
     return FALSE;
   }
 
@@ -2158,7 +2160,7 @@
 
     capsfilter = gst_element_factory_make ("capsfilter", NULL);
     if (!capsfilter) {
-      GST_ERROR ("Could not make a capsfilter");
+      GST_CAT_ERROR (GST_CAT_ELEMENT_PADS, "Could not make a capsfilter");
       return FALSE;
     }
 
@@ -2168,7 +2170,7 @@
     gst_element_get_state (GST_ELEMENT_CAST (parent), &state, &pending, 0);
 
     if (!gst_bin_add (GST_BIN (parent), capsfilter)) {
-      GST_ERROR ("Could not add capsfilter");
+      GST_CAT_ERROR (GST_CAT_ELEMENT_PADS, "Could not add capsfilter");
       gst_object_unref (parent);
       return FALSE;
     }
@@ -2327,15 +2329,16 @@
     if ((srcpad = gst_element_request_pad_simple (src, srcpadname)))
       srcrequest = TRUE;
   if (srcpad == NULL) {
-    GST_WARNING_OBJECT (src, "source element has no pad \"%s\"", srcpadname);
+    GST_CAT_WARNING_OBJECT (GST_CAT_ELEMENT_PADS, src,
+        "source element has no pad \"%s\"", srcpadname);
     return;
   }
   if (!(destpad = gst_element_get_static_pad (dest, destpadname)))
     if ((destpad = gst_element_request_pad_simple (dest, destpadname)))
       destrequest = TRUE;
   if (destpad == NULL) {
-    GST_WARNING_OBJECT (dest, "destination element has no pad \"%s\"",
-        destpadname);
+    GST_CAT_WARNING_OBJECT (GST_CAT_ELEMENT_PADS, dest,
+        "destination element has no pad \"%s\"", destpadname);
     goto free_src;
   }
 
@@ -2813,9 +2816,11 @@
     GstCaps *peercaps, *intersection;
 
     gst_query_parse_caps_result (data->query, &peercaps);
-    GST_DEBUG_OBJECT (pad, "intersect with result %" GST_PTR_FORMAT, peercaps);
+    GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
+        "intersect with result %" GST_PTR_FORMAT, peercaps);
     intersection = gst_caps_intersect (data->ret, peercaps);
-    GST_DEBUG_OBJECT (pad, "intersected %" GST_PTR_FORMAT, intersection);
+    GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
+        "intersected %" GST_PTR_FORMAT, intersection);
 
     gst_caps_unref (data->ret);
     data->ret = intersection;
@@ -3194,7 +3199,7 @@
   query = gst_query_new_accept_caps (caps);
   if (gst_pad_query (pad, query)) {
     gst_query_parse_accept_caps_result (query, &res);
-    GST_DEBUG_OBJECT (pad, "query returned %d", res);
+    GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "query returned %d", res);
   }
   gst_query_unref (query);
 
@@ -3223,7 +3228,7 @@
   query = gst_query_new_accept_caps (caps);
   if (gst_pad_peer_query (pad, query)) {
     gst_query_parse_accept_caps_result (query, &res);
-    GST_DEBUG_OBJECT (pad, "query returned %d", res);
+    GST_CAT_DEBUG_OBJECT (GST_CAT_CAPS, pad, "query returned %d", res);
   }
   gst_query_unref (query);
 
@@ -3256,14 +3261,14 @@
         GstPad *peer;
         GstPad *pad = g_value_get_object (&data);
 
-        GST_CAT_LOG (GST_CAT_ELEMENT_PADS, "examining pad %s:%s",
-            GST_DEBUG_PAD_NAME (pad));
+        GST_CAT_LOG_OBJECT (GST_CAT_ELEMENT_PADS, element,
+            "examining pad %s:%s", GST_DEBUG_PAD_NAME (pad));
 
         peer = gst_pad_get_peer (pad);
         if (peer == NULL) {
           unlinked_pad = gst_object_ref (pad);
           done = TRUE;
-          GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS,
+          GST_CAT_DEBUG_OBJECT (GST_CAT_ELEMENT_PADS, element,
               "found existing unlinked pad %s:%s",
               GST_DEBUG_PAD_NAME (unlinked_pad));
         } else {
@@ -4192,9 +4197,10 @@
     gst_event_parse_stream_start (event, &stream_id);
     ret = g_strdup (stream_id);
     gst_event_unref (event);
-    GST_LOG_OBJECT (pad, "pad has stream-id '%s'", ret);
+    GST_CAT_LOG_OBJECT (GST_CAT_PADS, pad, "pad has stream-id '%s'", ret);
   } else {
-    GST_DEBUG_OBJECT (pad, "pad has not received a stream-start event yet");
+    GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
+        "pad has not received a stream-start event yet");
   }
 
   return ret;
@@ -4227,9 +4233,10 @@
   if (event != NULL) {
     gst_event_parse_stream (event, &stream);
     gst_event_unref (event);
-    GST_LOG_OBJECT (pad, "pad has stream object %p", stream);
+    GST_CAT_LOG_OBJECT (GST_CAT_PADS, pad, "pad has stream object %p", stream);
   } else {
-    GST_DEBUG_OBJECT (pad, "pad has not received a stream-start event yet");
+    GST_CAT_DEBUG_OBJECT (GST_CAT_PADS, pad,
+        "pad has not received a stream-start event yet");
   }
 
   return stream;
diff -Nru gstreamer1.0-1.22.0/gst/parse/grammar.y.in gstreamer1.0-1.22.12/gst/parse/grammar.y.in
--- gstreamer1.0-1.22.0/gst/parse/grammar.y.in	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/gst/parse/grammar.y.in	2024-04-29 21:09:52.000000000 +0200
@@ -672,6 +672,8 @@
         g_object_set_property (target, pspec->name, &v);
         g_value_unset (&v);
       }
+
+      gst_object_unref (target);
     }
   }
 
diff -Nru gstreamer1.0-1.22.0/gstreamer.doap gstreamer1.0-1.22.12/gstreamer.doap
--- gstreamer1.0-1.22.0/gstreamer.doap	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/gstreamer.doap	2024-04-29 21:09:52.000000000 +0200
@@ -40,6 +40,126 @@
 
  <release>
   <Version>
+   <revision>1.22.12</revision>
+   <branch>1.22</branch>
+   <name></name>
+   <created>2024-04-29</created>
+   <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.22.12.tar.xz"; />
+  </Version>
+ </release>
+
+ <release>
+  <Version>
+   <revision>1.22.11</revision>
+   <branch>1.22</branch>
+   <name></name>
+   <created>2024-03-19</created>
+   <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.22.11.tar.xz"; />
+  </Version>
+ </release>
+
+ <release>
+  <Version>
+   <revision>1.22.10</revision>
+   <branch>1.22</branch>
+   <name></name>
+   <created>2024-02-13</created>
+   <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.22.10.tar.xz"; />
+  </Version>
+ </release>
+
+ <release>
+  <Version>
+   <revision>1.22.9</revision>
+   <branch>1.22</branch>
+   <name></name>
+   <created>2024-01-24</created>
+   <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.22.9.tar.xz"; />
+  </Version>
+ </release>
+
+ <release>
+  <Version>
+   <revision>1.22.8</revision>
+   <branch>1.22</branch>
+   <name></name>
+   <created>2023-12-18</created>
+   <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.22.8.tar.xz"; />
+  </Version>
+ </release>
+
+ <release>
+  <Version>
+   <revision>1.22.7</revision>
+   <branch>1.22</branch>
+   <name></name>
+   <created>2023-11-13</created>
+   <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.22.7.tar.xz"; />
+  </Version>
+ </release>
+
+ <release>
+  <Version>
+   <revision>1.22.6</revision>
+   <branch>1.22</branch>
+   <name></name>
+   <created>2023-09-20</created>
+   <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.22.6.tar.xz"; />
+  </Version>
+ </release>
+
+ <release>
+  <Version>
+   <revision>1.22.5</revision>
+   <branch>1.22</branch>
+   <name></name>
+   <created>2023-07-20</created>
+   <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.22.5.tar.xz"; />
+  </Version>
+ </release>
+
+ <release>
+  <Version>
+   <revision>1.22.4</revision>
+   <branch>1.22</branch>
+   <name></name>
+   <created>2023-06-20</created>
+   <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.22.4.tar.xz"; />
+  </Version>
+ </release>
+
+ <release>
+  <Version>
+   <revision>1.22.3</revision>
+   <branch>1.22</branch>
+   <name></name>
+   <created>2023-05-19</created>
+   <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.22.3.tar.xz"; />
+  </Version>
+ </release>
+
+ <release>
+  <Version>
+   <revision>1.22.2</revision>
+   <branch>1.22</branch>
+   <name></name>
+   <created>2023-04-11</created>
+   <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.22.2.tar.xz"; />
+  </Version>
+ </release>
+
+ <release>
+  <Version>
+   <revision>1.22.1</revision>
+   <branch>1.22</branch>
+   <name></name>
+   <created>2023-03-04</created>
+   <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.22.1.tar.xz"; />
+  </Version>
+ </release>
+
+ <release>
+  <Version>
    <revision>1.22.0</revision>
    <branch>main</branch>
    <name></name>
diff -Nru gstreamer1.0-1.22.0/libs/gst/base/gstaggregator.c gstreamer1.0-1.22.12/libs/gst/base/gstaggregator.c
--- gstreamer1.0-1.22.0/libs/gst/base/gstaggregator.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/libs/gst/base/gstaggregator.c	2024-04-29 21:09:52.000000000 +0200
@@ -264,6 +264,12 @@
   guint num_buffers;
   GstBuffer *peeked_buffer;
 
+  /* TRUE if the serialized query is in the proccess of handling at some
+   * exact moment. This will obligate the sinkpad streaming thread wait
+   * until the handling finishes.
+   * Always protected by the PAD_LOCK. */
+  gboolean query_in_proccess;
+
   /* used to track fill state of queues, only used with live-src and when
    * latency property is set to > 0 */
   GstClockTime head_position;
@@ -971,8 +977,10 @@
         !GST_IS_BUFFER (g_queue_peek_tail (&pad->priv->data))) {
       if (GST_IS_EVENT (g_queue_peek_tail (&pad->priv->data)))
         event = gst_event_ref (g_queue_peek_tail (&pad->priv->data));
-      if (GST_IS_QUERY (g_queue_peek_tail (&pad->priv->data)))
+      if (GST_IS_QUERY (g_queue_peek_tail (&pad->priv->data))) {
         query = g_queue_peek_tail (&pad->priv->data);
+        pad->priv->query_in_proccess = TRUE;
+      }
     }
     PAD_UNLOCK (pad);
     if (event || query) {
@@ -1007,6 +1015,8 @@
               NULL);
           g_queue_pop_tail (&pad->priv->data);
         }
+
+        pad->priv->query_in_proccess = FALSE;
       }
 
       PAD_BROADCAST_EVENT (pad);
@@ -1636,7 +1646,7 @@
   PAD_FLUSH_UNLOCK (aggpad);
 }
 
-/* Must be called with the the PAD_LOCK held */
+/* Must be called with the PAD_LOCK and OBJECT_LOCK held */
 static void
 update_time_level (GstAggregatorPad * aggpad, gboolean head)
 {
@@ -2032,7 +2042,10 @@
 
   SRC_LOCK (self);
   gst_aggregator_pad_set_flushing (aggpad, GST_FLOW_FLUSHING, TRUE);
+  PAD_LOCK (aggpad);
   gst_buffer_replace (&aggpad->priv->peeked_buffer, NULL);
+  gst_buffer_replace (&aggpad->priv->clipped_buffer, NULL);
+  PAD_UNLOCK (aggpad);
   gst_element_remove_pad (element, pad);
 
   self->priv->has_peer_latency = FALSE;
@@ -2635,9 +2648,14 @@
     SRC_BROADCAST (self);
     SRC_UNLOCK (self);
 
-    while (!gst_aggregator_pad_queue_is_empty (aggpad)
-        && aggpad->priv->flow_return == GST_FLOW_OK) {
-      GST_DEBUG_OBJECT (aggpad, "Waiting for buffer to be consumed");
+    /* Sanity check: aggregator's sink pad can only proccess one serialized
+     * query at a time. */
+    g_warn_if_fail (!aggpad->priv->query_in_proccess);
+
+    while ((!gst_aggregator_pad_queue_is_empty (aggpad)
+            && aggpad->priv->flow_return == GST_FLOW_OK) ||
+        aggpad->priv->query_in_proccess) {
+      GST_DEBUG_OBJECT (aggpad, "Waiting for query to be consumed");
       PAD_WAIT_EVENT (aggpad);
     }
 
@@ -3105,7 +3123,9 @@
   else
     aggpad->priv->tail_position = timestamp;
 
+  GST_OBJECT_LOCK (aggpad);
   update_time_level (aggpad, head);
+  GST_OBJECT_UNLOCK (aggpad);
 }
 
 /*
@@ -3198,7 +3218,7 @@
           GST_WARNING_OBJECT (aggpad,
               "Ignoring request of selecting the first start time "
               "as the segment is a %s segment instead of a time segment",
-              gst_format_get_name (aggpad->segment.format));
+              gst_format_get_name (aggpad->priv->head_segment.format));
         }
         GST_OBJECT_UNLOCK (aggpad);
         break;
@@ -3696,8 +3716,8 @@
   gboolean inactive;
 
   self = GST_AGGREGATOR (gst_pad_get_parent_element (GST_PAD (pad)));
-
-  g_assert_nonnull (self);
+  if (!self)
+    return FALSE;
 
   PAD_LOCK (pad);
   inactive = self->priv->ignore_inactive_pads && is_live_unlocked (self)
diff -Nru gstreamer1.0-1.22.0/libs/gst/base/gstbaseparse.c gstreamer1.0-1.22.12/libs/gst/base/gstbaseparse.c
--- gstreamer1.0-1.22.0/libs/gst/base/gstbaseparse.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/libs/gst/base/gstbaseparse.c	2024-04-29 21:09:52.000000000 +0200
@@ -2289,6 +2289,10 @@
       outbuf = gst_buffer_make_writable (outbuf);
       GST_BUFFER_PTS (outbuf) = pts;
       GST_BUFFER_DTS (outbuf) = dts;
+      GST_BUFFER_OFFSET (outbuf) = GST_BUFFER_OFFSET_NONE;
+      GST_BUFFER_DURATION (outbuf) = GST_CLOCK_TIME_NONE;
+      GST_BUFFER_OFFSET_END (outbuf) = GST_BUFFER_OFFSET_NONE;
+      GST_BUFFER_FLAGS (outbuf) = 0;
       parse->priv->buffers_head =
           g_slist_prepend (parse->priv->buffers_head, outbuf);
       outbuf = NULL;
@@ -2728,6 +2732,7 @@
     GstBuffer *src, *dest;
 
     frame->out_buffer = gst_adapter_take_buffer (parse->priv->adapter, size);
+    frame->out_buffer = gst_buffer_make_writable (frame->out_buffer);
     dest = frame->out_buffer;
     src = frame->buffer;
     GST_BUFFER_PTS (dest) = GST_BUFFER_PTS (src);
@@ -2735,7 +2740,7 @@
     GST_BUFFER_OFFSET (dest) = GST_BUFFER_OFFSET (src);
     GST_BUFFER_DURATION (dest) = GST_BUFFER_DURATION (src);
     GST_BUFFER_OFFSET_END (dest) = GST_BUFFER_OFFSET_END (src);
-    GST_MINI_OBJECT_FLAGS (dest) = GST_MINI_OBJECT_FLAGS (src);
+    GST_BUFFER_FLAGS (dest) = GST_BUFFER_FLAGS (src);
   } else {
     gst_adapter_flush (parse->priv->adapter, size);
   }
diff -Nru gstreamer1.0-1.22.0/libs/gst/base/gstbasesink.c gstreamer1.0-1.22.12/libs/gst/base/gstbasesink.c
--- gstreamer1.0-1.22.0/libs/gst/base/gstbasesink.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/libs/gst/base/gstbasesink.c	2024-04-29 21:09:52.000000000 +0200
@@ -2185,7 +2185,11 @@
       }
       goto do_times;
     }
-    goto out_of_segment;
+    if (basesink->priv->drop_out_of_segment)
+      goto out_of_segment;
+
+    cstart = start;
+    cstop = stop;
   }
 
   if (G_UNLIKELY (start != cstart || stop != cstop)) {
@@ -3664,6 +3668,9 @@
       if (bclass->event)
         result = bclass->event (basesink, event);
       break;
+    case GST_EVENT_STREAM_START:
+      basesink->priv->received_eos = FALSE;
+      /* fallthrough */
     default:
       if (GST_EVENT_IS_SERIALIZED (event)) {
         GST_BASE_SINK_PREROLL_LOCK (basesink);
diff -Nru gstreamer1.0-1.22.0/libs/gst/base/gstbasesrc.c gstreamer1.0-1.22.12/libs/gst/base/gstbasesrc.c
--- gstreamer1.0-1.22.0/libs/gst/base/gstbasesrc.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/libs/gst/base/gstbasesrc.c	2024-04-29 21:09:52.000000000 +0200
@@ -2599,7 +2599,8 @@
       wait_ret = gst_base_src_wait_playing_unlocked (src);
       if (wait_ret != GST_FLOW_OK) {
         if (ret == GST_FLOW_OK && own_res_buf)
-          gst_buffer_unref (res_buf);
+          gst_clear_buffer (&res_buf);
+        gst_clear_buffer_list (&src->priv->pending_bufferlist);
         ret = wait_ret;
         goto stopped;
       }
@@ -2612,7 +2613,8 @@
   if (G_UNLIKELY (g_atomic_int_get (&src->priv->has_pending_eos))) {
     if (ret == GST_FLOW_OK) {
       if (own_res_buf)
-        gst_buffer_unref (res_buf);
+        gst_clear_buffer (&res_buf);
+      gst_clear_buffer_list (&src->priv->pending_bufferlist);
     }
     src->priv->forced_eos = TRUE;
     goto eos;
diff -Nru gstreamer1.0-1.22.0/libs/gst/base/gstbasesrc.h gstreamer1.0-1.22.12/libs/gst/base/gstbasesrc.h
--- gstreamer1.0-1.22.0/libs/gst/base/gstbasesrc.h	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/libs/gst/base/gstbasesrc.h	2024-04-29 21:09:52.000000000 +0200
@@ -184,6 +184,14 @@
   /* decide on caps */
   gboolean      (*negotiate)    (GstBaseSrc *src);
   /* called if, in negotiation, caps need fixating */
+  /**
+   * GstBaseSrcClass::fixate:
+   * @caps: (transfer full):
+   *
+   * Called if, in negotiation, caps need fixating.
+   *
+   * Returns: (transfer full): the fixated caps
+   */
   GstCaps *     (*fixate)       (GstBaseSrc *src, GstCaps *caps);
   /* notify the subclass of new caps */
   gboolean      (*set_caps)     (GstBaseSrc *src, GstCaps *caps);
@@ -241,7 +249,7 @@
 
   /**
    * GstBaseSrcClass::create:
-   * @buf: (inout):
+   * @buf: (inout) (nullable):
    *
    * Ask the subclass to create a buffer with @offset and @size, the default
    * implementation will call alloc if no allocated @buf is provided and then call fill.
@@ -250,7 +258,7 @@
                                  GstBuffer **buf);
   /**
    * GstBaseSrcClass::alloc:
-   * @buf: (out):
+   * @buf: (out) (nullable):
    *
    * Ask the subclass to allocate an output buffer with @offset and @size, the default
    * implementation will use the negotiated allocator.
diff -Nru gstreamer1.0-1.22.0/libs/gst/base/gstpushsrc.h gstreamer1.0-1.22.12/libs/gst/base/gstpushsrc.h
--- gstreamer1.0-1.22.0/libs/gst/base/gstpushsrc.h	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/libs/gst/base/gstpushsrc.h	2024-04-29 21:09:52.000000000 +0200
@@ -72,7 +72,7 @@
 
   /**
    * GstPushSrcClass::create:
-   * @buf: (inout):
+   * @buf: (inout) (nullable):
    *
    * Ask the subclass to create a buffer, the default implementation will call alloc if
    * no allocated @buf is provided and then call fill.
@@ -80,7 +80,7 @@
   GstFlowReturn (*create) (GstPushSrc *src, GstBuffer **buf);
   /**
    * GstPushSrcClass::alloc:
-   * @buf: (out):
+   * @buf: (out) (nullable):
    *
    * Allocate memory for a buffer.
    */
diff -Nru gstreamer1.0-1.22.0/libs/gst/base/gsttypefindhelper.c gstreamer1.0-1.22.12/libs/gst/base/gsttypefindhelper.c
--- gstreamer1.0-1.22.0/libs/gst/base/gsttypefindhelper.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/libs/gst/base/gsttypefindhelper.c	2024-04-29 21:09:52.000000000 +0200
@@ -742,7 +742,7 @@
 
   factories = gst_type_find_list_factories_for_caps (obj, caps);
   if (!factories) {
-    GST_ERROR_OBJECT (obj, "Failed to typefind for caps: %" GST_PTR_FORMAT,
+    GST_INFO_OBJECT (obj, "Failed to typefind for caps: %" GST_PTR_FORMAT,
         caps);
     goto out;
   }
diff -Nru gstreamer1.0-1.22.0/libs/gst/helpers/gst-ptp-helper.c gstreamer1.0-1.22.12/libs/gst/helpers/gst-ptp-helper.c
--- gstreamer1.0-1.22.0/libs/gst/helpers/gst-ptp-helper.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/libs/gst/helpers/gst-ptp-helper.c	2024-04-29 21:09:52.000000000 +0200
@@ -71,10 +71,37 @@
 static guint64 clock_id = (guint64) - 1;
 static guint8 clock_id_array[8];
 
+static gboolean
+parse_clock_id (const gchar * option_name, const gchar * value, gpointer data,
+    GError ** err)
+{
+  gchar *endptr;
+  guint64 v;
+
+  errno = 0;
+  v = g_ascii_strtoull (value, &endptr, 16);
+  if (endptr == NULL || *endptr != '\0') {
+    g_set_error (err, G_OPTION_ERROR, G_OPTION_ERROR_UNKNOWN_OPTION,
+        "Cannot parse integer value \"%s\" for --clock-id", value);
+    return FALSE;
+  }
+
+  if (errno != 0) {
+    g_set_error (err, G_OPTION_ERROR, G_OPTION_ERROR_UNKNOWN_OPTION,
+        "Cannot parse integer value \"%s\" for --clock-id: %s", value,
+        g_strerror (errno));
+    return FALSE;
+  }
+
+  clock_id = v;
+
+  return TRUE;
+}
+
 static GOptionEntry opt_entries[] = {
   {"interface", 'i', 0, G_OPTION_ARG_STRING_ARRAY, &ifaces,
       "Interface to listen on", NULL},
-  {"clock-id", 'c', 0, G_OPTION_ARG_INT64, &clock_id,
+  {"clock-id", 'c', 0, G_OPTION_ARG_CALLBACK, parse_clock_id,
       "PTP clock id", NULL},
   {"verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
       "Be verbose", NULL},
diff -Nru gstreamer1.0-1.22.0/libs/gst/net/gstptpclock.c gstreamer1.0-1.22.12/libs/gst/net/gstptpclock.c
--- gstreamer1.0-1.22.0/libs/gst/net/gstptpclock.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/libs/gst/net/gstptpclock.c	2024-04-29 21:09:52.000000000 +0200
@@ -279,13 +279,13 @@
   guint domain;
   PtpClockIdentity master_clock_identity;
 
-  guint16 sync_seqnum;
+  guint32 sync_seqnum;
   GstClockTime sync_recv_time_local;    /* t2 */
   GstClockTime sync_send_time_remote;   /* t1, might be -1 if FOLLOW_UP pending */
   GstClockTime follow_up_recv_time_local;
 
   GSource *timeout_source;
-  guint16 delay_req_seqnum;
+  guint32 delay_req_seqnum;
   GstClockTime delay_req_send_time_local;       /* t3, -1 if we wait for FOLLOW_UP */
   GstClockTime delay_req_recv_time_remote;      /* t4, -1 if we wait */
   GstClockTime delay_resp_recv_time_local;
@@ -336,6 +336,11 @@
   GstClock *domain_clock;
 } PtpDomainData;
 
+// The lists domain_clocks and domain_data are same but the former is protected
+// by the domain_clocks_lock.
+// It is needed because sometimes other threads than the PTP thread will need
+// to access the list, and without a mutex it might happen that the original
+// list (domain_data) is modified at the same time (prepending a new domain).
 static GList *domain_data;
 static GMutex domain_clocks_lock;
 static GList *domain_clocks;
@@ -346,6 +351,11 @@
 static gint domain_stats_n_hooks;
 static gboolean domain_stats_hooks_initted = FALSE;
 
+/* Only ever accessed from the PTP thread */
+/* PTPD in hybrid mode (default) sends multicast PTP messages with an invalid
+ * logMessageInterval. We work around this here and warn once */
+static gboolean ptpd_hybrid_workaround_warned_once = FALSE;
+
 /* Converts log2 seconds to GstClockTime */
 static GstClockTime
 log2_to_clock_time (gint l)
@@ -909,7 +919,17 @@
       return;
   }
 
-  sender->announce_interval = log2_to_clock_time (msg->log_message_interval);
+  if (msg->log_message_interval == 0x7f) {
+    sender->announce_interval = 2 * GST_SECOND;
+
+    if (!ptpd_hybrid_workaround_warned_once) {
+      GST_WARNING ("Working around ptpd bug: ptpd sends multicast PTP packets "
+          "with invalid logMessageInterval");
+      ptpd_hybrid_workaround_warned_once = TRUE;
+    }
+  } else {
+    sender->announce_interval = log2_to_clock_time (msg->log_message_interval);
+  }
 
   announce = g_new0 (PtpAnnounceMessage, 1);
   announce->receive_time = receive_time;
@@ -1511,7 +1531,17 @@
     return;
 #endif
 
-  domain->sync_interval = log2_to_clock_time (msg->log_message_interval);
+  if (msg->log_message_interval == 0x7f) {
+    domain->sync_interval = GST_SECOND;
+
+    if (!ptpd_hybrid_workaround_warned_once) {
+      GST_WARNING ("Working around ptpd bug: ptpd sends multicast PTP packets "
+          "with invalid logMessageInterval");
+      ptpd_hybrid_workaround_warned_once = TRUE;
+    }
+  } else {
+    domain->sync_interval = log2_to_clock_time (msg->log_message_interval);
+  }
 
   /* Check if duplicated */
   for (l = domain->pending_syncs.head; l; l = l->next) {
@@ -1539,6 +1569,7 @@
   sync->delay_req_send_time_local = GST_CLOCK_TIME_NONE;
   sync->delay_req_recv_time_remote = GST_CLOCK_TIME_NONE;
   sync->delay_resp_recv_time_local = GST_CLOCK_TIME_NONE;
+  sync->delay_req_seqnum = G_MAXUINT32;
 
   /* 0.5 correction factor for division later */
   sync->correction_field_sync = msg->correction_field;
@@ -1708,8 +1739,18 @@
       requesting_port_identity.port_number != ptp_clock_id.port_number)
     return;
 
-  domain->min_delay_req_interval =
-      log2_to_clock_time (msg->log_message_interval);
+  if (msg->log_message_interval == 0x7f) {
+    domain->min_delay_req_interval = GST_SECOND;
+
+    if (!ptpd_hybrid_workaround_warned_once) {
+      GST_WARNING ("Working around ptpd bug: ptpd sends multicast PTP packets "
+          "with invalid logMessageInterval");
+      ptpd_hybrid_workaround_warned_once = TRUE;
+    }
+  } else {
+    domain->min_delay_req_interval =
+        log2_to_clock_time (msg->log_message_interval);
+  }
 
   /* Check if we know about this one */
   for (l = domain->pending_syncs.head; l; l = l->next) {
@@ -2317,7 +2358,8 @@
   }
   g_list_free (domain_data);
   domain_data = NULL;
-  g_list_foreach (domain_clocks, (GFunc) g_free, NULL);
+  // The domain_clocks list is same as domain_data
+  // and the elements are freed above already
   g_list_free (domain_clocks);
   domain_clocks = NULL;
 
diff -Nru gstreamer1.0-1.22.0/meson.build gstreamer1.0-1.22.12/meson.build
--- gstreamer1.0-1.22.0/meson.build	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/meson.build	2024-04-29 21:09:52.000000000 +0200
@@ -1,5 +1,5 @@
 project('gstreamer', 'c',
-  version : '1.22.0',
+  version : '1.22.12',
   meson_version : '>= 0.62',
   default_options : [ 'warning_level=1',
                       'buildtype=debugoptimized' ])
diff -Nru gstreamer1.0-1.22.0/NEWS gstreamer1.0-1.22.12/NEWS
--- gstreamer1.0-1.22.0/NEWS	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/NEWS	2024-04-29 21:09:52.000000000 +0200
@@ -2,10 +2,16 @@
 
 GStreamer 1.22.0 was originally released on 23 January 2023.
 
+The latest bug-fix release in the now old-stable 1.22 series is 1.22.12
+and was released on 29 April 2024.
+
 See https://gstreamer.freedesktop.org/releases/1.22/ for the latest
 version of this document.
 
-Last updated: Monday 23 January 2023, 17:00 UTC (log)
+The GStreamer 1.22 stable series has since been superseded by the
+GStreamer 1.24 stable release series.
+
+Last updated: Monday 29 April 2024, 20:00 UTC (log)
 
 Introduction
 
@@ -298,8 +304,8 @@
     -   This is enabled by setting the instant-uri property to true,
         setting the URI to switch to immediately, and then disabling the
         instant-uri property again afterwards.
--   playbin3, decodebin3, uridecodebin3, parsebin, and urisrc are no
-    longer experimental
+-   playbin3, decodebin3, uridecodebin3, parsebin, and urisourcebin are
+    no longer experimental
     -   They were originally marked as ‘technology preview’ but have
         since seen extensive usage in production settings, so are
         considered ready for general use now.
@@ -819,9 +825,9 @@
 
 New MP4 muxer + Fragmented MP4 muxer
 
--   fmp4mux: New fragmented MP4/ISOBMFF/CMAF muxer for generating
-    e.g. DASH/HLS media fragments.
--   isomp4mux: New non-fragmented, normal MP4 muxer.
+-   isofmp4mux, cmafmux, dashmp4mux, onviffmp4mux: New fragmented
+    MP4/ISOBMFF/CMAF muxer for generating e.g. DASH/HLS media fragments.
+-   isomp4mux, onvifmp4mux: New non-fragmented, normal MP4 muxer.
 
 Both plugins provides elements that replace the existing qtmux/mp4mux
 element from gst-plugins-good. While not feature-equivalent yet, the new
@@ -1217,17 +1223,2075 @@
 
 1.22.0 was originally released on 23 January 2023.
 
-Schedule for 1.24
+1.22.1
+
+The first 1.22 bug-fix release (1.22.1) was released on 04 March 2023.
+
+This release only contains bugfixes and it should be safe to update from
+1.22.0.
+
+Highlighted bugfixes in 1.22.1
+
+-   audio channel-mix: allow up to 64 channels (instead of up to 63
+    channels)
+-   avfvideosrc: Don’t wait on main thread for permissions request
+-   avvidenc: avoid generating inaccurate output timestamps, especially
+    with variable framerate streams
+-   AV1 video codec caps signalling improvements in various elements
+-   codectimestamper: Fix timestamping on sequence update
+-   d3d11overlaycompositor: fix texture width and height
+-   d3d11videosink: Fix rendering on external handle
+-   dashdemux2: fix seek operation taking a log time to finish for some
+    streams
+-   nvencoder: Fix B-frame encoding on Linux and min buffers in auto GPU
+    mode
+-   playbin3: fixing buffering for live pipelines
+-   playbin: fix potential deadlock when stopping stream with subtitles
+    visible
+-   redenc: fix setting of extension ID for twcc
+-   rtspsrc: improved compatibility with more broken RTSP servers
+-   v4l2h264dec: Fix Raspberry Pi4 will not play video in application
+-   vtdec: fix jittery playback of H.264 Level 4.1 movies in macOS
+-   vtdec: Fix non-deterministic frame output after flushing seeks
+-   vtenc: fix handling of interlaced ProRes on Apple M1 hardware
+-   vtenc: don’t advertise ARGB/RGBA64 input caps on M1 Pro/Max with
+    macOS <13
+-   wasapi2src: Fix loopback capture on Windows 10 Anniversary Update
+-   tools: better handling of non-ASCII command line arguments on
+    Windows
+-   gst-libav: fix build against newer ffmpeg versions
+-   gst-python: Use arch-specific install dir for gi overrides
+-   cerbero: Fix setuptools site.py breakage in Python 3.11
+-   macOS packages: Fix broken binaries on macos < 11.0
+-   various bug fixes, memory leak fixes, and other stability and
+    reliability improvements
+
+gstreamer
+
+-   buffer: fix copy meta reference debug log formatting
+-   bin: Don’t unlock unlocked mutex in gst_bin_remove_func()
+-   pad: Don’t leak user_data in gst_pad_start_task()
+-   aggregator: Always lock aggpad around update_time_level
+-   inputselector: Avoid potential deadlock when shutting down,
+    e.g. playbin with subtitles
+-   multiqueue: Handle use-interleave latency live pipelines, fixing
+    buffering for live pipelines in playbin3
+-   GstBaseSrc: fix transfer annotation for fixate() virtual method
+-   GstBaseSrc, GstPushSrc: add nullable annotations to virtual methods
+-   tools: Make sure UTF-8 encoded command line arguments on Windows
+
+gst-plugins-base
+
+-   alsasink: Fix stall when going from PLAYING to NULL (stucked at
+    PAUSED) with uac1 gadget
+-   appsrc: Don’t chain up BaseSrc::negotiate()
+-   audio: channel-mix: Fix channel count limit to be able to equal 64
+-   gldisplay: Mark gst_gl_display_create_context() other_context
+    parameter as nullable
+-   gldisplay: Remove unused code
+-   gstglwindow_x11.c: Fix colormap leak
+-   gl/cocoa: Return a strong ref to the parent GstGLContext
+-   rtspconnection: Annotate RTSP message and RTSP events parameters
+    correctly
+-   sdp, typefind: Fix some annotations
+-   sdp: gstmikey: gst_mikey_message_to_caps: extract ROC from first
+    crypto session
+-   subparse: Properly forward segment seqnum
+-   uridecodebin: Set source element to READY before querying it
+-   uritranscodebin: Fix unref of NULL
+-   gst-play-1.0: Don’t force accurate seeking
+
+gst-plugins-good
+
+-   adaptivedemux2: Fix buffering threshold initialization
+-   dashdemux2: the seek operation takes a log time to finish for some
+    streams
+-   glvideomixer: Keep a reference to the underlying pad
+-   qtdemux: Don’t emit GstSegment correcting start time when in MSE
+    mode
+-   qtdemux: Handle moov atom length=0 case by reading until the end
+-   qtdemux, qtmux: Drop av1C version 0 parsing and implement version 1
+    parsing/writing
+-   qtmux: Fix assertion on caps update
+-   redenc: fix setting of extension ID for twcc
+-   rtspsrc: Use the correct vfunc for the push-backchannel-sample
+    action signal
+-   rtpssrcdemux: set different stream-id on each src pad
+-   udpsrc: GstSocketTimestampMessage only for SCM_TIMESTAMPNS
+-   v4l2h264dec: Fix Raspberry Pi4 will not play video in application
+
+gst-plugins-bad
+
+-   aom: Include stream-format and alignment in the AV1 caps
+-   av1parser, h265parser: Fix some code defects
+-   av1parser: Don’t consider unknown metadata OBUs a bitstream error
+-   avfvideosrc: Don’t wait on main thread for permissions request
+-   ccconverter: don’t debug a potentially freed filter caps
+-   codectimestamper: Fix timestamping on sequence update
+-   codecparsers: {h264, h265}bitwriter: Remove redundant condition
+    checks
+-   codecs: decoders: fail early if no input caps have been provided for
+    all new decoder base classes
+-   closedcaption: Don’t leak caps event
+-   curlhttpsrc: Add curl anyauth option
+-   d3d11overlaycompositor: fix texture width and height
+-   d3d11videosink: Fix rendering on external handle
+-   h265parse: Always set profile on src caps
+-   msdkav1enc: fix the category for msdkav1enc debug
+-   nvcodec: improve error reporting on plugin init
+-   nvencoder: Fix b-frame encoding on Linux
+-   nvencoder: Fix min buffers parameter of allocation query in auto GPU
+    mode
+-   nvvp9dec: Fix return value
+-   qsvav1enc, amfav1enc: Set stream-format on caps
+-   vtdec: Jittery playback of H.264 Level 4.1 movies in macOS (both
+    x86_64 and arm64)
+-   vtdec: Fix DPB size calculations not taking values from SPS into
+    account
+-   vtdec: Fix not waiting for async frames when flushing
+-   vtenc: Disable ARGB/RGBA64 caps on M1 Pro/Max with macOS <13
+-   vtenc: Fix checking for certain CPU variants when running in VMs
+-   vtenc: Disable HW acceleration for interlaced ProRes
+-   va: Avoid the array index overflow when filling 8x8 scaling list.
+-   va: Fix some code defects
+-   vah265enc: Use helper to update properties.
+-   vulkan: memory: Flush non coherent memory after write.
+-   wasapi2src: Fix loopback capture on Windows 10 Anniversary Update
+-   webrtcbin: small stats improvements
+-   win32ipcutils: Add missing include
+-   wpe: Logging fixes for the WebExtension
+
+gst-plugins-ugly
+
+-   mpegpsdemux: Ignore DTS if PTS < DTS
+
+gst-libav
+
+-   avauddec, avviddec: Free packet side data after usage
+-   avviddec: change
+    AV_CODEC_CAP_AUTO_THREADS->AV_CODEC_CAP_OTHER_THREADS to fix build
+    against newer ffmpeg versions
+-   Memory leak in ’ av_packet_add_side_data’ in
+    /lib/x86_64-linux-gnu/libavcodec.so reading the file
+    clock_odd_size_RLE_g1597902.avi
+-   avvidenc: Don’t take ffmpeg timestamps verbatim but only use them to
+    calculate DTS
+
+gst-rtsp-server
+
+-   No changes
+
+gstreamer-vaapi
+
+-   vaapi: Skip plugin pc file for shared plugins
+
+gstreamer-sharp
+
+-   No changes
+
+gst-omx
+
+-   No changes
+
+gst-python
+
+-   gst-python: Use arch-specific install dir for gi overrides
+
+gst-editing-services
+
+-   No changes
+
+gst-validate + gst-integration-testsuites
+
+-   validate:scenario: sink refs when building
+-   tests: Fix known issue definition location for unit tests and how we
+    handle them in validate launcher
+-   tests: mark elements_srtp.test_play test as flaky
+-   Fix gstreamer-validate-1.0 dependency name
+-   validate-scenario: fix g-i warning in annotation
+-   validate: Fix gst_validate_execute_action annotation
+
+gst-examples
+
+-   webrtc examples: Use webrtc.gstreamer.net
+-   webrtc_sendrecv.py: Various fixes
+
+Development build environment
+
+-   gst-env: Handle installing python modules to dist-packages
+-   meson: Allow sysdeps to be forced as fallback subprojects
+-   meson: Switch dav1d wrap to a tarball and update to dav1d 1.1.0
+
+Cerbero build tool and packaging changes in 1.22.1
+
+-   macos: Fix broken binaries on macos < 11.0
+-   orc: Update pthread_jit_write_protect fix for macOS/iOS
+-   dav1d: Update to 1.1.0
+-   libsrtp: update to v2.5.0
+-   rustup: Update to 1.25.2
+-   rust: Update to 1.67; cargo-c to 0.9.16
+-   cerbero: Don’t error out if bindir already exists
+-   Fix setuptools site.py breakage in Python 3.11, bump
+    gobject-introspection, bump windows image
+-   cerbero: Retry if cargo update fails on macOS
+-   gst-plugins-rs: Build glib/gio bindings with 2.74 API support
+
+Contributors to 1.22.1
+
+Alessandro Bono, Arun Raghavan, Bart Van Severen, Carlos Falgueras
+García, Célestin Marot, David Svensson Fors, Edward Hervey, Enrique
+Ocaña González, Frank Dana, Guillaume Desmottes, He Junyan, James
+Hilliard, Jan Alexander Steffens (heftig), Jan Schmidt, Jordan Petridis,
+Mathieu Duponchelle, Matthew Waters, medithe, Mengkejiergeli Ba, Nicolas
+Beland, Nirbheek Chauhan, Patricia Muscalu, Pawel Stawicki, Philippe
+Normand, Piotr Brzeziński, Rajneesh Soni, Robert Rosengren, Sanchayan
+Maity, Sebastian Dröge, Seungha Yang, Simon Himmelbauer, Thibault
+Saunier, Tim-Philipp Müller, Tristan van Berkom, U. Artie Eoff, Víctor
+Manuel Jáquez Leal, Vivia Nikolaidou, Xuchen Yang, Yinhang Liu,
+
+… and many others who have contributed bug reports, translations, sent
+suggestions or helped testing. Thank you all!
+
+List of merge requests and issues fixed in 1.22.1
+
+-   List of Merge Requests applied in 1.22.1
+-   List of Issues fixed in 1.22.1
+
+1.22.2
+
+The second 1.22 bug-fix release (1.22.2) was released on 11 April 2023.
+
+This release only contains bugfixes and it should be safe to update from
+1.22.x.
+
+Highlighted bugfixes in 1.22.2
+
+-   avdec_h264: fix decoder deadlocks with FFmpeg 6.0
+-   rtspsrc: fix regression with URI protocols in OPTIONS requests for
+    RTSP over TLS
+-   rtspsrc: improved control url handling compatibility for broken
+    servers
+-   decklink: fix 10 bit RGB (r210) format auto detection for capture
+    and fix playout if video caps are configured before audio caps
+-   d3d11videosink: Fix tearing in case of fullscreen mode
+-   playbin: fix deadlock when stopping stream with subtitles visible
+    (even more)
+-   typefinding: fix regression not detecting application/dash+xml in
+    some corner cases
+-   osxvideosink: fix broken aspect ratio and frame drawing region
+-   decodebin3, parsebin: Improve elementary stream handling when
+    decoders are not present and fix hang when removing a failing stream
+-   urisourcebin: Propagate sticky events from parsebin, so that the
+    STREAM_START event with the GstStream info is always available when
+    pads get exposed
+-   v4l2: Add support for YVU420M format; mark JPEG content as parsed
+-   h264decoder, h265decoder: DPB bumping process and latency reporting
+    fixes
+-   Opus: Fix reading of extended channel config in MPEG-TS and fix
+    missing sample rate when remuxing from RTP to Matroska
+-   zxing: add support for building against zxing-c++ 2.0
+-   cerbero: Fix packaging of Rust plugins on Android; fix modern Gentoo
+    distro detection
+-   various bug fixes, memory leak fixes, and other stability and
+    reliability improvements
+
+gstreamer
+
+-   datetime: Return G_MAXFLOAT instead of G_MAXDOUBLE for no timezone
+    offset
+-   inputselector: Wake up streaming thread before PLAYING_TO_PAUSED
+    transition
+-   tools: fix potential crash when passing command-line options on
+    Windows
+
+gst-plugins-base
+
+-   alsasink: Fix for being stuck in stop_streaming_threads state
+-   decodebin3: fix hang when removing a failing stream
+-   gl: wayland: cleanup on close
+-   parsebin: Improve elementary stream handling
+-   playbin: fix deadlock when stopping stream with subtitles visible
+    even more
+-   sdp: Skip source-specific caps fields when creating an SDP media
+    from caps
+-   urisourcebin: Propagate sticky events from parsebin
+-   urisourcebin: Activate pad before transferring sticky events
+-   typefinding: fix failure to recognize application/dash+xml in some
+    cases
+
+gst-plugins-good
+
+-   osxvideosink: fix broken aspect ratio and frame drawing region
+-   qtdemux: Fix seek adjustment with SNAP_AFTER flag
+-   rtpopusdepay, matroskamux: Fix invalid rate while muxing Opus in
+    Matroska
+-   rtpmanager: twcc: Fix duplicate packet handling
+-   rtsp: url: fix incorrect request URI scheme for TLS transport
+    methods (regression)
+-   rtspsrc: Consider “451: Parameter Not Understood” when handling
+    broken control urls
+-   rtspsrc: fix behavior change with URI protocols in OPTIONS requests
+-   rtspsrc: Skip PTs with caps incompatible to the global caps
+-   rtpjpegdepay: fix logic error when checking if an end of image (EOI)
+    tag is present
+-   v4l2: Add support for YVU420M format
+-   v4l2: mark JPEG as parsed
+
+gst-plugins-bad
+
+-   cea708overlay: fix HCR interpretation
+-   d3d11bufferpool: Fix invalid access in debug print loop
+-   d3d11compositor: Fix composition error on release_pad()
+-   d3d11converter: Fix conversion backend selection
+-   d3d11videosink: Fix tearing in case of fullscreen mode -
+    d3d11bufferpool: Fix invalid access in debug print loop
+-   d3d11window: fix memory leak
+-   decklink: fix 10 bit RGB (r210) format auto detection
+-   decklinkaudiosink: Fix playback when video caps is configured before
+    audio
+-   decklinkvideosrc: RGB 4:4:4 doesn’t work after GStreamer upgrade
+    (regression)
+-   decklinkvideosrc: unable to show HDMI stream that Blackmagic’s Media
+    Express is able to see
+-   debugqroverlay: fix string leak
+-   gtkwaylandsink: Destroy GstWlWindow when parent GtkWindow is
+    destroyed
+-   gtkwaylandsink: Fix crash when rendering after the window is closed
+-   ksvideo, directshow: Fix reference leaks in device providers
+-   h264decoder: Fix DPB bumping process
+-   h264decoder, h265decoder: Latency reporting related fixes
+-   h264parse: Validate VUI framerate
+-   jpegparse: reset parse state when the SOI is not the first marker
+-   nvencoder: Fix CQP option setting
+-   nvh264encoder: Fix template caps to include progressive mode as well
+-   openjpegdec: allow multithread decoding only in subframe mode
+-   tsdemux: Fix reading of extended Opus channel configuration
+-   vulkan: fix validation layer issues
+-   vulkanoverlaycompositor: fix potential use after free
+-   vulkanswapper: correctly handle force-aspect-ratio=false
+-   wasapi2: Fix potential crash on device activation failure
+-   webrtc: Fix segfault traversing ice transports
+-   webrtc: patch leak caused by early return
+-   zxing: add support for zxing-c++ 2.0
+
+gst-plugins-ugly
+
+-   No changes
+
+gst-libav
+
+-   avdec_h264 pipeline freeze with FFmpeg6
+-   avdeinterlace, avmux: fix element reference leak
+-   avviddec: Drop decoder stream lock when calling send_packet
+
+gst-rtsp-server
+
+-   rtsp-server: fix deadlock on shutdown with non-live pipeline if
+    media isn’t playing/prerolled yet and eos-shutdown is enabled for
+    the media
+
+gstreamer-vaapi
+
+-   No changes
+
+gstreamer-sharp
+
+-   No changes
+
+gst-omx
+
+-   No changes
+
+gst-python
+
+-   No changes
+
+gst-editing-services
+
+-   No changes
+
+gst-validate + gst-integration-testsuites
+
+-   No changes
+
+gst-examples
+
+-   No changes
+
+Development build environment
+
+-   git: prevent CRLF line ending conversion for patches to fix pango
+    subproject patching issues on Windows
+
+Cerbero build tool and packaging changes in 1.22.2
+
+-   build: retry rust build on SIGBUS errors too
+-   Fix packaging of rust plugins on Android
+-   Modern Gentoo distro adaptation
+-   sbc: update to 2.0
+-   speex: update to 1.2.1
+
+Contributors to 1.22.2
+
+Adrien De Coninck, Albert Sjölund, Alexande B, Antonio Rojas, Arun
+Raghavan, Bart Van Severen, Carlo Cabrera, Colin Kinloch, Edward Hervey,
+Guillaume Desmottes, Haihua Hu, He Junyan, Ilie Halip, Jordan Petridis,
+Josef Kolář, Lily Foster, Mathieu Duponchelle, Matt Feury, Matthew
+Waters, Maxim P. Dementyev, Michael Tretter, Nicolas Dufresne, Nirbheek
+Chauhan, Piotr Brzeziński, Robert Rosengren, Rouven Czerwinski,
+Sebastian Dröge, Seungha Yang, Shengqi Yu, Stéphane Cerveau, Talha Khan,
+Thibault Saunier, Tim-Philipp Müller, Víctor Manuel Jáquez Leal, Vivia
+Nikolaidou, Wang Chuan, Wojciech Kapsa,
+
+… and many others who have contributed bug reports, translations, sent
+suggestions or helped testing. Thank you all!
+
+List of merge requests and issues fixed in 1.22.2
+
+-   List of Merge Requests applied in 1.22.2
+-   List of Issues fixed in 1.22.2
+
+1.22.3
+
+The third 1.22 bug-fix release (1.22.3) was released on 19 May 2023.
+
+This release only contains bugfixes and it should be safe to update from
+1.22.x.
+
+Highlighted bugfixes in 1.22.3
+
+-   avdec: fix occasional video decoder deadlock on seeking with FFmpeg
+    6.0
+-   decodebin3: fix regression handling input streams without CAPS or
+    TIME segment such as e.g. udpsrc or `pushfilesrc
+-   bluez: a2dpsink: fix Bluetooth SIG Certification test failures
+-   osxvideosink: fix deadlock upon closing output window
+-   qtdemux: fix edit list handling regression and AV1 codec box parsing
+-   qtmux: fix extraction of CEA608 closed caption data from S334-1A
+    packets
+-   rtspsrc: Fix handling of * control path
+-   splitmux: timestamp handling improvements
+-   v4l2videodec: Rework dynamic resolution change handling (needed for
+    IMX6 mainline codec)
+-   videoflip: fix regression with automatically rotating video based on
+    tags
+-   d3d11: many d3d11videosink and d3d11compositor fixes
+-   webrtc, rtp: numerous data race fixes and stability fixes
+-   various bug fixes, memory leak fixes, and other stability and
+    reliability improvements
+
+gstreamer
+
+-   tracing: Initialize tracing infrastructure even if the debug system
+    is not compiled in
+-   parse-launch: fix missing unref of looked-up child element
+-   gstutils: Add category and object to most logging messages
+
+gst-plugins-base
+
+-   allocators: Fix fdmem unit test with recent GLib versions
+-   audiotestsrc: Initialize all samples in wave=ticks mode
+-   decodebin3: Handle input streams without CAPS or TIME segment such
+    as e.g. udpsrc or pushfilesrc
+-   decodebin3: fix regression handling streams without caps
+-   decodebin3: fix random hang when remove failing stream
+-   uridecodebin3: Ensure atomic urisourcebin state change
+-   glvideoflip: fix leaked caps
+-   glcontext_wgl: fix missing unref
+-   playsink: Fix volume leak
+
+gst-plugins-good
+
+-   adaptivedemux2: fix critical when using an unsupported URI
+-   dashdemux2: mpdclient: fix divide by 0 if segment has no duration
+-   imagesequencesrc: Properly set default location
+-   multifile: error out if no filename was set
+-   osxvideosink: fix deadlock upon closing output window
+-   rtpmanager: rtpsession: data race leading to critical warnings
+-   rtpmanager: rtpsession: race conditions leading to critical warnings
+-   rtspsrc: Fix handling of * control path
+-   splitmuxsink: Catch invalid DTS to avoid running into problems later
+-   splitmuxsrc: Make PTS contiguous by preference
+-   qtdemux: emit no-more-pads after pruning old pads
+-   Revert “qtdemux: fix conditions for end of segment in reverse
+    playback” to fix edit list regression
+-   qtdemux: Fix av1C parsing
+-   qtmux: Fix extraction of CEA608 data from S334-1A packets
+-   qtwindow: unref caps in destructor
+-   v4l2: device provider: Fix GMainLoop leak
+-   v4l2: videodec: Rework dynamic resolution change handling
+-   v4l2: videodec: Prefer acquired caps over anything downstream
+-   videoflip: fix setting of method property at construction time
+-   videoflip 1.22.2 not rotating video when extracting frames
+
+gst-plugins-bad
+
+-   a2dpsink: Fails many tests in Bluetooth SIG Certification
+-   avdtputil: Use int instead of int range for fixed bitpool values
+-   ccconverter: reintroduce frame count reset on cycle completion
+-   ccconverter: integer overflow & crashing
+-   codectimestamper: remove PC file generation from plugin’s own
+    meson.build
+-   cudamemory: Fix for semi planar YUV memory size decision
+-   d3d11compositor: Reconfigure resource only when output caps is
+    changed
+-   d3d11compositor: Skip zero alpha input
+-   d3d11convert: Fix for runtime property update
+-   d3d11memory: Don’t clear wrapped texture memory
+-   d3d11videosink: Fix for ignored initial render rectangle
+-   d3d11videosink: fix race condition in window unprepare
+-   d3d11videosink: Enhancement for initial window size decision
+-   d3d11videosink: Don’t clear prepared buffer on unlock_stop()
+-   dashdemux: mpdclient: fix divide by 0 if segment has no duration
+-   dtlstransport: Keep strong ref of dtls encoder/decoder
+-   GstPlay: avoid getting property of playbin2 if subtitle_sid is null
+-   GstPlay: fix critical log when using playbin3
+-   h264decoder: Drop nonexisting picture silently without error
+-   dtmf: element classification improvements
+-   mfvideoenc: Allow only even resolution numbers
+-   sctpenc: Fix potential shutdown deadlock
+-   srtpdec: fix “srtp-key” check
+-   tests: disable dtls test if openssl is not present
+-   tsdemux: Set number of channels to 2 for dual mono Opus
+-   va: Various fixes for defects found with MSVC
+-   wasapi2: Allows process loopback capture on Windows 10
+-   webrtcdatachannel: Bind to parent webrtcbin using a weak reference
+-   webrtcbin: Fix potential deadlock when closing before any data was
+    sent
+-   webrtc: Plug leaks of resolved ICE addresses
+-   webrtc: do not tear down data channel before data is flushed
+
+gst-plugins-ugly
+
+-   mpegpsdemux: Rework gap sending
+
+gst-libav
+
+-   avviddec: Temporarily unlock stream lock while flushing buffers
+-   Random freeze and deadlock in ffmpegviddec flush and get_buffer
+    while seeking
+
+gst-rtsp-server
+
+-   No changes
+
+gstreamer-vaapi
+
+-   No changes
+
+gstreamer-sharp
+
+-   No changes
+
+gst-omx
+
+-   No changes
+
+gst-python
+
+-   No changes
+
+gst-editing-services
+
+-   ges: base-xml-formatter: Don’t pass non-GObject pointers to
+    GST_DEBUG_OBJECT
+
+gst-validate + gst-integration-testsuites
+
+-   No changes
+
+gst-examples
+
+-   No changes
+
+Development build environment
+
+-   No changes
+
+Cerbero build tool and packaging changes in 1.22.3
+
+-   glib: Ship Windows process spawning helpers
+-   recipes: add recipe for libltc for timecodestamper element
+-   Add support for RHEL9 and Rocky Linux
+
+Contributors to 1.22.3
+
+Aleksandr Slobodeniuk, Antonio Kevo, Arun Raghavan, Carlos Rafael Giani,
+Daniel Moberg, Edward Hervey, Elliot Chen, François Laignel, Guillaume
+Desmottes, Haihua Hu, Jan Alexander Steffens (heftig), Jan Beich, Jan
+Schmidt, Johan Sternerup, John King, Jordan Petridis, Juan Navarro, Lily
+Foster, Martin Nordholts, Mathieu Duponchelle, Matthew Waters, Matthias
+Fuchs, Michael Olbrich, Mihail Ivanchev, Nick Steel, Nicolas Dufresne,
+Nirbheek Chauhan, Patricia Muscalu, Philippe Normand, Piotr Brzeziński,
+Sanchayan Maity, Sebastian Dröge, Seungha Yang, Stéphane Cerveau,
+Thibault Saunier, Tim-Philipp Müller, Xabier Rodriguez Calvar,
+
+… and many others who have contributed bug reports, translations, sent
+suggestions or helped testing. Thank you all!
+
+List of merge requests and issues fixed in 1.22.3
+
+-   List of Merge Requests applied in 1.22.3
+-   List of Issues fixed in 1.22.3
+
+1.22.4
+
+The fourth 1.22 bug-fix release (1.22.4) was released on 20 June 2023.
+
+This release only contains bugfixes and security fixes and it should be
+safe to update from 1.22.x.
+
+Highlighted bugfixes in 1.22.4
+
+-   Security fixes for flacparse, dvdspu, and subparse
+-   d3d11videosink: Fix error on pause and play
+-   decklink: Correctly handle SDK strings on macOS and free strings
+    after usage on Linux
+-   filesink: Fix buffered mode writing of buffer lists and buffers with
+    multiple memories
+-   gldownload: handle passthrough without a critical
+-   h265parse: Fix framerate handling regression
+-   oggdemux: vp8 fixes
+-   mp4mux, qtmux, qtdemux: Opus audio mapping fixes
+-   pngdec: Fix wrong colours output from 16bit RGB images
+-   ptp clock: Work around ptpd bug in default configuration
+-   srtpdec: fix critical warnings on shutdown
+-   v4l2src: fix support for bayer format
+-   v4l2videoenc: support force-keyframe event in v4l2 encoder
+-   vtenc: apply DTS offset to ensure DTS <= PTS
+-   gst-python: allow more functions to be called before gst_init()
+-   cerbero: fix vaapi variant; add qt6 build on windows; ensure errors
+    on unguarded use of new APIs, require macOS 10.13
+-   packages: ship codecalpha, rtponvif, dvbsubenc, switchbin,
+    videosignal plugins; fix pango crash on 32-bit windows
+-   various bug fixes, memory leak fixes, and other stability and
+    reliability improvements
+
+gstreamer
+
+-   filesink: Fix buffered mode writing of buffer lists and buffers with
+    multiple memories
+-   basesink: Clear EOS flag on STREAM-START event
+-   typefindhelper: downgrade bogus error level debug log message
+-   ptp: Correctly parse clock ID from the commandline parameters in the
+    helper
+-   ptp: Work around bug in ptpd in default configuration
+
+gst-plugins-base
+
+-   alsasink: Fix stall for transition from PAUSED to READY with USB
+    speakerphone.
+-   appsink: unref buffer in prev sample early so buffers from v4l2 can
+    be released properly
+-   basetextoverlay: Fix typo in “text-y” property description
+-   gldownload: handle passthrough without a critical
+-   glfilter: add parent meta to output buffer for input buffer
+-   oggdemux: vp8: Push headers downstream and detect keyframe packets
+-   opus: Fix potential crash when getting unexpected channel position
+-   streamsynchronizer: reset eos on STREAM_START
+-   subparse: Look for the closing > of a tag after the opening <
+-   video: convertframe: Add D3D11 specific conversion path
+-   videometa: Only validate the alignment only when it contains some
+    info
+-   video-blend: Fix linking error with C++
+
+gst-plugins-good
+
+-   flacparse: Avoid integer overflow in available data check for image
+    tags
+-   flvmux: use the correct timestamp to calculate wait times
+-   isomp4: Fix (E)AC-3 channel count handling
+-   jpegdec: fixes related to interlaced jpeg
+-   pngdec: Fix wrong colours output from 16bit RGB images
+-   qtmux, qtdemux: fix byte order for opus extension
+-   rtspsrc: Do not try send dropped get/set parameter
+-   qt5, qt6: Add more meson options and eliminate all automagic
+-   qt: glrenderer: don’t attempt to use QWindow from non-Qt main thread
+-   qml6glsink: Support building on win32
+-   v4l2src: fix support for bayer format
+-   v4l2: Change to query only up to
+    V4L2_CID_PRIVATE_BASE+V4L2_CID_MAX_CTRLS
+-   v4l2videodec: treat MPEG-1 format as MPEG-2
+-   v4l2videoenc: support force keyframe event in v4l2 encoder
+-   tests: rtpbin_buffer_list: fix possible unaligned write/read on
+    32-bit ARM
+
+gst-plugins-bad
+
+-   asfmux: fix possible unaligned write on 32-bit ARM
+-   d3d11videosink: Fix error on pause and play
+-   d3dvideosink: Fix navigation event leak
+-   decklink: Correctly handle SDK strings on macOS and free strings
+    after usage on Linux
+-   dvdspu: Make sure enough data is allocated for the available data
+-   fdkaacdec: Support up to 5 rear channels
+-   h265parse: Fix framerate handling
+-   kmssink: Add STM32 LTDC and NXP i.MX8M Plus LCDIFv3 auto-detection
+-   sdpdemux: ensure that only one srcpad is created per stream
+-   srtpdec: fix critical warnings on shutdown
+-   testsrcbin: Remove spurious caps unref
+-   va: map the mbbrc to correct enum value in get_property()
+-   vtenc: apply DTS offset to ensure DTS <= PTS
+-   vtdec: time glitches on h264 playback
+-   waylandsink: Emit “map” signal boarder surface is ready
+
+gst-plugins-ugly
+
+-   No changes
+
+gst-libav
+
+-   No changes
+
+gst-rtsp-server
+
+-   No changes
+
+gstreamer-vaapi
+
+-   vaapidecodebin: don’t load vaapipostproc if not available
+
+gstreamer-sharp
+
+-   No changes
+
+gst-omx
+
+-   No changes
+
+gst-python
+
+-   python: More functions can be called before gst_init()
+
+gst-editing-services
+
+-   ges: launcher: Never put sinks in a GstPipeline
+
+gst-validate + gst-integration-testsuites
+
+-   No changes
+
+gst-examples
+
+-   No changes
+
+Development build environment
+
+-   No changes
+
+Cerbero build tool and packaging changes in 1.22.4
+
+-   Ship codecalpha, rtponvif, dvbsubenc, switchbin, videosignal plugins
+-   pango: Fix crash on Windows 32bit build
+-   qml6: Add support for building the qml6 plugin on Windows and bump
+    meson to 1.1.1
+-   vaapi: update vaapi variant/recipe for meson option changes
+-   packages: Put libass in the same category as assrender
+-   cerbero: Don’t extract if already extracted in fetch
+-   darwin: Ensure errors on unguarded use of new APIs, require macOS
+    10.13
+
+Contributors to 1.22.4
+
+Andoni Morales Alastruey, Arun Raghavan, Colin Kinloch, Daniel Morin,
+Edward Hervey, ekwange, Elliot Chen, François Laignel, Guillaume
+Desmottes, Haihua Hu, He Junyan, Hou Qi, Jan Alexander Steffens
+(heftig), Jochen Henneberg, Jordan Petridis, Kevin Song, Maksym
+Khomenko, Marek Vasut, Mathieu Duponchelle, Matthew Waters,
+Mengkejiergeli Ba, Michael Olbrich, Nicolas Beland, Nicolas Dufresne,
+Nirbheek Chauhan, Philippe Normand, Piotr Brzeziński, Sebastian Dröge,
+Seungha Yang, Thibault Saunier, Tim-Philipp Müller, Víctor Manuel Jáquez
+Leal, William Manley, Xavier Claessens, Yuri Fedoseev,
+
+… and many others who have contributed bug reports, translations, sent
+suggestions or helped testing. Thank you all!
+
+List of merge requests and issues fixed in 1.22.4
+
+-   List of Merge Requests applied in 1.22.4
+-   List of Issues fixed in 1.22.4
+
+1.22.5
+
+The fifth 1.22 bug-fix release (1.22.5) was released on 20 July 2023.
+
+This release only contains bugfixes and security fixes and it should be
+safe to update from 1.22.x.
+
+Highlighted bugfixes in 1.22.5
+
+-   Security fixes for the RealMedia demuxer
+-   vaapi decoders, postproc: Disable DMAbuf from caps negotiation to
+    fix garbled video in some cases
+-   decodebin3, playbin3, parsebin fixes, especially for stream
+    reconfiguration
+-   hlsdemux2: fix early seeking; don’t pass referer when updating
+    playlists; webvtt fixes
+-   gtk: Fix critical caused by pointer movement when stream is getting
+    ready
+-   qt6: Set sampler filtering method, fixes bad quality with qml6glsink
+    and gstqt6d3d11
+-   v4l2src: handle resolution change when buffers are copied
+-   videoflip: update orientation tag in auto mode
+-   video timecode: Add support for framerates lower than 1fps and
+    accept 119.88 (120/1.001) fps
+-   webrtcsink: fixes for x264enc and NVIDIA encoders
+-   cerbero: Pull ninja from system if possible, avoid spurious
+    bootstrap of cmake
+-   packages: Recipe updates for ffmpeg, libsoup, orc
+-   various bug fixes, memory leak fixes, and other stability and
+    reliability improvements
+
+gstreamer
+
+-   taglist, plugins: fix compiler warnings with GLib >= 2.76
+-   tracerutils: allow casting parameter types
+-   inputselector: fix playing variable is never set
+
+gst-plugins-base
+
+-   appsink: add missing make_writable call
+-   audioaggregator: Do not post message before being constructed
+-   decodebin3: Prevent a critical warning when reassigning output slots
+-   decodebin3: Fix slot input linking when the associated stream has
+    changed
+-   decodebin3: Remove spurious input locking during parsebin
+    reconfiguration
+-   urisourcebin: Set source element to READY before querying it
+-   gl/viv-fb: meson build updates
+-   plugins: fix compiler warnings with GLib >= 2.76
+-   subtitleoverlay: fix mutex error if sink caps is not video
+-   video: timecode: Add support for framerates lower than 1fps
+-   video: accept timecode of 119.88 (120/1.001) FPS
+-   video: cannot attach time code meta when frame rate is 119.88
+    (120000/1001)
+-   videodecoder: fix copying buffer metas
+
+gst-plugins-good
+
+-   adaptivedemux2: Fix early seeking
+-   hlsdemux2: Ensure processed webvtt ends with empty new line
+-   hlsdemux2: Don’t set a referer when updating playlists
+-   matroska: demux: Strip signal byte when encrypted
+-   rtspsrc: Fix crash when is-live=false
+-   gtk: Fix critical caused by pointer movement when stream is getting
+    ready
+-   qt6: Set sampler filtering method, fixes bad quality with qml6glsink
+    and gstqt6d3d11
+-   qtdemux: opus: set entry as sampled
+-   v4l2src: handle resolution change when buffers are copied
+-   v4l2videodec: Fix handling of initial gaps
+-   v4l2videodec: correctly register v4l2mpeg2dec
+-   v4l2videoenc: replace custom QUERY_CAPS handling with getcaps
+    callback
+-   videoflip: update orientation tag in auto mode
+-   videoflip: fix critical when tag list is not writable
+
+gst-plugins-bad
+
+-   d3d11bufferpool: Fix heavy CPU usage in case of fixed-size pool
+-   jpegparser: jpegdecoder: Don’t pollute bus and comply with spec
+-   plugins: fix compiler warnings with GLib >= 2.76
+-   webrtcbin: Prevent critical warning when creating an additional data
+    channel
+-   webrtcstats: Properly report IceCandidate type
+
+gst-plugins-ugly
+
+-   rmdemux: add some integer overflow checks
+
+gst-plugins-rs
+
+-   fallbackswitch: Change the threshold for trailing buffers
+-   fallbackswitch: Fix pad health calculation and notifies
+-   fmp4mux: Fix draining in chunk mode if keyframes are too late
+-   livesync: Wait for the end timestamp of the previous buffer before
+    looking at queue
+-   livesync: Improve EOS handling
+-   togglerecord: Clip segment before calculating timestamp/duration
+-   togglerecord: Error out if main stream buffer has no valid running
+    time
+-   webrtcsink: fix pipeline when input caps contain max-framerate
+-   webrtcsink: Configure only 4 threads for x264enc
+-   webrtcsink: Translate force-keyunit events to force-IDR action
+    signal for NVIDIA encoders
+-   webrtcsink: Set config-interval=-1 and aggregate-mode=zero-latency
+    on rtph264pay and rtph265pay
+-   webrtcsink: Set VP8/VP9 payloader based on payloader element factory
+    name
+-   webrtcink: Use correct property types for nvvideoconvert
+-   webrtc/signalling: fix race condition in message ordering
+-   videofx: Minimize dependencies of the image crate
+
+gst-libav
+
+-   No changes
+
+gst-rtsp-server
+
+-   No changes
+
+gstreamer-vaapi
+
+-   vaapidecode,vaapipostproc: Disable DMAbuf from caps negotiation.
+
+gstreamer-sharp
+
+-   No changes
+
+gst-omx
+
+-   No changes
+
+gst-python
+
+-   No changes
+
+gst-editing-services
+
+-   ges: some fixes for 32-bit systems
+-   ges, nle: Avoid setting state or sending query when constructing
+    objects
+
+gst-validate + gst-integration-testsuites
+
+-   No changes
+
+gst-examples
+
+-   No changes
+
+Development build environment
+
+-   No changes
+
+Cerbero build tool and packaging changes in 1.22.5
+
+-   Pull ninja from system if possible, avoid spurious bootstrap of
+    cmake
+-   ffmpeg: update to 5.0.3
+-   libsoup: update to 2.74.3
+-   orc: update to 0.4.34
+
+Contributors to 1.22.5
+
+Andoni Morales Alastruey, Bastien Nocera, Carlos Rafael Giani, David
+Craven, Doug Nazar, Edward Hervey, François Laignel, Guillaume
+Desmottes, He Junyan, Hou Qi, Jan Alexander Steffens (heftig), Jan
+Schmidt, Maksym Khomenko, Mathieu Duponchelle, Matthew Waters, Michael
+Olbrich, Michael Tretter, Nicolas Dufresne, Nirbheek Chauhan, Philippe
+Normand, Ruslan Khamidullin, Sebastian Dröge, Seungha Yang, Théo
+Maillart, Thibault Saunier, Tim-Philipp Müller, Víctor Manuel Jáquez
+Leal, Vivia Nikolaidou, Yatin Maan,
+
+… and many others who have contributed bug reports, translations, sent
+suggestions or helped testing. Thank you all!
+
+List of merge requests and issues fixed in 1.22.5
+
+-   List of Merge Requests applied in 1.22.5
+-   List of Issues fixed in 1.22.5
+
+1.22.6
+
+The sixth 1.22 bug-fix release (1.22.6) was released on 20 September
+2023.
+
+This release only contains bugfixes and security fixes and it should be
+safe to update from 1.22.x.
+
+Highlighted bugfixes in 1.22.6
+
+-   Security fixes for the MXF demuxer and H.265 video parser
+-   Fix latency regression in H.264 hardware decoder base class
+-   androidmedia: fix HEVC codec profile registration and fix coded_data
+    handling
+-   decodebin3: fix switching from a raw stream to an encoded stream
+-   gst-inspect: prettier and more correct signal and action signals
+    printing
+-   rtmp2: Allow NULL flash version, omitting the field, for better RTMP
+    server compatibility
+-   rtspsrc: better compatibility with buggy RTSP servers that don’t set
+    a clock-rate
+-   rtpjitterbuffer: fix integer overflow that led to more packets being
+    declared lost than have been lost
+-   v4l2: fix video encoding regression on RPi and fix support for left
+    and top padding
+-   waylandsink: Crop surfaces to their display width height
+-   cerbero: recognise Manjaro; add Rust support for MSVC ARM64; cmake
+    detection fixes
+-   various bug fixes, build fixes, memory leak fixes, and other
+    stability and reliability improvements
+
+gstreamer
+
+-   gst-inspect: prettier and more correct signal printing, and print
+    action signals in g_signal_emit_by_name() format
+-   gst-launch: Disable fault signal handlers on macOS
+
+gst-plugins-base
+
+-   audio: Make sure to stop ringbuffer on error
+-   decodebin3: avoid identity, sinkpad, parsebin leakage when reset
+    input
+-   decodebin3: Ensure the slot is unlinked before linking to decoder
+-   sdp: fix wrong debug log error message for missing clock-rate in
+    caps
+-   sdp: Parse zero clock-rate as default
+
+gst-plugins-good
+
+-   adaptivedemux2: fix memory leak
+-   pulsedeviceprovider: fix incorrect usage of GST_ELEMENT_ERROR
+-   qt: Unbreak build with qt-egl enabled but viv_fb missing
+-   qt: Fix searching of qt5/qt6 tools with qmake in Meson
+-   qtdemux: Fix premature EOS when some files are played in push mode
+-   qtdemux: attach cbcs crypt info at the right moment
+-   rtpjitterbuffer: Avoid integer overflow in max saveable packets
+    calculation with negative offset
+-   videoflip: fix concurrent access when modifying the tag list
+-   v4l2: allocator: Don’t close foreign dmabuf
+-   v4l2: bufferpool: Fix large encoded stream regression
+-   v4l2: bufferpool: Problems when checking for truncated buffer
+-   v4l2: Fix support for left and top padding
+-   v4l2object: clear format lists if source change event is received
+
+gst-plugins-bad
+
+-   androidmedia/enc: handle codec-data before popping
+    GstVideoCodecFrames
+-   androidmedia: fix hevc codec profile registration
+-   androidmedia: Small fixes
+-   androidmedia: Add more null checks (of env) to JNI utilities
+-   applemedia: Fix pixel format for I420 and NV12
+-   audiolatency: Forward latency query and event upstream
+-   av1parser: Fix segmentation params update
+-   codecparsers: Fix MPEG-1 aspect ratio table
+-   d3d11convert: Passthrough allocation query on same caps
+-   h264decoder: Update latency dynamically
+-   h265parser: Allow partially broken hvcC data
+-   h265parser: Fix possible overflow using max_sub_layers_minus1
+-   hlssink2: Always use forward slash separator
+-   mdns: Fix a crash on context error
+-   mxfdemux: Fix integer overflow causing out of bounds writes when
+    handling invalid uncompressed video and check channels for AES3
+-   nvencoder: Fix negotiation error when interlace-mode is unspecified
+-   rtmp2: Allow NULL flash version, omitting the field
+-   rtmp2sink: fix crash if message conversion failed
+-   transcodebin: Fixes for upstream selectable support
+-   va: Fix in error logs functions mismatches
+-   waylandsink: Crop surfaces to their display width height
+-   waylandsink: Fix cropping for video with non-square aspect ratio
+-   webrtc: Fix docs for create-data-channel action signal
+-   win32ipc: Fix pipe handle leak
+
+gst-plugins-ugly
+
+-   No changes
+
+gst-plugins-rs
+
+-   fallbackswitch: locking/deadlock fixes
+-   onvifmetadataparse: Skip metadata frames with unrepresentable UTC
+    time
+-   transcriberbin: Configure audioresample in front of transcriber
+-   webrtcsink: Propagate GstContext messages
+-   webrtcsink: Add support for d3d11 memory and qsvh264enc
+-   webrtcsink: fix TWCC extension adding
+-   webrtcsink: don’t forget to setup encoders for discoveries
+-   webrtcsink: NVIDIA V4L2 encoders always require NVMM memory
+-   meson: Fix handling of optional deps, and don’t require Python 3.8
+
+gst-libav
+
+-   No changes
+
+gst-rtsp-server
+
+-   No changes
+
+gstreamer-vaapi
+
+-   No changes
+
+gstreamer-sharp
+
+-   No changes
+
+gst-omx
+
+-   No changes
+
+gst-python
+
+-   No changes
+
+gst-editing-services
+
+-   No changes
+
+gst-validate + gst-integration-testsuites
+
+-   gst-validate: Disable fault signal handlers on macOS
+
+gst-examples
+
+-   No changes
+
+Development build environment
+
+-   macos-bison: Update to 3.8.2 and add an ARM64 build
+-   wrap: update libpsl to 0.21.2
+
+Cerbero build tool and packaging changes in 1.22.6
+
+-   Add Rust support for MSVC ARM64
+-   Recognise PERL5LIB as a joinable Unix variable
+-   Recognise Manjaro as an Arch derivative
+-   Fix picking up cmake from build-tools
+
+Contributors to 1.22.6
+
+Akihiro Sagawa, Alicia Boya García, Guillaume Desmottes, Haihua Hu,
+Hugues Fruchet, Ivan Molodetskikh, Jan Alexander Steffens (heftig), Jan
+Schmidt, L. E. Segovia, Mathieu Duponchelle, Matthew Waters, Ming Qian,
+Nicolas Dufresne, Nirbheek Chauhan, Olivier Blin, Olivier Crête,
+Philippe Normand, Piotr Brzeziński, Robert Ayrapetyan, Ryan Pavlik,
+Sebastian Dröge, Seungha Yang, Stéphane Cerveau, Stephan Seitz, Thomas
+Schneider, Tim-Philipp Müller, Víctor Manuel Jáquez Leal, Wang Chuan,
+Xabier Rodriguez Calvar,
+
+… and many others who have contributed bug reports, translations, sent
+suggestions or helped testing. Thank you all!
+
+List of merge requests and issues fixed in 1.22.6
+
+-   List of Merge Requests applied in 1.22.6
+-   List of Issues fixed in 1.22.6
+
+1.22.7
+
+The seventh 1.22 bug-fix release (1.22.7) was released on 13 November
+2023.
+
+This release only contains bugfixes and security fixes and it should be
+safe to update from 1.22.x.
+
+Highlighted bugfixes in 1.22.7
+
+-   Security fixes for the MXF demuxer and AV1 codec parser
+-   glfilter: Memory leak fix for OpenGL filter elements
+-   d3d11videosink: Fix toggling between fullscreen and maximized, and
+    window switching in fullscreen mode
+-   DASH / HLS adaptive streaming fixes
+-   Decklink card device provider device name string handling fixes
+-   interaudiosrc: handle non-interleaved audio properly
+-   openh264: Fail gracefully if openh264 encoder/decoder creation fails
+-   rtspsrc: improved whitespace handling in response headers by certain
+    cameras
+-   v4l2codecs: avoid wrap-around after 1000000 frames; tiled formats
+    handling fixes
+-   video-scaler, audio-resampler: downgraded “Can’t find exact taps”
+    debug log messages
+-   wasapi2: Don’t use global volume control object
+-   Rust plugins: various improvements in aws, fmp4mux, hlssink3,
+    livesync, ndisrc, rtpav1depay, rsfilesink, s3sink, sccparse
+-   WebRTC: various webrtchttp, webrtcsrc, and webrtcsink improvements
+    and fixes
+-   Cerbero build tools: recognise Windows 11; restrict parallelism of
+    gst-plugins-rs build on small systems
+-   Packages: ca-certificates update; fix gio module loading and TLS
+    support on macOS
+
+gstreamer
+
+-   debugutils: provide gst_debug_bin_to_dot_data() implementation even
+    if debug system is disabled
+
+gst-plugins-base
+
+-   audioaggregator, audiomixer: Make access to the pad list thread-safe
+    while mixing
+-   basetextoverlay: Fix overlay never rendering again if width reaches
+    1px
+-   glfiter: Protect GstGLContext access
+-   glfilter: Only add parent meta if inbuf != outbuf
+-   macOS: fix huge memory leak with glfilter-based elements
+-   rtspconnection: Ignore trailing whitespace in rtsp headers
+-   video-scaler, audio-resampler: downgrade ‘can’t find exact taps’ to
+    debug
+
+gst-plugins-good
+
+-   adaptivedemux2: Do not submit_transfer when cancelled
+-   adaptivedemux2: Call GTasks’s return functions for blocking tasks
+-   flacenc: Correctly handle up to 255 cue entries
+-   flvmux: set the src segment position as running time
+-   imagesequencesrc: fix deadlock when feeding the same image in a loop
+-   pngenc: output one frame only in snapshot mode and mark output
+    frames as I-frames
+-   qmlglsrc: sync on the streaming thread
+-   souphttpsrc: Chain up to finalize to fix memory leak
+-   wavparse: fix buffer leak with adtl tag
+-   v4l2codecs: Avoid QBUF/DQBUF struct timeval .tv_usec wrap-around at
+    frame 1000000
+-   v4l2codecs: Fix tiled formats stride conversion
+
+gst-plugins-bad
+
+-   audiobuffersplit: disable max-silence-time if set to 0
+-   libde265: Do not decode the non 4:2:0 8 bits format
+-   codecparsers: av1: Clip max tile rows and cols values
+-   codecs: h265: Do not free slice header before using it
+-   d3d11converter: Fix 10/12bits planar output
+-   d3d11decoder: Fix crash on negotiate() when decoder is not
+    configured
+-   d3d11videosink: Fix toggling between fullscreen and maximized
+-   d3d11videosink: Fix window switching in case of fullscreen mode
+-   d3d11screencapturesrc: Fix mouse cursor blending
+-   decklink: Fix broken COM string conversion
+-   decklink: Decklink Device Provider wrongly parses SDK strings
+-   gstwayland: Don’t depend on wayland-protocols
+-   interaudiosrc: Add audio meta to buffers containing non-interleaved
+    samples
+-   kmssink: Add TIDSS auto-detection
+-   mfvideoencoder: Fix typo in template caps
+-   mxfdemux: Store GstMXFDemuxEssenceTrack in their own fixed
+    allocation
+-   nvcodec: fix bounds for auto-select GPU enumeration
+-   openh264: Fail gracefully if openh264 encoder/decoder creation fails
+-   tsmux: More cleanups
+-   tsmux: Fill padding packets with stuffing bytes
+-   v4l2codecs: Fix tiled formats stride conversion
+-   v4l2videodec: Correctly free caps to avoid memory leak
+-   wasapi2: Don’t use global volume control object
+-   wasapi2device: Ignore activation failed device
+
+gst-plugins-ugly
+
+-   No changes
+
+gst-plugins-rs
+
+-   aws: s3sink: Fix handling of special characters in key
+-   aws: s3: Properly percent-decode GstS3Url
+-   fmp4mux: Don’t overflow negative composition offset calculation
+-   fmp4mux: specify the fragment duration unit
+-   hlssink3: Use Path API for getting file name
+-   hlssink3: Use sprintf for segment name formatting
+-   hlssink3: Remove unused deps
+-   hlssink3: Don’t remove old files if max-files is zero
+-   hlssink3: Don’t remove uri from playlist if playlist-length is zero
+-   hlssink3: Various cleanup
+-   livesync: log new pending segments
+-   livesync: display jitter when waiting on clock
+-   livesync: Rename activatemode methods to *_activatemode
+-   livesync: Simplify start_src_task and src_loop
+-   livesync: Improve audio duration fixups
+-   livesync: Log a category error when we are missing the segment
+-   livesync: Clean up state handling
+-   livesync: Replace an if-let with match
+-   livesync: Move a notify closer to the interesting state change
+-   livesync: Move num_in counting to the src task
+-   livesync: Simplify num_duplicate counting
+-   livesync: Handle flags and late buffer patching after queueing
+-   livesync: Separate out_buffer duplicate status from GAP flag
+-   livesync: Use fallback_duration for audio repeat buffers as well
+-   livesync: example: Add identities single-segment=1
+-   livesync: Split fallback_duration into in_ and out_duration
+-   livesync: Keep existing buffer duration in some cases
+-   livesync: Remove the stop from outgoing segments
+-   ndisrc: Assume input with more than 8 raw audio channels is
+    unpositioned
+-   rtpav1depay: Skip unexpected leading fragments
+-   rtpav1depay: Don’t push stale temporal delimiters downstream
+-   rsfilesink: set sync=false
+-   s3sink: set sync=false
+-   sccparse: Fix leading spaces between the tab and caption data
+-   webrtchttp: Respect HTTP redirects
+-   webrtcsrc: use @watch instead of @to-owned
+-   webrtcsrc: add turn-servers property
+-   webrtc: Fix paths in README
+-   webrtcsink: don’t miss ice candidates
+
+gst-libav
+
+-   No changes
+
+gst-rtsp-server
+
+-   rtspclientsink: Don’t leak previous server_ip
+
+gstreamer-vaapi
+
+-   No changes
+
+gstreamer-sharp
+
+-   No changes
+
+gst-omx
+
+-   No changes
+
+gst-python
+
+-   No changes
+
+gst-editing-services
+
+-   No changes
+
+gst-validate + gst-integration-testsuites
+
+-   gst-validate: Fix compatibility with Python 3.12
+
+gst-examples
+
+-   No changes
+
+Development build environment
+
+-   No changes
+
+Cerbero build tool and packaging changes in 1.22.7
+
+-   Add Windows 11 to the supported versions list
+-   ca-certificates: Update to version from 2023-08-22
+-   cargo: Restrict parallelism if a small system is detected (for
+    gst-plugins-rs build)
+-   Fix venv setup on Python 3.11+
+-   Fix unlinking of Android NDK directories if install fails midway
+-   glib: Work around AppleClang + -Werror test build failure
+-   glib: Re-add gio module loading patch for macOS, remove unused patch
+    files
+
+Contributors to 1.22.7
+
+Albert Sjölund, Arun Raghavan, Balló György, Benjamin Gaignard, Detlev
+Casanova, Doug Nazar, Eric, Florian Zwoch, François Laignel, Guillaume
+Desmottes, He Junyan, Hou Qi, James Oliver, Jan Alexander Steffens
+(heftig), Jan Schmidt, Johan Adam Nilsson, Jordan Yelloz, Kalev Lember,
+L. E. Segovia, Lieven Paulissen, Maksym Khomenko, Marek Vasut, Matthias
+Fuchs, Michiel Westerbeek, Nicolas Dufresne, Philippe Normand, Piotr
+Brzeziński, Rahul T R, Sean DuBois, Sebastian Dröge, Seungha Yang,
+Stéphane Cerveau, Thibault Saunier, Tim-Philipp Müller,
+
+… and many others who have contributed bug reports, translations, sent
+suggestions or helped testing. Thank you all!
+
+List of merge requests and issues fixed in 1.22.7
+
+-   List of Merge Requests applied in 1.22.7
+-   List of Issues fixed in 1.22.7
+
+1.22.8
+
+The eight 1.22 bug-fix release (1.22.8) was released on 18 December
+2023.
+
+This release only contains bugfixes and security fixes and it should be
+safe to update from 1.22.x.
+
+Highlighted bugfixes in 1.22.8
+
+-   Security fixes for the AV1 video codec parser
+-   avdec video decoder: fix another possible deadlock with FFmpeg 6.1
+-   qtdemux: reverse playback and seeking fixes for files with raw audio
+    streams
+-   v4l2: fix “newly allocated buffer … is not free” warning log flood
+-   GstPlay + GstPlayer library fixes
+-   dtls: Fix build failure on Windows when compiling against OpenSSL
+    3.2.0
+-   d3d11screencapturesrc: Fix wrong color with HDR enabled
+-   Cerbero build tool: More python 3.12 string escape warning fixes;
+    make sure to bundle build tools as well
+-   various bug fixes, build fixes, memory leak fixes, and other
+    stability and reliability improvements
+
+gstreamer
+
+-   buffer: Unref memories before metas
+-   pad: Recheck pads when linking after temporary unlock
+-   baseparse: Fixes to buffers extracted from adapter
+
+gst-plugins-base
+
+-   appsrc: Fix flow return when buffer is dropped
+-   audioringbuffer: Don’t try to map MONO channel
+-   encoding-target: Properly free when missing type field in
+    parse_encoding_profile
+-   pbutils: Don’t include default vp9 parameters in resulting codec
+    mime string
+-   videorate: Don’t forget last_ts on caps changes
+
+gst-plugins-good
+
+-   dcaparse: keep upstream buffer meta
+-   rtpklvdepay: Recover after invalid fragmented KLV unit
+-   matroska-demux: fix accumulated base offset in segment seeks
+-   qtdemux: fix bug report URL
+-   qtdemux: Don’t overflow sample index
+-   qtdemux: Fix reverse playback for pcm audio stream
+-   qtdemux: Ignore raw audio streams when adjusting seek
+-   qtdemux: Under-seeking to a key unit in certain (encoded by Adobe
+    products) ProRes movies (macOS x86_64 & arm64, Windows x86_64, …)
+-   rtpac3depay: should output audio/x-ac3 not audio/ac3
+-   rtp: Fix incorrect RTP channel order lookup by name
+-   v4l2bufferpool: add lock as atomic operation for seek
+
+gst-plugins-bad
+
+-   aesenc: Fix IV length addition to output buffer length
+-   av1parser: Fix array sizes in scalability structure
+-   camerabin: Fix source updates with user filters
+-   codecparsers: av1: Clip max tile rows and cols values
+-   dtlscertificate: Define WINSOCKAPI before including windows.h
+-   d3d11: fix building with address sanitizer
+-   d3d11screencapturesrc: Fix wrong color with HDR enabled
+-   h264decoder: Fix GstVideoCodecFrame leak
+-   ladspa: Make RDF parsing truly optional
+-   rtponviftimestamp: Fix drop-out-of-segment=false mode
+-   qsvdecoder: Fix stream format detection
+-   webrtcsdp: Remove fingerprint validation that doesn’t make sense
+-   GstPlay: Automatically flush the bus when disposing the signal
+    adapter
+-   GstPlayer: Without dispatcher emit signals directly instead of via
+    the default main context
+
+gst-plugins-ugly
+
+-   No changes
+
+gst-plugins-rs
+
+-   threadshare: Fix a deadlock in used-socket notification
+-   threadshare: Fix a typo while logging
+-   webrtcsink: don’t panic on failure to request pad from webrtcbin
+-   ndi: Remove wrong Clone impl on RecvInstance
+-   ndi: Don’t mark private type as public
+-   fallbacksrc: Fix timeout scheduling
+
+gst-libav
+
+-   avviddec: Unlock stream lock while waiting for decoded frame. Fixes
+    potential deadlock
+-   avviddec: Calculate latency only for fixed framerate
+
+gst-rtsp-server
+
+-   No changes
+
+gstreamer-vaapi
+
+-   No changes
+
+gstreamer-sharp
+
+-   No changes
+
+gst-omx
+
+-   No changes
+
+gst-python
+
+-   No changes
+
+gst-editing-services
+
+-   No changes
+
+gst-validate + gst-integration-testsuites
+
+-   No changes
+
+gst-examples
+
+-   No changes
+
+Development build environment
+
+-   No changes
+
+Cerbero build tool and packaging changes in 1.22.8
+
+-   cerbero: Fix some more python 3.12 string escape warnings
+-   cerbero: Fix bundle-source not including build-tools recipes, fix
+    CalledProcessError handling
+-   pango: Add Perl interpreter consistency check
+
+Contributors to 1.22.8
+
+Alessandro Bono, Alexander Slobodeniuk, Arun Raghavan, Benjamin
+Gaignard, Daniel Moberg, Dongyun Seo, Doug Nazar, Guillaume Desmottes,
+Hosang Lee, Jan Alexander Steffens (heftig), jeri.li, Jimmy Ohn, L. E.
+Segovia, Mathieu Duponchelle, Nicolas Dufresne, Nirbheek Chauhan,
+Olivier Crête, Philippe Normand, Piotr Brzeziński, Rabindra Harlalka,
+Robert Mader, Robin Gustavsson, Sebastian Dröge, Seungha Yang, Stefan
+Brüns, Tim-Philipp Müller, Xavier Claessens,
+
+… and many others who have contributed bug reports, translations, sent
+suggestions or helped testing. Thank you all!
+
+List of merge requests and issues fixed in 1.22.8
+
+-   List of Merge Requests applied in 1.22.8
+-   List of Issues fixed in 1.22.8
+
+1.22.9
+
+The ninth 1.22 bug-fix release (1.22.9) was released on 24 January 2024.
+
+This release only contains bugfixes and security fixes and it should be
+safe to update from 1.22.x.
+
+Highlighted bugfixes in 1.22.9
+
+-   More Security fixes for the AV1 video codec parser
+-   va: fixes for Mesa Gallium drivers in Mesa versions older than v23.2
+-   v4l2src: Consider framerate during caps selection
+-   v4l2codec: decoder fixes
+-   rtspsrc: multicast fixes
+-   camerabin viewfinder fixes
+-   various bug fixes, build fixes, memory leak fixes, and other
+    stability and reliability improvements
+
+gstreamer
+
+-   aggregator: fix use-after-free in queries processing
+-   multiqueue: Ignore queue fullness for most events
+
+gst-plugins-base
+
+-   audiobasesink: Don’t wait on gap events
+-   audioconvert: change gst_audio_convert_get_unit_size() log levels
+-   glcolorconvert: Correct transform_caps direction
+-   gloverlay: Apply updated overlay coordinates correctly
+-   videorate: keep pool if max_buffers is unlimited
+
+gst-plugins-good
+
+-   rtpsession: Only warn once if configured latency needs to be known
+    but isn’t yet
+-   rtphdrext-clientaudiolevel: Fix level value being written by the
+    extension
+-   rtspsrc: set multicast-iface on udpsinks and fix RTCP sink TTL
+-   v4l2object: clear old fds when initializing poll during opening v4l2
+    device
+-   v4l2src: Consider framerate during caps selection
+-   vpxdec: Use appropriate domain and code for decoding errors
+
+gst-plugins-bad
+
+-   av1parser: Fix potential stack overflow during tile list parsing
+-   camerabin: Correctly relink viewfinderbin_queue
+-   GstPlay: Fix error details parsing
+-   h264decoder: Handle malformed avc/avc3 packets
+-   h264decoder: h265decoder: Align with wraparound fix
+-   vp8decoder: vp9decoder: av1decoder: mpeg2decoder: Fix multiplication
+    wraparound
+-   vah264enc/vah264dec issues after recent upgrade to 1.22.8 from
+    1.22.7
+-   va: fixes for Mesa Gallium drivers in Mesa versions older than v23.2
+-   vp9parse: Fix critical warning during caps negotiation
+
+gst-plugins-ugly
+
+-   No changes
+
+gst-plugins-rs
+
+-   No changes
+
+gst-libav
+
+-   No changes
+
+gst-rtsp-server
+
+-   No changes
+
+gstreamer-vaapi
+
+-   No changes
+
+gstreamer-sharp
+
+-   No changes
+
+gst-omx
+
+-   No changes
+
+gst-python
+
+-   No changes
+
+gst-editing-services
+
+-   No changes
+
+gst-validate + gst-integration-testsuites
+
+-   No changes
+
+gst-examples
+
+-   No changes
+
+Development build environment
+
+-   No changes
+
+Cerbero build tool and packaging changes in 1.22.9
+
+-   No changes
+
+Contributors to 1.22.9
+
+Alexander Slobodeniuk, Chao Guo, Damian Hobson-Garcia, Dan Searles,
+Guillaume Desmottes, Jan Schmidt, Marek Vasut, Mengkejiergeli Ba,
+Michael Tretter, Philippe Normand, Robert Mader, Sanchayan Maity,
+Sebastian Dröge, Seungha Yang, Tim-Philipp Müller, Víctor Manuel Jáquez
+Leal, Xavier Claessens,
+
+… and many others who have contributed bug reports, translations, sent
+suggestions or helped testing. Thank you all!
+
+List of merge requests and issues fixed in 1.22.9
+
+-   List of Merge Requests applied in 1.22.9
+-   List of Issues fixed in 1.22.9
 
-Our next major feature release will be 1.24, and 1.23 will be the
-unstable development version leading up to the stable 1.24 release. The
-development of 1.23/1.24 will happen in the git main branch of the
-GStreamer mono repository.
+1.22.10
 
-The plan for the 1.24 development cycle is yet to be confirmed.
+The tenth 1.22 bug-fix release (1.22.10) was released on 13 February
+2024.
+
+This release only contains bugfixes and security fixes and it should be
+safe to update from 1.22.x.
+
+Highlighted bugfixes in 1.22.10
+
+-   gst-python: fix bindings overrides for Python >= 3.12
+-   glcolorconvert: fix wrong RGB to YUV matrix with bt709
+-   glvideoflip: fix “method” property setting at construction time
+-   gtk4paintablesink: Always draw a black background behind the video
+    frame, and other fixes
+-   pad: keep segment event seqnums the same when applying a pad offset
+-   basesink: Preroll on out of segment buffers when not dropping them
+-   Prefer FFmpeg musepack decoder/demuxer, fixing musepack playback in
+    decodebin3/playbin3
+-   livesync: add support for image formats such as JPEG or PNG
+-   sdpdemux: Add SDP message (aka session) attributes to the caps too
+-   textwrap: add support for gaps
+-   macos: Fix gst_macos_main() terminating whole process, and set
+    activation policy
+-   webrtcbin: Improve SDP intersection for Opus
+-   various bug fixes, build fixes, memory leak fixes, and other
+    stability and reliability improvements
+
+gstreamer
+
+-   pad: Copy over seqnum when creating a new segment event for applying
+    pad offset
+-   basesink: Preroll on out of segment buffers when not dropping them
+-   macos: Fix gst_macos_main() terminating whole process before
+    returning a value
+-   macos: Set activation policy in gst_macos_main()
+
+gst-plugins-base
+
+-   glcolorconvert: fix wrong RGB to YUV matrix with bt709
+-   glvideoflip: fix setting of method property at construction time
+-   glvideoflip: “method”` property is broken if set during element
+    construction
+-   macos: Set activation policy in glimagesink
+-   videoaggregator: fix bufferpool leak
+
+gst-plugins-good
+
+-   taglib: Set cpp_std to c++17 to fix compilation with TagLib >= 2.0
+-   macos: Set activation policy in osxvideosink
+
+gst-plugins-bad
+
+-   neon: Allow building against neon 0.33.x
+-   sdpdemux: Add SDP message (aka session) attributes to the caps too
+-   srtpenc: Fix potential leak
+-   webrtcbin: Improve SDP intersection for Opus
+-   wpe: Rename WPEView to WPEThreadedView to avoid clash with newer wpe
+    version
+
+gst-plugins-ugly
+
+-   No changes
+
+gst-plugins-rs
+
+-   gtk4: Fix segfault running gst-inspect -a when GTK4 and GTK3 is
+    installed
+-   gtk4: Always draw a black background behind the video frame
+-   livesync: add support for image formats
+-   livesync: properly format jitter in debug logs
+-   textwrap: add support for gaps
+-   webrtc: only use close() to close websockets
+-   webrtc: signallers: attempt to close the ws when an error occurs
+-   webrtc/signalling: Fix potential hang and FD leak
+-   webrtc/signalling: We get the address when accepting
+-   meson: Fix build on Windows with MSVC
+-   meson: pkg-config is required at build time
+-   meson: Add nasm to PATH if meson can find it
+-   meson: allow building plugins with GTK 4 examples
+-   Update GStreamer bindings in Cargo.lock
+
+gst-libav
+
+-   Prefer using FFmpeg musepack decoder/demuxer
+
+gst-rtsp-server
+
+-   No changes
+
+gstreamer-vaapi
+
+-   No changes
+
+gstreamer-sharp
+
+-   No changes
+
+gst-omx
+
+-   No changes
+
+gst-python
+
+-   Some Python 3.12 fixes
+-   python: Port from deprecated imp to importlib
+
+gst-editing-services
+
+-   No changes
+
+gst-validate + gst-integration-testsuites
+
+-   No changes
+
+gst-examples
+
+-   No changes
+
+Development build environment
+
+-   No changes
+
+Cerbero build tool and packaging changes in 1.22.10
+
+-   gst-plugins-bad: build soundtouch plugin on MSVC
+-   cerbero: Fix GNU tar –checkpoint compatibility with macOS
+-   cerbero: Fix bootstrap venv error after upgrading Python
+-   gst-plugins-good: build taglib plugin on MSVC
+
+Contributors to 1.22.10
+
+Alexander Slobodeniuk, Christian Curtis Veng, Edward Hervey, François
+Laignel, Guillaume Desmottes, Heiko Becker, Jan Schmidt, Jonas Kvinge,
+Jordan Petridis, L. E. Segovia, Lukas Geiger, Marvin Schmidt, Mathieu
+Duponchelle, Michael Tretter, Nirbheek Chauhan, Philippe Normand, Piotr
+Brzeziński, Ruben Gonzalez, Sebastian Dröge, Thibault Saunier,
+Tim-Philipp Müller,
+
+… and many others who have contributed bug reports, translations, sent
+suggestions or helped testing. Thank you all!
+
+List of merge requests and issues fixed in 1.22.10
+
+-   List of Merge Requests applied in 1.22.10
+-   List of Issues fixed in 1.22.10
+
+1.22.11
+
+The eleventh 1.22 bug-fix release (1.22.11) was released on 19 March
+2024.
+
+This release only contains bugfixes and security fixes and it should be
+safe to update from 1.22.x.
+
+The GStreamer 1.22 stable series has since been superseded by the
+GStreamer 1.24 stable release series.
+
+Highlighted bugfixes in 1.22.11
+
+-   Fix instant-EOS regression in audio sinks in some cases when volume
+    is 0
+-   rtspsrc: server compatibility improvements and ONVIF trick mode
+    fixes
+-   libsoup linking improvements on non-Linux platforms
+-   va: improvements for intel i965 driver
+-   wasapi2: fix choppy audio and respect ringbuffer buffer/latency time
+-   rtsp-server file descriptor leak fix
+-   uridecodebin3 fixes
+-   various bug fixes, build fixes, memory leak fixes, and other
+    stability and reliability improvements
+
+gstreamer
+
+-   uri: Sort uri protocol sources/sinks by feature name to break a
+    feature rank tie
+-   segment: Don’t use g_return_val_if_fail() in
+    gst_segment_to_running_time_full()
+-   identity: Don’t refuse seeks unless single-segment=true
+-   ptp clock: Initialize expected DELAY_REQ seqnum to an invalid value
+
+gst-plugins-base
+
+-   audiobasesink: Revert “Don’t wait on gap events” again, fixes
+    instant-EOS in some cases
+-   audioencoder: Avoid using temporarily mapped memory as base for
+    input buffers
+-   glimagesink: Fix the sink not always respecting preferred size on
+    macOS
+-   uridecodebin3: fix deadlock when switching input item
+-   urisourcebin: Don’t acquire STATE_LOCK if shutting down
+-   video: Fix NV12_16L32S video frame size
+
+gst-plugins-good
+
+-   jpegdec: Fix progressive/interlaced detection
+-   mpg123audiodec: Correctly handle the case of clipping all decoded
+    samples
+-   plugins: Fix GstFlowReturn/gboolean mixups
+-   qtdemux: Do not set channel-mask to zero
+-   rtpgstpay: Delay pushing of event packets until the next buffer
+-   rtspsrc: remove ‘deprecated’ flag from the ‘push-backchannel-sample’
+    signal
+-   rtspsrc: Don’t invoke close when stopping if we’ve started cleanup
+-   rtspsrc: Reset combined flows after a seek before restarting
+-   rtspsrc: Increase rank to PRIMARY for autoplug purposes
+-   rtspsrc: Consider 503 Service Not Available when handling broken
+    control urls
+-   rtspsrc, rtponviftimestamp: ONVIF mode fixes
+-   soup, adaptivedemux2: Backport various libsoup build fixes from main
+-   v4l2src: fix cannot reuse current caps when fixate caps in
+    negotiation
+
+gst-plugins-bad
+
+-   asio: Fix {input,output}-channels property handling
+-   asiosink: Fix channel selection
+-   d3d11device: Fix adapter LUID comparison in wrapped device mode
+-   d3d11window_win32: fix crash on RC unprepare() vs window_proc()
+-   dvbsubenc: Fix bottom field size calculation
+-   dvdspu: avoid null dereference
+-   v4l2codecs: h264: Fix a memory leak on renegotiation
+-   va: backport missing commits for i965 driver
+-   vulkan/wayland: use xdg_wm_base when available
+-   wasapi, wasapi2: Fix memory issues
+-   wasapi2: Respect ringbuffer buffer/latency time
+-   wasapi2: Fix choppy rendering
+
+gst-plugins-ugly
+
+-   No changes
+
+gst-plugins-rs
+
+-   No changes
+
+gst-libav
+
+-   No changes
+
+gst-rtsp-server
+
+-   rtsp-stream: clear sockets when leaving bin
+
+gstreamer-vaapi
+
+-   No changes
+
+gstreamer-sharp
+
+-   No changes
+
+gst-omx
+
+-   No changes
+
+gst-python
+
+-   No changes
+
+gst-editing-services
+
+-   No changes
+
+gst-validate + gst-integration-testsuites
+
+-   No changes
+
+gst-examples
+
+-   No changes
+
+Development build environment
+
+-   No changes
+
+Cerbero build tool and packaging changes in 1.22.11
+
+-   x264: fix linker path in pc file
+-   taglib: Fix msvc x86 build race
+
+Contributors to 1.22.11
+
+Alexander Slobodeniuk, Arnaud Vrac, Edward Hervey, Elizabeth Figura,
+Guillaume Desmottes, Haihua Hu, Jan Schmidt, Loïc Molinari, Mark
+Nauwelaerts, Mathieu Duponchelle, Mikhail Rudenko, Nirbheek Chauhan,
+Olivier Crête, Piotr Brzeziński, Robert Mader, Sebastian Dröge, Seungha
+Yang, Stéphane Cerveau, Tim-Philipp Müller, Víctor Manuel Jáquez Leal,
+
+… and many others who have contributed bug reports, translations, sent
+suggestions or helped testing. Thank you all!
+
+List of merge requests and issues fixed in 1.22.11
+
+-   List of Merge Requests applied in 1.22.11
+-   List of Issues fixed in 1.22.11
+
+1.22.12
+
+The twelfth 1.22 bug-fix release (1.22.12) was released on 29 April
+2024.
+
+This release only contains bugfixes and security fixes and it should be
+safe to update from 1.22.x.
+
+The GStreamer 1.22 stable series has since been superseded by the
+GStreamer 1.24 stable release series.
+
+Highlighted bugfixes in 1.22.12
+
+-   EXIF image tag parsing security fixes
+-   glimagesink, gl/macos: race and reference count fixes
+-   GstPlay, dvbsubenc, alphadecodebin, d3dvideosink fixes
+-   rtpjitterbuffer extended timestamp handling fixes
+-   v4l2: fix regression with tiled formats
+-   ximagesink: fix regression on RPi/aarch64
+-   Thread-safety fixes
+-   Python bindings fixes
+-   cerbero build fixes with clang 15 on latest macOS/iOS
+-   various bug fixes, build fixes, memory leak fixes, and other
+    stability and reliability improvements
+
+gstreamer
+
+-   basesrc: Clear submitted buffer lists consistently with buffers
+-   inputselector: fix possible clock leak on shutdown
+-   ptpclock: fix double free of domain data during deinit
+-   gst-inspect-1.0: fix –exists for plugins with versions other than
+    GStreamer’s version, like the Rust plugins
+
+gst-plugins-base
+
+-   EXIF image tag parsing security fixes
+-   glimagesink, gl/macos: a couple of race/reference count fixes
+-   typefinding: Handle WavPack block sizes > 131072
+-   v4l2: fix error in calculating padding bottom for tile format
+-   ximagesink: initialize mask for XISelectEvents
+
+gst-plugins-good
+
+-   pulsedeviceprovider: Add compare_device_type_name function and
+    missing lock
+-   qtdemux: fix wrong full_range offset when parsing colr box
+-   rtpjitterbuffer: Use an extended RTP timestamp for the clock-base
+-   soup: fix thread name
+-   tests: rtpred: fix out-of-bound writes in unit test
+-   v4l2: silence valgrind warning
+
+gst-plugins-bad
+
+-   alphadecodebin: Explicitly pass 64 bit integers as such through
+    varargs
+-   d3d11videosink: disconnect signals before releasing the window
+-   dvbsubenc: fixed some memory leaks and a crash
+-   GstPlay: Update video_snapshot to support playbin3
+
+gst-plugins-ugly
+
+-   No changes
+
+gst-plugins-rs
+
+-   No changes
+
+gst-libav
+
+-   No changes
+
+gst-rtsp-server
+
+-   No changes
+
+gstreamer-vaapi
+
+-   No changes
+
+gstreamer-sharp
+
+-   No changes
+
+gst-omx
+
+-   No changes
+
+gst-python
+
+-   Don’t link to python for the gi overrides module
+
+gst-editing-services
+
+-   No changes
+
+gst-devtools, gst-validate + gst-integration-testsuites
+
+-   debug-viewer: Fix plugin loading machinery
+
+gst-examples
+
+-   No changes
+
+Development build environment
+
+-   No changes
+
+Cerbero build tool and packaging changes in 1.22.12
+
+-   glib: disable error for int-conversion introduced by default with
+    clang 15
+-   cerbero: Fix shutil.rmtree hack to passthrough unknown kwargs
+
+Contributors to 1.22.12
+
+Alexander Slobodeniuk, Arnaud Vrac, Elliot Chen, eri, F. Duncanh, Jan
+Schmidt, Jimmy Ohn, Matthew Waters, Nicolas Dufresne, Nirbheek Chauhan,
+Philippe Normand, Qian Hu (胡骞), Sebastian Dröge, Taruntej Kanakamalla,
+Thomas Goodwin, Tim Blechmann, Tim-Philipp Müller,
+
+… and many others who have contributed bug reports, translations, sent
+suggestions or helped testing. Thank you all!
+
+List of merge requests and issues fixed in 1.22.12
+
+-   List of Merge Requests applied in 1.22.12
+-   List of Issues fixed in 1.22.12
+
+Schedule for 1.24
 
-1.24 will be backwards-compatible to the stable 1.22, 1.20, 1.18, 1.16,
-1.14, 1.12, 1.10, 1.8, 1.6, 1.4, 1.2 and 1.0 release series.
+GStreamer 1.24 was released on 4 March 2024.
 
 ------------------------------------------------------------------------
 
diff -Nru gstreamer1.0-1.22.0/plugins/elements/gstelements_private.c gstreamer1.0-1.22.12/plugins/elements/gstelements_private.c
--- gstreamer1.0-1.22.0/plugins/elements/gstelements_private.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/plugins/elements/gstelements_private.c	2024-04-29 21:09:52.000000000 +0200
@@ -540,6 +540,10 @@
         current_buf_mem_idx = 0;
     }
     current_buf_idx = i;
+    if (current_buf_mem_idx != 0) {
+      g_assert (current_buf_idx > 0);
+      current_buf_idx--;
+    }
   }
 
   do {
@@ -629,6 +633,10 @@
           current_buf_mem_idx = 0;
       }
       current_buf_idx = i;
+      if (current_buf_mem_idx != 0) {
+        g_assert (current_buf_idx > 0);
+        current_buf_idx--;
+      }
     }
   } while (left > 0);
 
diff -Nru gstreamer1.0-1.22.0/plugins/elements/gstidentity.c gstreamer1.0-1.22.12/plugins/elements/gstidentity.c
--- gstreamer1.0-1.22.0/plugins/elements/gstidentity.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/plugins/elements/gstidentity.c	2024-04-29 21:09:52.000000000 +0200
@@ -569,14 +569,16 @@
           &start, &stop_type, &stop);
 
       GST_OBJECT_LOCK (identity);
-      gst_segment_init (&identity->seek_segment, fmt);
-      if (!gst_segment_do_seek (&identity->seek_segment, rate, fmt,
-              flags, start_type, start, stop_type, stop, NULL)) {
-        GST_WARNING_OBJECT (identity, "Could not run seek %" GST_PTR_FORMAT,
-            event);
-        GST_OBJECT_UNLOCK (identity);
+      if (identity->single_segment) {
+        gst_segment_init (&identity->seek_segment, fmt);
+        if (!gst_segment_do_seek (&identity->seek_segment, rate, fmt,
+                flags, start_type, start, stop_type, stop, NULL)) {
+          GST_WARNING_OBJECT (identity, "Could not handle %" GST_PTR_FORMAT,
+              event);
+          GST_OBJECT_UNLOCK (identity);
 
-        return FALSE;
+          return FALSE;
+        }
       }
       GST_OBJECT_UNLOCK (identity);
 
diff -Nru gstreamer1.0-1.22.0/plugins/elements/gstinputselector.c gstreamer1.0-1.22.12/plugins/elements/gstinputselector.c
--- gstreamer1.0-1.22.0/plugins/elements/gstinputselector.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/plugins/elements/gstinputselector.c	2024-04-29 21:09:52.000000000 +0200
@@ -839,6 +839,13 @@
       GstClockTimeDiff jitter;
       GstClockID clock_id;
 
+      if (!sel->playing) {
+        GST_DEBUG_OBJECT (selpad, "Waiting for playing");
+        GST_INPUT_SELECTOR_WAIT (sel);
+        GST_DEBUG_OBJECT (selpad, "Done waiting");
+        continue;
+      }
+
       base_time = gst_element_get_base_time (GST_ELEMENT_CAST (sel));
       if (!GST_CLOCK_TIME_IS_VALID (base_time)) {
         GST_DEBUG_OBJECT (selpad, "sync-mode=clock but no base time. Blocking");
@@ -1432,6 +1439,7 @@
   g_mutex_init (&sel->lock);
   g_cond_init (&sel->cond);
   sel->eos = FALSE;
+  sel->playing = FALSE;
 
   sel->upstream_latency = 0;
   sel->last_output_ts = GST_CLOCK_TIME_NONE;
@@ -2029,9 +2037,20 @@
       GST_INPUT_SELECTOR_BROADCAST (self);
       GST_INPUT_SELECTOR_UNLOCK (self);
       break;
+    case GST_STATE_CHANGE_PAUSED_TO_PLAYING:{
+      GST_INPUT_SELECTOR_LOCK (self);
+      self->playing = TRUE;
+      GST_INPUT_SELECTOR_BROADCAST (self);
+      GST_INPUT_SELECTOR_UNLOCK (self);
+      break;
+    }
     case GST_STATE_CHANGE_PLAYING_TO_PAUSED:{
       GList *walk;
 
+      GST_INPUT_SELECTOR_LOCK (self);
+      self->playing = FALSE;
+      GST_INPUT_SELECTOR_BROADCAST (self);
+      GST_OBJECT_LOCK (self);
       for (walk = GST_ELEMENT_CAST (self)->sinkpads; walk;
           walk = g_list_next (walk)) {
         GstSelectorPad *selpad = GST_SELECTOR_PAD_CAST (walk->data);
@@ -2040,6 +2059,8 @@
           gst_clock_id_unschedule (selpad->clock_id);
         }
       }
+      GST_OBJECT_UNLOCK (self);
+      GST_INPUT_SELECTOR_UNLOCK (self);
       break;
     }
     default:
diff -Nru gstreamer1.0-1.22.0/plugins/elements/gstinputselector.h gstreamer1.0-1.22.12/plugins/elements/gstinputselector.h
--- gstreamer1.0-1.22.0/plugins/elements/gstinputselector.h	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/plugins/elements/gstinputselector.h	2024-04-29 21:09:52.000000000 +0200
@@ -81,6 +81,7 @@
   gboolean eos;
   gboolean eos_sent;
   gboolean flushing;
+  gboolean playing;
 
   GstClockTime upstream_latency;
   GstClockTime last_output_ts;
diff -Nru gstreamer1.0-1.22.0/plugins/elements/gstmultiqueue.c gstreamer1.0-1.22.12/plugins/elements/gstmultiqueue.c
--- gstreamer1.0-1.22.0/plugins/elements/gstmultiqueue.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/plugins/elements/gstmultiqueue.c	2024-04-29 21:09:52.000000000 +0200
@@ -2648,6 +2648,7 @@
   GstEventType type;
   GstEvent *sref = NULL;
   GstPad *srcpad;
+  gboolean is_timed_event = FALSE;
 
 
   sq = GST_MULTIQUEUE_PAD (pad)->sq;
@@ -2732,6 +2733,7 @@
           GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
         }
       }
+      is_timed_event = TRUE;
       break;
 
     default:
@@ -2755,8 +2757,13 @@
       "Enqueuing event %p of type %s with id %d",
       event, GST_EVENT_TYPE_NAME (event), curid);
 
-  if (!gst_data_queue_push (sq->queue, (GstDataQueueItem *) item))
-    goto flushing;
+  if (is_timed_event) {
+    if (!gst_data_queue_push (sq->queue, (GstDataQueueItem *) item))
+      goto flushing;
+  } else {
+    if (!gst_data_queue_push_force (sq->queue, (GstDataQueueItem *) item))
+      goto flushing;
+  }
 
   /* mark EOS when we received one, we must do that after putting the
    * buffer in the queue because EOS marks the buffer as filled. */
@@ -2964,6 +2971,34 @@
   }
 
   switch (GST_EVENT_TYPE (event)) {
+    case GST_EVENT_LATENCY:
+    {
+      GstClockTime latency = GST_CLOCK_TIME_NONE;
+      gst_event_parse_latency (event, &latency);
+      if (GST_CLOCK_TIME_IS_VALID (latency)) {
+        GST_MULTI_QUEUE_MUTEX_LOCK (mq);
+        if (latency > mq->min_interleave_time) {
+          /* Due to the dynamic nature of multiqueue, whe `use-interleave` is
+           * used we can't report a maximum tolerated latency (when queried)
+           * since it is calculated dynamically.
+           *
+           * When in such live pipelines, we need to make sure multiqueue can
+           * handle the lowest global latency (provided by this event). Failure
+           * to do that would result in not providing enough buffering for a
+           * realtime pipeline.
+           */
+          GST_DEBUG_OBJECT (mq,
+              "Raising minimum interleave time to %" GST_TIME_FORMAT,
+              GST_TIME_ARGS (latency));
+          mq->min_interleave_time = latency;
+          if (mq->use_interleave)
+            calculate_interleave (mq, NULL);
+        }
+        GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
+      }
+      ret = gst_pad_push_event (sinkpad, event);
+    }
+      break;
     case GST_EVENT_RECONFIGURE:
       GST_MULTI_QUEUE_MUTEX_LOCK (mq);
       if (sq->srcresult == GST_FLOW_NOT_LINKED) {
diff -Nru gstreamer1.0-1.22.0/po/fur.po gstreamer1.0-1.22.12/po/fur.po
--- gstreamer1.0-1.22.0/po/fur.po	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/po/fur.po	2024-04-29 21:09:52.000000000 +0200
@@ -1,22 +1,23 @@
 # Friulian translation for gstreamer package of GStreamer project.
 # This file is put in the public domain.
-# Fabio Tomat <f.t.public@gmail.com>, 2017.
+# Fabio Tomat <f.t.public@gmail.com>, 2023.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: gstreamer 1.10.0\n"
+"Project-Id-Version: gstreamer 1.21.90\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-11 15:40+0000\n"
-"PO-Revision-Date: 2017-03-19 15:41+0100\n"
-"Last-Translator: Fabio Tomat <f.t.public@gmail.com>\n"
+"POT-Creation-Date: 2023-02-22 11:51+0000\n"
+"PO-Revision-Date: 2023-01-28 11:40+0100\n"
+"Last-Translator: Fabio T. <f.t.public@gmail.com>\n"
 "Language-Team: Friulian <f.t.public@gmail.com>\n"
 "Language: fur\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 1.8.12\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Editor: HaiPO 1.4 beta\n"
+"X-Generator: Poedit 3.2.2\n"
 
 msgid "Print the GStreamer version"
 msgstr "Stampe la version di GStreamer"
@@ -25,11 +26,12 @@
 msgstr "Fâs deventâ ducj i avertiments fatâi"
 
 msgid "Print available debug categories and exit"
-msgstr ""
+msgstr "Stampe lis categoriis di debug disponibilis e jes"
 
 msgid ""
 "Default debug level from 1 (only error) to 9 (anything) or 0 for no output"
 msgstr ""
+"Nivel di debug predefinît di 1 (dome erôr) a 9 (dut) opûr 0 par no vê output"
 
 msgid "LEVEL"
 msgstr "NIVEL"
@@ -38,26 +40,30 @@
 "Comma-separated list of category_name:level pairs to set specific levels for "
 "the individual categories. Example: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
 msgstr ""
+"Liste separade di virgulis di cubiis non_categorie:nivel par stabilî i nivei "
+"specifics pes categoriis individuâls. Esempli: GST_AUTOPLUG:5,GST_ELEMENT_*:3"
 
 msgid "LIST"
 msgstr "LISTE"
 
 msgid "Disable colored debugging output"
-msgstr ""
+msgstr "Disabilite la jessude di debug colorade"
 
 msgid ""
 "Changes coloring mode of the debug log. Possible modes: off, on, disable, "
 "auto, unix"
 msgstr ""
+"Al cambie la modalitât di colorazion dal regjistri di debug. Lis modalitât "
+"pussibilis: off, on, disable, auto, unix"
 
 msgid "Disable debugging"
-msgstr ""
+msgstr "Disabilite il debug"
 
 msgid "Enable verbose plugin loading diagnostics"
-msgstr ""
+msgstr "Abilite lis diagnostichis prolissis pal cjariament dai plugins"
 
 msgid "Colon-separated paths containing plugins"
-msgstr ""
+msgstr "Percors separâts di “:” che a contegnin i plugins"
 
 msgid "PATHS"
 msgstr "PERCORS"
@@ -66,18 +72,24 @@
 "Comma-separated list of plugins to preload in addition to the list stored in "
 "environment variable GST_PLUGIN_PATH"
 msgstr ""
+"Liste separade di “:” di plugins di pre-cjariâ in zonte ae liste archividade "
+"te variabile di ambient GST_PLUGIN_PATH"
 
 msgid "PLUGINS"
 msgstr "PLUGIN"
 
 msgid "Disable trapping of segmentation faults during plugin loading"
 msgstr ""
+"Disabilite la cature di vuascj di segmentazion dilunc il cjariament dai "
+"plugins"
 
 msgid "Disable updating the registry"
-msgstr ""
+msgstr "Disabilite l'inzornament dal regjistri"
 
 msgid "Disable spawning a helper process while scanning the registry"
 msgstr ""
+"Disabilite la creazion di un procès aiutant intant che si analize il "
+"regjistri"
 
 msgid "GStreamer Options"
 msgstr "Opzions GStreamer"
@@ -90,69 +102,75 @@
 msgstr "Opzion no cognossude"
 
 msgid "GStreamer encountered a general core library error."
-msgstr ""
+msgstr "GStreamer al à riscontrât un erôr gjenerâl de librarie cûr."
 
 msgid ""
 "GStreamer developers were too lazy to assign an error code to this error."
 msgstr ""
+"I svilupadôrs di GStreamer a jerin masse pelandrons par assegnâ un codiç di "
+"erôr a chest erôr."
 
 msgid "Internal GStreamer error: code not implemented."
-msgstr ""
+msgstr "Erôr interni di GStreamer: codiç no implementât."
 
 msgid ""
 "GStreamer error: state change failed and some element failed to post a "
 "proper error message with the reason for the failure."
 msgstr ""
+"Erôr di GStreamer: il cambiament di stât al à falît e cualchi element nol è "
+"rivât a publicâ un messaç di erôr adat cul motîf relatîf al faliment."
 
 msgid "Internal GStreamer error: pad problem."
-msgstr ""
+msgstr "Erôr interni di GStreamer: probleme di imbotidure."
 
 msgid "Internal GStreamer error: thread problem."
-msgstr ""
+msgstr "Erôr interni di GStreamer: probleme di thread."
 
 msgid "GStreamer error: negotiation problem."
-msgstr ""
+msgstr "Erôr di GStreamer: probleme di negoziazion."
 
 msgid "Internal GStreamer error: event problem."
-msgstr ""
+msgstr "Erôr interni di GStreamer: probleme di event."
 
 msgid "Internal GStreamer error: seek problem."
-msgstr ""
+msgstr "Erôr interni di GStreamer: probleme di ricercje."
 
 msgid "Internal GStreamer error: caps problem."
-msgstr ""
+msgstr "Erôr interni di GStreamer: probleme di sottitui."
 
 msgid "Internal GStreamer error: tag problem."
-msgstr ""
+msgstr "Erôr interni di GStreamer: probleme di etichete."
 
 msgid "Your GStreamer installation is missing a plug-in."
-msgstr ""
+msgstr "Ae tô instalazion di GStreamer e mancje un plug-in."
 
 msgid "GStreamer error: clock problem."
-msgstr ""
+msgstr "Erôr di GStreamer: probleme di orloi."
 
 msgid ""
 "This application is trying to use GStreamer functionality that has been "
 "disabled."
 msgstr ""
+"Cheste aplicazion e sta cirint di doprâ une funzion di GStreamer che e je "
+"stade disabilitade."
 
 msgid "GStreamer encountered a general supporting library error."
-msgstr ""
+msgstr "GStreamer al à riscontrât un erôr gjenerâl de librarie di supuart."
 
 msgid "Could not initialize supporting library."
-msgstr ""
+msgstr "Impussibil inizializâ la librarie di supuart."
 
 msgid "Could not close supporting library."
-msgstr ""
+msgstr "Impussibil sierâ la libarie di supuart."
 
 msgid "Could not configure supporting library."
-msgstr ""
+msgstr "Impussibil configurâ la librarie di supuart."
 
 msgid "Encoding error."
 msgstr "Erôr di codifiche."
 
 msgid "GStreamer encountered a general resource error."
-msgstr ""
+msgstr "GStreamer al à riscontrât un erôr gjenerâl des risorsis."
 
 msgid "Resource not found."
 msgstr "Risorse no cjatade."
@@ -194,19 +212,22 @@
 msgstr "No autorizât a acedi ae risorse."
 
 msgid "GStreamer encountered a general stream error."
-msgstr ""
+msgstr "GStreamer al à riscontrât un erôr gjenerâl di flus."
 
 msgid "Element doesn't implement handling of this stream. Please file a bug."
 msgstr ""
+"L'element nol implemente la gjestion di chest flus. Par plasê, fâs une "
+"segnalazion di erôr."
 
 msgid "Could not determine type of stream."
 msgstr "Impussibil determinâ il gjenar di flus."
 
 msgid "The stream is of a different type than handled by this element."
-msgstr ""
+msgstr "Il flus al è di un gjenar diferent di chel gjestît di chest element."
 
 msgid "There is no codec present that can handle the stream's type."
 msgstr ""
+"Nol è presint nissun codificadôr che al pues gjestî chest gjenar di flus."
 
 msgid "Could not decode stream."
 msgstr "Impussibil decodificâ il flus."
@@ -215,10 +236,10 @@
 msgstr "Impussibil codificâ il flus."
 
 msgid "Could not demultiplex stream."
-msgstr ""
+msgstr "Impussibil demultiplexâ il flus."
 
 msgid "Could not multiplex stream."
-msgstr ""
+msgstr "Impussibil multiplexâ il flus."
 
 msgid "The stream is in the wrong format."
 msgstr "Il flus al è tal formât sbaliât."
@@ -242,7 +263,7 @@
 msgstr "Nissun messaç di erôr standard pal domini %s e codiç %d."
 
 msgid "Selected clock cannot be used in pipeline."
-msgstr ""
+msgstr "Nol è pussibil doprâ te pipeline l'orloi selezionât."
 
 #, c-format
 msgid "Error writing registry cache to %s: %s"
@@ -319,13 +340,14 @@
 msgstr "coment"
 
 msgid "free text commenting the data"
-msgstr ""
+msgstr "test libar che al comente i dâts"
 
 msgid "extended comment"
-msgstr ""
+msgstr "coment slargjât"
 
 msgid "free text commenting the data in key=value or key[en]=comment form"
 msgstr ""
+"test libar che al comente i dâts te forme clâf=valôr o clâf[ing]=coment"
 
 msgid "track number"
 msgstr "numar dal toc"
@@ -366,8 +388,8 @@
 
 msgid "Homepage for this media (i.e. artist or movie homepage)"
 msgstr ""
-"sît web par chest contignût multimediâl (p.e. il sît web dal artist o dal "
-"film)"
+"Sît web par chest contignût multimediâl (vâl a dî la pagjine web dal artist "
+"o dal film)"
 
 msgid "description"
 msgstr "descrizion"
@@ -507,16 +529,16 @@
 msgstr "bitrate massim in bit/s"
 
 msgid "encoder"
-msgstr ""
+msgstr "codificadôr"
 
 msgid "encoder used to encode this stream"
-msgstr ""
+msgstr "codificadôr doprât par codificâ chest flus"
 
 msgid "encoder version"
-msgstr ""
+msgstr "version codificadôr"
 
 msgid "version of the encoder used to encode this stream"
-msgstr ""
+msgstr "version dal codfiicadôr doprât par codificâ chest flus"
 
 msgid "serial"
 msgstr "seriâl"
@@ -552,7 +574,7 @@
 msgstr ""
 
 msgid "reference level of track and album gain values"
-msgstr ""
+msgstr "nivel di riferiment dai valôrs di vuadagn de linie e dal album"
 
 msgid "language code"
 msgstr "codiç lenghe"
@@ -604,6 +626,8 @@
 "human readable descriptive location of where the media has been recorded or "
 "produced"
 msgstr ""
+"ubicazion descritive par umans di dulà che l'element multimediâl al è stât "
+"regjistrât o prodot"
 
 msgid "geo location latitude"
 msgstr "latitudin posizion gjeog."
@@ -662,6 +686,8 @@
 "a location within a city where the media has been produced or created (e.g. "
 "the neighborhood)"
 msgstr ""
+"une posizion dentri di une citât dulà che l'element multimediâl al è stât "
+"prodot o creât (p.e. borc)"
 
 msgid "geo location horizontal error"
 msgstr ""
@@ -855,13 +881,13 @@
 msgid "no property \"%s\" in element \"%s\""
 msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "Element \"%s\" is not a GstPreset"
-msgstr "Il file \"%s\" al è un socket."
+msgstr "L'element \"%s\" nol è un GstPreset"
 
-#, fuzzy, c-format
+#, c-format
 msgid "could not set preset \"%s\" in element \"%s\""
-msgstr "Impussibil creâ il file temporani \"%s\"."
+msgstr "impussibil stabilî la pre-configurazion \"%s\" tal element \"%s\""
 
 #, c-format
 msgid "no element \"%s\""
@@ -926,10 +952,10 @@
 msgstr ""
 
 msgid "empty pipeline not allowed"
-msgstr ""
+msgstr "la pipeline vueide no je ametude"
 
 msgid "Pipeline construction is invalid, please add queues."
-msgstr ""
+msgstr "La costrusion de pipeline no je valide, zonte codis di riproduzion."
 
 msgid "A lot of buffers are being dropped."
 msgstr ""
@@ -1035,9 +1061,9 @@
 msgid "Stream contains no data."
 msgstr "Il flus nol conten dâts."
 
-#, fuzzy, c-format
+#, c-format
 msgid "%sImplemented Interfaces%s:\n"
-msgstr "Interfacis implementadis:\n"
+msgstr "%sInterfacis implementadis%s:\n"
 
 msgid "readable"
 msgstr ""
@@ -1066,9 +1092,9 @@
 msgid "Blacklisted files:"
 msgstr "File te liste nere:"
 
-#, fuzzy, c-format
+#, c-format
 msgid "%sTotal count%s: %s"
-msgstr "Conte totâl: "
+msgstr "%sConte totâl%s: %s"
 
 #, c-format
 msgid "%d blacklisted file"
@@ -1146,10 +1172,10 @@
 msgstr ""
 
 msgid "Setting pipeline to PLAYING ...\n"
-msgstr ""
+msgstr "Daûr a meti la pipeline a RIPRODUZION ...\n"
 
 msgid "ERROR: pipeline doesn't want to play.\n"
-msgstr ""
+msgstr "ERÔR: la pipeline no vûl riprodusi.\n"
 
 #, c-format
 msgid "Got message #%u from element \"%s\" (%s): "
@@ -1172,7 +1198,7 @@
 msgstr ""
 
 msgid "EOS received - stopping pipeline...\n"
-msgstr ""
+msgstr "Ricevût EOS - daûr a fermâ la pipeline...\n"
 
 #, c-format
 msgid "FOUND TAG      : found by element \"%s\".\n"
@@ -1205,10 +1231,12 @@
 "INFO:\n"
 "%s\n"
 msgstr ""
+"INFORMAZION:\n"
+"%s\n"
 
 #, c-format
 msgid "WARNING: from element %s: %s\n"
-msgstr ""
+msgstr "ATENZION: dal element %s: %s\n"
 
 msgid "Pipeline is PREROLLED ...\n"
 msgstr ""
@@ -1220,35 +1248,38 @@
 msgstr ""
 
 msgid "buffering..."
-msgstr ""
+msgstr "daûr a jemplâ la memorie tampon..."
 
 msgid "Done buffering, setting pipeline to PLAYING ...\n"
 msgstr ""
+"Terminât di jemplâ la memorie tampon, daûr a meti la pipeline a "
+"RIPRODUZION ...\n"
 
 #. we were not buffering but PLAYING, PAUSE  the pipeline.
 msgid "Buffering, setting pipeline to PAUSED ...\n"
 msgstr ""
+"Daûr a jemplâ la memorie tampon, configurazion de pipeline a IN PAUSE ...\n"
 
 msgid "Redistribute latency...\n"
 msgstr ""
 
 #, c-format
 msgid "Setting state to %s as requested by %s...\n"
-msgstr ""
+msgstr "Daûr a meti il stât a %s come domandât di %s...\n"
 
 #. this application message is posted when we caught an interrupt and
 #. * we need to stop the pipeline.
 msgid "Interrupt: Stopping pipeline ...\n"
-msgstr ""
+msgstr "Interuzion: daûr a fermâ la pipeline ...\n"
 
 msgid "Interrupt while waiting for EOS - stopping pipeline...\n"
-msgstr ""
+msgstr "Interuzion dilunc la spiete pal EOS - daûr a fermâ la pipeline...\n"
 
 msgid "EOS on shutdown enabled -- Forcing EOS on the pipeline\n"
-msgstr ""
+msgstr "EOS al distudâ abilitât -- Daûr a sfuarçâ il EOS su la pipeline\n"
 
 msgid "Waiting for EOS...\n"
-msgstr ""
+msgstr "Daûr a spietâ il EOS...\n"
 
 #, c-format
 msgid "Progress: (%s) %s\n"
@@ -1266,74 +1297,84 @@
 msgstr ""
 
 msgid "An error happened while waiting for EOS\n"
-msgstr ""
+msgstr "Al è capitât un erôr intant che si spietave il EOS\n"
 
 #, c-format
 msgid "Use Windows high-resolution clock, precision: %u ms\n"
 msgstr ""
+"Dopre l'orloi di sisteme di Windows a alte risoluzion, precision: %u ms\n"
 
 msgid "Output tags (also known as metadata)"
-msgstr ""
+msgstr "Etichetis di jessude (cognossudis ancje come metadâts)"
 
 msgid "Output TOC (chapters and editions)"
-msgstr ""
+msgstr "TOC di jessude (cjapitui e edizions)"
 
 msgid "Output status information and property notifications"
-msgstr ""
+msgstr "Informazions di stât di jessude e notifichis di proprietâts"
 
 msgid "Do not print any progress information"
 msgstr "No stâ stampâ nissune informazion di progrès"
 
 msgid "Output messages"
-msgstr ""
+msgstr "Messaçs di jessude"
 
 msgid ""
 "Do not output status information for the specified property if verbose "
 "output is enabled (can be used multiple times)"
 msgstr ""
+"No sta mandâ fûr lis informazions di stât pe proprietât indicade se la "
+"jessude prolisse e je abilitade (al è pussibil doprâle plui voltis)"
 
 msgid "PROPERTY-NAME"
-msgstr ""
+msgstr "NON-PROPRIETÂT"
 
 msgid "Do not install a fault handler"
-msgstr ""
+msgstr "No sta instalâ un gjestôr di erôrs"
 
 msgid "Force EOS on sources before shutting the pipeline down"
-msgstr ""
+msgstr "Sfuarce l'EOS su lis sorzints prime di distudâ la pipeline"
 
 msgid "Gather and print index statistics"
-msgstr ""
+msgstr "Recupere e stampe lis statistichis de tabele"
 
 msgid ""
 "Do not print current position of pipeline. If this option is unspecified, "
 "the position will be printed when stdout is a TTY. To enable printing "
 "position when stdout is not a TTY, use \"force-position\" option"
 msgstr ""
+"No sta stampâ la posizion corinte de pipeline. Se cheste opzion no ven "
+"specificade e se il stdout al è un TTY, la posizion e vignarà stampade. Par "
+"abilitâ la stampe de posizion cuant che il stdout nol è un TTY, dopre la "
+"opzion \"force-position\""
 
 msgid ""
 "Allow printing current position of pipeline even if stdout is not a TTY. "
 "This option has no effect if the \"no-position\" option is specified"
 msgstr ""
+"Permet di stampâ la posizion corinte de pipeline ancje se il stdout nol è un "
+"TTY. Cheste opzion no à efiet se e je stade specificade la opzion “no-"
+"position”"
 
 #, c-format
 msgid "ERROR: pipeline could not be constructed: %s.\n"
-msgstr ""
+msgstr "ERÔR: nol è stât pussibil costruî la pipeline: %s.\n"
 
 msgid "ERROR: pipeline could not be constructed.\n"
-msgstr ""
+msgstr "ERÔR: nol è stât pussibil costruî la pipeline.\n"
 
 #, c-format
 msgid "WARNING: erroneous pipeline: %s\n"
-msgstr ""
+msgstr "ATENZION: pipeline sbaliade: %s\n"
 
 msgid "ERROR: the 'pipeline' element wasn't found.\n"
-msgstr ""
+msgstr "ERÔR: nol è stât cjatât l'element 'pipeline'.\n"
 
 msgid "Setting pipeline to PAUSED ...\n"
-msgstr ""
+msgstr "Daûr a meti la pipeline a IN PAUSE ...\n"
 
 msgid "Failed to set pipeline to PAUSED.\n"
-msgstr ""
+msgstr "Impussibil meti la pipeline a IN PAUSE.\n"
 
 msgid "Pipeline is live and does not need PREROLL ...\n"
 msgstr ""
@@ -1342,10 +1383,10 @@
 msgstr ""
 
 msgid "Execution ended after %"
-msgstr ""
+msgstr "Esecuzion finide dopo %"
 
 msgid "Setting pipeline to NULL ...\n"
-msgstr ""
+msgstr "Daûr a meti la pipeline a NULE ...\n"
 
 msgid "Freeing pipeline ...\n"
-msgstr ""
+msgstr "Daûr a liberâ la pipeline ...\n"
diff -Nru gstreamer1.0-1.22.0/po/gstreamer-1.0.pot gstreamer1.0-1.22.12/po/gstreamer-1.0.pot
--- gstreamer1.0-1.22.0/po/gstreamer-1.0.pot	2023-01-23 20:29:57.475900700 +0100
+++ gstreamer1.0-1.22.12/po/gstreamer-1.0.pot	2024-04-29 21:10:09.183505800 +0200
@@ -6,9 +6,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: gstreamer-1.22.0\n"
+"Project-Id-Version: gstreamer-1.22.12\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-23 19:29+0000\n"
+"POT-Creation-Date: 2024-04-29 20:10+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -1026,27 +1026,27 @@
 msgid ", "
 msgstr ""
 
-#: gst/gsturi.c:641 gst/gsturi.c:814
+#: gst/gsturi.c:645 gst/gsturi.c:818
 #, c-format
 msgid "Invalid URI: %s"
 msgstr ""
 
-#: gst/gsturi.c:656
+#: gst/gsturi.c:660
 #, c-format
 msgid "No URI handler for the %s protocol found"
 msgstr ""
 
-#: gst/gsturi.c:836
+#: gst/gsturi.c:840
 #, c-format
 msgid "URI scheme '%s' not supported"
 msgstr ""
 
-#: gst/gstutils.c:2679 tools/gst-launch.c:350
+#: gst/gstutils.c:2682 tools/gst-launch.c:350
 #, c-format
 msgid "ERROR: from element %s: %s\n"
 msgstr ""
 
-#: gst/gstutils.c:2681 tools/gst-launch.c:352 tools/gst-launch.c:714
+#: gst/gstutils.c:2684 tools/gst-launch.c:352 tools/gst-launch.c:714
 #, c-format
 msgid ""
 "Additional debug info:\n"
@@ -1071,7 +1071,7 @@
 msgstr ""
 
 #: gst/parse/grammar.y.in:438 gst/parse/grammar.y.in:624
-#: gst/parse/grammar.y.in:658 gst/parse/grammar.y.in:770
+#: gst/parse/grammar.y.in:658 gst/parse/grammar.y.in:772
 #, c-format
 msgid "no property \"%s\" in element \"%s\""
 msgstr ""
@@ -1091,7 +1091,7 @@
 msgid "no element \"%s\""
 msgstr ""
 
-#: gst/parse/grammar.y.in:613 gst/parse/grammar.y.in:793
+#: gst/parse/grammar.y.in:613 gst/parse/grammar.y.in:795
 #, c-format
 msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
 msgstr ""
@@ -1101,70 +1101,70 @@
 msgid "could not set property \"%s\" in child of element \"%s\" to \"%s\""
 msgstr ""
 
-#: gst/parse/grammar.y.in:854
+#: gst/parse/grammar.y.in:856
 msgid "Delayed linking failed."
 msgstr ""
 
-#: gst/parse/grammar.y.in:1067 gst/parse/grammar.y.in:1072
+#: gst/parse/grammar.y.in:1069 gst/parse/grammar.y.in:1074
 #, c-format
 msgid "could not link %s to %s, %s can't handle caps %s"
 msgstr ""
 
-#: gst/parse/grammar.y.in:1077
+#: gst/parse/grammar.y.in:1079
 #, c-format
 msgid "could not link %s to %s, neither element can handle caps %s"
 msgstr ""
 
-#: gst/parse/grammar.y.in:1081
+#: gst/parse/grammar.y.in:1083
 #, c-format
 msgid "could not link %s to %s with caps %s"
 msgstr ""
 
-#: gst/parse/grammar.y.in:1087
+#: gst/parse/grammar.y.in:1089
 #, c-format
 msgid "could not link %s to %s"
 msgstr ""
 
-#: gst/parse/grammar.y.in:1238
+#: gst/parse/grammar.y.in:1240
 #, c-format
 msgid "unexpected reference \"%s\" - ignoring"
 msgstr ""
 
-#: gst/parse/grammar.y.in:1244
+#: gst/parse/grammar.y.in:1246
 #, c-format
 msgid "unexpected pad-reference \"%s\" - ignoring"
 msgstr ""
 
-#: gst/parse/grammar.y.in:1276 gst/parse/grammar.y.in:1285
+#: gst/parse/grammar.y.in:1278 gst/parse/grammar.y.in:1287
 #, c-format
 msgid "could not parse caps \"%s\""
 msgstr ""
 
-#: gst/parse/grammar.y.in:1313
+#: gst/parse/grammar.y.in:1315
 #, c-format
 msgid "no sink element for URI \"%s\""
 msgstr ""
 
-#: gst/parse/grammar.y.in:1332
+#: gst/parse/grammar.y.in:1334
 #, c-format
 msgid "no source element for URI \"%s\""
 msgstr ""
 
-#: gst/parse/grammar.y.in:1422
+#: gst/parse/grammar.y.in:1424
 msgid "syntax error"
 msgstr ""
 
-#: gst/parse/grammar.y.in:1445
+#: gst/parse/grammar.y.in:1447
 #, c-format
 msgid "specified empty bin \"%s\", not allowed"
 msgstr ""
 
-#: gst/parse/grammar.y.in:1455
+#: gst/parse/grammar.y.in:1457
 #, c-format
 msgid "no bin \"%s\", unpacking elements"
 msgstr ""
 
-#: gst/parse/grammar.y.in:1486
+#: gst/parse/grammar.y.in:1488
 msgid "empty pipeline not allowed"
 msgstr ""
 
@@ -1172,23 +1172,23 @@
 msgid "Pipeline construction is invalid, please add queues."
 msgstr ""
 
-#: libs/gst/base/gstbasesink.c:3144
+#: libs/gst/base/gstbasesink.c:3148
 msgid "A lot of buffers are being dropped."
 msgstr ""
 
-#: libs/gst/base/gstbasesink.c:3799
+#: libs/gst/base/gstbasesink.c:3806
 msgid "Internal data flow problem."
 msgstr ""
 
-#: libs/gst/base/gstbasesink.c:4633 libs/gst/base/gstbasesrc.c:2773
+#: libs/gst/base/gstbasesink.c:4640 libs/gst/base/gstbasesrc.c:2775
 msgid "Internal data flow error."
 msgstr ""
 
-#: libs/gst/base/gstbasesrc.c:2703
+#: libs/gst/base/gstbasesrc.c:2705
 msgid "Internal clock error."
 msgstr ""
 
-#: libs/gst/base/gstbasesrc.c:2731 plugins/elements/gstdownloadbuffer.c:850
+#: libs/gst/base/gstbasesrc.c:2733 plugins/elements/gstdownloadbuffer.c:850
 #: plugins/elements/gstdownloadbuffer.c:1275
 msgid "Failed to map buffer."
 msgstr ""
@@ -1274,11 +1274,11 @@
 msgid "File \"%s\" is a socket."
 msgstr ""
 
-#: plugins/elements/gstidentity.c:848
+#: plugins/elements/gstidentity.c:850
 msgid "Failed after iterations as requested."
 msgstr ""
 
-#: plugins/elements/gstidentity.c:1066
+#: plugins/elements/gstidentity.c:1068
 msgid "eos-after and error-after can't both be defined."
 msgstr ""
 
@@ -1316,84 +1316,84 @@
 msgid "%sImplemented Interfaces%s:\n"
 msgstr ""
 
-#: tools/gst-inspect.c:469
+#: tools/gst-inspect.c:470
 msgid "readable"
 msgstr ""
 
-#: tools/gst-inspect.c:474
+#: tools/gst-inspect.c:475
 msgid "writable"
 msgstr ""
 
-#: tools/gst-inspect.c:479
+#: tools/gst-inspect.c:480
 msgid "deprecated"
 msgstr ""
 
-#: tools/gst-inspect.c:483
+#: tools/gst-inspect.c:484
 msgid "controllable"
 msgstr ""
 
-#: tools/gst-inspect.c:488
+#: tools/gst-inspect.c:489
 msgid "conditionally available"
 msgstr ""
 
-#: tools/gst-inspect.c:494
+#: tools/gst-inspect.c:495
 msgid "changeable in NULL, READY, PAUSED or PLAYING state"
 msgstr ""
 
-#: tools/gst-inspect.c:497
+#: tools/gst-inspect.c:498
 msgid "changeable only in NULL, READY or PAUSED state"
 msgstr ""
 
-#: tools/gst-inspect.c:500
+#: tools/gst-inspect.c:501
 msgid "changeable only in NULL or READY state"
 msgstr ""
 
-#: tools/gst-inspect.c:1248
+#: tools/gst-inspect.c:1287
 msgid "Blacklisted files:"
 msgstr ""
 
-#: tools/gst-inspect.c:1263 tools/gst-inspect.c:1400
+#: tools/gst-inspect.c:1302 tools/gst-inspect.c:1439
 #, c-format
 msgid "%sTotal count%s: %s"
 msgstr ""
 
-#: tools/gst-inspect.c:1265
+#: tools/gst-inspect.c:1304
 #, c-format
 msgid "%d blacklisted file"
 msgid_plural "%d blacklisted files"
 msgstr[0] ""
 msgstr[1] ""
 
-#: tools/gst-inspect.c:1402
+#: tools/gst-inspect.c:1441
 #, c-format
 msgid "%d plugin"
 msgid_plural "%d plugins"
 msgstr[0] ""
 msgstr[1] ""
 
-#: tools/gst-inspect.c:1405
+#: tools/gst-inspect.c:1444
 #, c-format
 msgid "%d blacklist entry"
 msgid_plural "%d blacklist entries"
 msgstr[0] ""
 msgstr[1] ""
 
-#: tools/gst-inspect.c:1410
+#: tools/gst-inspect.c:1449
 #, c-format
 msgid "%d feature"
 msgid_plural "%d features"
 msgstr[0] ""
 msgstr[1] ""
 
-#: tools/gst-inspect.c:2114
+#: tools/gst-inspect.c:2154
 msgid "Print all elements"
 msgstr ""
 
-#: tools/gst-inspect.c:2116
+#: tools/gst-inspect.c:2156
 msgid "Print list of blacklisted files"
 msgstr ""
 
-#: tools/gst-inspect.c:2118
+#: tools/gst-inspect.c:2158
 msgid ""
 "Print a machine-parsable list of features the specified plugin or all "
 "plugins provide.\n"
@@ -1401,46 +1401,46 @@
 "automatic plugin installation mechanisms"
 msgstr ""
 
-#: tools/gst-inspect.c:2123
+#: tools/gst-inspect.c:2163
 msgid "List the plugin contents"
 msgstr ""
 
-#: tools/gst-inspect.c:2125
+#: tools/gst-inspect.c:2165
 msgid ""
 "A slashes ('/') separated list of types of elements (also known as klass) to "
 "list. (unordered)"
 msgstr ""
 
-#: tools/gst-inspect.c:2128
+#: tools/gst-inspect.c:2168
 msgid "Check if the specified element or plugin exists"
 msgstr ""
 
-#: tools/gst-inspect.c:2131
+#: tools/gst-inspect.c:2171
 msgid ""
 "When checking if an element or plugin exists, also check that its version is "
 "at least the version specified"
 msgstr ""
 
-#: tools/gst-inspect.c:2135
+#: tools/gst-inspect.c:2175
 msgid "Print supported URI schemes, with the elements that implement them"
 msgstr ""
 
-#: tools/gst-inspect.c:2140
+#: tools/gst-inspect.c:2180
 msgid ""
 "Disable colors in output. You can also achieve the same by setting "
 "'GST_INSPECT_NO_COLORS' environment variable to any value."
 msgstr ""
 
-#: tools/gst-inspect.c:2148
+#: tools/gst-inspect.c:2188
 msgid "Color output, even when not sending to a tty."
 msgstr ""
 
-#: tools/gst-inspect.c:2306
+#: tools/gst-inspect.c:2360
 #, c-format
 msgid "Could not load plugin file: %s\n"
 msgstr ""
 
-#: tools/gst-inspect.c:2312
+#: tools/gst-inspect.c:2366
 #, c-format
 msgid "No such element or plugin '%s'\n"
 msgstr ""
@@ -1666,48 +1666,48 @@
 "This option has no effect if the \"no-position\" option is specified"
 msgstr ""
 
-#: tools/gst-launch.c:1194
+#: tools/gst-launch.c:1203
 #, c-format
 msgid "ERROR: pipeline could not be constructed: %s.\n"
 msgstr ""
 
-#: tools/gst-launch.c:1198
+#: tools/gst-launch.c:1207
 msgid "ERROR: pipeline could not be constructed.\n"
 msgstr ""
 
-#: tools/gst-launch.c:1202
+#: tools/gst-launch.c:1211
 #, c-format
 msgid "WARNING: erroneous pipeline: %s\n"
 msgstr ""
 
-#: tools/gst-launch.c:1219
+#: tools/gst-launch.c:1228
 msgid "ERROR: the 'pipeline' element wasn't found.\n"
 msgstr ""
 
-#: tools/gst-launch.c:1268
+#: tools/gst-launch.c:1277
 msgid "Setting pipeline to PAUSED ...\n"
 msgstr ""
 
-#: tools/gst-launch.c:1273
+#: tools/gst-launch.c:1282
 msgid "Failed to set pipeline to PAUSED.\n"
 msgstr ""
 
-#: tools/gst-launch.c:1277
+#: tools/gst-launch.c:1286
 msgid "Pipeline is live and does not need PREROLL ...\n"
 msgstr ""
 
-#: tools/gst-launch.c:1281
+#: tools/gst-launch.c:1290
 msgid "Pipeline is PREROLLING ...\n"
 msgstr ""
 
-#: tools/gst-launch.c:1325
+#: tools/gst-launch.c:1334
 msgid "Execution ended after %"
 msgstr ""
 
-#: tools/gst-launch.c:1342
+#: tools/gst-launch.c:1351
 msgid "Setting pipeline to NULL ...\n"
 msgstr ""
 
-#: tools/gst-launch.c:1360
+#: tools/gst-launch.c:1369
 msgid "Freeing pipeline ...\n"
 msgstr ""
diff -Nru gstreamer1.0-1.22.0/po/gstreamer.pot gstreamer1.0-1.22.12/po/gstreamer.pot
--- gstreamer1.0-1.22.0/po/gstreamer.pot	2023-01-23 20:29:57.475900700 +0100
+++ gstreamer1.0-1.22.12/po/gstreamer.pot	2024-04-29 21:10:09.183505800 +0200
@@ -6,9 +6,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: gstreamer-1.22.0\n"
+"Project-Id-Version: gstreamer-1.22.12\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-23 19:29+0000\n"
+"POT-Creation-Date: 2024-04-29 20:10+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -1026,27 +1026,27 @@
 msgid ", "
 msgstr ""
 
-#: gst/gsturi.c:641 gst/gsturi.c:814
+#: gst/gsturi.c:645 gst/gsturi.c:818
 #, c-format
 msgid "Invalid URI: %s"
 msgstr ""
 
-#: gst/gsturi.c:656
+#: gst/gsturi.c:660
 #, c-format
 msgid "No URI handler for the %s protocol found"
 msgstr ""
 
-#: gst/gsturi.c:836
+#: gst/gsturi.c:840
 #, c-format
 msgid "URI scheme '%s' not supported"
 msgstr ""
 
-#: gst/gstutils.c:2679 tools/gst-launch.c:350
+#: gst/gstutils.c:2682 tools/gst-launch.c:350
 #, c-format
 msgid "ERROR: from element %s: %s\n"
 msgstr ""
 
-#: gst/gstutils.c:2681 tools/gst-launch.c:352 tools/gst-launch.c:714
+#: gst/gstutils.c:2684 tools/gst-launch.c:352 tools/gst-launch.c:714
 #, c-format
 msgid ""
 "Additional debug info:\n"
@@ -1071,7 +1071,7 @@
 msgstr ""
 
 #: gst/parse/grammar.y.in:438 gst/parse/grammar.y.in:624
-#: gst/parse/grammar.y.in:658 gst/parse/grammar.y.in:770
+#: gst/parse/grammar.y.in:658 gst/parse/grammar.y.in:772
 #, c-format
 msgid "no property \"%s\" in element \"%s\""
 msgstr ""
@@ -1091,7 +1091,7 @@
 msgid "no element \"%s\""
 msgstr ""
 
-#: gst/parse/grammar.y.in:613 gst/parse/grammar.y.in:793
+#: gst/parse/grammar.y.in:613 gst/parse/grammar.y.in:795
 #, c-format
 msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
 msgstr ""
@@ -1101,70 +1101,70 @@
 msgid "could not set property \"%s\" in child of element \"%s\" to \"%s\""
 msgstr ""
 
-#: gst/parse/grammar.y.in:854
+#: gst/parse/grammar.y.in:856
 msgid "Delayed linking failed."
 msgstr ""
 
-#: gst/parse/grammar.y.in:1067 gst/parse/grammar.y.in:1072
+#: gst/parse/grammar.y.in:1069 gst/parse/grammar.y.in:1074
 #, c-format
 msgid "could not link %s to %s, %s can't handle caps %s"
 msgstr ""
 
-#: gst/parse/grammar.y.in:1077
+#: gst/parse/grammar.y.in:1079
 #, c-format
 msgid "could not link %s to %s, neither element can handle caps %s"
 msgstr ""
 
-#: gst/parse/grammar.y.in:1081
+#: gst/parse/grammar.y.in:1083
 #, c-format
 msgid "could not link %s to %s with caps %s"
 msgstr ""
 
-#: gst/parse/grammar.y.in:1087
+#: gst/parse/grammar.y.in:1089
 #, c-format
 msgid "could not link %s to %s"
 msgstr ""
 
-#: gst/parse/grammar.y.in:1238
+#: gst/parse/grammar.y.in:1240
 #, c-format
 msgid "unexpected reference \"%s\" - ignoring"
 msgstr ""
 
-#: gst/parse/grammar.y.in:1244
+#: gst/parse/grammar.y.in:1246
 #, c-format
 msgid "unexpected pad-reference \"%s\" - ignoring"
 msgstr ""
 
-#: gst/parse/grammar.y.in:1276 gst/parse/grammar.y.in:1285
+#: gst/parse/grammar.y.in:1278 gst/parse/grammar.y.in:1287
 #, c-format
 msgid "could not parse caps \"%s\""
 msgstr ""
 
-#: gst/parse/grammar.y.in:1313
+#: gst/parse/grammar.y.in:1315
 #, c-format
 msgid "no sink element for URI \"%s\""
 msgstr ""
 
-#: gst/parse/grammar.y.in:1332
+#: gst/parse/grammar.y.in:1334
 #, c-format
 msgid "no source element for URI \"%s\""
 msgstr ""
 
-#: gst/parse/grammar.y.in:1422
+#: gst/parse/grammar.y.in:1424
 msgid "syntax error"
 msgstr ""
 
-#: gst/parse/grammar.y.in:1445
+#: gst/parse/grammar.y.in:1447
 #, c-format
 msgid "specified empty bin \"%s\", not allowed"
 msgstr ""
 
-#: gst/parse/grammar.y.in:1455
+#: gst/parse/grammar.y.in:1457
 #, c-format
 msgid "no bin \"%s\", unpacking elements"
 msgstr ""
 
-#: gst/parse/grammar.y.in:1486
+#: gst/parse/grammar.y.in:1488
 msgid "empty pipeline not allowed"
 msgstr ""
 
@@ -1172,23 +1172,23 @@
 msgid "Pipeline construction is invalid, please add queues."
 msgstr ""
 
-#: libs/gst/base/gstbasesink.c:3144
+#: libs/gst/base/gstbasesink.c:3148
 msgid "A lot of buffers are being dropped."
 msgstr ""
 
-#: libs/gst/base/gstbasesink.c:3799
+#: libs/gst/base/gstbasesink.c:3806
 msgid "Internal data flow problem."
 msgstr ""
 
-#: libs/gst/base/gstbasesink.c:4633 libs/gst/base/gstbasesrc.c:2773
+#: libs/gst/base/gstbasesink.c:4640 libs/gst/base/gstbasesrc.c:2775
 msgid "Internal data flow error."
 msgstr ""
 
-#: libs/gst/base/gstbasesrc.c:2703
+#: libs/gst/base/gstbasesrc.c:2705
 msgid "Internal clock error."
 msgstr ""
 
-#: libs/gst/base/gstbasesrc.c:2731 plugins/elements/gstdownloadbuffer.c:850
+#: libs/gst/base/gstbasesrc.c:2733 plugins/elements/gstdownloadbuffer.c:850
 #: plugins/elements/gstdownloadbuffer.c:1275
 msgid "Failed to map buffer."
 msgstr ""
@@ -1274,11 +1274,11 @@
 msgid "File \"%s\" is a socket."
 msgstr ""
 
-#: plugins/elements/gstidentity.c:848
+#: plugins/elements/gstidentity.c:850
 msgid "Failed after iterations as requested."
 msgstr ""
 
-#: plugins/elements/gstidentity.c:1066
+#: plugins/elements/gstidentity.c:1068
 msgid "eos-after and error-after can't both be defined."
 msgstr ""
 
@@ -1316,84 +1316,84 @@
 msgid "%sImplemented Interfaces%s:\n"
 msgstr ""
 
-#: tools/gst-inspect.c:469
+#: tools/gst-inspect.c:470
 msgid "readable"
 msgstr ""
 
-#: tools/gst-inspect.c:474
+#: tools/gst-inspect.c:475
 msgid "writable"
 msgstr ""
 
-#: tools/gst-inspect.c:479
+#: tools/gst-inspect.c:480
 msgid "deprecated"
 msgstr ""
 
-#: tools/gst-inspect.c:483
+#: tools/gst-inspect.c:484
 msgid "controllable"
 msgstr ""
 
-#: tools/gst-inspect.c:488
+#: tools/gst-inspect.c:489
 msgid "conditionally available"
 msgstr ""
 
-#: tools/gst-inspect.c:494
+#: tools/gst-inspect.c:495
 msgid "changeable in NULL, READY, PAUSED or PLAYING state"
 msgstr ""
 
-#: tools/gst-inspect.c:497
+#: tools/gst-inspect.c:498
 msgid "changeable only in NULL, READY or PAUSED state"
 msgstr ""
 
-#: tools/gst-inspect.c:500
+#: tools/gst-inspect.c:501
 msgid "changeable only in NULL or READY state"
 msgstr ""
 
-#: tools/gst-inspect.c:1248
+#: tools/gst-inspect.c:1287
 msgid "Blacklisted files:"
 msgstr ""
 
-#: tools/gst-inspect.c:1263 tools/gst-inspect.c:1400
+#: tools/gst-inspect.c:1302 tools/gst-inspect.c:1439
 #, c-format
 msgid "%sTotal count%s: %s"
 msgstr ""
 
-#: tools/gst-inspect.c:1265
+#: tools/gst-inspect.c:1304
 #, c-format
 msgid "%d blacklisted file"
 msgid_plural "%d blacklisted files"
 msgstr[0] ""
 msgstr[1] ""
 
-#: tools/gst-inspect.c:1402
+#: tools/gst-inspect.c:1441
 #, c-format
 msgid "%d plugin"
 msgid_plural "%d plugins"
 msgstr[0] ""
 msgstr[1] ""
 
-#: tools/gst-inspect.c:1405
+#: tools/gst-inspect.c:1444
 #, c-format
 msgid "%d blacklist entry"
 msgid_plural "%d blacklist entries"
 msgstr[0] ""
 msgstr[1] ""
 
-#: tools/gst-inspect.c:1410
+#: tools/gst-inspect.c:1449
 #, c-format
 msgid "%d feature"
 msgid_plural "%d features"
 msgstr[0] ""
 msgstr[1] ""
 
-#: tools/gst-inspect.c:2114
+#: tools/gst-inspect.c:2154
 msgid "Print all elements"
 msgstr ""
 
-#: tools/gst-inspect.c:2116
+#: tools/gst-inspect.c:2156
 msgid "Print list of blacklisted files"
 msgstr ""
 
-#: tools/gst-inspect.c:2118
+#: tools/gst-inspect.c:2158
 msgid ""
 "Print a machine-parsable list of features the specified plugin or all "
 "plugins provide.\n"
@@ -1401,46 +1401,46 @@
 "automatic plugin installation mechanisms"
 msgstr ""
 
-#: tools/gst-inspect.c:2123
+#: tools/gst-inspect.c:2163
 msgid "List the plugin contents"
 msgstr ""
 
-#: tools/gst-inspect.c:2125
+#: tools/gst-inspect.c:2165
 msgid ""
 "A slashes ('/') separated list of types of elements (also known as klass) to "
 "list. (unordered)"
 msgstr ""
 
-#: tools/gst-inspect.c:2128
+#: tools/gst-inspect.c:2168
 msgid "Check if the specified element or plugin exists"
 msgstr ""
 
-#: tools/gst-inspect.c:2131
+#: tools/gst-inspect.c:2171
 msgid ""
 "When checking if an element or plugin exists, also check that its version is "
 "at least the version specified"
 msgstr ""
 
-#: tools/gst-inspect.c:2135
+#: tools/gst-inspect.c:2175
 msgid "Print supported URI schemes, with the elements that implement them"
 msgstr ""
 
-#: tools/gst-inspect.c:2140
+#: tools/gst-inspect.c:2180
 msgid ""
 "Disable colors in output. You can also achieve the same by setting "
 "'GST_INSPECT_NO_COLORS' environment variable to any value."
 msgstr ""
 
-#: tools/gst-inspect.c:2148
+#: tools/gst-inspect.c:2188
 msgid "Color output, even when not sending to a tty."
 msgstr ""
 
-#: tools/gst-inspect.c:2306
+#: tools/gst-inspect.c:2360
 #, c-format
 msgid "Could not load plugin file: %s\n"
 msgstr ""
 
-#: tools/gst-inspect.c:2312
+#: tools/gst-inspect.c:2366
 #, c-format
 msgid "No such element or plugin '%s'\n"
 msgstr ""
@@ -1666,48 +1666,48 @@
 "This option has no effect if the \"no-position\" option is specified"
 msgstr ""
 
-#: tools/gst-launch.c:1194
+#: tools/gst-launch.c:1203
 #, c-format
 msgid "ERROR: pipeline could not be constructed: %s.\n"
 msgstr ""
 
-#: tools/gst-launch.c:1198
+#: tools/gst-launch.c:1207
 msgid "ERROR: pipeline could not be constructed.\n"
 msgstr ""
 
-#: tools/gst-launch.c:1202
+#: tools/gst-launch.c:1211
 #, c-format
 msgid "WARNING: erroneous pipeline: %s\n"
 msgstr ""
 
-#: tools/gst-launch.c:1219
+#: tools/gst-launch.c:1228
 msgid "ERROR: the 'pipeline' element wasn't found.\n"
 msgstr ""
 
-#: tools/gst-launch.c:1268
+#: tools/gst-launch.c:1277
 msgid "Setting pipeline to PAUSED ...\n"
 msgstr ""
 
-#: tools/gst-launch.c:1273
+#: tools/gst-launch.c:1282
 msgid "Failed to set pipeline to PAUSED.\n"
 msgstr ""
 
-#: tools/gst-launch.c:1277
+#: tools/gst-launch.c:1286
 msgid "Pipeline is live and does not need PREROLL ...\n"
 msgstr ""
 
-#: tools/gst-launch.c:1281
+#: tools/gst-launch.c:1290
 msgid "Pipeline is PREROLLING ...\n"
 msgstr ""
 
-#: tools/gst-launch.c:1325
+#: tools/gst-launch.c:1334
 msgid "Execution ended after %"
 msgstr ""
 
-#: tools/gst-launch.c:1342
+#: tools/gst-launch.c:1351
 msgid "Setting pipeline to NULL ...\n"
 msgstr ""
 
-#: tools/gst-launch.c:1360
+#: tools/gst-launch.c:1369
 msgid "Freeing pipeline ...\n"
 msgstr ""
diff -Nru gstreamer1.0-1.22.0/po/sr.po gstreamer1.0-1.22.12/po/sr.po
--- gstreamer1.0-1.22.0/po/sr.po	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/po/sr.po	2024-04-29 21:09:52.000000000 +0200
@@ -2,13 +2,14 @@
 # Copyright © 2020 Free Software Foundation, Inc.
 # This file is distributed under the same license as the gstreamer package.
 # Danilo Segan <dsegan@gmx.net>, 2004-2005.
-# Мирослав Николић <miroslavnikolic@rocketmail.com>, 2011–2021.
+# Мирослав Николић <miroslavnikolic@rocketmail.com>, 2011–2023.
+#
 msgid ""
 msgstr ""
-"Project-Id-Version: gstreamer-1.19.2\n"
+"Project-Id-Version: gstreamer-1.21.90\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-01-11 15:40+0000\n"
-"PO-Revision-Date: 2021-10-01 22:08+0200\n"
+"POT-Creation-Date: 2023-04-10 13:49+0100\n"
+"PO-Revision-Date: 2023-02-26 08:09+0100\n"
 "Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
 "Language-Team: Serbian <(nothing)>\n"
 "Language: sr\n"
@@ -19,6 +20,7 @@
 "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 "X-Bugs: Report translation errors to the Language-Team address.\n"
 "X-Project-Style: gnome\n"
+"X-Generator: Gtranslator 41.0\n"
 
 msgid "Print the GStreamer version"
 msgstr "Исписује издање Гстримера"
@@ -873,7 +875,7 @@
 msgstr "веза нема усклађивање [source=%s@%p]"
 
 msgid "No such property."
-msgstr ""
+msgstr "Нема таквог својства."
 
 #, c-format
 msgid "no property \"%s\" in element \"%s\""
@@ -895,9 +897,9 @@
 msgid "could not set property \"%s\" in element \"%s\" to \"%s\""
 msgstr "не могу да поставим особину „%s“ у елементу „%s“ на „%s“"
 
-#, fuzzy, c-format
+#, c-format
 msgid "could not set property \"%s\" in child of element \"%s\" to \"%s\""
-msgstr "не могу да поставим особину „%s“ у елементу „%s“ на „%s“"
+msgstr "не могу да поставим особину „%s“ у породу елемента „%s“ на „%s“"
 
 msgid "Delayed linking failed."
 msgstr "Одложено повезивање није успело."
diff -Nru gstreamer1.0-1.22.0/README.md gstreamer1.0-1.22.12/README.md
--- gstreamer1.0-1.22.0/README.md	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/README.md	2024-04-29 21:09:52.000000000 +0200
@@ -1,4 +1,4 @@
-GStreamer 1.20.x stable series
+GStreamer 1.22.x stable series
 
 WHAT IT IS
 ----------
diff -Nru gstreamer1.0-1.22.0/RELEASE gstreamer1.0-1.22.12/RELEASE
--- gstreamer1.0-1.22.0/RELEASE	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/RELEASE	2024-04-29 21:09:52.000000000 +0200
@@ -1,4 +1,4 @@
-This is GStreamer core 1.22.0.
+This is GStreamer core 1.22.12.
 
 The GStreamer team is thrilled to announce a new major feature release
 of your favourite cross-platform multimedia framework!
diff -Nru gstreamer1.0-1.22.0/tests/check/elements/filesink.c gstreamer1.0-1.22.12/tests/check/elements/filesink.c
--- gstreamer1.0-1.22.0/tests/check/elements/filesink.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/tests/check/elements/filesink.c	2024-04-29 21:09:52.000000000 +0200
@@ -24,6 +24,7 @@
 #endif
 
 #include <stdio.h>
+#include <string.h>
 
 #include <glib.h>
 #include <glib/gstdio.h>
@@ -484,6 +485,86 @@
 
 GST_END_TEST;
 
+static void
+test_buffered_write (guint num_buf, guint num_mem_per_buf)
+{
+  GstElement *filesink;
+  guint i, j;
+  gchar *tmp_fn;
+  GstSegment segment;
+  const gsize size_per_mem = 4;
+  gsize total_size = size_per_mem * num_buf * num_mem_per_buf;
+  GStatBuf stat_buf;
+
+  tmp_fn = create_temporary_file ();
+  if (!tmp_fn)
+    return;
+
+  filesink = setup_filesink ();
+  g_object_set (filesink, "location", tmp_fn, NULL);
+
+  fail_unless_equals_int (gst_element_set_state (filesink, GST_STATE_PLAYING),
+      GST_STATE_CHANGE_ASYNC);
+
+  fail_unless (gst_pad_push_event (mysrcpad,
+          gst_event_new_stream_start ("test")));
+
+  gst_segment_init (&segment, GST_FORMAT_BYTES);
+  fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment)));
+
+  for (i = 0; i < num_buf; i++) {
+    GstBuffer *buf = gst_buffer_new ();
+    for (j = 0; j < num_mem_per_buf; j++) {
+      GstMemory *mem = gst_allocator_alloc (NULL, size_per_mem, NULL);
+      GstMapInfo info;
+      fail_unless (mem != NULL);
+
+      fail_unless (gst_memory_map (mem, &info, GST_MAP_WRITE));
+      memset (info.data, 0, info.size);
+      gst_memory_unmap (mem, &info);
+
+      gst_buffer_append_memory (buf, mem);
+    }
+
+    fail_unless_equals_int (gst_pad_push (mysrcpad, buf), GST_FLOW_OK);
+  }
+
+  fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()));
+
+  fail_unless_equals_int (gst_element_set_state (filesink, GST_STATE_NULL),
+      GST_STATE_CHANGE_SUCCESS);
+
+  cleanup_filesink (filesink);
+
+  if (g_stat (tmp_fn, &stat_buf) == 0)
+    fail_unless_equals_int64 (stat_buf.st_size, total_size);
+
+  g_remove (tmp_fn);
+  g_free (tmp_fn);
+}
+
+GST_START_TEST (test_buffered_write_17_1)
+{
+  test_buffered_write (17, 1);
+}
+
+GST_END_TEST;
+
+
+GST_START_TEST (test_buffered_write_9_2)
+{
+  test_buffered_write (9, 2);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_buffered_write_6_3)
+{
+  test_buffered_write (6, 3);
+}
+
+GST_END_TEST;
+
 static Suite *
 filesink_suite (void)
 {
@@ -496,6 +577,9 @@
   tcase_add_test (tc_chain, test_uri_interface);
   tcase_add_test (tc_chain, test_seeking);
   tcase_add_test (tc_chain, test_flush);
+  tcase_add_test (tc_chain, test_buffered_write_17_1);
+  tcase_add_test (tc_chain, test_buffered_write_9_2);
+  tcase_add_test (tc_chain, test_buffered_write_6_3);
 
   return s;
 }
diff -Nru gstreamer1.0-1.22.0/tests/check/gst/gstbufferpool.c gstreamer1.0-1.22.12/tests/check/gst/gstbufferpool.c
--- gstreamer1.0-1.22.0/tests/check/gst/gstbufferpool.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/tests/check/gst/gstbufferpool.c	2024-04-29 21:09:52.000000000 +0200
@@ -336,6 +336,114 @@
 
 GST_END_TEST;
 
+GST_START_TEST (test_parent_meta)
+{
+  GstBufferPool *pool;
+  GstBuffer *buf1, *buf2, *buf3;
+  GstMemory *mem;
+  gint buf1_dcount = 0;
+  gint buf2_dcount = 0;
+
+  pool = create_pool (1, 0, 0);
+  fail_unless (pool);
+  gst_buffer_pool_set_active (pool, TRUE);
+
+  fail_unless (gst_buffer_pool_acquire_buffer (pool, &buf1,
+          NULL) == GST_FLOW_OK);
+  buffer_track_destroy (buf1, &buf1_dcount);
+
+  /* Create a 2nd buffer reffing the same memory. Set parent meta to make sure
+   * buf1 does not return to pool until buf2 is destroyed. */
+  mem = gst_buffer_get_memory (buf1, 0);
+  buf2 = gst_buffer_new ();
+  gst_buffer_append_memory (buf2, mem);
+  gst_buffer_add_parent_buffer_meta (buf2, buf1);
+  buffer_track_destroy (buf2, &buf2_dcount);
+
+  /* buf1 is still reffed by the meta */
+  gst_buffer_unref (buf1);
+  fail_unless_equals_int (buf1_dcount, 0);
+  fail_unless_equals_int (buf2_dcount, 0);
+
+  /* buf2 gets destroyed and buf1 returns to pool */
+  gst_buffer_unref (buf2);
+  fail_unless_equals_int (buf1_dcount, 0);
+  fail_unless_equals_int (buf2_dcount, 1);
+
+  /* buf1 should be recycled with the same memory */
+  fail_unless (gst_buffer_pool_acquire_buffer (pool, &buf3,
+          NULL) == GST_FLOW_OK);
+  fail_unless_equals_pointer (buf1, buf3);
+  fail_unless_equals_pointer (mem, gst_buffer_peek_memory (buf3, 0));
+
+  gst_buffer_unref (buf3);
+  fail_unless_equals_int (buf1_dcount, 0);
+  fail_unless_equals_int (buf2_dcount, 1);
+
+  gst_buffer_pool_set_active (pool, FALSE);
+  gst_object_unref (pool);
+  fail_unless_equals_int (buf1_dcount, 1);
+  fail_unless_equals_int (buf2_dcount, 1);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_make_writable_parent_meta)
+{
+  GstBufferPool *pool;
+  GstBuffer *buf1, *buf2, *buf3;
+  GstMemory *mem1, *mem2;
+  gint buf1_dcount = 0;
+  gint buf2_dcount = 0;
+
+  pool = create_pool (1, 0, 0);
+  fail_unless (pool);
+  gst_buffer_pool_set_active (pool, TRUE);
+
+  fail_unless (gst_buffer_pool_acquire_buffer (pool, &buf1,
+          NULL) == GST_FLOW_OK);
+  buffer_track_destroy (buf1, &buf1_dcount);
+
+  /* Make buf1 not writable and copy it */
+  gst_buffer_ref (buf1);
+  buf2 = gst_buffer_make_writable (buf1);
+  buffer_track_destroy (buf2, &buf2_dcount);
+  fail_unless (buf1 != buf2);
+  fail_unless (gst_buffer_is_writable (buf2));
+
+  /* buf1 and buf2 should be sharing the same memory */
+  mem1 = gst_buffer_peek_memory (buf1, 0);
+  mem2 = gst_buffer_peek_memory (buf2, 0);
+  fail_unless_equals_pointer (mem1, mem2);
+
+  /* buf1 is still reffed by the meta */
+  gst_buffer_unref (buf1);
+  fail_unless_equals_int (buf1_dcount, 0);
+  fail_unless_equals_int (buf2_dcount, 0);
+
+  /* buf2 gets destroyed and buf1 returns to pool */
+  gst_buffer_unref (buf2);
+  fail_unless_equals_int (buf1_dcount, 0);
+  fail_unless_equals_int (buf2_dcount, 1);
+
+  /* buf1 should be recycled with the same memory */
+  fail_unless (gst_buffer_pool_acquire_buffer (pool, &buf3,
+          NULL) == GST_FLOW_OK);
+  fail_unless_equals_pointer (buf1, buf3);
+  fail_unless_equals_pointer (mem1, gst_buffer_peek_memory (buf3, 0));
+
+  gst_buffer_unref (buf3);
+  fail_unless_equals_int (buf1_dcount, 0);
+  fail_unless_equals_int (buf2_dcount, 1);
+
+  gst_buffer_pool_set_active (pool, FALSE);
+  gst_object_unref (pool);
+  fail_unless_equals_int (buf1_dcount, 1);
+  fail_unless_equals_int (buf2_dcount, 1);
+}
+
+GST_END_TEST;
+
 static Suite *
 gst_buffer_pool_suite (void)
 {
@@ -355,6 +463,8 @@
   tcase_add_test (tc_chain, test_pool_config_validate);
   tcase_add_test (tc_chain, test_flushing_pool_returns_flushing);
   tcase_add_test (tc_chain, test_no_deadlock_for_buffer_discard);
+  tcase_add_test (tc_chain, test_parent_meta);
+  tcase_add_test (tc_chain, test_make_writable_parent_meta);
 
   return s;
 }
diff -Nru gstreamer1.0-1.22.0/tests/check/libs/aggregator.c gstreamer1.0-1.22.12/tests/check/libs/aggregator.c
--- gstreamer1.0-1.22.0/tests/check/libs/aggregator.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/tests/check/libs/aggregator.c	2024-04-29 21:09:52.000000000 +0200
@@ -166,6 +166,24 @@
 #define gst_test_aggregator_parent_class parent_class
 G_DEFINE_TYPE (GstTestAggregator, gst_test_aggregator, GST_TYPE_AGGREGATOR);
 
+static gboolean gst_aggregator_test_slow_down_sink_query = FALSE;
+
+static gboolean
+gst_aggregator_test_slow_sink_query (GstAggregator * self,
+    GstAggregatorPad * aggpad, GstQuery * query)
+{
+  GST_DEBUG ("Handling query %" GST_PTR_FORMAT, query);
+  if (GST_QUERY_IS_SERIALIZED (query)) {
+    GstStructure *s = gst_query_writable_structure (query);
+
+    if (gst_aggregator_test_slow_down_sink_query)
+      g_usleep (G_TIME_SPAN_MILLISECOND * 10);
+    gst_structure_set (s, "some-int", G_TYPE_INT, 123, NULL);
+    GST_DEBUG ("Written to the query %" GST_PTR_FORMAT, query);
+  }
+  return GST_AGGREGATOR_CLASS (parent_class)->sink_query (self, aggpad, query);
+}
+
 static void
 gst_test_aggregator_class_init (GstTestAggregatorClass * klass)
 {
@@ -193,6 +211,7 @@
       GST_DEBUG_FUNCPTR (gst_test_aggregator_aggregate);
 
   base_aggregator_class->get_next_time = gst_aggregator_simple_get_next_time;
+  base_aggregator_class->sink_query = gst_aggregator_test_slow_sink_query;
 }
 
 static void
@@ -646,6 +665,60 @@
 
 GST_END_TEST;
 
+GST_START_TEST (test_aggregate_queries_robustness)
+{
+  GThread *thread1;
+  ChainData data1 = { 0, };
+  TestData test = { 0, };
+  GstCaps *caps;
+  gint64 start_time;
+
+  gst_aggregator_test_slow_down_sink_query = TRUE;
+
+  _test_data_init (&test, FALSE);
+
+  caps = gst_caps_new_empty_simple ("foo/x-bar");
+  _chain_data_init (&data1, test.aggregator,
+      gst_query_new_allocation (caps, FALSE),
+      gst_query_new_allocation (caps, FALSE),
+      gst_query_new_allocation (caps, FALSE),
+      gst_query_new_allocation (caps, FALSE),
+      gst_query_new_allocation (caps, FALSE),
+      gst_query_new_allocation (caps, FALSE),
+      gst_query_new_allocation (caps, FALSE),
+      gst_query_new_allocation (caps, FALSE),
+      gst_query_new_allocation (caps, FALSE),
+      gst_query_new_allocation (caps, FALSE),
+      gst_query_new_allocation (caps, FALSE),
+      gst_query_new_allocation (caps, FALSE),
+      gst_query_new_allocation (caps, FALSE),
+      gst_query_new_allocation (caps, FALSE),
+      gst_query_new_allocation (caps, FALSE),
+      gst_query_new_allocation (caps, FALSE),
+      gst_query_new_allocation (caps, FALSE), NULL);
+  gst_caps_unref (caps);
+
+  thread1 = g_thread_try_new ("gst-check", push_data, &data1, NULL);
+  g_usleep (G_TIME_SPAN_MILLISECOND * 5);
+  for (start_time = g_get_monotonic_time ();
+      start_time + G_TIME_SPAN_SECOND > g_get_monotonic_time ();
+      g_usleep (G_TIME_SPAN_MILLISECOND)) {
+    fail_unless (gst_element_send_event (test.aggregator,
+            gst_event_new_flush_start ()));
+    fail_unless (gst_element_send_event (test.aggregator,
+            gst_event_new_flush_stop (TRUE)));
+  }
+
+  g_thread_join (thread1);
+
+  _chain_data_clear (&data1);
+  _test_data_clear (&test);
+
+  gst_aggregator_test_slow_down_sink_query = FALSE;
+}
+
+GST_END_TEST;
+
 #define NUM_BUFFERS 3
 static void
 handoff (GstElement * fakesink, GstBuffer * buf, GstPad * pad, guint * count)
@@ -1398,6 +1471,7 @@
   tcase_add_test (general, test_aggregate_gap);
   tcase_add_test (general, test_aggregate_handle_events);
   tcase_add_test (general, test_aggregate_handle_queries);
+  tcase_add_test (general, test_aggregate_queries_robustness);
   tcase_add_test (general, test_flushing_seek);
   tcase_add_test (general, test_infinite_seek);
   tcase_add_test (general, test_infinite_seek_50_src);
diff -Nru gstreamer1.0-1.22.0/tests/check/libs/basesink.c gstreamer1.0-1.22.12/tests/check/libs/basesink.c
--- gstreamer1.0-1.22.0/tests/check/libs/basesink.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/tests/check/libs/basesink.c	2024-04-29 21:09:52.000000000 +0200
@@ -282,6 +282,69 @@
 
 GST_END_TEST;
 
+GST_START_TEST (basesink_stream_start_after_eos)
+{
+  GstElement *pipeline, *sink;
+  GstPad *pad;
+  GstEvent *ev;
+  GstSegment segment;
+  GstBuffer *buf;
+  GstFlowReturn ret;
+
+  sink = gst_element_factory_make ("fakesink", "sink");
+  g_object_set (sink, "async", FALSE, "sync", FALSE, NULL);
+  pad = gst_element_get_static_pad (sink, "sink");
+
+  pipeline = gst_pipeline_new (NULL);
+
+  gst_bin_add (GST_BIN (pipeline), sink);
+
+  fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING),
+      GST_STATE_CHANGE_SUCCESS);
+
+  /* Normal data flow and EOS */
+  ev = gst_event_new_stream_start ("test");
+  fail_unless (gst_pad_send_event (pad, ev));
+
+  gst_segment_init (&segment, GST_FORMAT_TIME);
+  ev = gst_event_new_segment (&segment);
+  fail_unless (gst_pad_send_event (pad, ev));
+
+  buf = gst_buffer_new_and_alloc (4);
+  ret = gst_pad_chain (pad, buf);
+  fail_unless (ret == GST_FLOW_OK);
+
+  ev = gst_event_new_eos ();
+  fail_unless (gst_pad_send_event (pad, ev));
+
+  /* After EOS event, flow return should be EOS */
+  buf = gst_buffer_new_and_alloc (4);
+  ret = gst_pad_chain (pad, buf);
+  fail_unless (ret == GST_FLOW_EOS);
+
+  /* New data flow with new stream-start */
+  ev = gst_event_new_stream_start ("test");
+  fail_unless (gst_pad_send_event (pad, ev));
+
+  gst_segment_init (&segment, GST_FORMAT_TIME);
+  ev = gst_event_new_segment (&segment);
+  fail_unless (gst_pad_send_event (pad, ev));
+
+  buf = gst_buffer_new_and_alloc (4);
+  ret = gst_pad_chain (pad, buf);
+  fail_unless (ret == GST_FLOW_OK);
+
+  ev = gst_event_new_eos ();
+  fail_unless (gst_pad_send_event (pad, ev));
+
+  fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_NULL),
+      GST_STATE_CHANGE_SUCCESS);
+  gst_object_unref (pad);
+  gst_object_unref (pipeline);
+}
+
+GST_END_TEST;
+
 static Suite *
 gst_basesrc_suite (void)
 {
@@ -294,6 +357,7 @@
   tcase_add_test (tc, basesink_test_gap);
   tcase_add_test (tc, basesink_test_eos_after_playing);
   tcase_add_test (tc, basesink_position_query_handles_segment_offset);
+  tcase_add_test (tc, basesink_stream_start_after_eos);
 
   return s;
 }
diff -Nru gstreamer1.0-1.22.0/tests/check/tools/gstinspect.c gstreamer1.0-1.22.12/tests/check/tools/gstinspect.c
--- gstreamer1.0-1.22.0/tests/check/tools/gstinspect.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/tests/check/tools/gstinspect.c	2024-04-29 21:09:52.000000000 +0200
@@ -30,10 +30,27 @@
 #include "../../tools/gst-inspect.c"
 #undef main
 
+// A plugin whose version does not match the gstreamer major/minor
+// see https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6191
+#define TEST_PLUGIN_VERSION "0.1.0"
+#define TEST_ELEMENT_NAME "local_test_bin"
+static gboolean
+test_plugin_init (G_GNUC_UNUSED GstPlugin * plugin)
+{
+  gst_element_register (plugin, TEST_ELEMENT_NAME, GST_RANK_NONE, GST_TYPE_BIN);
+  return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR,
+    test_plugin, "Test Plugin", test_plugin_init, TEST_PLUGIN_VERSION,
+    "LGPL", "gsttestplugin", "testing");
+
 GST_START_TEST (test_exists)
 {
 #define ARGV_LEN (G_N_ELEMENTS (argv) - 1)
 
+  gst_plugin_test_plugin_register ();
+
   {
     const gchar *argv[] = { "gst-inspect-1.0", "--exists", "foo", NULL };
 
@@ -45,6 +62,16 @@
     fail_unless_equals_int (gst_inspect_main (ARGV_LEN, (gchar **) argv), 0);
   }
   {
+    // --exists should work even if the plugin's version does not equal
+    // the gstreamer version (i.e., the --atleast-version check is not
+    // implicitly enforced when not present).
+    const gchar *argv[] = { "gst-inspect-1.0", "--exists",
+      TEST_ELEMENT_NAME, NULL
+    };
+
+    fail_unless_equals_int (gst_inspect_main (ARGV_LEN, (gchar **) argv), 0);
+  }
+  {
     const gchar *argv[] = { "gst-inspect-1.0", "--exists",
       "--atleast-version=" VERSION, "bin", NULL
     };
@@ -77,28 +104,41 @@
       "--atleast-version=2.0", "bin", NULL
     };
 
-    fail_unless_equals_int (gst_inspect_main (ARGV_LEN, (gchar **) argv), 1);
+    fail_unless_equals_int (gst_inspect_main (ARGV_LEN, (gchar **) argv), 2);
   }
   {
     const gchar *argv[] = { "gst-inspect-1.0", "--exists",
       "--atleast-version=2.0.0", "bin", NULL
     };
 
-    fail_unless_equals_int (gst_inspect_main (ARGV_LEN, (gchar **) argv), 1);
+    fail_unless_equals_int (gst_inspect_main (ARGV_LEN, (gchar **) argv), 2);
   }
   {
     const gchar *argv[] = { "gst-inspect-1.0", "--exists",
       "--atleast-version=1.44", "bin", NULL
     };
 
-    fail_unless_equals_int (gst_inspect_main (ARGV_LEN, (gchar **) argv), 1);
+    fail_unless_equals_int (gst_inspect_main (ARGV_LEN, (gchar **) argv), 2);
   }
   {
     const gchar *argv[] = { "gst-inspect-1.0", "--exists",
       "--atleast-version=1.60.4", "bin", NULL
     };
 
-    fail_unless_equals_int (gst_inspect_main (ARGV_LEN, (gchar **) argv), 1);
+    fail_unless_equals_int (gst_inspect_main (ARGV_LEN, (gchar **) argv), 2);
+  }
+  {
+    // The 'atleast-version' supplied here will not match the test plugin's
+    // version, above, so the test case should return "2" because the test
+    // plugin's 0.1.0 will not meet the minimum version specified by the arg.
+    gchar *atleast = g_strdup_printf ("--atleast-version=%d.%d",
+        GST_VERSION_MAJOR, GST_VERSION_MINOR);
+    const gchar *argv[] = { "gst-inspect-1.0", "--exists",
+      atleast, TEST_ELEMENT_NAME, NULL
+    };
+
+    fail_unless_equals_int (gst_inspect_main (ARGV_LEN, (gchar **) argv), 2);
+    g_free (atleast);
   }
   {
     /* check for plugin should fail like this */
diff -Nru gstreamer1.0-1.22.0/tools/gst-inspect.c gstreamer1.0-1.22.12/tools/gst-inspect.c
--- gstreamer1.0-1.22.0/tools/gst-inspect.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/tools/gst-inspect.c	2024-04-29 21:09:52.000000000 +0200
@@ -432,6 +432,7 @@
       (GCompareDataFunc) sort_gparamspecs, NULL);
 
   n_print ("%s%s%s:\n", HEADING_COLOR, desc, RESET_COLOR);
+  n_print ("\n");
 
   push_indent ();
 
@@ -780,6 +781,8 @@
     pop_indent_n (11);
 
     g_value_reset (&value);
+
+    n_print ("\n");
   }
   if (num_properties == 0)
     n_print ("%snone%s\n", PROP_VALUE_COLOR, RESET_COLOR);
@@ -1065,6 +1068,21 @@
   return FALSE;
 }
 
+static const gchar *
+pretty_type_name (GType type, const gchar ** p_pmark)
+{
+  if (type == G_TYPE_STRING) {
+    *p_pmark = " * ";
+    return "gchar";
+  } else if (type == G_TYPE_STRV) {
+    *p_pmark = " ** ";
+    return "gchar";
+  } else {
+    *p_pmark = gtype_needs_ptr_marker (type) ? " * " : " ";
+    return g_type_name (type);
+  }
+}
+
 static void
 print_signal_info (GstElement * element)
 {
@@ -1077,11 +1095,13 @@
   GSList *found_signals, *l;
 
   for (k = 0; k < 2; k++) {
+    gboolean want_actions = (k == 1);
+
     found_signals = NULL;
 
     /* For elements that have sometimes pads, also list a few useful GstElement
      * signals. Put these first, so element-specific ones come later. */
-    if (k == 0 && has_sometimes_template (element)) {
+    if (!want_actions && has_sometimes_template (element)) {
       query = g_new0 (GSignalQuery, 1);
       g_signal_query (g_signal_lookup ("pad-added", GST_TYPE_ELEMENT), query);
       found_signals = g_slist_append (found_signals, query);
@@ -1106,8 +1126,8 @@
         query = g_new0 (GSignalQuery, 1);
         g_signal_query (signals[i], query);
 
-        if ((k == 0 && !(query->signal_flags & G_SIGNAL_ACTION)) ||
-            (k == 1 && (query->signal_flags & G_SIGNAL_ACTION)))
+        if ((!want_actions && !(query->signal_flags & G_SIGNAL_ACTION)) ||
+            (want_actions && (query->signal_flags & G_SIGNAL_ACTION)))
           found_signals = g_slist_append (found_signals, query);
         else
           g_free (query);
@@ -1118,10 +1138,11 @@
 
     if (found_signals) {
       n_print ("\n");
-      if (k == 0)
+      if (!want_actions)
         n_print ("%sElement Signals%s:\n", HEADING_COLOR, RESET_COLOR);
       else
         n_print ("%sElement Actions%s:\n", HEADING_COLOR, RESET_COLOR);
+      n_print ("\n");
     } else {
       continue;
     }
@@ -1129,47 +1150,65 @@
     for (l = found_signals; l; l = l->next) {
       gchar *indent;
       const gchar *pmark;
+      const gchar *retval_type_name;
       int indent_len;
 
       query = (GSignalQuery *) l->data;
-      indent_len = strlen (query->signal_name) +
-          strlen (g_type_name (query->return_type)) + 24;
+      retval_type_name = pretty_type_name (query->return_type, &pmark);
 
-      if (gtype_needs_ptr_marker (query->return_type)) {
-        pmark = "* ";
-        indent_len += 2;
-      } else {
-        pmark = " ";
-      }
+      indent_len = strlen (query->signal_name) + strlen (retval_type_name);
+      indent_len += strlen (pmark) - 1;
+      indent_len += (want_actions) ? 36 : 24;
 
       indent = g_new0 (gchar, indent_len + 1);
       memset (indent, ' ', indent_len);
 
-      n_print ("  %s\"%s\"%s :  %s%s%s%suser_function%s (%s%s%s* object%s",
-          PROP_NAME_COLOR, query->signal_name, RESET_COLOR,
-          DATATYPE_COLOR, g_type_name (query->return_type), PROP_VALUE_COLOR,
-          pmark, RESET_COLOR, DATATYPE_COLOR, g_type_name (type),
-          PROP_VALUE_COLOR, RESET_COLOR);
+      if (want_actions) {
+        n_print
+            ("  %s\"%s\"%s -> %s%s%s %s:  g_signal_emit_by_name%s (%selement%s, %s\"%s\"%s",
+            PROP_NAME_COLOR, query->signal_name, RESET_COLOR, DATATYPE_COLOR,
+            retval_type_name, PROP_VALUE_COLOR, pmark,
+            RESET_COLOR, PROP_VALUE_COLOR, RESET_COLOR, PROP_NAME_COLOR,
+            query->signal_name, RESET_COLOR);
+      } else {
+        n_print ("  %s\"%s\"%s :  %s%s%s%suser_function%s (%s%s%s * object%s",
+            PROP_NAME_COLOR, query->signal_name, RESET_COLOR,
+            DATATYPE_COLOR, retval_type_name, PROP_VALUE_COLOR,
+            pmark, RESET_COLOR, DATATYPE_COLOR, g_type_name (type),
+            PROP_VALUE_COLOR, RESET_COLOR);
+      }
 
       for (j = 0; j < query->n_params; j++) {
-        const gchar *type_name, *asterisk;
+        const gchar *type_name, *asterisk, *const_prefix;
 
-        type_name = g_type_name (query->param_types[j]);
-        asterisk = gtype_needs_ptr_marker (query->param_types[j]) ? "*" : "";
+        type_name = pretty_type_name (query->param_types[j], &asterisk);
+
+        /* Add const prefix for string and string array arguments */
+        if (g_str_equal (type_name, "gchar") && strchr (asterisk, '*')) {
+          const_prefix = "const ";
+        } else {
+          const_prefix = "";
+        }
 
         g_print (",\n");
-        n_print ("%s%s%s%s%s arg%d%s", indent, DATATYPE_COLOR, type_name,
-            PROP_VALUE_COLOR, asterisk, j, RESET_COLOR);
+        n_print ("%s%s%s%s%s%sarg%d%s", indent, DATATYPE_COLOR, const_prefix,
+            type_name, PROP_VALUE_COLOR, asterisk, j, RESET_COLOR);
       }
 
-      if (k == 0) {
+      if (!want_actions) {
         g_print (",\n");
         n_print ("%s%sgpointer %suser_data%s);\n", indent, DATATYPE_COLOR,
             PROP_VALUE_COLOR, RESET_COLOR);
-      } else
-        g_print (");\n");
-
+      } else if (query->return_type == G_TYPE_NONE) {
+        n_print ("%s);\n", RESET_COLOR);
+      } else {
+        g_print (",\n");
+        n_print ("%s%s%s%s *%sp_return_value%s);\n", indent, DATATYPE_COLOR,
+            g_type_name (query->return_type), PROP_VALUE_COLOR, pmark,
+            RESET_COLOR);
+      }
       g_free (indent);
+      g_print ("\n");
     }
 
     if (found_signals) {
@@ -2100,6 +2139,7 @@
   gboolean print_aii = FALSE;
   gboolean uri_handlers = FALSE;
   gboolean check_exists = FALSE;
+  gboolean check_version = FALSE;
   gboolean color_always = FALSE;
   gchar *min_version = NULL;
   guint minver_maj = GST_VERSION_MAJOR;
@@ -2171,7 +2211,12 @@
   ctx = g_option_context_new ("[ELEMENT-NAME | PLUGIN-NAME]");
   g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE);
   g_option_context_add_group (ctx, gst_init_get_option_group ());
-  if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
+#if defined(G_OS_WIN32) && !defined(GST_CHECK_MAIN)
+  if (!g_option_context_parse_strv (ctx, &argv, &err))
+#else
+  if (!g_option_context_parse (ctx, &argc, &argv, &err))
+#endif
+  {
     g_printerr ("Error initializing: %s\n", err->message);
     g_clear_error (&err);
     g_option_context_free (ctx);
@@ -2182,6 +2227,10 @@
   gst_init (&argc, &argv);
 #endif
 
+#if defined(G_OS_WIN32) && !defined(GST_CHECK_MAIN)
+  argc = g_strv_length (argv);
+#endif
+
   gst_tools_print_version ();
 
   if (print_all && argc > 1) {
@@ -2205,6 +2254,7 @@
     }
     g_free (min_version);
     check_exists = TRUE;
+    check_version = TRUE;
   }
 
   if (check_exists) {
@@ -2216,9 +2266,13 @@
         GstPluginFeature *feature;
 
         feature = gst_registry_lookup_feature (gst_registry_get (), argv[1]);
-        if (feature != NULL && gst_plugin_feature_check_version (feature,
-                minver_maj, minver_min, minver_micro)) {
-          exit_code = 0;
+        if (feature != NULL) {
+          if (check_version && !gst_plugin_feature_check_version (feature,
+                  minver_maj, minver_min, minver_micro)) {
+            exit_code = 2;
+          } else {
+            exit_code = 0;
+          }
         } else {
           exit_code = 1;
         }
@@ -2338,9 +2392,22 @@
 int
 main (int argc, char *argv[])
 {
+  int ret;
+
+  /* gstinspect.c calls this function */
+#if defined(G_OS_WIN32) && !defined(GST_CHECK_MAIN)
+  argv = g_win32_get_command_line ();
+#endif
+
 #if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
-  return gst_macos_main ((GstMainFunc) real_main, argc, argv, NULL);
+  ret = gst_macos_main ((GstMainFunc) real_main, argc, argv, NULL);
 #else
-  return real_main (argc, argv);
+  ret = real_main (argc, argv);
 #endif
+
+#if defined(G_OS_WIN32) && !defined(GST_CHECK_MAIN)
+  g_strfreev (argv);
+#endif
+
+  return ret;
 }
diff -Nru gstreamer1.0-1.22.0/tools/gst-launch.c gstreamer1.0-1.22.12/tools/gst-launch.c
--- gstreamer1.0-1.22.0/tools/gst-launch.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/tools/gst-launch.c	2024-04-29 21:09:52.000000000 +0200
@@ -56,7 +56,7 @@
 
 extern volatile gboolean glib_on_error_halt;
 
-#ifdef G_OS_UNIX
+#if defined (G_OS_UNIX) && !defined (__APPLE__)
 static void fault_restore (void);
 static void fault_spin (void);
 #endif
@@ -95,7 +95,7 @@
 /* convenience macro so we don't have to litter the code with if(!quiet) */
 #define PRINT if(!quiet)gst_print
 
-#ifdef G_OS_UNIX
+#if defined (G_OS_UNIX) && !defined (__APPLE__)
 static void
 fault_handler_sighandler (int signum)
 {
@@ -161,7 +161,7 @@
   sigaction (SIGSEGV, &action, NULL);
   sigaction (SIGQUIT, &action, NULL);
 }
-#endif /* G_OS_UNIX */
+#endif /* G_OS_UNIX && !__APPLE__ */
 
 #if 0
 typedef struct _GstIndexStats
@@ -1159,7 +1159,12 @@
   ctx = g_option_context_new ("PIPELINE-DESCRIPTION");
   g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE);
   g_option_context_add_group (ctx, gst_init_get_option_group ());
-  if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
+#ifdef G_OS_WIN32
+  if (!g_option_context_parse_strv (ctx, &argv, &err))
+#else
+  if (!g_option_context_parse (ctx, &argc, &argv, &err))
+#endif
+  {
     if (err)
       gst_printerr ("Error initializing: %s\n", GST_STR_NULL (err->message));
     else
@@ -1173,9 +1178,13 @@
   gst_init (&argc, &argv);
 #endif
 
+#ifdef G_OS_WIN32
+  argc = g_strv_length (argv);
+#endif
+
   gst_tools_print_version ();
 
-#ifdef G_OS_UNIX
+#if defined (G_OS_UNIX) && !defined (__APPLE__)
   if (!no_fault)
     fault_setup ();
 #endif
@@ -1368,9 +1377,21 @@
 int
 main (int argc, char *argv[])
 {
+  int ret;
+
+#ifdef G_OS_WIN32
+  argv = g_win32_get_command_line ();
+#endif
+
 #if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
-  return gst_macos_main ((GstMainFunc) real_main, argc, argv, NULL);
+  ret = gst_macos_main ((GstMainFunc) real_main, argc, argv, NULL);
 #else
-  return real_main (argc, argv);
+  ret = real_main (argc, argv);
 #endif
+
+#ifdef G_OS_WIN32
+  g_strfreev (argv);
+#endif
+
+  return ret;
 }
diff -Nru gstreamer1.0-1.22.0/tools/gst-stats.c gstreamer1.0-1.22.12/tools/gst-stats.c
--- gstreamer1.0-1.22.0/tools/gst-stats.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/tools/gst-stats.c	2024-04-29 21:09:52.000000000 +0200
@@ -1283,15 +1283,28 @@
 
   g_set_prgname ("gst-stats-" GST_API_VERSION);
 
+#ifdef G_OS_WIN32
+  argv = g_win32_get_command_line ();
+#endif
+
   ctx = g_option_context_new ("FILE");
   g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE);
   g_option_context_add_group (ctx, gst_init_get_option_group ());
-  if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
+#ifdef G_OS_WIN32
+  if (!g_option_context_parse_strv (ctx, &argv, &err))
+#else
+  if (!g_option_context_parse (ctx, &argc, &argv, &err))
+#endif
+  {
     g_print ("Error initializing: %s\n", GST_STR_NULL (err->message));
     exit (1);
   }
   g_option_context_free (ctx);
 
+#ifdef G_OS_WIN32
+  argc = g_strv_length (argv);
+#endif
+
   gst_tools_print_version ();
 
   if (filenames == NULL || *filenames == NULL) {
@@ -1312,5 +1325,10 @@
   done ();
 
   g_strfreev (filenames);
+
+#ifdef G_OS_WIN23
+  g_strfreev (argv);
+#endif
+
   return 0;
 }
diff -Nru gstreamer1.0-1.22.0/tools/gst-typefind.c gstreamer1.0-1.22.12/tools/gst-typefind.c
--- gstreamer1.0-1.22.0/tools/gst-typefind.c	2023-01-23 20:29:34.000000000 +0100
+++ gstreamer1.0-1.22.12/tools/gst-typefind.c	2024-04-29 21:09:52.000000000 +0200
@@ -164,7 +164,12 @@
   ctx = g_option_context_new ("FILES");
   g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE);
   g_option_context_add_group (ctx, gst_init_get_option_group ());
-  if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
+#ifdef G_OS_WIN32
+  if (!g_option_context_parse_strv (ctx, &argv, &err))
+#else
+  if (!g_option_context_parse (ctx, &argc, &argv, &err))
+#endif
+  {
     g_print ("Error initializing: %s\n", GST_STR_NULL (err->message));
     g_clear_error (&err);
     g_option_context_free (ctx);
@@ -172,6 +177,10 @@
   }
   g_option_context_free (ctx);
 
+#ifdef G_OS_WIN32
+  argc = g_strv_length (argv);
+#endif
+
   gst_tools_print_version ();
 
   if (filenames == NULL || *filenames == NULL) {
@@ -193,9 +202,21 @@
 int
 main (int argc, char *argv[])
 {
+  int ret;
+
+#ifdef G_OS_WIN32
+  argv = g_win32_get_command_line ();
+#endif
+
 #if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
-  return gst_macos_main ((GstMainFunc) real_main, argc, argv, NULL);
+  ret = gst_macos_main ((GstMainFunc) real_main, argc, argv, NULL);
 #else
-  return real_main (argc, argv);
+  ret = real_main (argc, argv);
 #endif
+
+#ifdef G_OS_WIN32
+  g_strfreev (argv);
+#endif
+
+  return ret;
 }

Reply to: