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/api/java/jni/peerconnection_jni.cc b/webrtc/api/java/jni/peerconnection_jni.cc
index 09e8db2..6c5ba97 100644
--- a/webrtc/api/java/jni/peerconnection_jni.cc
+++ b/webrtc/api/java/jni/peerconnection_jni.cc
@@ -2031,10 +2031,19 @@
           .release());
 }
 
-static bool JavaEncodingToJsepRtpEncodingParameters(
+static void JavaRtpParametersToJsepRtpParameters(
     JNIEnv* jni,
-    jobject j_encodings,
-    std::vector<webrtc::RtpEncodingParameters>* encodings) {
+    jobject j_parameters,
+    webrtc::RtpParameters* parameters) {
+  RTC_CHECK(parameters != nullptr);
+  jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters");
+  jfieldID encodings_id =
+      GetFieldID(jni, parameters_class, "encodings", "Ljava/util/LinkedList;");
+  jfieldID codecs_id =
+      GetFieldID(jni, parameters_class, "codecs", "Ljava/util/LinkedList;");
+
+  // Convert encodings.
+  jobject j_encodings = GetObjectField(jni, j_parameters, encodings_id);
   const int kBitrateUnlimited = -1;
   jclass j_encoding_parameters_class =
       jni->FindClass("org/webrtc/RtpParameters$Encoding");
@@ -2057,15 +2066,11 @@
     } else {
       encoding.max_bitrate_bps = kBitrateUnlimited;
     }
-    encodings->push_back(encoding);
+    parameters->encodings.push_back(encoding);
   }
-  return true;
-}
 
-static bool JavaCodecToJsepRtpCodecParameters(
-    JNIEnv* jni,
-    jobject j_codecs,
-    std::vector<webrtc::RtpCodecParameters>* codecs) {
+  // Convert codecs.
+  jobject j_codecs = GetObjectField(jni, j_parameters, codecs_id);
   jclass codec_class = jni->FindClass("org/webrtc/RtpParameters$Codec");
   jfieldID payload_type_id = GetFieldID(jni, codec_class, "payloadType", "I");
   jfieldID mime_type_id =
@@ -2080,45 +2085,20 @@
         JavaToStdString(jni, GetStringField(jni, j_codec, mime_type_id));
     codec.clock_rate = GetIntField(jni, j_codec, clock_rate_id);
     codec.channels = GetIntField(jni, j_codec, channels_id);
-    codecs->push_back(codec);
+    parameters->codecs.push_back(codec);
   }
-  return true;
 }
 
-JOW(jboolean, RtpSender_nativeSetParameters)
-(JNIEnv* jni, jclass, jlong j_rtp_sender_pointer, jobject j_parameters) {
-  if (IsNull(jni, j_parameters)) {
-    return false;
-  }
-  jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters");
-  jclass encoding_class = jni->FindClass("org/webrtc/RtpParameters$Encoding");
-  jfieldID encodings_id =
-      GetFieldID(jni, parameters_class, "encodings", "Ljava/util/LinkedList;");
-  jfieldID codecs_id =
-      GetFieldID(jni, parameters_class, "codecs", "Ljava/util/LinkedList;");
-
-  jobject j_encodings = GetObjectField(jni, j_parameters, encodings_id);
-  jobject j_codecs = GetObjectField(jni, j_parameters, codecs_id);
-  webrtc::RtpParameters parameters;
-  JavaEncodingToJsepRtpEncodingParameters(jni, j_encodings,
-                                          &parameters.encodings);
-  JavaCodecToJsepRtpCodecParameters(jni, j_codecs, &parameters.codecs);
-  return reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer)
-      ->SetParameters(parameters);
-}
-
-JOW(jobject, RtpSender_nativeGetParameters)
-(JNIEnv* jni, jclass, jlong j_rtp_sender_pointer) {
-  webrtc::RtpParameters parameters =
-      reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer)
-          ->GetParameters();
-
+static jobject JsepRtpParametersToJavaRtpParameters(
+    JNIEnv* jni,
+    const webrtc::RtpParameters& parameters) {
   jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters");
   jmethodID parameters_ctor =
       GetMethodID(jni, parameters_class, "<init>", "()V");
   jobject j_parameters = jni->NewObject(parameters_class, parameters_ctor);
   CHECK_EXCEPTION(jni) << "error during NewObject";
 
+  // Add encodings.
   jclass encoding_class = jni->FindClass("org/webrtc/RtpParameters$Encoding");
   jmethodID encoding_ctor = GetMethodID(jni, encoding_class, "<init>", "()V");
   jfieldID encodings_id =
@@ -2153,6 +2133,7 @@
     RTC_CHECK(added);
   }
 
