doc: add doc about Tag params

This commit is contained in:
Wim Taymans 2025-05-14 11:28:16 +02:00
parent 093b3eea21
commit 26099f4c29
3 changed files with 70 additions and 0 deletions

View file

@ -12,6 +12,7 @@
- \subpage page_dma_buf
- \subpage page_scheduling
- \subpage page_latency
- \subpage page_tag
- \subpage page_native_protocol

68
doc/dox/internals/tag,dox Normal file
View file

@ -0,0 +1,68 @@
/** \page page_tag Tag support
This document explains how stream specific metadata is transported in
the PipeWire graph.
The metadata is a dictionary of string key/value pairs with information
such as the author, track, copyright, album information etc.
# Use Cases
## A stream/node/port has some metadata
Applications need to be able to query the Tag of a port/node/stream.
Linked Nodes need to be informed of the upstream and downstream tags.
## dynamically update tags
It needs to be possible to dynamically update the tags of a port/node/stream
and this should inform all linked ports/nodes of the updated tags.
## Aggregate tags upstream and downstream
A node might need to know all the upstream and downstream tags. Each node can
add or remove metadata in the Tag param.
A mixer node might need to combine the Tags of the two input streams and
generate a combined tag.
# Concepts
## Port Tags
The fundamental object for implementing metadata reporting in PipeWire is the
Tag object.
It consists of a direction (input/output) and one or more generic dictionaries
with string key/value pairs.
The direction of the tag object determines how the object propagates in the graph.
- SPA_DIRECTION_OUTPUT Tag objects move from output ports downstream and contain
the metadata from all nodes upstream. An output tag received on an input port
should instruct the node to update the output tag on its output ports related
to this input port.
- SPA_DIRECTION_INPUT Tag objects move from input ports upstream and contain
the metadata from all nodes downstream. An input tag received on an output port
should instruct the node to update the input tag on its input ports related
to this output port.
PipeWire will automatically propagate Tag objects from ports to all linked ports
in the graph. Output Tag objects on output ports are propagated to linked input
ports and input Tag objects on input ports are propagated to linked output ports.
If a port has links with multiple other ports, the Tag objects are merged by
appending the dictionaties to the Tag param. Intermediate nodes or sinks are allowed
to take the multiple dictionaries in a Tag and combine them into one dictionary if
they would like to do so.
This way, Output Tag always describes the aggragated total upstream metadata of
signal up to the port and Input tag describes the aggregated downstream metadata
of the signal from the port.
# Tag updates
Tag params on the ports can be updated as needed. This can happen because some upstream or
downstream Tag changed or when the metadata of a node/port/stream changes.

View file

@ -59,6 +59,7 @@ extra_docs = [
'dox/internals/design.dox',
'dox/internals/access.dox',
'dox/internals/latency.dox',
'dox/internals/tag.dox',
'dox/internals/midi.dox',
'dox/internals/portal.dox',
'dox/internals/daemon.dox',