Skip to content

Sync upstream GStreamer into ignis-main - #11

Open
github-actions[bot] wants to merge 538 commits into
ignis-mainfrom
automation/sync-upstream-main
Open

Sync upstream GStreamer into ignis-main#11
github-actions[bot] wants to merge 538 commits into
ignis-mainfrom
automation/sync-upstream-main

Conversation

@github-actions

@github-actions github-actions Bot commented Jun 22, 2026

Copy link
Copy Markdown

This PR merges the latest upstream GStreamer main branch into ignis-main while preserving Ignis changes.


Note

Medium Risk
Large upstream merge touching codec parsers, CI, and fuzz build configuration increases regression surface; no direct auth changes, but demuxer/parser and tracing API shifts may affect downstream Ignis builds or tests.

Overview
This merge pulls the latest upstream GStreamer main into ignis-main; the diff is upstream work, not new Ignis-only features.

CI and validation — GitLab CI now skips Windows/macOS/Cerbero-style jobs for the gstreamer-security project, tightens abi-check Meson options (tests/examples disabled), bumps ABI_CHECK_TAG, and refactors valgrind job path rules via shared *toplevel_and_ci_changes / *modules_changes anchors. ci/scripts/test.sh omits --check-bugs when CI_PROJECT_NAME is gstreamer-security.

Fuzzing — OSS-Fuzz build enables gst-plugins-good and gst-plugins-bad with a narrow set of demux/parser plugins instead of disabling them entirely. New libFuzzer targets exercise audio (caps, converter/resampler/quantize), gst-value (caps/structure deserialization), and video (metadata parsers and video-converter), with seeds/corpus updates for discoverer and value fuzzing.

API / introspection (GIR) — Documents 1.30 tracing spans (GST_DEFINE_TRACE_FORMAT, gst_trace_span_*, deprecated GstTracerRecord), plugin static registry flags and gst_plugin_get_registry(), RISC-V Vector CPU probe, BaseParse duplicate-PTS and BaseSink enable-last-sample-notify, AHardwareBuffer / IOSurface memory helpers, richer H.265 levels and H.274 digitally signed content SEI types, and segmentation mask docs in analytics.

MiscAGENTS.md drops the robot-emoji acknowledgment rule; Fluster MV-HEVC reference hashes updated; GES micro version bump in GIR.

Reviewed by Cursor Bugbot for commit d1bd95b. Bugbot is set up for automated code reviews on this repo. Configure here.

gst_validate_printf (NULL,
"%*s ... and %u more (set GST_VALIDATE_REPORTING_DETAILS=all to list them)\n",
12, "", n_suppressed);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Validate synthesis omits first details

Medium Severity

In _do_report_synthesis, the first report in each issue group still gets level and “Detected on”, but gst_validate_report_print_details no longer runs for that entry. Critical and full-detail issues that only appear once (or sit at the list head) lose their Details block in synthesized output.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 048051e. Configure here.

g_free (ts_name);
g_free (full_dir);
} else {
GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline), details, dotname);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dot-dir uses wrong timestamp

Low Severity

The new dot-dir branch builds dot filenames from raw gst_util_get_timestamp(), while the default path uses GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS, which stamps elapsed time since GStreamer start. Mixed runs produce incomparable or misleading dot names for the same scenario action.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 048051e. Configure here.

Comment thread subprojects/gst-editing-services/plugins/nle/nlecomposition.c
@github-actions
github-actions Bot force-pushed the automation/sync-upstream-main branch 2 times, most recently from a4fa6a2 to ce339fa Compare July 6, 2026 07:28
@github-actions
github-actions Bot force-pushed the automation/sync-upstream-main branch from ce339fa to a53b91e Compare July 13, 2026 07:03
Comment thread .gitlab-ci.yml
when: never
# Never run for gstreamer-security repo
- if: '$CI_PROJECT_NAME == "gstreamer-security"'
when: never

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cerbero security skip rule order

Medium Severity

The new gstreamer-security when: never rule on cerbero trigger sits after - if: '$MESON_COMMIT'. GitLab applies the first matching rule, so a non-empty MESON_COMMIT still starts Cerbero on gstreamer-security, unlike Windows/macOS jobs that check the project name first.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit a53b91e. Configure here.

seungha-yang and others added 25 commits July 13, 2026 23:58
Update expected output for the new codectimestamper DTS offset behavior

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11908>
Add a forward declaration header so that including only the central
gstcuda.h is sufficient, instead of including individual headers in
every C++ source file

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11936>
Expose GstCudaConverter so applications can use the CUDA
conversion helper, similar to GstD3D11/D3D12 public APIs

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11936>
Introduce a new CUDA aggregator baseclass for implementing
various N-to-1 CUDA processing scenarios.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11936>
Add a utility method similar to D3D's ClearRenderTargetView()
for filling a CUDA frame with a solid color

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11936>
Add GstCudaAggregatorConvertPad, similar to
GstVideoAggregatorConvertPad, to support conversion during
prepare_frame() stage

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11936>
Fix a typo where capture_height would not get properly
assigned. Fixes invalid copy region errors.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12114>
"(transfer full): (nullable):" ends the annotation list at the first
colon, so gobject-introspection drops the nullable annotation and the
GIR marks the return value non-nullable, breaking bindings.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12116>
_create_gl_window() called __bridge_retained twice on the same view,
storing to priv->internal_view both times. Each __bridge_retained
increments the ObjC retain count, but the first retained reference was
immediately overwritten by the second. Since gst_gl_window_eagl_finalize
only calls CFRelease once, the GstGLUIView (and its CAEAGLLayer) leaked
with an extra +1 retain count.

