Commit graph

7060 commits

Author SHA1 Message Date
Wim Taymans
9419a12e74 gst: add rate control to the sink
Track the elapsed time between buffers and try to keep the buffer fill
level constant by changing the rate of the stream.

See #4374
2024-12-03 12:11:47 +01:00
Taruntej Kanakamalla
922efaf6ed gst: drop empty buffers in pipewiresrc
In case the dequeued buffer is empty or of size 0, skip the buffer
so that the downstream elements do not report an error
2024-12-02 14:15:23 +05:30
Pauli Virtanen
371781e214 pulse-server: fix pulse.cmd load-module not loading multiple overrides
pw_context_conf_section_for_each() stops iterating on nonzero return
value, so make sure 0 is returned on success.
2024-11-28 19:34:22 +00:00
Jonas Holmberg
e9092d7d2f core: Remove redundant declaration
Fix problem when building with -Werror=redundant-decls:

../src/pipewire/core.h:661:7: error: redundant redeclaration of ‘pw_core_get_user_data’ [-Werror=redundant-decls]
  661 | void *pw_core_get_user_data(struct pw_core *core);
      |       ^~~~~~~~~~~~~~~~~~~~~
../src/pipewire/core.h:446:7: note: previous declaration of ‘pw_core_get_user_data’ with type ‘void *(struct pw_core *)’
  446 | void *pw_core_get_user_data(struct pw_core *object);
      |       ^~~~~~~~~~~~~~~~~~~~~
2024-11-27 17:33:11 +01:00
Arun Raghavan
45eee02a99 module-rtp: Account for in-flight samples in RTP receive
When not using PTP as the driver, it is possible that packet receive and
the process() callback are out of sync, meaning that the target buffer
fill level might be off by upto one ptime's worth of samples
occasionally. This would make the DLL hunt for the target rate, and
cause a constantly varying delay.

Accounting for the delta between the packet receive time and the
process() time allows us to eliminate this jitter, resulting in much
more consistent rate matching.
2024-11-27 11:48:50 +00:00
Wim Taymans
89993a3cc6 gst: enable the pipewire ticks as a clock source
Use the pipewire ticks again as the clock source.

This was disabled because the v4l2 sources created bad ticks for the
graph. Now that this is improved we can enable the ticks again.

This has the advantage that simple audio playback does not drift
anymore. The only remaining problem would be timestamp drift or
discontinuities, which we don't handle here yet.
2024-11-26 17:23:00 +01:00
Wim Taymans
3f0fe0032f node: add a clock flag to mark rate/duration inaccurate
Some clocks (v4l2) don't process exactly process buffers at the given
rate/duration so mark this in the clock flags.

We need to use the nsec field in the clock to derive ticks in pw-stream
in that case to get a good clock.
2024-11-26 17:02:02 +01:00
Wim Taymans
ef8d2ab125 gst: mark the pipewiresink as EARLY_PROCESS
We want to receive process callbacks as soon as a buffer is ready for
reuse because we dequeue it for use in our buffer pool.
2024-11-26 16:57:14 +01:00
Wim Taymans
4d4607e62a doc: copy docs from the _methods struct 2024-11-26 13:21:04 +01:00
Wim Taymans
31802d4994 add per type API defines 2024-11-26 11:58:51 +01:00
Wim Taymans
b03f2f7afa make per object IMPL 2024-11-26 11:35:50 +01:00
Wim Taymans
999b26c590 static inline more macros 2024-11-26 11:35:49 +01:00
Wim Taymans
90b0e45037 make static inline -> SPA_API_IMPL
So that we can export the symbols as well.
2024-11-26 11:35:49 +01:00
Wim Taymans
84bd4b7ea9 spa: use static inline for interfaces instead of macro
It gives better typechecking and a path to make a library of functions.
2024-11-26 11:35:49 +01:00
Wim Taymans
5e0e1204d7 impl-node: remove old check
Remove the check for the target rate and duration. The drivers are
supposed to update that now.

The check is a little racy because a new target could have been
configured right after the driver emitted the ready signal. In that
case we should not update the clock values but let the driver run with
the old values and let the new values become active in the next cycle.
2024-11-26 10:59:54 +01:00
Pauli Virtanen
c36c028dd2 pw-dump: don't emit remove events when not monitoring
When pw-dump is called without --monitor, it should output exactly one
JSON array, and no remove event indicators.
2024-11-23 12:11:33 +00:00
Wim Taymans
ae465ccbfc stream: fix EARLY_PROCESS again
It got removed with the async improvements. We shouñd simply ask more
buffers whenever we push one to be dequeued.

