diff --git a/webrtc/examples/androidapp/res/values/strings.xml b/webrtc/examples/androidapp/res/values/strings.xml
index 56817ed38a..e13a9a23d0 100644
--- a/webrtc/examples/androidapp/res/values/strings.xml
+++ b/webrtc/examples/androidapp/res/values/strings.xml
@@ -9,16 +9,14 @@
Favorites
No favorites
- Add favorite
Invalid URL
The URL or room name you entered resulted in an invalid URL: %1$s
Connection error
Connecting to: %1$s
FATAL ERROR: Missing URL to connect to.
+ Camera2 only supports capturing to texture. Either disable Camera2 or enable capturing to texture in the options.
OK
- Add
- Cancel
Switch front/back camera
Slide to change capture format
Muted
@@ -41,6 +39,11 @@
Enable video in a call.
true
+ camera2_preference
+ Use Camera2.
+ true
+ Only supported on Android Lollipop and forward.
+
resolution_preference
Video resolution.
Enter AppRTC local video resolution.
@@ -79,7 +82,7 @@
capturetotexture_preference
Video capture to surface texture.
Capture video to textures (if available).
- false
+ true
Enabled
Disabled
@@ -140,5 +143,4 @@
Debug performance tracing.
Debug performance tracing.
false
-
diff --git a/webrtc/examples/androidapp/res/xml/preferences.xml b/webrtc/examples/androidapp/res/xml/preferences.xml
index fea8bfad13..2e96db8c3a 100644
--- a/webrtc/examples/androidapp/res/xml/preferences.xml
+++ b/webrtc/examples/androidapp/res/xml/preferences.xml
@@ -10,6 +10,11 @@
android:dialogTitle="@string/pref_videocall_dlg"
android:defaultValue="@string/pref_videocall_default" />
+
+
1 && frontCameraDeviceName != null) {
- cameraDeviceName = frontCameraDeviceName;
+ if (peerConnectionParameters.useCamera2) {
+ if (!peerConnectionParameters.captureToTexture) {
+ reportError(context.getString(R.string.camera2_texture_only_error));
+ return;
+ }
+
+ Logging.d(TAG, "Creating capturer using camera2 API.");
+ createCapturer(new Camera2Enumerator(context));
+ } else {
+ Logging.d(TAG, "Creating capturer using camera1 API.");
+ createCapturer(new Camera1Enumerator(peerConnectionParameters.captureToTexture));
}
- Log.d(TAG, "Opening camera: " + cameraDeviceName);
- videoCapturer = VideoCapturerAndroid.create(cameraDeviceName, null,
- peerConnectionParameters.captureToTexture);
+
if (videoCapturer == null) {
reportError("Failed to open camera");
return;
@@ -791,7 +833,7 @@ public class PeerConnectionClient {
return localAudioTrack;
}
- private VideoTrack createVideoTrack(VideoCapturerAndroid capturer) {
+ private VideoTrack createVideoTrack(VideoCapturer capturer) {
videoSource = factory.createVideoSource(capturer, videoConstraints);
localVideoTrack = factory.createVideoTrack(VIDEO_TRACK_ID, videoSource);
diff --git a/webrtc/examples/androidapp/src/org/appspot/apprtc/SettingsActivity.java b/webrtc/examples/androidapp/src/org/appspot/apprtc/SettingsActivity.java
index bb959ed67a..26ce40755a 100644
--- a/webrtc/examples/androidapp/src/org/appspot/apprtc/SettingsActivity.java
+++ b/webrtc/examples/androidapp/src/org/appspot/apprtc/SettingsActivity.java
@@ -14,8 +14,10 @@ import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
+import android.preference.ListPreference;
import android.preference.Preference;
+import org.webrtc.Camera2Enumerator;
import org.webrtc.voiceengine.WebRtcAudioUtils;
/**
@@ -25,6 +27,7 @@ public class SettingsActivity extends Activity
implements OnSharedPreferenceChangeListener{
private SettingsFragment settingsFragment;
private String keyprefVideoCall;
+ private String keyprefCamera2;
private String keyprefResolution;
private String keyprefFps;
private String keyprefCaptureQualitySlider;
@@ -50,6 +53,7 @@ public class SettingsActivity extends Activity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
keyprefVideoCall = getString(R.string.pref_videocall_key);
+ keyprefCamera2 = getString(R.string.pref_camera2_key);
keyprefResolution = getString(R.string.pref_resolution_key);
keyprefFps = getString(R.string.pref_fps_key);
keyprefCaptureQualitySlider = getString(R.string.pref_capturequalityslider_key);
@@ -86,6 +90,7 @@ public class SettingsActivity extends Activity
settingsFragment.getPreferenceScreen().getSharedPreferences();
sharedPreferences.registerOnSharedPreferenceChangeListener(this);
updateSummaryB(sharedPreferences, keyprefVideoCall);
+ updateSummaryB(sharedPreferences, keyprefCamera2);
updateSummary(sharedPreferences, keyprefResolution);
updateSummary(sharedPreferences, keyprefFps);
updateSummaryB(sharedPreferences, keyprefCaptureQualitySlider);
@@ -109,6 +114,14 @@ public class SettingsActivity extends Activity
updateSummaryB(sharedPreferences, keyPrefDisplayHud);
updateSummaryB(sharedPreferences, keyPrefTracing);
+ if (!Camera2Enumerator.isSupported()) {
+ Preference camera2Preference =
+ settingsFragment.findPreference(keyprefCamera2);
+
+ camera2Preference.setSummary(getString(R.string.pref_camera2_not_supported));
+ camera2Preference.setEnabled(false);
+ }
+
// Disable forcing WebRTC based AEC so it won't affect our value.
// Otherwise, if it was enabled, isAcousticEchoCancelerSupported would always return false.
WebRtcAudioUtils.setWebRtcBasedAcousticEchoCanceler(false);
@@ -116,7 +129,6 @@ public class SettingsActivity extends Activity
Preference disableBuiltInAECPreference =
settingsFragment.findPreference(keyprefDisableBuiltInAEC);
-
disableBuiltInAECPreference.setSummary(getString(R.string.pref_built_in_aec_not_available));
disableBuiltInAECPreference.setEnabled(false);
}
@@ -145,6 +157,7 @@ public class SettingsActivity extends Activity
|| key.equals(keyprefStartAudioBitrateValue)) {
updateSummaryBitrate(sharedPreferences, key);
} else if (key.equals(keyprefVideoCall)
+ || key.equals(keyprefCamera2)
|| key.equals(keyPrefTracing)
|| key.equals(keyprefCaptureQualitySlider)
|| key.equals(keyprefHwCodec)
diff --git a/webrtc/examples/androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java b/webrtc/examples/androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java
index 9c5be14dd8..c8f0f55dc7 100644
--- a/webrtc/examples/androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java
+++ b/webrtc/examples/androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java
@@ -10,18 +10,17 @@
package org.appspot.apprtc.test;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Executor;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-
import org.appspot.apprtc.AppRTCClient.SignalingParameters;
import org.appspot.apprtc.PeerConnectionClient;
import org.appspot.apprtc.PeerConnectionClient.PeerConnectionEvents;
import org.appspot.apprtc.PeerConnectionClient.PeerConnectionParameters;
+
+import android.os.Build;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.util.Log;
+
+import org.webrtc.Camera2Enumerator;
import org.webrtc.EglBase;
import org.webrtc.IceCandidate;
import org.webrtc.MediaCodecVideoEncoder;
@@ -31,10 +30,13 @@ import org.webrtc.SessionDescription;
import org.webrtc.StatsReport;
import org.webrtc.VideoRenderer;
-import android.os.Build;
-import android.test.InstrumentationTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.util.Log;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
public class PeerConnectionClientTest extends InstrumentationTestCase
implements PeerConnectionEvents {
@@ -254,7 +256,7 @@ public class PeerConnectionClientTest extends InstrumentationTestCase
options.disableNetworkMonitor = true;
client.setPeerConnectionFactoryOptions(options);
client.createPeerConnectionFactory(
- getInstrumentation().getContext(), peerConnectionParameters, this);
+ getInstrumentation().getTargetContext(), peerConnectionParameters, this);
client.createPeerConnection(eglContext, localRenderer, remoteRenderer, signalingParameters);
client.createOffer();
return client;
@@ -267,6 +269,7 @@ public class PeerConnectionClientTest extends InstrumentationTestCase
true, /* loopback */
false, /* tracing */
// Video codec parameters.
+ true, /* useCamera2 */
0, /* videoWidth */
0, /* videoHeight */
0, /* videoFps */
@@ -286,12 +289,15 @@ public class PeerConnectionClientTest extends InstrumentationTestCase
private PeerConnectionParameters createParametersForVideoCall(
String videoCodec, boolean captureToTexture) {
+ final boolean useCamera2 = captureToTexture && Camera2Enumerator.isSupported();
+
PeerConnectionParameters peerConnectionParameters =
new PeerConnectionParameters(
true, /* videoCallEnabled */
true, /* loopback */
false, /* tracing */
// Video codec parameters.
+ useCamera2, /* useCamera2 */
0, /* videoWidth */
0, /* videoHeight */
0, /* videoFps */