Move MoqtTrack code into a .cc file.

PiperOrigin-RevId: 647676691
diff --git a/build/source_list.bzl b/build/source_list.bzl
index bbe3b4c..d204605 100644
--- a/build/source_list.bzl
+++ b/build/source_list.bzl
@@ -1527,6 +1527,7 @@
     "quic/moqt/moqt_session_test.cc",
     "quic/moqt/moqt_subscribe_windows.cc",
     "quic/moqt/moqt_subscribe_windows_test.cc",
+    "quic/moqt/moqt_track.cc",
     "quic/moqt/moqt_track_test.cc",
     "quic/moqt/test_tools/moqt_simulator_harness.cc",
     "quic/moqt/tools/chat_client_bin.cc",
diff --git a/build/source_list.gni b/build/source_list.gni
index 3429497..3556e72 100644
--- a/build/source_list.gni
+++ b/build/source_list.gni
@@ -1531,6 +1531,7 @@
     "src/quiche/quic/moqt/moqt_session_test.cc",
     "src/quiche/quic/moqt/moqt_subscribe_windows.cc",
     "src/quiche/quic/moqt/moqt_subscribe_windows_test.cc",
+    "src/quiche/quic/moqt/moqt_track.cc",
     "src/quiche/quic/moqt/moqt_track_test.cc",
     "src/quiche/quic/moqt/test_tools/moqt_simulator_harness.cc",
     "src/quiche/quic/moqt/tools/chat_client_bin.cc",
diff --git a/build/source_list.json b/build/source_list.json
index 12fec03..2c75654 100644
--- a/build/source_list.json
+++ b/build/source_list.json
@@ -1530,6 +1530,7 @@
     "quiche/quic/moqt/moqt_session_test.cc",
     "quiche/quic/moqt/moqt_subscribe_windows.cc",
     "quiche/quic/moqt/moqt_subscribe_windows_test.cc",
+    "quiche/quic/moqt/moqt_track.cc",
     "quiche/quic/moqt/moqt_track_test.cc",
     "quiche/quic/moqt/test_tools/moqt_simulator_harness.cc",
     "quiche/quic/moqt/tools/chat_client_bin.cc",
