Add degradationPreference to RTCRtpParameters in ObjC SDK.

Bug: None
Change-Id: I64daf9ac142f960a13f9e69705ba8d3b865578e0
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/164527
Reviewed-by: Anders Carlsson <andersc@webrtc.org>
Commit-Queue: Mirta Dvornicic <mirtad@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30164}
diff --git a/sdk/objc/api/peerconnection/RTCRtpParameters.h b/sdk/objc/api/peerconnection/RTCRtpParameters.h
index c1f2d5c..e2903cc 100644
--- a/sdk/objc/api/peerconnection/RTCRtpParameters.h
+++ b/sdk/objc/api/peerconnection/RTCRtpParameters.h
@@ -18,6 +18,14 @@
 
 NS_ASSUME_NONNULL_BEGIN
 
+/** Corresponds to webrtc::DegradationPreference. */
+typedef NS_ENUM(NSInteger, RTCDegradationPreference) {
+  RTCDegradationPreferenceDisabled,
+  RTCDegradationPreferenceMaintainFramerate,
+  RTCDegradationPreferenceMaintainResolution,
+  RTCDegradationPreferenceBalanced
+};
+
 RTC_OBJC_EXPORT
 @interface RTCRtpParameters : NSObject
 
@@ -36,6 +44,12 @@
 /** The negotiated set of send codecs in order of preference. */
 @property(nonatomic, copy) NSArray<RTCRtpCodecParameters *> *codecs;
 
+/**
+ * Degradation preference in case of CPU adaptation or constrained bandwidth.
+ * If nil, implementation default degradation preference will be used.
+ */
+@property(nonatomic, copy) NSNumber *degradationPreference;
+
 - (instancetype)init NS_DESIGNATED_INITIALIZER;
 
 @end
diff --git a/sdk/objc/api/peerconnection/RTCRtpParameters.mm b/sdk/objc/api/peerconnection/RTCRtpParameters.mm
index 9b76ac5..d70f7da 100644
--- a/sdk/objc/api/peerconnection/RTCRtpParameters.mm
+++ b/sdk/objc/api/peerconnection/RTCRtpParameters.mm
@@ -23,6 +23,7 @@
 @synthesize headerExtensions = _headerExtensions;
 @synthesize encodings = _encodings;
 @synthesize codecs = _codecs;
+@synthesize degradationPreference = _degradationPreference;
 
 - (instancetype)init {
   return [super init];
@@ -54,6 +55,10 @@
                             initWithNativeParameters:codec]];
     }
     _codecs = codecs;
+
+    _degradationPreference = @([RTCRtpParameters
+        degradationPreferenceFromNativeDegradationPreference:nativeParameters
+                                                                 .degradation_preference]);
   }
   return self;
 }
@@ -71,7 +76,40 @@
   for (RTCRtpCodecParameters *codec in _codecs) {
     parameters.codecs.push_back(codec.nativeParameters);
   }
+  if (_degradationPreference) {
+    parameters.degradation_preference = [RTCRtpParameters
+        nativeDegradationPreferenceFromDegradationPreference:(RTCDegradationPreference)
+                                                                 _degradationPreference.intValue];
+  }
   return parameters;
 }
 
++ (webrtc::DegradationPreference)nativeDegradationPreferenceFromDegradationPreference:
+    (RTCDegradationPreference)degradationPreference {
+  switch (degradationPreference) {
+    case RTCDegradationPreferenceDisabled:
+      return webrtc::DegradationPreference::DISABLED;
+    case RTCDegradationPreferenceMaintainFramerate:
+      return webrtc::DegradationPreference::MAINTAIN_FRAMERATE;
+    case RTCDegradationPreferenceMaintainResolution:
+      return webrtc::DegradationPreference::MAINTAIN_RESOLUTION;
+    case RTCDegradationPreferenceBalanced:
+      return webrtc::DegradationPreference::BALANCED;
+  }
+}
+
++ (RTCDegradationPreference)degradationPreferenceFromNativeDegradationPreference:
+    (webrtc::DegradationPreference)nativeDegradationPreference {
+  switch (nativeDegradationPreference) {
+    case webrtc::DegradationPreference::DISABLED:
+      return RTCDegradationPreferenceDisabled;
+    case webrtc::DegradationPreference::MAINTAIN_FRAMERATE:
+      return RTCDegradationPreferenceMaintainFramerate;
+    case webrtc::DegradationPreference::MAINTAIN_RESOLUTION:
+      return RTCDegradationPreferenceMaintainResolution;
+    case webrtc::DegradationPreference::BALANCED:
+      return RTCDegradationPreferenceBalanced;
+  }
+}
+
 @end