Commit graph

7238 commits

Author SHA1 Message Date
Olle Axelsson
1cc00923db gst: Ensure possible_caps exists before comparing caps
During negotiation, ensure that possible_caps exists before calling
gst_caps_intersect_full(). Sometimes possible_caps seem to be NULL which
cause the GST_IS_CAPS assert to fail.

The reason for the occasional NULL possible_caps during initial
negotiation is unknown, but this is also possible during renegotiation.
The handle_format_change() may be triggered before the next create(),
win which case we have not yet discovered in the streaming thread that
we are in the NOT_NEGOTIATED state. We should guard against this
possibility as well.
2025-01-30 13:38:55 -05:00
Wim Taymans
dea6fa7f4c systemd: add systemwide pipewire-pulse files
We can and it works, so why not.
2025-01-30 12:50:49 +01:00
Arun Raghavan
9ca9579978 rtp: Initialise source receiving state to true be default
Because we don't know the stream state at the start of streaming, if
clients are deciding to connect on the basis of this flag, they will
never connect if we default to true. So let's be optimistic by default
and we'll find out on timeout if there actually isn't data to receive.
2025-01-29 14:21:48 +00:00
Wim Taymans
516f86c329 protocol: improve manager socket handling
Some of the tools would like to connect to the manager socket first
because they are manager style apps. They however completely ignore any
of the configured sockets in the config and assume everything is the
default.

Fix this by adding a remote.intention = "manager" to those apps. This
instructs the protocol to first try to connect to a socket with the
-manager extension before attempting the regular configured socket.

This makes things work when you have sockets configured in /tmp
and have remote.name = /tmp/pipewire-0 in the config.
2025-01-29 12:59:45 +01:00
Wim Taymans
546de65c67 pulse: sanitize the remote name
We use the remote name as a suffix for the default server address and so
it should not contain any slashes. Take everything after the last slash
if there is one.
2025-01-29 12:09:36 +01:00
Wim Taymans
70ca546c6a protocol-native: don't overwrite the intention with remote.name 2025-01-29 12:08:20 +01:00
Wim Taymans
864438e8e9 stream: don't emit drain when in progress
We keep on calling the drain event for as long as we are drained. The
application is supposed to inactivate the stream or provide more data
at some point.

Because we do this from the data thread, we use a non-blocking invoke.
If for some reason the event callback takes a long time we might place a
lot of these invoke calls into the invoke queue, which will then be
dispatched one after another (and cause more blocking or a burst of
useless invoke calls).

Avoid this by only placing one drain invoke call into the queue at a
time.

Fixes #4529
2025-01-28 16:51:10 +01:00
Wim Taymans
b341668fda stream: fix id and status swap 2025-01-28 13:22:20 +01:00
Michael Tretter
0829f32114 stream: clear buffer from io when clearing buffers
If a provider uses the stream API and pushes a buffer to the stream
after the stream is set to paused, the buffer_id of the last buffer
remains in the io.

If a consumer starts streaming in this state, the buffer_id of the old
buffer is still in the io. The consumer receives a stale buffer_id and
may discard the buffer. Now the buffer is lost, since it is still marked
as busy on the producer.

This can be reproduced by starting Weston with the PipeWire backend and
repeatedly restarting a GStreamer pipeline that connects to the Weston
output. Eventually Weston won't be able to dequeue buffers since the
lost buffer is still busy.

