blob: 0075c511350789b3de270ca8ad82ec6cc8865a08 [file] [log] [blame]
// 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_