Chromium Code Reviews| 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 1d049f91d4ea8316a9c7c065d2258e8b109f3d9a..6ab96af7ccf287143d27f220e7acbefb7f05cd06 100644 |
| --- a/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java |
| +++ b/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java |
| @@ -41,6 +41,9 @@ import org.webrtc.StatsObserver; |
| import org.webrtc.StatsReport; |
| import org.webrtc.VideoCapturer; |
| import org.webrtc.VideoRenderer; |
| +import org.webrtc.VideoCapturerAndroid; |
| +import org.webrtc.CameraVideoCapturer; |
| +import org.webrtc.FileVideoCapturer; |
| import org.webrtc.VideoSource; |
| import org.webrtc.VideoTrack; |
| import org.webrtc.voiceengine.WebRtcAudioManager; |
| @@ -48,8 +51,10 @@ import org.webrtc.voiceengine.WebRtcAudioUtils; |
| import java.io.File; |
| import java.io.IOException; |
| +import java.util.Collections; |
| import java.util.EnumSet; |
| import java.util.LinkedList; |
| +import java.util.List; |
| import java.util.Timer; |
| import java.util.TimerTask; |
| import java.util.concurrent.Executors; |
| @@ -108,7 +113,7 @@ public class PeerConnectionClient { |
| private boolean isError; |
| private Timer statsTimer; |
| private VideoRenderer.Callbacks localRender; |
| - private VideoRenderer.Callbacks remoteRender; |
| + private List<VideoRenderer.Callbacks> remoteRenders; |
| private SignalingParameters signalingParameters; |
| private MediaConstraints pcConstraints; |
| private int videoWidth; |
| @@ -127,7 +132,7 @@ public class PeerConnectionClient { |
| private SessionDescription localSdp; // either offer or answer SDP |
| private MediaStream mediaStream; |
| private int numberOfCameras; |
| - private CameraVideoCapturer videoCapturer; |
| + private VideoCapturer videoCapturer; |
| // enableVideo is set to true if video should be rendered and sent. |
| private boolean renderVideo; |
| private VideoTrack localVideoTrack; |
| @@ -161,6 +166,7 @@ public class PeerConnectionClient { |
| public final boolean disableBuiltInAGC; |
| public final boolean disableBuiltInNS; |
| public final boolean enableLevelControl; |
| + public final String videoFileAsCamera; |
|
magjed_webrtc
2016/09/26 11:40:02
This doesn't really scale. We now have useCamera2,
kjellander_webrtc
2016/09/27 11:30:21
I think this can wait. This CL is adding new funct
|
| public PeerConnectionParameters( |
| boolean videoCallEnabled, boolean loopback, boolean tracing, boolean useCamera2, |
| @@ -169,7 +175,9 @@ public class PeerConnectionClient { |
| boolean captureToTexture, int audioStartBitrate, String audioCodec, |
| boolean noAudioProcessing, boolean aecDump, boolean useOpenSLES, |
| boolean disableBuiltInAEC, boolean disableBuiltInAGC, boolean disableBuiltInNS, |
| - boolean enableLevelControl) { |
| + boolean enableLevelControl, |
| + String videoFileAsCamera) { |
| + |
| this.videoCallEnabled = videoCallEnabled; |
| this.useCamera2 = useCamera2; |
| this.loopback = loopback; |
| @@ -190,6 +198,7 @@ public class PeerConnectionClient { |
| this.disableBuiltInAGC = disableBuiltInAGC; |
| this.disableBuiltInNS = disableBuiltInNS; |
| this.enableLevelControl = enableLevelControl; |
| + this.videoFileAsCamera = videoFileAsCamera; |
| } |
| } |
| @@ -294,12 +303,23 @@ public class PeerConnectionClient { |
| final VideoRenderer.Callbacks localRender, |
| final VideoRenderer.Callbacks remoteRender, |
| final SignalingParameters signalingParameters) { |
| + createPeerConnection( |
| + renderEGLContext, |
| + localRender, |
| + Collections.singletonList(remoteRender), |
| + signalingParameters); |
| + } |
| + public void createPeerConnection( |
| + final EglBase.Context renderEGLContext, |
| + final VideoRenderer.Callbacks localRender, |
| + final List<VideoRenderer.Callbacks> remoteRenders, |
| + final SignalingParameters signalingParameters) { |
| if (peerConnectionParameters == null) { |
| Log.e(TAG, "Creating peer connection without initializing factory."); |
| return; |
| } |
| this.localRender = localRender; |
| - this.remoteRender = remoteRender; |
| + this.remoteRenders = remoteRenders; |
| this.signalingParameters = signalingParameters; |
| executor.execute(new Runnable() { |
| @Override |
| @@ -544,7 +564,16 @@ public class PeerConnectionClient { |
| mediaStream = factory.createLocalMediaStream("ARDAMS"); |
| if (videoCallEnabled) { |
| - if (peerConnectionParameters.useCamera2) { |
| + if (peerConnectionParameters.videoFileAsCamera != null) { |
| + videoCapturer = FileVideoCapturer.create( |
| + peerConnectionParameters.videoFileAsCamera); |
| + |
| + if (videoCapturer == null) { |
| + reportError("Failed to open video file for emulated camera"); |
| + return; |
| + } |
| + } |
| + else if (peerConnectionParameters.useCamera2) { |
| if (!peerConnectionParameters.captureToTexture) { |
| reportError(context.getString(R.string.camera2_texture_only_error)); |
| return; |
| @@ -556,7 +585,6 @@ public class PeerConnectionClient { |
| Logging.d(TAG, "Creating capturer using camera1 API."); |
| createCapturer(new Camera1Enumerator(peerConnectionParameters.captureToTexture)); |
| } |
| - |
| if (videoCapturer == null) { |
| reportError("Failed to open camera"); |
| return; |
| @@ -1030,7 +1058,10 @@ public class PeerConnectionClient { |
| return; // No video is sent or only one camera is available or error happened. |
| } |
| Log.d(TAG, "Switch camera"); |
| - videoCapturer.switchCamera(null); |
| + if (videoCapturer instanceof CameraVideoCapturer) { |
|
magjed_webrtc
2016/09/26 11:40:02
Maybe you should log when this is not the case. Ma
|
| + CameraVideoCapturer cameraVideoCapturer = (CameraVideoCapturer)videoCapturer; |
| + cameraVideoCapturer.switchCamera(null); |
| + } |
| } |
| public void switchCamera() { |
| @@ -1133,7 +1164,9 @@ public class PeerConnectionClient { |
| if (stream.videoTracks.size() == 1) { |
| remoteVideoTrack = stream.videoTracks.get(0); |
| remoteVideoTrack.setEnabled(renderVideo); |
| - remoteVideoTrack.addRenderer(new VideoRenderer(remoteRender)); |
| + for (VideoRenderer.Callbacks remoteRender : remoteRenders) { |
| + remoteVideoTrack.addRenderer(new VideoRenderer(remoteRender)); |
| + } |
| } |
| } |
| }); |