Commit graph

256 commits

Author SHA1 Message Date
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
Wim Taymans
26fa35a0e7 gst: always use the clock time
Also use the clock time when the stream is not yet started.
2020-04-23 12:38:05 +02:00
Michael Tretter
fd00d16361 gst: add properties for limits of negotiated buffers
By default, the pipewiresrc tries to negotiate 16 buffers. This value is
hard coded in the pipewiresrc. If the buffers are large, this could lead
to an undesirably high memory usage. Applications that know about the
buffer size and that fewer buffers are sufficient should be able to
configure the limits for the number of buffers that are negotiated.

Therefore, add the min-buffers and max-buffers properties to the
pipewiresrc to enable applications to configure limits for the number of
negotiated buffers.
2020-04-13 07:42:35 +00:00
Wim Taymans
7a29c15628 enable more warnings
Fix some warnings
2020-04-01 12:51:42 +02:00
Wim Taymans
d52df30c88 pipewireclock: use the monotonic time for now
Don't try to use the ticks for the clock but use the monotonic
timestamp instead.
2020-02-11 13:08:04 +01:00
Wim Taymans
c12f2276c4 stream: streams are always live for now. 2020-02-11 11:22:52 +01:00
George Kiagiadakis
9100fb653d gst: fix typo 2020-01-28 09:55:09 +01:00
Wim Taymans
043e7f24fe add some more useful defines
Add define to match all ids for nodes and params.
Add define for invalid permissions
2020-01-15 11:15:51 +01:00
Michael Tretter
eea3bc22b7 gst: do not send UNKNOWN format
If the video format cannot be detected, GStreamer will return the
UNKNOWN format, which is translated into the Id 0 in the
Spa:Interface:TypeMap, which is added to the pod.

When the pipewire server receives the pod and tries to unmarshal the
pod, it will detect the Id 0. Unable to distinguish Id 0 from a missing
id, the server discards the message as invalid and closes the
connection.

Use the following gstreamer pipeline to reproduce (note the wrong nv12
instead of a correct NV12 format):

	gst-launch-1.0 pipewiresrc ! video/x-raw,format=nv12 ! fakesink
2019-12-19 15:43:10 +01:00
Michael Tretter
5fa7630934 gst: fix NULL pointer when listing devices
The gstdeviceprovider segfaults when listing the available devices,
because it the pointer to GList * is initialized with NULL instead of
the GList * itself. Don't use a pointer, but use the GList * directly.
2019-12-19 15:43:00 +01:00
Michael Tretter
dfa8011ed4 gst: fix log level of GStreamer debug messages
Messages that are printed for every buffer should use the LOG debug
level, while messages that happen during setup and tear down should use
the DEBUG debug level.

Therefore, use LOG in on_process and when popping buffers and DEBUG when
Pipewire adds or removes buffers.
2019-12-19 15:42:55 +01:00
Michael Tretter
d5b1ab9db4 gst: replace tabs with spaces
In general, the GStreamer elements use spaces for indentation. Replace
the tabs by spaces.
2019-12-19 15:42:42 +01:00
Wim Taymans
f391353c7f Make interface types a string
This is more in line with wayland and it allows us to create new
interfaces in modules without having to add anything to the type
enum. It also removes some lookups to map type_id to readable
name in debug.
2019-12-19 13:36:04 +01:00
Wim Taymans
698ab911c3 loop: pass spa_dict to *_loop_new
Make the thread_loop alloc its own loop by default to simplify
some core. Add extra new_full method to pass a custom pw_loop.
Make other loop implementations ready to support custom loops
if we want that later.
2019-12-13 11:34:25 +01:00
Wim Taymans
c23006fcdb pw_port_proxy -> pw_port 2019-12-11 15:59:26 +01:00
Wim Taymans
beb3c69dfe pw_node_proxy -> pw_node 2019-12-11 15:26:11 +01:00
Wim Taymans
49d736bbb7 pw_registry_proxy -> pw_registry 2019-12-11 09:44:48 +01:00
Wim Taymans
ecc6b27cd7 rename core_proxy -> core
Rename core_proxy to core and move the introspect and interface
contents to core.h

In an effort to promote the proxy API.
2019-12-11 07:46:59 +01:00
Wim Taymans
8ea78c2e3f pw_core -> pw_context
The proxy API is the one that we would like to expose for applications
and the other API is used internally when implementing modules or
factories.

The current pw_core object is really a context for all objects so
name it that way. It also makes it possible to rename pw_core_proxy
to pw_proxy later.
2019-12-10 18:19:56 +01:00
Wim Taymans
8a959ea7a1 core_proxy: prepare to rename pw_remote -> pw_core_proxy
The pw_remote object is really a wrapper around the pw_core_proxy.
The events it emits are also available in the core proxy and are
generally awkward to use.

With some clever new pw_core_proxy_* methods and a pw_core_connect
to create the core_proxy, we can convert all code away from pw_remote.

This is a first step in this conversion, using the pw_remote behind
the scenes. It leaks into some places because it really needs to become
its own struct in a next step.
2019-12-06 11:48:40 +01:00
Wim Taymans
738603fd04 stream: Align with pw_filter
Remove some of the unused states in pw_stream. The app can know the
state by following the format and buffer events.

Make it possible to be notified of io are updates. This should make it
possible to follow the transport etc.

Make it possible to be notified of any param changes.

Rename finish_format to update_params because that is what it does.
Make this work in the same was as the filter: updating the params
removes all old params of the types and installs the new ones.

Don't get the Props and PropInfo from the node proxy, instead get them
directly from the adapter that we have locally. Update the controls
directly on the adapter instead of going to the server first.
2019-11-21 16:14:50 +01:00
Wim Taymans
9ffec214b8 fix includes 2019-10-25 15:01:02 +02:00
Wim Taymans
c9855763c3 remote: always close the fd in connect_fd
Not closing the fd causes leaks in existing apps. It's probably better
to always close it and let apps deal with that by using dup or similar.

Make gst sink and source dup the fd before connect_fd().

Fixes #181
2019-09-10 11:05:38 +02:00
Wim Taymans
8db4a797aa core: remove parent_id from the global event
Remove the parent_id from the global event. Remove the parent
and owner from the global object.

Use properties instead to mark parents and owners of objects.

Properties are easier to control for client exported objects and
usually a simple parent/child is not enough. For example, a client
exported node has the client as a parent but also the factory that
created the node.
2019-08-16 22:11:42 +02:00