1/* 2 * Copyright 2016 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11#import "RTCRtpParameters+Private.h" 12 13#import "RTCRtcpParameters+Private.h" 14#import "RTCRtpCodecParameters+Private.h" 15#import "RTCRtpEncodingParameters+Private.h" 16#import "RTCRtpHeaderExtension+Private.h" 17#import "helpers/NSString+StdString.h" 18 19@implementation RTC_OBJC_TYPE (RTCRtpParameters) 20 21@synthesize transactionId = _transactionId; 22@synthesize rtcp = _rtcp; 23@synthesize headerExtensions = _headerExtensions; 24@synthesize encodings = _encodings; 25@synthesize codecs = _codecs; 26@synthesize degradationPreference = _degradationPreference; 27 28- (instancetype)init { 29 webrtc::RtpParameters nativeParameters; 30 return [self initWithNativeParameters:nativeParameters]; 31} 32 33- (instancetype)initWithNativeParameters: 34 (const webrtc::RtpParameters &)nativeParameters { 35 if (self = [super init]) { 36 _transactionId = [NSString stringForStdString:nativeParameters.transaction_id]; 37 _rtcp = 38 [[RTC_OBJC_TYPE(RTCRtcpParameters) alloc] initWithNativeParameters:nativeParameters.rtcp]; 39 40 NSMutableArray *headerExtensions = [[NSMutableArray alloc] init]; 41 for (const auto &headerExtension : nativeParameters.header_extensions) { 42 [headerExtensions addObject:[[RTC_OBJC_TYPE(RTCRtpHeaderExtension) alloc] 43 initWithNativeParameters:headerExtension]]; 44 } 45 _headerExtensions = headerExtensions; 46 47 NSMutableArray *encodings = [[NSMutableArray alloc] init]; 48 for (const auto &encoding : nativeParameters.encodings) { 49 [encodings addObject:[[RTC_OBJC_TYPE(RTCRtpEncodingParameters) alloc] 50 initWithNativeParameters:encoding]]; 51 } 52 _encodings = encodings; 53 54 NSMutableArray *codecs = [[NSMutableArray alloc] init]; 55 for (const auto &codec : nativeParameters.codecs) { 56 [codecs 57 addObject:[[RTC_OBJC_TYPE(RTCRtpCodecParameters) alloc] initWithNativeParameters:codec]]; 58 } 59 _codecs = codecs; 60 61 _degradationPreference = [RTC_OBJC_TYPE(RTCRtpParameters) 62 degradationPreferenceFromNativeDegradationPreference:nativeParameters 63 .degradation_preference]; 64 } 65 return self; 66} 67 68- (webrtc::RtpParameters)nativeParameters { 69 webrtc::RtpParameters parameters; 70 parameters.transaction_id = [NSString stdStringForString:_transactionId]; 71 parameters.rtcp = [_rtcp nativeParameters]; 72 for (RTC_OBJC_TYPE(RTCRtpHeaderExtension) * headerExtension in _headerExtensions) { 73 parameters.header_extensions.push_back(headerExtension.nativeParameters); 74 } 75 for (RTC_OBJC_TYPE(RTCRtpEncodingParameters) * encoding in _encodings) { 76 parameters.encodings.push_back(encoding.nativeParameters); 77 } 78 for (RTC_OBJC_TYPE(RTCRtpCodecParameters) * codec in _codecs) { 79 parameters.codecs.push_back(codec.nativeParameters); 80 } 81 if (_degradationPreference) { 82 parameters.degradation_preference = [RTC_OBJC_TYPE(RTCRtpParameters) 83 nativeDegradationPreferenceFromDegradationPreference:(RTCDegradationPreference) 84 _degradationPreference.intValue]; 85 } 86 return parameters; 87} 88 89+ (webrtc::DegradationPreference)nativeDegradationPreferenceFromDegradationPreference: 90 (RTCDegradationPreference)degradationPreference { 91 switch (degradationPreference) { 92 case RTCDegradationPreferenceDisabled: 93 return webrtc::DegradationPreference::DISABLED; 94 case RTCDegradationPreferenceMaintainFramerate: 95 return webrtc::DegradationPreference::MAINTAIN_FRAMERATE; 96 case RTCDegradationPreferenceMaintainResolution: 97 return webrtc::DegradationPreference::MAINTAIN_RESOLUTION; 98 case RTCDegradationPreferenceBalanced: 99 return webrtc::DegradationPreference::BALANCED; 100 } 101} 102 103+ (NSNumber *)degradationPreferenceFromNativeDegradationPreference: 104 (absl::optional<webrtc::DegradationPreference>)nativeDegradationPreference { 105 if (!nativeDegradationPreference.has_value()) { 106 return nil; 107 } 108 109 switch (*nativeDegradationPreference) { 110 case webrtc::DegradationPreference::DISABLED: 111 return @(RTCDegradationPreferenceDisabled); 112 case webrtc::DegradationPreference::MAINTAIN_FRAMERATE: 113 return @(RTCDegradationPreferenceMaintainFramerate); 114 case webrtc::DegradationPreference::MAINTAIN_RESOLUTION: 115 return @(RTCDegradationPreferenceMaintainResolution); 116 case webrtc::DegradationPreference::BALANCED: 117 return @(RTCDegradationPreferenceBalanced); 118 } 119} 120 121@end 122