| OLD | NEW |
| 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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 * Peer connection client implementation. | 48 * Peer connection client implementation. |
| 49 * | 49 * |
| 50 * <p>All public methods are routed to local looper thread. | 50 * <p>All public methods are routed to local looper thread. |
| 51 * All PeerConnectionEvents callbacks are invoked from the same looper thread. | 51 * All PeerConnectionEvents callbacks are invoked from the same looper thread. |
| 52 * This class is a singleton. | 52 * This class is a singleton. |
| 53 */ | 53 */ |
| 54 public class PeerConnectionClient { | 54 public class PeerConnectionClient { |
| 55 public static final String VIDEO_TRACK_ID = "ARDAMSv0"; | 55 public static final String VIDEO_TRACK_ID = "ARDAMSv0"; |
| 56 public static final String AUDIO_TRACK_ID = "ARDAMSa0"; | 56 public static final String AUDIO_TRACK_ID = "ARDAMSa0"; |
| 57 private static final String TAG = "PCRTCClient"; | 57 private static final String TAG = "PCRTCClient"; |
| 58 private static final String FIELD_TRIAL_VP9 = "WebRTC-SupportVP9/Enabled/"; | |
| 59 private static final String FIELD_TRIAL_AUTOMATIC_RESIZE = | 58 private static final String FIELD_TRIAL_AUTOMATIC_RESIZE = |
| 60 "WebRTC-MediaCodecVideoEncoder-AutomaticResize/Enabled/"; | 59 "WebRTC-MediaCodecVideoEncoder-AutomaticResize/Enabled/"; |
| 61 private static final String VIDEO_CODEC_VP8 = "VP8"; | 60 private static final String VIDEO_CODEC_VP8 = "VP8"; |
| 62 private static final String VIDEO_CODEC_VP9 = "VP9"; | 61 private static final String VIDEO_CODEC_VP9 = "VP9"; |
| 63 private static final String VIDEO_CODEC_H264 = "H264"; | 62 private static final String VIDEO_CODEC_H264 = "H264"; |
| 64 private static final String AUDIO_CODEC_OPUS = "opus"; | 63 private static final String AUDIO_CODEC_OPUS = "opus"; |
| 65 private static final String AUDIO_CODEC_ISAC = "ISAC"; | 64 private static final String AUDIO_CODEC_ISAC = "ISAC"; |
| 66 private static final String VIDEO_CODEC_PARAM_START_BITRATE = | 65 private static final String VIDEO_CODEC_PARAM_START_BITRATE = |
| 67 "x-google-start-bitrate"; | 66 "x-google-start-bitrate"; |
| 68 private static final String AUDIO_CODEC_PARAM_BITRATE = "maxaveragebitrate"; | 67 private static final String AUDIO_CODEC_PARAM_BITRATE = "maxaveragebitrate"; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 87 private final PCObserver pcObserver = new PCObserver(); | 86 private final PCObserver pcObserver = new PCObserver(); |
| 88 private final SDPObserver sdpObserver = new SDPObserver(); | 87 private final SDPObserver sdpObserver = new SDPObserver(); |
| 89 private final LooperExecutor executor; | 88 private final LooperExecutor executor; |
| 90 | 89 |
| 91 private PeerConnectionFactory factory; | 90 private PeerConnectionFactory factory; |
| 92 private PeerConnection peerConnection; | 91 private PeerConnection peerConnection; |
| 93 PeerConnectionFactory.Options options = null; | 92 PeerConnectionFactory.Options options = null; |
| 94 private VideoSource videoSource; | 93 private VideoSource videoSource; |
| 95 private boolean videoCallEnabled; | 94 private boolean videoCallEnabled; |
| 96 private boolean preferIsac; | 95 private boolean preferIsac; |
| 97 private boolean preferH264; | 96 private String preferredVideoCodec; |
| 98 private boolean videoSourceStopped; | 97 private boolean videoSourceStopped; |
| 99 private boolean isError; | 98 private boolean isError; |
| 100 private Timer statsTimer; | 99 private Timer statsTimer; |
| 101 private VideoRenderer.Callbacks localRender; | 100 private VideoRenderer.Callbacks localRender; |
| 102 private VideoRenderer.Callbacks remoteRender; | 101 private VideoRenderer.Callbacks remoteRender; |
| 103 private SignalingParameters signalingParameters; | 102 private SignalingParameters signalingParameters; |
| 104 private MediaConstraints pcConstraints; | 103 private MediaConstraints pcConstraints; |
| 105 private MediaConstraints videoConstraints; | 104 private MediaConstraints videoConstraints; |
| 106 private MediaConstraints audioConstraints; | 105 private MediaConstraints audioConstraints; |
| 107 private MediaConstraints sdpMediaConstraints; | 106 private MediaConstraints sdpMediaConstraints; |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 final Context context, | 220 final Context context, |
| 222 final PeerConnectionParameters peerConnectionParameters, | 221 final PeerConnectionParameters peerConnectionParameters, |
| 223 final PeerConnectionEvents events) { | 222 final PeerConnectionEvents events) { |
| 224 this.peerConnectionParameters = peerConnectionParameters; | 223 this.peerConnectionParameters = peerConnectionParameters; |
| 225 this.events = events; | 224 this.events = events; |
| 226 videoCallEnabled = peerConnectionParameters.videoCallEnabled; | 225 videoCallEnabled = peerConnectionParameters.videoCallEnabled; |
| 227 // Reset variables to initial states. | 226 // Reset variables to initial states. |
| 228 factory = null; | 227 factory = null; |
| 229 peerConnection = null; | 228 peerConnection = null; |
| 230 preferIsac = false; | 229 preferIsac = false; |
| 231 preferH264 = false; | |
| 232 videoSourceStopped = false; | 230 videoSourceStopped = false; |
| 233 isError = false; | 231 isError = false; |
| 234 queuedRemoteCandidates = null; | 232 queuedRemoteCandidates = null; |
| 235 localSdp = null; // either offer or answer SDP | 233 localSdp = null; // either offer or answer SDP |
| 236 mediaStream = null; | 234 mediaStream = null; |
| 237 videoCapturer = null; | 235 videoCapturer = null; |
| 238 renderVideo = true; | 236 renderVideo = true; |
| 239 localVideoTrack = null; | 237 localVideoTrack = null; |
| 240 remoteVideoTrack = null; | 238 remoteVideoTrack = null; |
| 241 statsTimer = new Timer(); | 239 statsTimer = new Timer(); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 public boolean isVideoCallEnabled() { | 279 public boolean isVideoCallEnabled() { |
| 282 return videoCallEnabled; | 280 return videoCallEnabled; |
| 283 } | 281 } |
| 284 | 282 |
| 285 private void createPeerConnectionFactoryInternal(Context context) { | 283 private void createPeerConnectionFactoryInternal(Context context) { |
| 286 Log.d(TAG, "Create peer connection factory. Use video: " + | 284 Log.d(TAG, "Create peer connection factory. Use video: " + |
| 287 peerConnectionParameters.videoCallEnabled); | 285 peerConnectionParameters.videoCallEnabled); |
| 288 isError = false; | 286 isError = false; |
| 289 | 287 |
| 290 // Initialize field trials. | 288 // Initialize field trials. |
| 291 String field_trials = FIELD_TRIAL_AUTOMATIC_RESIZE; | 289 PeerConnectionFactory.initializeFieldTrials(FIELD_TRIAL_AUTOMATIC_RESIZE); |
| 292 // Check if VP9 is used by default. | 290 |
| 293 if (videoCallEnabled && peerConnectionParameters.videoCodec != null | 291 // Check preferred video codec. |
| 294 && peerConnectionParameters.videoCodec.equals(VIDEO_CODEC_VP9)) { | 292 preferredVideoCodec = VIDEO_CODEC_VP8; |
| 295 field_trials += FIELD_TRIAL_VP9; | 293 if (videoCallEnabled && peerConnectionParameters.videoCodec != null) { |
| 294 if (peerConnectionParameters.videoCodec.equals(VIDEO_CODEC_VP9)) { |
| 295 preferredVideoCodec = VIDEO_CODEC_VP9; |
| 296 } else if (peerConnectionParameters.videoCodec.equals(VIDEO_CODEC_H264)) { |
| 297 preferredVideoCodec = VIDEO_CODEC_H264; |
| 298 } |
| 296 } | 299 } |
| 297 PeerConnectionFactory.initializeFieldTrials(field_trials); | 300 Log.d(TAG, "Pereferred video codec: " + preferredVideoCodec); |
| 298 | 301 |
| 299 // Check if H.264 is used by default. | |
| 300 preferH264 = false; | |
| 301 if (videoCallEnabled && peerConnectionParameters.videoCodec != null | |
| 302 && peerConnectionParameters.videoCodec.equals(VIDEO_CODEC_H264)) { | |
| 303 preferH264 = true; | |
| 304 } | |
| 305 // Check if ISAC is used by default. | 302 // Check if ISAC is used by default. |
| 306 preferIsac = false; | 303 preferIsac = false; |
| 307 if (peerConnectionParameters.audioCodec != null | 304 if (peerConnectionParameters.audioCodec != null |
| 308 && peerConnectionParameters.audioCodec.equals(AUDIO_CODEC_ISAC)) { | 305 && peerConnectionParameters.audioCodec.equals(AUDIO_CODEC_ISAC)) { |
| 309 preferIsac = true; | 306 preferIsac = true; |
| 310 } | 307 } |
| 311 if (!PeerConnectionFactory.initializeAndroidGlobals(context, true, true, | 308 if (!PeerConnectionFactory.initializeAndroidGlobals(context, true, true, |
| 312 peerConnectionParameters.videoCodecHwAcceleration)) { | 309 peerConnectionParameters.videoCodecHwAcceleration)) { |
| 313 events.onPeerConnectionError("Failed to initializeAndroidGlobals"); | 310 events.onPeerConnectionError("Failed to initializeAndroidGlobals"); |
| 314 } | 311 } |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 616 executor.execute(new Runnable() { | 613 executor.execute(new Runnable() { |
| 617 @Override | 614 @Override |
| 618 public void run() { | 615 public void run() { |
| 619 if (peerConnection == null || isError) { | 616 if (peerConnection == null || isError) { |
| 620 return; | 617 return; |
| 621 } | 618 } |
| 622 String sdpDescription = sdp.description; | 619 String sdpDescription = sdp.description; |
| 623 if (preferIsac) { | 620 if (preferIsac) { |
| 624 sdpDescription = preferCodec(sdpDescription, AUDIO_CODEC_ISAC, true); | 621 sdpDescription = preferCodec(sdpDescription, AUDIO_CODEC_ISAC, true); |
| 625 } | 622 } |
| 626 if (videoCallEnabled && preferH264) { | 623 if (videoCallEnabled) { |
| 627 sdpDescription = preferCodec(sdpDescription, VIDEO_CODEC_H264, false); | 624 sdpDescription = preferCodec(sdpDescription, preferredVideoCodec, fals
e); |
| 628 } | 625 } |
| 629 if (videoCallEnabled && peerConnectionParameters.videoStartBitrate > 0)
{ | 626 if (videoCallEnabled && peerConnectionParameters.videoStartBitrate > 0)
{ |
| 630 sdpDescription = setStartBitrate(VIDEO_CODEC_VP8, true, | 627 sdpDescription = setStartBitrate(VIDEO_CODEC_VP8, true, |
| 631 sdpDescription, peerConnectionParameters.videoStartBitrate); | 628 sdpDescription, peerConnectionParameters.videoStartBitrate); |
| 632 sdpDescription = setStartBitrate(VIDEO_CODEC_VP9, true, | 629 sdpDescription = setStartBitrate(VIDEO_CODEC_VP9, true, |
| 633 sdpDescription, peerConnectionParameters.videoStartBitrate); | 630 sdpDescription, peerConnectionParameters.videoStartBitrate); |
| 634 sdpDescription = setStartBitrate(VIDEO_CODEC_H264, true, | 631 sdpDescription = setStartBitrate(VIDEO_CODEC_H264, true, |
| 635 sdpDescription, peerConnectionParameters.videoStartBitrate); | 632 sdpDescription, peerConnectionParameters.videoStartBitrate); |
| 636 } | 633 } |
| 637 if (peerConnectionParameters.audioStartBitrate > 0) { | 634 if (peerConnectionParameters.audioStartBitrate > 0) { |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 965 @Override | 962 @Override |
| 966 public void onCreateSuccess(final SessionDescription origSdp) { | 963 public void onCreateSuccess(final SessionDescription origSdp) { |
| 967 if (localSdp != null) { | 964 if (localSdp != null) { |
| 968 reportError("Multiple SDP create."); | 965 reportError("Multiple SDP create."); |
| 969 return; | 966 return; |
| 970 } | 967 } |
| 971 String sdpDescription = origSdp.description; | 968 String sdpDescription = origSdp.description; |
| 972 if (preferIsac) { | 969 if (preferIsac) { |
| 973 sdpDescription = preferCodec(sdpDescription, AUDIO_CODEC_ISAC, true); | 970 sdpDescription = preferCodec(sdpDescription, AUDIO_CODEC_ISAC, true); |
| 974 } | 971 } |
| 975 if (videoCallEnabled && preferH264) { | 972 if (videoCallEnabled) { |
| 976 sdpDescription = preferCodec(sdpDescription, VIDEO_CODEC_H264, false); | 973 sdpDescription = preferCodec(sdpDescription, preferredVideoCodec, false)
; |
| 977 } | 974 } |
| 978 final SessionDescription sdp = new SessionDescription( | 975 final SessionDescription sdp = new SessionDescription( |
| 979 origSdp.type, sdpDescription); | 976 origSdp.type, sdpDescription); |
| 980 localSdp = sdp; | 977 localSdp = sdp; |
| 981 executor.execute(new Runnable() { | 978 executor.execute(new Runnable() { |
| 982 @Override | 979 @Override |
| 983 public void run() { | 980 public void run() { |
| 984 if (peerConnection != null && !isError) { | 981 if (peerConnection != null && !isError) { |
| 985 Log.d(TAG, "Set local SDP from " + sdp.type); | 982 Log.d(TAG, "Set local SDP from " + sdp.type); |
| 986 peerConnection.setLocalDescription(sdpObserver, sdp); | 983 peerConnection.setLocalDescription(sdpObserver, sdp); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1033 public void onCreateFailure(final String error) { | 1030 public void onCreateFailure(final String error) { |
| 1034 reportError("createSDP error: " + error); | 1031 reportError("createSDP error: " + error); |
| 1035 } | 1032 } |
| 1036 | 1033 |
| 1037 @Override | 1034 @Override |
| 1038 public void onSetFailure(final String error) { | 1035 public void onSetFailure(final String error) { |
| 1039 reportError("setSDP error: " + error); | 1036 reportError("setSDP error: " + error); |
| 1040 } | 1037 } |
| 1041 } | 1038 } |
| 1042 } | 1039 } |
| OLD | NEW |