@@ -85,8 +85,7 @@ discovery and subscription.
8585
8686* {{session}} covers aspects of setting up a MOQT session.
8787
88- * {{priority-congestion}} covers protocol considerations on
89- prioritization schemes and congestion response overall.
88+ * {{priorities}} covers mechanisms for prioritizing subscriptions.
9089
9190* {{relays-moq}} covers behavior at the relay entities.
9291
@@ -534,100 +533,71 @@ expects more OBJECTs to be delivered. The server closes the session with a
534533' GOAWAY Timeout' if the client doesn't close the session quickly enough.
535534
536535
537- # Prioritization and Congestion Response {#priority-congestion}
538-
539- TODO : This is a placeholder section to capture details on how the MOQT
540- protocol deals with prioritization and congestion overall.
541-
542- This section is expected to cover details on :
543-
544- - Prioritization Schemes.
545- - Congestion Algorithms and impacts.
546- - Mapping considerations for one object per stream vs multiple objects
547- per stream.
548- - Considerations for merging multiple streams across domains onto single
549- connection and interactions with specific prioritization schemes.
550-
551- # # Order Priorities and Options
552-
553- At the point of this writing, the working group has not reached
554- consensus on several important goals, such as :
555-
556- * Ensuring that objects are delivered in the order intended by the
557- emitter
558- * Allowing nodes and relays to skip or delay some objects to deal with
559- congestion
560- * Ensuring that emitters can accurately predict the behavior of relays
561- * Ensuring that when relays have to skip and delay objects belonging to
562- different tracks that they do it in a predictable way if tracks are
563- explicitly coordinated and in a fair way if they are not.
564-
565- The working group has been considering two alternatives : marking objects
566- belonging to a track with an explicit "send order"; and, defining
567- algorithms combining tracks, priorities and object order within a
568- group. The two proposals are listed in {{send-order}} and
569- {{ordering-by-priorities}}. We expect further work before a consensus
570- is reached.
571-
572- # ## Proposal - Send Order {#send-order}
573-
574- Media is produced with an intended order, both in terms of when media
575- should be presented (PTS) and when media should be decoded (DTS). As
576- stated in the introduction, the network is unable to maintain this
577- ordering during congestion without increasing latency.
578-
579- The encoder determines how to behave during congestion by assigning each
580- object a numeric send order. The send order SHOULD be followed when
581- possible, to ensure that the most important media is delivered when
582- throughput is limited. Note that the contents within each object are
583- still delivered in order; this send order only applies to the ordering
584- between objects.
585-
586- A publisher MUST send each object over a dedicated stream. The library
587- should support prioritization ({{priority-congestion}}) such that
588- streams are transmitted in send order.
589-
590- A subscriber MUST NOT assume that objects will be received in send order,
591- for the following reasons :
592-
593- * Newly encoded objects can have a smaller send order than outstanding
594- objects.
595- * Packet loss or flow control can delay the send of individual streams.
596- * The publisher might not support stream prioritization.
597-
598- TODO : Refer to Congestion Response and Prioritization Section for
599- further details on various proposals.
600-
601- # ## Proposal - Ordering by Priorities {#ordering-by-priorities}
602-
603- Media is produced as a set of layers, such as for example low definition
604- and high definition, or low frame rate and high frame rate. Each object
605- belonging to a track and a group has two attributes : the object-id, and
606- the priority (or layer).
607-
608- When nodes or relays have to choose which object to send next, they
609- apply the following rules :
610-
611- * within the same group, objects with a lower priority number (e.g. P1)
612- are always sent before objects with a numerically greater priority
613- number (e.g., P2)
614- * within the same group, and the same priority level, objects with a
615- lower object-id are always sent before objects with a higher
616- object-id.
617- * objects from later groups are normally always sent before objects of
618- previous groups.
619-
620- The latter rule is generally agreed as a way to ensure freshness, and to
621- recover quickly if queues and delays accumulate during a congestion
622- period. However, there may be cases when finishing the transmission of
623- an ongoing group results in better user experience than strict adherence
624- to the freshness rule. We expect that that the working group will
625- eventually reach consensus and define meta data that controls this
626- behavior.
627-
628- There have been proposals to allow emitters to coordinate the allocation
629- of layer priorities across multiple coordinated tracks. At this point,
630- these proposals have not reached consensus.
536+ # Priorities {#priorities}
537+
538+ MoQ priorities allow a subscriber and original publisher to influence
539+ the transmission order of Objects within a session in the presence of
540+ congestion.
541+
542+ Given the critical nature of control messages and their relatively
543+ small size, the control stream SHOULD be prioritized higher than all
544+ subscribed Objects.
545+
546+ The subscriber indicates the priority of a subscription via the
547+ Subscriber Priority field and the original publisher indicates priority
548+ in every stream or datagram header. As such, the subscriber's priority is a
549+ property of the subscription and the original publisher's priority is a
550+ property of the Track and the Objects it contains. In both cases, a lower
551+ value indicates a higher priority, with 0 being the highest priority.
552+
553+ The Subscriber Priority is considered first when selecting a subscription
554+ to send data on within a given session. When two or more subscriptions
555+ have equal subscriber priority, the original publisher priority is considered
556+ next and can change within the track, so subscriptions are prioritized based
557+ on the highest priority data available to send. For example, if the subscription
558+ had data at priority 6 and priority 10 to send, the subscription priority would
559+ be 6. When both the subscriber and original publisher priorities for a
560+ subscription are equal, how much data to send from each subscription is
561+ implementation-dependent, but the expectation is that all subscriptions will
562+ be able to send some data.
563+
564+ The subscriber's priority can be changed via a SUBSCRIBE_UPDATE message.
565+ This updates the priority of all unsent data within the subscription,
566+ though the details of the reprioitization are implementation-specific.
567+
568+ Subscriptions have a Group Order of either 'Ascending' or 'Descending',
569+ which indicates whether the lowest or highest Group Id SHOULD be sent first
570+ when multiple Groups are available to send. A subscriber can specify either
571+ ' Ascending' or 'Descending' in the SUBSCRIBE message or they can specify they
572+ want to use the Original Publisher's Group Order, which is indicated in
573+ the corresponding SUBSCRIBE_OK.
574+
575+ Within the same Group, and the same priority level,
576+ Objects with a lower Object Id are always sent before objects with a
577+ higher Object Id, regardless of the specified Group Order. If the priority
578+ varies within a Group, higher priority Objects are sent before lower
579+ priority Objects.
580+
581+ The Group Order cannot be changed via a SUBSCRIBE_UPDATE message, and
582+ instead an UNSUBSCRIBE and SUBSCRIBE can be used.
583+
584+ Relays SHOULD respect the subscriber and original publisher's priorities.
585+ Relays SHOULD NOT directly use Subscriber Priority or Group Order
586+ from incoming subscriptions for upstream subscriptions. Relays use of
587+ Subscriber Priority for upstream subscriptions can be based on
588+ factors specific to it, such as the popularity of the
589+ content or policy, or relays can specify the same value for all
590+ upstream subscriptions.
591+
592+ MoQ Sessions can span multiple namespaces, and priorities might not
593+ be coordinated across namespaces. The subscriber's priority is
594+ considered first, so there is a mechanism for a subscriber to fix
595+ incompatibilities between different namespaces prioritization schemes.
596+ Additionally, it is anticipated that when multiple namespaces
597+ are present within a session, the namespaces could be coordinating,
598+ possibly part of the same application. In cases when pooling among
599+ namespaces is expected to cause issues, multiple MoQ sessions, either
600+ within a single connection or on multiple connections can be used.
631601
632602
633603# Relays {#relays-moq}
@@ -638,6 +608,8 @@ similar in functionality to Content Delivery Networks
638608(CDNs). Additionally, relays serve as policy enforcement points by
639609validating subscribe and publish requests at the edge of a network.
640610
611+ Relays can cache Objects, but are not required to.
612+
641613# # Subscriber Interactions
642614
643615Subscribers interact with the Relays by sending a SUBSCRIBE
@@ -746,12 +718,6 @@ fields, such as priority order and other metadata properties in the
746718OBJECT message header. Unless determined by congestion response, Relays
747719MUST forward the OBJECT message to the matching subscribers.
748720
749- # # Congestion Response at Relays
750-
751- TODO : Refer to {{priority-congestion}}. Add details to describe relay
752- behavior when merging or splitting streams and interactions with
753- congestion response.
754-
755721# # Relay Object Handling
756722
757723MOQT encodes the delivery information for a stream via OBJECT headers
@@ -760,8 +726,7 @@ forwarding.
760726
761727A relay MUST treat the object payload as opaque. A relay MUST NOT
762728combine, split, or otherwise modify object payloads. A relay SHOULD
763- prioritize streams ({{priority-congestion}}) based on the send
764- order/priority.
729+ prioritize sending Objects based on {{priorities}}.
765730
766731A publisher SHOULD begin sending incomplete objects when available to
767732avoid incurring additional latency.
@@ -1039,6 +1004,8 @@ SUBSCRIBE Message {
10391004 Track Alias (i),
10401005 Track Namespace (b),
10411006 Track Name (b),
1007+ Subscriber Priority (8),
1008+ Group Order (8),
10421009 Filter Type (i),
10431010 [StartGroup (i),
10441011 StartObject (i)],
@@ -1068,6 +1035,15 @@ close the session with a Duplicate Track Alias error ({{session-termination}}).
10681035
10691036* Track Name: Identifies the track name as defined in ({{track-name}}).
10701037
1038+ * Subscriber Priority: Specifies the priority of a subscription relative to
1039+ other subscriptions in the same session. Lower numbers get higher priority.
1040+ See {{priorities}}.
1041+
1042+ * Group Order: Allows the subscriber to request Objects be delivered in
1043+ Ascending (0x1) or Descending (0x2) order by group. See {{priorities}}.
1044+ A value of 0x0 indicates the original publisher's Group Order SHOULD be
1045+ used. Values larger than 0x2 are a protocol error.
1046+
10711047* Filter Type: Identifies the type of filter, which also indicates whether
10721048the StartGroup/StartObject and EndGroup/EndObject fields will be present.
10731049See ({{sub-filter}}).
@@ -1118,6 +1094,7 @@ SUBSCRIBE_UPDATE Message {
11181094 StartObject (i),
11191095 EndGroup (i),
11201096 EndObject (i),
1097+ Subscriber Priority (8),
11211098 Number of Parameters (i),
11221099 Subscribe Parameters (..) ...
11231100}
@@ -1137,6 +1114,10 @@ open-ended.
11371114* EndObject: The end Object ID, plus 1. A value of 0 means the entire group is
11381115requested.
11391116
1117+ * Subscriber Priority: Specifies the priority of a subscription relative to
1118+ other subscriptions in the same session. Lower numbers get higher priority.
1119+ See {{priorities}}.
1120+
11401121* Subscribe Parameters: The parameters are defined in {{version-specific-params}}.
11411122
11421123# # UNSUBSCRIBE {#message-unsubscribe}
@@ -1252,8 +1233,8 @@ A canonical MoQ Object has the following information:
12521233IDs starts at 0, increasing sequentially for each object within the
12531234group.
12541235
1255- * Object Send Order : An integer indicating the object send order
1256- {{send-order}} or priority {{ordering-by- priorities}} value .
1236+ * Publisher Priority : An 8 bit integer indicating the publisher's priority for
1237+ the Object {{ priorities}}.
12571238
12581239* Object Forwarding Preference: An enumeration indicating how a publisher sends
12591240an object. The preferences are Track, Group, Object and Datagram. An Object
@@ -1334,7 +1315,7 @@ OBJECT_STREAM Message {
13341315 Track Alias (i),
13351316 Group ID (i),
13361317 Object ID (i),
1337- Object Send Order (i ),
1318+ Publisher Priority (8 ),
13381319 Object Status (i),
13391320 Object Payload (..),
13401321}
@@ -1371,7 +1352,7 @@ OBJECT_DATAGRAM Message {
13711352 Track Alias (i),
13721353 Group ID (i),
13731354 Object ID (i),
1374- Object Send Order (i ),
1355+ Publisher Priority (8 ),
13751356 Object Status (i),
13761357 Object Payload (..),
13771358}
@@ -1403,7 +1384,7 @@ stream header.
14031384STREAM_HEADER_TRACK Message {
14041385 Subscribe ID (i)
14051386 Track Alias (i),
1406- Object Send Order (i ),
1387+ Publisher Priority (8 ),
14071388}
14081389~~~
14091390{: # stream-header-track-format title="MOQT STREAM_HEADER_TRACK Message"}
@@ -1442,8 +1423,8 @@ have the `Object Send Order` specified in the stream header.
14421423STREAM_HEADER_GROUP Message {
14431424 Subscribe ID (i),
14441425 Track Alias (i),
1445- Group ID (i)
1446- Object Send Order (i)
1426+ Group ID (i),
1427+ Publisher Priority (8),
14471428}
14481429~~~
14491430{: # stream-header-group-format title="MOQT STREAM_HEADER_GROUP Message"}
@@ -1478,7 +1459,7 @@ Sending a track on one stream:
14781459STREAM_HEADER_TRACK {
14791460 Subscribe ID = 1
14801461 Track Alias = 1
1481- Object Send Order = 0
1462+ Publisher Priority = 0
14821463}
14831464{
14841465 Group ID = 0
@@ -1504,7 +1485,7 @@ STREAM_HEADER_GROUP {
15041485 Subscribe ID = 2
15051486 Track Alias = 2
15061487 Group ID = 0
1507- Object Send Order = 0
1488+ Publisher Priority = 0
15081489}
15091490{
15101491 Object ID = 0
@@ -1540,6 +1521,7 @@ SUBSCRIBE_OK
15401521{
15411522 Subscribe ID (i),
15421523 Expires (i),
1524+ Group Order (8),
15431525 ContentExists (f),
15441526 [Largest Group ID (i)],
15451527 [Largest Object ID (i)]
@@ -1554,6 +1536,10 @@ longer valid. A value of 0 indicates that the subscription does not expire
15541536or expires at an unknown time. Expires is advisory and a subscription can
15551537end prior to the expiry time or last longer.
15561538
1539+ * Group Order: Indicates the subscription will be delivered in
1540+ Ascending (0x1) or Descending (0x2) order by group. See {{priorities}}.
1541+ Values of 0x0 and those larger than 0x2 are a protocol error.
1542+
15571543* ContentExists: 1 if an object has been published on this track, 0 if not.
15581544If 0, then the Largest Group ID and Largest Object ID fields will not be
15591545present.
0 commit comments