When objects are sent on streams, the stream begins with a stream header message and is followed by one or more sets of serialized object fields. If a stream ends gracefully in the middle of a serialized Object, terminate the session with a Protocol Violation.
A publisher SHOULD NOT open more than one stream at a time with the same stream header message type and fields.
TODO: figure out how a relay closes these streams
7.3.1. Stream Header Subgroup
When a stream begins with STREAM_HEADER_SUBGROUP, all objects on the stream
belong to the track requested in the Subscribe message identified by Subscribe
ID and the subgroup indicated by 'Group ID' and Subgroup ID.
STREAM_HEADER_SUBGROUP Message {
Track Alias (i),
Group ID (i),
Subgroup ID (i),
Publisher Priority (8),
}
All Objects received on a stream opened with STREAM_HEADER_SUBGROUP have an
Object Forwarding Preference = Subgroup.
To send an Object with Object Forwarding Preference = Subgroup, find the open
stream that is associated with the subscription, Group ID and Subgroup ID,
or open a new one and send the STREAM_HEADER_SUBGROUP. Then serialize the
following fields.
The Object Status field is only sent if the Object Payload Length is zero.
{
Object ID (i),
Object Payload Length (i),
[Object Status (i)],
Object Payload (..),
}
A publisher MUST NOT send an Object on a stream if its Object ID is less than a previously sent Object ID within a given group in that stream.
7.3.2. Fetch Header
When a stream begins with FETCH_HEADER, all objects on the stream belong to the
track requested in the Fetch message identified by Subscribe ID.
FETCH_HEADER Message {
Subscribe ID (i),
}
Each object sent on a fetch stream after the FETCH_HEADER has the following format:
{
Group ID (i),
Subgroup ID (i),
Object ID (i),
Publisher Priority (8),
Object Payload Length (i),
[Object Status (i)],
Object Payload (..),
}
The Object Status field is only sent if the Object Payload Length is zero.