| /* |
| * 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 <optional> |
| #include "api/rtp_parameters.h" |
| #include "api/scoped_refptr.h" |
| #include "api/transport/rtp/rtp_source.h" |
| |
| @implementation RTC_OBJC_TYPE (RTCRtpSource) { |
| std::optional<webrtc::RtpSource> _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<uint8_t> 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 |