Clear the buffers in the io when the buffers are cleared to avoid
sending an old buffer_id to the consumer.
2025-01-28 12:50:37 +01:00
Wim Taymans
5765ac61ab doc: move modules around to add to docs 2025-01-28 12:33:47 +01:00
Wim Taymans
636c5373c7 doc: add SPA modules 2025-01-28 11:48:58 +01:00
Wim Taymans
f60fe6d6e4 docs: add more docs for the SPA modules 2025-01-28 10:33:05 +01:00
Wim Taymans
73e7f61d8c modules: add more docs 2025-01-28 10:13:59 +01:00
Wim Taymans
4e3d5e2ac5 modules: add some more docs 2025-01-28 09:59:37 +01:00
Wim Taymans
4d5ed3f292 modules: document metadata module 2025-01-27 16:13:14 +01:00
Wim Taymans
e210925c24 modules: document the metadata factory a little 2025-01-27 15:52:48 +01:00
Wim Taymans
aecb406a96 modules: document link-factory context.objects 2025-01-27 15:24:42 +01:00
Wim Taymans
8b02e5f737 stream: fix ticks calculation 2025-01-24 16:39:16 +01:00
Wim Taymans
fa15af376f context: avoid some scaling overflows
Make a macro to scale without overflows and use this in the context.
2025-01-24 16:23:01 +01:00
Wim Taymans
eb462302b7 docs: fix indentation of properties 2025-01-24 16:23:01 +01:00
Michael Tretter
0468712fea stream: fix ticks calculation if rate is 0/0
If the rate is 0/0, converting nsec to ticks doesn't work and will
result in 0 ticks, and it is not possible to convert ticks back to a
timestamp.

