293 Commits

Author SHA1 Message Date
Jan Alexander Steffens (heftig)
e40a037b67 decodebin3: Update stream tags
parsebin does this, so should decodebin3.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9557>
2025-08-18 09:43:39 +00:00
Sebastian Dröge
8ea031b400 uridecodebin3: Add missing locking and NULL checks when adding URIs to messages
Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4559

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9500>
2025-08-06 12:51:54 +00:00
Jan Schmidt
e653acc200 decodebin3: Don't error out for unknown streams in default selection
If there is only unknown stream-type streams in the current collection
don't post an error straight away. This fixes a problem with RTSP
cameras and legacy upstream collection building, if the first
stream that rtspsrc outputs is the ONVIF metadata track. That
happens often on bandwidth-constrained camera inputs, as the
video and audio will naturally take longer to arrive.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9433>
2025-08-04 06:14:00 +00:00
Sebastian Dröge
46df60ed1d Revert "streamsynchronizer: Consider streams having received stream-start as waiting"
This reverts commit a1a189c07cb66af06d7047c74f6421bd36e3d66c.

It breaks the uriplaylistbin tests and needs further investigation.

See https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4506

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9309>
2025-06-30 09:26:29 +03:00
Thibault Saunier
e799d79025 playsink: Fix race condition in stream synchronizer pad cleanup during state changes
Prevent race condition where gst_play_sink_do_reconfigure() could be called
from a pad probe while stream synchronizer pads are being released during
GST_STATE_CHANGE_PAUSED_TO_READY transition.

The race occurred when:
1. State change starts releasing stream synchronizer pads
2. Pads are unblocked earlier in the state change, allowing events to flow
3. A streaming thread triggers sinkpad_blocked_cb -> gst_play_sink_do_reconfigure
4. Reconfiguration tries to use already-released pad pointers
5. New pad creation fails with assertion in gst_pad_iterate_internal_links

The fix adds GST_PLAY_SINK_LOCK around the pad cleanup to ensure atomic
cleanup and prevent concurrent access during state transitions.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9233>
2025-06-20 11:53:50 +00:00
Théo Maillart
b13fd1db7b urisourcebin: never manually store stream-start
The copy of the exact same stream-start event prevents the multiqueue's sink
event function from being called because it is already stored on both pads at
link time
The text streams are no longer considered sparse by the multiqueue, so
interleave calculation is broken and makes us consume a lot of ram and we can
end up killed by the kernel because of this

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8412>
2025-06-18 12:43:18 +00:00
Enrique Ocaña González
a1a189c07c streamsynchronizer: Consider streams having received stream-start as waiting
When using the custom WebKitMediaSrc element (used by WebKit and able to
perform an initial seek in playbin), a stall caused by streamsynchronizer
was detected during an initial seek. The flow of events revealed that the
intertwining of the initial configuration of the streams with the reset
caused by the flush events from the seek left streamsynchronizer in an
inconsistent state:

streamsynchronizer0:sink_0 (video) events, starting before the seek:
 stream-start --> Sets the stream to wait
 flush-stop --> Clears the stream wait flag
 caps
 tag
 segment
 stream-collection
 (buffers start to come and flow properly)

