Record target bitrate changes in MOQT traces.

PiperOrigin-RevId: 825172208
diff --git a/quiche/quic/moqt/moqt_bitrate_adjuster.cc b/quiche/quic/moqt/moqt_bitrate_adjuster.cc
index fbcc224..59e10b1 100644
--- a/quiche/quic/moqt/moqt_bitrate_adjuster.cc
+++ b/quiche/quic/moqt/moqt_bitrate_adjuster.cc
@@ -63,8 +63,7 @@
       parameters_.target_bitrate_multiplier_down *
       QuicBandwidth::FromBitsPerSecond(stats.estimated_send_rate_bps);
   QUICHE_DLOG(INFO) << "Adjusting the bitrate down to " << target_bandwidth;
-  adjustable_->ConsiderAdjustingBitrate(target_bandwidth,
-                                        BitrateAdjustmentType::kDown);
+  SuggestNewBitrate(target_bandwidth, BitrateAdjustmentType::kDown);
 }
 
 void MoqtBitrateAdjuster::OnObjectAckSupportKnown(
@@ -104,4 +103,10 @@
   return false;
 }
 
+void MoqtBitrateAdjuster::SuggestNewBitrate(quic::QuicBandwidth bitrate,
+                                            BitrateAdjustmentType type) {
+  adjustable_->ConsiderAdjustingBitrate(bitrate, type);
+  trace_recorder_.RecordTargetBitrateSet(bitrate);
+}
+
 }  // namespace moqt
diff --git a/quiche/quic/moqt/moqt_bitrate_adjuster.h b/quiche/quic/moqt/moqt_bitrate_adjuster.h
index 135373a..b3667b6 100644
--- a/quiche/quic/moqt/moqt_bitrate_adjuster.h
+++ b/quiche/quic/moqt/moqt_bitrate_adjuster.h
@@ -12,6 +12,7 @@
 #include "quiche/quic/core/quic_clock.h"
 #include "quiche/quic/core/quic_time.h"
 #include "quiche/quic/moqt/moqt_session.h"
+#include "quiche/quic/moqt/moqt_trace_recorder.h"
 #include "quiche/web_transport/web_transport.h"
 
 namespace moqt {
@@ -75,15 +76,21 @@
   void OnObjectAckReceived(uint64_t group_id, uint64_t object_id,
                            quic::QuicTimeDelta delta_from_deadline) override;
 
+  MoqtTraceRecorder& trace_recorder() { return trace_recorder_; }
+
  private:
   void Start();
 
   // Attempts adjusting the bitrate down.
   void AttemptAdjustingDown();
 
+  void SuggestNewBitrate(quic::QuicBandwidth bitrate,
+                         BitrateAdjustmentType type);
+
   const quic::QuicClock* clock_;    // Not owned.
   webtransport::Session* session_;  // Not owned.
   BitrateAdjustable* adjustable_;   // Not owned.
+  MoqtTraceRecorder trace_recorder_;
   MoqtBitrateAdjusterParameters parameters_;
   quic::QuicTime start_time_ = quic::QuicTime::Zero();
   quic::QuicTimeDelta time_window_ = quic::QuicTimeDelta::Zero();
diff --git a/quiche/quic/moqt/moqt_trace_recorder.cc b/quiche/quic/moqt/moqt_trace_recorder.cc
index 0f8eb6e..6bcc537 100644
--- a/quiche/quic/moqt/moqt_trace_recorder.cc
+++ b/quiche/quic/moqt/moqt_trace_recorder.cc
@@ -7,6 +7,7 @@
 #include <cstdint>
 #include <optional>
 
+#include "quiche/quic/core/quic_bandwidth.h"
 #include "quiche/quic/core/quic_time.h"
 #include "quiche/quic/moqt/moqt_messages.h"
 #include "quiche/quic/moqt/moqt_object.h"
@@ -116,4 +117,14 @@
   parent_->PopulateTransportState(event->mutable_transport_state());
 }
 
+void MoqtTraceRecorder::RecordTargetBitrateSet(
+    quic::QuicBandwidth new_bandwidth) {
+  if (parent_ == nullptr) {
+    return;
+  }
+  quic_trace::Event* event = AddEvent();
+  event->set_event_type(EventType::MOQT_TARGET_BITRATE_SET);
+  event->set_bandwidth_estimate_bps(new_bandwidth.ToBitsPerSecond());
+}
+
 }  // namespace moqt
