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();