pipewire/doc/pipewire-design.dox

80 lines
2.7 KiB
Plaintext
Raw Normal View History

/** \page page_design Design
2015-08-21 09:46:29 +00:00
2021-07-29 04:43:40 +00:00
A short overview of PipeWire's design.
2017-06-21 11:17:43 +00:00
PipeWire is a media server that can run graphs of multimedia nodes.
2021-07-29 04:43:40 +00:00
Nodes can run inside the server process or in separate processes,
communicating with the server.
2015-08-21 09:46:29 +00:00
2021-07-29 04:43:40 +00:00
PipeWire was designed to
2015-08-21 09:46:29 +00:00
2021-07-29 04:43:40 +00:00
- be efficient for raw video using fd passing and audio with
2017-06-21 11:17:43 +00:00
shared ringbuffers
2021-07-29 04:43:40 +00:00
- be able to provide/consume/process media from any process
- provide policy to restrict access to devices and streams
- be easily extensible
2015-08-21 09:46:29 +00: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 11:17:43 +00:00
media as well.
2015-08-21 09:46:29 +00:00
2021-07-29 04:43:40 +00:00
PipeWire uses the \ref page_spa "SPA plugin API" for the nodes in the graph.
SPA is designed for low-latency and efficient processing of any multimedia
format. SPA also provides a number of helper utilities that are not available
in the standard C library.
2017-06-21 11:17:43 +00:00
Some of the application we intend to build
2021-07-29 04:43:40 +00:00
- v4l2 device provider: Provide controlled access to v4l2 devices
and share one device between multiple processes.
2017-06-21 11:17:43 +00:00
2021-07-29 04:43:40 +00:00
- gnome-shell video provider: GNOME Shell provides a node that
2017-06-21 11:17:43 +00:00
gives the contents of the frame buffer for screen sharing or
screen recording.
2021-07-29 04:43:40 +00:00
- audio server: Mix and playback multiple audio streams. The design
is more like CRAS (Chromium audio server) than PulseAudio and with
2017-06-21 11:17:43 +00:00
the added benefit that processing can be arranged in a graph.
- Pro audio graph processing like JACK.
- Media playback backend
2015-08-21 09:46:29 +00:00
Protocol
--------
2021-07-29 04:43:40 +00:00
The native protocol and object model is similar to
[Wayland](https://wayland.freedesktop.org) but with custom
serialization/deserialization of messages. This is because the datastructures
2021-07-29 04:43:40 +00:00
in the messages are more complicated and not easily expressible in XML.
See \ref page_module_protocol_native for details.
2015-08-21 09:46:29 +00:00
2017-06-21 11:17:43 +00:00
Extensibility
-------------
2017-06-21 11:17:43 +00: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
2021-07-29 04:43:40 +00:00
graph in some way. See \ref page_pipewire_modules for a list of current
modules.
2017-06-21 11:17:43 +00:00
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
2021-07-29 04:43:40 +00:00
- a module to automatically create, link or relink nodes
2017-06-21 11:17:43 +00:00
- a module to suspend idle nodes
*/