Support new WebSocket signaling format.
- Support new GAE message format and new signaling sequence, which allows connection to 3-dot-apprtc server. - Add UI setting to switch between GAE / WebSockets signaling. - Some clean ups to better support command line application execution. BUG=3937,3995,4041 R=jiayl@webrtc.org, tkchin@webrtc.org Review URL: https://webrtc-codereview.appspot.com/27319004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@7813 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
@@ -51,6 +51,7 @@ import android.widget.ListView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Random;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
@@ -62,16 +63,18 @@ import org.webrtc.MediaCodecVideoEncoder;
|
||||
*/
|
||||
public class ConnectActivity extends Activity {
|
||||
|
||||
public static final String EXTRA_ROOMNAME = "org.appspot.apprtc.ROOMNAME";
|
||||
public static final String EXTRA_LOOPBACK = "org.appspot.apprtc.LOOPBACK";
|
||||
public static final String EXTRA_CMDLINE = "org.appspot.apprtc.CMDLINE";
|
||||
public static final String EXTRA_RUNTIME = "org.appspot.apprtc.RUNTIME";
|
||||
public static final String EXTRA_BITRATE = "org.appspot.apprtc.BITRATE";
|
||||
public static final String EXTRA_HWCODEC = "org.appspot.apprtc.HWCODEC";
|
||||
private static final String TAG = "ConnectActivity";
|
||||
private final boolean USE_WEBSOCKETS = false;
|
||||
public static final String EXTRA_WEBSOCKET = "org.appspot.apprtc.WEBSOCKET";
|
||||
private static final String TAG = "ConnectRTCClient";
|
||||
private final String APPRTC_SERVER = "https://apprtc.appspot.com";
|
||||
private final String APPRTC_WS_SERVER = "https://8-dot-apprtc.appspot.com";
|
||||
private final String APPRTC_WS_SERVER = "https://3-dot-apprtc.appspot.com";
|
||||
private final int CONNECTION_REQUEST = 1;
|
||||
private static boolean commandLineRun = false;
|
||||
|
||||
private ImageButton addRoomButton;
|
||||
private ImageButton removeRoomButton;
|
||||
@@ -86,12 +89,11 @@ public class ConnectActivity extends Activity {
|
||||
private String keyprefBitrateValue;
|
||||
private String keyprefHwCodec;
|
||||
private String keyprefCpuUsageDetection;
|
||||
private String keyprefWebsocketSignaling;
|
||||
private String keyprefRoom;
|
||||
private String keyprefRoomList;
|
||||
private ArrayList<String> roomList;
|
||||
private ArrayAdapter<String> adapter;
|
||||
private boolean commandLineRun;
|
||||
private int runTimeMs;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
@@ -106,6 +108,7 @@ public class ConnectActivity extends Activity {
|
||||
keyprefBitrateValue = getString(R.string.pref_startbitratevalue_key);
|
||||
keyprefHwCodec = getString(R.string.pref_hwcodec_key);
|
||||
keyprefCpuUsageDetection = getString(R.string.pref_cpu_usage_detection_key);
|
||||
keyprefWebsocketSignaling = getString(R.string.pref_signaling_key);
|
||||
keyprefRoom = getString(R.string.pref_room_key);
|
||||
keyprefRoomList = getString(R.string.pref_room_list_key);
|
||||
|
||||
@@ -140,17 +143,15 @@ public class ConnectActivity extends Activity {
|
||||
connectLoopbackButton.setOnClickListener(connectListener);
|
||||
|
||||
// If an implicit VIEW intent is launching the app, go directly to that URL.
|
||||
commandLineRun = false;
|
||||
final Intent intent = getIntent();
|
||||
if ("android.intent.action.VIEW".equals(intent.getAction())) {
|
||||
if ("android.intent.action.VIEW".equals(intent.getAction()) &&
|
||||
!commandLineRun) {
|
||||
commandLineRun = true;
|
||||
boolean loopback = intent.getBooleanExtra(EXTRA_LOOPBACK, false);
|
||||
runTimeMs = intent.getIntExtra(EXTRA_RUNTIME, 0);
|
||||
String url = intent.getData().toString();
|
||||
if (loopback && !url.contains("debug=loopback")) {
|
||||
url += "/?debug=loopback";
|
||||
}
|
||||
connectToRoom(url, loopback, 0, true);
|
||||
int runTimeMs = intent.getIntExtra(EXTRA_RUNTIME, 0);
|
||||
String room = sharedPref.getString(keyprefRoom, "");
|
||||
roomEditText.setText(room);
|
||||
connectToRoom(loopback, runTimeMs);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -227,108 +228,141 @@ public class ConnectActivity extends Activity {
|
||||
if (view.getId() == R.id.connect_loopback_button) {
|
||||
loopback = true;
|
||||
}
|
||||
String url;
|
||||
if (USE_WEBSOCKETS) {
|
||||
url = APPRTC_WS_SERVER;
|
||||
} else {
|
||||
url = APPRTC_SERVER;
|
||||
}
|
||||
if (loopback) {
|
||||
url += "/?debug=loopback";
|
||||
} else {
|
||||
String roomName = getSelectedItem();
|
||||
if (roomName == null) {
|
||||
roomName = roomEditText.getText().toString();
|
||||
}
|
||||
url += "/?r=" + roomName;
|
||||
}
|
||||
// Check HW codec flag.
|
||||
boolean hwCodec = sharedPref.getBoolean(keyprefHwCodec,
|
||||
Boolean.valueOf(getString(R.string.pref_hwcodec_default)));
|
||||
// Add video resolution constraints.
|
||||
String parametersResolution = null;
|
||||
String parametersFps = null;
|
||||
String resolution = sharedPref.getString(keyprefResolution,
|
||||
getString(R.string.pref_resolution_default));
|
||||
String[] dimensions = resolution.split("[ x]+");
|
||||
if (dimensions.length == 2) {
|
||||
try {
|
||||
int maxWidth = Integer.parseInt(dimensions[0]);
|
||||
int maxHeight = Integer.parseInt(dimensions[1]);
|
||||
if (maxWidth > 0 && maxHeight > 0) {
|
||||
parametersResolution = "minHeight=" + maxHeight + ",maxHeight=" +
|
||||
maxHeight + ",minWidth=" + maxWidth + ",maxWidth=" + maxWidth;
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
Log.e(TAG, "Wrong video resolution setting: " + resolution);
|
||||
}
|
||||
}
|
||||
// Add camera fps constraints.
|
||||
String fps = sharedPref.getString(keyprefFps,
|
||||
getString(R.string.pref_fps_default));
|
||||
String[] fpsValues = fps.split("[ x]+");
|
||||
if (fpsValues.length == 2) {
|
||||
try {
|
||||
int cameraFps = Integer.parseInt(fpsValues[0]);
|
||||
if (cameraFps > 0) {
|
||||
parametersFps = "minFrameRate=" + cameraFps +
|
||||
",maxFrameRate=" + cameraFps;
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
Log.e(TAG, "Wrong camera fps setting: " + fps);
|
||||
}
|
||||
}
|
||||
// Modify connection URL.
|
||||
if (parametersResolution != null || parametersFps != null) {
|
||||
url += "&video=";
|
||||
if (parametersResolution != null) {
|
||||
url += parametersResolution;
|
||||
if (parametersFps != null) {
|
||||
url += ",";
|
||||
}
|
||||
}
|
||||
if (parametersFps != null) {
|
||||
url += parametersFps;
|
||||
}
|
||||
} else {
|
||||
if (hwCodec && MediaCodecVideoEncoder.isPlatformSupported()) {
|
||||
url += "&hd=true";
|
||||
}
|
||||
}
|
||||
// Get start bitrate.
|
||||
int startBitrate = 0;
|
||||
String bitrateTypeDefault = getString(R.string.pref_startbitrate_default);
|
||||
String bitrateType = sharedPref.getString(
|
||||
keyprefBitrateType, bitrateTypeDefault);
|
||||
if (!bitrateType.equals(bitrateTypeDefault)) {
|
||||
String bitrateValue = sharedPref.getString(keyprefBitrateValue,
|
||||
getString(R.string.pref_startbitratevalue_default));
|
||||
startBitrate = Integer.parseInt(bitrateValue);
|
||||
}
|
||||
// Test if CpuOveruseDetection should be disabled. By default is on.
|
||||
boolean cpuOveruseDetection = sharedPref.getBoolean(
|
||||
keyprefCpuUsageDetection,
|
||||
Boolean.valueOf(
|
||||
getString(R.string.pref_cpu_usage_detection_default)));
|
||||
if (!cpuOveruseDetection) {
|
||||
url += "&googCpuOveruseDetection=false";
|
||||
}
|
||||
// TODO(kjellander): Add support for custom parameters to the URL.
|
||||
connectToRoom(url, loopback, startBitrate, hwCodec);
|
||||
commandLineRun = false;
|
||||
connectToRoom(loopback, 0);
|
||||
}
|
||||
};
|
||||
|
||||
private void connectToRoom(
|
||||
String roomUrl, boolean loopback, int startBitrate, boolean hwCodec) {
|
||||
if (validateUrl(roomUrl)) {
|
||||
Uri url = Uri.parse(roomUrl);
|
||||
private String appendQueryParameter(String url, String parameter) {
|
||||
String newUrl = url;
|
||||
if (newUrl.contains("?")) {
|
||||
newUrl += "&" + parameter;
|
||||
} else {
|
||||
newUrl += "?" + parameter;
|
||||
}
|
||||
return newUrl;
|
||||
}
|
||||
|
||||
private void connectToRoom(boolean loopback, int runTimeMs) {
|
||||
// Check webSocket signaling flag.
|
||||
boolean useWebsocket = sharedPref.getBoolean(keyprefWebsocketSignaling,
|
||||
Boolean.valueOf(getString(R.string.pref_signaling_default)));
|
||||
|
||||
// Get room name (random for loopback).
|
||||
String roomName;
|
||||
if (loopback) {
|
||||
roomName = Integer.toString((new Random()).nextInt(100000000));
|
||||
} else {
|
||||
roomName = getSelectedItem();
|
||||
if (roomName == null) {
|
||||
roomName = roomEditText.getText().toString();
|
||||
}
|
||||
}
|
||||
|
||||
// Build room URL.
|
||||
String url;
|
||||
if (useWebsocket) {
|
||||
url = APPRTC_WS_SERVER;
|
||||
url += "/register/" + roomName;
|
||||
} else {
|
||||
url = APPRTC_SERVER;
|
||||
url = appendQueryParameter(url, "r=" + roomName);
|
||||
if (loopback) {
|
||||
url = appendQueryParameter(url, "debug=loopback");
|
||||
}
|
||||
}
|
||||
|
||||
// Check HW codec flag.
|
||||
boolean hwCodec = sharedPref.getBoolean(keyprefHwCodec,
|
||||
Boolean.valueOf(getString(R.string.pref_hwcodec_default)));
|
||||
|
||||
// Add video resolution constraints.
|
||||
String parametersResolution = null;
|
||||
String parametersFps = null;
|
||||
String resolution = sharedPref.getString(keyprefResolution,
|
||||
getString(R.string.pref_resolution_default));
|
||||
String[] dimensions = resolution.split("[ x]+");
|
||||
if (dimensions.length == 2) {
|
||||
try {
|
||||
int maxWidth = Integer.parseInt(dimensions[0]);
|
||||
int maxHeight = Integer.parseInt(dimensions[1]);
|
||||
if (maxWidth > 0 && maxHeight > 0) {
|
||||
parametersResolution = "minHeight=" + maxHeight + ",maxHeight=" +
|
||||
maxHeight + ",minWidth=" + maxWidth + ",maxWidth=" + maxWidth;
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
Log.e(TAG, "Wrong video resolution setting: " + resolution);
|
||||
}
|
||||
}
|
||||
|
||||
// Add camera fps constraints.
|
||||
String fps = sharedPref.getString(keyprefFps,
|
||||
getString(R.string.pref_fps_default));
|
||||
String[] fpsValues = fps.split("[ x]+");
|
||||
if (fpsValues.length == 2) {
|
||||
try {
|
||||
int cameraFps = Integer.parseInt(fpsValues[0]);
|
||||
if (cameraFps > 0) {
|
||||
parametersFps = "minFrameRate=" + cameraFps +
|
||||
",maxFrameRate=" + cameraFps;
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
Log.e(TAG, "Wrong camera fps setting: " + fps);
|
||||
}
|
||||
}
|
||||
|
||||
// Modify connection URL.
|
||||
if (parametersResolution != null || parametersFps != null) {
|
||||
String urlVideoParameters = "video=";
|
||||
if (parametersResolution != null) {
|
||||
urlVideoParameters += parametersResolution;
|
||||
if (parametersFps != null) {
|
||||
urlVideoParameters += ",";
|
||||
}
|
||||
}
|
||||
if (parametersFps != null) {
|
||||
urlVideoParameters += parametersFps;
|
||||
}
|
||||
url = appendQueryParameter(url, urlVideoParameters);
|
||||
} else {
|
||||
if (hwCodec && MediaCodecVideoEncoder.isPlatformSupported()) {
|
||||
url = appendQueryParameter(url, "hd=true");
|
||||
}
|
||||
}
|
||||
|
||||
// Get start bitrate.
|
||||
int startBitrate = 0;
|
||||
String bitrateTypeDefault = getString(R.string.pref_startbitrate_default);
|
||||
String bitrateType = sharedPref.getString(
|
||||
keyprefBitrateType, bitrateTypeDefault);
|
||||
if (!bitrateType.equals(bitrateTypeDefault)) {
|
||||
String bitrateValue = sharedPref.getString(keyprefBitrateValue,
|
||||
getString(R.string.pref_startbitratevalue_default));
|
||||
startBitrate = Integer.parseInt(bitrateValue);
|
||||
}
|
||||
|
||||
// Test if CpuOveruseDetection should be disabled. By default is on.
|
||||
boolean cpuOveruseDetection = sharedPref.getBoolean(
|
||||
keyprefCpuUsageDetection,
|
||||
Boolean.valueOf(
|
||||
getString(R.string.pref_cpu_usage_detection_default)));
|
||||
if (!cpuOveruseDetection) {
|
||||
url = appendQueryParameter(url, "googCpuOveruseDetection=false");
|
||||
}
|
||||
|
||||
// Start AppRTCDemo activity.
|
||||
Log.d(TAG, "Connecting to room " + roomName + " at URL " + url);
|
||||
if (validateUrl(url)) {
|
||||
Uri uri = Uri.parse(url);
|
||||
Intent intent = new Intent(this, AppRTCDemoActivity.class);
|
||||
intent.setData(url);
|
||||
intent.setData(uri);
|
||||
intent.putExtra(EXTRA_ROOMNAME, roomName);
|
||||
intent.putExtra(EXTRA_LOOPBACK, loopback);
|
||||
intent.putExtra(EXTRA_CMDLINE, commandLineRun);
|
||||
intent.putExtra(EXTRA_RUNTIME, runTimeMs);
|
||||
intent.putExtra(EXTRA_BITRATE, startBitrate);
|
||||
intent.putExtra(EXTRA_HWCODEC, hwCodec);
|
||||
intent.putExtra(EXTRA_WEBSOCKET, useWebsocket);
|
||||
startActivityForResult(intent, CONNECTION_REQUEST);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user