See #3480
2024-11-22 12:22:14 +01:00
Wim Taymans
e1fc3de595 modules: use pw_stream_set_rate() some more 2024-11-22 09:55:36 +01:00
Wim Taymans
804df3389a modules: use pw_stream_set_rate() when we can 2024-11-22 09:49:27 +01:00
Wim Taymans
433afeaa1e stream: add function to set adaptive resampler rate
Make a function to set the adaptive resampler.
2024-11-22 09:29:53 +01:00
Wim Taymans
188d920733 pass the right types to the methods
This currently works because we accept void* for these functions but it
will fail when we will use the real types.
2024-11-20 10:17:37 +01:00
Pauli Virtanen
e393e57a26 pulse-server: ensure positive stream delay in GET_PLAYBACK/RECORD_LATENCY
Pulseaudio protocol requires stream latency is uint64. Clamp the
Pipewire signed latency to the range, better than wrapping around.
2024-11-19 22:07:09 +02:00
Wim Taymans
a997627906 impl-node: save all previous timestamps on start
When the driver starts, save all previous node timestamps, not just the
previous signal time.

For async nodes, uses the previous timestamps in the profiler messages
so that we get stats with 1 cycle of delay instead of bogus values
because the node is still processing.

Fixes pw-top for async nodes.
2024-11-15 18:06:12 +01:00
Wim Taymans
f261b2f96f filter-chain: update channels from filter-graph
Add a filter-graph info structure with the number of inputs and outputs
in the graph definition.

Use the input/outputs to update the number of channels on the capture and
playback streams when not explicitly given. Also copy over the positions
when they match the other stream and were not explicitly specified.

Fixes #4404
2024-11-15 10:53:45 +01:00
Michael Olbrich
687075f2bd gst: handle interlace mode
If the peer announces an interlace mode then use it. Otherwise assume
that the video is not interlaced.

This also fixes a problem with caps negotiation:
If downstream reports caps with not fixated interlace mode, e.g.
"interlace-mode=(string){ progressive, interleaved, mixed }"
then without this, the caps handle_format_change() (in the pipewiresrc)
are not fixed and the source waits forever for the negotiation to
finish.
2024-11-14 17:18:28 +01:00
Wim Taymans
bb2d848bf6 impl-node: don't remove from graph when creating
When we were in the CREATING state, don't remove ourselves from the
graph because we were not added yet.
2024-11-14 15:56:57 +01:00
Wim Taymans
0833b19a75 module-vban: fill some default channel layouts
VBAN does not really transmit any channel layouts so make some
assumptions about the layout when not explicitly specified.
2024-11-14 11:07:05 +01:00
Wim Taymans
388f330700 module-vban: add stream.rules support
Make it possible to match the new VBAN streams on ip/port/name and media
properties and create a stream with custom properties.

See #4402
2024-11-14 09:59:12 +01:00
Wim Taymans
1a5514e5cf module-vban: create streams per stream_name
Always listen on the receive socket. Find the stream with the given
stream_name of the packet and create it if it doesn't exist.

Also take the sample-rate, channels and format from the packet
parameters instead of the config.

Fixes #4400
2024-11-13 16:47:34 +01:00
Wim Taymans
567b484386 filter-chain: move the filter-graph to plugins 2024-11-13 11:12:06 +01:00
Wim Taymans
2e157f7248 filter-chain: make filter-graph SPA plugins
Make SPA plugins from all the filter-graph plugins and use the plugin
loader to load them.

Because they are not in the standard plugin path in development, add
the module dir to the plugin path for now.
2024-11-13 10:20:54 +01:00
Wim Taymans
201455eecd filter-chain: don't link plugins to libpipewire
Reorganize some things so that we only link the pipewire module to
libpipewire. We don't need to link the filter-graph plugins to pipewire
anymore.
2024-11-12 16:32:54 +01:00
Wim Taymans
c3e668049b filter-chain: pass quantum-limit to plugins 2024-11-12 16:11:51 +01:00
Wim Taymans
13b8e3a75d filter-graph: Make dsp-ops and interface
Rename dsp-ops to audio-dsp and make it a SPA interface.

