@@ -4305,7 +4305,8 @@ folly::coro::Task<void> MoQSession::handleSubscribe(
43054305 auto subOk = subHandle->subscribeOk ();
43064306 subOk.requestID = requestID;
43074307
4308- setPublisherPriorityFromParams (subOk.params , trackPublisher);
4308+ setPublisherPriorityFromParams (
4309+ subOk.params , subOk.extensions , trackPublisher);
43094310 trackPublisher->subscribeOkSent (subOk);
43104311
43114312 // TODO: verify TrackAlias is unique
@@ -4314,43 +4315,64 @@ folly::coro::Task<void> MoQSession::handleSubscribe(
43144315 }
43154316}
43164317
4318+ // Extensions are canonical; the param fallback only fires for a locally built
4319+ // message that set the raw param.
4320+ static std::optional<uint64_t > getPublisherPriorityProperty (
4321+ const Extensions& trackProperties,
4322+ const TrackRequestParameters& params) {
4323+ auto publisherPriority = getPublisherPriority (trackProperties);
4324+ if (publisherPriority) {
4325+ return *publisherPriority;
4326+ }
4327+ return getFirstIntParam (params, TrackRequestParamKey::PUBLISHER_PRIORITY );
4328+ }
4329+
4330+ // nullopt leaves the priority unset, which disables elision on the publisher.
4331+ static std::optional<uint8_t > toPublisherPriority (uint64_t advertised) {
4332+ if (advertised > kMaxPriority ) {
4333+ XLOG (WARN ) << " Invalid publisher priority value: " << advertised;
4334+ return std::nullopt ;
4335+ }
4336+ return static_cast <uint8_t >(advertised);
4337+ }
4338+
43174339void MoQSession::setPublisherPriorityFromParams (
43184340 const TrackRequestParameters& params,
4341+ const Extensions& trackProperties,
43194342 const std::shared_ptr<TrackPublisherImpl>& trackPublisher) {
4320- // Extract PUBLISHER_PRIORITY parameter if present (version 15+)
4321- if (getDraftMajorVersion (*getNegotiatedVersion ()) >= 15 ) {
4322- auto publisherPriority =
4323- getFirstIntParam (params, TrackRequestParamKey::PUBLISHER_PRIORITY );
4324- if (publisherPriority) {
4325- if (*publisherPriority <= 255 ) {
4326- trackPublisher->setPublisherPriority (
4327- static_cast <uint8_t >(*publisherPriority));
4328- } else {
4329- XLOG (WARN ) << " Invalid priority value: "
4330- << static_cast <uint64_t >(*publisherPriority);
4331- }
4332- } else {
4333- trackPublisher->setPublisherPriority (kDefaultPriority );
4334- }
4343+ if (getDraftMajorVersion (*getNegotiatedVersion ()) < 15 ) {
4344+ return ;
4345+ }
4346+ auto advertised = getPublisherPriorityProperty (trackProperties, params);
4347+ if (!advertised) {
4348+ // Naming the default lets objects published at it elide the priority byte.
4349+ trackPublisher->setPublisherPriority (kDefaultPriority );
4350+ return ;
4351+ }
4352+ auto publisherPriority = toPublisherPriority (*advertised);
4353+ if (publisherPriority) {
4354+ trackPublisher->setPublisherPriority (*publisherPriority);
43354355 }
43364356}
43374357
43384358void MoQSession::setPublisherPriorityFromParams (
43394359 const TrackRequestParameters& params,
4360+ const Extensions& trackProperties,
43404361 const std::shared_ptr<SubscribeTrackReceiveState>& trackReceiveState) {
4341- // Extract PUBLISHER_PRIORITY parameter if present (version 15+)
4342- if (getDraftMajorVersion (*getNegotiatedVersion ()) >= 15 ) {
4343- auto publisherPriority =
4344- getFirstIntParam (params, TrackRequestParamKey::PUBLISHER_PRIORITY );
4345- if (publisherPriority) {
4346- if (*publisherPriority <= 255 ) {
4347- trackReceiveState->setPublisherPriority (
4348- static_cast <uint8_t >(*publisherPriority));
4349- } else {
4350- XLOG (ERR ) << " Invalid priority value: "
4351- << static_cast <uint64_t >(*publisherPriority);
4352- }
4353- }
4362+ applyResolvedPublisherPriority (
4363+ getPublisherPriorityProperty (trackProperties, params), trackReceiveState);
4364+ }
4365+
4366+ // No default needed here; the receive state reads unset as kDefaultPriority.
4367+ void MoQSession::applyResolvedPublisherPriority (
4368+ std::optional<uint64_t > advertised,
4369+ const std::shared_ptr<SubscribeTrackReceiveState>& trackReceiveState) {
4370+ if (getDraftMajorVersion (*getNegotiatedVersion ()) < 15 || !advertised) {
4371+ return ;
4372+ }
4373+ auto publisherPriority = toPublisherPriority (*advertised);
4374+ if (publisherPriority) {
4375+ trackReceiveState->setPublisherPriority (*publisherPriority);
43544376 }
43554377}
43564378
@@ -4686,7 +4708,8 @@ void MoQSession::onSubscribeOk(SubscribeOk subOk) {
46864708 close (SessionCloseErrorCode::DUPLICATE_TRACK_ALIAS );
46874709 }
46884710 auto trackAlias = subOk.trackAlias ;
4689- setPublisherPriorityFromParams (subOk.params , trackReceiveState);
4711+ setPublisherPriorityFromParams (
4712+ subOk.params , subOk.extensions , trackReceiveState);
46904713 trackReceiveState->processSubscribeOK (std::move (subOk));
46914714 if (trackReceiveState->getSubscribeCallback ()) {
46924715 trackReceiveState->getSubscribeCallback ()->setTrackAlias (trackAlias);
@@ -4884,11 +4907,12 @@ folly::coro::Task<void> MoQSession::handlePublish(
48844907 co_await folly::coro::co_safe_point;
48854908 folly::RequestContextScopeGuard guard;
48864909 setRequestSession ();
4887- // Capture params before moving publish
4910+ // Read what we need before publish is moved; copying Extensions clones IOBufs
48884911 auto requestID = publish.requestID ;
48894912 auto alias = publish.trackAlias ;
48904913 auto ftn = publish.fullTrackName ;
4891- auto params = publish.params ;
4914+ auto publisherPriority =
4915+ getPublisherPriorityProperty (publish.extensions , publish.params );
48924916
48934917 // PubError if error occurs
48944918 auto publishErr =
@@ -4925,8 +4949,7 @@ folly::coro::Task<void> MoQSession::handlePublish(
49254949 auto trackReceiveState = std::make_shared<SubscribeTrackReceiveState>(
49264950 ftn, requestID, initiator.consumer , this , alias, logger_, true );
49274951
4928- // Extract PUBLISHER_PRIORITY parameter if present (version 15+)
4929- setPublisherPriorityFromParams (params, trackReceiveState);
4952+ applyResolvedPublisherPriority (publisherPriority, trackReceiveState);
49304953
49314954 initiator.consumer ->setTrackAlias (alias);
49324955 subTracks_.emplace (alias, trackReceiveState);
@@ -5859,8 +5882,7 @@ Subscriber::PublishResult MoQSession::publish(
58595882 // Set publishHandle in trackPublisher so it can cancel on unsubscribes
58605883 trackPublisher->setSubscriptionHandle (std::move (handle));
58615884
5862- // Extract PUBLISHER_PRIORITY parameter if present (version 15+)
5863- setPublisherPriorityFromParams (pub.params , trackPublisher);
5885+ setPublisherPriorityFromParams (pub.params , pub.extensions , trackPublisher);
58645886
58655887 // Set reply context so sendPublishDone can write on the correct stream
58665888 auto & control = sendResult.value ();
0 commit comments