This can be reproduced by connecting a GStreamer pipewiresrc to a
libcamera node. The libcamera-utils has a rate of 0/0 and the
pipewireclock won't be able to determine a correct time with that.  This
error was caused by Commit 89993a3cc6 ("gst: enable the pipewire ticks
as a clock source").

Fix this by using the nsec as ticks and setting the appropriate rate.
2025-01-24 16:03:42 +01:00
Wim Taymans
5d35986329 doc: document module-link-factory 2025-01-24 15:35:46 +01:00
Wim Taymans
19d78ef195 module: improve loopback docs 2025-01-24 13:13:23 +01:00
Wim Taymans
40c1552402 modules: improve profiler docs
The profiler now can have arguments.
2025-01-24 12:53:13 +01:00
Wim Taymans
830bd19ca2 rtp: take into account ipv4/ipv6 when calculating header size
Calculate the header_size based on the IP version instead of using a
hardcoded value.

Fixes #4524
2025-01-24 12:45:05 +01:00
Taruntej Kanakamalla
180967bb64 gst: pipewirepool:fix lock evasion in release_buffer 2025-01-24 10:51:29 +00:00
Arun Raghavan
800cd53c56 gst: sink: Whitespace fixups 2025-01-23 10:17:19 -05:00
Arun Raghavan
9ece286c90 gst: Fix up some debug logs
Copy-pasto in the pause code, plus let's use GST_DEBUG_OBJECT() so
we can track which pool is affected.
2025-01-23 10:17:19 -05:00
Wim Taymans
de7016f155 filter: mark RT safe methods 2025-01-22 15:21:40 +01:00
Wim Taymans
122170ad62 stream: mark functions with RT safe
Add some docs about the process function being a realtime thread and
mark the functions you can call in realtime threads.

Fixes #4521
2025-01-22 13:04:59 +01:00
Wim Taymans
96d593cc34 rtp: idle the source when in timeout
Idle the source when no packets are received and resume when new packets
arrive.

Add a stream.may-pause property to pause the stream when no packets are
received during the timeout window.

Make sure the rtp.streaming property is updated correctly and as soon as
we get the first packet.

Fixes #4456
2025-01-21 16:51:31 +01:00
Wim Taymans
a44afd84ff sap: only send bye + new SAP when SDP changed
Reorganize some code to separate the creation and sending of the SAP
message.

Check if when the node changed, we have an actual change in the SDP
before we send BYE and the new SAP message. It's possible that nothing
changed, for example when the node simply changed state or an unrelated
property.
2025-01-21 15:43:10 +01:00
Wim Taymans
4b24619160 rtp-source: avoid bitfield races
The different bits are written to from different threads.
2025-01-20 14:00:21 +01:00
Wim Taymans
7da9c2b25d examples: surround loop_iterate() with enter() and leave()
See #4476
2025-01-20 12:00:02 +01:00
Wim Taymans
b97dd00f26 loop: add some more docs about loop_control
Add a gmainloop integration example.

See #4467
2025-01-20 11:48:07 +01:00
Wim Taymans
78649b12f6 thread-loop: clarify some docs about locking 2025-01-20 10:04:09 +01:00
Wim Taymans
d36a867788 gst: only return the custom flag when in _render()
Make a custom ACQUIRE flag and if it's set, return the custom error
when the pool is empty.
2025-01-17 17:08:07 +01:00
Wim Taymans
c7ccc5abca gst: handle blocking in the _render() function
When we do any other blocking in the render function, we should unblock
and call _wait_preroll() when we go to PAUSED.

We can have this situation when all the buffers are queued in the
pw_stream and we get a new _render() call. We can't get more buffers
from the pool and so we must block and wait.  When we go to PAUSED we
need to unlock and go to _wait_preroll(). Implement this by setting a
pool paused flag that is set when the sink goes to paused, we can then
return a special value that does the wait_preroll().

See !2248
2025-01-17 16:33:15 +01:00
Wim Taymans
c81910a51c gst: use gst_buffer_get_size() to get the buffer size
_get_sizes() contains the padding and we don't want to copy that.
2025-01-17 12:19:07 +01:00
Taruntej Kanakamalla
86e7429039 gst: pipewiresink: don't flush bufferpool in PLAYING_TO_PAUSED
Setting bufferpool to flushing state in PAUSED state is preventing the
buffer flow if there is a seek/flush event.
Instead, set the bufferpool to flushing during the `flush-start` event
and clear it during the `flush-stop`

Deactivate/activate the stream during flush event only if the sink is
in the PLAYING state. In the PAUSED or READY state, the stream would be
inactive and we do not want to alter that
2025-01-17 13:03:34 +05:30
Wim Taymans
c62905d911 pulse-server: clear old data when jumping forwards
When we write samples, check if we make a jump in the ringbuffer and
clear the samples we jumped over.

If we don't do this, the reader side might pick up old samples that we
didn't write or clear but that are now available for reading after we
made a jump in the ringbuffer.

This migh not be exactly what pulseaudio does but it is good for now.

Fixes #4464
2025-01-16 16:21:22 +01:00
Wim Taymans
cf7e917024 pulse-server: make a function to silence a buffer 2025-01-16 16:16:39 +01:00
Taruntej Kanakamalla
c0a6a7ea32 gst: handle flush event in pipewiresink
flush the pw buffers to the stream's queue during a FLUSH_START event
and return the unqueued pw buffers, if they are dropped/released without
being rendered, so they can be available to be dequeued for the subsequent
`acquire` calls
2025-01-15 17:03:21 +00:00
Taruntej Kanakamalla
b70e99c41a stream: new api to return unused buffer
Push the buffer back to `dequeued` in case of playback and capture.
This will help avoid starvation during events like seek/flush
2025-01-15 17:03:21 +00:00
Wim Taymans
24bcacc619 conf: remove client-rt.conf
We now automatically move non-rt clients into non-rt threads so the
client-rt.conf is obsolete.

Move the module-rt in client.conf and add conditions to disable modules.

Transparently load client.conf in case applications still specify
client-rt.conf.

Custon configuration in the client-rt.conf.d/ should be moved to
client.conf.d/
2025-01-14 12:40:05 +01:00
Pauli Virtanen
08700a9eb5 pipewire: use local real time timestamps in logging
Wireplumber and other system services use local real time timestamps in
logging, so it's more convenient if also PW uses them.

Add env var for selecting the timestamp type, default to "local".
2025-01-13 13:48:22 +00:00
Philippe Normand
13c869801c gst: core: Fixup connection error handling
Commit b57b5703d6 made use of `spa_strerror()`
which is incorrect here because pw_connect sets `errno`, so we should use
`strerror()`.
2025-01-12 11:42:29 +00:00
Philippe Normand
b57b5703d6 gst: core: Properly report connection errors 2025-01-12 11:15:04 +00:00
Wim Taymans
1030000890 network-utils: handle inet_ntop errors 2025-01-09 16:28:51 +01:00
Wim Taymans
509e769aa5 core: inherit the default.clock.quantum-limit from the server
Copy the server value to the context so that the locally allocated
buffers match the server quantum-limit and we don't cause xruns because
of too small buffers.

See #4490
2025-01-09 11:38:07 +01:00