mirror of
https://gitlab.freedesktop.org/pipewire/pipewire
synced 2024-10-14 11:53:16 +00:00
doc: add simple design doc
This commit is contained in:
parent
e9c72a6102
commit
d0f3f3125b
90
doc/design.txt
Normal file
90
doc/design.txt
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
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 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. We however are not concerned with playback of any of the media,
|
||||||
|
this should be handled by a separate consumer rendering the media to
|
||||||
|
a specific output device.
|
||||||
|
|
||||||
|
|
||||||
|
DBus protocol
|
||||||
|
-------------
|
||||||
|
|
||||||
|
The main daemon is registered on the session bus with name: org.pinos
|
||||||
|
|
||||||
|
Various Source1 objects are registered in the server based on the available
|
||||||
|
sources of content. Source1 has properties and has format descriptions of
|
||||||
|
what it can provide.
|
||||||
|
|
||||||
|
First a client needs to register with pinos by calling
|
||||||
|
org.pinos.Daemon1.ConnectClient(). This creates a new Client1 object that
|
||||||
|
the client must use for further communication.
|
||||||
|
|
||||||
|
A client can then do org.pinos.Client1.CreateSourceInput() to create a
|
||||||
|
new SourceOutput1 to retrieve data from a source. It can specify a source
|
||||||
|
explicitly or let the server choose a source. The client must provide a list
|
||||||
|
of formats it can handle along with extra properties that can help with
|
||||||
|
selecting an appropriate source.
|
||||||
|
|
||||||
|
A client can then call org.pinos.SourceOutput1.Start() to negotiate the final
|
||||||
|
media format and start the data transfer. A new fd is returned to the client
|
||||||
|
along with the negotiated format and properties.
|
||||||
|
|
||||||
|
All further media transport is then performed on the fd. The client will read
|
||||||
|
from the fd to get data and metadata from the server. The wire format is
|
||||||
|
generic and extensible and allows for inline serialized events such as
|
||||||
|
property changes and format changes.
|
||||||
|
|
||||||
|
|
||||||
|
Wire
|
||||||
|
----
|
||||||
|
|
||||||
|
Fixed header
|
||||||
|
|
||||||
|
<flags> : 4 bytes
|
||||||
|
<seq> : 4 bytes
|
||||||
|
<pts> : 8 bytes
|
||||||
|
<dts-offset> : 8 bytes
|
||||||
|
|
||||||
|
Followed by 1 or more type-length-data sections
|
||||||
|
|
||||||
|
<type> : 1 byte
|
||||||
|
<length> : variable length, 7 bits, hight bit is continuation marker
|
||||||
|
<data> : <length> bytes
|
||||||
|
|
||||||
|
Types:
|
||||||
|
|
||||||
|
0: format change
|
||||||
|
|
||||||
|
<format-id> : 1 byte : format id
|
||||||
|
<format> : 0-terminated : contains serialized format
|
||||||
|
|
||||||
|
1: fd-payload section
|
||||||
|
|
||||||
|
<offset> : 8 bytes : offset
|
||||||
|
<size> : 8 bytes : size
|
||||||
|
<fd-index> : 1 byte : index of fd
|
||||||
|
|
||||||
|
2: property changes
|
||||||
|
|
||||||
|
<key> : 0-terminated : key
|
||||||
|
<value> : 0-terminated : value
|
||||||
|
... : more key/values to fill length, 0 key is end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue