Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Priority and Group Send Order to SUBSCRIBE, clarify Publisher Priority #470

Merged
merged 39 commits into from
Jul 3, 2024
Merged
Changes from 18 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
e43f244
Add Priority and Delivery Order to SUBSCRIBE, clarify Publisher Priority
ianswett Jun 22, 2024
0d45b9d
Merge branch 'main' into ianswett-uber-priority
ianswett Jun 22, 2024
c1346ec
More text on relays going upstream
ianswett Jun 22, 2024
31b0ba2
Update draft-ietf-moq-transport.md
ianswett Jun 22, 2024
0b693ae
Fix references to priority-congestion
ianswett Jun 22, 2024
f1b88f4
Update draft-ietf-moq-transport.md
ianswett Jun 22, 2024
f5043c6
Update draft-ietf-moq-transport.md
ianswett Jun 22, 2024
3c0f6e5
Update draft-ietf-moq-transport.md
ianswett Jun 22, 2024
9097d73
Update draft-ietf-moq-transport.md
ianswett Jun 22, 2024
81c6a32
Update draft-ietf-moq-transport.md
ianswett Jun 22, 2024
9fc4721
Update draft-ietf-moq-transport.md
ianswett Jun 22, 2024
619bc11
Update draft-ietf-moq-transport.md
ianswett Jun 22, 2024
436605f
Update draft-ietf-moq-transport.md
ianswett Jun 22, 2024
081554d
Update draft-ietf-moq-transport.md
ianswett Jun 22, 2024
a085820
Move Subscriber Priority to be a field, not an optional param
ianswett Jun 22, 2024
441ecf0
Rename Priority to Publisher Priority
ianswett Jun 23, 2024
a97a91f
Update draft-ietf-moq-transport.md
ianswett Jun 23, 2024
7ddfd11
Update draft-ietf-moq-transport.md
ianswett Jun 23, 2024
1bd6788
Update draft-ietf-moq-transport.md
ianswett Jun 24, 2024
c04f70e
Add a statement about the control stream and priorities.
ianswett Jun 25, 2024
6804eca
Merge branch 'main' into ianswett-uber-priority
ianswett Jun 26, 2024
8d41133
Move the SHOULD
ianswett Jun 26, 2024
b6ec889
Update draft-ietf-moq-transport.md
ianswett Jun 26, 2024
73376b3
Rename Delivery Order to Group Order
ianswett Jun 26, 2024
13d2e4c
0x0 means use the publisher's Group Order
ianswett Jun 26, 2024
751c65e
Add Group Order to SUBSCRIBE_OK
ianswett Jun 26, 2024
a6ed5ef
Add Group Order to SUBSCRIBE_UPDATE
ianswett Jun 27, 2024
a2a29de
stream or datagram header
ianswett Jul 1, 2024
09e6d8e
afrind suggestion
ianswett Jul 1, 2024
74ca340
Remove empty section
ianswett Jul 1, 2024
e32a488
Update draft-ietf-moq-transport.md
ianswett Jul 1, 2024
4da15a1
Reprioritization is implementation-specific
ianswett Jul 1, 2024
779ddae
Group Order cannot be changed in SUBSCRIBE_UPDATE
ianswett Jul 1, 2024
cc451f2
Update draft-ietf-moq-transport.md
ianswett Jul 1, 2024
d366503
Elaborate on upstream subscriptions
ianswett Jul 1, 2024
37fa963
Namespace concerns
ianswett Jul 1, 2024
0d351ff
Update draft-ietf-moq-transport.md
ianswett Jul 1, 2024
c528c9c
Remove Group Order from SUBSCRIBE_UPDATE
ianswett Jul 2, 2024
fd21a0d
Clarify how subscriptions share a connection
ianswett Jul 2, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
176 changes: 74 additions & 102 deletions draft-ietf-moq-transport.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,7 @@ discovery and subscription.

* {{session}} covers aspects of setting up a MOQT session.

* {{priority-congestion}} covers protocol considerations on
prioritization schemes and congestion response overall.
* {{priorities}} covers mechanisms for prioritizing subscriptions.

