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)); |
+ } |
} |
} |
}); |