Adding getParameters/setParameters APIs to RtpReceiver.

This is similar to how a "receive" method is used to apply
RtpParameters to an RtpReceiver in ORTC. Currently, SetParameters
doesn't allow changing the parameters, so the main use of the API is
to retrieve the set of configured codecs. But other uses will likely
be made possible in the future.

R=glaznev@webrtc.org, pthatcher@webrtc.org, tkchin@webrtc.org

Review URL: https://codereview.webrtc.org/1917193008 .

Cr-Commit-Position: refs/heads/master@{#12761}
diff --git a/webrtc/sdk/objc/Framework/Classes/RTCPeerConnection.mm b/webrtc/sdk/objc/Framework/Classes/RTCPeerConnection.mm
index 57c6780..b91a200 100644
--- a/webrtc/sdk/objc/Framework/Classes/RTCPeerConnection.mm
+++ b/webrtc/sdk/objc/Framework/Classes/RTCPeerConnection.mm
@@ -17,6 +17,7 @@
 #import "RTCMediaConstraints+Private.h"
 #import "RTCMediaStream+Private.h"
 #import "RTCPeerConnectionFactory+Private.h"
+#import "RTCRtpReceiver+Private.h"
 #import "RTCRtpSender+Private.h"
 #import "RTCSessionDescription+Private.h"
 #import "RTCStatsReport+Private.h"
@@ -342,6 +343,18 @@
   return senders;
 }
 
+- (NSArray<RTCRtpReceiver *> *)receivers {
+  std::vector<rtc::scoped_refptr<webrtc::RtpReceiverInterface>> nativeReceivers(
+      _peerConnection->GetReceivers());
+  NSMutableArray *receivers = [[NSMutableArray alloc] init];
+  for (const auto &nativeReceiver : nativeReceivers) {
+    RTCRtpReceiver *receiver =
+        [[RTCRtpReceiver alloc] initWithNativeRtpReceiver:nativeReceiver];
+    [receivers addObject:receiver];
+  }
+  return receivers;
+}
+
 #pragma mark - Private
 
 + (webrtc::PeerConnectionInterface::SignalingState)nativeSignalingStateForState:
diff --git a/webrtc/sdk/objc/Framework/Classes/RTCRtpReceiver+Private.h b/webrtc/sdk/objc/Framework/Classes/RTCRtpReceiver+Private.h
new file mode 100644
index 0000000..14b68fa
--- /dev/null
+++ b/webrtc/sdk/objc/Framework/Classes/RTCRtpReceiver+Private.h
@@ -0,0 +1,29 @@
+/*
+ *  Copyright 2016 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 "WebRTC/RTCRtpReceiver.h"
+
+#include "webrtc/api/rtpreceiverinterface.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface RTCRtpReceiver ()
+
+@property(nonatomic, readonly)
+    rtc::scoped_refptr<webrtc::RtpReceiverInterface> nativeRtpReceiver;
+
+/** Initialize an RTCRtpReceiver with a native RtpReceiverInterface. */
+- (instancetype)initWithNativeRtpReceiver:
+    (rtc::scoped_refptr<webrtc::RtpReceiverInterface>)nativeRtpReceiver
+    NS_DESIGNATED_INITIALIZER;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/webrtc/sdk/objc/Framework/Classes/RTCRtpReceiver.mm b/webrtc/sdk/objc/Framework/Classes/RTCRtpReceiver.mm
new file mode 100644
index 0000000..46c0e65
--- /dev/null
+++ b/webrtc/sdk/objc/Framework/Classes/RTCRtpReceiver.mm
@@ -0,0 +1,88 @@
+/*
+ *  Copyright 2016 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 "RTCRtpReceiver+Private.h"
+
+#import "NSString+StdString.h"
+#import "RTCMediaStreamTrack+Private.h"
+#import "RTCRtpParameters+Private.h"
+#import "WebRTC/RTCLogging.h"
+
+#include "webrtc/api/mediastreaminterface.h"
+
+@implementation RTCRtpReceiver {
+  rtc::scoped_refptr<webrtc::RtpReceiverInterface> _nativeRtpReceiver;
+}
+
+- (NSString *)receiverId {
+  return [NSString stringForStdString:_nativeRtpReceiver->id()];
+}
+
+- (RTCRtpParameters *)parameters {
+  return [[RTCRtpParameters alloc]
+      initWithNativeParameters:_nativeRtpReceiver->GetParameters()];
+}
+
+- (void)setParameters:(RTCRtpParameters *)parameters {
+  if (!_nativeRtpReceiver->SetParameters(parameters.nativeParameters)) {
+    RTCLogError(@"RTCRtpReceiver(%p): Failed to set parameters: %@", self,
+        parameters);
+  }
+}
+
+- (RTCMediaStreamTrack *)track {
+  rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> nativeTrack(
+    _nativeRtpReceiver->track());
+  if (nativeTrack) {
+    return [[RTCMediaStreamTrack alloc] initWithNativeTrack:nativeTrack];
+  }
+  return nil;
+}
+
+- (NSString *)description {
+  return [NSString stringWithFormat:@"RTCRtpReceiver {\n  receiverId: %@\n}",
+      self.receiverId];
+}
+
+- (BOOL)isEqual:(id)object {
+  if (self == object) {
+    return YES;
+  }
+  if (object == nil) {
+    return NO;
+  }
+  if (![object isMemberOfClass:[self class]]) {
+    return NO;
+  }
+  RTCRtpReceiver *receiver = (RTCRtpReceiver *)object;
+  return _nativeRtpReceiver == receiver.nativeRtpReceiver;
+}
+
+- (NSUInteger)hash {
+  return (NSUInteger)_nativeRtpReceiver.get();
+}
+
+#pragma mark - Private
+
+- (rtc::scoped_refptr<webrtc::RtpReceiverInterface>)nativeRtpReceiver {
+  return _nativeRtpReceiver;
+}
+
+- (instancetype)initWithNativeRtpReceiver:
+    (rtc::scoped_refptr<webrtc::RtpReceiverInterface>)nativeRtpReceiver {
+  if (self = [super init]) {
+    _nativeRtpReceiver = nativeRtpReceiver;
+    RTCLogInfo(
+        @"RTCRtpReceiver(%p): created receiver: %@", self, self.description);
+  }
+  return self;
+}
+
+@end
diff --git a/webrtc/sdk/objc/Framework/Classes/RTCRtpSender+Private.h b/webrtc/sdk/objc/Framework/Classes/RTCRtpSender+Private.h
index e871673..e372c52 100644
--- a/webrtc/sdk/objc/Framework/Classes/RTCRtpSender+Private.h
+++ b/webrtc/sdk/objc/Framework/Classes/RTCRtpSender+Private.h
@@ -16,6 +16,9 @@
 
 @interface RTCRtpSender ()
 
+@property(nonatomic, readonly)
+    rtc::scoped_refptr<webrtc::RtpSenderInterface> nativeRtpSender;
+
 /** Initialize an RTCRtpSender with a native RtpSenderInterface. */
 - (instancetype)initWithNativeRtpSender:
     (rtc::scoped_refptr<webrtc::RtpSenderInterface>)nativeRtpSender
