xref: /aosp_15_r20/external/webrtc/sdk/objc/api/peerconnection/RTCRtpParameters.mm (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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