+  // Add codecs.
   jclass codec_class = jni->FindClass("org/webrtc/RtpParameters$Codec");
   jmethodID codec_ctor = GetMethodID(jni, codec_class, "<init>", "()V");
   jfieldID codecs_id =
@@ -2186,6 +2167,25 @@
   return j_parameters;
 }
 
+JOW(jboolean, RtpSender_nativeSetParameters)
+(JNIEnv* jni, jclass, jlong j_rtp_sender_pointer, jobject j_parameters) {
+  if (IsNull(jni, j_parameters)) {
+    return false;
+  }
+  webrtc::RtpParameters parameters;
+  JavaRtpParametersToJsepRtpParameters(jni, j_parameters, &parameters);
+  return reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer)
+      ->SetParameters(parameters);
+}
+
+JOW(jobject, RtpSender_nativeGetParameters)
+(JNIEnv* jni, jclass, jlong j_rtp_sender_pointer) {
+  webrtc::RtpParameters parameters =
+      reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer)
+          ->GetParameters();
+  return JsepRtpParametersToJavaRtpParameters(jni, parameters);
+}
+
 JOW(jstring, RtpSender_nativeId)(
     JNIEnv* jni, jclass, jlong j_rtp_sender_pointer) {
   return JavaStringFromStdString(
@@ -2206,6 +2206,25 @@
           .release());
 }
 
+JOW(jboolean, RtpReceiver_nativeSetParameters)
+(JNIEnv* jni, jclass, jlong j_rtp_sender_pointer, jobject j_parameters) {
+  if (IsNull(jni, j_parameters)) {
+    return false;
+  }
+  webrtc::RtpParameters parameters;
+  JavaRtpParametersToJsepRtpParameters(jni, j_parameters, &parameters);
+  return reinterpret_cast<RtpReceiverInterface*>(j_rtp_sender_pointer)
+      ->SetParameters(parameters);
+}
+
+JOW(jobject, RtpReceiver_nativeGetParameters)
+(JNIEnv* jni, jclass, jlong j_rtp_sender_pointer) {
+  webrtc::RtpParameters parameters =
+      reinterpret_cast<RtpReceiverInterface*>(j_rtp_sender_pointer)
+          ->GetParameters();
+  return JsepRtpParametersToJavaRtpParameters(jni, parameters);
+}
+
 JOW(jstring, RtpReceiver_nativeId)(
     JNIEnv* jni, jclass, jlong j_rtp_receiver_pointer) {
   return JavaStringFromStdString(
diff --git a/webrtc/api/java/src/org/webrtc/RtpReceiver.java b/webrtc/api/java/src/org/webrtc/RtpReceiver.java
index 04a5d2a..1c4eef3 100644
--- a/webrtc/api/java/src/org/webrtc/RtpReceiver.java
+++ b/webrtc/api/java/src/org/webrtc/RtpReceiver.java
@@ -27,6 +27,14 @@
     return cachedTrack;
   }
 
+  public boolean setParameters(RtpParameters parameters) {
+    return nativeSetParameters(nativeRtpReceiver, parameters);
+  }
+
+  public RtpParameters getParameters() {
+    return nativeGetParameters(nativeRtpReceiver);
+  }
+
   public String id() {
     return nativeId(nativeRtpReceiver);
   }
@@ -40,6 +48,11 @@
   // Will be released in dispose().
   private static native long nativeGetTrack(long nativeRtpReceiver);
 
+  private static native boolean nativeSetParameters(long nativeRtpReceiver,
+                                                    RtpParameters parameters);
+
+  private static native RtpParameters nativeGetParameters(long nativeRtpReceiver);
+
   private static native String nativeId(long nativeRtpReceiver);
 
   private static native void free(long nativeRtpReceiver);
diff --git a/webrtc/api/mediastreamprovider.h b/webrtc/api/mediastreamprovider.h
index 8c866f0..b23e17b 100644
--- a/webrtc/api/mediastreamprovider.h
+++ b/webrtc/api/mediastreamprovider.h
@@ -63,9 +63,14 @@
       uint32_t ssrc,
       std::unique_ptr<webrtc::AudioSinkInterface> sink) = 0;
 
