From b224d80166056e46fd9023214f83181f4ff7133d Mon Sep 17 00:00:00 2001 From: sakal Date: Wed, 6 Jul 2016 00:58:29 -0700 Subject: [PATCH] Camera2 in AppRTC Android Demo. Add an option to use Camera2 implemantion of CameraVideoCapturer in AppRTC Android Demo. It is enabled by default. BUG=webrtc:5519 Review-Url: https://codereview.webrtc.org/2077663003 Cr-Commit-Position: refs/heads/master@{#13391} --- .../androidapp/res/values/strings.xml | 12 +-- .../androidapp/res/xml/preferences.xml | 5 ++ .../src/org/appspot/apprtc/CallActivity.java | 18 ++++- .../org/appspot/apprtc/ConnectActivity.java | 7 ++ .../appspot/apprtc/PeerConnectionClient.java | 74 +++++++++++++++---- .../org/appspot/apprtc/SettingsActivity.java | 15 +++- .../apprtc/test/PeerConnectionClientTest.java | 32 ++++---- 7 files changed, 124 insertions(+), 39 deletions(-) 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 */