mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 05:40:42 +01:00

to support clients (e.g. RTCPReceiver) that collect and report RTT per sender ssrc. Bug: webrtc:8239, webrtc:13853 Change-Id: I907fb35277b0f23bbe9f2cd2ef979ce0fb1f9338 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/257440 Reviewed-by: Emil Lundmark <lndmrk@webrtc.org> Commit-Queue: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/main@{#36439}
188 lines
7.1 KiB
C++
188 lines
7.1 KiB
C++
/*
|
|
* Copyright (c) 2017 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 MODULES_RTP_RTCP_SOURCE_RTCP_TRANSCEIVER_CONFIG_H_
|
|
#define MODULES_RTP_RTCP_SOURCE_RTCP_TRANSCEIVER_CONFIG_H_
|
|
|
|
#include <string>
|
|
|
|
#include "api/array_view.h"
|
|
#include "api/rtp_headers.h"
|
|
#include "api/task_queue/task_queue_base.h"
|
|
#include "api/units/data_rate.h"
|
|
#include "api/units/time_delta.h"
|
|
#include "api/units/timestamp.h"
|
|
#include "api/video/video_bitrate_allocation.h"
|
|
#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
|
|
#include "modules/rtp_rtcp/source/rtcp_packet/report_block.h"
|
|
#include "modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
|
|
#include "system_wrappers/include/clock.h"
|
|
#include "system_wrappers/include/ntp_time.h"
|
|
|
|
namespace webrtc {
|
|
class ReceiveStatisticsProvider;
|
|
class Transport;
|
|
|
|
// Interface to watch incoming rtcp packets related to the link in general.
|
|
// All message handlers have default empty implementation. This way users only
|
|
// need to implement the ones they are interested in.
|
|
// All message handles pass `receive_time` parameter, which is receive time
|
|
// of the rtcp packet that triggered the update.
|
|
class NetworkLinkRtcpObserver {
|
|
public:
|
|
virtual ~NetworkLinkRtcpObserver() = default;
|
|
|
|
virtual void OnTransportFeedback(Timestamp receive_time,
|
|
const rtcp::TransportFeedback& feedback) {}
|
|
virtual void OnReceiverEstimatedMaxBitrate(Timestamp receive_time,
|
|
DataRate bitrate) {}
|
|
virtual void OnReportBlocks(
|
|
Timestamp receive_time,
|
|
rtc::ArrayView<const rtcp::ReportBlock> report_blocks) {}
|
|
virtual void OnRttUpdate(Timestamp receive_time, TimeDelta rtt) {}
|
|
};
|
|
|
|
// Interface to watch incoming rtcp packets by media (rtp) receiver.
|
|
// All message handlers have default empty implementation. This way users only
|
|
// need to implement the ones they are interested in.
|
|
class MediaReceiverRtcpObserver {
|
|
public:
|
|
virtual ~MediaReceiverRtcpObserver() = default;
|
|
|
|
virtual void OnSenderReport(uint32_t sender_ssrc,
|
|
NtpTime ntp_time,
|
|
uint32_t rtp_time) {}
|
|
virtual void OnBye(uint32_t sender_ssrc) {}
|
|
virtual void OnBitrateAllocation(uint32_t sender_ssrc,
|
|
const VideoBitrateAllocation& allocation) {}
|
|
};
|
|
|
|
// Handles RTCP related messages for a single RTP stream (i.e. single SSRC)
|
|
class RtpStreamRtcpHandler {
|
|
public:
|
|
virtual ~RtpStreamRtcpHandler() = default;
|
|
|
|
// Statistic about sent RTP packets to propagate to RTCP sender report.
|
|
class RtpStats {
|
|
public:
|
|
RtpStats() = default;
|
|
RtpStats(const RtpStats&) = default;
|
|
RtpStats& operator=(const RtpStats&) = default;
|
|
~RtpStats() = default;
|
|
|
|
size_t num_sent_packets() const { return num_sent_packets_; }
|
|
size_t num_sent_bytes() const { return num_sent_bytes_; }
|
|
Timestamp last_capture_time() const { return last_capture_time_; }
|
|
uint32_t last_rtp_timestamp() const { return last_rtp_timestamp_; }
|
|
int last_clock_rate() const { return last_clock_rate_; }
|
|
|
|
void set_num_sent_packets(size_t v) { num_sent_packets_ = v; }
|
|
void set_num_sent_bytes(size_t v) { num_sent_bytes_ = v; }
|
|
void set_last_capture_time(Timestamp v) { last_capture_time_ = v; }
|
|
void set_last_rtp_timestamp(uint32_t v) { last_rtp_timestamp_ = v; }
|
|
void set_last_clock_rate(int v) { last_clock_rate_ = v; }
|
|
|
|
private:
|
|
size_t num_sent_packets_ = 0;
|
|
size_t num_sent_bytes_ = 0;
|
|
Timestamp last_capture_time_ = Timestamp::Zero();
|
|
uint32_t last_rtp_timestamp_ = 0;
|
|
int last_clock_rate_ = 90'000;
|
|
};
|
|
virtual RtpStats SentStats() = 0;
|
|
|
|
virtual void OnNack(uint32_t sender_ssrc,
|
|
rtc::ArrayView<const uint16_t> sequence_numbers) {}
|
|
virtual void OnFir(uint32_t sender_ssrc) {}
|
|
virtual void OnPli(uint32_t sender_ssrc) {}
|
|
virtual void OnReportBlock(uint32_t sender_ssrc,
|
|
const rtcp::ReportBlock& report_block) {}
|
|
};
|
|
|
|
struct RtcpTransceiverConfig {
|
|
RtcpTransceiverConfig();
|
|
RtcpTransceiverConfig(const RtcpTransceiverConfig&);
|
|
RtcpTransceiverConfig& operator=(const RtcpTransceiverConfig&);
|
|
~RtcpTransceiverConfig();
|
|
|
|
// Logs the error and returns false if configuration miss key objects or
|
|
// is inconsistant. May log warnings.
|
|
bool Validate() const;
|
|
|
|
// Used to prepend all log messages. Can be empty.
|
|
std::string debug_id;
|
|
|
|
// Ssrc to use as default sender ssrc, e.g. for transport-wide feedbacks.
|
|
uint32_t feedback_ssrc = 1;
|
|
|
|
// Canonical End-Point Identifier of the local particiapnt.
|
|
// Defined in rfc3550 section 6 note 2 and section 6.5.1.
|
|
std::string cname;
|
|
|
|
// Maximum packet size outgoing transport accepts.
|
|
size_t max_packet_size = 1200;
|
|
|
|
// The clock to use when querying for the NTP time. Should be set.
|
|
Clock* clock = nullptr;
|
|
|
|
// Transport to send rtcp packets to. Should be set.
|
|
Transport* outgoing_transport = nullptr;
|
|
|
|
// Queue for scheduling delayed tasks, e.g. sending periodic compound packets.
|
|
TaskQueueBase* task_queue = nullptr;
|
|
|
|
// Rtcp report block generator for outgoing receiver reports.
|
|
ReceiveStatisticsProvider* receive_statistics = nullptr;
|
|
|
|
// Should outlive RtcpTransceiver.
|
|
// Callbacks will be invoked on the `task_queue`.
|
|
NetworkLinkRtcpObserver* network_link_observer = nullptr;
|
|
|
|
// Configures if sending should
|
|
// enforce compound packets: https://tools.ietf.org/html/rfc4585#section-3.1
|
|
// or allow reduced size packets: https://tools.ietf.org/html/rfc5506
|
|
// Receiving accepts both compound and reduced-size packets.
|
|
RtcpMode rtcp_mode = RtcpMode::kCompound;
|
|
//
|
|
// Tuning parameters.
|
|
//
|
|
// Initial state if `outgoing_transport` ready to accept packets.
|
|
bool initial_ready_to_send = true;
|
|
// Delay before 1st periodic compound packet.
|
|
TimeDelta initial_report_delay = TimeDelta::Millis(500);
|
|
|
|
// Period between periodic compound packets.
|
|
TimeDelta report_period = TimeDelta::Seconds(1);
|
|
|
|
//
|
|
// Flags for features and experiments.
|
|
//
|
|
bool schedule_periodic_compound_packets = true;
|
|
// Estimate RTT as non-sender as described in
|
|
// https://tools.ietf.org/html/rfc3611#section-4.4 and #section-4.5
|
|
bool non_sender_rtt_measurement = false;
|
|
|
|
// Reply to incoming RRTR messages so that remote endpoint may estimate RTT as
|
|
// non-sender as described in https://tools.ietf.org/html/rfc3611#section-4.4
|
|
// and #section-4.5
|
|
bool reply_to_non_sender_rtt_measurement = true;
|
|
|
|
// Reply to incoming RRTR messages multiple times, one per sender SSRC, to
|
|
// support clients that calculate and process RTT per sender SSRC.
|
|
bool reply_to_non_sender_rtt_mesaurments_on_all_ssrcs = true;
|
|
|
|
// Allows a REMB message to be sent immediately when SetRemb is called without
|
|
// having to wait for the next compount message to be sent.
|
|
bool send_remb_on_change = false;
|
|
};
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // MODULES_RTP_RTCP_SOURCE_RTCP_TRANSCEIVER_CONFIG_H_
|