diff --git a/webrtc/sdk/objc/Framework/Classes/RTCRtpSender.mm b/webrtc/sdk/objc/Framework/Classes/RTCRtpSender.mm
index 3d413dc..9ecf0ae 100644
--- a/webrtc/sdk/objc/Framework/Classes/RTCRtpSender.mm
+++ b/webrtc/sdk/objc/Framework/Classes/RTCRtpSender.mm
@@ -21,16 +21,6 @@
   rtc::scoped_refptr<webrtc::RtpSenderInterface> _nativeRtpSender;
 }
 
-- (instancetype)initWithNativeRtpSender:
-    (rtc::scoped_refptr<webrtc::RtpSenderInterface>)nativeRtpSender {
-  NSParameterAssert(nativeRtpSender);
-  if (self = [super init]) {
-    _nativeRtpSender = nativeRtpSender;
-    RTCLogInfo(@"RTCRtpSender(%p): created sender: %@", self, self.description);
-  }
-  return self;
-}
-
 - (NSString *)senderId {
   return [NSString stringForStdString:_nativeRtpSender->id()];
 }
@@ -67,4 +57,38 @@
       self.senderId];
 }
 
+- (BOOL)isEqual:(id)object {
+  if (self == object) {
+    return YES;
+  }
+  if (object == nil) {
+    return NO;
+  }
+  if (![object isMemberOfClass:[self class]]) {
+    return NO;
+  }
+  RTCRtpSender *sender = (RTCRtpSender *)object;
+  return _nativeRtpSender == sender.nativeRtpSender;
+}
+
+- (NSUInteger)hash {
+  return (NSUInteger)_nativeRtpSender.get();
+}
+
+#pragma mark - Private
+
+- (rtc::scoped_refptr<webrtc::RtpSenderInterface>)nativeRtpSender {
+  return _nativeRtpSender;
+}
+
+- (instancetype)initWithNativeRtpSender:
+    (rtc::scoped_refptr<webrtc::RtpSenderInterface>)nativeRtpSender {
+  NSParameterAssert(nativeRtpSender);
+  if (self = [super init]) {
+    _nativeRtpSender = nativeRtpSender;
+    RTCLogInfo(@"RTCRtpSender(%p): created sender: %@", self, self.description);
+  }
+  return self;
+}
+
 @end