Reland "Add bindings for simulcast and RIDs in Android SDK."

This is a reland of 177670afd6d4aa414e4aa75983da538b7f350ee8
Fixing failing tests.

TBR=magjed@webrtc.org
Original change's description:
> Add bindings for simulcast and RIDs in Android SDK.
>
> This adds the bindings for rid in RtpParameters.Encoding and bindings
> for send_encodings in RtpTransceiverInit to allow creating a transceiver
> with multiple send encodings.
>
> Bug: webrtc:10464
> Change-Id: I4c205dc0f466768c63b7efcb3c68e93277236da0
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/128960
> Reviewed-by: Magnus Jedvert <magjed@webrtc.org>
> Reviewed-by: Seth Hampson <shampson@webrtc.org>
> Commit-Queue: Amit Hilbuch <amithi@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#27323}

Bug: webrtc:10464
Change-Id: I95fac3967217c20a9fdddb490aea30eca2061ef0
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/130362
Commit-Queue: Amit Hilbuch <amithi@webrtc.org>
Reviewed-by: Seth Hampson <shampson@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27402}
diff --git a/sdk/android/api/org/webrtc/RtpParameters.java b/sdk/android/api/org/webrtc/RtpParameters.java
index 5fe36ef..56d39ee 100644
--- a/sdk/android/api/org/webrtc/RtpParameters.java
+++ b/sdk/android/api/org/webrtc/RtpParameters.java
@@ -12,6 +12,7 @@
 
 import android.support.annotation.Nullable;
 import java.lang.Double;