* {{relays-moq}} covers behavior at the relay entities.

Expand Down Expand Up @@ -534,100 +533,61 @@ expects more OBJECTs to be delivered. The server closes the session with a
'GOAWAY Timeout' if the client doesn't close the session quickly enough.


# Prioritization and Congestion Response {#priority-congestion}
# Priorities {#priorities}

TODO: This is a placeholder section to capture details on how the MOQT
protocol deals with prioritization and congestion overall.
MoQ priorities allow a subscriber and original publisher to influence
the transmission order of Objects within a session in the presence of
congestion.

This section is expected to cover details on:
The subscriber indicates the priority of a subscription via the
Subscriber Priority field and the original publisher indicates priority
in every stream header. As such, the subscriber's priority is a property
ianswett marked this conversation as resolved.
Show resolved Hide resolved
of the subscription and the original publisher's priority is a property
of the Track and the Objects it contains. In both cases, a lower value
indicates a higher priority, with 0 being the highest priority.
ianswett marked this conversation as resolved.
Show resolved Hide resolved

- Prioritization Schemes.
- Congestion Algorithms and impacts.
- Mapping considerations for one object per stream vs multiple objects
per stream.
- Considerations for merging multiple streams across domains onto single
connection and interactions with specific prioritization schemes.
The Subscriber Priority is considered first when selecting
a subscription to send data on within a given session. The original
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When two or more tracks have equal subscriber priority, the original publisher priority is considered next

publisher priority is considered next and can change within the track,
so subscriptions are prioritized based on the highest priority data
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's less confusing if you say publisher priority is per stream, instead of per track.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You will need to update this bit, since we agreed it's latest, not highest.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I feel this is right as it is worded ..

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We agreed on highest at this point, the latest is for other part. So I think this is correct as written here. Just to reason about this this, think about a track being send stream per object where publisher priorities changed. I don't think publisher priority is per stream - to start with it is for datagrams too.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We agreed on highest at this point, the latest is for other part.

This was part of the discussion from Wednesday's call. The consensus was that using highest priority value in the track to select a track does not work well. If you use highest, then priority can only be increased and not decreased.

Example, assume two tracks, stream-per-group and each has 2 groups to send from:
Track A: group1, pri=1; group2, pri=2
Track B: group1, pri=2; group2, pri=1

Using max, the algorithm would treat these tracks with equal priority, and move to another tiebreaker.

The room felt (I think unanimously) that the most recent value should set the track priority, so in the above example, Track B would be higher than Track A. Which group from Track B is determined by the group-send-order.

Reflecting more, I think logically what bits we want to send in the above example depends on the group order. If using ascending groups, a track's priority is the priority of it's lowest group to send and if descending, a track's priority is the priority of it's highest group to send. Now, if Track A and Track B are both ascending, A > B. If they are both descending, B > A. If they mismatch, it is a tie.

When using stream/datagram-per-object, the priority of a group is the highest priority among queued object for that group.

That feels right to me but the implementation might be complex to implement.

available to send. For example, if the subscription had data at
priority 6 and priority 10 to send, the subscription priority would be 6.
When both the subscriber and original publisher priorities for a
subscription are equal, send order is implementation-dependent, but the
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not that sub-pri == orig-pub-pri, it's when sub1.pri == sub2.pri and pub1.pri == pub2.pri

When the subscriber and original publisher priorities for two or more tracks are both equal

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

given we use "send order" to talk about Ascending / Descending, I got confused when I read this. I think it could be less confusing to replace "send order" with "track selected to send next object" or something like that.

expectation is that all subscriptions will be able to send some data.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/ send order is / the track whose object is being selected is /

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point, this text was a bit unclear. I rewrote it to hopefully be more clear.


## Order Priorities and Options
The subscriber's priority can be changed via a SUBSCRIBE_UPDATE message.
ianswett marked this conversation as resolved.
Show resolved Hide resolved

