@@ -385,6 +385,62 @@ bool apply_subscribe_update(SubscribeMessage& subscribe, const SubscribeUpdateMe
385385 return true ;
386386}
387387
388+ bool decode_legacy_subscribe_update_message (std::span<const std::uint8_t > bytes,
389+ const std::map<std::string, PublishedTrack>& tracks_by_name,
390+ const std::map<std::uint64_t , SubscribeMessage>& pending_subscriptions,
391+ SubscribeUpdateMessage& message) {
392+ std::size_t offset = 0 ;
393+ std::uint64_t message_type = 0 ;
394+ if (!decode_varint (bytes, offset, message_type) || message_type != 0x02 || offset + 2 > bytes.size ()) {
395+ return false ;
396+ }
397+
398+ const std::size_t payload_length =
399+ (static_cast <std::size_t >(bytes[offset]) << 8 ) | static_cast <std::size_t >(bytes[offset + 1 ]);
400+ offset += 2 ;
401+ if (offset + payload_length != bytes.size () || payload_length != 7 ) {
402+ return false ;
403+ }
404+
405+ std::size_t payload_offset = offset;
406+ std::uint64_t track_alias = 0 ;
407+ std::uint64_t start_group_id = 0 ;
408+ std::uint64_t start_object_id = 0 ;
409+ if (!decode_varint (bytes, payload_offset, track_alias) ||
410+ !decode_varint (bytes, payload_offset, start_group_id) ||
411+ !decode_varint (bytes, payload_offset, start_object_id) ||
412+ payload_offset + 4 != bytes.size ()) {
413+ return false ;
414+ }
415+
416+ const std::uint8_t subscriber_priority = bytes[payload_offset++];
417+ const std::uint8_t group_order = bytes[payload_offset++];
418+ const std::uint8_t parameter_or_filter = bytes[payload_offset++];
419+ const std::uint8_t forward = bytes[payload_offset++];
420+ if (group_order > 2 || forward > 1 ) {
421+ return false ;
422+ }
423+ static_cast <void >(parameter_or_filter);
424+
425+ for (const auto & [request_id, subscribe] : pending_subscriptions) {
426+ const auto track_it = tracks_by_name.find (subscribe.track_name );
427+ if (track_it == tracks_by_name.end () || track_it->second .alias != track_alias) {
428+ continue ;
429+ }
430+
431+ message.request_id = 0 ;
432+ message.subscription_request_id = request_id;
433+ message.start_group_id = static_cast <std::size_t >(start_group_id);
434+ message.start_object_id = static_cast <std::size_t >(start_object_id);
435+ message.end_group_plus_one = subscribe.filter_type == 0x04 ? (subscribe.end_group_id + 1 ) : 0 ;
436+ message.subscriber_priority = subscriber_priority;
437+ message.forward = forward;
438+ return true ;
439+ }
440+
441+ return false ;
442+ }
443+
388444TransportStatus serve_subscriptions (PublisherTransport& transport,
389445 std::uint64_t control_stream_id,
390446 const openmoq::publisher::PublishPlan& plan,
@@ -425,7 +481,11 @@ TransportStatus serve_subscriptions(PublisherTransport& transport,
425481
426482 if (message_type == 0x02 ) {
427483 SubscribeUpdateMessage subscribe_update;
428- if (!decode_subscribe_update_message (message_bytes, subscribe_update)) {
484+ if (!decode_subscribe_update_message (message_bytes, subscribe_update) &&
485+ !decode_legacy_subscribe_update_message (message_bytes,
486+ tracks_by_name,
487+ pending_subscriptions,
488+ subscribe_update)) {
429489 return TransportStatus::failure (" received invalid SUBSCRIBE_UPDATE" );
430490 }
431491 auto pending_it = pending_subscriptions.find (subscribe_update.subscription_request_id );
0 commit comments