|  | // 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. | 
|  |  | 
|  | #ifndef QUICHE_QUIC_MOQT_MOQT_BITRATE_ADJUSTER_H_ | 
|  | #define QUICHE_QUIC_MOQT_MOQT_BITRATE_ADJUSTER_H_ | 
|  |  | 
|  | #include <cstdint> | 
|  |  | 
|  | #include "quiche/quic/core/quic_bandwidth.h" | 
|  | #include "quiche/quic/core/quic_clock.h" | 
|  | #include "quiche/quic/core/quic_time.h" | 
|  | #include "quiche/quic/moqt/moqt_session.h" | 
|  | #include "quiche/web_transport/web_transport.h" | 
|  |  | 
|  | namespace moqt { | 
|  |  | 
|  | // A sender that can potentially have its outgoing bitrate adjusted. | 
|  | class BitrateAdjustable { | 
|  | public: | 
|  | virtual ~BitrateAdjustable() {} | 
|  |  | 
|  | // Returns the currently used bitrate. | 
|  | virtual quic::QuicBandwidth GetCurrentBitrate() const = 0; | 
|  | // Adjusts the bitrate to a new target. Returns true if the adjustment was | 
|  | // successful. | 
|  | virtual bool AdjustBitrate(quic::QuicBandwidth bandwidth) = 0; | 
|  | }; | 
|  |  | 
|  | // MoqtBitrateAdjuster monitors the progress of delivery for a single track, and | 
|  | // adjusts the bitrate of the track in question accordingly. | 
|  | class MoqtBitrateAdjuster : public MoqtPublishingMonitorInterface { | 
|  | public: | 
|  | MoqtBitrateAdjuster(const quic::QuicClock* clock, | 
|  | webtransport::Session* session, | 
|  | BitrateAdjustable* adjustable) | 
|  | : clock_(clock), | 
|  | session_(session), | 
|  | adjustable_(adjustable), | 
|  | last_adjustment_time_(clock->ApproximateNow()) {} | 
|  |  | 
|  | // MoqtPublishingMonitorInterface implementation. | 
|  | void OnObjectAckSupportKnown(bool supported) override; | 
|  | void OnObjectAckReceived(uint64_t group_id, uint64_t object_id, | 
|  | quic::QuicTimeDelta delta_from_deadline) override; | 
|  |  | 
|  | private: | 
|  | // Attempts adjusting the bitrate down. | 
|  | void AttemptAdjustingDown(); | 
|  |  | 
|  | const quic::QuicClock* clock_;    // Not owned. | 
|  | webtransport::Session* session_;  // Not owned. | 
|  | BitrateAdjustable* adjustable_;   // Not owned. | 
|  | quic::QuicTime last_adjustment_time_; | 
|  | }; | 
|  |  | 
|  | }  // namespace moqt | 
|  |  | 
|  | #endif  // QUICHE_QUIC_MOQT_MOQT_BITRATE_ADJUSTER_H_ |