Change MoQT control message size to be 16 bits.

PiperOrigin-RevId: 755220706
diff --git a/quiche/quic/moqt/moqt_framer.cc b/quiche/quic/moqt/moqt_framer.cc
index bf810f4..d2f57fc 100644
--- a/quiche/quic/moqt/moqt_framer.cc
+++ b/quiche/quic/moqt/moqt_framer.cc
@@ -160,17 +160,17 @@
 QuicheBuffer SerializeControlMessage(MoqtMessageType type, Ts... data) {
   uint64_t message_type = static_cast<uint64_t>(type);
   size_t payload_size = quiche::ComputeLengthOnWire(data...);
-  size_t buffer_size =
-      payload_size + quiche::ComputeLengthOnWire(WireVarInt62(message_type),
-                                                 WireVarInt62(payload_size));
+  size_t buffer_size = sizeof(uint16_t) + payload_size +
+                       quiche::ComputeLengthOnWire(WireVarInt62(message_type));
   if (buffer_size == 0) {
     return QuicheBuffer();
   }
 
   QuicheBuffer buffer(quiche::SimpleBufferAllocator::Get(), buffer_size);
   quiche::QuicheDataWriter writer(buffer.size(), buffer.data());
-  absl::Status status = SerializeIntoWriter(
-      writer, WireVarInt62(message_type), WireVarInt62(payload_size), data...);
+  absl::Status status =
+      SerializeIntoWriter(writer, WireVarInt62(message_type),
+                          quiche::WireUint16(payload_size), data...);
   if (!status.ok() || writer.remaining() != 0) {
     QUICHE_BUG(moqt_failed_serialization)
         << "Failed to serialize MoQT frame: " << status;
diff --git a/quiche/quic/moqt/moqt_framer_test.cc b/quiche/quic/moqt/moqt_framer_test.cc
index 21738c9..e772bc8 100644
--- a/quiche/quic/moqt/moqt_framer_test.cc
+++ b/quiche/quic/moqt/moqt_framer_test.cc
@@ -427,7 +427,7 @@
       }
       buffer = framer_.SerializeSubscribe(subscribe);
       // Go to the filter type.
-      const uint8_t* read = BufferAtOffset(buffer, 16);
+      const uint8_t* read = BufferAtOffset(buffer, 17);
       EXPECT_EQ(static_cast<MoqtFilterType>(*read), expected_filter_type);
       EXPECT_GT(buffer.size(), 0);
     }
@@ -486,7 +486,7 @@
   quiche::QuicheBuffer buffer;
   buffer = framer_.SerializeSubscribeUpdate(subscribe_update);
   EXPECT_GT(buffer.size(), 0);
-  const uint8_t* end_group = BufferAtOffset(buffer, 5);
+  const uint8_t* end_group = BufferAtOffset(buffer, 6);
   EXPECT_EQ(*end_group, 5);
 }
 
@@ -501,7 +501,7 @@
   quiche::QuicheBuffer buffer;
   buffer = framer_.SerializeSubscribeUpdate(subscribe_update);
   EXPECT_GT(buffer.size(), 0);
-  const uint8_t* end_group = BufferAtOffset(buffer, 5);
+  const uint8_t* end_group = BufferAtOffset(buffer, 6);
   EXPECT_EQ(*end_group, 5);
 }
 