streamsynchronizer0:sink_1 (audio) events, happening after seek:
 (no flush events, because the stream hadn't been initialized when the seek happened)
 stream-start --> Sets the stream to wait
 caps
 segment
 (stalled because the stream is in wait mode!)

The code in streamsynchronizer expects that all the streams are in wait
state before releasing all of them at once. The flush on the video stream
broke that assumption and that's why the audio stream is never released in
that scenario.

Avoiding the clearing of the wait flag on flush-stop isn't an actual solution
to the problem, as it creates other side effects and at least makes the
gst-editing-services/seek_with_stop test to timeout. The alternate solution
implemented in this patch consists on analyzing if the other streams different
from the one newly added (after the flush) aren't waiting (which would mean
that they've all been unlocked after all of them were waiting before), and,
in that case, mark the new stream as also not waiting.

A new test_stream_start_wait test case has been added to demonstrate this
problem. The test case creates a video stream, pushes a buffer, then
simulates a seek by pushing flush-start, flush-stop, stream-start and segment
events. Note that the flush-stop clears the video stream waiting flag.
After that, a new audio stream is created and stream-start and new segment
events are sent. Note that stream-start will set the audio stream to wait.
Then a buffer is pushed on each stream. In the failing case, the test hangs.
In the working case (after this fix), the test runs properly because the
fact of having seen a stream-start also helps to clear the wait flag.

A second new test_stream_start_wait_sparse test has also been added to prove
that this mechanism can also work with sparse streams (a special case of the
current stream-start handling code). This test behaves like the previous one,
but there's no video buffer after the seek (it'll come in the future, as the
stream is sparse, but actually never comes). The buffer after the seek in the
audio stream starts at its due time. Streamsynchronizer is able to ignore
the wait for the video stream and produce audio buffers on time.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4544>
2025-05-30 09:37:45 +00:00
Doug Nazar
75cf21d834 gstreamer: A few small memory cleanups
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9044>
2025-05-27 10:44:37 +00:00
Thibault Saunier
feb3df61a7 debug: Use log contexts in some places
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6855>
2025-05-22 09:53:35 +00:00
Guillaume Desmottes
8f627b1f9c uridecodebin3: Don't hold play items lock while releasing pads
Releasing the pad can cause messages that call back into the message
handler of uridecodebin3 and take exactly the same lock again.

Fix #4443

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9032>
2025-05-21 14:43:08 +00:00
Sebastian Dröge
7ffbb1ce34 subtitleoverlay: Remove 0.10 hardware caps handling
This also reverts c02d41c2. videoconvert and videoscale are supposed to support
raw video with any caps features as long as no conversion is actually necessary,
and assuming they don't breaks usage of GstVideoOverlayCompositionMeta with e.g.
dmabuf or GL memory caps.

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4353

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9020>
2025-05-21 13:07:51 +00:00
Doug Nazar
12932ecc90 uridecodebin3: Free various props before being set
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8648>
2025-03-27 09:03:18 +00:00
Edward Hervey
235b0acd63 decodebin3: Don't avoid parsebin even if we have a matching decoder
This is too brittle, there is no guarantee that the input stream has been
properly parsed.

There is another check above (is_input_parsed) that will skip that if the
content came from `urisourcebin` and had a parser applied

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4308

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8641>
2025-03-14 09:40:35 +01:00
Edward Hervey
6454698f82 urisourcebin: Make parsebin activation more reliable
`parsebin` is potentially added by a `typefind` callback.

That `typefind` was activated by a `READY_TO_PAUSED` state change on `urisourcebin`

We want to ensure that it is the "setup_parsebin_for_slot" method that activates
the underlying `parsebin`, and not the external state-change.

Otherwise we would risk a potential deadlock where elements activating in
`parsebin`, and which would cause the upstream `typefind` to switch scheduling
mode, would not be able to acquire the STREAM_LOCK of the `typefind` task.

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4225

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8511>
2025-03-12 16:15:20 +00:00
Dongyun Seo
c206ddd930 playbin3: fix unlocking twice
fix unlocking playbin3 lock twice.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8570>
2025-02-28 13:49:11 +00:00
Sebastian Dröge
fb34f63835 uridecodebin3: Don't hold play items lock while activating source items
Activating them can cause messages that call back into the message handler of
uridecodebin3 and take exactly the same lock again.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8215>
2025-02-18 09:14:59 +00:00
Mathieu Duponchelle
3de86b2b97 docs: port plugins to explicit sources
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8273>
2025-01-13 19:17:13 +01:00
Edward Hervey
319ff17300 base: Fix fallthrough declarations
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8229>
2025-01-13 12:51:44 +00:00
Edward Hervey
9656ae6c0b decodebin3: Add missing break in switch
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8286>
2025-01-13 08:08:00 +00:00
Sebastian Dröge
2f3deb4009 message: Remove nullable annotation from gst_message_writable_details()
This function can never return NULL as the details are created for the message
if there are none yet.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8235>
2025-01-03 13:21:28 +00:00
Sebastian Dröge
f0a8938133 decodebin3: Free main input even if it is not part of the list of inputs
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8216>
2025-01-02 14:30:02 +00:00
Edward Hervey
f7d6822589 urisourcebin: Avoid deadlock on shutdown
The reason why the STATE lock was taken was to avoid issues where we would be
adding (and activating) elements at the same time as urisourcebin would be
brought down to READY. That would cause those new elements to potentially return
ERRORS because of not-negotiated/flushing-pads