Remove the first redundant __bridge_retained. The local ARC variable
keeps the view alive until after addSubview: and the second
__bridge_retained.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11501>
This can happen e.g. if the resolution is too large for the given format.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12120>
sdroege and others added 29 commits August 12, 2026 10:12
…ions

This was extremely inefficient previously with lots of branches in the inner
processing loop and no possibility to unroll.

In addition there's now clamping for the uint8_t function as otherwise this
could easily wrap around.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12262>
test_input_formats is redundant now as only RGB is supported (previously we
internally converted slowly but this is better left to videoconvert).

Other tests need changing from RGB to RGBP as the model actually works with a
planar RGB input.

And also add a test for GRAY8 handling with a corresponding model.

This covers all format combinations now.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12262>
GLSL does not support it until GLSL 1.30 which is only available with GL 3.0.

GL 2.1 systems instead have to use floating point mod() so convert everything
needing integer modulus to float and back.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12275>
Add meson wrapper for Microsoft.Windows.AI.MachineLearning nuget package

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12277>
Add "onnx-winml" build option (disabled by default) to allow building
ONNX plugin against the Microsoft-provided ONNX runtime libraries.

Note that Windows has its own onnxruntime.dll in system32, and system32
is searched before PATH for unpackaged apps. Because of this,
PATH setup by meson devenv is not enough.
For testing, Windows ML onnxruntime.dll needs to be copied next to
executables such as gst-launch-1.0.exe. The same applies to applications
using the ONNX plugin.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12277>
…orrect place

Such errors are put into the debug string, not the actual error message.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12290>
Add packed RGBA video formats with 16-bit (half) and 32-bit floating
point components, in both endianness, along with a new
GST_VIDEO_FORMAT_FLAG_FLOAT flag so that code can tell float formats
apart from integer formats of the same depth.

Floating point RGBA, and half floats in particular, is the standard
working format of post-production pipelines: color correction,
compositing and EXR based workflows process linear-light frames and
rely on out-of-range intermediate values (scaler undershoot, wide
gamut conversions, HDR superwhites) that integer formats clamp at
every element boundary.

The formats unpack to ARGB64 like the other deep RGB formats: the
software converter processes in 16-bit integer, so values outside
[0, 1] are clamped and half precision is quantized when converting
to integer formats. Float-preserving processing is intended for
elements that consume the frames natively; dedicated float fast paths
in the converter can be added later if needed.

The GST_VIDEO_FORMATS_ALL ordering was generated with
scripts/sort_video_formats.py, which now ranks floating point formats
by their effective bit depth. Only the significand resolves distinct
shades: the exponent rescales values without adding resolution within
a range, so in the worst-case [0.5, 1.0) range a float format
distinguishes exactly as many levels as an integer format with as
many bits as its significand. That is 24 bits for 32-bit floats (23
stored plus the implicit leading one) and 11 bits for halfs (10
stored plus the implicit one), so RGBA_F32 ranks above every integer
format and RGBA_F16 lands between the 12-bit and 10-bit integer
formats.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12017>
ORC has full 32 bit float support so the conversion arithmetic of the
RGBA_F32 formats can be accelerated. The component reordering stays in
C as ORC operates element wise and cannot reorder channels within a
16 bytes pixel; the byte swapped variants reuse the same code by
swapping in the ORC functions.

The RGBA_F16 formats keep their C implementation, ORC has no half
float support.

The ORC dist files are regenerated, they were generated with an older
orcc which accounts for most of the churn.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12017>
Add an `expected-color` parameter to the `check-last-sample` action
type, along with optional `x`, `y`, `width`, `height` region and
`tolerance` parameters. The frame is converted to RGB with
GstVideoConverter so any raw video format can be checked, and every
pixel of the region must match the expected color within the
tolerance.

This allows checking actual frame content, reporting precise color
values on mismatch, instead of relying on opaque buffer checksums.

The action types documentation is regenerated, it was also stale.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12017>
Add tests checking:
- videoconvert conversions of a solid color from RGBA to each of
  RGBA_F16_LE/BE and RGBA_F32_LE/BE
- a RGBA -> RGBA_F16_LE -> RGBA roundtrip through videoconvert
- videotestsrc producing each float format directly through the
  generic pack path
- the color of each bar of a 100% SMPTE pattern produced as
  RGBA_F16_LE

