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:
glaznev@webrtc.org
2014-12-04 17:28:52 +00:00
parent 0b38478885
commit 369746bcb8
11 changed files with 413 additions and 260 deletions

View File

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