diff --git a/quiche/quic/moqt/moqt_trace_recorder.h b/quiche/quic/moqt/moqt_trace_recorder.h
index 81b5531..0dc8c8c 100644
--- a/quiche/quic/moqt/moqt_trace_recorder.h
+++ b/quiche/quic/moqt/moqt_trace_recorder.h
@@ -9,6 +9,7 @@
 #include <memory>
 
 #include "absl/base/nullability.h"
+#include "quiche/quic/core/quic_bandwidth.h"
 #include "quiche/quic/core/quic_time.h"
 #include "quiche/quic/core/quic_trace_visitor.h"
 #include "quiche/quic/moqt/moqt_messages.h"
@@ -60,6 +61,10 @@
   void RecordObjectAck(uint64_t track_alias, Location location,
                        quic::QuicTimeDelta ack_delta);
 
+  // Records the fact that the MOQT stack has advised the application to change
+  // its bitrate.
+  void RecordTargetBitrateSet(quic::QuicBandwidth new_bandwidth);
+
  private:
   // Adds a new event to the trace, and populates the timestamp.
   quic_trace::Event* AddEvent();
diff --git a/quiche/quic/moqt/test_tools/moqt_simulator.cc b/quiche/quic/moqt/test_tools/moqt_simulator.cc
index b39ba42..e7f32bd 100644
--- a/quiche/quic/moqt/test_tools/moqt_simulator.cc
+++ b/quiche/quic/moqt/test_tools/moqt_simulator.cc
@@ -282,6 +282,8 @@
   QUICHE_DCHECK(client_endpoint_.trace_visitor() != nullptr);
   client_endpoint_.session()->trace_recorder().SetParentRecorder(
       client_endpoint_.trace_visitor());
+  adjuster_.trace_recorder().SetParentRecorder(
+      client_endpoint_.trace_visitor());
 }
 
 std::string MoqtSimulator::GetClientSessionCongestionControl() {
diff --git a/quiche/quic/moqt/test_tools/moqt_simulator.h b/quiche/quic/moqt/test_tools/moqt_simulator.h
index b0fbffd..c930c51 100644
--- a/quiche/quic/moqt/test_tools/moqt_simulator.h
+++ b/quiche/quic/moqt/test_tools/moqt_simulator.h
@@ -219,6 +219,11 @@
   // The fraction of objects received on time.
   float received_on_time_fraction() const;
 
+  // The trace of the client session (the publisher).
+  const quic_trace::Trace& client_trace() {
+    return *client_endpoint_.trace_visitor()->trace();
+  }
+
   // Outputs the results of the simulation to stdout.
   void HumanReadableOutput();
   void CustomOutput(absl::string_view format);
diff --git a/quiche/quic/moqt/test_tools/moqt_simulator_test.cc b/quiche/quic/moqt/test_tools/moqt_simulator_test.cc
index f491515..f562659 100644
--- a/quiche/quic/moqt/test_tools/moqt_simulator_test.cc
+++ b/quiche/quic/moqt/test_tools/moqt_simulator_test.cc
@@ -7,18 +7,34 @@
 #include "quiche/quic/core/quic_bandwidth.h"
 #include "quiche/quic/core/quic_connection_stats.h"
 #include "quiche/quic/core/quic_time.h"
+#include "quic_trace/quic_trace.pb.h"
 #include "quiche/common/platform/api/quiche_test.h"
 
 namespace moqt::test {
 namespace {
 
+using ::quic_trace::EventType;
+
 class MoqtSimulatorTest : public quiche::test::QuicheTest {};
 
+int CountEventType(const quic_trace::Trace& trace, quic_trace::EventType type) {
+  int count = 0;
+  for (const quic_trace::Event& event : trace.events()) {
+    if (event.event_type() == type) {
+      ++count;
+    }
+  }
+  return count;
+}
+
 // Ensure the simulation works with default parameters.
 TEST_F(MoqtSimulatorTest, DefaultSettings) {
   MoqtSimulator simulator(SimulationParameters{});
   simulator.Run();
   EXPECT_NEAR(simulator.received_on_time_fraction(), 1.0f, 0.001f);
+  EXPECT_EQ(CountEventType(simulator.client_trace(),
+                           EventType::MOQT_TARGET_BITRATE_SET),
+            0);
 }
 
 // Ensure that the bitrate adaptation down works.
@@ -31,6 +47,9 @@
   simulator.Run();
   EXPECT_GE(simulator.received_on_time_fraction(), 0.8f);
   EXPECT_LT(simulator.received_on_time_fraction(), 0.99f);
+  EXPECT_GT(CountEventType(simulator.client_trace(),
+                           EventType::MOQT_TARGET_BITRATE_SET),
+            0);
 
   quic::QuicConnectionStats stats =
       simulator.client_quic_session()->connection()->GetStats();