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