OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2015 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 11 matching lines...) Expand all Loading... |
22 import android.content.pm.PackageManager; | 22 import android.content.pm.PackageManager; |
23 import android.net.Uri; | 23 import android.net.Uri; |
24 import android.os.Bundle; | 24 import android.os.Bundle; |
25 import android.os.Handler; | 25 import android.os.Handler; |
26 import android.util.Log; | 26 import android.util.Log; |
27 import android.view.View; | 27 import android.view.View; |
28 import android.view.Window; | 28 import android.view.Window; |
29 import android.view.WindowManager.LayoutParams; | 29 import android.view.WindowManager.LayoutParams; |
30 import android.widget.Toast; | 30 import android.widget.Toast; |
31 | 31 |
32 import java.io.IOException; | |
33 import java.lang.RuntimeException; | |
34 import java.util.ArrayList; | |
35 import java.util.List; | |
36 | |
37 import org.webrtc.Camera1Enumerator; | |
38 import org.webrtc.Camera2Enumerator; | 32 import org.webrtc.Camera2Enumerator; |
39 import org.webrtc.CameraEnumerator; | |
40 import org.webrtc.EglBase; | 33 import org.webrtc.EglBase; |
41 import org.webrtc.FileVideoCapturer; | |
42 import org.webrtc.VideoFileRenderer; | |
43 import org.webrtc.IceCandidate; | 34 import org.webrtc.IceCandidate; |
44 import org.webrtc.Logging; | |
45 import org.webrtc.PeerConnectionFactory; | 35 import org.webrtc.PeerConnectionFactory; |
46 import org.webrtc.RendererCommon.ScalingType; | 36 import org.webrtc.RendererCommon.ScalingType; |
47 import org.webrtc.SessionDescription; | 37 import org.webrtc.SessionDescription; |
48 import org.webrtc.StatsReport; | 38 import org.webrtc.StatsReport; |
49 import org.webrtc.SurfaceViewRenderer; | 39 import org.webrtc.SurfaceViewRenderer; |
50 import org.webrtc.VideoCapturer; | |
51 import org.webrtc.VideoRenderer; | |
52 | 40 |
53 /** | 41 /** |
54 * Activity for peer connection call setup, call waiting | 42 * Activity for peer connection call setup, call waiting |
55 * and call view. | 43 * and call view. |
56 */ | 44 */ |
57 public class CallActivity extends Activity implements AppRTCClient.SignalingEven
ts, | 45 public class CallActivity extends Activity implements AppRTCClient.SignalingEven
ts, |
58 PeerConnectionClient.PeerC
onnectionEvents, | 46 PeerConnectionClient.PeerC
onnectionEvents, |
59 CallFragment.OnCallEvents
{ | 47 CallFragment.OnCallEvents
{ |
60 public static final String EXTRA_ROOMID = "org.appspot.apprtc.ROOMID"; | 48 public static final String EXTRA_ROOMID = "org.appspot.apprtc.ROOMID"; |
61 public static final String EXTRA_LOOPBACK = "org.appspot.apprtc.LOOPBACK"; | 49 public static final String EXTRA_LOOPBACK = "org.appspot.apprtc.LOOPBACK"; |
(...skipping 15 matching lines...) Expand all Loading... |
77 public static final String EXTRA_AECDUMP_ENABLED = "org.appspot.apprtc.AECDUMP
"; | 65 public static final String EXTRA_AECDUMP_ENABLED = "org.appspot.apprtc.AECDUMP
"; |
78 public static final String EXTRA_OPENSLES_ENABLED = "org.appspot.apprtc.OPENSL
ES"; | 66 public static final String EXTRA_OPENSLES_ENABLED = "org.appspot.apprtc.OPENSL
ES"; |
79 public static final String EXTRA_DISABLE_BUILT_IN_AEC = "org.appspot.apprtc.DI
SABLE_BUILT_IN_AEC"; | 67 public static final String EXTRA_DISABLE_BUILT_IN_AEC = "org.appspot.apprtc.DI
SABLE_BUILT_IN_AEC"; |
80 public static final String EXTRA_DISABLE_BUILT_IN_AGC = "org.appspot.apprtc.DI
SABLE_BUILT_IN_AGC"; | 68 public static final String EXTRA_DISABLE_BUILT_IN_AGC = "org.appspot.apprtc.DI
SABLE_BUILT_IN_AGC"; |
81 public static final String EXTRA_DISABLE_BUILT_IN_NS = "org.appspot.apprtc.DIS
ABLE_BUILT_IN_NS"; | 69 public static final String EXTRA_DISABLE_BUILT_IN_NS = "org.appspot.apprtc.DIS
ABLE_BUILT_IN_NS"; |
82 public static final String EXTRA_ENABLE_LEVEL_CONTROL = "org.appspot.apprtc.EN
ABLE_LEVEL_CONTROL"; | 70 public static final String EXTRA_ENABLE_LEVEL_CONTROL = "org.appspot.apprtc.EN
ABLE_LEVEL_CONTROL"; |
83 public static final String EXTRA_DISPLAY_HUD = "org.appspot.apprtc.DISPLAY_HUD
"; | 71 public static final String EXTRA_DISPLAY_HUD = "org.appspot.apprtc.DISPLAY_HUD
"; |
84 public static final String EXTRA_TRACING = "org.appspot.apprtc.TRACING"; | 72 public static final String EXTRA_TRACING = "org.appspot.apprtc.TRACING"; |
85 public static final String EXTRA_CMDLINE = "org.appspot.apprtc.CMDLINE"; | 73 public static final String EXTRA_CMDLINE = "org.appspot.apprtc.CMDLINE"; |
86 public static final String EXTRA_RUNTIME = "org.appspot.apprtc.RUNTIME"; | 74 public static final String EXTRA_RUNTIME = "org.appspot.apprtc.RUNTIME"; |
87 public static final String EXTRA_VIDEO_FILE_AS_CAMERA = "org.appspot.apprtc.VI
DEO_FILE_AS_CAMERA"; | |
88 public static final String EXTRA_SAVE_REMOTE_VIDEO_TO_FILE = | |
89 "org.appspot.apprtc.SAVE_REMOTE_VIDEO_TO_FILE"; | |
90 public static final String EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_WIDTH = | |
91 "org.appspot.apprtc.SAVE_REMOTE_VIDEO_TO_FILE_WIDTH"; | |
92 public static final String EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_HEIGHT = | |
93 "org.appspot.apprtc.SAVE_REMOTE_VIDEO_TO_FILE_HEIGHT"; | |
94 public static final String EXTRA_USE_VALUES_FROM_INTENT = | |
95 "org.appspot.apprtc.USE_VALUES_FROM_INTENT"; | |
96 private static final String TAG = "CallRTCClient"; | 75 private static final String TAG = "CallRTCClient"; |
97 | 76 |
98 // List of mandatory application permissions. | 77 // List of mandatory application permissions. |
99 private static final String[] MANDATORY_PERMISSIONS = {"android.permission.MOD
IFY_AUDIO_SETTINGS", | 78 private static final String[] MANDATORY_PERMISSIONS = {"android.permission.MOD
IFY_AUDIO_SETTINGS", |
100 "android.permission.RECORD_AUDIO", "android.permission.INTERNET"}; | 79 "android.permission.RECORD_AUDIO", "android.permission.INTERNET"}; |
101 | 80 |
102 // Peer connection statistics callback period in ms. | 81 // Peer connection statistics callback period in ms. |
103 private static final int STAT_CALLBACK_PERIOD = 1000; | 82 private static final int STAT_CALLBACK_PERIOD = 1000; |
104 // Local preview screen position before call is connected. | 83 // Local preview screen position before call is connected. |
105 private static final int LOCAL_X_CONNECTING = 0; | 84 private static final int LOCAL_X_CONNECTING = 0; |
106 private static final int LOCAL_Y_CONNECTING = 0; | 85 private static final int LOCAL_Y_CONNECTING = 0; |
107 private static final int LOCAL_WIDTH_CONNECTING = 100; | 86 private static final int LOCAL_WIDTH_CONNECTING = 100; |
108 private static final int LOCAL_HEIGHT_CONNECTING = 100; | 87 private static final int LOCAL_HEIGHT_CONNECTING = 100; |
109 // Local preview screen position after call is connected. | 88 // Local preview screen position after call is connected. |
110 private static final int LOCAL_X_CONNECTED = 72; | 89 private static final int LOCAL_X_CONNECTED = 72; |
111 private static final int LOCAL_Y_CONNECTED = 72; | 90 private static final int LOCAL_Y_CONNECTED = 72; |
112 private static final int LOCAL_WIDTH_CONNECTED = 25; | 91 private static final int LOCAL_WIDTH_CONNECTED = 25; |
113 private static final int LOCAL_HEIGHT_CONNECTED = 25; | 92 private static final int LOCAL_HEIGHT_CONNECTED = 25; |
114 // Remote video screen position | 93 // Remote video screen position |
115 private static final int REMOTE_X = 0; | 94 private static final int REMOTE_X = 0; |
116 private static final int REMOTE_Y = 0; | 95 private static final int REMOTE_Y = 0; |
117 private static final int REMOTE_WIDTH = 100; | 96 private static final int REMOTE_WIDTH = 100; |
118 private static final int REMOTE_HEIGHT = 100; | 97 private static final int REMOTE_HEIGHT = 100; |
119 private PeerConnectionClient peerConnectionClient = null; | 98 private PeerConnectionClient peerConnectionClient = null; |
120 private AppRTCClient appRtcClient; | 99 private AppRTCClient appRtcClient; |
121 private SignalingParameters signalingParameters; | 100 private SignalingParameters signalingParameters; |
122 private AppRTCAudioManager audioManager = null; | 101 private AppRTCAudioManager audioManager = null; |
123 private EglBase rootEglBase; | 102 private EglBase rootEglBase; |
124 private SurfaceViewRenderer localRender; | 103 private SurfaceViewRenderer localRender; |
125 private SurfaceViewRenderer remoteRenderScreen; | 104 private SurfaceViewRenderer remoteRender; |
126 private VideoFileRenderer videoFileRenderer; | |
127 private final List<VideoRenderer.Callbacks> remoteRenderers = | |
128 new ArrayList<VideoRenderer.Callbacks>(); | |
129 private PercentFrameLayout localRenderLayout; | 105 private PercentFrameLayout localRenderLayout; |
130 private PercentFrameLayout remoteRenderLayout; | 106 private PercentFrameLayout remoteRenderLayout; |
131 private ScalingType scalingType; | 107 private ScalingType scalingType; |
132 private Toast logToast; | 108 private Toast logToast; |
133 private boolean commandLineRun; | 109 private boolean commandLineRun; |
134 private int runTimeMs; | 110 private int runTimeMs; |
135 private boolean activityRunning; | 111 private boolean activityRunning; |
136 private RoomConnectionParameters roomConnectionParameters; | 112 private RoomConnectionParameters roomConnectionParameters; |
137 private PeerConnectionParameters peerConnectionParameters; | 113 private PeerConnectionParameters peerConnectionParameters; |
138 private boolean iceConnected; | 114 private boolean iceConnected; |
(...skipping 21 matching lines...) Expand all Loading... |
160 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NA
VIGATION | 136 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NA
VIGATION |
161 | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
; | 137 | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
; |
162 setContentView(R.layout.activity_call); | 138 setContentView(R.layout.activity_call); |
163 | 139 |
164 iceConnected = false; | 140 iceConnected = false; |
165 signalingParameters = null; | 141 signalingParameters = null; |
166 scalingType = ScalingType.SCALE_ASPECT_FILL; | 142 scalingType = ScalingType.SCALE_ASPECT_FILL; |
167 | 143 |
168 // Create UI controls. | 144 // Create UI controls. |
169 localRender = (SurfaceViewRenderer) findViewById(R.id.local_video_view); | 145 localRender = (SurfaceViewRenderer) findViewById(R.id.local_video_view); |
170 remoteRenderScreen = (SurfaceViewRenderer) findViewById(R.id.remote_video_vi
ew); | 146 remoteRender = (SurfaceViewRenderer) findViewById(R.id.remote_video_view); |
171 localRenderLayout = (PercentFrameLayout) findViewById(R.id.local_video_layou
t); | 147 localRenderLayout = (PercentFrameLayout) findViewById(R.id.local_video_layou
t); |
172 remoteRenderLayout = (PercentFrameLayout) findViewById(R.id.remote_video_lay
out); | 148 remoteRenderLayout = (PercentFrameLayout) findViewById(R.id.remote_video_lay
out); |
173 callFragment = new CallFragment(); | 149 callFragment = new CallFragment(); |
174 hudFragment = new HudFragment(); | 150 hudFragment = new HudFragment(); |
175 | 151 |
176 // Show/hide call control fragment on view click. | 152 // Show/hide call control fragment on view click. |
177 View.OnClickListener listener = new View.OnClickListener() { | 153 View.OnClickListener listener = new View.OnClickListener() { |
178 @Override | 154 @Override |
179 public void onClick(View view) { | 155 public void onClick(View view) { |
180 toggleCallControlFragmentVisibility(); | 156 toggleCallControlFragmentVisibility(); |
181 } | 157 } |
182 }; | 158 }; |
183 | 159 |
184 localRender.setOnClickListener(listener); | 160 localRender.setOnClickListener(listener); |
185 remoteRenderScreen.setOnClickListener(listener); | 161 remoteRender.setOnClickListener(listener); |
186 remoteRenderers.add(remoteRenderScreen); | |
187 | |
188 final Intent intent = getIntent(); | |
189 | 162 |
190 // Create video renderers. | 163 // Create video renderers. |
191 rootEglBase = EglBase.create(); | 164 rootEglBase = EglBase.create(); |
192 localRender.init(rootEglBase.getEglBaseContext(), null); | 165 localRender.init(rootEglBase.getEglBaseContext(), null); |
193 String saveRemoteVideoToFile = intent.getStringExtra(EXTRA_SAVE_REMOTE_VIDEO
_TO_FILE); | 166 remoteRender.init(rootEglBase.getEglBaseContext(), null); |
194 | |
195 // When saveRemoteVideoToFile is set we save the video from the remote to a
file. | |
196 if (saveRemoteVideoToFile != null) { | |
197 int videoOutWidth = intent.getIntExtra(EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_WID
TH, 0); | |
198 int videoOutHeight = intent.getIntExtra(EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_HE
IGHT, 0); | |
199 try { | |
200 videoFileRenderer = new VideoFileRenderer( | |
201 saveRemoteVideoToFile, videoOutWidth, videoOutHeight, rootEglBase.ge
tEglBaseContext()); | |
202 remoteRenderers.add(videoFileRenderer); | |
203 } catch (IOException e) { | |
204 throw new RuntimeException( | |
205 "Failed to open video file for output: " + saveRemoteVideoToFile, e)
; | |
206 } | |
207 } | |
208 remoteRenderScreen.init(rootEglBase.getEglBaseContext(), null); | |
209 | |
210 localRender.setZOrderMediaOverlay(true); | 167 localRender.setZOrderMediaOverlay(true); |
211 updateVideoView(); | 168 updateVideoView(); |
212 | 169 |
213 // Check for mandatory permissions. | 170 // Check for mandatory permissions. |
214 for (String permission : MANDATORY_PERMISSIONS) { | 171 for (String permission : MANDATORY_PERMISSIONS) { |
215 if (checkCallingOrSelfPermission(permission) != PackageManager.PERMISSION_
GRANTED) { | 172 if (checkCallingOrSelfPermission(permission) != PackageManager.PERMISSION_
GRANTED) { |
216 logAndToast("Permission " + permission + " is not granted"); | 173 logAndToast("Permission " + permission + " is not granted"); |
217 setResult(RESULT_CANCELED); | 174 setResult(RESULT_CANCELED); |
218 finish(); | 175 finish(); |
219 return; | 176 return; |
220 } | 177 } |
221 } | 178 } |
222 | 179 |
| 180 // Get Intent parameters. |
| 181 final Intent intent = getIntent(); |
223 Uri roomUri = intent.getData(); | 182 Uri roomUri = intent.getData(); |
224 if (roomUri == null) { | 183 if (roomUri == null) { |
225 logAndToast(getString(R.string.missing_url)); | 184 logAndToast(getString(R.string.missing_url)); |
226 Log.e(TAG, "Didn't get any URL in intent!"); | 185 Log.e(TAG, "Didn't get any URL in intent!"); |
227 setResult(RESULT_CANCELED); | 186 setResult(RESULT_CANCELED); |
228 finish(); | 187 finish(); |
229 return; | 188 return; |
230 } | 189 } |
231 | |
232 // Get Intent parameters. | |
233 String roomId = intent.getStringExtra(EXTRA_ROOMID); | 190 String roomId = intent.getStringExtra(EXTRA_ROOMID); |
234 Log.d(TAG, "Room ID: " + roomId); | |
235 if (roomId == null || roomId.length() == 0) { | 191 if (roomId == null || roomId.length() == 0) { |
236 logAndToast(getString(R.string.missing_url)); | 192 logAndToast(getString(R.string.missing_url)); |
237 Log.e(TAG, "Incorrect room ID in intent!"); | 193 Log.e(TAG, "Incorrect room ID in intent!"); |
238 setResult(RESULT_CANCELED); | 194 setResult(RESULT_CANCELED); |
239 finish(); | 195 finish(); |
240 return; | 196 return; |
241 } | 197 } |
242 | 198 |
243 boolean loopback = intent.getBooleanExtra(EXTRA_LOOPBACK, false); | 199 boolean loopback = intent.getBooleanExtra(EXTRA_LOOPBACK, false); |
244 boolean tracing = intent.getBooleanExtra(EXTRA_TRACING, false); | 200 boolean tracing = intent.getBooleanExtra(EXTRA_TRACING, false); |
245 | 201 |
| 202 boolean useCamera2 = |
| 203 Camera2Enumerator.isSupported(this) && intent.getBooleanExtra(EXTRA_CAME
RA2, true); |
| 204 |
246 peerConnectionParameters = | 205 peerConnectionParameters = |
247 new PeerConnectionParameters(intent.getBooleanExtra(EXTRA_VIDEO_CALL, tr
ue), loopback, | 206 new PeerConnectionParameters(intent.getBooleanExtra(EXTRA_VIDEO_CALL, tr
ue), loopback, |
248 tracing, intent.getIntExtra(EXTRA_VIDEO_WIDTH, 0), | 207 tracing, useCamera2, intent.getIntExtra(EXTRA_VIDEO_WIDTH, 0), |
249 intent.getIntExtra(EXTRA_VIDEO_HEIGHT, 0), intent.getIntExtra(EXTRA_
VIDEO_FPS, 0), | 208 intent.getIntExtra(EXTRA_VIDEO_HEIGHT, 0), intent.getIntExtra(EXTRA_
VIDEO_FPS, 0), |
250 intent.getIntExtra(EXTRA_VIDEO_BITRATE, 0), intent.getStringExtra(EX
TRA_VIDEOCODEC), | 209 intent.getIntExtra(EXTRA_VIDEO_BITRATE, 0), intent.getStringExtra(EX
TRA_VIDEOCODEC), |
251 intent.getBooleanExtra(EXTRA_HWCODEC_ENABLED, true), | 210 intent.getBooleanExtra(EXTRA_HWCODEC_ENABLED, true), |
| 211 intent.getBooleanExtra(EXTRA_CAPTURETOTEXTURE_ENABLED, false), |
252 intent.getIntExtra(EXTRA_AUDIO_BITRATE, 0), intent.getStringExtra(EX
TRA_AUDIOCODEC), | 212 intent.getIntExtra(EXTRA_AUDIO_BITRATE, 0), intent.getStringExtra(EX
TRA_AUDIOCODEC), |
253 intent.getBooleanExtra(EXTRA_NOAUDIOPROCESSING_ENABLED, false), | 213 intent.getBooleanExtra(EXTRA_NOAUDIOPROCESSING_ENABLED, false), |
254 intent.getBooleanExtra(EXTRA_AECDUMP_ENABLED, false), | 214 intent.getBooleanExtra(EXTRA_AECDUMP_ENABLED, false), |
255 intent.getBooleanExtra(EXTRA_OPENSLES_ENABLED, false), | 215 intent.getBooleanExtra(EXTRA_OPENSLES_ENABLED, false), |
256 intent.getBooleanExtra(EXTRA_DISABLE_BUILT_IN_AEC, false), | 216 intent.getBooleanExtra(EXTRA_DISABLE_BUILT_IN_AEC, false), |
257 intent.getBooleanExtra(EXTRA_DISABLE_BUILT_IN_AGC, false), | 217 intent.getBooleanExtra(EXTRA_DISABLE_BUILT_IN_AGC, false), |
258 intent.getBooleanExtra(EXTRA_DISABLE_BUILT_IN_NS, false), | 218 intent.getBooleanExtra(EXTRA_DISABLE_BUILT_IN_NS, false), |
259 intent.getBooleanExtra(EXTRA_ENABLE_LEVEL_CONTROL, false)); | 219 intent.getBooleanExtra(EXTRA_ENABLE_LEVEL_CONTROL, false)); |
260 commandLineRun = intent.getBooleanExtra(EXTRA_CMDLINE, false); | 220 commandLineRun = intent.getBooleanExtra(EXTRA_CMDLINE, false); |
261 runTimeMs = intent.getIntExtra(EXTRA_RUNTIME, 0); | 221 runTimeMs = intent.getIntExtra(EXTRA_RUNTIME, 0); |
262 | 222 |
263 Log.d(TAG, "VIDEO_FILE: '" + intent.getStringExtra(EXTRA_VIDEO_FILE_AS_CAMER
A) + "'"); | |
264 | |
265 // Create connection client. Use DirectRTCClient if room name is an IP other
wise use the | 223 // Create connection client. Use DirectRTCClient if room name is an IP other
wise use the |
266 // standard WebSocketRTCClient. | 224 // standard WebSocketRTCClient. |
267 if (loopback || !DirectRTCClient.IP_PATTERN.matcher(roomId).matches()) { | 225 if (loopback || !DirectRTCClient.IP_PATTERN.matcher(roomId).matches()) { |
268 appRtcClient = new WebSocketRTCClient(this); | 226 appRtcClient = new WebSocketRTCClient(this); |
269 } else { | 227 } else { |
270 Log.i(TAG, "Using DirectRTCClient because room name looks like an IP."); | 228 Log.i(TAG, "Using DirectRTCClient because room name looks like an IP."); |
271 appRtcClient = new DirectRTCClient(this); | 229 appRtcClient = new DirectRTCClient(this); |
272 } | 230 } |
273 // Create connection parameters. | 231 // Create connection parameters. |
274 roomConnectionParameters = new RoomConnectionParameters(roomUri.toString(),
roomId, loopback); | 232 roomConnectionParameters = new RoomConnectionParameters(roomUri.toString(),
roomId, loopback); |
(...skipping 25 matching lines...) Expand all Loading... |
300 peerConnectionClient = PeerConnectionClient.getInstance(); | 258 peerConnectionClient = PeerConnectionClient.getInstance(); |
301 if (loopback) { | 259 if (loopback) { |
302 PeerConnectionFactory.Options options = new PeerConnectionFactory.Options(
); | 260 PeerConnectionFactory.Options options = new PeerConnectionFactory.Options(
); |
303 options.networkIgnoreMask = 0; | 261 options.networkIgnoreMask = 0; |
304 peerConnectionClient.setPeerConnectionFactoryOptions(options); | 262 peerConnectionClient.setPeerConnectionFactoryOptions(options); |
305 } | 263 } |
306 peerConnectionClient.createPeerConnectionFactory( | 264 peerConnectionClient.createPeerConnectionFactory( |
307 CallActivity.this, peerConnectionParameters, CallActivity.this); | 265 CallActivity.this, peerConnectionParameters, CallActivity.this); |
308 } | 266 } |
309 | 267 |
310 private boolean useCamera2() { | |
311 return Camera2Enumerator.isSupported(this) && getIntent().getBooleanExtra(EX
TRA_CAMERA2, true); | |
312 } | |
313 | |
314 private boolean captureToTexture() { | |
315 return getIntent().getBooleanExtra(EXTRA_CAPTURETOTEXTURE_ENABLED, false); | |
316 } | |
317 | |
318 private VideoCapturer createCameraCapturer(CameraEnumerator enumerator) { | |
319 final String[] deviceNames = enumerator.getDeviceNames(); | |
320 | |
321 // First, try to find front facing camera | |
322 Logging.d(TAG, "Looking for front facing cameras."); | |
323 for (String deviceName : deviceNames) { | |
324 if (enumerator.isFrontFacing(deviceName)) { | |
325 Logging.d(TAG, "Creating front facing camera capturer."); | |
326 VideoCapturer videoCapturer = enumerator.createCapturer(deviceName, null
); | |
327 | |
328 if (videoCapturer != null) { | |
329 return videoCapturer; | |
330 } | |
331 } | |
332 } | |
333 | |
334 // Front facing camera not found, try something else | |
335 Logging.d(TAG, "Looking for other cameras."); | |
336 for (String deviceName : deviceNames) { | |
337 if (!enumerator.isFrontFacing(deviceName)) { | |
338 Logging.d(TAG, "Creating other camera capturer."); | |
339 VideoCapturer videoCapturer = enumerator.createCapturer(deviceName, null
); | |
340 | |
341 if (videoCapturer != null) { | |
342 return videoCapturer; | |
343 } | |
344 } | |
345 } | |
346 | |
347 return null; | |
348 } | |
349 | |
350 // Activity interfaces | 268 // Activity interfaces |
351 @Override | 269 @Override |
352 public void onPause() { | 270 public void onPause() { |
353 super.onPause(); | 271 super.onPause(); |
354 activityRunning = false; | 272 activityRunning = false; |
355 if (peerConnectionClient != null) { | 273 if (peerConnectionClient != null) { |
356 peerConnectionClient.stopVideoSource(); | 274 peerConnectionClient.stopVideoSource(); |
357 } | 275 } |
358 cpuMonitor.pause(); | 276 cpuMonitor.pause(); |
359 } | 277 } |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
428 } else { | 346 } else { |
429 ft.hide(callFragment); | 347 ft.hide(callFragment); |
430 ft.hide(hudFragment); | 348 ft.hide(hudFragment); |
431 } | 349 } |
432 ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); | 350 ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); |
433 ft.commit(); | 351 ft.commit(); |
434 } | 352 } |
435 | 353 |
436 private void updateVideoView() { | 354 private void updateVideoView() { |
437 remoteRenderLayout.setPosition(REMOTE_X, REMOTE_Y, REMOTE_WIDTH, REMOTE_HEIG
HT); | 355 remoteRenderLayout.setPosition(REMOTE_X, REMOTE_Y, REMOTE_WIDTH, REMOTE_HEIG
HT); |
438 remoteRenderScreen.setScalingType(scalingType); | 356 remoteRender.setScalingType(scalingType); |
439 remoteRenderScreen.setMirror(false); | 357 remoteRender.setMirror(false); |
440 | 358 |
441 if (iceConnected) { | 359 if (iceConnected) { |
442 localRenderLayout.setPosition( | 360 localRenderLayout.setPosition( |
443 LOCAL_X_CONNECTED, LOCAL_Y_CONNECTED, LOCAL_WIDTH_CONNECTED, LOCAL_HEI
GHT_CONNECTED); | 361 LOCAL_X_CONNECTED, LOCAL_Y_CONNECTED, LOCAL_WIDTH_CONNECTED, LOCAL_HEI
GHT_CONNECTED); |
444 localRender.setScalingType(ScalingType.SCALE_ASPECT_FIT); | 362 localRender.setScalingType(ScalingType.SCALE_ASPECT_FIT); |
445 } else { | 363 } else { |
446 localRenderLayout.setPosition( | 364 localRenderLayout.setPosition( |
447 LOCAL_X_CONNECTING, LOCAL_Y_CONNECTING, LOCAL_WIDTH_CONNECTING, LOCAL_
HEIGHT_CONNECTING); | 365 LOCAL_X_CONNECTING, LOCAL_Y_CONNECTING, LOCAL_WIDTH_CONNECTING, LOCAL_
HEIGHT_CONNECTING); |
448 localRender.setScalingType(scalingType); | 366 localRender.setScalingType(scalingType); |
449 } | 367 } |
450 localRender.setMirror(true); | 368 localRender.setMirror(true); |
451 | 369 |
452 localRender.requestLayout(); | 370 localRender.requestLayout(); |
453 remoteRenderScreen.requestLayout(); | 371 remoteRender.requestLayout(); |
454 } | 372 } |
455 | 373 |
456 private void startCall() { | 374 private void startCall() { |
457 if (appRtcClient == null) { | 375 if (appRtcClient == null) { |
458 Log.e(TAG, "AppRTC client is not allocated for a call."); | 376 Log.e(TAG, "AppRTC client is not allocated for a call."); |
459 return; | 377 return; |
460 } | 378 } |
461 callStartedTimeMs = System.currentTimeMillis(); | 379 callStartedTimeMs = System.currentTimeMillis(); |
462 | 380 |
463 // Start room connection. | 381 // Start room connection. |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 appRtcClient = null; | 425 appRtcClient = null; |
508 } | 426 } |
509 if (peerConnectionClient != null) { | 427 if (peerConnectionClient != null) { |
510 peerConnectionClient.close(); | 428 peerConnectionClient.close(); |
511 peerConnectionClient = null; | 429 peerConnectionClient = null; |
512 } | 430 } |
513 if (localRender != null) { | 431 if (localRender != null) { |
514 localRender.release(); | 432 localRender.release(); |
515 localRender = null; | 433 localRender = null; |
516 } | 434 } |
517 if (videoFileRenderer != null) { | 435 if (remoteRender != null) { |
518 videoFileRenderer.release(); | 436 remoteRender.release(); |
519 videoFileRenderer = null; | 437 remoteRender = null; |
520 } | |
521 if (remoteRenderScreen != null) { | |
522 remoteRenderScreen.release(); | |
523 remoteRenderScreen = null; | |
524 } | 438 } |
525 if (audioManager != null) { | 439 if (audioManager != null) { |
526 audioManager.close(); | 440 audioManager.close(); |
527 audioManager = null; | 441 audioManager = null; |
528 } | 442 } |
529 if (iceConnected && !isError) { | 443 if (iceConnected && !isError) { |
530 setResult(RESULT_OK); | 444 setResult(RESULT_OK); |
531 } else { | 445 } else { |
532 setResult(RESULT_CANCELED); | 446 setResult(RESULT_CANCELED); |
533 } | 447 } |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
571 @Override | 485 @Override |
572 public void run() { | 486 public void run() { |
573 if (!isError) { | 487 if (!isError) { |
574 isError = true; | 488 isError = true; |
575 disconnectWithErrorMessage(description); | 489 disconnectWithErrorMessage(description); |
576 } | 490 } |
577 } | 491 } |
578 }); | 492 }); |
579 } | 493 } |
580 | 494 |
581 private VideoCapturer createVideoCapturer() { | |
582 VideoCapturer videoCapturer = null; | |
583 String videoFileAsCamera = getIntent().getStringExtra(EXTRA_VIDEO_FILE_AS_CA
MERA); | |
584 if (videoFileAsCamera != null) { | |
585 try { | |
586 videoCapturer = new FileVideoCapturer(videoFileAsCamera); | |
587 } catch (IOException e) { | |
588 reportError("Failed to open video file for emulated camera"); | |
589 return null; | |
590 } | |
591 } else if (useCamera2()) { | |
592 if (!captureToTexture()) { | |
593 reportError(getString(R.string.camera2_texture_only_error)); | |
594 return null; | |
595 } | |
596 | |
597 Logging.d(TAG, "Creating capturer using camera2 API."); | |
598 videoCapturer = createCameraCapturer(new Camera2Enumerator(this)); | |
599 } else { | |
600 Logging.d(TAG, "Creating capturer using camera1 API."); | |
601 videoCapturer = createCameraCapturer(new Camera1Enumerator(captureToTextur
e())); | |
602 } | |
603 if (videoCapturer == null) { | |
604 reportError("Failed to open camera"); | |
605 return null; | |
606 } | |
607 return videoCapturer; | |
608 } | |
609 | |
610 // -----Implementation of AppRTCClient.AppRTCSignalingEvents --------------- | 495 // -----Implementation of AppRTCClient.AppRTCSignalingEvents --------------- |
611 // All callbacks are invoked from websocket signaling looper thread and | 496 // All callbacks are invoked from websocket signaling looper thread and |
612 // are routed to UI thread. | 497 // are routed to UI thread. |
613 private void onConnectedToRoomInternal(final SignalingParameters params) { | 498 private void onConnectedToRoomInternal(final SignalingParameters params) { |
614 final long delta = System.currentTimeMillis() - callStartedTimeMs; | 499 final long delta = System.currentTimeMillis() - callStartedTimeMs; |
615 | 500 |
616 signalingParameters = params; | 501 signalingParameters = params; |
617 logAndToast("Creating peer connection, delay=" + delta + "ms"); | 502 logAndToast("Creating peer connection, delay=" + delta + "ms"); |
618 VideoCapturer videoCapturer = null; | 503 peerConnectionClient.createPeerConnection( |
619 if (peerConnectionParameters.videoCallEnabled) { | 504 rootEglBase.getEglBaseContext(), localRender, remoteRender, signalingPar
ameters); |
620 videoCapturer = createVideoCapturer(); | |
621 } | |
622 peerConnectionClient.createPeerConnection(rootEglBase.getEglBaseContext(), l
ocalRender, | |
623 remoteRenderers, videoCapturer, signalingParameters); | |
624 | 505 |
625 if (signalingParameters.initiator) { | 506 if (signalingParameters.initiator) { |
626 logAndToast("Creating OFFER..."); | 507 logAndToast("Creating OFFER..."); |
627 // Create offer. Offer SDP will be sent to answering client in | 508 // Create offer. Offer SDP will be sent to answering client in |
628 // PeerConnectionEvents.onLocalDescription event. | 509 // PeerConnectionEvents.onLocalDescription event. |
629 peerConnectionClient.createOffer(); | 510 peerConnectionClient.createOffer(); |
630 } else { | 511 } else { |
631 if (params.offerSdp != null) { | 512 if (params.offerSdp != null) { |
632 peerConnectionClient.setRemoteDescription(params.offerSdp); | 513 peerConnectionClient.setRemoteDescription(params.offerSdp); |
633 logAndToast("Creating ANSWER..."); | 514 logAndToast("Creating ANSWER..."); |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 } | 689 } |
809 } | 690 } |
810 }); | 691 }); |
811 } | 692 } |
812 | 693 |
813 @Override | 694 @Override |
814 public void onPeerConnectionError(final String description) { | 695 public void onPeerConnectionError(final String description) { |
815 reportError(description); | 696 reportError(description); |
816 } | 697 } |
817 } | 698 } |
OLD | NEW |