The frame content is verified with `check-last-sample,
expected-color=` so failures report the actual color values, and
validateflow checks the caps and event flow.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12017>
The float formats inherited the RGB default colorimetry and were tagged
with range=0_255 while carrying [0.0, 1.0] values, which would have
prevented ever giving 0_255 a meaning for float formats (e.g. [0, 255]
scaled input for ML models). Give the float scale its own range value,
make it the default for floating point RGB formats and treat it like
full range in gst_video_color_range_offsets(), since float formats
unpack to full-range integer code values.

The other range values are reserved for float formats: caps parsing
coerces them to 0_1 with a warning, like the RGB matrix is forced for
RGB formats.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12017>
Converting between the packed float RGBA formats went through the generic
unpack/pack path, whose ARGB64 (16-bit integer) intermediate clamps values to
[0, 1] and drops precision. As RGBA_F16 and RGBA_F32 share the same R, G, B, A
component order, convert between them directly with a per-component
half <-> float pass (no color conversion or resampling), preserving
out-of-range values and, in the F16 -> F32 direction, full precision.

The half <-> float helpers are static inline in gstvideoutilsprivate.h so
video-converter.c can share video-format.c's implementation.

Add a unit test converting a HDR / out-of-gamut pixel through a
RGBA_F32 <-> RGBA_F16 roundtrip and checking it is preserved exactly.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12017>
The `GST_ALSA_SINK_LOCK` used to protect the calls to `snd_pcm_*` which
are not tread-safe when related to the same device, is taken outside of
the writing loop leading to a possible starvation in specific cases.

This patch reorganizes the locks to reduce their scope and prevent
starvation. It also fixes a deadlock when trying to recover on a
`ESTRPIPE` error while `snd_pcm_resume()` returns `EAGAIN`.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/11707>
The underlying SRT library supports multiplexing SRT connections over
the same UDP socket. This is useful for avoiding complicated firewall
discussions with IT departments, instead one can use a single address
for your SRT ingress or egress.

This commit introduces a new property `connection-key` if two SRT
listening elements have the same value set as `connction-key` they will
attempt to share the UDP socket.

We introduce a new `GstSRTListenerConnection` helper struct with a
helper API to go with it that will help us keep track of active
listening sockets. Most of The code dealing with listening and waiting
for callers is moved there from `gstsrtobject.c`. A global hash table
will store the different connections with the `connection-key` as key.

Example usage:
```console
$ gst-launch-1.0 -v \
    srtsrc connection-key=multiplex uri="srt://127.0.0.1:3000?mode=listener&streamid=one" \
    ! tsparse ! queue ! filesink location=one.ts \
    srtsrc connection-key=multiplex uri="srt://127.0.0.1:3000?mode=listener&streamid=two" \
    ! tsparse ! queue ! filesink location=two.ts

$ gst-launch-1.0 -v \
    mpegtsmux name=muxone alignment=7 \
    mpegtsmux name=muxtwo alignment=7 \
    videotestsrc pattern=ball ! queue ! "video/x-raw,width=320,height=240" ! x264enc ! muxone. \
    videotestsrc ! queue ! "video/x-raw,width=320,height=240" ! x264enc ! muxtwo. \
    muxone. ! queue ! srtsink uri="srt://127.0.0.1:3000?mode=caller&streamid=one"  \
    muxtwo. ! queue ! srtsink uri="srt://127.0.0.1:3000?mode=caller&streamid=two"

```

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6427>
The SRT library uses pthread_create_key and pthread_setspecific to store
the latest error on a thread as a singleton.

At thread exit the specified destructor should run and free that
singleton, failing that some C++ destructors should perform it.

This does not always happen, in our tests the reason is that
pthread_exit is not called on main threads.

In order for our valgrind tests to passed we will add suppressions for
this leak of the singleton error.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6427>
This in combination with connection sharing enables an application
to listen on a single endpoint and accept any number of arbitrarily-named
streams, using the following scheme:

* Spin up a first srtsrc with URI srt://X.X.X.X:YYYY?mode=listener
* Upon connection of a first caller, the first "free" (stream id ==
  NULL) SRT object is selected, and its stream id property is updated
  while holding the connections lock
* The application creates and starts a new srtsrc in the signal
  handler, which means a new "free" SRT object is always available
  while the connections lock isn't held

In order for this scheme to work, the connections mutex is turned into
a recursive one.

This approach is a bit convoluted, but the alternative would be
externally-managed SRT connections which would require a much more
fundamental redesign.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6427>
Implement parsing for the structured streamid format (#!::key=value,...)
as defined in the SRT access control guidelines. This allows extraction
of user credentials from streamids while maintaining compatibility with
simple streamid formats.

Fixes authentication workflow for clients using structured streamids
like Blackmagic devices.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6427>
vkCreateSamplerYcbcrConversion() is a Vulkan 1.1 core entry point. Calling it
directly makes the linker resolve it against the loader, so the plugin fails
to load on a Vulkan 1.0 loader with an undefined symbol error.

Resolve it at runtime with the VK_KHR_sampler_ycbcr_conversion entry point as
fallback, next to the existing free function.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/12135>
@github-actions
github-actions Bot force-pushed the automation/sync-upstream-main branch from bf00a7f to d1bd95b Compare August 17, 2026 06:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.