At the point of this writing, the working group has not reached
consensus on several important goals, such as:
The publisher SHOULD respect the subscriber and original publisher's
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe call out relays specifically? This does not make sense for original publishers.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can change it, though if one was using MoQ in a P2P application, wouldn't the subscriber's priority matter and the publlsher would be the original publisher?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This statement seems unnecessary. The para above says /how/ a sender uses priorities, what does this sentence add beyond that?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It adds a SHOULD, but I can put that elsewhere

priorities.

* Ensuring that objects are delivered in the order intended by the
emitter
* Allowing nodes and relays to skip or delay some objects to deal with
congestion
* Ensuring that emitters can accurately predict the behavior of relays
* Ensuring that when relays have to skip and delay objects belonging to
different tracks that they do it in a predictable way if tracks are
explicitly coordinated and in a fair way if they are not.
In addition, SUBSCRIBE specifies a Delivery Order of either
'Ascending' or 'Descending', which indicates whether the lowest or
highest Group Id SHOULD be delivered first when multiple Groups are
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is only true when groups have the same priority, since we're allowing the publisher priority to change per stream.

ianswett marked this conversation as resolved.
Show resolved Hide resolved
available to send.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems slightly under specified. If a last mile relay received two different values in both SUBSCRIBE and SUBSCRIBE_OK, we need to say which one takes priority. We agreed on the end subscriber would take priority so this should have a bit more text to say value in SUBSCRIBE overrides in value in SUBSCRIBE_OK.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point, I rewrote this paragraph to better match the current framing.


The working group has been considering two alternatives: marking objects
belonging to a track with an explicit "send order"; and, defining
algorithms combining tracks, priorities and object order within a
group. The two proposals are listed in {{send-order}} and
{{ordering-by-priorities}}. We expect further work before a consensus
is reached.
Within the same group, and the same priority level,
objects with a lower Object Id are always sent before objects with a
higher Object Id, regardless of the specified Delivery Order.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A good reason to call it Group Order instead of Delivery Order; it doesn't apply to object ordering.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point, renaming.


### Proposal - Send Order {#send-order}
Relays SHOULD NOT directly use Subscriber Priority or Delivery Order
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As briefly discussed at the interim, we also need the Publisher Group Order in SUBSCRIBE_OK and TRACK_STATUS. Relays should use that instead of the Subscriber's Group Order.

from incoming subscriptions for upstream subscriptions. Relays use of
Subscriber Priority for upstream subscriptions is based on
afrind marked this conversation as resolved.
Show resolved Hide resolved
a number of factors specific to it, such as the popularity of the
content or policy.
ianswett marked this conversation as resolved.
Show resolved Hide resolved
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if we should add the note on publisher preference here too

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@suhasHere : what's your suggestion? Something like:

In the absence of other specific reasons, relays SHOULD give all upstream subscriptions equal priority

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm hesitant to spend text telling relays what to do, since they'll do what they want in reality. Telling them what not to do because it's a footgun seems more valuable.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I expanded the sentence a bit more to note that a relay can use a single Subscriber Priority value for all upstream subscriptions.


Media is produced with an intended order, both in terms of when media
should be presented (PTS) and when media should be decoded (DTS). As
stated in the introduction, the network is unable to maintain this
ordering during congestion without increasing latency.
MoQ Sessions can span multiple namespaces, and priorities are treated
equally, regardless of the namespace. The subscriber's priority is
considered first, so there is no incentive for the original publisher
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A subscriber will often want to use the default publisher priority, so this isn't always true.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fair point, I changed this to text that points out the subscriber priority provides a mechanism to override.

to attempt to prioritize all of its Tracks higher than another
namespace. Additionally, it is anticipated that when multiple namespaces
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We may have a problem here. If we expect aggregating relays to not forward subscriber priority preferences, then, in fact, all middle hops are likely to fall to publisher priority and may incentivize priority inflation. On the other hand, relays are going to do what they're going to do, and, it's possible that publisher priorities may be ignored for middle hops in practice.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I get what you are saying here but relays have to deal with a reasonable solution to this just to even be able to run lots of different applications on the same relay network even when application never have more than one namespace. I think there are two keys parts of this 1) we are not trying to specify how a relay network moves data around inside the relays and 2) relays will do what relays do.

