Commit graph

279 commits

Author SHA1 Message Date
Peter Hutterer
b5e98027b7 meson.build: drop VERSION, use PACKAGE_VERSION in the C sources
Slightly better namespaced since it's not usually used anywhere else, VERSION
is too generic.
2021-06-10 09:30:56 +02:00
Peter Hutterer
da339c286f meson.build: drop HAVE_CONFIG_H
This is an autotools leftover, with meson we're always guaranteed to have
the config.h file.
2021-06-10 09:04:16 +10:00
Peter Hutterer
0054319d88 meson.build: add -D_GNU_SOURCE to the project arguments
This appends it to every compilation command so we can get rid of the c_args
for (almost all) executables.
2021-06-09 07:47:51 +00:00
Peter Hutterer
95a84e797a treewide: replace !strcmp() with spa_streq()
This change is only done in source files for now, header files will be done
separately.
2021-05-18 22:10:27 +10:00
Peter Hutterer
7697ed0757 treewide: replace strcmp() == 0 with spa_streq()
This change is only done in source files for now, header files will be done
separately.
2021-05-18 22:10:27 +10:00
George Kiagiadakis
8911e22793 pipewiresink: release manually acquired buffers back to the pool
When we manually acquire buffers from the pool, we never release them.
But because gst_buffer_pool_acquire_buffer() adds a reference to the pool,
this leaks the pool eventually.

To fix this, just unref the buffer after it has been sent. This releases
it back to the pool and unrefs the pool.

