Chromium Code Reviews| Index: talk/app/webrtc/java/src/org/webrtc/PeerConnection.java |
| diff --git a/talk/app/webrtc/java/src/org/webrtc/PeerConnection.java b/talk/app/webrtc/java/src/org/webrtc/PeerConnection.java |
| index 8730af96c90035f42e767f73e913f5c849ead55d..ac9009cc2222dd714340a178bde26b8de3198c9e 100644 |
| --- a/talk/app/webrtc/java/src/org/webrtc/PeerConnection.java |
| +++ b/talk/app/webrtc/java/src/org/webrtc/PeerConnection.java |
| @@ -161,6 +161,8 @@ public class PeerConnection { |
| }; |
| private final List<MediaStream> localStreams; |
| + private final List<RtpSender> rtpSenders; |
| + private final List<RtpReceiver> rtpReceivers; |
|
pthatcher1
2015/09/23 14:47:39
I'd just shorten these to senders and receivers.
|
| private final long nativePeerConnection; |
| private final long nativeObserver; |
| @@ -168,6 +170,8 @@ public class PeerConnection { |
| this.nativePeerConnection = nativePeerConnection; |
| this.nativeObserver = nativeObserver; |
| localStreams = new LinkedList<MediaStream>(); |
| + rtpSenders = new LinkedList<RtpSender>(); |
| + rtpReceivers = new LinkedList<RtpReceiver>(); |
| } |
| // JsepInterface. |
| @@ -184,11 +188,15 @@ public class PeerConnection { |
| public native void createAnswer( |
| SdpObserver observer, MediaConstraints constraints); |
| - public native void setLocalDescription( |
| - SdpObserver observer, SessionDescription sdp); |
| + public void setLocalDescription(SdpObserver observer, SessionDescription sdp) { |
| + nativeSetLocalDescription(observer, sdp); |
| + updateRtpSenders(); |
| + } |
| - public native void setRemoteDescription( |
| - SdpObserver observer, SessionDescription sdp); |
| + public void setRemoteDescription(SdpObserver observer, SessionDescription sdp) { |
| + nativeSetRemoteDescription(observer, sdp); |
| + updateRtpReceivers(); |
| + } |
| public native boolean updateIce( |
| List<IceServer> iceServers, MediaConstraints constraints); |
| @@ -204,12 +212,22 @@ public class PeerConnection { |
| return false; |
| } |
| localStreams.add(stream); |
| + updateRtpSenders(); |
| return true; |
| } |
| public void removeStream(MediaStream stream) { |
| nativeRemoveLocalStream(stream.nativeStream); |
| localStreams.remove(stream); |
| + updateRtpSenders(); |
| + } |
| + |
| + public List<RtpSender> getSenders() { |
| + return new ArrayList<RtpSender>(rtpSenders); |
| + } |
| + |
| + public List<RtpReceiver> getReceivers() { |
| + return new ArrayList<RtpReceiver>(rtpReceivers); |
| } |
| public boolean getStats(StatsObserver observer, MediaStreamTrack track) { |
| @@ -233,6 +251,14 @@ public class PeerConnection { |
| stream.dispose(); |
| } |
| localStreams.clear(); |
| + for (RtpSender sender : rtpSenders) { |
| + sender.dispose(); |
| + } |
| + rtpSenders.clear(); |
| + for (RtpReceiver receiver : rtpReceivers) { |
| + receiver.dispose(); |
| + } |
| + rtpReceivers.clear(); |
| freePeerConnection(nativePeerConnection); |
| freeObserver(nativeObserver); |
| } |
| @@ -241,13 +267,99 @@ public class PeerConnection { |
| private static native void freeObserver(long nativeObserver); |
| + private void updateRtpSenders() { |
| + List<RtpSender> newRtpSenders = nativeGetSenders(); |
| + |
| + // Remove obsolete senders. |
| + ArrayList<RtpSender> toRemove = new ArrayList<RtpSender>(); |
| + for (RtpSender oldSender : rtpSenders) { |
| + boolean found = false; |
| + for (RtpSender newSender : newRtpSenders) { |
| + if (newSender.nativeRtpSender == oldSender.nativeRtpSender) { |
| + found = true; |
| + break; |
| + } |
| + } |
| + if (!found) { |
| + toRemove.add(oldSender); |
| + } |
| + } |
| + for (RtpSender removed : toRemove) { |
| + rtpSenders.remove(removed); |
| + removed.dispose(); |
| + } |
| + |
| + // Add new senders. |
| + for (RtpSender newSender : newRtpSenders) { |
| + boolean found = false; |
| + for (RtpSender oldSender : rtpSenders) { |
| + if (newSender.nativeRtpSender == oldSender.nativeRtpSender) { |
| + found = true; |
| + // Dispose of the duplicate RtpSender. |
| + newSender.dispose(); |
| + break; |
| + } |
| + } |
| + if (!found) { |
| + rtpSenders.add(newSender); |
| + } |
| + } |
| + } |
| + |
| + private void updateRtpReceivers() { |
| + List<RtpReceiver> newRtpReceivers = nativeGetReceivers(); |
| + |
| + // Remove obsolete receivers. |
| + ArrayList<RtpReceiver> toRemove = new ArrayList<RtpReceiver>(); |
| + for (RtpReceiver oldReceiver : rtpReceivers) { |
| + boolean found = false; |
| + for (RtpReceiver newReceiver : newRtpReceivers) { |
| + if (newReceiver.nativeRtpReceiver == oldReceiver.nativeRtpReceiver) { |
| + found = true; |
| + break; |
| + } |
| + } |
| + if (!found) { |
| + toRemove.add(oldReceiver); |
| + } |
| + } |
| + for (RtpReceiver removed : toRemove) { |
| + rtpReceivers.remove(removed); |
| + removed.dispose(); |
| + } |
| + |
| + // Add new receivers. |
| + for (RtpReceiver newReceiver : newRtpReceivers) { |
| + boolean found = false; |
| + for (RtpReceiver oldReceiver : rtpReceivers) { |
| + if (newReceiver.nativeRtpReceiver == oldReceiver.nativeRtpReceiver) { |
| + found = true; |
| + // Dispose of the duplicate RtpReceiver. |
| + newReceiver.dispose(); |
| + break; |
| + } |
| + } |
| + if (!found) { |
| + rtpReceivers.add(newReceiver); |
| + } |
| + } |
|
pthatcher1
2015/09/23 14:47:39
It seems like a helper method called hasReceiver c
|
| + } |
| + |
| private native boolean nativeAddIceCandidate( |
| String sdpMid, int sdpMLineIndex, String iceCandidateSdp); |
| + public native void nativeSetLocalDescription(SdpObserver observer, SessionDescription sdp); |
| + |
| + public native void nativeSetRemoteDescription(SdpObserver observer, SessionDescription sdp); |
| + |
| private native boolean nativeAddLocalStream(long nativeStream); |
| private native void nativeRemoveLocalStream(long nativeStream); |
| private native boolean nativeGetStats( |
| StatsObserver observer, long nativeTrack); |
| + |
| + private native List<RtpSender> nativeGetSenders(); |
| + |
| + private native List<RtpReceiver> nativeGetReceivers(); |
| } |