So thought relays could have if they don't think about this problem, I don't think we can say much more that this.

are present within a session, the namespaces could be coordinating,
possibly part of the same application. In cases when pooling among
namespaces is expected to cause issues, multiple MoQ sessions, either
within a single connection or on multiple connections can be used.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this will work in practice. There's too many use-cases where publishers are not coordinated because they're using different software or versions.

ex. I want to show multiple Twitch streams on the same page. There's just no way that I can have OBS and ffmpeg agree to publish with the same priority scheme. It doesn't have to be malicious; one of the publishers is undoubtedly going to monopolize the connection.

Dialing a new connection is expensive and removes the ability to use subscriber priorities. I would totally agree with using multiple QUIC sessions if it had such a layer, but the alternative is WebTransport pooling...

And yes, you could use subscriber priorities only to avoid this issue, but that's a big limitation that could be easily solved by sandboxing namespaces. Relays can't use the subscriber's priority anyway and will have to sandbox namespaces if using MoQ over the backbone.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is all non-normative text intended to describe a potential problem. I don't want to create yet another session layer in MoQ when there's already one in WebTransport and eventually there might be one in QUIC. Different applications are different, and for some apps, multiple namespaces may be fine, and for others it's not. Possibly there's a better way of saying that?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd rather say that a relay shouldn't compare publisher priorities from uncoordinated publishers, but comparing them from coordinate publishers is fine. Within a namespace, we can assert all tracks have coordinated priority, but between two namespaces, it would presently have to be implementation dependent. That said, it shouldn't be hard to fix - break off part of namespace into another tuple field (application or something).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alan, I don't think that would help, that just moves the same problem to the next layer and it would be turtles all the way down. The basic issue is when a content delivery network delivers content for lots of different applications/customers, it needs to decide how it will be "fair" between the application/customers and that is way more complicated that just use whatever the priority header asked for.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with Ian. it is tough to be prescriptive and the proposed text pretty much is well defined

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with Luke that saying "this won't be a problem" is not good. We should say that there's some risk to blindly comparing publisher priorities when you don't know if they are coordinated, caveat emptor.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I updated this with more nuanced language that indicates namespaces may or may not have compatible prioritization schemes.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am ok with merging the new language. Long term, I don't plan to compare uncoordinated publisher priorities in my generic relay, and may make a proposal for how to avoid doing so.


The encoder determines how to behave during congestion by assigning each
object a numeric send order. The send order SHOULD be followed when
possible, to ensure that the most important media is delivered when
throughput is limited. Note that the contents within each object are
still delivered in order; this send order only applies to the ordering
between objects.
## Priority Algorithm
ianswett marked this conversation as resolved.
Show resolved Hide resolved

A publisher MUST send each object over a dedicated stream. The library
should support prioritization ({{priority-congestion}}) such that
streams are transmitted in send order.

A subscriber MUST NOT assume that objects will be received in send order,
for the following reasons:

* Newly encoded objects can have a smaller send order than outstanding
objects.
* Packet loss or flow control can delay the send of individual streams.
* The publisher might not support stream prioritization.

TODO: Refer to Congestion Response and Prioritization Section for
further details on various proposals.

### Proposal - Ordering by Priorities {#ordering-by-priorities}

Media is produced as a set of layers, such as for example low definition
and high definition, or low frame rate and high frame rate. Each object
belonging to a track and a group has two attributes: the object-id, and
the priority (or layer).

When nodes or relays have to choose which object to send next, they
apply the following rules:

* within the same group, objects with a lower priority number (e.g. P1)
are always sent before objects with a numerically greater priority
number (e.g., P2)
* within the same group, and the same priority level, objects with a
lower object-id are always sent before objects with a higher
object-id.
* objects from later groups are normally always sent before objects of
previous groups.

