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

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

Issue 2464243002: Add Datachannel support to Android AppRTCMobile (Closed)
Patch Set: restore videoCapturerStopped = true 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
11 package org.appspot.apprtc; 11 package org.appspot.apprtc;
12 12
13 import android.content.Context; 13 import android.content.Context;
14 import android.os.Environment; 14 import android.os.Environment;
15 import android.os.ParcelFileDescriptor; 15 import android.os.ParcelFileDescriptor;
16 import android.util.Log; 16 import android.util.Log;
17 import java.io.File; 17 import java.io.File;
18 import java.io.IOException; 18 import java.io.IOException;
19 import java.nio.ByteBuffer;
19 import java.util.Collections; 20 import java.util.Collections;
20 import java.util.EnumSet; 21 import java.util.EnumSet;
21 import java.util.LinkedList; 22 import java.util.LinkedList;
22 import java.util.List; 23 import java.util.List;
23 import java.util.Timer; 24 import java.util.Timer;
24 import java.util.TimerTask; 25 import java.util.TimerTask;
25 import java.util.concurrent.Executors; 26 import java.util.concurrent.Executors;
26 import java.util.concurrent.ScheduledExecutorService; 27 import java.util.concurrent.ScheduledExecutorService;
27 import java.util.regex.Matcher; 28 import java.util.regex.Matcher;
28 import java.util.regex.Pattern; 29 import java.util.regex.Pattern;
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 private MediaStream mediaStream; 120 private MediaStream mediaStream;
120 private VideoCapturer videoCapturer; 121 private VideoCapturer videoCapturer;
121 // enableVideo is set to true if video should be rendered and sent. 122 // enableVideo is set to true if video should be rendered and sent.
122 private boolean renderVideo; 123 private boolean renderVideo;
123 private VideoTrack localVideoTrack; 124 private VideoTrack localVideoTrack;
124 private VideoTrack remoteVideoTrack; 125 private VideoTrack remoteVideoTrack;
125 private RtpSender localVideoSender; 126 private RtpSender localVideoSender;
126 // enableAudio is set to true if audio should be sent. 127 // enableAudio is set to true if audio should be sent.
127 private boolean enableAudio; 128 private boolean enableAudio;
128 private AudioTrack localAudioTrack; 129 private AudioTrack localAudioTrack;
130 private DataChannel dataChannel;
131 private boolean dataChannelEnabled;
129 132
130 /** 133 /**
131 * Peer connection parameters. 134 * Peer connection parameters.
135 */
136 public static class DataChannelParameters {
137 public final boolean ordered;
138 public final int maxRetransmitTimeMs;
139 public final int maxRetransmits;
140 public final String protocol;
141 public final boolean negotiated;
142 public final int id;
143
144 public DataChannelParameters(boolean ordered, int maxRetransmitTimeMs, int m axRetransmits,
145 String protocol, boolean negotiated, int id) {
146 this.ordered = ordered;
147 this.maxRetransmitTimeMs = maxRetransmitTimeMs;
148 this.maxRetransmits = maxRetransmits;
149 this.protocol = protocol;
150 this.negotiated = negotiated;
151 this.id = id;
152 }
153 }
154
155 /**
156 * Peer connection parameters.
132 */ 157 */
133 public static class PeerConnectionParameters { 158 public static class PeerConnectionParameters {
134 public final boolean videoCallEnabled; 159 public final boolean videoCallEnabled;
135 public final boolean loopback; 160 public final boolean loopback;
136 public final boolean tracing; 161 public final boolean tracing;
137 public final int videoWidth; 162 public final int videoWidth;
138 public final int videoHeight; 163 public final int videoHeight;
139 public final int videoFps; 164 public final int videoFps;
140 public final int videoMaxBitrate; 165 public final int videoMaxBitrate;
141 public final String videoCodec; 166 public final String videoCodec;
142 public final boolean videoCodecHwAcceleration; 167 public final boolean videoCodecHwAcceleration;
143 public final int audioStartBitrate; 168 public final int audioStartBitrate;
144 public final String audioCodec; 169 public final String audioCodec;
145 public final boolean noAudioProcessing; 170 public final boolean noAudioProcessing;
146 public final boolean aecDump; 171 public final boolean aecDump;
147 public final boolean useOpenSLES; 172 public final boolean useOpenSLES;
148 public final boolean disableBuiltInAEC; 173 public final boolean disableBuiltInAEC;
149 public final boolean disableBuiltInAGC; 174 public final boolean disableBuiltInAGC;
150 public final boolean disableBuiltInNS; 175 public final boolean disableBuiltInNS;
151 public final boolean enableLevelControl; 176 public final boolean enableLevelControl;
177 private final DataChannelParameters dataChannelParameters;
152 178
153 public PeerConnectionParameters(boolean videoCallEnabled, boolean loopback, boolean tracing, 179 public PeerConnectionParameters(boolean videoCallEnabled, boolean loopback, boolean tracing,
154 int videoWidth, int videoHeight, int videoFps, int videoMaxBitrate, Stri ng videoCodec, 180 int videoWidth, int videoHeight, int videoFps, int videoMaxBitrate, Stri ng videoCodec,
155 boolean videoCodecHwAcceleration, int audioStartBitrate, String audioCod ec, 181 boolean videoCodecHwAcceleration, int audioStartBitrate, String audioCod ec,
156 boolean noAudioProcessing, boolean aecDump, boolean useOpenSLES, boolean disableBuiltInAEC, 182 boolean noAudioProcessing, boolean aecDump, boolean useOpenSLES, boolean disableBuiltInAEC,
157 boolean disableBuiltInAGC, boolean disableBuiltInNS, boolean enableLevel Control) { 183 boolean disableBuiltInAGC, boolean disableBuiltInNS, boolean enableLevel Control) {
184 this(videoCallEnabled, loopback, tracing, videoWidth, videoHeight, videoFp s, videoMaxBitrate,
185 videoCodec, videoCodecHwAcceleration, audioStartBitrate, audioCodec, n oAudioProcessing,
186 aecDump, useOpenSLES, disableBuiltInAEC, disableBuiltInAGC, disableBui ltInNS,
187 enableLevelControl, null);
188 }
189
190 public PeerConnectionParameters(boolean videoCallEnabled, boolean loopback, boolean tracing,
191 int videoWidth, int videoHeight, int videoFps, int videoMaxBitrate, Stri ng videoCodec,
192 boolean videoCodecHwAcceleration, int audioStartBitrate, String audioCod ec,
193 boolean noAudioProcessing, boolean aecDump, boolean useOpenSLES, boolean disableBuiltInAEC,
194 boolean disableBuiltInAGC, boolean disableBuiltInNS, boolean enableLevel Control,
195 DataChannelParameters dataChannelParameters) {
158 this.videoCallEnabled = videoCallEnabled; 196 this.videoCallEnabled = videoCallEnabled;
159 this.loopback = loopback; 197 this.loopback = loopback;
160 this.tracing = tracing; 198 this.tracing = tracing;
161 this.videoWidth = videoWidth; 199 this.videoWidth = videoWidth;
162 this.videoHeight = videoHeight; 200 this.videoHeight = videoHeight;
163 this.videoFps = videoFps; 201 this.videoFps = videoFps;
164 this.videoMaxBitrate = videoMaxBitrate; 202 this.videoMaxBitrate = videoMaxBitrate;
165 this.videoCodec = videoCodec; 203 this.videoCodec = videoCodec;
166 this.videoCodecHwAcceleration = videoCodecHwAcceleration; 204 this.videoCodecHwAcceleration = videoCodecHwAcceleration;
167 this.audioStartBitrate = audioStartBitrate; 205 this.audioStartBitrate = audioStartBitrate;
168 this.audioCodec = audioCodec; 206 this.audioCodec = audioCodec;
169 this.noAudioProcessing = noAudioProcessing; 207 this.noAudioProcessing = noAudioProcessing;
170 this.aecDump = aecDump; 208 this.aecDump = aecDump;
171 this.useOpenSLES = useOpenSLES; 209 this.useOpenSLES = useOpenSLES;
172 this.disableBuiltInAEC = disableBuiltInAEC; 210 this.disableBuiltInAEC = disableBuiltInAEC;
173 this.disableBuiltInAGC = disableBuiltInAGC; 211 this.disableBuiltInAGC = disableBuiltInAGC;
174 this.disableBuiltInNS = disableBuiltInNS; 212 this.disableBuiltInNS = disableBuiltInNS;
175 this.enableLevelControl = enableLevelControl; 213 this.enableLevelControl = enableLevelControl;
214 this.dataChannelParameters = dataChannelParameters;
176 } 215 }
177 } 216 }
178 217
179 /** 218 /**
180 * Peer connection events. 219 * Peer connection events.
181 */ 220 */
182 public interface PeerConnectionEvents { 221 public interface PeerConnectionEvents {
183 /** 222 /**
184 * Callback fired once local SDP is created and set. 223 * Callback fired once local SDP is created and set.
185 */ 224 */
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 275
237 public void setPeerConnectionFactoryOptions(PeerConnectionFactory.Options opti ons) { 276 public void setPeerConnectionFactoryOptions(PeerConnectionFactory.Options opti ons) {
238 this.options = options; 277 this.options = options;
239 } 278 }
240 279
241 public void createPeerConnectionFactory(final Context context, 280 public void createPeerConnectionFactory(final Context context,
242 final PeerConnectionParameters peerConnectionParameters, final PeerConnect ionEvents events) { 281 final PeerConnectionParameters peerConnectionParameters, final PeerConnect ionEvents events) {
243 this.peerConnectionParameters = peerConnectionParameters; 282 this.peerConnectionParameters = peerConnectionParameters;
244 this.events = events; 283 this.events = events;
245 videoCallEnabled = peerConnectionParameters.videoCallEnabled; 284 videoCallEnabled = peerConnectionParameters.videoCallEnabled;
285 dataChannelEnabled = peerConnectionParameters.dataChannelParameters != null;
246 // Reset variables to initial states. 286 // Reset variables to initial states.
247 this.context = null; 287 this.context = null;
248 factory = null; 288 factory = null;
249 peerConnection = null; 289 peerConnection = null;
250 preferIsac = false; 290 preferIsac = false;
251 videoCapturerStopped = false; 291 videoCapturerStopped = false;
252 isError = false; 292 isError = false;
253 queuedRemoteCandidates = null; 293 queuedRemoteCandidates = null;
254 localSdp = null; // either offer or answer SDP 294 localSdp = null; // either offer or answer SDP
255 mediaStream = null; 295 mediaStream = null;
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 // TCP candidates are only useful when connecting to a server that supports 517 // TCP candidates are only useful when connecting to a server that supports
478 // ICE-TCP. 518 // ICE-TCP.
479 rtcConfig.tcpCandidatePolicy = PeerConnection.TcpCandidatePolicy.DISABLED; 519 rtcConfig.tcpCandidatePolicy = PeerConnection.TcpCandidatePolicy.DISABLED;
480 rtcConfig.bundlePolicy = PeerConnection.BundlePolicy.MAXBUNDLE; 520 rtcConfig.bundlePolicy = PeerConnection.BundlePolicy.MAXBUNDLE;
481 rtcConfig.rtcpMuxPolicy = PeerConnection.RtcpMuxPolicy.REQUIRE; 521 rtcConfig.rtcpMuxPolicy = PeerConnection.RtcpMuxPolicy.REQUIRE;
482 rtcConfig.continualGatheringPolicy = PeerConnection.ContinualGatheringPolicy .GATHER_CONTINUALLY; 522 rtcConfig.continualGatheringPolicy = PeerConnection.ContinualGatheringPolicy .GATHER_CONTINUALLY;
483 // Use ECDSA encryption. 523 // Use ECDSA encryption.
484 rtcConfig.keyType = PeerConnection.KeyType.ECDSA; 524 rtcConfig.keyType = PeerConnection.KeyType.ECDSA;
485 525
486 peerConnection = factory.createPeerConnection(rtcConfig, pcConstraints, pcOb server); 526 peerConnection = factory.createPeerConnection(rtcConfig, pcConstraints, pcOb server);
527
528 if (dataChannelEnabled) {
529 DataChannel.Init init = new DataChannel.Init();
530 init.ordered = peerConnectionParameters.dataChannelParameters.ordered;
531 init.negotiated = peerConnectionParameters.dataChannelParameters.negotiate d;
532 init.maxRetransmits = peerConnectionParameters.dataChannelParameters.maxRe transmits;
533 init.maxRetransmitTimeMs = peerConnectionParameters.dataChannelParameters. maxRetransmitTimeMs;
534 init.id = peerConnectionParameters.dataChannelParameters.id;
535 init.protocol = peerConnectionParameters.dataChannelParameters.protocol;
536 dataChannel = peerConnection.createDataChannel("ApprtcDemo data", init);
537 }
487 isInitiator = false; 538 isInitiator = false;
488 539
489 // Set default WebRTC tracing and INFO libjingle logging. 540 // Set default WebRTC tracing and INFO libjingle logging.
490 // NOTE: this _must_ happen while |factory| is alive! 541 // NOTE: this _must_ happen while |factory| is alive!
491 Logging.enableTracing("logcat:", EnumSet.of(Logging.TraceLevel.TRACE_DEFAULT )); 542 Logging.enableTracing("logcat:", EnumSet.of(Logging.TraceLevel.TRACE_DEFAULT ));
492 Logging.enableLogToDebugOutput(Logging.Severity.LS_INFO); 543 Logging.enableLogToDebugOutput(Logging.Severity.LS_INFO);
493 544
494 mediaStream = factory.createLocalMediaStream("ARDAMS"); 545 mediaStream = factory.createLocalMediaStream("ARDAMS");
495 if (videoCallEnabled) { 546 if (videoCallEnabled) {
496 mediaStream.addTrack(createVideoTrack(videoCapturer)); 547 mediaStream.addTrack(createVideoTrack(videoCapturer));
(...skipping 20 matching lines...) Expand all
517 568
518 Log.d(TAG, "Peer connection created."); 569 Log.d(TAG, "Peer connection created.");
519 } 570 }
520 571
521 private void closeInternal() { 572 private void closeInternal() {
522 if (factory != null && peerConnectionParameters.aecDump) { 573 if (factory != null && peerConnectionParameters.aecDump) {
523 factory.stopAecDump(); 574 factory.stopAecDump();
524 } 575 }
525 Log.d(TAG, "Closing peer connection."); 576 Log.d(TAG, "Closing peer connection.");
526 statsTimer.cancel(); 577 statsTimer.cancel();
578 if (dataChannel != null) {
579 dataChannel.dispose();
580 dataChannel = null;
581 }
527 if (peerConnection != null) { 582 if (peerConnection != null) {
528 peerConnection.dispose(); 583 peerConnection.dispose();
529 peerConnection = null; 584 peerConnection = null;
530 } 585 }
531 Log.d(TAG, "Closing audio source."); 586 Log.d(TAG, "Closing audio source.");
532 if (audioSource != null) { 587 if (audioSource != null) {
533 audioSource.dispose(); 588 audioSource.dispose();
534 audioSource = null; 589 audioSource = null;
535 } 590 }
536 Log.d(TAG, "Stopping capture."); 591 Log.d(TAG, "Stopping capture.");
(...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after
1069 executor.execute(new Runnable() { 1124 executor.execute(new Runnable() {
1070 @Override 1125 @Override
1071 public void run() { 1126 public void run() {
1072 remoteVideoTrack = null; 1127 remoteVideoTrack = null;
1073 } 1128 }
1074 }); 1129 });
1075 } 1130 }
1076 1131
1077 @Override 1132 @Override
1078 public void onDataChannel(final DataChannel dc) { 1133 public void onDataChannel(final DataChannel dc) {
1079 reportError("AppRTC doesn't use data channels, but got: " + dc.label() + " anyway!"); 1134 Log.d(TAG, "New Data channel " + dc.label());
1135
1136 if (!dataChannelEnabled)
1137 return;
1138
1139 dc.registerObserver(new DataChannel.Observer() {
1140 public void onBufferedAmountChange(long previousAmount) {
1141 Log.d(TAG, "Data channel buffered amount changed: " + dc.label() + ": " + dc.state());
1142 }
1143
1144 @Override
1145 public void onStateChange() {
1146 Log.d(TAG, "Data channel state changed: " + dc.label() + ": " + dc.sta te());
1147 }
1148
1149 @Override
1150 public void onMessage(final DataChannel.Buffer buffer) {
1151 if (buffer.binary) {
1152 Log.d(TAG, "Received binary msg over " + dc);
1153 return;
1154 }
1155 ByteBuffer data = buffer.data;
1156 final byte[] bytes = new byte[data.capacity()];
1157 data.get(bytes);
1158 String strData = new String(bytes);
1159 Log.d(TAG, "Got msg: " + strData + " over " + dc);
1160 }
1161 });
1080 } 1162 }
1081 1163
1082 @Override 1164 @Override
1083 public void onRenegotiationNeeded() { 1165 public void onRenegotiationNeeded() {
1084 // No need to do anything; AppRTC follows a pre-agreed-upon 1166 // No need to do anything; AppRTC follows a pre-agreed-upon
1085 // signaling/negotiation protocol. 1167 // signaling/negotiation protocol.
1086 } 1168 }
1087 } 1169 }
1088 1170
1089 // Implementation detail: handle offer creation/signaling and answer setting, 1171 // Implementation detail: handle offer creation/signaling and answer setting,
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1159 public void onCreateFailure(final String error) { 1241 public void onCreateFailure(final String error) {
1160 reportError("createSDP error: " + error); 1242 reportError("createSDP error: " + error);
1161 } 1243 }
1162 1244
1163 @Override 1245 @Override
1164 public void onSetFailure(final String error) { 1246 public void onSetFailure(final String error) {
1165 reportError("setSDP error: " + error); 1247 reportError("setSDP error: " + error);
1166 } 1248 }
1167 } 1249 }
1168 } 1250 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698