add amr support to linphone-android

This commit is contained in:
Simon Morlat 2011-04-15 23:56:32 +02:00
parent 78146cc571
commit 3464da531f
19 changed files with 393 additions and 9 deletions

6
.gitmodules vendored
View file

@ -31,3 +31,9 @@
[submodule "submodules/externals/openssl"] [submodule "submodules/externals/openssl"]
path = submodules/externals/openssl path = submodules/externals/openssl
url = git://git.linphone.org/android-openssl.git 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

11
README
View file

@ -1,13 +1,22 @@
LINPHONE for ANDROID 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: Next step is to download libilbc code:
cd submodules/libilbc-rfc3951 && ./configure && make cd submodules/libilbc-rfc3951 && ./configure && make
Finnaly from directory linphone-android, just execute command: Finnaly from directory linphone-android, just execute command:
ndk-build 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)

View file

@ -1,5 +1,6 @@
root-dir:=$(APP_PROJECT_PATH) root-dir:=$(APP_PROJECT_PATH)
BUILD_AMR=light
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
BUILD_X264=1 BUILD_X264=1
@ -38,6 +39,9 @@ endif
include $(root-dir)/submodules/linphone/build/android/Android.mk 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

View file

@ -2,6 +2,7 @@ APP_PROJECT_PATH := $(call my-dir)/../
APP_MODULES :=libspeex libgsm libortp libosip2 libeXosip2 libmediastreamer2 liblinphone APP_MODULES :=libspeex libgsm libortp libosip2 libeXosip2 libmediastreamer2 liblinphone
#APP_STL := stlport_static #APP_STL := stlport_static
APP_MODULES += libopencoreamr libmsamr
ifeq ($(WITH_OPENSSL),1) ifeq ($(WITH_OPENSSL),1)
APP_MODULES += libcrypto libssl APP_MODULES += libcrypto libssl

Binary file not shown.

Binary file not shown.

View file

@ -33,6 +33,7 @@
<string name="pref_codec_pcma_key">pref_codec_pcma_key</string> <string name="pref_codec_pcma_key">pref_codec_pcma_key</string>
<string name="pref_codec_pcmu_key">pref_codec_pcmu_key</string> <string name="pref_codec_pcmu_key">pref_codec_pcmu_key</string>
<string name="pref_codec_gsm_key">pref_codec_gsm_key</string> <string name="pref_codec_gsm_key">pref_codec_gsm_key</string>
<string name="pref_codec_amr_key">pref_codec_amr_key</string>
<string name="pref_codec_ilbc_key">pref_codec_ilbc_key</string> <string name="pref_codec_ilbc_key">pref_codec_ilbc_key</string>
<string name="pref_codec_speex8_key">pref_codec_speex8_key</string> <string name="pref_codec_speex8_key">pref_codec_speex8_key</string>
<string name="pref_codec_speex16_key">pref_codec_speex16_key</string> <string name="pref_codec_speex16_key">pref_codec_speex16_key</string>
@ -40,4 +41,5 @@
<string name="pref_codecs_key">pref_codecs_key</string> <string name="pref_codecs_key">pref_codecs_key</string>
<string name="pref_stun_server_key">pref_stun_server_key</string> <string name="pref_stun_server_key">pref_stun_server_key</string>
</resources> </resources>

View file