-  virtual RtpParameters GetAudioRtpParameters(uint32_t ssrc) const = 0;
-  virtual bool SetAudioRtpParameters(uint32_t ssrc,
-                                     const RtpParameters& parameters) = 0;
+  virtual RtpParameters GetAudioRtpSendParameters(uint32_t ssrc) const = 0;
+  virtual bool SetAudioRtpSendParameters(uint32_t ssrc,
+                                         const RtpParameters& parameters) = 0;
+
+  virtual RtpParameters GetAudioRtpReceiveParameters(uint32_t ssrc) const = 0;
+  virtual bool SetAudioRtpReceiveParameters(
+      uint32_t ssrc,
+      const RtpParameters& parameters) = 0;
 
  protected:
   virtual ~AudioProviderInterface() {}
@@ -88,9 +93,14 @@
                             bool enable,
                             const cricket::VideoOptions* options) = 0;
 
-  virtual RtpParameters GetVideoRtpParameters(uint32_t ssrc) const = 0;
-  virtual bool SetVideoRtpParameters(uint32_t ssrc,
-                                     const RtpParameters& parameters) = 0;
+  virtual RtpParameters GetVideoRtpSendParameters(uint32_t ssrc) const = 0;
+  virtual bool SetVideoRtpSendParameters(uint32_t ssrc,
+                                         const RtpParameters& parameters) = 0;
+
+  virtual RtpParameters GetVideoRtpReceiveParameters(uint32_t ssrc) const = 0;
+  virtual bool SetVideoRtpReceiveParameters(
+      uint32_t ssrc,
+      const RtpParameters& parameters) = 0;
 
  protected:
   virtual ~VideoProviderInterface() {}
diff --git a/webrtc/api/rtpparameters.h b/webrtc/api/rtpparameters.h
index 729f841..5c79ab4 100644
--- a/webrtc/api/rtpparameters.h
+++ b/webrtc/api/rtpparameters.h
@@ -25,6 +25,9 @@
   bool operator==(const RtpEncodingParameters& o) const {
     return active == o.active && max_bitrate_bps == o.max_bitrate_bps;
   }
+  bool operator!=(const RtpEncodingParameters& o) const {
+    return !(*this == o);
+  }
 };
 
 struct RtpCodecParameters {
@@ -38,6 +41,7 @@
     return payload_type == o.payload_type && mime_type == o.mime_type &&
            clock_rate == o.clock_rate && channels == o.channels;
   }
+  bool operator!=(const RtpCodecParameters& o) const { return !(*this == o); }
 };
 
 struct RtpParameters {
@@ -47,6 +51,7 @@
   bool operator==(const RtpParameters& o) const {
     return encodings == o.encodings && codecs == o.codecs;
   }
+  bool operator!=(const RtpParameters& o) const { return !(*this == o); }
 };
 
 }  // namespace webrtc
diff --git a/webrtc/api/rtpreceiver.cc b/webrtc/api/rtpreceiver.cc
index 38245dc..1b52ce2 100644
--- a/webrtc/api/rtpreceiver.cc
+++ b/webrtc/api/rtpreceiver.cc
@@ -14,6 +14,7 @@
 #include "webrtc/api/audiotrack.h"
 #include "webrtc/api/videosourceproxy.h"
 #include "webrtc/api/videotrack.h"
+#include "webrtc/base/trace_event.h"
 
 namespace webrtc {
 
@@ -66,6 +67,15 @@
   provider_ = nullptr;
 }
 
+RtpParameters AudioRtpReceiver::GetParameters() const {
+  return provider_->GetAudioRtpReceiveParameters(ssrc_);
+}
+
+bool AudioRtpReceiver::SetParameters(const RtpParameters& parameters) {
+  TRACE_EVENT0("webrtc", "AudioRtpReceiver::SetParameters");
+  return provider_->SetAudioRtpReceiveParameters(ssrc_, parameters);
+}
+
 void AudioRtpReceiver::Reconfigure() {
   if (!provider_) {
     return;
@@ -113,4 +123,13 @@
   provider_ = nullptr;
 }
 
+RtpParameters VideoRtpReceiver::GetParameters() const {
+  return provider_->GetVideoRtpReceiveParameters(ssrc_);
+}
+
+bool VideoRtpReceiver::SetParameters(const RtpParameters& parameters) {
+  TRACE_EVENT0("webrtc", "VideoRtpReceiver::SetParameters");
+  return provider_->SetVideoRtpReceiveParameters(ssrc_, parameters);
+}
+
 }  // namespace webrtc
