Index: webrtc/examples/androidapp/src/org/appspot/apprtc/CallActivity.java |
diff --git a/webrtc/examples/androidapp/src/org/appspot/apprtc/CallActivity.java b/webrtc/examples/androidapp/src/org/appspot/apprtc/CallActivity.java |
index a1ea8a457d2ed2e1589e56e1828ea23e6c5a4bfe..359e98689654825304f8db70462d96a28499e498 100644 |
--- a/webrtc/examples/androidapp/src/org/appspot/apprtc/CallActivity.java |
+++ b/webrtc/examples/androidapp/src/org/appspot/apprtc/CallActivity.java |
@@ -29,14 +29,22 @@ import android.view.Window; |
import android.view.WindowManager.LayoutParams; |
import android.widget.Toast; |
+import java.io.IOException; |
+import java.lang.RuntimeException; |
+import java.util.ArrayList; |
+import java.util.List; |
+ |
import org.webrtc.Camera2Enumerator; |
import org.webrtc.EglBase; |
+import org.webrtc.GlVideoFileRenderer; |
+import org.webrtc.GlRectDrawer; |
import org.webrtc.IceCandidate; |
import org.webrtc.PeerConnectionFactory; |
import org.webrtc.RendererCommon.ScalingType; |
import org.webrtc.SessionDescription; |
import org.webrtc.StatsReport; |
import org.webrtc.SurfaceViewRenderer; |
+import org.webrtc.VideoRenderer; |
/** |
* Activity for peer connection call setup, call waiting |
@@ -96,6 +104,18 @@ public class CallActivity extends Activity |
"org.appspot.apprtc.CMDLINE"; |
public static final String EXTRA_RUNTIME = |
"org.appspot.apprtc.RUNTIME"; |
+ public static final String EXTRA_VIDEO_FILE_AS_CAMERA = |
+ "org.appspot.apprtc.VIDEO_FILE_AS_CAMERA"; |
+ public static final String EXTRA_VIDEO_FILE_AS_CAMERA_WIDTH = |
+ "org.appspot.apprtc.VIDEO_FILE_AS_CAMERA_WIDTH"; |
+ public static final String EXTRA_VIDEO_FILE_AS_CAMERA_HEIGHT = |
+ "org.appspot.apprtc.VIDEO_FILE_AS_CAMERA_HEIGHT"; |
+ public static final String EXTRA_SAVE_REMOTE_VIDEO_TO_FILE = |
+ "org.appspot.apprtc.SAVE_REMOTE_VIDEO_TO_FILE"; |
+ public static final String EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_WIDTH = |
+ "org.appspot.apprtc.SAVE_REMOTE_VIDEO_TO_FILE_WIDTH"; |
+ public static final String EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_HEIGHT = |
+ "org.appspot.apprtc.SAVE_REMOTE_VIDEO_TO_FILE_HEIGHT"; |
private static final String TAG = "CallRTCClient"; |
// List of mandatory application permissions. |
@@ -128,7 +148,9 @@ public class CallActivity extends Activity |
private AppRTCAudioManager audioManager = null; |
private EglBase rootEglBase; |
private SurfaceViewRenderer localRender; |
- private SurfaceViewRenderer remoteRender; |
+ private SurfaceViewRenderer remoteRenderScreen; |
+ private GlVideoFileRenderer videoFileRenderer; |
+ private List<VideoRenderer.Callbacks> remoteRenders = new ArrayList<VideoRenderer.Callbacks>(); |
private PercentFrameLayout localRenderLayout; |
private PercentFrameLayout remoteRenderLayout; |
private ScalingType scalingType; |
@@ -176,7 +198,7 @@ public class CallActivity extends Activity |
// Create UI controls. |
localRender = (SurfaceViewRenderer) findViewById(R.id.local_video_view); |
- remoteRender = (SurfaceViewRenderer) findViewById(R.id.remote_video_view); |
+ remoteRenderScreen = (SurfaceViewRenderer) findViewById(R.id.remote_video_view); |
localRenderLayout = (PercentFrameLayout) findViewById(R.id.local_video_layout); |
remoteRenderLayout = (PercentFrameLayout) findViewById(R.id.remote_video_layout); |
callFragment = new CallFragment(); |
@@ -191,12 +213,32 @@ public class CallActivity extends Activity |
}; |
localRender.setOnClickListener(listener); |
- remoteRender.setOnClickListener(listener); |
+ remoteRenderScreen.setOnClickListener(listener); |
+ remoteRenders.add(remoteRenderScreen); |
+ |
+ final Intent intent = getIntent(); |
// Create video renderers. |
rootEglBase = EglBase.create(); |
localRender.init(rootEglBase.getEglBaseContext(), null); |
- remoteRender.init(rootEglBase.getEglBaseContext(), null); |
+ String saveRemoteVideoToFile = intent.getStringExtra(EXTRA_SAVE_REMOTE_VIDEO_TO_FILE); |
+ |
+ // When saveRemoveToFile is set we save the video from the remote to a file. |
+ if (saveRemoteVideoToFile != null) { |
+ int videoOutWidth = intent.getIntExtra(EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_WIDTH, 0); |
+ int videoOutHeight = intent.getIntExtra(EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_HEIGHT, 0); |
+ try { |
+ videoFileRenderer = new GlVideoFileRenderer( |
+ saveRemoteVideoToFile, videoOutWidth, videoOutHeight, |
+ rootEglBase.getEglBaseContext()); |
+ remoteRenders.add(videoFileRenderer); |
+ } |
+ catch (IOException e) { |
+ throw new RuntimeException("Failed to open video file for output: " + saveRemoteVideoToFile, e); |
+ } |
+ } |
+ remoteRenderScreen.init(rootEglBase.getEglBaseContext(), null); |
+ |
localRender.setZOrderMediaOverlay(true); |
updateVideoView(); |
@@ -211,7 +253,6 @@ public class CallActivity extends Activity |
} |
// Get Intent parameters. |
- final Intent intent = getIntent(); |
Uri roomUri = intent.getData(); |
if (roomUri == null) { |
logAndToast(getString(R.string.missing_url)); |
@@ -221,6 +262,7 @@ public class CallActivity extends Activity |
return; |
} |
String roomId = intent.getStringExtra(EXTRA_ROOMID); |
+ Log.d(TAG, "Room ID: " + roomId); |
if (roomId == null || roomId.length() == 0) { |
logAndToast(getString(R.string.missing_url)); |
Log.e(TAG, "Incorrect room ID in intent!"); |
@@ -255,9 +297,13 @@ public class CallActivity extends Activity |
intent.getBooleanExtra(EXTRA_DISABLE_BUILT_IN_AEC, false), |
intent.getBooleanExtra(EXTRA_DISABLE_BUILT_IN_AGC, false), |
intent.getBooleanExtra(EXTRA_DISABLE_BUILT_IN_NS, false), |
- intent.getBooleanExtra(EXTRA_ENABLE_LEVEL_CONTROL, false)); |
- commandLineRun = intent.getBooleanExtra(EXTRA_CMDLINE, false); |
- runTimeMs = intent.getIntExtra(EXTRA_RUNTIME, 0); |
+ intent.getBooleanExtra(EXTRA_ENABLE_LEVEL_CONTROL, false), |
+ intent.getStringExtra(EXTRA_VIDEO_FILE_AS_CAMERA), |
+ intent.getIntExtra(EXTRA_VIDEO_FILE_AS_CAMERA_WIDTH, 0), |
+ intent.getIntExtra(EXTRA_VIDEO_FILE_AS_CAMERA_HEIGHT, 0)); |
+ runTimeMs = intent.getIntExtra(EXTRA_RUNTIME, 0); |
+ |
+ Log.d(TAG, "VIDEO_FILE: '" + intent.getStringExtra(EXTRA_VIDEO_FILE_AS_CAMERA) + "'"); |
// Create connection client. Use DirectRTCClient if room name is an IP otherwise use the |
// standard WebSocketRTCClient. |
@@ -393,8 +439,8 @@ public class CallActivity extends Activity |
private void updateVideoView() { |
remoteRenderLayout.setPosition(REMOTE_X, REMOTE_Y, REMOTE_WIDTH, REMOTE_HEIGHT); |
- remoteRender.setScalingType(scalingType); |
- remoteRender.setMirror(false); |
+ remoteRenderScreen.setScalingType(scalingType); |
+ remoteRenderScreen.setMirror(false); |
if (iceConnected) { |
localRenderLayout.setPosition( |
@@ -408,7 +454,7 @@ public class CallActivity extends Activity |
localRender.setMirror(true); |
localRender.requestLayout(); |
- remoteRender.requestLayout(); |
+ remoteRenderScreen.requestLayout(); |
} |
private void startCall() { |
@@ -474,9 +520,13 @@ public class CallActivity extends Activity |
localRender.release(); |
localRender = null; |
} |
- if (remoteRender != null) { |
- remoteRender.release(); |
- remoteRender = null; |
+ if (videoFileRenderer != null) { |
+ videoFileRenderer.release(); |
+ videoFileRenderer = null; |
+ } |
+ if (remoteRenderScreen != null) { |
+ remoteRenderScreen.release(); |
+ remoteRenderScreen = null; |
} |
if (audioManager != null) { |
audioManager.close(); |
@@ -540,7 +590,7 @@ public class CallActivity extends Activity |
signalingParameters = params; |
logAndToast("Creating peer connection, delay=" + delta + "ms"); |
peerConnectionClient.createPeerConnection(rootEglBase.getEglBaseContext(), |
- localRender, remoteRender, signalingParameters); |
+ localRender, remoteRenders, signalingParameters); |
if (signalingParameters.initiator) { |
logAndToast("Creating OFFER..."); |