The latter rule is generally agreed as a way to ensure freshness, and to
recover quickly if queues and delays accumulate during a congestion
period. However, there may be cases when finishing the transmission of
an ongoing group results in better user experience than strict adherence
to the freshness rule. We expect that that the working group will
eventually reach consensus and define meta data that controls this
behavior.

There have been proposals to allow emitters to coordinate the allocation
of layer priorities across multiple coordinated tracks. At this point,
these proposals have not reached consensus.


# Relays {#relays-moq}
Expand All @@ -638,6 +598,10 @@ similar in functionality to Content Delivery Networks
(CDNs). Additionally, relays serve as policy enforcement points by
validating subscribe and publish requests at the edge of a network.

Relays are not required to cache Objects, but relays need to have
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A proxy is a relay too.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The intent of this sentence is to make it clear that they're different. Which I think is useful, because proxies typically have substantially different functionality.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why can't a relay be a 1:1 relay? I'd just chop the sentence at

Relays are not required to cache Objects

The recently merged terminology says

Relay: An entitly that is both a Publisher and a Subscriber, but not the Original Publisher or End Subscriber.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This gets a bit off topic, but I think the more important property of a relay is that it republishes tracks from an upstream publisher without modification. I think there may be another entity we could define which could consume one or more tracks from upstream publishers and act as the original publisher for some new tracks (e.g. in the case of "manifest manipulation" use cases at the edge), but I think that's something we should discuss separately.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As for this bit of text, I'm fine with it either way. To me, it makes explicit that relays may optionally be relatively stateless fan out nodes without any significant local caches, so long as they still allow downstream subscribers to subscribe to tracks from an upstream publisher.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Based on the definition, I'll shorten this sentence and clarify some other text.

the ability to distribute one upstream subscription to multiple
downstream subscriptions.

## Subscriber Interactions

Subscribers interact with the Relays by sending a SUBSCRIBE
Expand Down Expand Up @@ -746,12 +710,6 @@ fields, such as priority order and other metadata properties in the
OBJECT message header. Unless determined by congestion response, Relays
MUST forward the OBJECT message to the matching subscribers.

## Congestion Response at Relays

TODO: Refer to {{priority-congestion}}. Add details to describe relay
behavior when merging or splitting streams and interactions with
congestion response.

## Relay Object Handling

MOQT encodes the delivery information for a stream via OBJECT headers
Expand All @@ -760,8 +718,7 @@ forwarding.

A relay MUST treat the object payload as opaque. A relay MUST NOT
combine, split, or otherwise modify object payloads. A relay SHOULD
prioritize streams ({{priority-congestion}}) based on the send
order/priority.
prioritize sending Objects based on {{priorities}}.

A publisher SHOULD begin sending incomplete objects when available to
avoid incurring additional latency.
Expand Down Expand Up @@ -1039,6 +996,8 @@ SUBSCRIBE Message {
Track Alias (i),
Track Namespace (b),
Track Name (b),
Subscriber Priority (8),
Delivery Order (8),
ianswett marked this conversation as resolved.
Show resolved Hide resolved
Filter Type (i),
[StartGroup (i),
StartObject (i)],
Expand Down Expand Up @@ -1068,6 +1027,14 @@ close the session with a Duplicate Track Alias error ({{session-termination}}).

* Track Name: Identifies the track name as defined in ({{track-name}}).

* Subscriber Priority: Specifies the priority of a subscription relative to
other subscriptions in the same session. Lower numbers get higher priority.
See {{priorities}}.

* Delivery Order: Requests Objects for the subscription be delievered in
Ascending (0x0) or Descending (0x1) order. See {{priorities}}.
ianswett marked this conversation as resolved.
Show resolved Hide resolved
Values larger than 0x1 are a protocol error.
ianswett marked this conversation as resolved.
Show resolved Hide resolved

* Filter Type: Identifies the type of filter, which also indicates whether
the StartGroup/StartObject and EndGroup/EndObject fields will be present.
See ({{sub-filter}}).
Expand Down Expand Up @@ -1118,6 +1085,7 @@ SUBSCRIBE_UPDATE Message {
StartObject (i),
EndGroup (i),
EndObject (i),
Subscriber Priority (8),
ianswett marked this conversation as resolved.
Show resolved Hide resolved
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about changing the group order too? It would be useful for toggling between reliable and unreliable playback.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1 add Group Order to Subscribe Update

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I worry that could create a number of edge cases. A large benefit of SUBSCRIBE_UPDATE vs UNSUBSCRIBE/SUBSCRIBE is it avoids missing Objects or double-sending Objects.

But I'm not writing the code, so if you think it's useful and won't add unnecessary complexity, I'll add it.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Omitting this from subscribe update in favor of unsub/sub is ok, but you might want to add a note that it's intentional.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1 to @ianswett

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Luke, I thought you were complaining about too many options :-) I don't see the use case with this but at first glance does not seem like it would complicated the implementation too much so I am fine with it getting added.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added a sentence in the Priorities section about how you need to use UNSUBSCRIBE and SUBSCRIBE.

One use case I can think of (ie: switching from live head (Descending) to slightly behind live (Ascending)) is better suited to UNSUBSCRIBE and SUBSCRIBE anyway, because you'd want to specify the new start point at wherever you currently are in time, not what's in scope for the current subscription.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new text looks good.

Number of Parameters (i),
Subscribe Parameters (..) ...
}
Expand All @@ -1137,6 +1105,10 @@ open-ended.
* EndObject: The end Object ID, plus 1. A value of 0 means the entire group is
requested.

