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 android.support.annotation.Nullable;
|
||||||
import java.lang.Double;
|
import java.lang.Double;
|
||||||
|
import java.lang.String;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -28,6 +29,9 @@ import org.webrtc.MediaStreamTrack;
|
|||||||
*/
|
*/
|
||||||
public class RtpParameters {
|
public class RtpParameters {
|
||||||
public static class Encoding {
|
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
|
// Set to true to cause this encoding to be sent, and false for it not to
|
||||||
// be sent.
|
// be sent.
|
||||||
public boolean active = true;
|
public boolean active = true;
|
||||||
@ -48,9 +52,17 @@ public class RtpParameters {
|
|||||||
// Can't be changed between getParameters/setParameters.
|
// Can't be changed between getParameters/setParameters.
|
||||||
public Long ssrc;
|
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")
|
@CalledByNative("Encoding")
|
||||||
Encoding(boolean active, Integer maxBitrateBps, Integer minBitrateBps, Integer maxFramerate,
|
Encoding(String rid, boolean active, Integer maxBitrateBps, Integer minBitrateBps,
|
||||||
Integer numTemporalLayers, Double scaleResolutionDownBy, Long ssrc) {
|
Integer maxFramerate, Integer numTemporalLayers, Double scaleResolutionDownBy, Long ssrc) {
|
||||||
|
this.rid = rid;
|
||||||
this.active = active;
|
this.active = active;
|
||||||
this.maxBitrateBps = maxBitrateBps;
|
this.maxBitrateBps = maxBitrateBps;
|
||||||
this.minBitrateBps = minBitrateBps;
|
this.minBitrateBps = minBitrateBps;
|
||||||
@ -60,6 +72,12 @@ public class RtpParameters {
|
|||||||
this.ssrc = ssrc;
|
this.ssrc = ssrc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@CalledByNative("Encoding")
|
||||||
|
String getRid() {
|
||||||
|
return rid;
|
||||||
|
}
|
||||||
|
|
||||||
@CalledByNative("Encoding")
|
@CalledByNative("Encoding")
|
||||||
boolean getActive() {
|
boolean getActive() {
|
||||||
return active;
|
return active;
|
||||||
|
@ -14,6 +14,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.webrtc.MediaStreamTrack;
|
import org.webrtc.MediaStreamTrack;
|
||||||
|
import org.webrtc.RtpParameters;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Java wrapper for a C++ RtpTransceiverInterface.
|
* Java wrapper for a C++ RtpTransceiverInterface.
|
||||||
@ -71,18 +72,25 @@ public class RtpTransceiver {
|
|||||||
public static final class RtpTransceiverInit {
|
public static final class RtpTransceiverInit {
|
||||||
private final RtpTransceiverDirection direction;
|
private final RtpTransceiverDirection direction;
|
||||||
private final List<String> streamIds;
|
private final List<String> streamIds;
|
||||||
|
private final List<RtpParameters.Encoding> sendEncodings;
|
||||||
|
|
||||||
public RtpTransceiverInit() {
|
public RtpTransceiverInit() {
|
||||||
this(RtpTransceiverDirection.SEND_RECV);
|
this(RtpTransceiverDirection.SEND_RECV);
|
||||||
}
|
}
|
||||||
|
|
||||||
public RtpTransceiverInit(RtpTransceiverDirection direction) {
|
public RtpTransceiverInit(RtpTransceiverDirection direction) {
|
||||||
this(direction, Collections.emptyList());
|
this(direction, Collections.emptyList(), Collections.emptyList());
|
||||||
}
|
}
|
||||||
|
|
||||||
public RtpTransceiverInit(RtpTransceiverDirection direction, List<String> streamIds) {
|
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.direction = direction;
|
||||||
this.streamIds = new ArrayList<String>(streamIds);
|
this.streamIds = new ArrayList<String>(streamIds);
|
||||||
|
this.sendEncodings = new ArrayList<RtpParameters.Encoding>(sendEncodings);
|
||||||
}
|
}
|
||||||
|
|
||||||
@CalledByNative("RtpTransceiverInit")
|
@CalledByNative("RtpTransceiverInit")
|
||||||
@ -94,6 +102,11 @@ public class RtpTransceiver {
|
|||||||
List<String> getStreamIds() {
|
List<String> getStreamIds() {
|
||||||
return new ArrayList<String>(this.streamIds);
|
return new ArrayList<String>(this.streamIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@CalledByNative("RtpTransceiverInit")
|
||||||
|
List<RtpParameters.Encoding> getSendEncodings() {
|
||||||
|
return new ArrayList<RtpParameters.Encoding>(this.sendEncodings);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private long nativeRtpTransceiver;
|
private long nativeRtpTransceiver;
|
||||||
|
@ -31,6 +31,7 @@ import java.nio.charset.Charset;
|
|||||||
import java.util.ArrayDeque;
|
import java.util.ArrayDeque;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.IdentityHashMap;
|
import java.util.IdentityHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -50,6 +51,10 @@ import org.webrtc.PeerConnection.IceGatheringState;
|
|||||||
import org.webrtc.PeerConnection.PeerConnectionState;
|
import org.webrtc.PeerConnection.PeerConnectionState;
|
||||||
import org.webrtc.PeerConnection.SignalingState;
|
import org.webrtc.PeerConnection.SignalingState;
|
||||||
import org.webrtc.PeerConnection.TlsCertPolicy;
|
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. */
|
/** End-to-end tests for PeerConnection.java. */
|
||||||
@RunWith(BaseJUnit4ClassRunner.class)
|
@RunWith(BaseJUnit4ClassRunner.class)
|
||||||
@ -832,6 +837,33 @@ public class PeerConnectionTest {
|
|||||||
assertNotNull(offeringPC);
|
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
|
@Test
|
||||||
@MediumTest
|
@MediumTest
|
||||||
public void testCompleteSession() throws Exception {
|
public void testCompleteSession() throws Exception {
|
||||||
@ -1030,6 +1062,7 @@ public class PeerConnectionTest {
|
|||||||
assertNull(rtpParameters.encodings.get(0).maxFramerate);
|
assertNull(rtpParameters.encodings.get(0).maxFramerate);
|
||||||
assertNull(rtpParameters.encodings.get(0).numTemporalLayers);
|
assertNull(rtpParameters.encodings.get(0).numTemporalLayers);
|
||||||
assertNull(rtpParameters.encodings.get(0).scaleResolutionDownBy);
|
assertNull(rtpParameters.encodings.get(0).scaleResolutionDownBy);
|
||||||
|
assertTrue(rtpParameters.encodings.get(0).rid.isEmpty());
|
||||||
|
|
||||||
rtpParameters.encodings.get(0).maxBitrateBps = 300000;
|
rtpParameters.encodings.get(0).maxBitrateBps = 300000;
|
||||||
rtpParameters.encodings.get(0).minBitrateBps = 100000;
|
rtpParameters.encodings.get(0).minBitrateBps = 100000;
|
||||||
|
@ -24,7 +24,8 @@ ScopedJavaLocalRef<jobject> NativeToJavaRtpEncodingParameter(
|
|||||||
JNIEnv* env,
|
JNIEnv* env,
|
||||||
const RtpEncodingParameters& encoding) {
|
const RtpEncodingParameters& encoding) {
|
||||||
return Java_Encoding_Constructor(
|
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.min_bitrate_bps),
|
||||||
NativeToJavaInteger(env, encoding.max_framerate),
|
NativeToJavaInteger(env, encoding.max_framerate),
|
||||||
NativeToJavaInteger(env, encoding.num_temporal_layers),
|
NativeToJavaInteger(env, encoding.num_temporal_layers),
|
||||||
@ -64,6 +65,11 @@ RtpEncodingParameters JavaToNativeRtpEncodingParameters(
|
|||||||
JNIEnv* jni,
|
JNIEnv* jni,
|
||||||
const JavaRef<jobject>& j_encoding_parameters) {
|
const JavaRef<jobject>& j_encoding_parameters) {
|
||||||
RtpEncodingParameters encoding;
|
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);
|
encoding.active = Java_Encoding_getActive(jni, j_encoding_parameters);
|
||||||
ScopedJavaLocalRef<jobject> j_max_bitrate =
|
ScopedJavaLocalRef<jobject> j_max_bitrate =
|
||||||
Java_Encoding_getMaxBitrateBps(jni, j_encoding_parameters);
|
Java_Encoding_getMaxBitrateBps(jni, j_encoding_parameters);
|
||||||
|
@ -48,6 +48,12 @@ RtpTransceiverInit JavaToNativeRtpTransceiverInit(
|
|||||||
Java_RtpTransceiverInit_getStreamIds(jni, j_init);
|
Java_RtpTransceiverInit_getStreamIds(jni, j_init);
|
||||||
init.stream_ids = JavaListToNativeVector<std::string, jstring>(
|
init.stream_ids = JavaListToNativeVector<std::string, jstring>(
|
||||||
jni, j_stream_ids, &JavaToNativeString);
|
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;
|
return init;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user