/* * Copyright 2019 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 API_TRANSPORT_RTP_RTP_SOURCE_H_ #define API_TRANSPORT_RTP_RTP_SOURCE_H_ #include #include "absl/types/optional.h" #include "api/rtp_headers.h" #include "api/units/time_delta.h" #include "rtc_base/checks.h" namespace webrtc { enum class RtpSourceType { SSRC, CSRC, }; class RtpSource { public: struct Extensions { absl::optional audio_level; // Fields from the Absolute Capture Time header extension: // http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time absl::optional absolute_capture_time; // Clock offset between the local clock and the capturer's clock. // Do not confuse with `AbsoluteCaptureTime::estimated_capture_clock_offset` // which instead represents the clock offset between a remote sender and the // capturer. The following holds: // Capture's NTP Clock = Local NTP Clock + Local-Capture Clock Offset absl::optional local_capture_clock_offset; }; RtpSource() = delete; RtpSource(int64_t timestamp_ms, uint32_t source_id, RtpSourceType source_type, uint32_t rtp_timestamp, const RtpSource::Extensions& extensions) : timestamp_ms_(timestamp_ms), source_id_(source_id), source_type_(source_type), extensions_(extensions), rtp_timestamp_(rtp_timestamp) {} RtpSource(const RtpSource&) = default; RtpSource& operator=(const RtpSource&) = default; ~RtpSource() = default; int64_t timestamp_ms() const { return timestamp_ms_; } void update_timestamp_ms(int64_t timestamp_ms) { RTC_DCHECK_LE(timestamp_ms_, timestamp_ms); timestamp_ms_ = timestamp_ms; } // The identifier of the source can be the CSRC or the SSRC. uint32_t source_id() const { return source_id_; } // The source can be either a contributing source or a synchronization source. RtpSourceType source_type() const { return source_type_; } absl::optional audio_level() const { return extensions_.audio_level; } void set_audio_level(const absl::optional& level) { extensions_.audio_level = level; } uint32_t rtp_timestamp() const { return rtp_timestamp_; } absl::optional absolute_capture_time() const { return extensions_.absolute_capture_time; } absl::optional local_capture_clock_offset() const { return extensions_.local_capture_clock_offset; } bool operator==(const RtpSource& o) const { return timestamp_ms_ == o.timestamp_ms() && source_id_ == o.source_id() && source_type_ == o.source_type() && extensions_.audio_level == o.extensions_.audio_level && extensions_.absolute_capture_time == o.extensions_.absolute_capture_time && rtp_timestamp_ == o.rtp_timestamp(); } private: int64_t timestamp_ms_; uint32_t source_id_; RtpSourceType source_type_; RtpSource::Extensions extensions_; uint32_t rtp_timestamp_; }; } // namespace webrtc #endif // API_TRANSPORT_RTP_RTP_SOURCE_H_