Pass the audio-dsp interface around with the support.
2024-11-12 15:54:28 +01:00
Wim Taymans
0a71911796 filter-chain: move the plugin to an audio-plugin
Make an interface of the audio plugins.
2024-11-12 12:51:15 +01:00
Wim Taymans
c8c89f7517 pulse: also set channels in the map
When converting a position to a channel-map, copy the number of channels
as well.

This broke with commit e2991f6398
2024-11-12 11:55:14 +01:00
Wim Taymans
22f7a1de28 filter-chain: move filter-chain to a spa_interface
Move the filter-chain code to a filter-graph SPA interface.

The idea is to make this more useful outside of the filter-chain.
2024-11-12 11:32:58 +01:00
Wim Taymans
d17c3fb72d filter-chain: move some biquad functions around
Make just 1 biquad function in dsp-ops.

Move the implementation prototypes to a separate header.
2024-11-11 17:59:10 +01:00
Wim Taymans
aad3d1eafa filter-chain: improve biquad run a little
We only need to copy source to dest on the first run.
2024-11-11 16:41:17 +01:00
Wim Taymans
02edfba21a filter-chain: don't let plugins depend on pipewire, just spa 2024-11-11 16:36:09 +01:00
Wim Taymans
44340fde05 module-rtp: allocate receive buffer based on MTU
Use the MTU to allocate the receive buffer instead of using a hardcoded
size.

Fixes #4394
2024-11-11 12:03:32 +01:00
Wim Taymans
a53bc035c0 module-rtp: calculate payload_size based on MTU
The actual payload size depends on the MTU but should not include the
IP/UDP and RTP headers.

Fixes #4396
2024-11-11 11:49:20 +01:00
Wim Taymans
bebad7888f gst: take the thread lock before calling pw_stream functions 2024-11-08 12:22:35 +01:00
Wim Taymans
1661f15b9c filter-chain: pass dict in plugin load function
So that we can pass some more properties around and remove the
quantum_limit hardcoded value.
2024-11-07 16:40:38 +01:00
George Kiagiadakis
c7854e1da4 filter-chain: move dsp_ops pointers to dynamically allocated memory
Make a plugin structure that is dynamically allocated for each plugin
and pass it around to the descriptor instance structures, so that they
all have access to dsp_ops without sharing a static pointer.

The problem with the static pointer is that the dsp_ops structure is
actually allocated in module-filter-chain's instance structure,
so it always points to the instance of the last filter-chain that was
loaded in the process. When this is unloaded, the other filter-chains
crash.
2024-11-07 15:15:03 +00:00
Wim Taymans
f7e97ab157 examples: update the examples with new lazy scheduling flags
The src can listen to RequestProcess commands and so gets the
node.supports-request = 1 property.

The play-pull example can both be a driver that listens to
RequestProcess or a lazy driver so set this in properties as well.
We can now remove the priority.driver property because automatic
priority selection will make us a driver or not.

With this change, video-src to video-play-pull will use lazy scheduling
with play-pull as the driver. video-play-pull to v4l2src will use
normal scheduling and video-src to video-play will also use normal
scheduling.
2024-11-06 12:57:48 +01:00
Wim Taymans
7abf11210d stream: expose the lazy flag with pw_stream_is_lazy()
Together with the is_driver() status, this can be used to check if the
stream is using lazy scheduling or not.
2024-11-06 12:57:48 +01:00
Wim Taymans
f16f074725 context: set lazy scheduling flags in clock
Collect the request scheduling flags and when there is a lazy driver,
set the lazy scheduling flag in its clock. This means that the driver
can expect RequestProcess commands to start the scheduling.

Pass the lazy scheduling clock flag to the node.

Make sure lazy scheduling driver have a higher priority than their
request drivers.
2024-11-06 12:57:48 +01:00
Wim Taymans
9c49bffc22 keys: add lazy scheduling flags and docs 2024-11-06 12:57:48 +01:00
Wim Taymans
ae0dd9195a modules: add ratelimit to xrun warnings in jack-tunnel
Take the current cycle times early and in all cases. We can use this to
get the current frame time for debugging purposes instead of the more
heavy jack_frame_time().

Rate limit the xrun warnings.
2024-11-06 12:29:21 +01:00