diff --git a/webrtc/api/rtpreceiver.h b/webrtc/api/rtpreceiver.h
index b581857..2e7339d 100644
--- a/webrtc/api/rtpreceiver.h
+++ b/webrtc/api/rtpreceiver.h
@@ -56,6 +56,9 @@
 
   void Stop() override;
 
+  RtpParameters GetParameters() const override;
+  bool SetParameters(const RtpParameters& parameters) override;
+
  private:
   void Reconfigure();
 
@@ -89,6 +92,9 @@
 
   void Stop() override;
 
+  RtpParameters GetParameters() const override;
+  bool SetParameters(const RtpParameters& parameters) override;
+
  private:
   std::string id_;
   uint32_t ssrc_;
diff --git a/webrtc/api/rtpreceiverinterface.h b/webrtc/api/rtpreceiverinterface.h
index c2a579b..ef4f0e1 100644
--- a/webrtc/api/rtpreceiverinterface.h
+++ b/webrtc/api/rtpreceiverinterface.h
@@ -33,6 +33,12 @@
 
   virtual void Stop() = 0;
 
+  // The WebRTC specification only defines RTCRtpParameters in terms of senders,
+  // but this API also applies them to receivers, similar to ORTC:
+  // http://ortc.org/wp-content/uploads/2016/03/ortc.html#rtcrtpparameters*.
+  virtual RtpParameters GetParameters() const = 0;
+  virtual bool SetParameters(const RtpParameters& parameters) = 0;
+
  protected:
   virtual ~RtpReceiverInterface() {}
 };
@@ -42,6 +48,8 @@
 PROXY_CONSTMETHOD0(rtc::scoped_refptr<MediaStreamTrackInterface>, track)
 PROXY_CONSTMETHOD0(std::string, id)
 PROXY_METHOD0(void, Stop)
+PROXY_CONSTMETHOD0(RtpParameters, GetParameters);
+PROXY_METHOD1(bool, SetParameters, const RtpParameters&)
 END_SIGNALING_PROXY()
 
 }  // namespace webrtc
diff --git a/webrtc/api/rtpsender.cc b/webrtc/api/rtpsender.cc
index 360b686..5577b9c 100644
--- a/webrtc/api/rtpsender.cc
+++ b/webrtc/api/rtpsender.cc
@@ -208,12 +208,12 @@
 }
 
 RtpParameters AudioRtpSender::GetParameters() const {
-  return provider_->GetAudioRtpParameters(ssrc_);
+  return provider_->GetAudioRtpSendParameters(ssrc_);
 }
 
 bool AudioRtpSender::SetParameters(const RtpParameters& parameters) {
   TRACE_EVENT0("webrtc", "AudioRtpSender::SetParameters");
-  return provider_->SetAudioRtpParameters(ssrc_, parameters);
+  return provider_->SetAudioRtpSendParameters(ssrc_, parameters);
 }
 
 VideoRtpSender::VideoRtpSender(VideoTrackInterface* track,
@@ -350,12 +350,12 @@
 }
 
 RtpParameters VideoRtpSender::GetParameters() const {
-  return provider_->GetVideoRtpParameters(ssrc_);
+  return provider_->GetVideoRtpSendParameters(ssrc_);
 }
 
 bool VideoRtpSender::SetParameters(const RtpParameters& parameters) {
   TRACE_EVENT0("webrtc", "VideoRtpSender::SetParameters");
-  return provider_->SetVideoRtpParameters(ssrc_, parameters);
+  return provider_->SetVideoRtpSendParameters(ssrc_, parameters);
 }
 
 }  // namespace webrtc
diff --git a/webrtc/api/rtpsenderreceiver_unittest.cc b/webrtc/api/rtpsenderreceiver_unittest.cc
index f8b968f..3db9d5e 100644
--- a/webrtc/api/rtpsenderreceiver_unittest.cc
+++ b/webrtc/api/rtpsenderreceiver_unittest.cc
@@ -59,8 +59,12 @@
                     const cricket::AudioOptions& options,
                     cricket::AudioSource* source));
   MOCK_METHOD2(SetAudioPlayoutVolume, void(uint32_t ssrc, double volume));
