mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-01 22:58:50 -04:00
204 lines
6.2 KiB
Text
204 lines
6.2 KiB
Text
Pinos
|
|
-----
|
|
|
|
The idea is to make a DBus service where you can provide
|
|
and consume media to/from.
|
|
|
|
Some of the requirements are:
|
|
|
|
- must be efficient for raw video using fd passing
|
|
- must be able to provide/consume/process media from any process
|
|
- streaming media only (no seeking)
|
|
- policy to restrict access to devices and streams
|
|
|
|
Although an initial goal, the design is not limited to raw video
|
|
only and should be able to handle compressed video and other
|
|
streamable media as well.
|
|
|
|
The design is in some part inspired by pulseaudio, hence its original
|
|
name. Increasinly we also seem to add functionality of jack.
|
|
|
|
|
|
Objects
|
|
-------
|
|
|
|
Daemon1: the main pinos daemon
|
|
/org/pinos/server
|
|
Client1: a connected client, the result object from call
|
|
Daemon1.ConnectClient
|
|
/org/pinos/client*
|
|
Node1: a processing node, this can be a source, sink or transform
|
|
element. Nodes have ports
|
|
/org/pinos/node*
|
|
Link1: a link between 2 ports
|
|
/org/pinos/link*
|
|
|
|
|
|
DBus protocol
|
|
-------------
|
|
|
|
The main daemon is registered on the session bus with name: org.pinos
|
|
|
|
Various Node1 objects are registered in the server based on the available
|
|
sources or sinks of content. Node1 has properties and its ports have format
|
|
descriptions of what it can provide or consume.
|
|
|
|
First a client needs to register a Node1 with pinos by calling
|
|
org.pinos.Daemon1.CreateClientNode(). This creates a new Client1 object and
|
|
a Node 1 object that the client must use for further communication.
|
|
|
|
A client then needs to use the pinos protocol to control the Node1. It will
|
|
also receive commands and notifications from pinos.
|
|
|
|
|
|
fd management
|
|
-------------
|
|
|
|
Clients receive fds with buffers and memory after a format was negotiated.
|
|
Updates to these buffers are notified by a message containing the id of the
|
|
buffer.
|
|
|
|
* client remove
|
|
|
|
When a client disconnects from pinos, it must have released all fd-indexes
|
|
that it received. Pinos will force a release and will reuse the fd-indexes
|
|
when the client disconnects.
|
|
|
|
|
|
Wire
|
|
----
|
|
|
|
The wire protocol for the node control channel is a serialization of
|
|
structures.
|
|
|
|
|
|
+-----+ +----+ +----+
|
|
| | | S | | |
|
|
| ----- ----- |
|
|
+-----+ +----+ +----+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+----+
|
|
| |
|
|
| C |
|
|
+----+
|
|
|
|
|
|
Client Proxy
|
|
| INIT
|
|
node-update |
|
|
-------------------------------------->|
|
|
port-update |
|
|
-------------------------------------->|
|
|
state-change CONFIGURE | CONFIGURE
|
|
-------------------------------------->|
|
|
|<--- enum-ports
|
|
|<--- enum-formats
|
|
|<--- add-port
|
|
|<--- remove-port
|
|
set-property |<--- set-property
|
|
<--------------------------------------|
|
|
set-format |<--- set-format
|
|
<--------------------------------------|
|
|
|
|
|
port-update |
|
|
-------------------------------------->|
|
|
state-change READY | READY
|
|
-------------------------------------->|
|
|
|<--- port memory requirements
|
|
add-mem |<--- use-buffers
|
|
<--------------------------------------|
|
|
remove-mem |
|
|
<--------------------------------------|
|
|
add-buffer |
|
|
<--------------------------------------|
|
|
remove-buffer |
|
|
<--------------------------------------|
|
|
|
|
|
pause |<--- stop
|
|
<--------------------------------------|
|
|
state-change PAUSED | PAUSED
|
|
-------------------------------------->|
|
|
|
|
|
play |<--- start
|
|
<--------------------------------------|
|
|
state-change STREAMING | STREAMING
|
|
-------------------------------------->|
|
|
|
|
|
need-input |
|
|
<------------------------------------->|
|
|
have-output |
|
|
<------------------------------------->|
|
|
process-buffer |
|
|
<------------------------------------->|
|
|
reuse-buffer |
|
|
<------------------------------------->|
|
|
|
|
|
|
|
|
|
|
1) Update config C->S INIT
|
|
|
|
node-update
|
|
port-update
|
|
state change CONFIGURE
|
|
|
|
2) Set formats S->C CONFIGURE
|
|
|
|
set-property
|
|
enumerate ports
|
|
add-port
|
|
remove-port
|
|
enumerate formats
|
|
set-format
|
|
|
|
3) Buffer requirements update C->S
|
|
|
|
Update port status
|
|
state change READY if enough formats are set
|
|
|
|
4) Start S->C READY
|
|
|
|
read port memory requirements
|
|
add_mem
|
|
remove_mem
|
|
add_buffer
|
|
remove_buffer
|
|
command START/PAUSE
|
|
|
|
5) Pause S->C PAUSED
|
|
|
|
state change STREAMING
|
|
set-format to NULL -> state change to CONFIGURE
|
|
|
|
5) data transfer C->S STREAMING
|
|
|
|
need-input
|
|
have-output
|
|
|
|
process_buffer
|
|
reuse_buffer
|
|
state change PAUSED
|
|
|
|
6) data transfer S->C
|
|
|
|
process_buffer
|
|
reuse_buffer
|
|
|
|
7) format change C->S
|
|
|
|
port-update
|
|
state change CONFIGURE
|
|
|
|
8) format change S->C
|
|
|
|
Send set-format change on ports -> READY if new memory requirements
|
|
-> PAUSED/STREAMING if all ok
|
|
|
|
9) format-change to NULL
|
|
|
|
state change CONFIGURE
|
|
|
|
10) ERROR
|