diff --git a/src/video_engine/main/test/android_test/jni/org_webrtc_videoengineapp_vie_android_java_api.h b/src/video_engine/main/test/android_test/jni/org_webrtc_videoengineapp_vie_android_java_api.h
index c1eed72f04..504a1ca387 100644
--- a/src/video_engine/main/test/android_test/jni/org_webrtc_videoengineapp_vie_android_java_api.h
+++ b/src/video_engine/main/test/android_test/jni/org_webrtc_videoengineapp_vie_android_java_api.h
@@ -114,6 +114,15 @@ JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_SetLocal
JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_SetSendDestination
(JNIEnv *, jobject, jint, jint, jbyteArray);
+/*
+ * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
+ * Method: GetCodecs(
+ * Signature: ()I
+ */
+JNIEXPORT jobjectArray JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_GetCodecs(
+ JNIEnv *env,
+ jobject);
+
/*
* Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
* Method: SetReceiveCodec
@@ -380,6 +389,14 @@ JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1Sto
JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1NumOfCodecs
(JNIEnv *, jobject);
+/*
+ * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
+ * Method: VoE_NumOfCodecs
+ * Signature: ()Z
+ */
+JNIEXPORT jobjectArray JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1GetCodecs
+ (JNIEnv *, jobject);
+
/*
* Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
* Method: VoE_SetSendCodec
diff --git a/src/video_engine/main/test/android_test/jni/vie_android_java_api.cc b/src/video_engine/main/test/android_test/jni/vie_android_java_api.cc
index 2bb8dcfe89..24de884c83 100644
--- a/src/video_engine/main/test/android_test/jni/vie_android_java_api.cc
+++ b/src/video_engine/main/test/android_test/jni/vie_android_java_api.cc
@@ -714,6 +714,49 @@ JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_SetSendC
return vieData.codec->SetSendCodec(channel, codec);
}
+/*
+ * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
+ * Method: SetSendCodec
+ * Signature: ()Z
+ */
+JNIEXPORT jobjectArray JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_GetCodecs(
+ JNIEnv *env,
+ jobject)
+{
+ if (NULL == vieData.codec) {
+ return NULL;
+ }
+
+ jobjectArray ret;
+ int i;
+ int num = vieData.codec->NumberOfCodecs();
+ char info[32];
+
+ ret = (jobjectArray)env->NewObjectArray(
+ num,
+ env->FindClass("java/lang/String"),
+ env->NewStringUTF(""));
+
+ for (int i = 0; i < num; ++i) {
+ webrtc::VideoCodec codecToList;
+ vieData.codec->GetCodec(i, codecToList);
+ sprintf(info, "%s pltype:%d", codecToList.plName, codecToList.plType);
+ env->SetObjectArrayElement(ret, i, env->NewStringUTF( info ));
+
+ __android_log_print(
+ ANDROID_LOG_DEBUG,
+ WEBRTC_LOG_TAG,
+ "Codec[%d] %s, pltype=%d, bitRate=%d, maxBitRate=%d,"
+ " width=%d, height=%d, frameRate=%d\n",
+ i, codecToList.plName, codecToList.plType,
+ codecToList.startBitrate, codecToList.maxBitrate,
+ codecToList.width, codecToList.height,
+ codecToList.maxFramerate);
+ }
+
+ return ret;
+}
+
/*
* Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
* Method: AddRemoteRenderer
@@ -1395,7 +1438,6 @@ JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1Sto
return voeData.file->StopPlayingFileAsMicrophone(channel);
}
-
/*
* Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
* Method: VoE_NumOfCodecs
@@ -1409,6 +1451,44 @@ JNIEXPORT jint JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1Num
return voeData.codec->NumOfCodecs();
}
+/*
+ * Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
+ * Method: VoE_NumOfCodecs
+ * Signature: ()I
+ */
+JNIEXPORT jobjectArray JNICALL Java_org_webrtc_videoengineapp_ViEAndroidJavaAPI_VoE_1GetCodecs(
+ JNIEnv *env,
+ jobject)
+{
+ if (!voeData.codec) {
+ __android_log_write(ANDROID_LOG_ERROR, WEBRTC_LOG_TAG,
+ "Codec pointer doesn't exist");
+ return NULL;
+ }
+
+ jobjectArray ret;
+ int i;
+ int num = voeData.codec->NumOfCodecs();
+ char info[32];
+
+ ret = (jobjectArray)env->NewObjectArray(
+ num,
+ env->FindClass("java/lang/String"),
+ env->NewStringUTF(""));
+
+ for(i = 0; i < num; i++) {
+ webrtc::CodecInst codecToList;
+ voeData.codec->GetCodec(i, codecToList);
+ __android_log_print(ANDROID_LOG_DEBUG, WEBRTC_LOG_TAG,
+ "VoiceEgnine Codec[%d] %s, pltype=%d\n",
+ i, codecToList.plname, codecToList.pltype);
+ sprintf(info, "%s pltype:%d", codecToList.plname, codecToList.pltype);
+ env->SetObjectArrayElement(ret, i, env->NewStringUTF( info ));
+ }
+
+ return ret;
+}
+
/*
* Class: org_webrtc_videoengineapp_ViEAndroidJavaAPI
* Method: VoE_SetSendCodec
diff --git a/src/video_engine/main/test/android_test/res/layout/main.xml b/src/video_engine/main/test/android_test/res/layout/main.xml
index c9cb6ce8cc..a75483343f 100644
--- a/src/video_engine/main/test/android_test/res/layout/main.xml
+++ b/src/video_engine/main/test/android_test/res/layout/main.xml
@@ -73,14 +73,14 @@
android:layout_height="wrap_content"
android:text="@string/opengl"
android:checked="true"
- android:textColor="#0f0"/>
+ android:textColor="#fff"/>
+ android:textColor="#fff" />
diff --git a/src/video_engine/main/test/android_test/res/layout/row.xml b/src/video_engine/main/test/android_test/res/layout/row.xml
new file mode 100644
index 0000000000..aa4f0ca448
--- /dev/null
+++ b/src/video_engine/main/test/android_test/res/layout/row.xml
@@ -0,0 +1,18 @@
+
+
+
+
diff --git a/src/video_engine/main/test/android_test/res/values/arrays.xml b/src/video_engine/main/test/android_test/res/values/arrays.xml
deleted file mode 100644
index 77dd0176e8..0000000000
--- a/src/video_engine/main/test/android_test/res/values/arrays.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
- - vp8
-
-
-- 176x144
- 320x240
-- 352x288
- 640x480
-
-
-
-
-- iPCM-wb
-- iSAC
-- iSAC-LC
-- EG711U
-- EG711A
-- PCMU
-- PCMA
-- iLBC
-
-
diff --git a/src/video_engine/main/test/android_test/src/org/webrtc/videoengineapp/ViEAndroidJavaAPI.java b/src/video_engine/main/test/android_test/src/org/webrtc/videoengineapp/ViEAndroidJavaAPI.java
index a1dd81091a..46676acc7b 100644
--- a/src/video_engine/main/test/android_test/src/org/webrtc/videoengineapp/ViEAndroidJavaAPI.java
+++ b/src/video_engine/main/test/android_test/src/org/webrtc/videoengineapp/ViEAndroidJavaAPI.java
@@ -54,6 +54,7 @@ public class ViEAndroidJavaAPI {
public native int SetLocalReceiver(int channel, int port);
public native int SetSendDestination(int channel, int port, byte ipadr[]);
// Codec
+ public native String[] GetCodecs();
public native int SetReceiveCodec(int channel, int codecNum,
int intbitRate, int width,
int height, int frameRate);
@@ -126,6 +127,7 @@ public class ViEAndroidJavaAPI {
// Codec-setting functions
public native int VoE_NumOfCodecs();
+ public native String[] VoE_GetCodecs();
public native int VoE_SetSendCodec(int channel, int index);
//VE funtions
diff --git a/src/video_engine/main/test/android_test/src/org/webrtc/videoengineapp/WebRTCDemo.java b/src/video_engine/main/test/android_test/src/org/webrtc/videoengineapp/WebRTCDemo.java
index 5e769e4c1c..d8043458d6 100644
--- a/src/video_engine/main/test/android_test/src/org/webrtc/videoengineapp/WebRTCDemo.java
+++ b/src/video_engine/main/test/android_test/src/org/webrtc/videoengineapp/WebRTCDemo.java
@@ -18,7 +18,10 @@ import java.util.Enumeration;
import org.webrtc.videoengine.ViERenderer;
import android.app.TabActivity;
+import android.app.AlertDialog;
+import android.app.Dialog;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.res.Configuration;
import android.content.pm.ActivityInfo;
import android.graphics.Canvas;
@@ -37,9 +40,11 @@ import android.os.PowerManager.WakeLock;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
+import android.view.LayoutInflater;
import android.view.Surface;
import android.view.SurfaceView;
import android.view.View;
+import android.view.ViewGroup;
import android.view.Display;
import android.view.Window;
import android.view.WindowManager;
@@ -137,7 +142,7 @@ public class WebRTCDemo extends TabActivity implements IViEAndroidCallback,
// Audio settings
private Spinner spVoiceCodecType;
- private int voiceCodecType = 5; // PCMU = 5
+ private int voiceCodecType = 0;
private TextView etARxPort;
private int receivePortVoice = 11113;
private TextView etATxPort;
@@ -162,6 +167,11 @@ public class WebRTCDemo extends TabActivity implements IViEAndroidCallback,
private boolean usingFrontCamera = false;
+ private String[] mVideoCodecsStrings = null;
+ private String[] mVideoCodecsSizeStrings = { "176x144", "320x240",
+ "352x288", "640x480" };
+ private String[] mVoiceCodecsStrings = null;
+
private OrientationEventListener orientationListener;
int currentOrientation = OrientationEventListener.ORIENTATION_UNKNOWN;
int currentCameraOrientation = 0;
@@ -348,6 +358,30 @@ public class WebRTCDemo extends TabActivity implements IViEAndroidCallback,
}
}
+ public class SpinnerAdapter extends ArrayAdapter {
+ private String[] mCodecString = null;
+ public SpinnerAdapter(Context context, int textViewResourceId, String[] objects) {
+ super(context, textViewResourceId, objects);
+ mCodecString = objects;
+ }
+
+ @Override public View getDropDownView(int position, View convertView, ViewGroup parent) {
+ return getCustomView(position, convertView, parent);
+ }
+
+ @Override public View getView(int position, View convertView, ViewGroup parent) {
+ return getCustomView(position, convertView, parent);
+ }
+
+ public View getCustomView(int position, View convertView, ViewGroup parent) {
+ LayoutInflater inflater = getLayoutInflater();
+ View row = inflater.inflate(R.layout.row, parent, false);
+ TextView label = (TextView)row.findViewById(R.id.spinner_row);
+ label.setText(mCodecString[position]);
+ return row;
+ }
+ }
+
private void StartMain() {
mTabHost.setCurrentTab(0);
@@ -357,6 +391,19 @@ public class WebRTCDemo extends TabActivity implements IViEAndroidCallback,
if (null == ViEAndroidAPI)
ViEAndroidAPI = new ViEAndroidJavaAPI(this);
+ if (0 > SetupVoE() || 0 > ViEAndroidAPI.GetVideoEngine() ||
+ 0 > ViEAndroidAPI.Init(enableTrace) ) {
+ // Show dialog
+ AlertDialog alertDialog = new AlertDialog.Builder(this).create();
+ alertDialog.setTitle("WebRTC Error");
+ alertDialog.setMessage("Can not init video engine.");
+ alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ return;
+ } });
+ alertDialog.show();
+ }
+
btSwitchCamera = (Button)findViewById(R.id.btSwitchCamera);
btSwitchCamera.setOnClickListener(this);
btStartStopCall = (Button)findViewById(R.id.btStartStopCall);
@@ -367,21 +414,31 @@ public class WebRTCDemo extends TabActivity implements IViEAndroidCallback,
remoteSurfaceView = null;
svLocal = null;
- // init UI
- ArrayAdapter> adapter;
-
- int resource = android.R.layout.simple_spinner_item;
- int dropdownRes = android.R.layout.simple_spinner_dropdown_item;
-
- // video codec
- spCodecType = (Spinner) findViewById(R.id.spCodecType);
- adapter = ArrayAdapter.createFromResource(this,
- R.array.codectype,
- resource);
- adapter.setDropDownViewResource(dropdownRes);
- spCodecType.setAdapter(adapter);
- spCodecType.setSelection(codecType);
+ // Video codec
+ mVideoCodecsStrings = ViEAndroidAPI.GetCodecs();
+ spCodecType = (Spinner)findViewById(R.id.spCodecType);
spCodecType.setOnItemSelectedListener(this);
+ spCodecType.setAdapter(new SpinnerAdapter(this,
+ R.layout.row,
+ mVideoCodecsStrings));
+ spCodecType.setSelection(0);
+
+ // Video Codec size
+ spCodecSize = (Spinner) findViewById(R.id.spCodecSize);
+ spCodecSize.setOnItemSelectedListener(this);
+ spCodecSize.setAdapter(new SpinnerAdapter(this,
+ R.layout.row,
+ mVideoCodecsSizeStrings));
+ spCodecSize.setSelection(0);
+
+ // Voice codec
+ mVoiceCodecsStrings = ViEAndroidAPI.VoE_GetCodecs();
+ spVoiceCodecType = (Spinner)findViewById(R.id.spVoiceCodecType);
+ spVoiceCodecType.setOnItemSelectedListener(this);
+ spVoiceCodecType.setAdapter(new SpinnerAdapter(this,
+ R.layout.row,
+ mVoiceCodecsStrings));
+ spVoiceCodecType.setSelection(0);
RadioGroup radioGroup = (RadioGroup)findViewById(R.id.radio_group1);
radioGroup.clearCheck();
@@ -392,22 +449,6 @@ public class WebRTCDemo extends TabActivity implements IViEAndroidCallback,
radioGroup.check(R.id.radio_surface);
}
- // voice codec
- spVoiceCodecType = (Spinner) findViewById(R.id.spVoiceCodecType);
- adapter = ArrayAdapter.createFromResource(this, R.array.voiceCodecType,
- resource);
- adapter.setDropDownViewResource(dropdownRes);
- spVoiceCodecType.setAdapter(adapter);
- spVoiceCodecType.setSelection(voiceCodecType);
- spVoiceCodecType.setOnItemSelectedListener(this);
-
- spCodecSize = (Spinner) findViewById(R.id.spCodecSize);
- adapter = ArrayAdapter.createFromResource(this, R.array.codecSize,
- resource);
- adapter.setDropDownViewResource(dropdownRes);
- spCodecSize.setAdapter(adapter);
- spCodecSize.setOnItemSelectedListener(this);
-
etRemoteIp = (EditText) findViewById(R.id.etRemoteIp);
etRemoteIp.setText(remoteIp);
@@ -462,7 +503,6 @@ public class WebRTCDemo extends TabActivity implements IViEAndroidCallback,
int ret = 0;
if (enableVoice) {
- SetupVoE();
StartVoiceEngine();
}
@@ -472,8 +512,6 @@ public class WebRTCDemo extends TabActivity implements IViEAndroidCallback,
svLocal = ViERenderer.CreateLocalRenderer(this);
}
- ret = ViEAndroidAPI.GetVideoEngine();
- ret = ViEAndroidAPI.Init(enableTrace);
channel = ViEAndroidAPI.CreateChannel(voiceChannel);
ret = ViEAndroidAPI.SetLocalReceiver(channel,
receivePortVideo);
@@ -573,7 +611,7 @@ public class WebRTCDemo extends TabActivity implements IViEAndroidCallback,
}
}
- private void SetupVoE() {
+ private int SetupVoE() {
// Create VoiceEngine
// Error logging is done in native API wrapper
ViEAndroidAPI.VoE_Create();
@@ -581,16 +619,19 @@ public class WebRTCDemo extends TabActivity implements IViEAndroidCallback,
// Initialize
if (0 != ViEAndroidAPI.VoE_Init(enableTrace)) {
Log.d(TAG, "VoE init failed");
+ return -1;
}
// Create channel
voiceChannel = ViEAndroidAPI.VoE_CreateChannel();
if (0 != voiceChannel) {
Log.d(TAG, "VoE create channel failed");
+ return -1;
}
// Suggest to use the voice call audio stream for hardware volume controls
setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
+ return 0;
}
private int StartVoiceEngine() {