+import java.lang.String;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -28,6 +29,9 @@
  */
 public class RtpParameters {
   public static class Encoding {
+    // If non-null, this represents the RID that identifies this encoding layer.
+    // RIDs are used to identify layers in simulcast.
+    @Nullable public String rid;
     // Set to true to cause this encoding to be sent, and false for it not to
     // be sent.
     public boolean active = true;
@@ -48,9 +52,17 @@
     // Can't be changed between getParameters/setParameters.
     public Long ssrc;
 
+    // This constructor is useful for creating simulcast layers.
+    Encoding(String rid, boolean active, Double scaleResolutionDownBy) {
+      this.rid = rid;
+      this.active = active;
+      this.scaleResolutionDownBy = scaleResolutionDownBy;
+    }
+
     @CalledByNative("Encoding")
-    Encoding(boolean active, Integer maxBitrateBps, Integer minBitrateBps, Integer maxFramerate,
-        Integer numTemporalLayers, Double scaleResolutionDownBy, Long ssrc) {
+    Encoding(String rid, boolean active, Integer maxBitrateBps, Integer minBitrateBps,
+        Integer maxFramerate, Integer numTemporalLayers, Double scaleResolutionDownBy, Long ssrc) {
+      this.rid = rid;
       this.active = active;
       this.maxBitrateBps = maxBitrateBps;
       this.minBitrateBps = minBitrateBps;
@@ -60,6 +72,12 @@
       this.ssrc = ssrc;
     }
 
+    @Nullable
+    @CalledByNative("Encoding")
+    String getRid() {
+      return rid;
+    }
+
     @CalledByNative("Encoding")
     boolean getActive() {
       return active;
diff --git a/sdk/android/api/org/webrtc/RtpTransceiver.java b/sdk/android/api/org/webrtc/RtpTransceiver.java
index 7f875e6..64d8eb4 100644
--- a/sdk/android/api/org/webrtc/RtpTransceiver.java
+++ b/sdk/android/api/org/webrtc/RtpTransceiver.java
@@ -14,6 +14,7 @@
 import java.util.Collections;
 import java.util.List;
 import org.webrtc.MediaStreamTrack;
+import org.webrtc.RtpParameters;
 
 /**
  * Java wrapper for a C++ RtpTransceiverInterface.
@@ -71,18 +72,25 @@
   public static final class RtpTransceiverInit {
     private final RtpTransceiverDirection direction;
     private final List<String> streamIds;
+    private final List<RtpParameters.Encoding> sendEncodings;
 
     public RtpTransceiverInit() {
       this(RtpTransceiverDirection.SEND_RECV);
     }
 
     public RtpTransceiverInit(RtpTransceiverDirection direction) {
-      this(direction, Collections.emptyList());
+      this(direction, Collections.emptyList(), Collections.emptyList());
     }
 
     public RtpTransceiverInit(RtpTransceiverDirection direction, List<String> streamIds) {
+      this(direction, streamIds, Collections.emptyList());
+    }
+
+    public RtpTransceiverInit(RtpTransceiverDirection direction, List<String> streamIds,
+        List<RtpParameters.Encoding> sendEncodings) {
       this.direction = direction;
       this.streamIds = new ArrayList<String>(streamIds);
+      this.sendEncodings = new ArrayList<RtpParameters.Encoding>(sendEncodings);
     }
 
     @CalledByNative("RtpTransceiverInit")
@@ -94,6 +102,11 @@
     List<String> getStreamIds() {
       return new ArrayList<String>(this.streamIds);
     }
+
+    @CalledByNative("RtpTransceiverInit")
+    List<RtpParameters.Encoding> getSendEncodings() {
+      return new ArrayList<RtpParameters.Encoding>(this.sendEncodings);
+    }
   }
 
   private long nativeRtpTransceiver;
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/PeerConnectionTest.java b/sdk/android/instrumentationtests/src/org/webrtc/PeerConnectionTest.java
index c4ff285..bf23d19 100644
--- a/sdk/android/instrumentationtests/src/org/webrtc/PeerConnectionTest.java
+++ b/sdk/android/instrumentationtests/src/org/webrtc/PeerConnectionTest.java
@@ -31,6 +31,7 @@
 import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.IdentityHashMap;
 import java.util.List;
@@ -50,6 +51,10 @@
 import org.webrtc.PeerConnection.PeerConnectionState;
 import org.webrtc.PeerConnection.SignalingState;
 import org.webrtc.PeerConnection.TlsCertPolicy;
+import org.webrtc.RtpParameters;
+import org.webrtc.RtpParameters.Encoding;
+import org.webrtc.RtpTransceiver;
+import org.webrtc.RtpTransceiver.RtpTransceiverInit;
 
 /** End-to-end tests for PeerConnection.java. */
 @RunWith(BaseJUnit4ClassRunner.class)
@@ -832,6 +837,33 @@
     assertNotNull(offeringPC);
   }
 
+  // Test that RIDs get set in the RTP sender when passed in through an RtpTransceiverInit.
+  @Test
+  @SmallTest
+  public void testSetRidInSimulcast() throws Exception {
+    PeerConnectionFactory factory = PeerConnectionFactory.builder().createPeerConnectionFactory();
+    PeerConnection.RTCConfiguration config = new PeerConnection.RTCConfiguration(Arrays.asList());
+    config.sdpSemantics = PeerConnection.SdpSemantics.UNIFIED_PLAN;
+    ObserverExpectations expectations = new ObserverExpectations("PCTest:simulcast_rids");
+    expectations.expectRenegotiationNeeded();
+    PeerConnection pc = factory.createPeerConnection(config, expectations);
+    List<Encoding> encodings = new ArrayList<Encoding>();
+    encodings.add(new Encoding("F", true, null));
+    encodings.add(new Encoding("H", true, null));
+    RtpTransceiverInit init = new RtpTransceiverInit(
+        RtpTransceiver.RtpTransceiverDirection.SEND_ONLY, Collections.emptyList(), encodings);
+    RtpTransceiver transceiver =
+        pc.addTransceiver(MediaStreamTrack.MediaType.MEDIA_TYPE_VIDEO, init);
+    RtpSender sender = transceiver.getSender();
+    RtpParameters parameters = sender.getParameters();
+    assertNotNull(parameters);
+    List<Encoding> sendEncodings = parameters.getEncodings();
+    assertNotNull(sendEncodings);
+    assertEquals(2, sendEncodings.size());
+    assertEquals("F", sendEncodings.get(0).getRid());
+    assertEquals("H", sendEncodings.get(1).getRid());
+  }
+
   @Test
   @MediumTest
   public void testCompleteSession() throws Exception {
@@ -1030,6 +1062,7 @@
     assertNull(rtpParameters.encodings.get(0).maxFramerate);
     assertNull(rtpParameters.encodings.get(0).numTemporalLayers);
     assertNull(rtpParameters.encodings.get(0).scaleResolutionDownBy);
+    assertTrue(rtpParameters.encodings.get(0).rid.isEmpty());
 
     rtpParameters.encodings.get(0).maxBitrateBps = 300000;
     rtpParameters.encodings.get(0).minBitrateBps = 100000;
diff --git a/sdk/android/src/jni/pc/rtp_parameters.cc b/sdk/android/src/jni/pc/rtp_parameters.cc
index 9b3c070..44a3d1a 100644
--- a/sdk/android/src/jni/pc/rtp_parameters.cc
+++ b/sdk/android/src/jni/pc/rtp_parameters.cc
@@ -24,7 +24,8 @@
     JNIEnv* env,
     const RtpEncodingParameters& encoding) {
   return Java_Encoding_Constructor(
-      env, encoding.active, NativeToJavaInteger(env, encoding.max_bitrate_bps),
+      env, NativeToJavaString(env, encoding.rid), encoding.active,
+      NativeToJavaInteger(env, encoding.max_bitrate_bps),
       NativeToJavaInteger(env, encoding.min_bitrate_bps),
       NativeToJavaInteger(env, encoding.max_framerate),
       NativeToJavaInteger(env, encoding.num_temporal_layers),
@@ -64,6 +65,11 @@
     JNIEnv* jni,
     const JavaRef<jobject>& j_encoding_parameters) {
   RtpEncodingParameters encoding;
+  ScopedJavaLocalRef<jstring> j_rid =
+      Java_Encoding_getRid(jni, j_encoding_parameters);
+  if (!IsNull(jni, j_rid)) {
+    encoding.rid = JavaToNativeString(jni, j_rid);
+  }
   encoding.active = Java_Encoding_getActive(jni, j_encoding_parameters);
   ScopedJavaLocalRef<jobject> j_max_bitrate =
       Java_Encoding_getMaxBitrateBps(jni, j_encoding_parameters);
diff --git a/sdk/android/src/jni/pc/rtp_transceiver.cc b/sdk/android/src/jni/pc/rtp_transceiver.cc
index a958bc9..52fcdad 100644
--- a/sdk/android/src/jni/pc/rtp_transceiver.cc
+++ b/sdk/android/src/jni/pc/rtp_transceiver.cc
@@ -48,6 +48,12 @@
       Java_RtpTransceiverInit_getStreamIds(jni, j_init);
   init.stream_ids = JavaListToNativeVector<std::string, jstring>(
       jni, j_stream_ids, &JavaToNativeString);
+
+  // Convert the send encodings.
+  ScopedJavaLocalRef<jobject> j_send_encodings =
+      Java_RtpTransceiverInit_getSendEncodings(jni, j_init);
+  init.send_encodings = JavaListToNativeVector<RtpEncodingParameters, jobject>(
+      jni, j_send_encodings, &JavaToNativeRtpEncodingParameters);
   return init;
 }