=== release 1.29.1 ===

2026-03-22 14:56:37 +0000  Tim-Philipp Müller <tim@centricular.com>

	* NEWS:
	* RELEASE:
	* gst-editing-services.doap:
	* meson.build:
	  Release 1.29.1

2023-04-02 16:53:45 +0100  Tim-Philipp Müller <tim@centricular.com>

	* meson.build:
	* scripts/dist-common-files.py:
	  modules: dist common files from monorepo root
	  Less noise when making releases, and just need to maintain one copy.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11094>

2026-03-22 14:20:18 +0000  Tim-Philipp Müller <tim@centricular.com>

	* RELEASE:
	  modules: remove RELEASE from git, will be generated from template on dist

2026-02-15 15:02:07 +0000  Tim-Philipp Müller <tim@centricular.com>

	* NEWS:
	  modules: Remove NEWS from git which is generated from full release notes
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11094>

2025-07-09 18:10:13 -0400  Thibault Saunier <tsaunier@igalia.com>

	* tools/ges-launcher.c:
	  ges-launcher: fix crash when error message has no source
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11093>

2026-03-18 10:04:29 +0100  Xabier Rodriguez Calvar <calvaris@igalia.com>

	* meson.build:
	  ges: remove spurious python-embed dependency from libges
	  libges does not use any Python API directly — the only Python-related
	  code is gst_plugin_load("python") in ges-formatter.c, which is a
	  GStreamer API call. The gst-python plugin itself handles all Python
	  interaction.
	  The python-embed dependency was added to libges_deps, causing:
	  - An unnecessary python-X.Y-embed in Requires.private of the .pc file
	  - Unnecessary linkage against libpython on macOS
	  The config.h entries HAS_PYTHON and PY_LIB_FNAME were also dead code,
	  never referenced by any C source file.
	  Remove python_dep, gmodule_dep, and libdl from libges_deps along with
	  all the libpython search logic, since none of these are actually used.
	  This is a follow-up to !9759 which moved the OTIO formatter to a
	  separate Python plugin but left behind the now-unused python-embed
	  dependency and libpython search logic in the GES meson.build.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11065>

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

	* tests/check/scenarios/check_keyframes_in_compositor_two_sources.validatetest:
	* tests/check/scenarios/complex_effect_bin_desc.validatetest:
	* tests/check/scenarios/edit_while_seeked_with_stop.validatetest:
	* tests/check/scenarios/seek_with_stop.check_clock_sync.validatetest:
	* tests/check/scenarios/seek_with_stop.validatetest:
	* tests/validate/nle/ensure_no_unnecessary_stack_init_seeks.validatetest:
	  validateflow: auto-derive directories from test file path
	  Allow validateflow configs to be written as proper nested structures
	  instead of requiring the $(validateflow) variable expansion:
	  configs = {
	  [validateflow, pad=sink:sink, buffers-checksum=true],
	  }
	  instead of:
	  configs = {
	  "$(validateflow), pad=sink:sink, buffers-checksum=true",
	  }
	  When expectations-dir or actual-results-dir are not explicitly set,
	  validate_flow_override_new() now derives them from the __filename__
	  metadata field (already attached to each config structure by the
	  parser). This mirrors the path computation done in
	  gst_validate_structure_set_variables_from_struct_file().
	  The $(validateflow) variable and the old string syntax remain fully
	  supported for backward compatibility.
	  Port all existing .validatetest files to the new syntax.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10962>

2026-02-10 16:26:05 +0000  Thibault Saunier <tsaunier@igalia.com>

	* ges/ges-pipeline.c:
	* tests/check/ges/basic.c:
	  ges: pipeline: fix shared task pool context handling
	  The shared task pool context created in ges_pipeline_handle_message
	  was never stored on the pipeline element itself. This meant
	  gst_element_get_context() would always return NULL for subsequent
	  NEED_CONTEXT requests, causing a new pool to be created for every
	  child element that requested one instead of reusing the same pool.
	  Fix this by calling gst_element_set_context() after creating the
	  pool, and clean up the pool in dispose.
	  Add a test verifying the context is properly stored on the pipeline.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10784>

2026-02-08 13:37:10 +0000  Thibault Saunier <tsaunier@igalia.com>

	* ges/ges-xml-formatter.c:
	  ges: xml-formatter: fix asset list leak in _save_assets
	  Two issues with the asset list in _save_assets:
	  The return value of g_list_sort was not assigned back to the assets
	  variable. Since g_list_sort may change the list head, the subsequent
	  g_list_free_full could miss nodes that were sorted before the original
	  head pointer.
	  Also, the early return on _save_subproject failure did not free the
	  assets list.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10784>

2026-02-08 13:37:03 +0000  Thibault Saunier <tsaunier@igalia.com>

	* plugins/ges/gesdemux.c:
	  gesdemux: fix buffer and event leaks in EOS handler
	  The EOS handler in ges_demux_sink_event takes a buffer from the input
	  adapter and maps it but never unmaps or unrefs it. The EOS event
	  parameter is also never unreffed on the success/error code paths since
	  the function returns before reaching gst_pad_event_default.
	  This caused "definitely lost" leaks of the xges file content buffer and
	  EOS events in every nested timeline test.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10784>