@ -60,6 +60,7 @@
<string name="pref_codec_pcma">pcma</string> <string name="pref_codec_pcma">pcma</string>
<string name="pref_codec_pcmu">pcmu</string> <string name="pref_codec_pcmu">pcmu</string>
<string name="pref_codec_gsm">gsm</string> <string name="pref_codec_gsm">gsm</string>
<string name="pref_codec_amr">amr</string>
<string name="pref_codec_ilbc">ilbc</string> <string name="pref_codec_ilbc">ilbc</string>
<string name="pref_codec_speex8">speex 8 Khz</string> <string name="pref_codec_speex8">speex 8 Khz</string>
<string name="pref_codec_speex16">speex 16 Khz</string> <string name="pref_codec_speex16">speex 16 Khz</string>
@ -115,4 +116,6 @@
<string name="first_login_connect">Connect</string> <string name="first_login_connect">Connect</string>
<string name="first_launch_no_login_password">Please enter your login and password</string> <string name="first_launch_no_login_password">Please enter your login and password</string>
<string name="first_launch_bad_login_password">Couldn\'t connect; check your login and password and start again</string> <string name="first_launch_bad_login_password">Couldn\'t connect; check your login and password and start again</string>
<string name="pref_amr_summary">AMR codec might not be present on your phone</string>
</resources> </resources>

View file

@ -57,7 +57,10 @@
android:title="@string/pref_codec_ilbc" android:title="@string/pref_codec_ilbc"
android:shouldDisableView="true" android:shouldDisableView="true"
android:summary="@string/pref_ilbc_summary"/> android:summary="@string/pref_ilbc_summary"/>
<CheckBoxPreference android:key="@string/pref_codec_gsm_key" <CheckBoxPreference android:key="@string/pref_codec_amr_key"
android:title="@string/pref_codec_amr"
android:shouldDisableView="true" />
<CheckBoxPreference android:key="@string/pref_codec_gsm_key"
android:title="@string/pref_codec_gsm"/> android:title="@string/pref_codec_gsm"/>
<CheckBoxPreference android:key="@string/pref_codec_pcmu_key" <CheckBoxPreference android:key="@string/pref_codec_pcmu_key"
android:title="@string/pref_codec_pcmu"/> android:title="@string/pref_codec_pcmu"/>

View file

@ -512,4 +512,3 @@ public class LinphoneActivity extends TabActivity {
}); });
} }
} }

View file

