Delete Subscribe ID from MoQT Object headers

new to draft-07

PiperOrigin-RevId: 690628260
diff --git a/quiche/quic/moqt/moqt_framer.cc b/quiche/quic/moqt/moqt_framer.cc
index f15f380..3e0834d 100644
--- a/quiche/quic/moqt/moqt_framer.cc
+++ b/quiche/quic/moqt/moqt_framer.cc
@@ -304,7 +304,6 @@
     case MoqtForwardingPreference::kTrack:
       return (message.payload_length == 0)
                  ? Serialize(WireVarInt62(message_type),
-                             WireVarInt62(message.subscribe_id),
                              WireVarInt62(message.track_alias),
                              WireUint8(message.publisher_priority),
                              WireVarInt62(message.group_id),
@@ -312,7 +311,6 @@
                              WireVarInt62(message.payload_length),
                              WireVarInt62(message.object_status))
                  : Serialize(WireVarInt62(message_type),
-                             WireVarInt62(message.subscribe_id),
                              WireVarInt62(message.track_alias),
                              WireUint8(message.publisher_priority),
                              WireVarInt62(message.group_id),
@@ -321,7 +319,6 @@
     case MoqtForwardingPreference::kSubgroup:
       return (message.payload_length == 0)
                  ? Serialize(WireVarInt62(message_type),
-                             WireVarInt62(message.subscribe_id),
                              WireVarInt62(message.track_alias),
                              WireVarInt62(message.group_id),
                              WireVarInt62(*message.subgroup_id),
@@ -330,7 +327,6 @@
                              WireVarInt62(message.payload_length),
                              WireVarInt62(message.object_status))
                  : Serialize(WireVarInt62(message_type),
-                             WireVarInt62(message.subscribe_id),
                              WireVarInt62(message.track_alias),
                              WireVarInt62(message.group_id),
                              WireVarInt62(*message.subgroup_id),
@@ -363,17 +359,15 @@
   if (message.payload_length == 0) {
     return Serialize(
         WireVarInt62(MoqtDataStreamType::kObjectDatagram),
-        WireVarInt62(message.subscribe_id), WireVarInt62(message.track_alias),
-        WireVarInt62(message.group_id), WireVarInt62(message.object_id),
-        WireUint8(message.publisher_priority),
+        WireVarInt62(message.track_alias), WireVarInt62(message.group_id),
+        WireVarInt62(message.object_id), WireUint8(message.publisher_priority),
         WireVarInt62(message.payload_length),
         WireVarInt62(message.object_status));
   }
   return Serialize(
       WireVarInt62(MoqtDataStreamType::kObjectDatagram),
-      WireVarInt62(message.subscribe_id), WireVarInt62(message.track_alias),
-      WireVarInt62(message.group_id), WireVarInt62(message.object_id),
-      WireUint8(message.publisher_priority),
+      WireVarInt62(message.track_alias), WireVarInt62(message.group_id),
+      WireVarInt62(message.object_id), WireUint8(message.publisher_priority),
       WireVarInt62(message.payload_length), WireBytes(payload));
 }
 
diff --git a/quiche/quic/moqt/moqt_framer_test.cc b/quiche/quic/moqt/moqt_framer_test.cc
index e73142f..b740d64 100644
--- a/quiche/quic/moqt/moqt_framer_test.cc
+++ b/quiche/quic/moqt/moqt_framer_test.cc
@@ -288,7 +288,6 @@
 TEST_F(MoqtFramerSimpleTest, BadObjectInput) {
   MoqtObject object = {
       // This is a valid object.
-      /*subscribe_id=*/3,
       /*track_alias=*/4,
       /*group_id=*/5,
       /*object_id=*/6,
@@ -330,7 +329,6 @@
 TEST_F(MoqtFramerSimpleTest, BadDatagramInput) {
   MoqtObject object = {
       // This is a valid datagram.
-      /*subscribe_id=*/3,
       /*track_alias=*/4,
       /*group_id=*/5,
       /*object_id=*/6,
@@ -367,7 +365,6 @@
 TEST_F(MoqtFramerSimpleTest, Datagram) {
   auto datagram = std::make_unique<ObjectDatagramMessage>();
   MoqtObject object = {
-      /*subscribe_id=*/3,
       /*track_alias=*/4,
       /*group_id=*/5,
       /*object_id=*/6,
diff --git a/quiche/quic/moqt/moqt_messages.h b/quiche/quic/moqt/moqt_messages.h
index eaca3d6..5a4064a 100644
--- a/quiche/quic/moqt/moqt_messages.h
+++ b/quiche/quic/moqt/moqt_messages.h
@@ -324,7 +324,6 @@
 // The data contained in every Object message, although the message type
 // implies some of the values.
 struct QUICHE_EXPORT MoqtObject {
-  uint64_t subscribe_id;
   uint64_t track_alias;
   uint64_t group_id;
   uint64_t object_id;
diff --git a/quiche/quic/moqt/moqt_parser.cc b/quiche/quic/moqt/moqt_parser.cc
index 1af9f74..2c63356 100644
--- a/quiche/quic/moqt/moqt_parser.cc
+++ b/quiche/quic/moqt/moqt_parser.cc
@@ -63,8 +63,7 @@
 
 size_t ParseObjectHeader(quic::QuicDataReader& reader, MoqtObject& object,
                          MoqtDataStreamType type) {
-  if (!reader.ReadVarInt62(&object.subscribe_id) ||
-      !reader.ReadVarInt62(&object.track_alias)) {
+  if (!reader.ReadVarInt62(&object.track_alias)) {
     return 0;
   }
   if (type != MoqtDataStreamType::kStreamHeaderTrack &&
diff --git a/quiche/quic/moqt/moqt_parser_test.cc b/quiche/quic/moqt/moqt_parser_test.cc
index fb9ed3c..3e6a0d9 100644
--- a/quiche/quic/moqt/moqt_parser_test.cc
+++ b/quiche/quic/moqt/moqt_parser_test.cc
@@ -460,7 +460,7 @@
 TEST_F(MoqtMessageSpecificTest, ThreePartObjectFirstIncomplete) {
   MoqtDataParser parser(&visitor_);
   auto message = std::make_unique<StreamHeaderSubgroupMessage>();
-  EXPECT_TRUE(message->SetPayloadLength(50));
+  EXPECT_TRUE(message->SetPayloadLength(51));
 
   // first part
   parser.ProcessData(message->PacketSample().substr(0, 4), false);
@@ -474,9 +474,9 @@
   EXPECT_EQ(visitor_.messages_received_, 0);
   EXPECT_TRUE(message->EqualFieldValues(*visitor_.last_message_));
   EXPECT_FALSE(visitor_.end_of_message_);
-  // The value "47" is the overall wire image size of 55 minus the non-payload
+  // The value "48" is the overall wire image size of 55 minus the non-payload
   // part of the message.
-  EXPECT_EQ(visitor_.object_payload().length(), 47);
+  EXPECT_EQ(visitor_.object_payload().length(), 48);
 
   // third part includes FIN
   parser.ProcessData("bar", true);
@@ -912,10 +912,10 @@
 TEST_F(MoqtMessageSpecificTest, InvalidObjectStatus) {
   MoqtDataParser parser(&visitor_);
   char stream_header_subgroup[] = {
-      0x04,                    // type field
-      0x03, 0x04, 0x05, 0x08,  // varints
-      0x07,                    // publisher priority
-      0x06, 0x00, 0x0f,        // object middler; status = 0x0f
+      0x04,              // type field
+      0x04, 0x05, 0x08,  // varints
+      0x07,              // publisher priority
+      0x06, 0x00, 0x0f,  // object middler; status = 0x0f
   };
   parser.ProcessData(
       absl::string_view(stream_header_subgroup, sizeof(stream_header_subgroup)),
diff --git a/quiche/quic/moqt/moqt_session.cc b/quiche/quic/moqt/moqt_session.cc
index 63dbbfb..3236bae 100644
--- a/quiche/quic/moqt/moqt_session.cc
+++ b/quiche/quic/moqt/moqt_session.cc
@@ -193,10 +193,10 @@
   absl::string_view payload = ParseDatagram(datagram, message);
   QUICHE_DLOG(INFO) << ENDPOINT
                     << "Received OBJECT message in datagram for subscribe_id "
-                    << message.subscribe_id << " for track alias "
-                    << message.track_alias << " with sequence "
-                    << message.group_id << ":" << message.object_id
-                    << " priority " << message.publisher_priority << " length "
+                    << " for track alias " << message.track_alias
+                    << " with sequence " << message.group_id << ":"
+                    << message.object_id << " priority "
+                    << message.publisher_priority << " length "
                     << payload.size();
   auto [full_track_name, visitor] = TrackPropertiesFromAlias(message);
   if (visitor != nullptr) {
@@ -495,28 +495,34 @@
 std::pair<FullTrackName, RemoteTrack::Visitor*>
 MoqtSession::TrackPropertiesFromAlias(const MoqtObject& message) {
   auto it = remote_tracks_.find(message.track_alias);
-  RemoteTrack::Visitor* visitor = nullptr;
   if (it == remote_tracks_.end()) {
-    // SUBSCRIBE_OK has not arrived yet, but deliver it.
-    auto subscribe_it = active_subscribes_.find(message.subscribe_id);
-    if (subscribe_it == active_subscribes_.end()) {
+    ActiveSubscribe* subscribe = nullptr;
+    // SUBSCRIBE_OK has not arrived yet, but deliver the object. Indexing
+    // active_subscribes_ by track alias would make this faster if the
+    // subscriber has tons of incomplete subscribes.
+    for (auto& open_subscribe : active_subscribes_) {
+      if (open_subscribe.second.message.track_alias == message.track_alias) {
+        subscribe = &open_subscribe.second;
+        break;
+      }
+    }
+    if (subscribe == nullptr) {
       return std::pair<FullTrackName, RemoteTrack::Visitor*>(
           {FullTrackName{}, nullptr});
     }
-    ActiveSubscribe& subscribe = subscribe_it->second;
-    visitor = subscribe.visitor;
-    subscribe.received_object = true;
-    if (subscribe.forwarding_preference.has_value()) {
-      if (message.forwarding_preference != *subscribe.forwarding_preference) {
+    subscribe->received_object = true;
+    if (subscribe->forwarding_preference.has_value()) {
+      if (message.forwarding_preference != *subscribe->forwarding_preference) {
         Error(MoqtError::kProtocolViolation,
               "Forwarding preference changes mid-track");
         return std::pair<FullTrackName, RemoteTrack::Visitor*>(
             {FullTrackName{}, nullptr});
       }
     } else {
-      subscribe.forwarding_preference = message.forwarding_preference;
+      subscribe->forwarding_preference = message.forwarding_preference;
     }
-    return std::make_pair(subscribe.message.full_track_name, subscribe.visitor);
+    return std::make_pair(subscribe->message.full_track_name,
+                          subscribe->visitor);
   }
   RemoteTrack& track = it->second;
   if (!track.CheckForwardingPreference(message.forwarding_preference)) {
@@ -902,8 +908,7 @@
                                                       absl::string_view payload,
                                                       bool end_of_message) {
   QUICHE_DVLOG(1) << ENDPOINT << "Received OBJECT message on stream "
-                  << stream_->GetStreamId() << " for subscribe_id "
-                  << message.subscribe_id << " for track alias "
+                  << stream_->GetStreamId() << " for track alias "
                   << message.track_alias << " with sequence "
                   << message.group_id << ":" << message.object_id
                   << " priority " << message.publisher_priority
@@ -1269,7 +1274,6 @@
   UpdateSendOrder(subscription);
 
   MoqtObject header;
-  header.subscribe_id = subscription_id_;
   header.track_alias = subscription.track_alias();
   header.group_id = object.sequence.group;
   header.object_id = object.sequence.object;
@@ -1350,7 +1354,6 @@
   }
 
   MoqtObject header;
-  header.subscribe_id = subscription_id_;
   header.track_alias = track_alias();
   header.group_id = object->sequence.group;
   header.object_id = object->sequence.object;
diff --git a/quiche/quic/moqt/moqt_session.h b/quiche/quic/moqt/moqt_session.h
index 2fad2ac..e24268b 100644
--- a/quiche/quic/moqt/moqt_session.h
+++ b/quiche/quic/moqt/moqt_session.h
@@ -488,8 +488,6 @@
   std::string error_;
 
   // All the tracks the session is subscribed to, indexed by track_alias.
-  // Multiple subscribes to the same track are recorded in a single
-  // subscription.
   absl::flat_hash_map<uint64_t, RemoteTrack> remote_tracks_;
   // Look up aliases for remote tracks by name
   absl::flat_hash_map<FullTrackName, uint64_t> remote_track_aliases_;
diff --git a/quiche/quic/moqt/moqt_session_test.cc b/quiche/quic/moqt/moqt_session_test.cc
index e4af115..643364c 100644
--- a/quiche/quic/moqt/moqt_session_test.cc
+++ b/quiche/quic/moqt/moqt_session_test.cc
@@ -840,7 +840,6 @@
   std::string payload = "deadbeef";
   MoqtSessionPeer::CreateRemoteTrack(&session_, ftn, &visitor_, 2);
   MoqtObject object = {
-      /*subscribe_id=*/1,
       /*track_alias=*/2,
       /*group_sequence=*/0,
       /*object_sequence=*/0,
@@ -866,7 +865,6 @@
   std::string payload = "deadbeef";
   MoqtSessionPeer::CreateRemoteTrack(&session_, ftn, &visitor_, 2);
   MoqtObject object = {
-      /*subscribe_id=*/1,
       /*track_alias=*/2,
       /*group_sequence=*/0,
       /*object_sequence=*/0,
@@ -897,7 +895,6 @@
   std::string payload = "deadbeef";
   MoqtSessionPeer::CreateRemoteTrack(&session, ftn, &visitor_, 2);
   MoqtObject object = {
-      /*subscribe_id=*/1,
       /*track_alias=*/2,
       /*group_sequence=*/0,
       /*object_sequence=*/0,
@@ -935,7 +932,6 @@
   };
   MoqtSessionPeer::AddActiveSubscribe(&session_, 1, subscribe, &visitor_);
   MoqtObject object = {
-      /*subscribe_id=*/1,
       /*track_alias=*/2,
       /*group_sequence=*/0,
       /*object_sequence=*/0,
@@ -993,7 +989,6 @@
   };
   MoqtSessionPeer::AddActiveSubscribe(&session_, 1, subscribe, &visitor);
   MoqtObject object = {
-      /*subscribe_id=*/1,
       /*track_alias=*/2,
       /*group_sequence=*/0,
       /*object_sequence=*/0,
@@ -1054,7 +1049,6 @@
   };
   MoqtSessionPeer::AddActiveSubscribe(&session_, 1, subscribe, &visitor);
   MoqtObject object = {
-      /*subscribe_id=*/1,
       /*track_alias=*/2,
       /*group_sequence=*/0,
       /*object_sequence=*/0,
@@ -1106,7 +1100,6 @@
   };
   MoqtSessionPeer::AddActiveSubscribe(&session_, 1, subscribe, &visitor);
   MoqtObject object = {
-      /*subscribe_id=*/1,
       /*track_alias=*/2,
       /*group_sequence=*/0,
       /*object_sequence=*/0,
@@ -1184,7 +1177,7 @@
 
   // Verify first six message fields are sent correctly
   bool correct_message = false;
-  const std::string kExpectedMessage = {0x04, 0x00, 0x02, 0x05, 0x00, 0x00};
+  const std::string kExpectedMessage = {0x04, 0x02, 0x05, 0x00, 0x00};
   EXPECT_CALL(mock_stream, Writev(_, _))
       .WillOnce([&](absl::Span<const absl::string_view> data,
                     const quiche::StreamWriteOptions& options) {
@@ -1409,7 +1402,7 @@
   // Publish in window.
   bool correct_message = false;
   uint8_t kExpectedMessage[] = {
-      0x01, 0x00, 0x02, 0x05, 0x00, 0x00, 0x08, 0x64,
+      0x01, 0x02, 0x05, 0x00, 0x00, 0x08, 0x64,
       0x65, 0x61, 0x64, 0x62, 0x65, 0x65, 0x66,
   };
   EXPECT_CALL(mock_session_, SendOrQueueDatagram(_))
@@ -1436,7 +1429,6 @@
   std::string payload = "deadbeef";
   MoqtSessionPeer::CreateRemoteTrack(&session_, ftn, &visitor_, 2);
   MoqtObject object = {
-      /*subscribe_id=*/1,
       /*track_alias=*/2,
       /*group_sequence=*/0,
       /*object_sequence=*/0,
@@ -1446,7 +1438,7 @@
       /*subgroup_id=*/std::nullopt,
       /*payload_length=*/8,
   };
-  char datagram[] = {0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x08, 0x64,
+  char datagram[] = {0x01, 0x02, 0x00, 0x00, 0x00, 0x08, 0x64,
                      0x65, 0x61, 0x64, 0x62, 0x65, 0x65, 0x66};
   EXPECT_CALL(
       visitor_,
@@ -1463,7 +1455,6 @@
   std::string payload = "deadbeef";
   MoqtSessionPeer::CreateRemoteTrack(&session_, ftn, &visitor_, 2);
   MoqtObject object = {
-      /*subscribe_id=*/1,
       /*track_alias=*/2,
       /*group_sequence=*/0,
       /*object_sequence=*/0,
@@ -1617,22 +1608,22 @@
   EXPECT_CALL(mock_stream0, Writev(_, _))
       .WillOnce([&](absl::Span<const absl::string_view> data,
                     const quiche::StreamWriteOptions& options) {
-        // The Group ID is the 4th byte of the stream.
-        EXPECT_EQ(static_cast<const uint8_t>(data[0][4]), 0);
+        // The Group ID is the 3rd byte of the stream.
+        EXPECT_EQ(static_cast<const uint8_t>(data[0][2]), 0);
         return absl::OkStatus();
       });
   EXPECT_CALL(mock_stream1, Writev(_, _))
       .WillOnce([&](absl::Span<const absl::string_view> data,
                     const quiche::StreamWriteOptions& options) {
-        // The Group ID is the 4th byte of the stream.
-        EXPECT_EQ(static_cast<const uint8_t>(data[0][3]), 1);
+        // The Group ID is the 3rd byte of the stream.
+        EXPECT_EQ(static_cast<const uint8_t>(data[0][2]), 1);
         return absl::OkStatus();
       });
   EXPECT_CALL(mock_stream2, Writev(_, _))
       .WillOnce([&](absl::Span<const absl::string_view> data,
                     const quiche::StreamWriteOptions& options) {
-        // The Group ID is the 4th byte of the stream.
-        EXPECT_EQ(static_cast<const uint8_t>(data[0][3]), 2);
+        // The Group ID is the 3rd byte of the stream.
+        EXPECT_EQ(static_cast<const uint8_t>(data[0][2]), 2);
         return absl::OkStatus();
       });
   session_.OnCanCreateNewOutgoingUnidirectionalStream();
@@ -1661,26 +1652,32 @@
 }
 
 TEST_F(MoqtSessionTest, QueuedStreamPriorityChanged) {
-  FullTrackName ftn("foo", "bar");
-  auto track = SetupPublisher(ftn, MoqtForwardingPreference::kSubgroup,
-                              FullSequence(0, 0));
-  EXPECT_CALL(*track, GetTrackStatus())
+  FullTrackName ftn1("foo", "bar");
+  auto track1 = SetupPublisher(ftn1, MoqtForwardingPreference::kSubgroup,
+                               FullSequence(0, 0));
+  FullTrackName ftn2("dead", "beef");
+  auto track2 = SetupPublisher(ftn2, MoqtForwardingPreference::kSubgroup,
+                               FullSequence(0, 0));
+  EXPECT_CALL(*track1, GetTrackStatus())
       .WillRepeatedly(Return(MoqtTrackStatusCode::kNotYetBegun));
-  // Create two identical subscriptions with different priorities.
+  EXPECT_CALL(*track2, GetTrackStatus())
+      .WillRepeatedly(Return(MoqtTrackStatusCode::kNotYetBegun));
   MoqtObjectListener* subscription0 =
-      MoqtSessionPeer::AddSubscription(&session_, track, 0, 14, 0, 0);
+      MoqtSessionPeer::AddSubscription(&session_, track1, 0, 14, 0, 0);
   MoqtObjectListener* subscription1 =
-      MoqtSessionPeer::AddSubscription(&session_, track, 1, 14, 0, 0);
+      MoqtSessionPeer::AddSubscription(&session_, track2, 1, 15, 0, 0);
   MoqtSessionPeer::UpdateSubscriberPriority(&session_, 0, 1);
   MoqtSessionPeer::UpdateSubscriberPriority(&session_, 1, 2);
 
-  // Two arriving objects will queue four streams.
+  // Two published objects will queue four streams.
   EXPECT_CALL(mock_session_, CanOpenNextOutgoingUnidirectionalStream())
       .WillOnce(Return(false))
       .WillOnce(Return(false))
       .WillOnce(Return(false))
       .WillOnce(Return(false));
-  EXPECT_CALL(*track, GetTrackStatus())
+  EXPECT_CALL(*track1, GetTrackStatus())
+      .WillRepeatedly(Return(MoqtTrackStatusCode::kInProgress));
+  EXPECT_CALL(*track2, GetTrackStatus())
       .WillRepeatedly(Return(MoqtTrackStatusCode::kInProgress));
   subscription0->OnNewObjectAvailable(FullSequence(0, 0));
   subscription1->OnNewObjectAvailable(FullSequence(0, 0));
@@ -1703,20 +1700,20 @@
   EXPECT_CALL(mock_stream0, visitor()).WillOnce([&]() {
     return stream_visitor0.get();
   });
-  EXPECT_CALL(*track, GetCachedObject(FullSequence(0, 0)))
+  EXPECT_CALL(*track1, GetCachedObject(FullSequence(0, 0)))
       .WillOnce(
           Return(PublishedObject{FullSequence(0, 0), MoqtObjectStatus::kNormal,
-                                 127, MemSliceFromString("deadbeef")}));
-  EXPECT_CALL(*track, GetCachedObject(FullSequence(0, 1)))
+                                 127, MemSliceFromString("foobar")}));
+  EXPECT_CALL(*track1, GetCachedObject(FullSequence(0, 1)))
       .WillOnce(Return(std::nullopt));
   EXPECT_CALL(mock_stream0, CanWrite()).WillRepeatedly(Return(true));
   EXPECT_CALL(mock_stream0, Writev(_, _))
       .WillOnce([&](absl::Span<const absl::string_view> data,
                     const quiche::StreamWriteOptions& options) {
-        // Check subscribe ID is 0.
-        EXPECT_EQ(static_cast<const uint8_t>(data[0][1]), 0);
+        // Check track alias is 14.
+        EXPECT_EQ(static_cast<const uint8_t>(data[0][1]), 14);
         // Check Group ID is 0
-        EXPECT_EQ(static_cast<const uint8_t>(data[0][3]), 0);
+        EXPECT_EQ(static_cast<const uint8_t>(data[0][2]), 0);
         return absl::OkStatus();
       });
   session_.OnCanCreateNewOutgoingUnidirectionalStream();
@@ -1739,20 +1736,20 @@
   EXPECT_CALL(mock_stream1, visitor()).WillOnce([&]() {
     return stream_visitor1.get();
   });
-  EXPECT_CALL(*track, GetCachedObject(FullSequence(0, 0)))
+  EXPECT_CALL(*track2, GetCachedObject(FullSequence(0, 0)))
       .WillOnce(
           Return(PublishedObject{FullSequence(0, 0), MoqtObjectStatus::kNormal,
                                  127, MemSliceFromString("deadbeef")}));
-  EXPECT_CALL(*track, GetCachedObject(FullSequence(0, 1)))
+  EXPECT_CALL(*track2, GetCachedObject(FullSequence(0, 1)))
       .WillOnce(Return(std::nullopt));
   EXPECT_CALL(mock_stream1, CanWrite()).WillRepeatedly(Return(true));
   EXPECT_CALL(mock_stream1, Writev(_, _))
       .WillOnce([&](absl::Span<const absl::string_view> data,
                     const quiche::StreamWriteOptions& options) {
-        // Check subscribe ID is 0.
-        EXPECT_EQ(static_cast<const uint8_t>(data[0][1]), 1);
+        // Check track alias is 15.
+        EXPECT_EQ(static_cast<const uint8_t>(data[0][1]), 15);
         // Check Group ID is 0
-        EXPECT_EQ(static_cast<const uint8_t>(data[0][3]), 0);
+        EXPECT_EQ(static_cast<const uint8_t>(data[0][2]), 0);
         return absl::OkStatus();
       });
   session_.OnCanCreateNewOutgoingUnidirectionalStream();
diff --git a/quiche/quic/moqt/test_tools/moqt_test_message.h b/quiche/quic/moqt/test_tools/moqt_test_message.h
index d0318bd..1138024 100644
--- a/quiche/quic/moqt/test_tools/moqt_test_message.h
+++ b/quiche/quic/moqt/test_tools/moqt_test_message.h
@@ -164,10 +164,6 @@
  public:
   bool EqualFieldValues(MessageStructuredData& values) const override {
     auto cast = std::get<MoqtObject>(values);
-    if (cast.subscribe_id != object_.subscribe_id) {
-      QUIC_LOG(INFO) << "OBJECT Track ID mismatch";
-      return false;
-    }
     if (cast.track_alias != object_.track_alias) {
       QUIC_LOG(INFO) << "OBJECT Track ID mismatch";
       return false;
@@ -209,7 +205,6 @@
 
  protected:
   MoqtObject object_ = {
-      /*subscribe_id=*/3,
       /*track_alias=*/4,
       /*group_id*/ 5,
       /*object_id=*/6,
@@ -228,13 +223,13 @@
     object_.forwarding_preference = MoqtForwardingPreference::kDatagram;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvvv-v---", false); }
+  void ExpandVarints() override { ExpandVarintsImpl("vvvv-v---", false); }
 
  private:
-  uint8_t raw_packet_[10] = {
-      0x01, 0x03, 0x04, 0x05, 0x06,  // varints
-      0x07,                          // publisher priority
-      0x03, 0x66, 0x6f, 0x6f,        // payload = "foo"
+  uint8_t raw_packet_[9] = {
+      0x01, 0x04, 0x05, 0x06,  // varints
+      0x07,                    // publisher priority
+      0x03, 0x66, 0x6f, 0x6f,  // payload = "foo"
   };
 };
 
@@ -248,16 +243,16 @@
     object_.payload_length = 3;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvv-vvv", false); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv-vvv", false); }
 
  private:
   // Some tests check that a FIN sent at the halfway point of a message results
   // in an error. Without the unnecessary expanded varint 0x0405, the halfway
   // point falls at the end of the Stream Header, which is legal. Expand the
   // varint so that the FIN would be illegal.
-  uint8_t raw_packet_[10] = {
+  uint8_t raw_packet_[9] = {
       0x02,                    // type field
-      0x03, 0x04,              // varints
+      0x04,                    // varints
       0x07,                    // publisher priority
       0x05, 0x06,              // object middler
       0x03, 0x66, 0x6f, 0x6f,  // payload = "foo"
@@ -291,7 +286,7 @@
     object_.subgroup_id = 8;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvvv-vv", false); }
+  void ExpandVarints() override { ExpandVarintsImpl("vvvv-vv", false); }
 
   bool SetPayloadLength(uint8_t payload_length) {
     if (payload_length > 63) {
@@ -299,15 +294,15 @@
       return false;
     }
     object_.payload_length = payload_length;
-    raw_packet_[7] = payload_length;
+    raw_packet_[6] = payload_length;
     SetWireImage(raw_packet_, sizeof(raw_packet_));
     return true;
   }
 
  private:
-  uint8_t raw_packet_[11] = {
+  uint8_t raw_packet_[10] = {
       0x04,                          // type field
-      0x03, 0x04, 0x05, 0x08,        // varints
+      0x04, 0x05, 0x08,              // varints
       0x07,                          // publisher priority
       0x06, 0x03, 0x66, 0x6f, 0x6f,  // object middler; payload = "foo"
   };