@@ -605,6 +605,29 @@ ways, for example:
6056053. Use TRACK_STATUS or similar mechanism to query the previous state to
606606 determine the largest published Group ID.
607607
608+ # # Extension Headers {#extension-headers}
609+
610+ Tracks and Objects can have additional relay-visible fields, known as Extension
611+ Headers, which do not require negotiation, and can be used to alter
612+ MoQT Object distribution.
613+
614+ Extension Headers are defined in {{moqt-extension-headers}} as well as external
615+ specifications and are registered in an IANA table {{iana}}. These
616+ specifications define the type and value of the header, along with any rules
617+ concerning processing, modification, caching and forwarding.
618+
619+ If unsupported by the relay, Extension Headers MUST NOT be modified, MUST be
620+ cached as part of the Track or Object and MUST be forwarded by relays.
621+
622+ If supported by the relay and subject to the processing rules specified in the
623+ definition of the extension, Extension Headers MAY be modified, added, removed,
624+ and/or cached by relays.
625+
626+ Extension Headers are serialized as Key-Value-Pairs (see {{moq-key-value-pair}}).
627+
628+ Header types are registered in the IANA table 'MOQ Extension Headers'.
629+ See {{iana}}.
630+
608631# Sessions {#session}
609632
610633# # Session establishment {#session-establishment}
@@ -1331,7 +1354,7 @@ fields that can be updated are the following:
13311354
133213551. Object can transition from existing to not existing in cases where the
13331356 object is no longer available.
1334- 2. Object Header Extensions can be added, removed or updated, subject
1357+ 2. Object Extension Headers can be added, removed or updated, subject
13351358 to the constraints of the specific header extension.
13361359
13371360An endpoint that receives a duplicate Object with a different Forwarding
@@ -1535,12 +1558,18 @@ new relay instead of the old Relay. Once Objects are going to the new Relay, the
15351558published namespaces and subscriptions to the old relay can be withdrawn or
15361559terminated.
15371560
1561+ # # Relay Track Handling
1562+
1563+ A relay MUST include all Extension Headers associated with a Track when sending any PUBLISH,
1564+ SUBSCRIBE_OK, TRACK_STATUS_OK or FETCH_OK, unless allowed by the extension's
1565+ specification (see {{extension-headers}}).
1566+
15381567# # Relay Object Handling
15391568
15401569MOQT encodes the delivery information via Object headers
1541- ({{message-object}}). A relay MUST NOT modify Object properties when
1542- forwarding, except for Object Extension Headers as specified in
1543- {{object-extensions }}.
1570+ ({{message-object}}). A relay MUST NOT modify Object properties
1571+ when forwarding, except for Object Extension Headers as specified in
1572+ {{extension-headers }}.
15441573
15451574A relay MUST treat the object payload as opaque. A relay MUST NOT
15461575combine, split, or otherwise modify object payloads. A relay SHOULD
@@ -2365,7 +2394,8 @@ SUBSCRIBE_OK Message {
23652394 Request ID (i),
23662395 Track Alias (i),
23672396 Number of Parameters (i),
2368- Parameters (..) ...
2397+ Parameters (..) ...,
2398+ Track Extensions (..),
23692399}
23702400~~~
23712401{: # moq-transport-subscribe-ok format title="MOQT SUBSCRIBE_OK Message"}
@@ -2381,6 +2411,8 @@ SUBSCRIBE_OK Message {
23812411
23822412* Parameters: The parameters are defined in {{version-specific-params}}.
23832413
2414+ * Track Extensions : A sequence of Extension Headers. See {{extension-headers}}.
2415+
23842416# # SUBSCRIBE_UPDATE {#message-subscribe-update}
23852417
23862418A subscriber sends a SUBSCRIBE_UPDATE to a publisher to modify an existing
@@ -2475,7 +2507,8 @@ PUBLISH Message {
24752507 Track Name (..),
24762508 Track Alias (i),
24772509 Number of Parameters (i),
2478- Parameters (..) ...
2510+ Parameters (..) ...,
2511+ Track Extensions (..),
24792512}
24802513~~~
24812514{: # moq-transport-publish-format title="MOQT PUBLISH Message"}
@@ -2494,6 +2527,8 @@ PUBLISH Message {
24942527
24952528* Parameters: The parameters are defined in {{version-specific-params}}.
24962529
2530+ * Track Extensions : A sequence of Extension Headers. See {{extension-headers}}.
2531+
24972532A subscriber receiving a PUBLISH for a Track it does not wish to receive SHOULD
24982533send REQUEST_ERROR with error code `UNINTERESTED`, and abandon reading any
24992534publisher initiated streams associated with that subscription using a
@@ -2827,6 +2862,7 @@ FETCH_OK Message {
28272862 End Location (Location),
28282863 Number of Parameters (i),
28292864 Parameters (..) ...
2865+ Track Extensions (..),
28302866}
28312867~~~
28322868{: # moq-transport-fetch-ok format title="MOQT FETCH_OK Message"}
@@ -2858,6 +2894,9 @@ FETCH_OK Message {
28582894
28592895* Parameters: The parameters are defined in {{version-specific-params}}.
28602896
2897+ * Track Extensions : A sequence of Extension Headers. See {{extension-headers}}.
2898+
2899+
28612900# # FETCH_CANCEL {#message-fetch-cancel}
28622901
28632902A subscriber sends a FETCH_CANCEL message to a publisher to indicate it is no
@@ -3124,11 +3163,8 @@ according to its `Object Forwarding Preference`.
31243163* Object Status: An enumeration used to indicate whether the Object is a normal Object
31253164 or mark the end of a group or track. See {{object-status}} below.
31263165
3127- * Object Extension Length: The total length of the Object Extension Headers
3128- block, in bytes.
3129-
3130- * Object Extensions : A sequence of Object Extension Headers. See
3131- {{object-extensions}} below.
3166+ * Object Extensions : A sequence of Extensions associated with the object. See
3167+ {{object-extensions}}.
31323168
31333169* Object Payload: An opaque payload intended for an End Subscriber and SHOULD
31343170NOT be processed by a relay. Only present when 'Object Status' is Normal (0x0).
@@ -3158,45 +3194,29 @@ Any other value SHOULD be treated as a protocol error and the session SHOULD
31583194be closed with a `PROTOCOL_VIOLATION` ({{session-termination}}).
31593195Any object with a status code other than zero MUST have an empty payload.
31603196
3161- # ### Object Extension Header {#object-extensions}
3162-
3163- Any Object with status Normal can have extension headers. If an endpoint
3164- receives extension headers on Objects with status that is not Normal, it MUST close
3165- the session with a `PROTOCOL_VIOLATION`.
3166-
3167- Object Extension Headers are visible to relays and allow the transmission of
3168- future metadata relevant to MOQT Object distribution. Any Object metadata never
3169- intended to be accessed by the transport or Relays SHOULD be serialized as part
3170- of the Object payload and not as an extension header.
3171-
3172- Extension Headers are defined in external specifications and registered in an
3173- IANA table {{iana}}. These specifications define the type and value of the
3174- header, as well as the rules for processing, modification, caching and
3175- forwarding. All such specifications MUST specify whether multiple values of the
3176- same extension are allowed on a single Object. A relay that enforces these
3177- rules is considered to "support" the extension. If a Relay does not support an
3178- extension header, it MUST assume multiple values are allowed.
3197+ # ### Object Extension Headers {#object-extensions}
31793198
3180- If unsupported by the relay, Extension Headers MUST NOT be modified, MUST be
3181- cached as part of the Object and MUST be forwarded by relays.
3199+ Any Object with status Normal can have extension headers ({{extension-headers}}).
3200+ If an endpoint receives extension headers on Objects with status that is
3201+ not Normal, it MUST close the session with a `PROTOCOL_VIOLATION`.
31823202
3183- If supported by the relay and subject to the processing rules specified in the
3184- definition of the extension, Extension Headers MAY be modified, added, removed,
3185- and/or cached by relays.
3203+ Object Extension Headers are visible to relays and are intended to be relevant
3204+ to MOQT Object distribution. Any Object metadata never intended to be accessed
3205+ by the transport or Relays SHOULD be serialized as part of the Object payload
3206+ and not as an extension header.
31863207
3187- Object Extension Headers are serialized as Key-Value-Pairs (see
3188- {{moq-key-value-pair}}), prefixed by the length of the serialized
3189- Key-Value-Pairs, in bytes.
3208+ Object Extension Headers are serialized as a length in bytes followed by
3209+ Key-Value-Pairs (see {{moq-key-value-pair}}).
31903210
31913211~~~
31923212Extensions {
31933213 Extension Headers Length (i),
3194- Extension headers (..),
3214+ Extension Headers (..),
31953215}
31963216~~~
31973217
3198- Header types are registered in the IANA table 'MOQ Extension Headers'.
3199- See {{iana}}.
3218+ Object Extension Header types are registered in the IANA table
3219+ ' MOQ Extension Headers ' . See {{iana}}.
32003220
32013221# # Datagrams
32023222
@@ -3689,15 +3709,16 @@ SUBGROUP_HEADER {
36893709
36903710~~~
36913711
3692- # Extension Headers
3712+ # Extension Headers {#moqt-extension-headers}
36933713
3694- The following Object Extension Headers are defined in MOQT.
3714+ The following Extension Headers are defined in MOQT. Each Extension Header
3715+ specifies whether it can be used with Tracks, Objects, or both.
36953716
36963717# # Immutable Extensions
36973718
36983719The Immutable Extensions (Extension Header Type 0xB) contains a sequence of
3699- Key-Value-Pairs (see {{moq-key-value-pair}}) which are also Object Extension
3700- Headers of the Object .
3720+ Key-Value-Pairs (see {{moq-key-value-pair}}) which are also Track or Object
3721+ Extension Headers .
37013722
37023723~~~
37033724Immutable Extensions {
@@ -3741,6 +3762,8 @@ An Object MUST NOT contain more than one instance of this extension header.
37413762
37423763# # Prior Group ID Gap
37433764
3765+ Prior Group ID Gap only applies to Objects, not Tracks.
3766+
37443767Prior Group ID Gap (Extension Header Type 0x3C) is a variable length integer
37453768containing the number of Groups prior to the current Group that do not and will
37463769never exist. For example, if the Original Publisher is publishing an Object in
@@ -3773,6 +3796,8 @@ An Object MUST NOT contain more than one instance of this extension header.
37733796
37743797# # Prior Object ID Gap
37753798
3799+ Prior Object ID Gap only applies to Objects, not Tracks.
3800+
37763801Prior Object ID Gap (Extension Header Type 0x3E) is a variable length integer
37773802containing the number of Objects prior to the current Object that do not and
37783803will never exist. For example, if the Original Publisher is publishing Object
0 commit comments