2026-02-06 23:30:13 +0000  Thibault Saunier <tsaunier@igalia.com>

	* plugins/ges/gesbasebin.c:
	  ges: fix memory leaks during nested timeline teardown
	  GESBaseBin locks the inner timeline's state (commit b283b3b5442) to
	  prevent the parent NLE composition's action thread from cascading state
	  changes into it, which would cause SELECT_STREAM events to be pushed
	  from the wrong thread. During shutdown however, this locked state
	  prevents the inner timeline from being properly set to NULL during
	  the normal state change cascade, leaking pads' sticky events and
	  buffers.
	  Fix this by unlocking the timeline state in GESBaseBin's PAUSED_TO_READY
	  handler - by this point the composition's action thread is already
	  stopping and the race condition no longer applies.
	  Also set the inner timeline to NULL in GESBaseBin's dispose as a safety
	  net for cases where the state change cascade doesn't run.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10784>

2026-02-06 21:23:20 +0000  Thibault Saunier <tsaunier@igalia.com>

	* ges/ges-validate.c:
	  ges: validate: fix action type leak in prepare_seek_action
	  gst_validate_get_action_type() returns a new reference that must be
	  released by the caller. prepare_seek_action() never unreffed the
	  returned type, leaking a reference on every seek action preparation.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10784>

2026-02-06 17:10:51 +0000  Thibault Saunier <tsaunier@igalia.com>

	* ges/ges-timeline.c:
	  ges: timeline: fix SELECT_STREAMS event leak in send_event
	  GstElement::send_event is transfer-full for the event parameter.
	  When ges_timeline_send_event() handles a GST_EVENT_SELECT_STREAMS
	  event internally instead of chaining up, it must unref the event.
	  The event was leaked on every stream selection.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10784>

2026-02-06 17:10:46 +0000  Thibault Saunier <tsaunier@igalia.com>

	* plugins/nle/nleobject.c:
	  nle: fix message leaks in nle_bin_handle_message
	  GstBin::handle_message is transfer-full for the message parameter.
	  When the method returns without chaining up to the parent class, it
	  must unref the message itself.
	  Both early-return paths (NLE_QUERY_PARENT_NLE_OBJECT handling and
	  GST_MESSAGE_STREAM_COLLECTION dropping) were missing the
	  gst_message_unref() call, leaking the message on every occurrence.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10784>

2026-02-06 17:10:39 +0000  Thibault Saunier <tsaunier@igalia.com>

	* ges/ges-project.c:
	  ges: project: fix URI string leak in missing-uri signal emission
	  g_signal_emit() with a G_TYPE_STRING return value overwrites the
	  output pointer without freeing the previous value. When
	  _request_id_update() returns a non-NULL new_id, that string was
	  leaked by the subsequent g_signal_emit() call which unconditionally
	  overwrites the pointer.
	  Save the proposed id before emitting the signal and free it only if
	  the signal handler provides a different replacement.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10784>

2026-02-06 17:10:33 +0000  Thibault Saunier <tsaunier@igalia.com>

	* ges/ges-track.c:
	  ges: track: fix stream collection leak in handle_message
	  gst_structure_get() with GST_TYPE_STREAM_COLLECTION returns a new
	  reference that was never released after being passed to
	  ges_track_select_subtimeline_streams().
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10784>

2026-02-06 17:10:27 +0000  Thibault Saunier <tsaunier@igalia.com>

	* plugins/ges/gesdemux.c:
	  gesdemux: fix caps and query leaks
	  Fix two memory leaks found with valgrind:
	  - In ges_demux_get_extension(), the caps created from mimetype were
	  not freed when no matching structure was found in the loop iteration,
	  leaking on every non-matching formatter.
	  - In ges_demux_create_timeline(), the URI query was never unreffed
	  after being used, leaking on every timeline creation.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10784>

2026-02-03 12:44:32 -0300  Thibault Saunier <tsaunier@igalia.com>

	* tests/validate/geslaunch.py:
	  integration-testsuites: rename medias/ to media/
	  "Media" is already the plural of "medium", so "medias" is a double
	  plural. Rename the submodule directory from medias/ to media/ and update
	  all references throughout the codebase.
	  The --media-paths argument is now the primary name for the launcher
	  option, with --medias-paths kept as a deprecated alias for backward
	  compatibility.
	  The gitlab repo has been renamed from gst-integration-testsuites to
	  gst-test-media to better reflect its contents (media files only, not
	  testsuites), though the URL path remains gst-integration-testsuites due
	  to gitlab limitations.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10537>

2026-01-27 18:25:19 +0100  Piotr Brzeziński <piotr@centricular.com>

	* meson.build:
	  meson: Fix libxml2 not building due to wrong option type
	  'python' was moved from a boolean to a feature a few months ago and
	  4f4260dbe3489699aba0a724a3d55020666a0d6a pulled that in on our side.
	  Notably, this was causing adaptivedemux2 to not build on my system.
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10615>

2026-01-27 18:36:19 +0000  Tim-Philipp Müller <tim@centricular.com>

	* RELEASE:
	* meson.build:
	  Back to development in main branch after 1.28.0
	  - Track orc main branch
	  - Track gst-plugins-rs main branch
	  Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/10616>

=== release 1.28.0 ===

