| Index: webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java
|
| diff --git a/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java b/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java
|
| index 294b1ef07baeb6e91e6cfe26a3eb66afe8f3c910..0f7ff3532d150643b06c16bc3e34bd82fb9c413a 100644
|
| --- a/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java
|
| +++ b/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java
|
| @@ -19,7 +19,11 @@ import android.util.Log;
|
|
|
| import org.webrtc.AudioSource;
|
| import org.webrtc.AudioTrack;
|
| +import org.webrtc.Camera1Enumerator;
|
| +import org.webrtc.Camera2Enumerator;
|
| import org.webrtc.CameraEnumerationAndroid;
|
| +import org.webrtc.CameraEnumerator;
|
| +import org.webrtc.CameraVideoCapturer;
|
| import org.webrtc.DataChannel;
|
| import org.webrtc.EglBase;
|
| import org.webrtc.IceCandidate;
|
| @@ -35,7 +39,7 @@ import org.webrtc.SdpObserver;
|
| import org.webrtc.SessionDescription;
|
| import org.webrtc.StatsObserver;
|
| import org.webrtc.StatsReport;
|
| -import org.webrtc.VideoCapturerAndroid;
|
| +import org.webrtc.VideoCapturer;
|
| import org.webrtc.VideoRenderer;
|
| import org.webrtc.VideoSource;
|
| import org.webrtc.VideoTrack;
|
| @@ -48,7 +52,6 @@ import java.util.EnumSet;
|
| import java.util.LinkedList;
|
| import java.util.Timer;
|
| import java.util.TimerTask;
|
| -import java.util.concurrent.ExecutorService;
|
| import java.util.concurrent.Executors;
|
| import java.util.concurrent.ScheduledExecutorService;
|
| import java.util.regex.Matcher;
|
| @@ -95,6 +98,7 @@ public class PeerConnectionClient {
|
| private final SDPObserver sdpObserver = new SDPObserver();
|
| private final ScheduledExecutorService executor;
|
|
|
| + private Context context;
|
| private PeerConnectionFactory factory;
|
| private PeerConnection peerConnection;
|
| PeerConnectionFactory.Options options = null;
|
| @@ -124,7 +128,7 @@ public class PeerConnectionClient {
|
| private SessionDescription localSdp; // either offer or answer SDP
|
| private MediaStream mediaStream;
|
| private int numberOfCameras;
|
| - private VideoCapturerAndroid videoCapturer;
|
| + private CameraVideoCapturer videoCapturer;
|
| // enableVideo is set to true if video should be rendered and sent.
|
| private boolean renderVideo;
|
| private VideoTrack localVideoTrack;
|
| @@ -140,6 +144,7 @@ public class PeerConnectionClient {
|
| public final boolean videoCallEnabled;
|
| public final boolean loopback;
|
| public final boolean tracing;
|
| + public final boolean useCamera2;
|
| public final int videoWidth;
|
| public final int videoHeight;
|
| public final int videoFps;
|
| @@ -155,13 +160,14 @@ public class PeerConnectionClient {
|
| public final boolean disableBuiltInAEC;
|
|
|
| public PeerConnectionParameters(
|
| - boolean videoCallEnabled, boolean loopback, boolean tracing,
|
| - int videoWidth, int videoHeight, int videoFps, int videoStartBitrate,
|
| - String videoCodec, boolean videoCodecHwAcceleration, boolean captureToTexture,
|
| - int audioStartBitrate, String audioCodec,
|
| + boolean videoCallEnabled, boolean loopback, boolean tracing, boolean useCamera2,
|
| + int videoWidth, int videoHeight, int videoFps,
|
| + int videoStartBitrate, String videoCodec, boolean videoCodecHwAcceleration,
|
| + boolean captureToTexture, int audioStartBitrate, String audioCodec,
|
| boolean noAudioProcessing, boolean aecDump, boolean useOpenSLES,
|
| boolean disableBuiltInAEC) {
|
| this.videoCallEnabled = videoCallEnabled;
|
| + this.useCamera2 = useCamera2;
|
| this.loopback = loopback;
|
| this.tracing = tracing;
|
| this.videoWidth = videoWidth;
|
| @@ -250,6 +256,7 @@ public class PeerConnectionClient {
|
| this.events = events;
|
| videoCallEnabled = peerConnectionParameters.videoCallEnabled;
|
| // Reset variables to initial states.
|
| + this.context = null;
|
| factory = null;
|
| peerConnection = null;
|
| preferIsac = false;
|
| @@ -367,6 +374,7 @@ public class PeerConnectionClient {
|
| if (options != null) {
|
| Log.d(TAG, "Factory networkIgnoreMask option: " + options.networkIgnoreMask);
|
| }
|
| + this.context = context;
|
| factory = new PeerConnectionFactory(options);
|
| Log.d(TAG, "Peer connection factory created.");
|
| }
|
| @@ -456,6 +464,36 @@ public class PeerConnectionClient {
|
| }
|
| }
|
|
|
| + private void createCapturer(CameraEnumerator enumerator) {
|
| + final String[] deviceNames = enumerator.getDeviceNames();
|
| +
|
| + // First, try to find front facing camera
|
| + Logging.d(TAG, "Looking for front facing cameras.");
|
| + for (String deviceName : deviceNames) {
|
| + if (enumerator.isFrontFacing(deviceName)) {
|
| + Logging.d(TAG, "Creating front facing camera capturer.");
|
| + videoCapturer = enumerator.createCapturer(deviceName, null);
|
| +
|
| + if (videoCapturer != null) {
|
| + return;
|
| + }
|
| + }
|
| + }
|
| +
|
| + // Front facing camera not found, try something else
|
| + Logging.d(TAG, "Looking for other cameras.");
|
| + for (String deviceName : deviceNames) {
|
| + if (!enumerator.isFrontFacing(deviceName)) {
|
| + Logging.d(TAG, "Creating other camera capturer.");
|
| + videoCapturer = enumerator.createCapturer(deviceName, null);
|
| +
|
| + if (videoCapturer != null) {
|
| + return;
|
| + }
|
| + }
|
| + }
|
| + }
|
| +
|
| private void createPeerConnectionInternal(EglBase.Context renderEGLContext) {
|
| if (factory == null || isError) {
|
| Log.e(TAG, "Peerconnection factory is not created");
|
| @@ -498,15 +536,19 @@ public class PeerConnectionClient {
|
|
|
| mediaStream = factory.createLocalMediaStream("ARDAMS");
|
| if (videoCallEnabled) {
|
| - String cameraDeviceName = CameraEnumerationAndroid.getDeviceName(0);
|
| - String frontCameraDeviceName =
|
| - CameraEnumerationAndroid.getNameOfFrontFacingDevice();
|
| - if (numberOfCameras > 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);
|
|
|