/* * Copyright 2024 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. */ #import "RTCRtpSource.h" #import "RTCRtpSource+Private.h" #import "base/RTCLogging.h" #import "helpers/NSString+StdString.h" #include #include "api/rtp_parameters.h" #include "api/scoped_refptr.h" #include "api/transport/rtp/rtp_source.h" @implementation RTC_OBJC_TYPE (RTCRtpSource) { std::optional _nativeRtpSource; } - (uint32_t)sourceId { return _nativeRtpSource.value().source_id(); } - (CFTimeInterval)timestampUs { return _nativeRtpSource.value().timestamp().us(); } - (uint32_t)rtpTimestamp { return _nativeRtpSource.value().rtp_timestamp(); } - (RTCRtpSourceType)sourceType { return [RTC_OBJC_TYPE(RTCRtpSource) rtpSourceTypeForNativeRtpSourceType:_nativeRtpSource.value() .source_type()]; } - (NSNumber *)audioLevel { std::optional level = _nativeRtpSource.value().audio_level(); if (!level.has_value()) { return nil; } // Converted according to equation defined here: // https://w3c.github.io/webrtc-pc/#dom-rtcrtpcontributingsource-audiolevel uint8_t rfcLevel = level.value(); if (rfcLevel > 127u) { rfcLevel = 127u; } if (rfcLevel == 127u) { return @(0.0); } return @(std::pow(10.0, -(double)rfcLevel / 20.0)); } - (NSString *)description { return [NSString stringWithFormat: @"RTC_OBJC_TYPE(RTCRtpSource) {\n sourceId: %d, sourceType: %@\n}", self.sourceId, [RTC_OBJC_TYPE(RTCRtpSource) stringForRtpSourceType:self.sourceType]]; } - (instancetype)initWithNativeRtpSource: (const webrtc::RtpSource &)nativeRtpSource { self = [super init]; if (self) { _nativeRtpSource = nativeRtpSource; } return self; } + (RTCRtpSourceType)rtpSourceTypeForNativeRtpSourceType: (webrtc::RtpSourceType)nativeRtpSourceType { switch (nativeRtpSourceType) { case webrtc::RtpSourceType::SSRC: return RTCRtpSourceTypeSSRC; case webrtc::RtpSourceType::CSRC: return RTCRtpSourceTypeCSRC; } } + (NSString *)stringForRtpSourceType:(RTCRtpSourceType)mediaType { switch (mediaType) { case RTCRtpSourceTypeSSRC: return @"SSRC"; case RTCRtpSourceTypeCSRC: return @"CSRC"; } } @end