diff --git a/.gitmodules b/.gitmodules
index 59de3f33d..c5216a0dc 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -31,3 +31,9 @@
[submodule "submodules/externals/openssl"]
path = submodules/externals/openssl
url = git://git.linphone.org/android-openssl.git
+[submodule "submodules/externals/opencore-amr"]
+ path = submodules/externals/opencore-amr
+ url = git://opencore-amr.git.sourceforge.net/gitroot/opencore-amr/opencore-amr
+[submodule "submodules/msamr"]
+ path = submodules/msamr
+ url = git://git.linphone.org:msamr
diff --git a/README b/README
index 1b4823403..3bd333205 100644
--- a/README
+++ b/README
@@ -1,13 +1,22 @@
LINPHONE for ANDROID
****************************
-To build liblinphone for Android, you must first download the Android ndk R4 from google.
+To build liblinphone for Android, you must first download the Android ndk r5b from google.
Next step is to download libilbc code:
cd submodules/libilbc-rfc3951 && ./configure && make
Finnaly from directory linphone-android, just execute command:
ndk-build
+Some options can be passed to ndk-build, like "ndk-build SOME_OPTION=SOME_VALUE"
+
+Option Name | Possible values
+----------------------------------------
+BUILD_X264 0 (don't build x264) or 1 (build x264)
+BUILD_AMR 0 (don't build amr codec), light (try to use amr codec from android), full (build your own amr codec)
+
+
+
diff --git a/jni/Android.mk b/jni/Android.mk
index 5df0275f2..37d052a69 100755
--- a/jni/Android.mk
+++ b/jni/Android.mk
@@ -1,5 +1,6 @@
root-dir:=$(APP_PROJECT_PATH)
+BUILD_AMR=light
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
BUILD_X264=1
@@ -38,6 +39,9 @@ endif
include $(root-dir)/submodules/linphone/build/android/Android.mk
-
+ifneq ($(BUILD_AMR), 0)
+include $(root-dir)/submodules/externals/build/opencore-amr/Android.mk
+include $(root-dir)/submodules/msamr/Android.mk
+endif
diff --git a/jni/Application.mk b/jni/Application.mk
index 0c1ecb42b..ec6c942d2 100644
--- a/jni/Application.mk
+++ b/jni/Application.mk
@@ -2,6 +2,7 @@ APP_PROJECT_PATH := $(call my-dir)/../
APP_MODULES :=libspeex libgsm libortp libosip2 libeXosip2 libmediastreamer2 liblinphone
#APP_STL := stlport_static
+APP_MODULES += libopencoreamr libmsamr
ifeq ($(WITH_OPENSSL),1)
APP_MODULES += libcrypto libssl
diff --git a/libs/armeabi-v7a/liblinphone.so b/libs/armeabi-v7a/liblinphone.so
index 0bf0d958b..dc9c1441a 100755
Binary files a/libs/armeabi-v7a/liblinphone.so and b/libs/armeabi-v7a/liblinphone.so differ
diff --git a/libs/armeabi/liblinphone.so b/libs/armeabi/liblinphone.so
index 794ef38e6..63be2ef8a 100755
Binary files a/libs/armeabi/liblinphone.so and b/libs/armeabi/liblinphone.so differ
diff --git a/res/values/non_localizable_strings.xml b/res/values/non_localizable_strings.xml
index c26241115..84ba4485b 100644
--- a/res/values/non_localizable_strings.xml
+++ b/res/values/non_localizable_strings.xml
@@ -33,6 +33,7 @@
pref_codec_pcma_key
pref_codec_pcmu_key
pref_codec_gsm_key
+ pref_codec_amr_key
pref_codec_ilbc_key
pref_codec_speex8_key
pref_codec_speex16_key
@@ -40,4 +41,5 @@
pref_codecs_key
pref_stun_server_key
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6208f192f..adc83a94c 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -60,6 +60,7 @@
pcma
pcmu
gsm
+ amr
ilbc
speex 8 Khz
speex 16 Khz
@@ -115,4 +116,6 @@
Connect
Please enter your login and password
Couldn\'t connect; check your login and password and start again
+
+AMR codec might not be present on your phone
diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml
index 0d91a6a90..04408c170 100644
--- a/res/xml/preferences.xml
+++ b/res/xml/preferences.xml
@@ -57,7 +57,10 @@
android:title="@string/pref_codec_ilbc"
android:shouldDisableView="true"
android:summary="@string/pref_ilbc_summary"/>
-
+
diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java
index e53c88858..01209100f 100644
--- a/src/org/linphone/LinphoneActivity.java
+++ b/src/org/linphone/LinphoneActivity.java
@@ -512,4 +512,3 @@ public class LinphoneActivity extends TabActivity {
});
}
}
-
diff --git a/src/org/linphone/LinphoneManager.java b/src/org/linphone/LinphoneManager.java
index c615f6ce0..074f897d3 100644
--- a/src/org/linphone/LinphoneManager.java
+++ b/src/org/linphone/LinphoneManager.java
@@ -26,6 +26,7 @@ import static android.media.AudioManager.STREAM_RING;
import static android.media.AudioManager.STREAM_VOICE_CALL;
import static android.media.AudioManager.VIBRATE_TYPE_RINGER;
import static org.linphone.R.string.pref_codec_ilbc_key;
+import static org.linphone.R.string.pref_codec_amr_key;
import static org.linphone.R.string.pref_codec_speex16_key;
import static org.linphone.R.string.pref_codec_speex32_key;
import static org.linphone.R.string.pref_echo_cancellation_key;
@@ -385,11 +386,18 @@ public final class LinphoneManager implements LinphoneCoreListener {
}
public boolean detectVideoCodec(String mime) {
- for (PayloadType videoCodec : mLc.listVideoCodecs()) {
+ for (PayloadType videoCodec : mLc.getVideoCodecs()) {
if (mime.equals(videoCodec.getMime())) return true;
}
return false;
}
+
+ public boolean detectAudioCodec(String mime){
+ for (PayloadType audioCodec : mLc.getAudioCodecs()) {
+ if (mime.equals(audioCodec.getMime())) return true;
+ }
+ return false;
+ }
public void initFromConf(Context context) throws LinphoneConfigException {
//traces
@@ -411,9 +419,10 @@ public final class LinphoneManager implements LinphoneCoreListener {
enableDisableAudioCodec("GSM", 8000, R.string.pref_codec_gsm_key);
enableDisableAudioCodec("PCMU", 8000, R.string.pref_codec_pcmu_key);
enableDisableAudioCodec("PCMA", 8000, R.string.pref_codec_pcma_key);
+ enableDisableAudioCodec("AMR", 8000, R.string.pref_codec_amr_key);
// Configure video codecs
- for (PayloadType videoCodec : mLc.listVideoCodecs()) {
+ for (PayloadType videoCodec : mLc.getVideoCodecs()) {
enableDisableVideoCodecs(videoCodec);
}
@@ -816,6 +825,10 @@ public final class LinphoneManager implements LinphoneCoreListener {
boolean ilbc = LinphoneService.isReady() && LinphoneManager.getLc()
.findPayloadType("iLBC", 8000)!=null;
e.putBoolean(getString(pref_codec_ilbc_key), ilbc);
+
+ boolean amr = LinphoneService.isReady() && LinphoneManager.getLc()
+ .findPayloadType("AMR", 8000)!=null;
+ e.putBoolean(getString(pref_codec_amr_key), amr);
e.commit();
}
diff --git a/src/org/linphone/LinphonePreferencesActivity.java b/src/org/linphone/LinphonePreferencesActivity.java
index c0163660f..ec2859b3f 100644
--- a/src/org/linphone/LinphonePreferencesActivity.java
+++ b/src/org/linphone/LinphonePreferencesActivity.java
@@ -24,6 +24,7 @@ import static org.linphone.R.string.ec_calibrating;
import static org.linphone.R.string.ec_calibration_launch_message;
import static org.linphone.R.string.pref_codec_ilbc_key;
import static org.linphone.R.string.pref_codec_speex16_key;
+import static org.linphone.R.string.pref_codec_amr_key;
import static org.linphone.R.string.pref_echo_canceller_calibration_key;
import static org.linphone.R.string.pref_video_enable_key;
@@ -66,7 +67,7 @@ public class LinphonePreferencesActivity extends PreferenceActivity implements E
private void detectVideoCodec(int id, String mime) {
findPreference(id).setEnabled(LinphoneManager.getInstance().detectVideoCodec(mime));
}
-
+
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -90,6 +91,8 @@ public class LinphonePreferencesActivity extends PreferenceActivity implements E
findPreference(pref_codec_speex16_key).setEnabled(true);
//findPreference(pref_codec_speex32_key)).setEnabled(enableIlbc);
}
+
+ detectAudioCodec(pref_codec_amr_key,"AMR",8000);
// No video
if (Version.sdkStrictlyBelow(5) || !fastCpu || !LinphoneManager.getInstance().hasCamera()) {
diff --git a/src/org/linphone/core/LinphoneCoreImpl.java b/src/org/linphone/core/LinphoneCoreImpl.java
index f90812fc4..9b374c0f8 100644
--- a/src/org/linphone/core/LinphoneCoreImpl.java
+++ b/src/org/linphone/core/LinphoneCoreImpl.java
@@ -88,6 +88,7 @@ class LinphoneCoreImpl implements LinphoneCore {
private native void setRing(long nativePtr, String path);
private native String getRing(long nativePtr);
private native long[] listVideoPayloadTypes(long nativePtr);
+ private native long[] listAudioPayloadTypes(long nativePtr);
private native void enableKeepAlive(long nativePtr,boolean enable);
private native boolean isKeepAliveEnabled(long nativePtr);
private native int startEchoCalibration(long nativePtr,Object data);
@@ -413,7 +414,7 @@ class LinphoneCoreImpl implements LinphoneCore {
return getRing(nativePtr);
}
- public PayloadType[] listVideoCodecs() {
+ public PayloadType[] getVideoCodecs() {
long[] typesPtr = listVideoPayloadTypes(nativePtr);
if (typesPtr == null) return null;
@@ -425,6 +426,18 @@ class LinphoneCoreImpl implements LinphoneCore {
return codecs;
}
+ public PayloadType[] getAudioCodecs() {
+ long[] typesPtr = listAudioPayloadTypes(nativePtr);
+ if (typesPtr == null) return null;
+
+ PayloadType[] codecs = new PayloadType[typesPtr.length];
+
+ for (int i=0; i < codecs.length; i++) {
+ codecs[i] = new PayloadTypeImpl(typesPtr[i]);
+ }
+
+ return codecs;
+ }
public boolean isNetworkReachable() {
throw new RuntimeException("Not implemented");
}
diff --git a/submodules/externals/build/opencore-amr/Android.mk b/submodules/externals/build/opencore-amr/Android.mk
new file mode 100644
index 000000000..8820a7e2b
--- /dev/null
+++ b/submodules/externals/build/opencore-amr/Android.mk
@@ -0,0 +1,200 @@
+
+
+LOCAL_PATH:= $(call my-dir)/../../opencore-amr
+
+BUILD_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libopencoreamr
+
+LOCAL_SRC_FILES := \
+ amrnb/wrapper.cpp
+
+ifeq ($(BUILD_AMR),light)
+#in this mode we try to dynamically link against the opencore-amr provided by android
+LOCAL_CFLAGS += -include ../build/opencore-amr/stubs.h
+LOCAL_SRC_FILES += ../build/opencore-amr/stubs.cpp
+else
+#in the other mode (full) we build our own opencore-amr.
+
+
+#common files
+
+LOCAL_SRC_FILES += \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/add.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/az_lsp.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/bitno_tab.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/bitreorder_tab.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/c2_9pf_tab.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/div_s.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/gains_tbl.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/gc_pred.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/get_const_tbls.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/gmed_n.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/grid_tbl.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/gray_tbl.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/int_lpc.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/inv_sqrt.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/inv_sqrt_tbl.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/l_shr_r.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/log2.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/log2_norm.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/log2_tbl.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/lsfwt.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/lsp.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/lsp_az.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/lsp_lsf.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/lsp_lsf_tbl.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/lsp_tab.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/mult_r.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/norm_l.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/norm_s.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/overflow_tbl.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/ph_disp_tab.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/pow2.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/pow2_tbl.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/pred_lt.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/q_plsf.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/q_plsf_3.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/q_plsf_3_tbl.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/q_plsf_5.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/q_plsf_5_tbl.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/qua_gain_tbl.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/reorder.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/residu.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/round.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/shr.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/shr_r.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/sqrt_l.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/sqrt_l_tbl.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/sub.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/syn_filt.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/weight_a.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/common/src/window_tab.cpp
+
+#encoder files
+
+LOCAL_SRC_FILES += \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/amrencode.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/autocorr.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/c1035pf.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/c2_11pf.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/c2_9pf.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/c3_14pf.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/c4_17pf.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/c8_31pf.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/calc_cor.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/calc_en.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/cbsearch.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/cl_ltp.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/cod_amr.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/convolve.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/cor_h.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/cor_h_x.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/cor_h_x2.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/corrwght_tab.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/div_32.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/dtx_enc.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/enc_lag3.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/enc_lag6.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/enc_output_format_tab.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/ets_to_if2.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/ets_to_wmf.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/g_adapt.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/g_code.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/g_pitch.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/gain_q.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/hp_max.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/inter_36.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/inter_36_tab.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/l_abs.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/l_comp.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/l_extract.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/l_negate.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/lag_wind.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/lag_wind_tab.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/levinson.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/lpc.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/ol_ltp.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/p_ol_wgh.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/pitch_fr.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/pitch_ol.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/pre_big.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/pre_proc.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/prm2bits.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/q_gain_c.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/q_gain_p.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/qgain475.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/qgain795.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/qua_gain.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/s10_8pf.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/set_sign.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/sid_sync.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/sp_enc.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/spreproc.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/spstproc.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/ton_stab.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src/vad1.cpp
+
+#decoder files
+# opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/decoder_gsm_amr.cpp \
+
+
+LOCAL_SRC_FILES += \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/a_refl.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/agc.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/amrdecode.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/b_cn_cod.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/bgnscd.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/c_g_aver.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/d1035pf.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/d2_11pf.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/d2_9pf.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/d3_14pf.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/d4_17pf.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/d8_31pf.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/d_gain_c.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/d_gain_p.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/d_plsf.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/d_plsf_3.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/d_plsf_5.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/dec_amr.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/dec_gain.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/dec_input_format_tab.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/dec_lag3.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/dec_lag6.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/dtx_dec.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/ec_gains.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/ex_ctrl.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/if2_to_ets.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/int_lsf.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/lsp_avg.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/ph_disp.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/post_pro.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/preemph.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/pstfilt.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/qgain475_tab.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/sp_dec.cpp \
+ opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src/wmf_to_ets.cpp
+
+endif
+
+LOCAL_ARM_MODE := arm
+
+
+
+#for including config.h:
+LOCAL_C_INCLUDES += \
+ $(LOCAL_PATH)/opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/include \
+ $(LOCAL_PATH)/opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/include \
+ $(LOCAL_PATH)/opencore/codecs_v2/audio/gsm_amr/amr_nb/dec/src \
+ $(LOCAL_PATH)/opencore/codecs_v2/audio/gsm_amr/amr_nb/enc/src \
+ $(LOCAL_PATH)/opencore/codecs_v2/audio/gsm_amr/amr_nb/common/include \
+ $(LOCAL_PATH)/opencore/codecs_v2/audio/gsm_amr/common/dec/include \
+ $(LOCAL_PATH)/amrnb \
+ $(LOCAL_PATH)/oscl
+
+include $(BUILD_STATIC_LIBRARY)
+
+
diff --git a/submodules/externals/build/opencore-amr/stubs.cpp b/submodules/externals/build/opencore-amr/stubs.cpp
new file mode 100644
index 000000000..b44afd085
--- /dev/null
+++ b/submodules/externals/build/opencore-amr/stubs.cpp
@@ -0,0 +1,116 @@
+
+#define AMRNB_WRAPPER_INTERNAL
+#include
+#include
+#include
+#include "interf_dec.h"
+#include "interf_enc.h"
+
+#include
+
+static Word16 (*sym_AMRDecode)(
+ void *state_data,
+ enum Frame_Type_3GPP frame_type,
+ UWord8 *speech_bits_ptr,
+ Word16 *raw_pcm_buffer,
+ bitstream_format input_format
+);
+
+static void (*sym_GSMDecodeFrameExit)(void **state_data);
+
+static Word16 (*sym_GSMInitDecode)(void **state_data, Word8 *id);
+
+static Word16 (*sym_AMREncodeInit)(
+ void **pEncStructure,
+ void **pSidSyncStructure,
+ Flag dtx_enable);
+
+static void (*sym_AMREncodeExit)(
+ void **pEncStructure,
+ void **pSidSyncStructure);
+
+static Word16 (*sym_AMREncode)(
+ void *pEncState,
+ void *pSidSyncState,
+ enum Mode mode,
+ Word16 *pEncInput,
+ UWord8 *pEncOutput,
+ enum Frame_Type_3GPP *p3gpp_frame_type,
+ Word16 output_format);
+
+extern "C"{
+
+Word16 AMREncodeInit(
+ void **pEncStructure,
+ void **pSidSyncStructure,
+ Flag dtx_enable){
+ return sym_AMREncodeInit(pEncStructure,pSidSyncStructure,dtx_enable);
+}
+
+void AMREncodeExit(
+ void **pEncStructure,
+ void **pSidSyncStructure){
+ return sym_AMREncodeExit(pEncStructure,pSidSyncStructure);
+}
+
+Word16 AMREncode(
+ void *pEncState,
+ void *pSidSyncState,
+ enum Mode mode,
+ Word16 *pEncInput,
+ UWord8 *pEncOutput,
+ enum Frame_Type_3GPP *p3gpp_frame_type,
+ Word16 output_format){
+ int err=sym_AMREncode(pEncState,pSidSyncState,mode,pEncInput,pEncOutput,p3gpp_frame_type,AMR_TX_WMF /*AMR_TX_IETF*/);
+ /*IETF format not supported by versions of opencore amr up to android 2.3, thus we ask WMF and fix after*/
+ /*both formats seems identical except the first byte.*/
+ pEncOutput[0]=(*p3gpp_frame_type)<<3;
+ return err;
+}
+
+Word16 AMRDecode(
+ void *state_data,
+ enum Frame_Type_3GPP frame_type,
+ UWord8 *speech_bits_ptr,
+ Word16 *raw_pcm_buffer,
+ bitstream_format input_format
+){
+ return sym_AMRDecode(state_data,frame_type,speech_bits_ptr,raw_pcm_buffer,input_format);
+}
+
+void GSMDecodeFrameExit(void **state_data){
+ return sym_GSMDecodeFrameExit(state_data);
+}
+
+Word16 GSMInitDecode(void **state_data, Word8 *id){
+ return sym_GSMInitDecode(state_data,id);
+}
+
+#define LOAD_SYMBOL(symbol) \
+{ \
+ *((void**)&sym_##symbol)=dlsym(handle,#symbol); \
+ if (sym_##symbol==NULL) { \
+ *missing=#symbol; \
+ return -1; \
+ } \
+}
+
+int opencore_amr_wrapper_init(const char **missing){
+ void *handle=dlopen("libstagefright.so",RTLD_GLOBAL);
+ if (handle==NULL){
+ *missing="libstagefright.so";
+ return -1;
+ }
+ LOAD_SYMBOL(AMRDecode);
+ LOAD_SYMBOL(GSMDecodeFrameExit)
+ LOAD_SYMBOL(GSMInitDecode);
+ LOAD_SYMBOL(AMREncodeInit);
+ LOAD_SYMBOL(AMREncodeExit);
+ LOAD_SYMBOL(AMREncode);
+ return 0;
+}
+
+
+}//end of extern "C"
+
+
diff --git a/submodules/externals/build/opencore-amr/stubs.h b/submodules/externals/build/opencore-amr/stubs.h
new file mode 100644
index 000000000..8f2ef0802
--- /dev/null
+++ b/submodules/externals/build/opencore-amr/stubs.h
@@ -0,0 +1,10 @@
+
+
+#define GSMDecodeFrameExit my_GSMDecodeFrameExit
+#define GSMInitDecode my_GSMInitDecode
+#define AMRDecode my_AMRDecode
+#define AMREncodeInit my_AMREncodeInit
+#define AMREncodeExit my_AMREncodeExit
+#define AMREncode my_AMREncode
+
+
diff --git a/submodules/externals/opencore-amr b/submodules/externals/opencore-amr
new file mode 160000
index 000000000..c1d74140f
--- /dev/null
+++ b/submodules/externals/opencore-amr
@@ -0,0 +1 @@
+Subproject commit c1d74140f421e21f8f732e91b4baf9a7cc3f157b
diff --git a/submodules/linphone b/submodules/linphone
index e8318e751..749c984e8 160000
--- a/submodules/linphone
+++ b/submodules/linphone
@@ -1 +1 @@
-Subproject commit e8318e75125045566366707d10f1ca8d08536da6
+Subproject commit 749c984e862a617146869cee5b1de5de3bfc6103
diff --git a/submodules/msamr b/submodules/msamr
new file mode 160000
index 000000000..08a333f7b
--- /dev/null
+++ b/submodules/msamr
@@ -0,0 +1 @@
+Subproject commit 08a333f7bc7e45f218cf7bf0d6ab7081cbce3b17