| 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..ddbea64f658f146d92e06554ed37c589bebe23b0 100644
|
| --- a/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java
|
| +++ b/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java
|
| @@ -41,6 +41,10 @@ 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.FileVideoCapturerTimer;
|
| import org.webrtc.VideoSource;
|
| import org.webrtc.VideoTrack;
|
| import org.webrtc.voiceengine.WebRtcAudioManager;
|
| @@ -48,8 +52,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 +114,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;
|
| @@ -161,6 +167,9 @@ public class PeerConnectionClient {
|
| public final boolean disableBuiltInAGC;
|
| public final boolean disableBuiltInNS;
|
| public final boolean enableLevelControl;
|
| + public final String videoFileAsCamera;
|
| + public final int videoFileAsCameraWidth;
|
| + public final int videoFileAsCameraHeight;
|
|
|
| public PeerConnectionParameters(
|
| boolean videoCallEnabled, boolean loopback, boolean tracing, boolean useCamera2,
|
| @@ -169,7 +178,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, int videoFileAsCameraWidth, int videoFileAsCameraHeight) {
|
| +
|
| this.videoCallEnabled = videoCallEnabled;
|
| this.useCamera2 = useCamera2;
|
| this.loopback = loopback;
|
| @@ -190,6 +201,9 @@ public class PeerConnectionClient {
|
| this.disableBuiltInAGC = disableBuiltInAGC;
|
| this.disableBuiltInNS = disableBuiltInNS;
|
| this.enableLevelControl = enableLevelControl;
|
| + this.videoFileAsCamera = videoFileAsCamera;
|
| + this.videoFileAsCameraWidth = videoFileAsCameraWidth;
|
| + this.videoFileAsCameraHeight = videoFileAsCameraHeight;
|
| }
|
| }
|
|
|
| @@ -294,12 +308,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 +569,19 @@ public class PeerConnectionClient {
|
|
|
| mediaStream = factory.createLocalMediaStream("ARDAMS");
|
| if (videoCallEnabled) {
|
| - if (peerConnectionParameters.useCamera2) {
|
| + if (peerConnectionParameters.videoFileAsCamera != null) {
|
| + FileVideoCapturer fileVideoCapturer = FileVideoCapturer.create(
|
| + peerConnectionParameters.videoFileAsCamera,
|
| + peerConnectionParameters.videoFileAsCameraWidth,
|
| + peerConnectionParameters.videoFileAsCameraHeight);
|
| +
|
| + if (fileVideoCapturer == null) {
|
| + reportError("Failed to open video file for emulated camera");
|
| + return;
|
| + }
|
| + videoCapturer = new FileVideoCapturerTimer(fileVideoCapturer);
|
| + }
|
| + else if (peerConnectionParameters.useCamera2) {
|
| if (!peerConnectionParameters.captureToTexture) {
|
| reportError(context.getString(R.string.camera2_texture_only_error));
|
| return;
|
| @@ -556,7 +593,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;
|
| @@ -1133,7 +1169,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));
|
| + }
|
| }
|
| }
|
| });
|
|
|