-  MOCK_CONST_METHOD1(GetAudioRtpParameters, RtpParameters(uint32_t ssrc));
-  MOCK_METHOD2(SetAudioRtpParameters,
+  MOCK_CONST_METHOD1(GetAudioRtpSendParameters, RtpParameters(uint32_t ssrc));
+  MOCK_METHOD2(SetAudioRtpSendParameters,
+               bool(uint32_t ssrc, const RtpParameters&));
+  MOCK_CONST_METHOD1(GetAudioRtpReceiveParameters,
+                     RtpParameters(uint32_t ssrc));
+  MOCK_METHOD2(SetAudioRtpReceiveParameters,
                bool(uint32_t ssrc, const RtpParameters&));
 
   void SetRawAudioSink(
@@ -88,8 +92,12 @@
                     bool enable,
                     const cricket::VideoOptions* options));
 
-  MOCK_CONST_METHOD1(GetVideoRtpParameters, RtpParameters(uint32_t ssrc));
-  MOCK_METHOD2(SetVideoRtpParameters,
+  MOCK_CONST_METHOD1(GetVideoRtpSendParameters, RtpParameters(uint32_t ssrc));
+  MOCK_METHOD2(SetVideoRtpSendParameters,
+               bool(uint32_t ssrc, const RtpParameters&));
+  MOCK_CONST_METHOD1(GetVideoRtpReceiveParameters,
+                     RtpParameters(uint32_t ssrc));
+  MOCK_METHOD2(SetVideoRtpReceiveParameters,
                bool(uint32_t ssrc, const RtpParameters&));
 };
 
@@ -504,9 +512,9 @@
 TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
   CreateAudioRtpSender();
 
-  EXPECT_CALL(audio_provider_, GetAudioRtpParameters(kAudioSsrc))
+  EXPECT_CALL(audio_provider_, GetAudioRtpSendParameters(kAudioSsrc))
       .WillOnce(Return(RtpParameters()));
-  EXPECT_CALL(audio_provider_, SetAudioRtpParameters(kAudioSsrc, _))
+  EXPECT_CALL(audio_provider_, SetAudioRtpSendParameters(kAudioSsrc, _))
       .WillOnce(Return(true));
   RtpParameters params = audio_rtp_sender_->GetParameters();
   EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
@@ -517,9 +525,9 @@
 TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
   CreateVideoRtpSender();
 
-  EXPECT_CALL(video_provider_, GetVideoRtpParameters(kVideoSsrc))
+  EXPECT_CALL(video_provider_, GetVideoRtpSendParameters(kVideoSsrc))
       .WillOnce(Return(RtpParameters()));
-  EXPECT_CALL(video_provider_, SetVideoRtpParameters(kVideoSsrc, _))
+  EXPECT_CALL(video_provider_, SetVideoRtpSendParameters(kVideoSsrc, _))
       .WillOnce(Return(true));
   RtpParameters params = video_rtp_sender_->GetParameters();
   EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
@@ -527,4 +535,30 @@
   DestroyVideoRtpSender();
 }
 
+TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
+  CreateAudioRtpReceiver();
+
+  EXPECT_CALL(audio_provider_, GetAudioRtpReceiveParameters(kAudioSsrc))
+      .WillOnce(Return(RtpParameters()));
+  EXPECT_CALL(audio_provider_, SetAudioRtpReceiveParameters(kAudioSsrc, _))
+      .WillOnce(Return(true));
+  RtpParameters params = audio_rtp_receiver_->GetParameters();
+  EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
+
+  DestroyAudioRtpReceiver();
+}
+
+TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
+  CreateVideoRtpReceiver();
+
+  EXPECT_CALL(video_provider_, GetVideoRtpReceiveParameters(kVideoSsrc))
+      .WillOnce(Return(RtpParameters()));
+  EXPECT_CALL(video_provider_, SetVideoRtpReceiveParameters(kVideoSsrc, _))
+      .WillOnce(Return(true));
+  RtpParameters params = video_rtp_receiver_->GetParameters();
+  EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
+
+  DestroyVideoRtpReceiver();
+}
+
 }  // namespace webrtc
