Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1114)

Side by Side Diff: webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java

Issue 2464243002: Add Datachannel support to Android AppRTCMobile (Closed)
Patch Set: data channel patch set 4 Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2014 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2014 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 26 matching lines...) Expand all
37 import org.webrtc.StatsReport; 37 import org.webrtc.StatsReport;
38 import org.webrtc.VideoCapturer; 38 import org.webrtc.VideoCapturer;
39 import org.webrtc.VideoRenderer; 39 import org.webrtc.VideoRenderer;
40 import org.webrtc.VideoSource; 40 import org.webrtc.VideoSource;
41 import org.webrtc.VideoTrack; 41 import org.webrtc.VideoTrack;
42 import org.webrtc.voiceengine.WebRtcAudioManager; 42 import org.webrtc.voiceengine.WebRtcAudioManager;
43 import org.webrtc.voiceengine.WebRtcAudioUtils; 43 import org.webrtc.voiceengine.WebRtcAudioUtils;
44 44
45 import java.io.File; 45 import java.io.File;
46 import java.io.IOException; 46 import java.io.IOException;
47 import java.nio.ByteBuffer;
47 import java.util.Collections; 48 import java.util.Collections;
48 import java.util.EnumSet; 49 import java.util.EnumSet;
49 import java.util.LinkedList; 50 import java.util.LinkedList;
50 import java.util.List; 51 import java.util.List;
51 import java.util.Timer; 52 import java.util.Timer;
52 import java.util.TimerTask; 53 import java.util.TimerTask;
53 import java.util.concurrent.Executors; 54 import java.util.concurrent.Executors;
54 import java.util.concurrent.ScheduledExecutorService; 55 import java.util.concurrent.ScheduledExecutorService;
55 import java.util.regex.Matcher; 56 import java.util.regex.Matcher;
56 import java.util.regex.Pattern; 57 import java.util.regex.Pattern;
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
125 private MediaStream mediaStream; 126 private MediaStream mediaStream;
126 private VideoCapturer videoCapturer; 127 private VideoCapturer videoCapturer;
127 // enableVideo is set to true if video should be rendered and sent. 128 // enableVideo is set to true if video should be rendered and sent.
128 private boolean renderVideo; 129 private boolean renderVideo;
129 private VideoTrack localVideoTrack; 130 private VideoTrack localVideoTrack;
130 private VideoTrack remoteVideoTrack; 131 private VideoTrack remoteVideoTrack;
131 private RtpSender localVideoSender; 132 private RtpSender localVideoSender;
132 // enableAudio is set to true if audio should be sent. 133 // enableAudio is set to true if audio should be sent.
133 private boolean enableAudio; 134 private boolean enableAudio;
134 private AudioTrack localAudioTrack; 135 private AudioTrack localAudioTrack;
136 private DataChannel dataChannel;
137 private boolean dataChannelEnabled;
135 138
136 /** 139 /**
137 * Peer connection parameters. 140 * Peer connection parameters.
141 */
142 public static class DataChannelParameters {
143 public final boolean ordered;
144 public final int maxRetransmitTimeMs;
145 public final int maxRetransmits;
146 public final String protocol;
147 public final boolean negotiated;
148 public final int id;
149
150 public DataChannelParameters(boolean ordered, int maxRetransmitTimeMs, int m axRetransmits,
151 String protocol, boolean negotiated, int id) {
152 this.ordered = ordered;
153 this.maxRetransmitTimeMs = maxRetransmitTimeMs;
154 this.maxRetransmits = maxRetransmits;
155 this.protocol = protocol;
156 this.negotiated = negotiated;
157 this.id = id;
158 }
159 }
160
161 /**
162 * Peer connection parameters.
138 */ 163 */
139 public static class PeerConnectionParameters { 164 public static class PeerConnectionParameters {
140 public final boolean videoCallEnabled; 165 public final boolean videoCallEnabled;
141 public final boolean loopback; 166 public final boolean loopback;
142 public final boolean tracing; 167 public final boolean tracing;
143 public final int videoWidth; 168 public final int videoWidth;
144 public final int videoHeight; 169 public final int videoHeight;
145 public final int videoFps; 170 public final int videoFps;
146 public final int videoMaxBitrate; 171 public final int videoMaxBitrate;
147 public final String videoCodec; 172 public final String videoCodec;
148 public final boolean videoCodecHwAcceleration; 173 public final boolean videoCodecHwAcceleration;
149 public final int audioStartBitrate; 174 public final int audioStartBitrate;
150 public final String audioCodec; 175 public final String audioCodec;
151 public final boolean noAudioProcessing; 176 public final boolean noAudioProcessing;
152 public final boolean aecDump; 177 public final boolean aecDump;
153 public final boolean useOpenSLES; 178 public final boolean useOpenSLES;
154 public final boolean disableBuiltInAEC; 179 public final boolean disableBuiltInAEC;
155 public final boolean disableBuiltInAGC; 180 public final boolean disableBuiltInAGC;
156 public final boolean disableBuiltInNS; 181 public final boolean disableBuiltInNS;
157 public final boolean enableLevelControl; 182 public final boolean enableLevelControl;
183 private final DataChannelParameters dataChannelParameters;
158 184
159 public PeerConnectionParameters(boolean videoCallEnabled, boolean loopback, boolean tracing, 185 public PeerConnectionParameters(boolean videoCallEnabled, boolean loopback, boolean tracing,
160 int videoWidth, int videoHeight, int videoFps, int videoMaxBitrate, Stri ng videoCodec, 186 int videoWidth, int videoHeight, int videoFps, int videoMaxBitrate, Stri ng videoCodec,
161 boolean videoCodecHwAcceleration, int audioStartBitrate, String audioCod ec, 187 boolean videoCodecHwAcceleration, int audioStartBitrate, String audioCod ec,
162 boolean noAudioProcessing, boolean aecDump, boolean useOpenSLES, boolean disableBuiltInAEC, 188 boolean noAudioProcessing, boolean aecDump, boolean useOpenSLES, boolean disableBuiltInAEC,
163 boolean disableBuiltInAGC, boolean disableBuiltInNS, boolean enableLevel Control) { 189 boolean disableBuiltInAGC, boolean disableBuiltInNS, boolean enableLevel Control) {
190 this(videoCallEnabled, loopback, tracing, videoWidth, videoHeight, videoFp s, videoMaxBitrate,
191 videoCodec, videoCodecHwAcceleration, audioStartBitrate, audioCodec, n oAudioProcessing,
192 aecDump, useOpenSLES, disableBuiltInAEC, disableBuiltInAGC, disableBui ltInNS,
193 enableLevelControl, null);
194 }
195
196 public PeerConnectionParameters(boolean videoCallEnabled, boolean loopback, boolean tracing,
197 int videoWidth, int videoHeight, int videoFps, int videoMaxBitrate, Stri ng videoCodec,
198 boolean videoCodecHwAcceleration, int audioStartBitrate, String audioCod ec,
199 boolean noAudioProcessing, boolean aecDump, boolean useOpenSLES, boolean disableBuiltInAEC,
200 boolean disableBuiltInAGC, boolean disableBuiltInNS, boolean enableLevel Control,
201 DataChannelParameters dataChannelParameters) {
164 this.videoCallEnabled = videoCallEnabled; 202 this.videoCallEnabled = videoCallEnabled;
165 this.loopback = loopback; 203 this.loopback = loopback;
166 this.tracing = tracing; 204 this.tracing = tracing;
167 this.videoWidth = videoWidth; 205 this.videoWidth = videoWidth;
168 this.videoHeight = videoHeight; 206 this.videoHeight = videoHeight;
169 this.videoFps = videoFps; 207 this.videoFps = videoFps;
170 this.videoMaxBitrate = videoMaxBitrate; 208 this.videoMaxBitrate = videoMaxBitrate;
171 this.videoCodec = videoCodec; 209 this.videoCodec = videoCodec;
172 this.videoCodecHwAcceleration = videoCodecHwAcceleration; 210 this.videoCodecHwAcceleration = videoCodecHwAcceleration;
173 this.audioStartBitrate = audioStartBitrate; 211 this.audioStartBitrate = audioStartBitrate;
174 this.audioCodec = audioCodec; 212 this.audioCodec = audioCodec;
175 this.noAudioProcessing = noAudioProcessing; 213 this.noAudioProcessing = noAudioProcessing;
176 this.aecDump = aecDump; 214 this.aecDump = aecDump;
177 this.useOpenSLES = useOpenSLES; 215 this.useOpenSLES = useOpenSLES;
178 this.disableBuiltInAEC = disableBuiltInAEC; 216 this.disableBuiltInAEC = disableBuiltInAEC;
179 this.disableBuiltInAGC = disableBuiltInAGC; 217 this.disableBuiltInAGC = disableBuiltInAGC;
180 this.disableBuiltInNS = disableBuiltInNS; 218 this.disableBuiltInNS = disableBuiltInNS;
181 this.enableLevelControl = enableLevelControl; 219 this.enableLevelControl = enableLevelControl;
220 this.dataChannelParameters = dataChannelParameters;
182 } 221 }
183 } 222 }
184 223
185 /** 224 /**
186 * Peer connection events. 225 * Peer connection events.
187 */ 226 */
188 public interface PeerConnectionEvents { 227 public interface PeerConnectionEvents {
189 /** 228 /**
190 * Callback fired once local SDP is created and set. 229 * Callback fired once local SDP is created and set.
191 */ 230 */
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 281
243 public void setPeerConnectionFactoryOptions(PeerConnectionFactory.Options opti ons) { 282 public void setPeerConnectionFactoryOptions(PeerConnectionFactory.Options opti ons) {
244 this.options = options; 283 this.options = options;
245 } 284 }
246 285
247 public void createPeerConnectionFactory(final Context context, 286 public void createPeerConnectionFactory(final Context context,
248 final PeerConnectionParameters peerConnectionParameters, final PeerConnect ionEvents events) { 287 final PeerConnectionParameters peerConnectionParameters, final PeerConnect ionEvents events) {
249 this.peerConnectionParameters = peerConnectionParameters; 288 this.peerConnectionParameters = peerConnectionParameters;
250 this.events = events; 289 this.events = events;
251 videoCallEnabled = peerConnectionParameters.videoCallEnabled; 290 videoCallEnabled = peerConnectionParameters.videoCallEnabled;
291 dataChannelEnabled = peerConnectionParameters.dataChannelParameters != null;
252 // Reset variables to initial states. 292 // Reset variables to initial states.
253 this.context = null; 293 this.context = null;
254 factory = null; 294 factory = null;
255 peerConnection = null; 295 peerConnection = null;
256 preferIsac = false; 296 preferIsac = false;
257 videoCapturerStopped = false; 297 videoCapturerStopped = false;
258 isError = false; 298 isError = false;
259 queuedRemoteCandidates = null; 299 queuedRemoteCandidates = null;
260 localSdp = null; // either offer or answer SDP 300 localSdp = null; // either offer or answer SDP
261 mediaStream = null; 301 mediaStream = null;
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 // TCP candidates are only useful when connecting to a server that supports 526 // TCP candidates are only useful when connecting to a server that supports
487 // ICE-TCP. 527 // ICE-TCP.
488 rtcConfig.tcpCandidatePolicy = PeerConnection.TcpCandidatePolicy.DISABLED; 528 rtcConfig.tcpCandidatePolicy = PeerConnection.TcpCandidatePolicy.DISABLED;
489 rtcConfig.bundlePolicy = PeerConnection.BundlePolicy.MAXBUNDLE; 529 rtcConfig.bundlePolicy = PeerConnection.BundlePolicy.MAXBUNDLE;
490 rtcConfig.rtcpMuxPolicy = PeerConnection.RtcpMuxPolicy.REQUIRE; 530 rtcConfig.rtcpMuxPolicy = PeerConnection.RtcpMuxPolicy.REQUIRE;
491 rtcConfig.continualGatheringPolicy = PeerConnection.ContinualGatheringPolicy .GATHER_CONTINUALLY; 531 rtcConfig.continualGatheringPolicy = PeerConnection.ContinualGatheringPolicy .GATHER_CONTINUALLY;
492 // Use ECDSA encryption. 532 // Use ECDSA encryption.
493 rtcConfig.keyType = PeerConnection.KeyType.ECDSA; 533 rtcConfig.keyType = PeerConnection.KeyType.ECDSA;
494 534
495 peerConnection = factory.createPeerConnection(rtcConfig, pcConstraints, pcOb server); 535 peerConnection = factory.createPeerConnection(rtcConfig, pcConstraints, pcOb server);
536
537 if (dataChannelEnabled) {
538 DataChannel.Init init = new DataChannel.Init();
539 init.ordered = peerConnectionParameters.dataChannelParameters.ordered;
540 init.negotiated = peerConnectionParameters.dataChannelParameters.negotiate d;
541 init.maxRetransmits = peerConnectionParameters.dataChannelParameters.maxRe transmits;
542 init.maxRetransmitTimeMs = peerConnectionParameters.dataChannelParameters. maxRetransmitTimeMs;
543 init.id = peerConnectionParameters.dataChannelParameters.id;
544 init.protocol = peerConnectionParameters.dataChannelParameters.protocol;
545 dataChannel = peerConnection.createDataChannel("ApprtcDemo data", init);
546 }
496 isInitiator = false; 547 isInitiator = false;
497 548
498 // Set default WebRTC tracing and INFO libjingle logging. 549 // Set default WebRTC tracing and INFO libjingle logging.
499 // NOTE: this _must_ happen while |factory| is alive! 550 // NOTE: this _must_ happen while |factory| is alive!
500 Logging.enableTracing("logcat:", EnumSet.of(Logging.TraceLevel.TRACE_DEFAULT )); 551 Logging.enableTracing("logcat:", EnumSet.of(Logging.TraceLevel.TRACE_DEFAULT ));
501 Logging.enableLogToDebugOutput(Logging.Severity.LS_INFO); 552 Logging.enableLogToDebugOutput(Logging.Severity.LS_INFO);
502 553
503 mediaStream = factory.createLocalMediaStream("ARDAMS"); 554 mediaStream = factory.createLocalMediaStream("ARDAMS");
504 if (videoCallEnabled) { 555 if (videoCallEnabled) {
505 mediaStream.addTrack(createVideoTrack(videoCapturer)); 556 mediaStream.addTrack(createVideoTrack(videoCapturer));
(...skipping 20 matching lines...) Expand all
526 577
527 Log.d(TAG, "Peer connection created."); 578 Log.d(TAG, "Peer connection created.");
528 } 579 }
529 580
530 private void closeInternal() { 581 private void closeInternal() {
531 if (factory != null && peerConnectionParameters.aecDump) { 582 if (factory != null && peerConnectionParameters.aecDump) {
532 factory.stopAecDump(); 583 factory.stopAecDump();
533 } 584 }
534 Log.d(TAG, "Closing peer connection."); 585 Log.d(TAG, "Closing peer connection.");
535 statsTimer.cancel(); 586 statsTimer.cancel();
587 if (dataChannel != null) {
588 dataChannel.dispose();
589 dataChannel = null;
590 }
536 if (peerConnection != null) { 591 if (peerConnection != null) {
537 peerConnection.dispose(); 592 peerConnection.dispose();
538 peerConnection = null; 593 peerConnection = null;
539 } 594 }
540 Log.d(TAG, "Closing audio source."); 595 Log.d(TAG, "Closing audio source.");
541 if (audioSource != null) { 596 if (audioSource != null) {
542 audioSource.dispose(); 597 audioSource.dispose();
543 audioSource = null; 598 audioSource = null;
544 } 599 }
545 Log.d(TAG, "Stopping capture."); 600 Log.d(TAG, "Stopping capture.");
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after
1077 executor.execute(new Runnable() { 1132 executor.execute(new Runnable() {
1078 @Override 1133 @Override
1079 public void run() { 1134 public void run() {
1080 remoteVideoTrack = null; 1135 remoteVideoTrack = null;
1081 } 1136 }
1082 }); 1137 });
1083 } 1138 }
1084 1139
1085 @Override 1140 @Override
1086 public void onDataChannel(final DataChannel dc) { 1141 public void onDataChannel(final DataChannel dc) {
1087 reportError("AppRTC doesn't use data channels, but got: " + dc.label() + " anyway!"); 1142 Log.d(TAG, "New Data channel " + dc.label());
1143
1144 if (!dataChannelEnabled)
1145 return;
1146
1147 dc.registerObserver(new DataChannel.Observer() {
1148 public void onBufferedAmountChange(long previousAmount) {
1149 Log.d(TAG, "Data channel buffered amount changed: " + dc.label() + ": " + dc.state());
1150 }
1151
1152 @Override
1153 public void onStateChange() {
1154 Log.d(TAG, "Data channel state changed: " + dc.label() + ": " + dc.sta te());
1155 }
1156
1157 @Override
1158 public void onMessage(final DataChannel.Buffer buffer) {
1159 if (buffer.binary) {
1160 Log.d(TAG, "Received binary msg over " + dc);
1161 return;
1162 }
1163 ByteBuffer data = buffer.data;
1164 final byte[] bytes = new byte[data.capacity()];
1165 data.get(bytes);
1166 String strData = new String(bytes);
1167 Log.d(TAG, "Got msg: " + strData + " over " + dc);
1168 }
1169 });
1088 } 1170 }
1089 1171
1090 @Override 1172 @Override
1091 public void onRenegotiationNeeded() { 1173 public void onRenegotiationNeeded() {
1092 // No need to do anything; AppRTC follows a pre-agreed-upon 1174 // No need to do anything; AppRTC follows a pre-agreed-upon
1093 // signaling/negotiation protocol. 1175 // signaling/negotiation protocol.
1094 } 1176 }
1095 } 1177 }
1096 1178
1097 // Implementation detail: handle offer creation/signaling and answer setting, 1179 // Implementation detail: handle offer creation/signaling and answer setting,
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1167 public void onCreateFailure(final String error) { 1249 public void onCreateFailure(final String error) {
1168 reportError("createSDP error: " + error); 1250 reportError("createSDP error: " + error);
1169 } 1251 }
1170 1252
1171 @Override 1253 @Override
1172 public void onSetFailure(final String error) { 1254 public void onSetFailure(final String error) {
1173 reportError("setSDP error: " + error); 1255 reportError("setSDP error: " + error);
1174 } 1256 }
1175 } 1257 }
1176 } 1258 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698