A single object can be conveyed in a datagram. The Track Alias field (Section 10.1) indicates the track this Datagram belongs to. If an endpoint receives a datagram with an unknown Track Alias, it MAY drop the datagram or choose to buffer it for a brief period to handle reordering with the control message that establishes the Track Alias.
An Object received in an OBJECT_DATAGRAM message has an Object Forwarding
Preference = Datagram.
To send an Object with Object Forwarding Preference = Datagram, determine
the length of the header and payload and send the Object as datagram. When the
total size is larger than the maximum datagram size for the session, the Object
will be dropped without any explicit notification.
Each session along the path between the Original Publisher and End Subscriber might have different maximum datagram sizes. Additionally, Object Extension Headers (Section 10.2.1.2) can be added to Objects as they pass through the MOQT network, increasing the size of the Object and the chances it will exceed the maximum datagram size of a downstream session and be dropped.
10.3.1. Object Datagram
An OBJECT_DATAGRAM carries a single object in a datagram.
OBJECT_DATAGRAM {
Type (i) = 0x0-0x7,0x20-21,0x24-25
Track Alias (i),
Group ID (i),
[Object ID (i),]
[Publisher Priority (8),]
[Extensions (..),]
[Object Status (i),]
[Object Payload (..),]
}
The Type value determines which fields are present in the OBJECT_DATAGRAM. There are 10 defined Type values for OBJECT_DATAGRAM.
| Type | End Of Group | Extensions | Object ID | Priority Present | Status / Payload |
|---|---|---|---|---|---|
| 0x00 | No | No | Yes | Yes | Payload |
| 0x01 | No | Yes | Yes | Yes | Payload |
| 0x02 | Yes | No | Yes | Yes | Payload |
| 0x03 | Yes | Yes | Yes | Yes | Payload |
| 0x04 | No | No | No | Yes | Payload |
| 0x05 | No | Yes | No | Yes | Payload |
| 0x06 | Yes | No | No | Yes | Payload |
| 0x07 | Yes | Yes | No | Yes | Payload |
| 0x20 | No | No | Yes | Yes | Status |
| 0x21 | No | Yes | Yes | Yes | Status |
| 0x24 | No | No | No | Yes | Status |
| 0x25 | No | Yes | No | Yes | Status |
| 0x08 | No | No | Yes | No | Payload |
| 0x09 | No | Yes | Yes | No | Payload |
| 0x0A | Yes | No | Yes | No | Payload |
| 0x0B | Yes | Yes | Yes | No | Payload |
| 0x0C | No | No | No | No | Payload |
| 0x0D | No | Yes | No | No | Payload |
| 0x0E | Yes | No | No | No | Payload |
| 0x0F | Yes | Yes | No | No | Payload |
| 0x28 | No | No | Yes | No | Status |
| 0x29 | No | Yes | Yes | No | Status |
| 0x2C | No | No | Yes | No | Status |
| 0x2D | No | Yes | Yes | No | Status |
-
End of Group: For Type values where End of Group is "Yes" the Object is the last Object in the Group.
-
Extensions Present: If Extensions Present is "Yes" the Extensions structure defined in Section 10.2.1.2 is included. If an endpoint receives a datagram with Extensions Present as "Yes" and a Extension Headers Length of 0, it MUST close the session with a
PROTOCOL_VIOLATION. -
Object ID Present: If Object ID Present is No, the Object ID field is omitted and the Object ID is 0. When Object ID Present is Yes, the Object ID field is present and encodes the Object ID.
-
Priority Present: If Priority Present is No, Priority is not present and this Object inherits the Publisher Priority specified in the control message that established the subscription. When Priority Present is Yes, the Priority field is present.
-
Payload and Status: The Object Status field and Object Payload are mutually exclusive.
-
For Type values 0x00 through 0x07, the Object Payload is present and the Object Status field is omitted.
There is no explicit length field for the Object Payload. The entirety of the transport datagram following the Object header fields contains the payload.
-
For Type values 0x20, 0x21, 0x24 and 0x25 the Object Status field is present and there is no Object Payload.
-