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;
}