aboutsummaryrefslogtreecommitdiff
path: root/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java
diff options
context:
space:
mode:
Diffstat (limited to 'webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java')
-rw-r--r--webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java104
1 files changed, 74 insertions, 30 deletions
diff --git a/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java b/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java
index 263046b2e9..c41dd66345 100644
--- a/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java
+++ b/webrtc/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java
@@ -11,12 +11,15 @@
package org.appspot.apprtc;
import android.content.Context;
+import android.os.ParcelFileDescriptor;
+import android.os.Environment;
import android.util.Log;
import org.appspot.apprtc.AppRTCClient.SignalingParameters;
import org.appspot.apprtc.util.LooperExecutor;
import org.webrtc.CameraEnumerationAndroid;
import org.webrtc.DataChannel;
+import org.webrtc.EglBase;
import org.webrtc.IceCandidate;
import org.webrtc.Logging;
import org.webrtc.MediaCodecVideoEncoder;
@@ -34,7 +37,10 @@ import org.webrtc.VideoCapturerAndroid;
import org.webrtc.VideoRenderer;
import org.webrtc.VideoSource;
import org.webrtc.VideoTrack;
+import org.webrtc.voiceengine.WebRtcAudioManager;
+import java.io.File;
+import java.io.IOException;
import java.util.EnumSet;
import java.util.LinkedList;
import java.util.Timer;
@@ -42,8 +48,6 @@ import java.util.TimerTask;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import javax.microedition.khronos.egl.EGLContext;
-
/**
* Peer connection client implementation.
*
@@ -55,7 +59,6 @@ public class PeerConnectionClient {
public static final String VIDEO_TRACK_ID = "ARDAMSv0";
public static final String AUDIO_TRACK_ID = "ARDAMSa0";
private static final String TAG = "PCRTCClient";
- private static final String FIELD_TRIAL_VP9 = "WebRTC-SupportVP9/Enabled/";
private static final String FIELD_TRIAL_AUTOMATIC_RESIZE =
"WebRTC-MediaCodecVideoEncoder-AutomaticResize/Enabled/";
private static final String VIDEO_CODEC_VP8 = "VP8";
@@ -94,7 +97,7 @@ public class PeerConnectionClient {
private VideoSource videoSource;
private boolean videoCallEnabled;
private boolean preferIsac;
- private boolean preferH264;
+ private String preferredVideoCodec;
private boolean videoSourceStopped;
private boolean isError;
private Timer statsTimer;
@@ -104,6 +107,7 @@ public class PeerConnectionClient {
private MediaConstraints pcConstraints;
private MediaConstraints videoConstraints;
private MediaConstraints audioConstraints;
+ private ParcelFileDescriptor aecDumpFileDescriptor;
private MediaConstraints sdpMediaConstraints;
private PeerConnectionParameters peerConnectionParameters;
// Queued remote ICE candidates are consumed only after both local and
@@ -127,35 +131,41 @@ public class PeerConnectionClient {
public static class PeerConnectionParameters {
public final boolean videoCallEnabled;
public final boolean loopback;
+ public final boolean tracing;
public final int videoWidth;
public final int videoHeight;
public final int videoFps;
public final int videoStartBitrate;
public final String videoCodec;
public final boolean videoCodecHwAcceleration;
+ public final boolean captureToTexture;
public final int audioStartBitrate;
public final String audioCodec;
public final boolean noAudioProcessing;
- public final boolean cpuOveruseDetection;
+ public final boolean aecDump;
+ public final boolean useOpenSLES;
public PeerConnectionParameters(
- boolean videoCallEnabled, boolean loopback,
+ boolean videoCallEnabled, boolean loopback, boolean tracing,
int videoWidth, int videoHeight, int videoFps, int videoStartBitrate,
- String videoCodec, boolean videoCodecHwAcceleration,
+ String videoCodec, boolean videoCodecHwAcceleration, boolean captureToTexture,
int audioStartBitrate, String audioCodec,
- boolean noAudioProcessing, boolean cpuOveruseDetection) {
+ boolean noAudioProcessing, boolean aecDump, boolean useOpenSLES) {
this.videoCallEnabled = videoCallEnabled;
this.loopback = loopback;
+ this.tracing = tracing;
this.videoWidth = videoWidth;
this.videoHeight = videoHeight;
this.videoFps = videoFps;
this.videoStartBitrate = videoStartBitrate;
this.videoCodec = videoCodec;
this.videoCodecHwAcceleration = videoCodecHwAcceleration;
+ this.captureToTexture = captureToTexture;
this.audioStartBitrate = audioStartBitrate;
this.audioCodec = audioCodec;
this.noAudioProcessing = noAudioProcessing;
- this.cpuOveruseDetection = cpuOveruseDetection;
+ this.aecDump = aecDump;
+ this.useOpenSLES = useOpenSLES;
}
}
@@ -228,7 +238,6 @@ public class PeerConnectionClient {
factory = null;
peerConnection = null;
preferIsac = false;
- preferH264 = false;
videoSourceStopped = false;
isError = false;
queuedRemoteCandidates = null;
@@ -249,7 +258,7 @@ public class PeerConnectionClient {
}
public void createPeerConnection(
- final EGLContext renderEGLContext,
+ final EglBase.Context renderEGLContext,
final VideoRenderer.Callbacks localRender,
final VideoRenderer.Callbacks remoteRender,
final SignalingParameters signalingParameters) {
@@ -283,31 +292,47 @@ public class PeerConnectionClient {
}
private void createPeerConnectionFactoryInternal(Context context) {
+ PeerConnectionFactory.initializeInternalTracer();
+ if (peerConnectionParameters.tracing) {
+ PeerConnectionFactory.startInternalTracingCapture(
+ Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator
+ + "webrtc-trace.txt");
+ }
Log.d(TAG, "Create peer connection factory. Use video: " +
peerConnectionParameters.videoCallEnabled);
isError = false;
// Initialize field trials.
- String field_trials = FIELD_TRIAL_AUTOMATIC_RESIZE;
- // Check if VP9 is used by default.
- if (videoCallEnabled && peerConnectionParameters.videoCodec != null
- && peerConnectionParameters.videoCodec.equals(VIDEO_CODEC_VP9)) {
- field_trials += FIELD_TRIAL_VP9;
+ PeerConnectionFactory.initializeFieldTrials(FIELD_TRIAL_AUTOMATIC_RESIZE);
+
+ // Check preferred video codec.
+ preferredVideoCodec = VIDEO_CODEC_VP8;
+ if (videoCallEnabled && peerConnectionParameters.videoCodec != null) {
+ if (peerConnectionParameters.videoCodec.equals(VIDEO_CODEC_VP9)) {
+ preferredVideoCodec = VIDEO_CODEC_VP9;
+ } else if (peerConnectionParameters.videoCodec.equals(VIDEO_CODEC_H264)) {
+ preferredVideoCodec = VIDEO_CODEC_H264;
+ }
}
- PeerConnectionFactory.initializeFieldTrials(field_trials);
+ Log.d(TAG, "Pereferred video codec: " + preferredVideoCodec);
- // Check if H.264 is used by default.
- preferH264 = false;
- if (videoCallEnabled && peerConnectionParameters.videoCodec != null
- && peerConnectionParameters.videoCodec.equals(VIDEO_CODEC_H264)) {
- preferH264 = true;
- }
// Check if ISAC is used by default.
preferIsac = false;
if (peerConnectionParameters.audioCodec != null
&& peerConnectionParameters.audioCodec.equals(AUDIO_CODEC_ISAC)) {
preferIsac = true;
}
+
+ // Enable/disable OpenSL ES playback.
+ if (!peerConnectionParameters.useOpenSLES) {
+ Log.d(TAG, "Disable OpenSL ES audio even if device supports it");
+ WebRtcAudioManager.setBlacklistDeviceForOpenSLESUsage(true /* enable */);
+ } else {
+ Log.d(TAG, "Allow OpenSL ES audio if device supports it");
+ WebRtcAudioManager.setBlacklistDeviceForOpenSLESUsage(false);
+ }
+
+ // Create peer connection factory.
if (!PeerConnectionFactory.initializeAndroidGlobals(context, true, true,
peerConnectionParameters.videoCodecHwAcceleration)) {
events.onPeerConnectionError("Failed to initializeAndroidGlobals");
@@ -405,7 +430,7 @@ public class PeerConnectionClient {
}
}
- private void createPeerConnectionInternal(EGLContext renderEGLContext) {
+ private void createPeerConnectionInternal(EglBase.Context renderEGLContext) {
if (factory == null || isError) {
Log.e(TAG, "Peerconnection factory is not created");
return;
@@ -420,7 +445,7 @@ public class PeerConnectionClient {
if (videoCallEnabled) {
Log.d(TAG, "EGLContext: " + renderEGLContext);
- factory.setVideoHwAccelerationOptions(renderEGLContext);
+ factory.setVideoHwAccelerationOptions(renderEGLContext, renderEGLContext);
}
PeerConnection.RTCConfiguration rtcConfig =
@@ -453,7 +478,8 @@ public class PeerConnectionClient {
cameraDeviceName = frontCameraDeviceName;
}
Log.d(TAG, "Opening camera: " + cameraDeviceName);
- videoCapturer = VideoCapturerAndroid.create(cameraDeviceName, null);
+ videoCapturer = VideoCapturerAndroid.create(cameraDeviceName, null,
+ peerConnectionParameters.captureToTexture ? renderEGLContext : null);
if (videoCapturer == null) {
reportError("Failed to open camera");
return;
@@ -466,10 +492,26 @@ public class PeerConnectionClient {
factory.createAudioSource(audioConstraints)));
peerConnection.addStream(mediaStream);
+ if (peerConnectionParameters.aecDump) {
+ try {
+ aecDumpFileDescriptor = ParcelFileDescriptor.open(
+ new File("/sdcard/Download/audio.aecdump"),
+ ParcelFileDescriptor.MODE_READ_WRITE |
+ ParcelFileDescriptor.MODE_CREATE |
+ ParcelFileDescriptor.MODE_TRUNCATE);
+ factory.startAecDump(aecDumpFileDescriptor.getFd());
+ } catch(IOException e) {
+ Log.e(TAG, "Can not open aecdump file", e);
+ }
+ }
+
Log.d(TAG, "Peer connection created.");
}
private void closeInternal() {
+ if (factory != null && peerConnectionParameters.aecDump) {
+ factory.stopAecDump();
+ }
Log.d(TAG, "Closing peer connection.");
statsTimer.cancel();
if (peerConnection != null) {
@@ -489,6 +531,8 @@ public class PeerConnectionClient {
options = null;
Log.d(TAG, "Closing peer connection done.");
events.onPeerConnectionClosed();
+ PeerConnectionFactory.stopInternalTracingCapture();
+ PeerConnectionFactory.shutdownInternalTracer();
}
public boolean isHDVideo() {
@@ -623,8 +667,8 @@ public class PeerConnectionClient {
if (preferIsac) {
sdpDescription = preferCodec(sdpDescription, AUDIO_CODEC_ISAC, true);
}
- if (videoCallEnabled && preferH264) {
- sdpDescription = preferCodec(sdpDescription, VIDEO_CODEC_H264, false);
+ if (videoCallEnabled) {
+ sdpDescription = preferCodec(sdpDescription, preferredVideoCodec, false);
}
if (videoCallEnabled && peerConnectionParameters.videoStartBitrate > 0) {
sdpDescription = setStartBitrate(VIDEO_CODEC_VP8, true,
@@ -972,8 +1016,8 @@ public class PeerConnectionClient {
if (preferIsac) {
sdpDescription = preferCodec(sdpDescription, AUDIO_CODEC_ISAC, true);
}
- if (videoCallEnabled && preferH264) {
- sdpDescription = preferCodec(sdpDescription, VIDEO_CODEC_H264, false);
+ if (videoCallEnabled) {
+ sdpDescription = preferCodec(sdpDescription, preferredVideoCodec, false);
}
final SessionDescription sdp = new SessionDescription(
origSdp.type, sdpDescription);