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

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

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

Powered by Google App Engine
This is Rietveld 408576698