2021-05-25 19:55:06 +10:00
|
|
|
/** \page page_design PipeWire Design
|
2015-08-21 11:46:29 +02:00
|
|
|
|
2017-06-21 13:17:43 +02:00
|
|
|
PipeWire is a media server that can run graphs of multimedia nodes.
|
|
|
|
|
Nodes can run inside the server or in separate processes.
|
2015-08-21 11:46:29 +02:00
|
|
|
|
|
|
|
|
Some of the requirements are:
|
|
|
|
|
|
2017-06-21 13:17:43 +02:00
|
|
|
- must be efficient for raw video using fd passing and audio with
|
|
|
|
|
shared ringbuffers
|
2016-05-09 12:16:04 +02:00
|
|
|
- must be able to provide/consume/process media from any process
|
2015-08-21 11:46:29 +02:00
|
|
|
- policy to restrict access to devices and streams
|
2017-06-21 13:17:43 +02:00
|
|
|
- extensible
|
2015-08-21 11:46:29 +02:00
|
|
|
|
|
|
|
|
Although an initial goal, the design is not limited to raw video
|
|
|
|
|
only and should be able to handle compressed video and other
|
2017-06-21 13:17:43 +02:00
|
|
|
media as well.
|
2015-08-21 11:46:29 +02:00
|
|
|
|
2017-06-21 13:17:43 +02:00
|
|
|
PipeWire uses the SPA plugin API for the nodes in the graph. SPA is
|
|
|
|
|
a plugin API designed for low-latency and efficient processing of
|
|
|
|
|
any multimedia format.
|
|
|
|
|
|
|
|
|
|
Some of the application we intend to build
|
|
|
|
|
|
|
|
|
|
- v4l2 device provider. Provide controlled access to v4l2 devices
|
|
|
|
|
and share 1 device between multiple processes.
|
|
|
|
|
|
|
|
|
|
- gnome-shell video provider. Gnome-shell provides a node that
|
|
|
|
|
gives the contents of the frame buffer for screen sharing or
|
|
|
|
|
screen recording.
|
|
|
|
|
|
|
|
|
|
- audio server. Mix and playback multiple audio streams. The design
|
|
|
|
|
is more like CRAS (Chromium audio server) than pulseaudio and with
|
|
|
|
|
the added benefit that processing can be arranged in a graph.
|
|
|
|
|
|
|
|
|
|
- Pro audio graph processing like JACK.
|
|
|
|
|
|
|
|
|
|
- Media playback backend
|
2015-08-21 11:46:29 +02:00
|
|
|
|
|
|
|
|
|
2017-01-19 18:10:00 +01:00
|
|
|
Protocol
|
|
|
|
|
--------
|
2016-05-05 13:31:18 +02:00
|
|
|
|
2017-06-21 13:17:43 +02:00
|
|
|
The native protocol and object model is similar to wayland but with custom
|
2017-01-19 18:10:00 +01:00
|
|
|
serialization/deserialization of messages. This is because the datastructures
|
2020-07-22 20:54:06 +02:00
|
|
|
in the messages are more complicated and not easily expressible in xml format.
|
2015-08-21 11:46:29 +02:00
|
|
|
|
|
|
|
|
|
2017-06-21 13:17:43 +02:00
|
|
|
Extensibility
|
2015-12-04 16:39:29 +01:00
|
|
|
-------------
|
|
|
|
|
|
2017-06-21 13:17:43 +02:00
|
|
|
The functionality of the server is implemented and extended with modules and
|
|
|
|
|
extensions. Modules are server side bits of logic that hook into various
|
|
|
|
|
places to provide extra features. This mostly means controlling the processing
|
|
|
|
|
graph in some way.
|
|
|
|
|
|
|
|
|
|
Extensions are the client side version of the modules. Most extensions provide
|
|
|
|
|
both a client side and server side init function. New interfaces or new object
|
|
|
|
|
implementation can easily be added with modules/extensions.
|
|
|
|
|
|
|
|
|
|
Some of the extensions that can be written
|
|
|
|
|
|
|
|
|
|
- protocol extensions: a client/server side API (.h) together with protocol
|
|
|
|
|
extensions and server/client side logic to implement a new object or
|
|
|
|
|
interface.
|
|
|
|
|
|
|
|
|
|
- a module to check security of method calls
|
|
|
|
|
|
|
|
|
|
- a module to automatically create or link or relink nodes
|
2016-07-28 21:19:20 +02:00
|
|
|
|
2017-06-21 13:17:43 +02:00
|
|
|
- a module to suspend idle nodes
|
2021-05-25 19:55:06 +10:00
|
|
|
|
|
|
|
|
*/
|