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}
This commit is contained in:
@ -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;
|
||||
|
@ -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<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 @@ public class RtpTransceiver {
|
||||
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;
|
||||
|
@ -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<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 @@ 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;
|
||||
|
@ -24,7 +24,8 @@ ScopedJavaLocalRef<jobject> 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<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);
|
||||
|
@ -48,6 +48,12 @@ RtpTransceiverInit JavaToNativeRtpTransceiverInit(
|
||||
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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user