diff --git a/quiche/quic/moqt/moqt_track.cc b/quiche/quic/moqt/moqt_track.cc
new file mode 100644
index 0000000..d2644c8
--- /dev/null
+++ b/quiche/quic/moqt/moqt_track.cc
@@ -0,0 +1,82 @@
+// Copyright 2024 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file
+
+#include "quiche/quic/moqt/moqt_track.h"
+
+#include <cstdint>
+
+#include "quiche/quic/moqt/moqt_messages.h"
+
+namespace moqt {
+
+void LocalTrack::AddWindow(uint64_t subscribe_id, uint64_t start_group,
+                           uint64_t start_object) {
+  QUIC_BUG_IF(quic_bug_subscribe_to_canceled_track, announce_canceled_)
+      << "Canceled track got subscription";
+  windows_.AddWindow(subscribe_id, next_sequence_, start_group, start_object);
+}
+
+void LocalTrack::AddWindow(uint64_t subscribe_id, uint64_t start_group,
+                           uint64_t start_object, uint64_t end_group) {
+  QUIC_BUG_IF(quic_bug_subscribe_to_canceled_track, announce_canceled_)
+      << "Canceled track got subscription";
+  // The end object might be unknown.
+  auto it = max_object_ids_.find(end_group);
+  if (end_group >= next_sequence_.group) {
+    // Group is not fully published yet, so end object is unknown.
+    windows_.AddWindow(subscribe_id, next_sequence_, start_group, start_object,
+                       end_group, UINT64_MAX);
+    return;
+  }
+  windows_.AddWindow(subscribe_id, next_sequence_, start_group, start_object,
+                     end_group, it->second);
+}
+
+void LocalTrack::AddWindow(uint64_t subscribe_id, uint64_t start_group,
+                           uint64_t start_object, uint64_t end_group,
+                           uint64_t end_object) {
+  QUIC_BUG_IF(quic_bug_subscribe_to_canceled_track, announce_canceled_)
+      << "Canceled track got subscription";
+  windows_.AddWindow(subscribe_id, next_sequence_, start_group, start_object,
+                     end_group, end_object);
+}
+
+void LocalTrack::SentSequence(FullSequence sequence, MoqtObjectStatus status) {
+  QUICHE_DCHECK(max_object_ids_.find(sequence.group) == max_object_ids_.end() ||
+                max_object_ids_[sequence.group] < sequence.object);
+  switch (status) {
+    case MoqtObjectStatus::kNormal:
+    case MoqtObjectStatus::kObjectDoesNotExist:
+      if (next_sequence_ <= sequence) {
+        next_sequence_ = sequence.next();
+      }
+      break;
+    case MoqtObjectStatus::kGroupDoesNotExist:
+      max_object_ids_[sequence.group] = 0;
+      break;
+    case MoqtObjectStatus::kEndOfGroup:
+      max_object_ids_[sequence.group] = sequence.object;
+      if (next_sequence_ <= sequence) {
+        next_sequence_ = FullSequence(sequence.group + 1, 0);
+      }
+      break;
+    case MoqtObjectStatus::kEndOfTrack:
+      max_object_ids_[sequence.group] = sequence.object;
+      break;
+    default:
+      QUICHE_DCHECK(false);
+      return;
+  }
+}
+
+bool RemoteTrack::CheckForwardingPreference(
+    MoqtForwardingPreference preference) {
+  if (forwarding_preference_.has_value()) {
+    return forwarding_preference_.value() == preference;
+  }
+  forwarding_preference_ = preference;
+  return true;
+}
+
+}  // namespace moqt
diff --git a/quiche/quic/moqt/moqt_track.h b/quiche/quic/moqt/moqt_track.h
index e61dc8b..c9ece3f 100644
--- a/quiche/quic/moqt/moqt_track.h
+++ b/quiche/quic/moqt/moqt_track.h
@@ -69,36 +69,14 @@
   }
 
   void AddWindow(uint64_t subscribe_id, uint64_t start_group,
-                 uint64_t start_object) {
-    QUIC_BUG_IF(quic_bug_subscribe_to_canceled_track, announce_canceled_)
-        << "Canceled track got subscription";
-    windows_.AddWindow(subscribe_id, next_sequence_, start_group, start_object);
-  }
+                 uint64_t start_object);
 
   void AddWindow(uint64_t subscribe_id, uint64_t start_group,
-                 uint64_t start_object, uint64_t end_group) {
-    QUIC_BUG_IF(quic_bug_subscribe_to_canceled_track, announce_canceled_)
-        << "Canceled track got subscription";
-    // The end object might be unknown.
-    auto it = max_object_ids_.find(end_group);
-    if (end_group >= next_sequence_.group) {
-      // Group is not fully published yet, so end object is unknown.
-      windows_.AddWindow(subscribe_id, next_sequence_, start_group,
-                         start_object, end_group, UINT64_MAX);
-      return;
-    }
-    windows_.AddWindow(subscribe_id, next_sequence_, start_group, start_object,
-                       end_group, it->second);
-  }
+                 uint64_t start_object, uint64_t end_group);
 
   void AddWindow(uint64_t subscribe_id, uint64_t start_group,
                  uint64_t start_object, uint64_t end_group,
-                 uint64_t end_object) {
-    QUIC_BUG_IF(quic_bug_subscribe_to_canceled_track, announce_canceled_)
-        << "Canceled track got subscription";
-    windows_.AddWindow(subscribe_id, next_sequence_, start_group, start_object,
-                       end_group, end_object);
-  }
+                 uint64_t end_object);
 
   void DeleteWindow(uint64_t subscribe_id) {
     windows_.RemoveWindow(subscribe_id);
@@ -110,34 +88,7 @@
 
   // Updates next_sequence_ if |sequence| is larger. Updates max_object_ids_
   // if relevant.
-  void SentSequence(FullSequence sequence, MoqtObjectStatus status) {
-    QUICHE_DCHECK(max_object_ids_.find(sequence.group) ==
-                      max_object_ids_.end() ||
-                  max_object_ids_[sequence.group] < sequence.object);
-    switch (status) {
-      case MoqtObjectStatus::kNormal:
-      case MoqtObjectStatus::kObjectDoesNotExist:
-        if (next_sequence_ <= sequence) {
-          next_sequence_ = sequence.next();
-        }
-        break;
-      case MoqtObjectStatus::kGroupDoesNotExist:
-        max_object_ids_[sequence.group] = 0;
-        break;
-      case MoqtObjectStatus::kEndOfGroup:
-        max_object_ids_[sequence.group] = sequence.object;
-        if (next_sequence_ <= sequence) {
-          next_sequence_ = FullSequence(sequence.group + 1, 0);
-        }
-        break;
-      case MoqtObjectStatus::kEndOfTrack:
-        max_object_ids_[sequence.group] = sequence.object;
-        break;
-      default:
-        QUICHE_DCHECK(false);
-        return;
-    }
-  }
+  void SentSequence(FullSequence sequence, MoqtObjectStatus status);
 
   bool HasSubscriber() const { return !windows_.IsEmpty(); }
 
@@ -213,13 +164,7 @@
   // forwarding preference to the value indicated by the incoming encoding.
   // Otherwise, returns true if the incoming object does not violate the rule
   // that the preference is consistent.
-  bool CheckForwardingPreference(MoqtForwardingPreference preference) {
-    if (forwarding_preference_.has_value()) {
-      return forwarding_preference_.value() == preference;
-    }
-    forwarding_preference_ = preference;
-    return true;
-  }
+  bool CheckForwardingPreference(MoqtForwardingPreference preference);
 
  private:
   // TODO: There is no accounting for the number of outstanding subscribes,