But that creates a really bad deadlock (state lock is taken to deactivate the
streaming thread which .. is currently grabbing the state lock).

Instead, we can just ignore the warning/error messages that might occur when
shutting down.

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4075

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8162>
2024-12-20 08:01:01 +00:00
Edward Hervey
2d92a2ee54 urisourcebin: Only rewrite stream-start event once
If the custom field is already present, we don't want to rewrite the event
again. Otherwise it would cause downstream into believing that a *new*
stream-start event has arrived ... which isn't the case.

Fixes #4097

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8132>
2024-12-13 09:42:01 +00:00
Edward Hervey
18d83192be uridecodebin3: Don't use decodebin3 static sink pad
Makes the code leaner, and fixes the issue which would happen when the
urisourcebin stream that was linked to the sink pad goes away (without any
replacement).

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7949>
2024-12-10 08:47:43 +00:00
Edward Hervey
eb24c0eabc decodebin3: Make usage of static sink pad optional
There is no reason why we should mandate people to "at least" use the static
sink pad. This caused issues, like mandating that it should always have valid
content linked to it (problematic in case of upstream stream changes).

Instead we only use it if it's actually linked to, in which case it gets added
to the list of inputs.

This actually simplifies the code too.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7949>
2024-12-10 08:47:43 +00:00
Edward Hervey
93e432bccb urisourcebin: Fix issue re-using outputs
When checking whether a no-longer used output could be re-used for another slot,
we only want to do that for streams which are not still used.

Otherwise we end up potentially re-assigning a demuxer stream to a completely
different one

Furthermore, if we *are* re-using an output slot, indicate what the replacement
GstStream will be so slot matching can work properly (which can happen in the
case of demuxers which add/remove all pads even if only a single one changed)

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7949>
2024-12-10 08:47:43 +00:00
Edward Hervey
abb11ad8b4 urisourcebin: Fix collection leak
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8080>
2024-12-05 09:22:00 +01:00
Sebastian Dröge
05985247d1 streamsynchronizer: Only send GAP events out of source pads
If streamsynchronizer is waiting on the stream's sinkpad and srcpad at the same
time, it can happen that the GAP event is otherwise sent out of the sinkpad,
which is in the wrong direction.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7950>
2024-11-28 12:38:07 +00:00
Edward Hervey
18b941dfd5 decodebin3: Unify collection switching checks
We only want to switch to a selection of an output collection if all streams are
present.

This was previously only done in one place (when triggering by new incoming
streams) but not when triggered by user/application.

Avoid this by moving the check to handle_stream_switch()

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7941>
2024-11-25 08:03:38 +00:00
Philippe Normand
827caa662c playbackutils: Fix caps leak in get_n_common_capsfeatures()
The gst_static_caps_get() return value is transfer-full.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7908>
2024-11-16 18:24:23 +00:00
Edward Hervey
09be1ab863 urisourcebin: Also use event probe for HLS use-cases
Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3957

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7822>
2024-11-08 09:14:21 +00:00
Jan Schmidt
c02d41c259 subtitleoverlay: Check for memory capsfeature on video/x-raw
Don't assume that video/x-raw caps means buffers are mappable
or can be processed by videoconvert and friends. Only plug
those converters for real system memory, and treat other
memory capsfeatures as hardware surfaces

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7741>
2024-10-30 06:13:23 +00:00
Edward Hervey
39c770af90 playback: Improve stream list search
There is the possibility than an element/code/helper creates an identical
`GstStream` (same type and stream-id) instance instead of re-using a previous
one.

For those cases, when detecting whether a `GstStream` is already present in a
collection, we need to do more checks than just comparing the pointer.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7716>
2024-10-28 10:09:47 +00:00
Edward Hervey
0fda426656 urisourcebin: Aggregate collections from multiple parsebin
In the case where multiple parsebin are present (ex: from rtsp sources), we want
to aggregate the collections provided by the different parsebin and expose a
single "unified" collection.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7716>
2024-10-28 10:09:47 +00:00
Edward Hervey
a26984a72b parsebin: Store caps on parsepad as early as possible
When analyzing a new pad, we can store the updated caps on the GstStream if they
are fixed.