diff --git a/webrtc/api/webrtcsession.cc b/webrtc/api/webrtcsession.cc
index 2b146c6..96442c8 100644
--- a/webrtc/api/webrtcsession.cc
+++ b/webrtc/api/webrtcsession.cc
@@ -1219,21 +1219,39 @@
   voice_channel_->SetRawAudioSink(ssrc, std::move(sink));
 }
 
-RtpParameters WebRtcSession::GetAudioRtpParameters(uint32_t ssrc) const {
+RtpParameters WebRtcSession::GetAudioRtpSendParameters(uint32_t ssrc) const {
   ASSERT(signaling_thread()->IsCurrent());
   if (voice_channel_) {
-    return voice_channel_->GetRtpParameters(ssrc);
+    return voice_channel_->GetRtpSendParameters(ssrc);
   }
   return RtpParameters();
 }
 
-bool WebRtcSession::SetAudioRtpParameters(uint32_t ssrc,
-                                          const RtpParameters& parameters) {
+bool WebRtcSession::SetAudioRtpSendParameters(uint32_t ssrc,
+                                              const RtpParameters& parameters) {
   ASSERT(signaling_thread()->IsCurrent());
   if (!voice_channel_) {
     return false;
   }
-  return voice_channel_->SetRtpParameters(ssrc, parameters);
+  return voice_channel_->SetRtpSendParameters(ssrc, parameters);
+}
+
+RtpParameters WebRtcSession::GetAudioRtpReceiveParameters(uint32_t ssrc) const {
+  ASSERT(signaling_thread()->IsCurrent());
+  if (voice_channel_) {
+    return voice_channel_->GetRtpReceiveParameters(ssrc);
+  }
+  return RtpParameters();
+}
+
+bool WebRtcSession::SetAudioRtpReceiveParameters(
+    uint32_t ssrc,
+    const RtpParameters& parameters) {
+  ASSERT(signaling_thread()->IsCurrent());
+  if (!voice_channel_) {
+    return false;
+  }
+  return voice_channel_->SetRtpReceiveParameters(ssrc, parameters);
 }
 
 bool WebRtcSession::SetSource(
@@ -1284,21 +1302,39 @@
   }
 }
 
-RtpParameters WebRtcSession::GetVideoRtpParameters(uint32_t ssrc) const {
+RtpParameters WebRtcSession::GetVideoRtpSendParameters(uint32_t ssrc) const {
   ASSERT(signaling_thread()->IsCurrent());
   if (video_channel_) {
-    return video_channel_->GetRtpParameters(ssrc);
+    return video_channel_->GetRtpSendParameters(ssrc);
   }
   return RtpParameters();
 }
 
-bool WebRtcSession::SetVideoRtpParameters(uint32_t ssrc,
-                                          const RtpParameters& parameters) {
+bool WebRtcSession::SetVideoRtpSendParameters(uint32_t ssrc,
+                                              const RtpParameters& parameters) {
   ASSERT(signaling_thread()->IsCurrent());
   if (!video_channel_) {
     return false;
   }
-  return video_channel_->SetRtpParameters(ssrc, parameters);
+  return video_channel_->SetRtpSendParameters(ssrc, parameters);
+}
+
+RtpParameters WebRtcSession::GetVideoRtpReceiveParameters(uint32_t ssrc) const {
+  ASSERT(signaling_thread()->IsCurrent());
+  if (video_channel_) {
+    return video_channel_->GetRtpReceiveParameters(ssrc);
+  }
+  return RtpParameters();
+}
+
+bool WebRtcSession::SetVideoRtpReceiveParameters(
+    uint32_t ssrc,
+    const RtpParameters& parameters) {
+  ASSERT(signaling_thread()->IsCurrent());
+  if (!video_channel_) {
+    return false;
+  }
+  return video_channel_->SetRtpReceiveParameters(ssrc, parameters);
 }
 
 bool WebRtcSession::CanInsertDtmf(const std::string& track_id) {
diff --git a/webrtc/api/webrtcsession.h b/webrtc/api/webrtcsession.h
index 8a32d78f..d0a5cd4 100644
--- a/webrtc/api/webrtcsession.h
+++ b/webrtc/api/webrtcsession.h
@@ -243,9 +243,12 @@
   void SetRawAudioSink(uint32_t ssrc,
                        std::unique_ptr<AudioSinkInterface> sink) override;
 
-  RtpParameters GetAudioRtpParameters(uint32_t ssrc) const override;
-  bool SetAudioRtpParameters(uint32_t ssrc,
-                             const RtpParameters& parameters) override;
+  RtpParameters GetAudioRtpSendParameters(uint32_t ssrc) const override;
+  bool SetAudioRtpSendParameters(uint32_t ssrc,
+                                 const RtpParameters& parameters) override;
+  RtpParameters GetAudioRtpReceiveParameters(uint32_t ssrc) const override;
+  bool SetAudioRtpReceiveParameters(uint32_t ssrc,
+                                    const RtpParameters& parameters) override;
 
   // Implements VideoMediaProviderInterface.
   bool SetSource(
@@ -259,9 +262,12 @@
                     bool enable,
                     const cricket::VideoOptions* options) override;
 
-  RtpParameters GetVideoRtpParameters(uint32_t ssrc) const override;
-  bool SetVideoRtpParameters(uint32_t ssrc,
-                             const RtpParameters& parameters) override;
+  RtpParameters GetVideoRtpSendParameters(uint32_t ssrc) const override;
+  bool SetVideoRtpSendParameters(uint32_t ssrc,
+                                 const RtpParameters& parameters) override;
+  RtpParameters GetVideoRtpReceiveParameters(uint32_t ssrc) const override;
+  bool SetVideoRtpReceiveParameters(uint32_t ssrc,
+                                    const RtpParameters& parameters) override;
 
   // Implements DtmfProviderInterface.
   bool CanInsertDtmf(const std::string& track_id) override;
diff --git a/webrtc/api/webrtcsession_unittest.cc b/webrtc/api/webrtcsession_unittest.cc
index cd5e784..d81aece 100644
--- a/webrtc/api/webrtcsession_unittest.cc
+++ b/webrtc/api/webrtcsession_unittest.cc
@@ -3358,19 +3358,19 @@
   ASSERT_TRUE(channel != NULL);
   uint32_t send_ssrc = channel->send_streams()[0].first_ssrc();
   EXPECT_EQ(-1, channel->max_bps());
-  webrtc::RtpParameters params = session_->GetAudioRtpParameters(send_ssrc);
+  webrtc::RtpParameters params = session_->GetAudioRtpSendParameters(send_ssrc);
   EXPECT_EQ(1, params.encodings.size());
   EXPECT_EQ(-1, params.encodings[0].max_bitrate_bps);
   params.encodings[0].max_bitrate_bps = 1000;
-  EXPECT_TRUE(session_->SetAudioRtpParameters(send_ssrc, params));
+  EXPECT_TRUE(session_->SetAudioRtpSendParameters(send_ssrc, params));
 
   // Read back the parameters and verify they have been changed.
-  params = session_->GetAudioRtpParameters(send_ssrc);
+  params = session_->GetAudioRtpSendParameters(send_ssrc);
   EXPECT_EQ(1, params.encodings.size());
   EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
 
   // Verify that the audio channel received the new parameters.
-  params = channel->GetRtpParameters(send_ssrc);
+  params = channel->GetRtpSendParameters(send_ssrc);
   EXPECT_EQ(1, params.encodings.size());
   EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
 
@@ -3452,19 +3452,19 @@
   ASSERT_TRUE(channel != NULL);
   uint32_t send_ssrc = channel->send_streams()[0].first_ssrc();
   EXPECT_EQ(-1, channel->max_bps());
-  webrtc::RtpParameters params = session_->GetVideoRtpParameters(send_ssrc);
+  webrtc::RtpParameters params = session_->GetVideoRtpSendParameters(send_ssrc);
   EXPECT_EQ(1, params.encodings.size());
   EXPECT_EQ(-1, params.encodings[0].max_bitrate_bps);
   params.encodings[0].max_bitrate_bps = 1000;
-  EXPECT_TRUE(session_->SetVideoRtpParameters(send_ssrc, params));
+  EXPECT_TRUE(session_->SetVideoRtpSendParameters(send_ssrc, params));
 
   // Read back the parameters and verify they have been changed.
-  params = session_->GetVideoRtpParameters(send_ssrc);
+  params = session_->GetVideoRtpSendParameters(send_ssrc);
   EXPECT_EQ(1, params.encodings.size());
   EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
 
   // Verify that the video channel received the new parameters.
-  params = channel->GetRtpParameters(send_ssrc);
+  params = channel->GetRtpSendParameters(send_ssrc);
   EXPECT_EQ(1, params.encodings.size());
   EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);