This has no significant effect to the stream, since the underlying
pw buffers are actually pooled in the pw_stream. It just prevents leaking.
2021-05-10 17:25:57 +03:00
George Kiagiadakis
b86e5cabfa pipewiresink: use all the available dest memory when copying buffer
When pipewiresink needs to copy data, it has to resize the destination
buffer (to a smaller size) in order to send the correct data size to
pipewire. When this dest buffer is reused later, it will still have
this smaller size as its total size and the copy may discard data
from upstream if the new upstream buffer is bigger than the last one
that was copied on the same dest buffer.
2021-05-10 17:12:12 +03:00
Peter Hutterer
2405f0942b spa/buffer: rename SPA_MEMBER to SPA_PTROFF
SPA_MEMBER is misleading, all we're doing here is pointer+offset and a
type-casting the result. Rename to SPA_PTROFF which is more expressive (and
has the same number of characters so we don't need to re-indent).
2021-05-06 09:39:39 +00:00
Wim Taymans
ec331f4e4c gst: enable DMABUF explicitly to avoid mmap issues
PipeWire does not give DMABUF anymore to clients unless they
explicitly ask for it. This results in v4l2 sending an fd and
the mmapoffset + size fields in the buffer.

GStreamer does not handle the mmapoffset in the fd allocator and
thus runs into mmap problems when using the memory.

Enable DMABuf explicitly to work around the problem until
GStreamer is fixed.

Fixes #1115
2021-05-05 11:23:44 +02:00
George Kiagiadakis
ac91383cf5 pipewiresink: stop bufferpool flushing after resuming from pause
See #1048
2021-04-14 13:33:01 +00:00
Wim Taymans
68804a3082 gst: remove volatile, it causes a warning with newer gcc
See #1018
2021-04-05 10:28:54 +02:00
Thibault Saunier
485bae5eb0 meson: Use feature options everywhere it makes sense 2021-03-10 20:18:34 +00:00
Jakub Adam
c64bf36e8e gst: avoid crash with zero SPA_PARAM_BUFFERS_size
With sending and receiving pipelines:

  gst-launch videotestsrc ! tee !  pipewiresink mode=provide

  gst-launch pipewiresrc path=<node_id> ! videoconvert ! autovideosink

The first pipeline crashes when the other connects.

It happens because SPA_PARAM_BUFFERS_size passed to
pw_stream_update_params() upon pipewiresink's buffer pool activation is
zero. As a consequence, in gst_pipewire_pool_wrap_buffer(), d->type will
be SPA_ID_INVALID and the created GstBuffer will have no memory
appended. This ultimately leads to segfault in do_send_buffer().

If size hasn't been set in GstPipeWirePool's config before the
first buffer is to be rendered by pipewiresink, configure the pool with
the size of that first incoming buffer and activate the pool.
2021-01-28 20:50:07 +01:00
Gabriel Ebner
ad9d485d1b gst: set node.name and node.description based on client-name property 2020-12-26 10:11:42 +01:00
Wim Taymans
b8300c663b improve some errors
Silence some -ENOENT warnings, they can happen when the object we
are introspecting is destroyed
2020-11-29 16:22:50 +01:00
Elliott Sales de Andrade
86fd6a0d3e Fix some possible-NULL pointer usage. 2020-11-23 15:36:08 +00:00
Elliott Sales de Andrade
6224068586 Fix some possible leaks. 2020-11-23 15:36:08 +00:00
Wim Taymans
d7802202b0 gst: init last_seq
Fixes #339
2020-10-20 11:05:07 +02:00
Wim Taymans
4b7b2a9a10 gst: add option to disable device provider 2020-10-13 12:40:48 +02:00
Wim Taymans
f6bc9113ce gst: stop the thread loop before destroying objects
When we destroy the proxy we should either take the thread lock
or stop the thread loop because the destroy might trigger a reply
to remove the object from another thread. This can cause the
refcounting to become invalid and cause double free.

Fixes #286
2020-09-11 16:39:05 +02:00
Wim Taymans
82b0644e23 gst: rework device provider
Use the node and port info to enum formats when available.
Use simple resync after each operation, when nothing is pending,
loop over the results.
2020-08-11 17:34:23 +02:00
Wim Taymans
799fe7f90c gst: reset negotiated state before connect
Right before connecting, set ourselves to not negotiated.
First look for errors, then the negotiated state.
Handle NULL caps after negotiation.
2020-08-11 16:10:44 +02:00
Wim Taymans
47a6360112 gst: don't share memory
We can't allow to share our memory because it might disappear when
the server or source renegotiates.
2020-08-11 16:10:00 +02:00
Wim Taymans
b9862868c1 gst: convert properties to strings when we can 2020-08-06 15:10:44 +02:00
Wim Taymans
98b7dc7c0c gst: don't do set_caps from the pipewire callback
Don't do any GStreamer data transport from the PipeWire callback
because it might block in preroll and block our communication with
PipeWire. Instead, take the caps and wake up the caller to continue
with negotiation.
2020-08-06 13:03:40 +02:00
Wim Taymans
34334b6ea3 gst: increase buffers in sink 2020-08-06 12:58:13 +02:00
Wim Taymans
0347a753c9 gst: pool add support for DONT_WAIT flag 2020-08-06 12:52:16 +02:00
Wim Taymans
8a9bb9dabb Use fcnt F_DUPFD_CLOEXEC to dup an fd
Closes #38
2020-08-06 11:08:20 +02:00
Wim Taymans
5f40bc6d4e gst: support VideoCrop meta
Convert the VideoCrop metadata to GStreamer metadata.
2020-07-31 11:44:46 +02:00
Wim Taymans
6dcb19bbdf pipewiresrc: use more accurate timeout 2020-07-14 17:25:13 +02:00
Wim Taymans
36511a5d8e gst: measure keepalive-time in milliseconds
And round up to the next integer for now.
2020-07-14 14:29:45 +02:00
Wim Taymans
0344e09905 gst: add some more debug 2020-07-14 14:15:55 +02:00
Wim Taymans
993aa89030 gst: add keepalive-time property
Add a property to periodically send the last buffer to keep the
stream alive. Useful for sparse streams that need to keep the
encoder busy every once and a while.
2020-07-14 13:54:21 +02:00
Wim Taymans
70652d1a37 gst: share the core between connections
Make all sources in the same process with the same fd share the
connection to the server. This makes it possible to set the same
fd on multiple sources/sinks and have them all use the same
connection, like when capturing multiple monitors from screencast
with the portal.

Fixes #241
2020-07-13 18:38:19 +02:00
Wim Taymans
c173b23ac4 gst: use object_path to hide providers
Don't use the core info to manage the hiden providers, that info
can't be put there anymore because the session manager manages
the devices now.
Look at the object path instead and hide those with well known
prefixes.
2020-07-13 12:31:16 +02:00
Wim Taymans
8e9bbaf3dc pipewiresrc: add option to resend last buffer on EOS
Add an option to resend the last buffer on EOS with an updated
timestamp. This can be used to make sure encoders fill up the
gap between last buffer and EOS, like with sparse streams from
screen capture.
2020-07-13 12:11:34 +02:00
Wim Taymans
a596cdbf2e gst: return NULL for unknown format 2020-07-13 11:50:06 +02:00
Wim Taymans
cd7a56a71c gst: fix proxy leaks 2020-06-16 11:02:16 +02:00
Wim Taymans
1b4b8a9322 gst: check for NULL stream
The stream can already be closed when the buffers are recycled.

Fixes: #243
2020-06-04 20:29:41 +02:00
Wim Taymans
871bb47eb7 gst: handle pause/resume 2020-05-21 12:26:39 +02:00
Wim Taymans
6eba010d38 gst: do a sync before disconnect
This makes sure we first nicely remove the stream from the server
and then close the socket.

If we don't do this, the disconnect might not have flushed out our
disconnect and the server is left with a non-responsive node,
especially if the disconnect on the core was done with a socket from
the portal that is still open.
2020-05-21 12:26:37 +02:00
Wim Taymans
48dea3d5ea gst: handle stream create error 2020-05-21 12:26:32 +02:00
Wim Taymans
236ebeeb68 gst: fix bad unlock when pool acquire fails
The mutexs was not locked so don't try to unlock.
2020-05-20 15:24:25 +02:00
Wim Taymans
78aaf6c0bc gst: only pop and adjust choice when we pushed something 2020-05-20 15:24:25 +02:00
Wim Taymans
eb93f259e0 avoid some useless assignments 2020-05-20 15:24:25 +02:00
Wim Taymans
a19bab4b16 avoid following NULL pointers 2020-05-20 15:24:25 +02:00
Wim Taymans
653ae96b20 pipewiresrc: set corrupted flag
See #72
2020-05-09 19:46:14 +02:00
Michael Tretter
52c14e2378 gst: keep track of queued buffers
Pipewire might update buffers that have not been recycled by GStreamer,
because they are still used downstream. There is nothing we can do about
it in the pipewiresrc.

If a buffer is sent downstream more than once, take an additional
reference to make sure that we don't queue a buffer that is still used
and print a warning.
2020-05-05 13:53:02 +00:00
Wim Taymans
39c2d5b963 gst: remove internal queue
Remove the extra queue and use the queue from pw_stream.
Fix some locks and the bufferpool handling to make audio playback
work.
2020-04-23 15:56:12 +02:00
Wim Taymans
5d12929153 gst: use the pw_stream queue
There is no need to keep a separate queue in the source, simply use
the one from pw_stream.
2020-04-23 13:01:03 +02:00