@ -26,6 +26,7 @@ import static android.media.AudioManager.STREAM_RING;
import static android.media.AudioManager.STREAM_VOICE_CALL; import static android.media.AudioManager.STREAM_VOICE_CALL;
import static android.media.AudioManager.VIBRATE_TYPE_RINGER; 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_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_speex16_key;
import static org.linphone.R.string.pref_codec_speex32_key; import static org.linphone.R.string.pref_codec_speex32_key;
import static org.linphone.R.string.pref_echo_cancellation_key; import static org.linphone.R.string.pref_echo_cancellation_key;
@ -385,12 +386,19 @@ public final class LinphoneManager implements LinphoneCoreListener {
} }
public boolean detectVideoCodec(String mime) { public boolean detectVideoCodec(String mime) {
for (PayloadType videoCodec : mLc.listVideoCodecs()) { for (PayloadType videoCodec : mLc.getVideoCodecs()) {
if (mime.equals(videoCodec.getMime())) return true; if (mime.equals(videoCodec.getMime())) return true;
} }
return false; 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 { public void initFromConf(Context context) throws LinphoneConfigException {
//traces //traces
boolean lIsDebug = mPref.getBoolean(getString(R.string.pref_debug_key), false); boolean lIsDebug = mPref.getBoolean(getString(R.string.pref_debug_key), false);
@ -411,9 +419,10 @@ public final class LinphoneManager implements LinphoneCoreListener {
enableDisableAudioCodec("GSM", 8000, R.string.pref_codec_gsm_key); enableDisableAudioCodec("GSM", 8000, R.string.pref_codec_gsm_key);
enableDisableAudioCodec("PCMU", 8000, R.string.pref_codec_pcmu_key); enableDisableAudioCodec("PCMU", 8000, R.string.pref_codec_pcmu_key);
enableDisableAudioCodec("PCMA", 8000, R.string.pref_codec_pcma_key); enableDisableAudioCodec("PCMA", 8000, R.string.pref_codec_pcma_key);
enableDisableAudioCodec("AMR", 8000, R.string.pref_codec_amr_key);
// Configure video codecs // Configure video codecs
for (PayloadType videoCodec : mLc.listVideoCodecs()) { for (PayloadType videoCodec : mLc.getVideoCodecs()) {
enableDisableVideoCodecs(videoCodec); enableDisableVideoCodecs(videoCodec);
} }
@ -817,6 +826,10 @@ public final class LinphoneManager implements LinphoneCoreListener {
.findPayloadType("iLBC", 8000)!=null; .findPayloadType("iLBC", 8000)!=null;
e.putBoolean(getString(pref_codec_ilbc_key), ilbc); 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(); e.commit();
} }

View file

@ -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.ec_calibration_launch_message;
import static org.linphone.R.string.pref_codec_ilbc_key; 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_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_echo_canceller_calibration_key;
import static org.linphone.R.string.pref_video_enable_key; import static org.linphone.R.string.pref_video_enable_key;
@ -91,6 +92,8 @@ public class LinphonePreferencesActivity extends PreferenceActivity implements E
//findPreference(pref_codec_speex32_key)).setEnabled(enableIlbc); //findPreference(pref_codec_speex32_key)).setEnabled(enableIlbc);
} }
detectAudioCodec(pref_codec_amr_key,"AMR",8000);
// No video // No video
if (Version.sdkStrictlyBelow(5) || !fastCpu || !LinphoneManager.getInstance().hasCamera()) { if (Version.sdkStrictlyBelow(5) || !fastCpu || !LinphoneManager.getInstance().hasCamera()) {
disableCheckbox(pref_video_enable_key); disableCheckbox(pref_video_enable_key);

View file

@ -88,6 +88,7 @@ class LinphoneCoreImpl implements LinphoneCore {
private native void setRing(long nativePtr, String path); private native void setRing(long nativePtr, String path);
private native String getRing(long nativePtr); private native String getRing(long nativePtr);
private native long[] listVideoPayloadTypes(long nativePtr); private native long[] listVideoPayloadTypes(long nativePtr);
private native long[] listAudioPayloadTypes(long nativePtr);
private native void enableKeepAlive(long nativePtr,boolean enable); private native void enableKeepAlive(long nativePtr,boolean enable);
private native boolean isKeepAliveEnabled(long nativePtr); private native boolean isKeepAliveEnabled(long nativePtr);
private native int startEchoCalibration(long nativePtr,Object data); private native int startEchoCalibration(long nativePtr,Object data);
@ -413,7 +414,7 @@ class LinphoneCoreImpl implements LinphoneCore {
return getRing(nativePtr); return getRing(nativePtr);
} }
public PayloadType[] listVideoCodecs() { public PayloadType[] getVideoCodecs() {
long[] typesPtr = listVideoPayloadTypes(nativePtr); long[] typesPtr = listVideoPayloadTypes(nativePtr);
if (typesPtr == null) return null; if (typesPtr == null) return null;
@ -425,6 +426,18 @@ class LinphoneCoreImpl implements LinphoneCore {
return codecs; 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() { public boolean isNetworkReachable() {
throw new RuntimeException("Not implemented"); throw new RuntimeException("Not implemented");
} }

View file

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

View file

@ -0,0 +1,116 @@
#define AMRNB_WRAPPER_INTERNAL
#include <sp_dec.h>
#include <amrdecode.h>
#include <amrencode.h>
#include "interf_dec.h"
#include "interf_enc.h"
#include <dlfcn.h>
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"

View file

@ -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

1
submodules/externals/opencore-amr vendored Submodule

@ -0,0 +1 @@
Subproject commit c1d74140f421e21f8f732e91b4baf9a7cc3f157b

@ -1 +1 @@
Subproject commit e8318e75125045566366707d10f1ca8d08536da6 Subproject commit 749c984e862a617146869cee5b1de5de3bfc6103

1
submodules/msamr Submodule

@ -0,0 +1 @@
Subproject commit 08a333f7bc7e45f218cf7bf0d6ab7081cbce3b17