blob: 4835d44b4b0cfd9ede1f5660857a0ca811fe39ce [file] [edit]
/*
* 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_RTCP_RTT_CALCULATOR_H_
#define VIDEO_TIMING_SIMULATOR_RTCP_RTT_CALCULATOR_H_
#include <cstdint>
#include <utility>
#include <vector>
#include "absl/container/flat_hash_map.h"
#include "api/sequence_checker.h"
#include "api/units/time_delta.h"
#include "api/units/timestamp.h"
#include "modules/rtp_rtcp/source/rtcp_packet/extended_reports.h"
#include "modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
#include "modules/rtp_rtcp/source/rtcp_packet/report_block.h"
#include "modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
#include "rtc_base/thread_annotations.h"
namespace webrtc::video_timing_simulator {
// Calculates Round Trip Time (RTT) samples by pairing outgoing reports with
// incoming feedback. It covers all standard RTCP RTT mechanisms:
//
// 1. Sender RTT (SR/RR):
// Maps outgoing Sender Reports (SR) to incoming Receiver Reports (RR) or
// incoming Sender Reports (SR) containing reception report blocks.
//
// 2. Receiver RTT (XR RRTR/DLRR):
// Maps outgoing Extended Reports (XR) containing Receiver Reference Time
// Reports (RRTR) to incoming XRs containing Delay since Last RR (DLRR).
//
// Outgoing reports are cached for up to 1 minute before being cleaned up.
class RtcpRttCalculator {
public:
RtcpRttCalculator();
~RtcpRttCalculator();
RtcpRttCalculator(const RtcpRttCalculator&) = delete;
RtcpRttCalculator& operator=(const RtcpRttCalculator&) = delete;
// Registers an outgoing SR to map incoming RRs to.
void OnOutgoingSenderReport(const rtcp::SenderReport& sr, Timestamp now);
// Registers an outgoing XR (specifically RRTR) to map incoming XRs (DLRR) to.
void OnOutgoingExtendedReports(const rtcp::ExtendedReports& xr,
Timestamp now);
// Processes an incoming SR and returns a list of calculated RTTs.
std::vector<TimeDelta> OnIncomingSenderReport(const rtcp::SenderReport& sr,
Timestamp now);
// Processes an incoming RR and returns a list of calculated RTTs.
std::vector<TimeDelta> OnIncomingReceiverReport(
const rtcp::ReceiverReport& rr,
Timestamp now);
// Processes an incoming XR and returns a list of calculated RTTs.
std::vector<TimeDelta> OnIncomingExtendedReports(
const rtcp::ExtendedReports& xr,
Timestamp now);
private:
// See https://www.rfc-editor.org/info/rfc3550/#section-6.4.1.
using SentReportKey =
std::pair</*sender_ssrc=*/uint32_t, /*compact_ntp=*/uint32_t>;
struct SentReportValue {
Timestamp sent_time = Timestamp::MinusInfinity();
};
// Helper to process report blocks from either SR or RR.
std::vector<TimeDelta> ProcessReportBlocks(
const std::vector<rtcp::ReportBlock>& report_blocks,
Timestamp now);
// Cleans up registered outgoing reports that are older than 1 minute.
void CleanOldReports(Timestamp now);
SequenceChecker sequence_checker_;
// Outgoing SRs: (sender_ssrc, lsr) -> sent_time.
absl::flat_hash_map<SentReportKey, SentReportValue> outgoing_srs_
RTC_GUARDED_BY(sequence_checker_);
// Outgoing XRs: (sender_ssrc, lrr) -> sent_time.
absl::flat_hash_map<SentReportKey, SentReportValue> outgoing_xrs_
RTC_GUARDED_BY(sequence_checker_);
};
} // namespace webrtc::video_timing_simulator
#endif // VIDEO_TIMING_SIMULATOR_RTCP_RTT_CALCULATOR_H_