blob: 4599fef069c1c930d4bd11fcff5f56cba53c8452 [file]
/*
* Copyright (c) 2026 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef VIDEO_TIMING_SIMULATOR_RTT_SIMULATOR_H_
#define VIDEO_TIMING_SIMULATOR_RTT_SIMULATOR_H_
#include <cstdint>
#include <vector>
#include "absl/base/nullability.h"
#include "api/environment/environment.h"
#include "api/sequence_checker.h"
#include "api/task_queue/task_queue_base.h"
#include "api/units/time_delta.h"
#include "api/units/timestamp.h"
#include "logging/rtc_event_log/events/logged_rtp_rtcp.h"
#include "modules/include/module_common_types.h"
#include "rtc_base/thread_annotations.h"
#include "video/call_stats2.h"
#include "video/timing/simulator/rtcp_rtt_calculator.h"
namespace webrtc::video_timing_simulator {
class SimulatedRttCallback {
public:
virtual ~SimulatedRttCallback() = default;
virtual void OnMaxRttUpdate(TimeDelta max_rtt) = 0;
};
// Simulates session-level Round Trip Time (RTT) estimation by processing logged
// RTCP packets. It uses `RtcpRttCalculator` to calculate RTT samples from
// Sender Reports (SR), Receiver Reports (RR), and Extended Reports (XR),
// feeds them into `CallStats` to calculate moving averages/maxima, and
// propagates the updates back to the driver via `SimulatedRttCallback`.
class RttSimulator : public CallStatsObserver {
public:
RttSimulator(const Environment& env,
TaskQueueBase* absl_nonnull simulator_queue,
SimulatedRttCallback* absl_nonnull callback);
~RttSimulator() override;
RttSimulator(const RttSimulator&) = delete;
RttSimulator& operator=(const RttSimulator&) = delete;
// Handlers for logged RTCP packets.
void OnOutgoingSenderReport(const LoggedRtcpPacketSenderReport& packet);
void OnOutgoingExtendedReports(const LoggedRtcpPacketExtendedReports& packet);
void OnIncomingSenderReport(const LoggedRtcpPacketSenderReport& packet);
void OnIncomingReceiverReport(const LoggedRtcpPacketReceiverReport& packet);
void OnIncomingExtendedReports(const LoggedRtcpPacketExtendedReports& packet);
// Implements `CallStatsObserver`.
void OnRttUpdate(int64_t /*avg_rtt_ms*/, int64_t max_rtt_ms) override;
private:
void UpdateCallStats(const std::vector<TimeDelta>& rtts, Timestamp now);
// Environment.
SequenceChecker sequence_checker_;
const Environment env_;
// Worker objects.
RtcpRttCalculator rtt_calculator_ RTC_GUARDED_BY(sequence_checker_);
internal::CallStats call_stats_ RTC_GUARDED_BY(sequence_checker_);
// Outputs.
SimulatedRttCallback& simulated_rtt_cb_;
};
} // namespace webrtc::video_timing_simulator
#endif // VIDEO_TIMING_SIMULATOR_RTT_SIMULATOR_H_