From ae4b62318dbad797c2ca0a4f71aa5e65a2445a4e Mon Sep 17 00:00:00 2001 From: Amit Hilbuch Date: Fri, 29 Mar 2019 14:02:42 -0700 Subject: [PATCH] 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 > Reviewed-by: Seth Hampson > Commit-Queue: Amit Hilbuch > 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 Reviewed-by: Seth Hampson Cr-Commit-Position: refs/heads/master@{#27402} --- sdk/android/api/org/webrtc/RtpParameters.java | 22 +++++++++++-- .../api/org/webrtc/RtpTransceiver.java | 15 ++++++++- .../src/org/webrtc/PeerConnectionTest.java | 33 +++++++++++++++++++ sdk/android/src/jni/pc/rtp_parameters.cc | 8 ++++- sdk/android/src/jni/pc/rtp_transceiver.cc | 6 ++++ 5 files changed, 80 insertions(+), 4 deletions(-) diff --git a/sdk/android/api/org/webrtc/RtpParameters.java b/sdk/android/api/org/webrtc/RtpParameters.java index 5fe36ef7ec..56d39ee9f1 100644 --- a/sdk/android/api/org/webrtc/RtpParameters.java +++ b/sdk/android/api/org/webrtc/RtpParameters.java @@ -12,6 +12,7 @@ package org.webrtc; 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 @@ import org.webrtc.MediaStreamTrack; */ 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 @@ public class RtpParameters { // 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 @@ public class RtpParameters { 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 7f875e6c8e..64d8eb41d1 100644 --- a/sdk/android/api/org/webrtc/RtpTransceiver.java +++ b/sdk/android/api/org/webrtc/RtpTransceiver.java @@ -14,6 +14,7 @@ import java.util.ArrayList; 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 class RtpTransceiver { public static final class RtpTransceiverInit { private final RtpTransceiverDirection direction; private final List streamIds; + private final List 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 streamIds) { + this(direction, streamIds, Collections.emptyList()); + } + + public RtpTransceiverInit(RtpTransceiverDirection direction, List streamIds, + List sendEncodings) { this.direction = direction; this.streamIds = new ArrayList(streamIds); + this.sendEncodings = new ArrayList(sendEncodings); } @CalledByNative("RtpTransceiverInit") @@ -94,6 +102,11 @@ public class RtpTransceiver { List getStreamIds() { return new ArrayList(this.streamIds); } + + @CalledByNative("RtpTransceiverInit") + List getSendEncodings() { + return new ArrayList(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 c4ff2859ac..bf23d19256 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.nio.charset.Charset; 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.IceGatheringState; 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 @@ public class PeerConnectionTest { 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 encodings = new ArrayList(); + 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 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 @@ public class PeerConnectionTest { 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 9b3c070c98..44a3d1a8b1 100644 --- a/sdk/android/src/jni/pc/rtp_parameters.cc +++ b/sdk/android/src/jni/pc/rtp_parameters.cc @@ -24,7 +24,8 @@ ScopedJavaLocalRef NativeToJavaRtpEncodingParameter( 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 @@ RtpEncodingParameters JavaToNativeRtpEncodingParameters( JNIEnv* jni, const JavaRef& j_encoding_parameters) { RtpEncodingParameters encoding; + ScopedJavaLocalRef 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 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 a958bc9cf8..52fcdadb84 100644 --- a/sdk/android/src/jni/pc/rtp_transceiver.cc +++ b/sdk/android/src/jni/pc/rtp_transceiver.cc @@ -48,6 +48,12 @@ RtpTransceiverInit JavaToNativeRtpTransceiverInit( Java_RtpTransceiverInit_getStreamIds(jni, j_init); init.stream_ids = JavaListToNativeVector( jni, j_stream_ids, &JavaToNativeString); + + // Convert the send encodings. + ScopedJavaLocalRef j_send_encodings = + Java_RtpTransceiverInit_getSendEncodings(jni, j_init); + init.send_encodings = JavaListToNativeVector( + jni, j_send_encodings, &JavaToNativeRtpEncodingParameters); return init; }