* Subscriber Priority: Specifies the priority of a subscription relative to
other subscriptions in the same session. Lower numbers get higher priority.
See {{priorities}}.

* Subscribe Parameters: The parameters are defined in {{version-specific-params}}.

## UNSUBSCRIBE {#message-unsubscribe}
Expand Down Expand Up @@ -1252,8 +1224,8 @@ A canonical MoQ Object has the following information:
IDs starts at 0, increasing sequentially for each object within the
group.

* Object Send Order: An integer indicating the object send order
{{send-order}} or priority {{ordering-by-priorities}} value.
* Publisher Priority: An 8 bit integer indicating the publisher's priority for
the Object {{priorities}}.

* Object Forwarding Preference: An enumeration indicating how a publisher sends
an object. The preferences are Track, Group, Object and Datagram. An Object
Expand Down Expand Up @@ -1334,7 +1306,7 @@ OBJECT_STREAM Message {
Track Alias (i),
Group ID (i),
Object ID (i),
Object Send Order (i),
Publisher Priority (8),
Object Status (i),
Object Payload (..),
}
Expand Down Expand Up @@ -1371,7 +1343,7 @@ OBJECT_DATAGRAM Message {
Track Alias (i),
Group ID (i),
Object ID (i),
Object Send Order (i),
Publisher Priority (8),
Object Status (i),
Object Payload (..),
}
Expand Down Expand Up @@ -1403,7 +1375,7 @@ stream header.
STREAM_HEADER_TRACK Message {
Subscribe ID (i)
Track Alias (i),
Object Send Order (i),
Publisher Priority (8),
}
~~~
{: #stream-header-track-format title="MOQT STREAM_HEADER_TRACK Message"}
Expand Down Expand Up @@ -1442,8 +1414,8 @@ have the `Object Send Order` specified in the stream header.
STREAM_HEADER_GROUP Message {
Subscribe ID (i),
Track Alias (i),
Group ID (i)
Object Send Order (i)
Group ID (i),
Publisher Priority (8),
}
~~~
{: #stream-header-group-format title="MOQT STREAM_HEADER_GROUP Message"}
Expand Down Expand Up @@ -1478,7 +1450,7 @@ Sending a track on one stream:
STREAM_HEADER_TRACK {
Subscribe ID = 1
Track Alias = 1
Object Send Order = 0
Publisher Priority = 0
}
{
Group ID = 0
Expand All @@ -1504,7 +1476,7 @@ STREAM_HEADER_GROUP {
Subscribe ID = 2
Track Alias = 2
Group ID = 0
Object Send Order = 0
Publisher Priority = 0
}
{
Object ID = 0
Expand Down
Loading