diff --git a/quiche/quic/moqt/moqt_parser.cc b/quiche/quic/moqt/moqt_parser.cc
index 66d52ba..5dd2508 100644
--- a/quiche/quic/moqt/moqt_parser.cc
+++ b/quiche/quic/moqt/moqt_parser.cc
@@ -179,7 +179,6 @@
   auto on_return = absl::MakeCleanup([&] { processing_ = false; });
   while (!no_more_data_) {
     bool fin_read = false;
-
     // Read the message type.
     if (!message_type_.has_value()) {
       message_type_ = ReadVarInt62FromStream(stream_, fin_read);
@@ -195,15 +194,23 @@
 
     // Read the message length.
     if (!message_size_.has_value()) {
-      message_size_ = ReadVarInt62FromStream(stream_, fin_read);
-      if (fin_read) {
+      if (stream_.ReadableBytes() < 2) {
+        return;
+      }
+      std::array<char, 2> size_bytes;
+      quiche::ReadStream::ReadResult result =
+          stream_.Read(absl::MakeSpan(size_bytes));
+      if (result.bytes_read != 2) {
+        ParseError(MoqtError::kInternalError,
+                   "Stream returned incorrect ReadableBytes");
+        return;
+      }
+      if (result.fin) {
         ParseError("FIN on control stream");
         return;
       }
-      if (!message_size_.has_value()) {
-        return;
-      }
-
+      message_size_ = static_cast<uint16_t>(size_bytes[0]) << 8 |
+                      static_cast<uint16_t>(size_bytes[1]);
       if (*message_size_ > kMaxMessageHeaderSize) {
         ParseError(MoqtError::kInternalError,
                    absl::StrCat("Cannot parse control messages more than ",
diff --git a/quiche/quic/moqt/moqt_parser.h b/quiche/quic/moqt/moqt_parser.h
index 2259f9d..1cb2fe3 100644
--- a/quiche/quic/moqt/moqt_parser.h
+++ b/quiche/quic/moqt/moqt_parser.h
@@ -159,7 +159,7 @@
   bool parsing_error_ = false;
 
   std::optional<uint64_t> message_type_;
-  std::optional<uint64_t> message_size_;
+  std::optional<uint16_t> message_size_;
 
   uint64_t max_auth_token_cache_size_ = 0;
   uint64_t auth_token_cache_size_ = 0;
diff --git a/quiche/quic/moqt/moqt_parser_test.cc b/quiche/quic/moqt/moqt_parser_test.cc
index eb54620..7e4ba28 100644
--- a/quiche/quic/moqt/moqt_parser_test.cc
+++ b/quiche/quic/moqt/moqt_parser_test.cc
@@ -562,11 +562,11 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char setup[] = {
-      0x20, 0x0d, 0x02, 0x01, 0x02,  // versions
-      0x03,                          // 3 params
-      0x01, 0x03, 0x66, 0x6f, 0x6f,  // path = "foo"
-      0x02, 0x32,                    // max_request_id = 50
-      0x02, 0x32,                    // max_request_id = 50
+      0x20, 0x00, 0x0d, 0x02, 0x01, 0x02,  // versions
+      0x03,                                // 3 params
+      0x01, 0x03, 0x66, 0x6f, 0x6f,        // path = "foo"
+      0x02, 0x32,                          // max_request_id = 50
+      0x02, 0x32,                          // max_request_id = 50
   };
   stream.Receive(absl::string_view(setup, sizeof(setup)), false);
   parser.ReadAndDispatchMessages();
@@ -580,7 +580,7 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char setup[] = {
-      0x21, 0x07,
+      0x21, 0x00, 0x07,
       0x01,                          // version = 1
       0x01,                          // 1 param
       0x01, 0x03, 0x66, 0x6f, 0x6f,  // path = "foo"
@@ -597,10 +597,10 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char setup[] = {
-      0x20, 0x0e, 0x02, 0x01, 0x02,  // versions = 1, 2
-      0x02,                          // 2 params
-      0x01, 0x03, 0x66, 0x6f, 0x6f,  // path = "foo"
-      0x01, 0x03, 0x66, 0x6f, 0x6f,  // path = "foo"
+      0x20, 0x00, 0x0e, 0x02, 0x01, 0x02,  // versions = 1, 2
+      0x02,                                // 2 params
+      0x01, 0x03, 0x66, 0x6f, 0x6f,        // path = "foo"
+      0x01, 0x03, 0x66, 0x6f, 0x6f,        // path = "foo"
   };
   stream.Receive(absl::string_view(setup, sizeof(setup)), false);
   parser.ReadAndDispatchMessages();
@@ -614,9 +614,9 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kWebTrans, &stream, visitor_);
   char setup[] = {
-      0x20, 0x09, 0x02, 0x01, 0x02,  // versions = 1, 2
-      0x01,                          // 1 param
-      0x01, 0x03, 0x66, 0x6f, 0x6f,  // path = "foo"
+      0x20, 0x00, 0x09, 0x02, 0x01, 0x02,  // versions = 1, 2
+      0x01,                                // 1 param
+      0x01, 0x03, 0x66, 0x6f, 0x6f,        // path = "foo"
   };
   stream.Receive(absl::string_view(setup, sizeof(setup)), false);
   parser.ReadAndDispatchMessages();
@@ -630,8 +630,8 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char setup[] = {
-      0x20, 0x04, 0x02, 0x01, 0x02,  // versions = 1, 2
-      0x00,                          // no param
+      0x20, 0x00, 0x04, 0x02, 0x01, 0x02,  // versions = 1, 2
+      0x00,                                // no param
   };
   stream.Receive(absl::string_view(setup, sizeof(setup)), false);
   parser.ReadAndDispatchMessages();
@@ -645,11 +645,11 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char setup[] = {
-      0x20, 0x0d, 0x02, 0x01, 0x02,  // versions = 1, 2
-      0x03,                          // 4 params
-      0x01, 0x03, 0x66, 0x6f, 0x6f,  // path = "foo"
-      0x02, 0x32,                    // max_subscribe_id = 50
-      0x02, 0x32,                    // max_subscribe_id = 50
+      0x20, 0x00, 0x0d, 0x02, 0x01, 0x02,  // versions = 1, 2
+      0x03,                                // 4 params
+      0x01, 0x03, 0x66, 0x6f, 0x6f,        // path = "foo"
+      0x02, 0x32,                          // max_subscribe_id = 50
+      0x02, 0x32,                          // max_subscribe_id = 50
   };
   stream.Receive(absl::string_view(setup, sizeof(setup)), false);
   parser.ReadAndDispatchMessages();
@@ -663,8 +663,8 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kWebTrans, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x1a, 0x01, 0x02, 0x01,
-      0x03, 0x66, 0x6f, 0x6f,        // track_namespace = "foo"
+      0x03, 0x00, 0x1a, 0x01, 0x02,
+      0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
       0x02,                          // filter_type = kLatestObject
@@ -681,8 +681,8 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x16, 0x01, 0x02, 0x01,
-      0x03, 0x66, 0x6f, 0x6f,        // track_namespace = "foo"
+      0x03, 0x00, 0x16, 0x01, 0x02,
+      0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
       0x02,                          // filter_type = kLatestObject
@@ -701,8 +701,8 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x16, 0x01, 0x02, 0x01,
-      0x03, 0x66, 0x6f, 0x6f,        // track_namespace = "foo"
+      0x03, 0x00, 0x16, 0x01, 0x02,
+      0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
       0x02,                          // filter_type = kLatestObject
@@ -721,8 +721,8 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x14, 0x01, 0x02, 0x01,
-      0x03, 0x66, 0x6f, 0x6f,        // track_namespace = "foo"
+      0x03, 0x00, 0x14, 0x01, 0x02,
+      0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
       0x02,                          // filter_type = kLatestObject
@@ -740,7 +740,7 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x18, 0x01, 0x02, 0x01, 0x03, 0x66, 0x6f,
+      0x03, 0x00, 0x18, 0x01, 0x02, 0x01, 0x03, 0x66, 0x6f,
       0x6f,                          // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
@@ -759,8 +759,8 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x14, 0x01, 0x02, 0x01,
-      0x03, 0x66, 0x6f, 0x6f,        // track_namespace = "foo"
+      0x03, 0x00, 0x14, 0x01, 0x02,
+      0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
       0x02,                          // filter_type = kLatestObject
@@ -779,8 +779,8 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x14, 0x01, 0x02, 0x01,
-      0x03, 0x66, 0x6f, 0x6f,        // track_namespace = "foo"
+      0x03, 0x00, 0x14, 0x01, 0x02,
+      0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
       0x02,                          // filter_type = kLatestObject
@@ -799,8 +799,8 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x16, 0x01, 0x02, 0x01, 0x03,
-      0x66, 0x6f, 0x6f,                   // track_namespace = "foo"
+      0x03, 0x00, 0x16, 0x01, 0x02, 0x01,
+      0x03, 0x66, 0x6f, 0x6f,             // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,       // track_name = "abcd"
       0x20, 0x02,                         // priority = 0x20 descending
       0x02,                               // filter_type = kLatestObject
@@ -818,11 +818,11 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kWebTrans, &stream, visitor_);
   char subscribe_ok[] = {
-      0x04, 0x11, 0x01, 0x03,  // subscribe_id = 1, expires = 3
-      0x02, 0x01,              // group_order = 2, content exists
-      0x0c, 0x14,              // largest_group_id = 12, largest_object_id = 20,
-      0x02,                    // 2 parameters
-      0x02, 0x67, 0x10,        // delivery_timeout = 10000
+      0x04, 0x00, 0x11, 0x01, 0x03,  // subscribe_id = 1, expires = 3
+      0x02, 0x01,                    // group_order = 2, content exists
+      0x0c, 0x14,        // largest_group_id = 12, largest_object_id = 20,
+      0x02,              // 2 parameters
+      0x02, 0x67, 0x10,  // delivery_timeout = 10000
       0x01, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72,  // authorization_token = "bar"
   };
   stream.Receive(absl::string_view(subscribe_ok, sizeof(subscribe_ok)), false);
@@ -837,7 +837,7 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kWebTrans, &stream, visitor_);
   char subscribe_update[] = {
-      0x02, 0x0d, 0x02, 0x03, 0x01, 0x05,        // start and end sequences
+      0x02, 0x00, 0x0d, 0x02, 0x03, 0x01, 0x05,  // start and end sequences
       0xaa,                                      // priority = 0xaa
       0x01,                                      // 1 parameter
       0x01, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72,  // authorization_token = "bar"
@@ -855,7 +855,8 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kWebTrans, &stream, visitor_);
   char announce[] = {
-      0x06, 0x14, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
+      0x06, 0x00, 0x14, 0x01, 0x03, 0x66, 0x6f,
+      0x6f,                                      // track_namespace = "foo"
       0x02,                                      // 2 params
       0x01, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72,  // authorization = "bar"
       0x01, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72,  // authorization = "bar"
@@ -869,7 +870,8 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kWebTrans, &stream, visitor_);
   char announce[] = {
-      0x06, 0x10, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
+      0x06, 0x00, 0x10, 0x01, 0x03, 0x66, 0x6f,
+      0x6f,                                      // track_namespace = "foo"
       0x02,                                      // 2 params
       0x01, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72,  // authorization_info = "bar"
       0x02, 0x67, 0x10,                          // delivery_timeout = 10000
@@ -943,7 +945,7 @@
   char big_message[2 * kMaxMessageHeaderSize];
   quic::QuicDataWriter writer(sizeof(big_message), big_message);
   writer.WriteVarInt62(static_cast<uint64_t>(MoqtMessageType::kServerSetup));
-  writer.WriteVarInt62(8 + kMaxMessageHeaderSize);
+  writer.WriteUInt16(8 + kMaxMessageHeaderSize);
   writer.WriteVarInt62(0x1);                    // version
   writer.WriteVarInt62(0x1);                    // num_params
   writer.WriteVarInt62(0xbeef);                 // unknown param
@@ -961,10 +963,10 @@
 TEST_F(MoqtMessageSpecificTest, UnknownMessageType) {
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
-  char message[6];
+  char message[7];
   quic::QuicDataWriter writer(sizeof(message), message);
   writer.WriteVarInt62(0xbeef);  // unknown message type
-  writer.WriteVarInt62(0x1);     // length
+  writer.WriteUInt16(0x1);       // length
   writer.WriteVarInt62(0x1);     // payload
   stream.Receive(absl::string_view(message, writer.length()), false);
   parser.ReadAndDispatchMessages();
@@ -976,7 +978,7 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x15, 0x01, 0x02,        // id and alias
+      0x03, 0x00, 0x15, 0x01, 0x02,  // id and alias
       0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20, group order descending
@@ -998,7 +1000,7 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x15, 0x01, 0x02,        // id and alias
+      0x03, 0x00, 0x15, 0x01, 0x02,  // id and alias
       0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x08,                    // priority = 0x20 ???
@@ -1016,7 +1018,7 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x17, 0x01, 0x02,        // id and alias
+      0x03, 0x00, 0x17, 0x01, 0x02,  // id and alias
       0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
@@ -1041,7 +1043,7 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x18, 0x01, 0x02,        // id and alias
+      0x03, 0x00, 0x18, 0x01, 0x02,  // id and alias
       0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
@@ -1067,7 +1069,7 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x18, 0x01, 0x02,        // id and alias
+      0x03, 0x00, 0x18, 0x01, 0x02,  // id and alias
       0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
@@ -1088,7 +1090,7 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x13, 0x01, 0x02,        // id and alias
+      0x03, 0x00, 0x13, 0x01, 0x02,  // id and alias
       0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
@@ -1107,9 +1109,9 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe_update[] = {
-      0x02, 0x06, 0x02, 0x03, 0x01, 0x04,  // start and end sequences
-      0x20,                                // priority
-      0x00,                                // No parameters
+      0x02, 0x00, 0x06, 0x02, 0x03, 0x01, 0x04,  // start and end sequences
+      0x20,                                      // priority
+      0x00,                                      // No parameters
   };
   stream.Receive(absl::string_view(subscribe_update, sizeof(subscribe_update)),
                  false);
@@ -1121,10 +1123,10 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe_update[] = {
-      0x02, 0x08, 0x02, 0x03, 0x01, 0x03,  // start and end sequences
-      0x20,                                // priority
-      0x01,                                // 1 parameter
-      0x02, 0x20,                          // delivery_timeout = 32 ms
+      0x02, 0x00, 0x08, 0x02, 0x03, 0x01, 0x03,  // start and end sequences
+      0x20,                                      // priority
+      0x01,                                      // 1 parameter
+      0x02, 0x20,                                // delivery_timeout = 32 ms
   };
   stream.Receive(absl::string_view(subscribe_update, sizeof(subscribe_update)),
                  false);
@@ -1137,9 +1139,9 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char object_ack[] = {
-      0x71, 0x84, 0x05,  // type
-      0x01, 0x10, 0x20,  // subscribe ID, group, object
-      0x40, 0x81,        // -0x40 time delta
+      0x71, 0x84, 0x00, 0x05,  // type
+      0x01, 0x10, 0x20,        // subscribe ID, group, object
+      0x40, 0x81,              // -0x40 time delta
   };
   stream.Receive(absl::string_view(object_ack, sizeof(object_ack)), false);
   parser.ReadAndDispatchMessages();
@@ -1319,15 +1321,15 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char announce_ok[] = {
-      0x07, 0x03,       // type, length
-      0x01, 0x01, 'a',  // 1 namespace element
+      0x07, 0x00, 0x03,  // type, length
+      0x01, 0x01, 'a',   // 1 namespace element
   };
   stream.Receive(absl::string_view(announce_ok, sizeof(announce_ok)), false);
   parser.ReadAndDispatchMessages();
   EXPECT_EQ(visitor_.messages_received_, 1);
   EXPECT_EQ(visitor_.parsing_error_, std::nullopt);
-  announce_ok[1] -= 2;  // Remove one element.
-  announce_ok[2] = 0x00;
+  announce_ok[2] -= 2;  // Remove one element.
+  announce_ok[3] = 0x00;
   stream.Receive(absl::string_view(announce_ok, sizeof(announce_ok) - 2),
                  false);
   parser.ReadAndDispatchMessages();
@@ -1339,7 +1341,7 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char announce_ok[70] = {
-      0x07, 0x40, 0x41,  // type, length = 65
+      0x07, 0x00, 0x41,  // type, length = 65
       0x20,              // 32 namespace elements. This is the maximum.
   };
   for (size_t i = 4; i < sizeof(announce_ok); i = i + 2) {
diff --git a/quiche/quic/moqt/test_tools/moqt_test_message.h b/quiche/quic/moqt/test_tools/moqt_test_message.h
index 898bfd1..b0709ef 100644
--- a/quiche/quic/moqt/test_tools/moqt_test_message.h
+++ b/quiche/quic/moqt/test_tools/moqt_test_message.h
@@ -75,12 +75,12 @@
   void DecreasePayloadLengthByOne() {
     size_t length_offset =
         0x1 << ((static_cast<uint8_t>(wire_image_[0]) & 0xc0) >> 6);
-    wire_image_[length_offset]--;
+    wire_image_[length_offset + 1]--;
   }
   void IncreasePayloadLengthByOne() {
     size_t length_offset =
         0x1 << ((static_cast<uint8_t>(wire_image_[0]) & 0xc0) >> 6);
-    wire_image_[length_offset]++;
+    wire_image_[length_offset + 1]++;
     set_wire_image_size(wire_image_size_ + 1);
   }
 
@@ -92,12 +92,10 @@
 
   // Expands all the varints in the message, alternating between making them 2,
   // 4, and 8 bytes long. Updates length fields accordingly.
-  // Each character in |varints| corresponds to a byte in the original message.
+  // Each character in |varints| corresponds to a byte in the original message
+  // payload.
   // If there is a 'v', it is a varint that should be expanded. If '-', skip
   // to the next byte.
-  // Always expand the message length field (if a control message) to 2 bytes,
-  // so it's a known length that is large enough to be safe. The second byte
-  // of |varints| does not matter.
   void ExpandVarintsImpl(absl::string_view varints,
                          bool is_control_message = true) {
     int next_varint_len = 2;
@@ -105,39 +103,29 @@
     quic::QuicDataReader reader(
         absl::string_view(wire_image_, wire_image_size_));
     quic::QuicDataWriter writer(sizeof(new_wire_image), new_wire_image);
-    size_t i = 0;
     size_t length_field = 0;
     if (is_control_message) {
-      // the length will be a 16-bit varint.
-      bool nonvarint_type = false;
-      while (varints[i] == '-') {
-        ++i;
-        nonvarint_type = true;
-        uint8_t byte;
-        reader.ReadUInt8(&byte);
-        writer.WriteUInt8(byte);
-      }
-      uint64_t value;
-      if (!nonvarint_type) {
-        ++i;
-        reader.ReadVarInt62(&value);
+      uint8_t type_length = static_cast<uint8_t>(reader.PeekVarInt62Length());
+      uint64_t type;
+      reader.ReadVarInt62(&type);
+      if (type_length == 1) {
+        // Expand the message type.
+        type_length = next_varint_len;
         writer.WriteVarInt62WithForcedLength(
-            value, static_cast<quiche::QuicheVariableLengthIntegerLength>(
-                       next_varint_len));
-        next_varint_len *= 2;
-        if (next_varint_len == 16) {
-          next_varint_len = 2;
-        }
+            type, static_cast<quiche::QuicheVariableLengthIntegerLength>(
+                      type_length));
+        next_varint_len = 4;
+      } else {
+        writer.WriteVarInt62(type);
       }
-      reader.ReadVarInt62(&value);
-      ++i;
       length_field = writer.length();
-      // Write in current length as a 2B placeholder.
-      writer.WriteVarInt62WithForcedLength(
-          value, static_cast<quiche::QuicheVariableLengthIntegerLength>(2));
+      uint16_t size;
+      reader.ReadUInt16(&size);
+      writer.WriteUInt16(size);
     }
+    size_t i = 0;
     while (!reader.IsDoneReading()) {
-      if (i >= varints.length() || varints[i++] == '-') {
+      if (i >= (varints.length()) || varints[i++] == '-') {
         uint8_t byte;
         reader.ReadUInt8(&byte);
         writer.WriteUInt8(byte);
@@ -155,9 +143,10 @@
     }
     memcpy(wire_image_, new_wire_image, writer.length());
     wire_image_size_ = writer.length();
-    if (is_control_message) {
-      wire_image_[length_field + 1] =
-          static_cast<uint8_t>(writer.length() - length_field - 2);
+    if (is_control_message) {  // First byte will be empty.
+      quic::QuicDataWriter length_writer(writer.length(),
+                                         &wire_image_[length_field]);
+      length_writer.WriteUInt16(writer.length() - length_field - 2);
     }
   }
 
@@ -378,8 +367,8 @@
     if (webtrans) {
       // Should not send PATH.
       client_setup_.parameters.path = "";
-      raw_packet_[1] = 0x06;  // adjust payload length (-5)
-      raw_packet_[5] = 0x01;  // only one parameter
+      raw_packet_[2] = 0x06;  // adjust payload length (-5)
+      raw_packet_[6] = 0x01;  // only one parameter
       SetWireImage(raw_packet_, sizeof(raw_packet_) - 5);
     } else {
       SetWireImage(raw_packet_, sizeof(raw_packet_));
@@ -409,9 +398,9 @@
 
   void ExpandVarints() override {
     if (!client_setup_.parameters.path.empty()) {
-      ExpandVarintsImpl("vvvvvvvvvv---");
+      ExpandVarintsImpl("vvvvvvvv---");
     } else {
-      ExpandVarintsImpl("vvvvvvvv");
+      ExpandVarintsImpl("vvvvvv");
     }
   }
 
@@ -420,8 +409,8 @@
   }
 
  private:
-  uint8_t raw_packet_[13] = {
-      0x20, 0x0b,                    // type
+  uint8_t raw_packet_[14] = {
+      0x20, 0x00, 0x0b,              // type
       0x02, 0x01, 0x02,              // versions
       0x02,                          // 2 parameters
       0x02, 0x32,                    // max_request_id = 50
@@ -450,17 +439,17 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvvvv"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vvvv"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(server_setup_);
   }
 
  private:
-  uint8_t raw_packet_[6] = {
-      0x21, 0x04,  // type
-      0x01, 0x01,  // version, one parameter
-      0x02, 0x32,  // max_request_id = 50
+  uint8_t raw_packet_[7] = {
+      0x21, 0x00, 0x04,  // type
+      0x01, 0x01,        // version, one parameter
+      0x02, 0x32,        // max_subscribe_id = 50
   };
   MoqtServerSetup server_setup_ = {
       /*selected_version=*/static_cast<MoqtVersion>(1),
@@ -512,7 +501,7 @@
   }
 
   void ExpandVarints() override {
-    ExpandVarintsImpl("vvvvvv---v------vvvvv--vv-----");
+    ExpandVarintsImpl("vvvv---v------vvvvv--vv-----");
   }
 
   MessageStructuredData structured_data() const override {
@@ -520,8 +509,8 @@
   }
 
  private:
-  uint8_t raw_packet_[30] = {
-      0x03, 0x1c, 0x01, 0x02,        // id and alias
+  uint8_t raw_packet_[31] = {
+      0x03, 0x00, 0x1c, 0x01, 0x02,  // id and alias
       0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20,                          // subscriber priority = 0x20
@@ -579,30 +568,30 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv--vvvv--v--"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv--vvvv--v--"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(subscribe_ok_);
   }
 
   void SetInvalidContentExists() {
-    raw_packet_[5] = 0x02;
+    raw_packet_[6] = 0x02;
     SetWireImage(raw_packet_, sizeof(raw_packet_));
   }
 
   void SetInvalidDeliveryOrder() {
-    raw_packet_[4] = 0x10;
+    raw_packet_[5] = 0x10;
     SetWireImage(raw_packet_, sizeof(raw_packet_));
   }
 
  private:
-  uint8_t raw_packet_[15] = {
-      0x04, 0x0d, 0x01, 0x03,  // subscribe_id = 1, expires = 3
-      0x02, 0x01,              // group_order = 2, content exists
-      0x0c, 0x14,              // largest_group_id = 12, largest_object_id = 20,
-      0x02,                    // 2 parameters
-      0x02, 0x67, 0x10,        // delivery_timeout = 10000
-      0x04, 0x67, 0x10,        // max_cache_duration = 10000
+  uint8_t raw_packet_[16] = {
+      0x04, 0x00, 0x0d, 0x01, 0x03,  // subscribe_id = 1, expires = 3
+      0x02, 0x01,                    // group_order = 2, content exists
+      0x0c, 0x14,        // largest_group_id = 12, largest_object_id = 20,
+      0x02,              // 2 parameters
+      0x02, 0x67, 0x10,  // delivery_timeout = 10000
+      0x04, 0x67, 0x10,  // max_cache_duration = 10000
   };
 
   MoqtSubscribeOk subscribe_ok_ = {
@@ -642,15 +631,15 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvvv---v"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vvv---v"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(subscribe_error_);
   }
 
  private:
-  uint8_t raw_packet_[9] = {
-      0x05, 0x07,
+  uint8_t raw_packet_[10] = {
+      0x05, 0x00, 0x07,
       0x02,                    // subscribe_id = 2
       0x05,                    // error_code = 5
       0x03, 0x62, 0x61, 0x72,  // reason_phrase = "bar"
@@ -680,15 +669,15 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvv"); }
+  void ExpandVarints() override { ExpandVarintsImpl("v"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(unsubscribe_);
   }
 
  private:
-  uint8_t raw_packet_[3] = {
-      0x0a, 0x01, 0x03,  // subscribe_id = 3
+  uint8_t raw_packet_[4] = {
+      0x0a, 0x00, 0x01, 0x03,  // subscribe_id = 3
   };
 
   MoqtUnsubscribe unsubscribe_ = {
@@ -724,17 +713,17 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvvvv--"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vvvv--"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(subscribe_done_);
   }
 
  private:
-  uint8_t raw_packet_[8] = {
-      0x0b, 0x06, 0x02, 0x02,  // subscribe_id = 2, error_code = 2,
-      0x05,                    // stream_count = 5
-      0x02, 0x68, 0x69,        // reason_phrase = "hi"
+  uint8_t raw_packet_[9] = {
+      0x0b, 0x00, 0x06, 0x02, 0x02,  // subscribe_id = 2, error_code = 2,
+      0x05,                          // stream_count = 5
+      0x02, 0x68, 0x69,              // reason_phrase = "hi"
   };
 
   MoqtSubscribeDone subscribe_done_ = {
@@ -776,18 +765,18 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvvvv-vv--"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vvvv-vv--"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(subscribe_update_);
   }
 
  private:
-  uint8_t raw_packet_[11] = {
-      0x02, 0x09, 0x02, 0x03, 0x01, 0x05,  // start and end sequences
-      0xaa,                                // subscriber_priority
-      0x01,                                // 1 parameter
-      0x02, 0x67, 0x10,                    // delivery_timeout = 10000
+  uint8_t raw_packet_[12] = {
+      0x02, 0x00, 0x09, 0x02, 0x03, 0x01, 0x05,  // start and end sequences
+      0xaa,                                      // subscriber_priority
+      0x01,                                      // 1 parameter
+      0x02, 0x67, 0x10,                          // delivery_timeout = 10000
   };
 
   MoqtSubscribeUpdate subscribe_update_ = {
@@ -819,15 +808,16 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---vvv-----"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---vvv-----"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(announce_);
   }
 
  private:
-  uint8_t raw_packet_[15] = {
-      0x06, 0x0d, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
+  uint8_t raw_packet_[16] = {
+      0x06, 0x00, 0x0d, 0x01, 0x03, 0x66, 0x6f,
+      0x6f,                                      // track_namespace = "foo"
       0x01,                                      // 1 parameter
       0x01, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72,  // authorization_tag = "bar"
   };
@@ -853,15 +843,16 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(announce_ok_);
   }
 
  private:
-  uint8_t raw_packet_[7] = {
-      0x07, 0x05, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
+  uint8_t raw_packet_[8] = {
+      0x07, 0x00, 0x05, 0x01,
+      0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
   };
 
   MoqtAnnounceOk announce_ok_ = {
@@ -892,17 +883,18 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---vv---"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---vv---"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(announce_error_);
   }
 
  private:
-  uint8_t raw_packet_[12] = {
-      0x08, 0x0a, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
-      0x03,                                      // error_code = 3
-      0x03, 0x62, 0x61, 0x72,                    // reason_phrase = "bar"
+  uint8_t raw_packet_[13] = {
+      0x08, 0x00, 0x0a, 0x01,
+      0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
+      0x03,                    // error_code = 3
+      0x03, 0x62, 0x61, 0x72,  // reason_phrase = "bar"
   };
 
   MoqtAnnounceError announce_error_ = {
@@ -935,17 +927,18 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---vv---"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---vv---"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(announce_cancel_);
   }
 
  private:
-  uint8_t raw_packet_[12] = {
-      0x0c, 0x0a, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
-      0x03,                                      // error_code = 3
-      0x03, 0x62, 0x61, 0x72,                    // reason_phrase = "bar"
+  uint8_t raw_packet_[13] = {
+      0x0c, 0x00, 0x0a, 0x01,
+      0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
+      0x03,                    // error_code = 3
+      0x03, 0x62, 0x61, 0x72,  // reason_phrase = "bar"
   };
 
   MoqtAnnounceCancel announce_cancel_ = {
@@ -974,15 +967,16 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---v----vvv-----"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---v----vvv-----"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(track_status_request_);
   }
 
  private:
-  uint8_t raw_packet_[20] = {
-      0x0d, 0x12, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
+  uint8_t raw_packet_[21] = {
+      0x0d, 0x00, 0x12, 0x01, 0x03, 0x66, 0x6f,
+      0x6f,                                      // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,              // track_name = "abcd"
       0x01,                                      // 1 parameter
       0x01, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72,  // authorization_tag = "bar"
@@ -1009,15 +1003,15 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(unannounce_);
   }
 
  private:
-  uint8_t raw_packet_[7] = {
-      0x09, 0x05, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace
+  uint8_t raw_packet_[8] = {
+      0x09, 0x00, 0x05, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace
   };
 
   MoqtUnannounce unannounce_ = {
@@ -1056,20 +1050,21 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---v----vvvvv--v--"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---v----vvvvv--v--"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(track_status_);
   }
 
  private:
-  uint8_t raw_packet_[22] = {
-      0x0e, 0x14, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
-      0x04, 0x61, 0x62, 0x63, 0x64,              // track_name = "abcd"
-      0x00, 0x0c, 0x14,  // status, last_group, last_object
-      0x02,              // 2 parameters
-      0x02, 0x67, 0x10,  // Delivery Timeout = 10000
-      0x04, 0x67, 0x10,  // Max Cache Duration = 10000
+  uint8_t raw_packet_[23] = {
+      0x0e, 0x00, 0x14, 0x01, 0x03,
+      0x66, 0x6f, 0x6f,              // track_namespace = "foo"
+      0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
+      0x00, 0x0c, 0x14,              // status, last_group, last_object
+      0x02,                          // 2 parameters
+      0x02, 0x67, 0x10,              // Delivery Timeout = 10000
+      0x04, 0x67, 0x10,              // Max Cache Duration = 10000
   };
 
   MoqtTrackStatus track_status_ = {
@@ -1097,15 +1092,15 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvv---"); }
+  void ExpandVarints() override { ExpandVarintsImpl("v---"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(goaway_);
   }
 
  private:
-  uint8_t raw_packet_[6] = {
-      0x10, 0x04, 0x03, 0x66, 0x6f, 0x6f,
+  uint8_t raw_packet_[7] = {
+      0x10, 0x00, 0x04, 0x03, 0x66, 0x6f, 0x6f,
   };
 
   MoqtGoAway goaway_ = {
@@ -1132,16 +1127,16 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---vvv-----"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---vvv-----"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(subscribe_namespace_);
   }
 
  private:
-  uint8_t raw_packet_[15] = {
-      0x11, 0x0d, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // namespace = "foo"
-      0x01,                                      // 1 parameter
+  uint8_t raw_packet_[16] = {
+      0x11, 0x00, 0x0d, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // namespace = "foo"
+      0x01,                                            // 1 parameter
       0x01, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72,  // authorization_tag = "bar"
   };
 
@@ -1166,15 +1161,15 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(subscribe_namespace_ok_);
   }
 
  private:
-  uint8_t raw_packet_[7] = {
-      0x12, 0x05, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // namespace = "foo"
+  uint8_t raw_packet_[8] = {
+      0x12, 0x00, 0x05, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // namespace = "foo"
   };
 
   MoqtSubscribeAnnouncesOk subscribe_namespace_ok_ = {
@@ -1205,17 +1200,18 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---vv---"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---vv---"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(subscribe_namespace_error_);
   }
 
  private:
-  uint8_t raw_packet_[12] = {
-      0x13, 0x0a, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
-      0x01,                                      // error_code = 1
-      0x03, 0x62, 0x61, 0x72,                    // reason_phrase = "bar"
+  uint8_t raw_packet_[13] = {
+      0x13, 0x00, 0x0a, 0x01,
+      0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
+      0x01,                    // error_code = 1
+      0x03, 0x62, 0x61, 0x72,  // reason_phrase = "bar"
   };
 
   MoqtSubscribeAnnouncesError subscribe_namespace_error_ = {
@@ -1240,15 +1236,15 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(unsubscribe_namespace_);
   }
 
  private:
-  uint8_t raw_packet_[7] = {
-      0x14, 0x05, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace
+  uint8_t raw_packet_[8] = {
+      0x14, 0x00, 0x05, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace
   };
 
   MoqtUnsubscribeAnnounces unsubscribe_namespace_ = {
@@ -1271,15 +1267,16 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvv"); }
+  void ExpandVarints() override { ExpandVarintsImpl("v"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(max_request_id_);
   }
 
  private:
-  uint8_t raw_packet_[3] = {
+  uint8_t raw_packet_[4] = {
       0x15,
+      0x00,
       0x01,
       0x0b,
   };
@@ -1349,7 +1346,7 @@
   }
 
   void ExpandVarints() override {
-    ExpandVarintsImpl("vvv--vvv---v---vvvvvv-----");
+    ExpandVarintsImpl("v--vvv---v---vvvvvv-----");
   }
 
   MessageStructuredData structured_data() const override {
@@ -1362,19 +1359,19 @@
     QUICHE_CHECK(!object.has_value() || *object < 64);
     fetch_.end_group = group;
     fetch_.end_object = object;
-    raw_packet_[17] = group;
-    raw_packet_[18] = object.has_value() ? (*object + 1) : 0;
+    raw_packet_[18] = group;
+    raw_packet_[19] = object.has_value() ? (*object + 1) : 0;
     SetWireImage(raw_packet_, sizeof(raw_packet_));
   }
 
   void SetGroupOrder(uint8_t group_order) {
-    raw_packet_[4] = static_cast<uint8_t>(group_order);
+    raw_packet_[5] = static_cast<uint8_t>(group_order);
     SetWireImage(raw_packet_, sizeof(raw_packet_));
   }
 
  private:
-  uint8_t raw_packet_[27] = {
-      0x16, 0x19,
+  uint8_t raw_packet_[28] = {
+      0x16, 0x00, 0x19,
       0x01,                          // fetch_id = 1
       0x02,                          // priority = kHigh
       0x01,                          // group_order = kAscending
@@ -1461,7 +1458,7 @@
   }
 
   void ExpandVarints() override {
-    ExpandVarintsImpl("vvv--vvv---v---vvvvvv-----");
+    ExpandVarintsImpl("v--vvv---v---vvvvvv-----");
   }
 
   MessageStructuredData structured_data() const override {
@@ -1469,13 +1466,13 @@
   }
 
   void SetGroupOrder(uint8_t group_order) {
-    raw_packet_[4] = static_cast<uint8_t>(group_order);
+    raw_packet_[5] = static_cast<uint8_t>(group_order);
     SetWireImage(raw_packet_, sizeof(raw_packet_));
   }
 
  private:
-  uint8_t raw_packet_[16] = {
-      0x16, 0x0e,
+  uint8_t raw_packet_[17] = {
+      0x16, 0x00, 0x0e,
       0x01,        // fetch_id = 1
       0x02,        // priority = kHigh
       0x01,        // group_order = kAscending
@@ -1512,15 +1509,15 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvv"); }
+  void ExpandVarints() override { ExpandVarintsImpl("v"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(fetch_cancel_);
   }
 
  private:
-  uint8_t raw_packet_[3] = {
-      0x17, 0x01,
+  uint8_t raw_packet_[4] = {
+      0x17, 0x00, 0x01,
       0x01,  // subscribe_id = 1
   };
 
@@ -1555,15 +1552,15 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvv-vvvvv---"); }
+  void ExpandVarints() override { ExpandVarintsImpl("v-vvvvv---"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(fetch_ok_);
   }
 
  private:
-  uint8_t raw_packet_[10] = {
-      0x18, 0x08,
+  uint8_t raw_packet_[11] = {
+      0x18, 0x00, 0x08,
       0x01,                    // subscribe_id = 1
       0x01,                    // group_order = kAscending
       0x05, 0x04,              // largest_object = 5, 4
@@ -1601,15 +1598,15 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvvv---"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vvv---"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(fetch_error_);
   }
 
  private:
-  uint8_t raw_packet_[8] = {
-      0x19, 0x06,
+  uint8_t raw_packet_[9] = {
+      0x19, 0x00, 0x06,
       0x01,                    // subscribe_id = 1
       0x01,                    // error_code = kUnauthorized
       0x03, 0x62, 0x61, 0x72,  // reason_phrase = "bar"
@@ -1636,15 +1633,15 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvv"); }
+  void ExpandVarints() override { ExpandVarintsImpl("v"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(requests_blocked_);
   }
 
  private:
-  uint8_t raw_packet_[3] = {
-      0x1a, 0x01,
+  uint8_t raw_packet_[4] = {
+      0x1a, 0x00, 0x01,
       0x0b,  // max_request_id = 11
   };
 
@@ -1680,17 +1677,17 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvvvv"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vvvv"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(object_ack_);
   }
 
  private:
-  uint8_t raw_packet_[7] = {
-      0x71, 0x84, 0x04,  // type
-      0x01, 0x10, 0x20,  // subscribe ID, group, object
-      0x20,              // 0x10 time delta
+  uint8_t raw_packet_[8] = {
+      0x71, 0x84, 0x00, 0x04,  // type
+      0x01, 0x10, 0x20,        // subscribe ID, group, object
+      0x20,                    // 0x10 time delta
   };
 
   MoqtObjectAck object_ack_ = {