If they are not fixed, this function will be called again once the element will
provide them.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7716>
2024-10-28 10:09:47 +00:00
Edward Hervey
3fdfef15a1 parsebin: Don't store bogus caps on GstStream
If we can't get the current caps when receiving a stream-start, that's fine,
they can/will be provided by other means at a later time.

What we definitely should not do is provide the starting caps of the chain,
which are potentially completely different from the end ones (like for example
`application/x-rtp`)

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7716>
2024-10-28 10:09:47 +00:00
Edward Hervey
1814aec0d5 parsebin: Minor debug statement updates
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7716>
2024-10-28 10:09:47 +00:00
Sebastian Dröge
073831128b uridecodebin3: Remove "source" property
There is not necessarily a single urisourcebin inside uridecodebin3 so having a
single source property makes little sense. Additionally, this property was never
hooked up at all and always returned NULL.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7712>
2024-10-23 12:29:06 +00:00
Tim-Philipp Müller
f5169670bc playback: remove mention of gconf sinks from playbin docs
Fixes #3916

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7676>
2024-10-19 06:12:14 +00:00
Edward Hervey
189cbe7fdd urisourcebin: Don't remove probe if not present
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7609>
2024-10-18 08:49:50 +00:00
Edward Hervey
b2c0f490f0 urisourcebin: Set pad probe before linking pad
We want to grab all events that pass through, so we need to set the
probe **before** the pad is linked

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7609>
2024-10-18 08:49:50 +00:00
Edward Hervey
c97126212f urisourcebin: Streamline event forwarding code
Instead of two different functions for copying events and rewriting the
stream-start event, just have a single one.

This is needed, since we want to do both of those in one go, with the pad lock
taken.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7609>
2024-10-18 08:49:50 +00:00
Edward Hervey
f130382b08 parsebin: Set stream collection on pad before exposing it
We want to ensure the stream-collection is present on the pad (as a sticky
event) before we expose the pad.

This is more reliable since it will ensure it is present before any other event
is pushed through.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7609>
2024-10-18 08:49:49 +00:00
Edward Hervey
cb25b1e95e uridecodebin3: Use lock when checking input/output items
Otherwise there is the risk that the play items list could have changed in
between

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7609>
2024-10-18 08:49:49 +00:00
Edward Hervey
e1e48b9fea decodebin3: Free pending events on input pads when unlinking
Otherwise we could end up with *old* events leaking through on the next linking.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7609>
2024-10-18 08:49:49 +00:00
Théo Maillart
aaf9b46e2f decodebin3: do not attempt to remove a null stream
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7586>
2024-10-03 07:08:37 +00:00
Théo Maillart
4065ac5dcb decodebin3: protect internal reset with SELECTION_LOCK
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7586>
2024-10-03 07:08:37 +00:00
Théo Maillart
ed264d64b0 decodebin3: remove output event probe on remove input stream
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7586>
2024-10-03 07:08:37 +00:00
Edward Hervey
b21ffc6b9f urisourcebin: Ensure all stream-start are handled
In order to ensure all initial events (stream-start, caps, ..) are present on
pads that we expose, those various sticky events are propagated (from parsebin
to multiqueue output, from multiqueue output to exposed pads).

The problem was that the "hack" in `urisourcebin` to inform downstream elements
that the stream is parsed data and a collection will be present was only done in
one place : a probe on the output of parsebin ... but the stream-start could
potentially have already been propagated to the output pads before that.

In order to fix that, we make sure any pending sticky stream-start event is
updated before being propagated.

Fixes #3788

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7598>
2024-10-02 21:29:00 +00:00
Edward Hervey
32bf29d64d urisourcebin: Allow more cases for posting stream-collection
Previously urisourcebin only allows stream-collections messages from adaptive
demuxers or sources to be posted.

This commit also allows the case where they come from a single parsebin. We
still want to prevent it in the case where they are multiple parsebins, since
that would require some form of aggregation to show a single/unified collection.

In order to avoid a regression with uridecodebin3 behavior, we also implement
support for GST_QUERY_SELECTABLE, so that uridecodebin3 can figure out whether
it should let GST_MESSAGE_STREAM_COLLECTION flow upwards (because app/user could
react on it) or whether it drops it in order for decodebin3 to do the collection
aggregation and posting.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7597>
2024-10-02 19:40:48 +00:00