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