2015-08-21 11:46:29 +02:00
|
|
|
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.
|
|
|
|
|
|
2015-09-30 13:00:14 +02:00
|
|
|
A client can then do org.pinos.Client1.CreateSourceOutput() to create a
|
2015-08-21 11:46:29 +02:00
|
|
|
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
|
|
|
|
|
|
2015-09-30 13:00:14 +02:00
|
|
|
|
|
|
|
|
0 1 2 3
|
|
|
|
|
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| Version |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| Length |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
|
|
|
|
|
Version : 4 bytes : message version
|
|
|
|
|
Length : 4 bytes : total message length
|
|
|
|
|
|
2015-08-21 11:46:29 +02:00
|
|
|
|
|
|
|
|
Followed by 1 or more type-length-data sections
|
|
|
|
|
|
2015-09-30 13:00:14 +02:00
|
|
|
0 1 2 3
|
|
|
|
|
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| Type | Len ... |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| Data .... |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
|
2015-08-21 11:46:29 +02:00
|
|
|
<type> : 1 byte
|
2015-08-31 17:10:44 +02:00
|
|
|
<length> : variable length, 7 bits, high bit is continuation marker
|
2015-08-24 16:41:04 +02:00
|
|
|
<data> : <length> bytes, see below for contents based on <type>
|
2015-08-21 11:46:29 +02:00
|
|
|
|
|
|
|
|
Types:
|
|
|
|
|
|
2015-08-31 17:10:44 +02:00
|
|
|
1: continuation section
|
|
|
|
|
|
2015-09-30 13:00:14 +02:00
|
|
|
0 1 2 3
|
|
|
|
|
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| Offset ... |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| .... |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| Size ... |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| .... |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
|
2015-08-31 17:10:44 +02:00
|
|
|
Rest of the commands can be found in the shared memory region at
|
|
|
|
|
@offset and @size. A shared memory region is negotiated when the client
|
|
|
|
|
connects to the server.
|
|
|
|
|
|
|
|
|
|
<offset> : 8 bytes : offset
|
|
|
|
|
<size> : 8 bytes : size
|
|
|
|
|
|
|
|
|
|
2: header
|
2015-08-31 16:47:32 +02:00
|
|
|
|
|
|
|
|
Header for payload
|
|
|
|
|
|
2015-09-30 13:00:14 +02:00
|
|
|
0 1 2 3
|
|
|
|
|
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| flags |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| seq |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| PTS ... |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| .... |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| DTS-offset ... |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| .... |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
|
|
|
|
|
|
2015-08-31 16:47:32 +02:00
|
|
|
<flags> : 4 bytes : buffer flags
|
|
|
|
|
<seq> : 4 bytes : sequence number
|
|
|
|
|
<pts> : 8 bytes : presentation time
|
|
|
|
|
<dts-offset> : 8 bytes : dts-offset
|
|
|
|
|
|
2015-08-31 17:10:44 +02:00
|
|
|
3: fd-payload section
|
2015-08-24 16:41:04 +02:00
|
|
|
|
2015-08-31 17:10:44 +02:00
|
|
|
Used to send a block of data between client and server. The type of fd and
|
|
|
|
|
the possible operations on it are negotiated when the client connects.
|
2015-08-26 12:46:28 +02:00
|
|
|
|
2015-09-30 13:00:14 +02:00
|
|
|
0 1 2 3
|
|
|
|
|
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| id |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| offset ... |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| .... |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| size ... |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| .... |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| fd-index |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
|
2015-08-31 16:47:32 +02:00
|
|
|
<id> : 4 bytes : id of the fd-payload
|
|
|
|
|
<offset> : 8 bytes : offset
|
|
|
|
|
<size> : 8 bytes : size
|
|
|
|
|
<fd-index> : 4 bytes : index of fd
|
2015-08-24 16:41:04 +02:00
|
|
|
|
2015-08-31 17:10:44 +02:00
|
|
|
4: release fd-payload
|
2015-08-26 12:46:28 +02:00
|
|
|
|
|
|
|
|
Release a fd-payload with <id>
|
|
|
|
|
|
2015-09-30 13:00:14 +02:00
|
|
|
0 1 2 3
|
|
|
|
|
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| id |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
|
2015-08-31 16:47:32 +02:00
|
|
|
<id> : 4 bytes : the id number of the released fd-payload
|
2015-08-21 11:46:29 +02:00
|
|
|
|
2015-08-31 17:10:44 +02:00
|
|
|
5: format change
|
|
|
|
|
|
|
|
|
|
Perform an in-band format change. The following data blocks will be in this
|
|
|
|
|
new format.
|
2015-08-21 11:46:29 +02:00
|
|
|
|
2015-09-30 13:00:14 +02:00
|
|
|
0 1 2 3
|
|
|
|
|
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| id | format ..... |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| ...... |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
|
2015-08-31 16:47:32 +02:00
|
|
|
<format-id> : 1 byte : format id
|
|
|
|
|
<format> : 0-terminated : contains serialized format
|
2015-08-21 11:46:29 +02:00
|
|
|
|
2015-08-31 17:10:44 +02:00
|
|
|
6: property changes
|
|
|
|
|
|
|
|
|
|
Notify a property change.
|
2015-08-21 11:46:29 +02:00
|
|
|
|
2015-09-30 13:00:14 +02:00
|
|
|
0 1 2 3
|
|
|
|
|
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| key .... .. |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| ...... |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| value .... |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
| ...... |
|
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
|
|
2015-08-21 11:46:29 +02:00
|
|
|
<key> : 0-terminated : key
|
|
|
|
|
<value> : 0-terminated : value
|
2015-09-30 13:00:14 +02:00
|
|
|
... : more key/values to fill length, 0 key or
|
|
|
|
|
message length is end
|
2015-08-21 11:46:29 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|