├── LICENSE ├── Makefile ├── README.md ├── baresip-app-modules └── g729 │ ├── CMakeLists.txt │ ├── g729.c │ └── module.mk ├── re-patch └── tiff-patch /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2018, TutPro Inc. 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | * Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | 31 | Following of the libraries have their own licenses: 32 | 33 | * Apache 2.0: amr, openssl 34 | 35 | * LGPL 2.1: spandsp 36 | 37 | * AGPLv4: zrtp 38 | 39 | * GNU GPLv2: sndfile 40 | 41 | * GNU GPLv3: bcg729 42 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # -------------------- VALUES TO CONFIGURE -------------------- 2 | 3 | # Path to Android NDK 4 | # NDK version must match ndkVersion in app/build.gradle 5 | NDK_PATH := /opt/Android/ndk/$(shell sed -n '/ndkVersion/p' /usr/src/baresip-studio/app/build.gradle.kts | sed 's/[^0-9.]*//g') 6 | 7 | # Android API level 8 | API_LEVEL := 28 9 | 10 | # Set default from following values: [armeabi-v7a, arm64-v8a, x86_64] 11 | ANDROID_TARGET_ARCH := arm64-v8a 12 | 13 | # Directory where libraries and include files are instelled 14 | OUTPUT_DIR := /usr/src/baresip-studio/distribution 15 | 16 | # -------------------- GENERATED VALUES -------------------- 17 | 18 | CPU_COUNT := $(shell nproc) 19 | PWD := $(shell pwd) 20 | 21 | ifeq ($(ANDROID_TARGET_ARCH), armeabi-v7a) 22 | TARGET := arm-linux-androideabi 23 | CLANG_TARGET := armv7a-linux-androideabi 24 | ARCH := arm 25 | OPENSSL_ARCH := android-arm 26 | MARCH := armv7-a 27 | else 28 | ifeq ($(ANDROID_TARGET_ARCH), arm64-v8a) 29 | TARGET := aarch64-linux-android 30 | CLANG_TARGET := $(TARGET) 31 | ARCH := arm 32 | OPENSSL_ARCH := android-arm64 33 | MARCH := armv8-a 34 | else 35 | ifeq ($(ANDROID_TARGET_ARCH), x86_64) 36 | TARGET := x86_64-linux-android 37 | CLANG_TARGET := $(TARGET) 38 | ARCH := x86 39 | OPENSSL_ARCH := android-x86_64 40 | MARCH := x86-64 41 | else 42 | exit 1 43 | endif 44 | endif 45 | endif 46 | 47 | PLATFORM := android-$(API_LEVEL) 48 | 49 | OS := $(shell uname -s | tr "[A-Z]" "[a-z]") 50 | ifeq ($(OS),linux) 51 | HOST_OS := linux-x86_64 52 | endif 53 | ifeq ($(OS),darwin) 54 | HOST_OS := darwin-x86_64 55 | endif 56 | 57 | # Toolchain and sysroot 58 | TOOLCHAIN := $(NDK_PATH)/toolchains/llvm/prebuilt/$(HOST_OS) 59 | CMAKE_TOOLCHAIN_FILE := $(NDK_PATH)/build/cmake/android.toolchain.cmake 60 | SYSROOT := $(TOOLCHAIN)/sysroot 61 | PKG_CONFIG_LIBDIR := $(NDK_PATH)/prebuilt/$(HOST_OS)/lib/pkgconfig 62 | 63 | # Toolchain tools 64 | PATH := $(TOOLCHAIN)/bin:/usr/bin:/bin 65 | AR := llvm-ar 66 | AS := $(CLANG_TARGET)$(API_LEVEL)-clang 67 | CC := $(CLANG_TARGET)$(API_LEVEL)-clang 68 | CXX := $(CLANG_TARGET)$(API_LEVEL)-clang++ 69 | LD := ld.lld 70 | RANLIB := llvm-ranlib 71 | STRIP := llvm-strip 72 | 73 | # Compiler and Linker Flags for re and baresip 74 | # 75 | # NOTE: use -isystem to avoid warnings in system header files 76 | COMMON_CFLAGS := -isystem $(SYSROOT)/usr/include -fPIE -fPIC -march=$(MARCH) 77 | 78 | LFLAGS := -fPIE -pie 79 | 80 | COMMON_FLAGS := \ 81 | EXTRA_CFLAGS="$(COMMON_CFLAGS) -DANDROID" \ 82 | EXTRA_CXXFLAGS="$(COMMON_CFLAGS) -DANDROID -DHAVE_PTHREAD" \ 83 | EXTRA_LFLAGS="$(LFLAGS)" \ 84 | SYSROOT=$(SYSROOT)/usr \ 85 | HAVE_INTTYPES_H=1 \ 86 | HAVE_GETOPT=1 \ 87 | HAVE_LIBRESOLV= \ 88 | HAVE_RESOLV= \ 89 | HAVE_PTHREAD=1 \ 90 | HAVE_PTHREAD_RWLOCK=1 \ 91 | HAVE_LIBPTHREAD= \ 92 | HAVE_INET_PTON=1 \ 93 | HAVE_INET6=1 \ 94 | HAVE_GETIFADDRS= \ 95 | PEDANTIC= \ 96 | OS=$(OS) \ 97 | ARCH=$(ARCH) \ 98 | USE_OPENSSL=yes \ 99 | USE_OPENSSL_DTLS=yes \ 100 | USE_OPENSSL_SRTP=yes 101 | 102 | CMAKE_ANDROID_FLAGS := \ 103 | -DANDROID=ON \ 104 | -DANDROID_PLATFORM=$(API_LEVEL) \ 105 | -DCMAKE_SYSTEM_NAME=Android \ 106 | -DCMAKE_SYSTEM_VERSION=$(API_LEVEL) \ 107 | -DCMAKE_TOOLCHAIN_FILE=$(CMAKE_TOOLCHAIN_FILE) \ 108 | -DANDROID_ABI=$(ANDROID_TARGET_ARCH) \ 109 | -DCMAKE_ANDROID_ARCH_ABI=$(ANDROID_TARGET_ARCH) \ 110 | -DCMAKE_SKIP_INSTALL_RPATH=ON \ 111 | -DCMAKE_C_COMPILER=$(CC) \ 112 | -DCMAKE_CXX_COMPILER=$(CXX) \ 113 | -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ 114 | -DCMAKE_BUILD_TYPE=Release 115 | 116 | MODULES := "webrtc_aecm;augain;aaudio;dtls_srtp;opus;g711;g722;g7221;g726;codec2;amr;gzrtp;stun;turn;ice;presence;mwi;account;natpmp;srtp;uuid;sndfile;debug_cmd" 117 | 118 | APP_MODULES := "g729" 119 | 120 | default: all 121 | 122 | .PHONY: amr 123 | amr: 124 | cd amr && \ 125 | rm -rf lib include && \ 126 | autoreconf --install && \ 127 | CC="$(CC) --sysroot $(SYSROOT)" CXX=$(CXX) RANLIB=$(RANLIB) AR=$(AR) PATH=$(PATH) ./configure --host=$(TARGET) --disable-shared CXXFLAGS=-fPIC --prefix=$(PWD)/amr && \ 128 | make clean && \ 129 | CC="$(CC) --sysroot $(SYSROOT)" CXX=$(CXX) RANLIB=$(RANLIB) AR=$(AR) PATH=$(PATH) make && \ 130 | make install 131 | cd vo-amrwbenc && \ 132 | rm -rf include && \ 133 | autoreconf --install && \ 134 | CC="$(CC) --sysroot $(SYSROOT)" CXX=$(CXX) CC=$(CC) RANLIB=$(RANLIB) AR=$(AR) PATH=$(PATH) ./configure --host=$(TARGET) --disable-shared CFLAGS=-fPIC CXXFLAGS=-fPIC --prefix=$(PWD)/vo-amrwbenc && \ 135 | make clean && \ 136 | CC="$(CC) --sysroot $(SYSROOT)" CXX=$(CXX) RANLIB=$(RANLIB) AR=$(AR) PATH=$(PATH) make && \ 137 | make install 138 | rm -rf $(OUTPUT_DIR)/amr/lib/$(ANDROID_TARGET_ARCH) 139 | mkdir -p $(OUTPUT_DIR)/amr/lib/$(ANDROID_TARGET_ARCH) 140 | cp amr/amrnb/.libs/libopencore-amrnb.a $(OUTPUT_DIR)/amr/lib/$(ANDROID_TARGET_ARCH)/libamrnb.a 141 | cp amr/amrwb/.libs/libopencore-amrwb.a $(OUTPUT_DIR)/amr/lib/$(ANDROID_TARGET_ARCH)/libamrwb.a 142 | cp vo-amrwbenc/.libs/libvo-amrwbenc.a $(OUTPUT_DIR)/amr/lib/$(ANDROID_TARGET_ARCH)/libamrwbenc.a 143 | 144 | .PHONY: codec2 145 | codec2: 146 | cd codec2 && \ 147 | rm -rf build && rm -rf .cache && mkdir build && cd build && \ 148 | cmake .. -DBUILD_SHARED_LIBS=OFF $(CMAKE_ANDROID_FLAGS) && \ 149 | cmake --build . --target codec2 -j$(CPU_COUNT) && \ 150 | cp ../src/codec2.h codec2 151 | rm -rf $(OUTPUT_DIR)/codec2/lib/$(ANDROID_TARGET_ARCH) 152 | mkdir -p $(OUTPUT_DIR)/codec2/lib/$(ANDROID_TARGET_ARCH) 153 | cp codec2/build/src/libcodec2.a $(OUTPUT_DIR)/codec2/lib/$(ANDROID_TARGET_ARCH) 154 | 155 | .PHONY: g729 156 | g729: 157 | -make clean -C bcg729 158 | cd bcg729/build && \ 159 | find . -maxdepth 1 ! -name CMakeLists.txt -type f -delete && \ 160 | rm -rf build CMakeFiles include src && \ 161 | cmake .. $(CMAKE_ANDROID_FLAGS) && \ 162 | cmake --build . --target bcg729-static -j$(CPU_COUNT) 163 | rm -rf $(OUTPUT_DIR)/g729/lib/$(ANDROID_TARGET_ARCH) 164 | mkdir -p $(OUTPUT_DIR)/g729/lib/$(ANDROID_TARGET_ARCH) 165 | cp bcg729/build/src/libbcg729.a $(OUTPUT_DIR)/g729/lib/$(ANDROID_TARGET_ARCH) 166 | 167 | .PHONY: g7221 168 | g7221: 169 | -make distclean -C g7221 170 | cd g7221 && \ 171 | libtoolize --force && \ 172 | autoreconf --install && \ 173 | autoconf && \ 174 | CC="$(CC) --sysroot $(SYSROOT)" \ 175 | RANLIB=$(RANLIB) AR=$(AR) PATH=$(BIN):$(PATH) \ 176 | ac_cv_func_malloc_0_nonnull=yes \ 177 | ./configure --host=$(TARGET) --disable-shared CFLAGS="-fPIC" && \ 178 | CC="$(CC) --sysroot $(SYSROOT)" \ 179 | RANLIB=$(RANLIB) AR=$(AR) PATH=$(BIN):$(PATH) \ 180 | make 181 | rm -rf $(OUTPUT_DIR)/g7221/lib/$(ANDROID_TARGET_ARCH) 182 | mkdir -p $(OUTPUT_DIR)/g7221/lib/$(ANDROID_TARGET_ARCH) 183 | cp g7221/src/.libs/libg722_1.a $(OUTPUT_DIR)/g7221/lib/$(ANDROID_TARGET_ARCH) 184 | 185 | .PHONY: gzrtp 186 | gzrtp: 187 | cd zrtpcpp && \ 188 | rm -rf build && \ 189 | mkdir build && \ 190 | cd build && \ 191 | cmake .. $(CMAKE_ANDROID_FLAGS) && \ 192 | sed -i -e 's/;-lpthread//' CMakeCache.txt && \ 193 | cmake .. $(CMAKE_ANDROID_FLAGS) && \ 194 | cmake --build . -j$(CPU_COUNT) 195 | rm -rf $(OUTPUT_DIR)/gzrtp/lib/$(ANDROID_TARGET_ARCH) 196 | mkdir -p $(OUTPUT_DIR)/gzrtp/lib/$(ANDROID_TARGET_ARCH) 197 | cp zrtpcpp/build/clients/no_client/libzrtpcppcore.a $(OUTPUT_DIR)/gzrtp/lib/$(ANDROID_TARGET_ARCH) 198 | 199 | .PHONY: openssl 200 | openssl: 201 | -make distclean -C openssl 202 | cd openssl && \ 203 | ANDROID_NDK_ROOT=$(NDK_PATH) PATH=$(PATH) ./Configure $(OPENSSL_ARCH) no-apps no-asm no-docs no-engine no-gost no-legacy no-shared no-ssl no-tests no-zlib -U__ANDROID_API__ -D__ANDROID_API__=$(API_LEVEL) && \ 204 | make build_libs && \ 205 | rm -rf $(OUTPUT_DIR)/openssl/lib/$(ANDROID_TARGET_ARCH) 206 | mkdir -p $(OUTPUT_DIR)/openssl/lib/$(ANDROID_TARGET_ARCH) 207 | cp openssl/libcrypto.a \ 208 | $(OUTPUT_DIR)/openssl/lib/$(ANDROID_TARGET_ARCH) 209 | cp openssl/libssl.a \ 210 | $(OUTPUT_DIR)/openssl/lib/$(ANDROID_TARGET_ARCH) 211 | 212 | .PHONY: opus 213 | opus: 214 | -make distclean -C opus 215 | cd opus && \ 216 | rm -rf include_opus && \ 217 | ./autogen.sh && \ 218 | CC="$(CC) --sysroot $(SYSROOT)" RANLIB=$(RANLIB) AR=$(AR) PATH=$(PATH) ./configure --host=$(TARGET) --disable-shared --disable-doc --disable-extra-programs CFLAGS="$(COMMON_CFLAGS)" && \ 219 | CC="$(CC) --sysroot $(SYSROOT)" RANLIB=$(RANLIB) AR=$(AR) PATH=$(PATH) make && \ 220 | mkdir -p include_opus/opus && \ 221 | cp include/* include_opus/opus 222 | rm -rf $(OUTPUT_DIR)/opus/lib/$(ANDROID_TARGET_ARCH) 223 | mkdir -p $(OUTPUT_DIR)/opus/lib/$(ANDROID_TARGET_ARCH) 224 | cp opus/.libs/libopus.a $(OUTPUT_DIR)/opus/lib/$(ANDROID_TARGET_ARCH) 225 | 226 | .PHONY: sndfile 227 | sndfile: 228 | cd sndfile && \ 229 | rm -rf build && rm -rf .cache && mkdir build && cd build && \ 230 | cmake .. $(CMAKE_ANDROID_FLAGS) && \ 231 | cmake --build . --target sndfile -j$(CPU_COUNT) 232 | rm -rf $(OUTPUT_DIR)/sndfile/lib/$(ANDROID_TARGET_ARCH) 233 | mkdir -p $(OUTPUT_DIR)/sndfile/lib/$(ANDROID_TARGET_ARCH) 234 | cp sndfile/build/libsndfile.a $(OUTPUT_DIR)/sndfile/lib/$(ANDROID_TARGET_ARCH) 235 | 236 | .PHONY: spandsp 237 | spandsp: tiff 238 | -make distclean -C spandsp 239 | cd spandsp && \ 240 | touch configure.ac aclocal.m4 configure Makefile.am Makefile.in && \ 241 | CC="$(CC) --sysroot $(SYSROOT)" RANLIB=$(RANLIB) AR=$(AR) PATH=$(PATH) ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes ./configure --host=arm-linux --enable-builtin-tiff --disable-shared CFLAGS="$(COMMON_CFLAGS)" && \ 242 | CC="$(CC) --sysroot $(SYSROOT)" RANLIB=$(RANLIB) AR=$(AR) PATH=$(PATH) make 243 | rm -rf $(OUTPUT_DIR)/spandsp/lib/$(ANDROID_TARGET_ARCH) 244 | mkdir -p $(OUTPUT_DIR)/spandsp/lib/$(ANDROID_TARGET_ARCH) 245 | cp spandsp/src/.libs/libspandsp.a $(OUTPUT_DIR)/spandsp/lib/$(ANDROID_TARGET_ARCH) 246 | 247 | .PHONY: tiff 248 | tiff: 249 | -make distclean -C tiff 250 | cd tiff && \ 251 | ./autogen.sh && \ 252 | CC="$(CC) --sysroot $(SYSROOT)" CXX=$(CXX) RANLIB=$(RANLIB) AR=$(AR) PATH=$(PATH) ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes ./configure --host=arm-linux --disable-shared CFLAGS="$(COMMON_CFLAGS)" && \ 253 | CC="$(CC) --sysroot $(SYSROOT)" CXX=$(CXX) RANLIB=$(RANLIB) AR=$(AR) PATH=$(PATH) make 254 | 255 | .PHONY: webrtc 256 | webrtc: 257 | cd webrtc && \ 258 | rm -rf obj && \ 259 | $(NDK_PATH)/ndk-build -j$(CPU_COUNT) APP_PLATFORM=android-$(API_LEVEL) 260 | rm -rf $(OUTPUT_DIR)/webrtc/lib/$(ANDROID_TARGET_ARCH) 261 | mkdir -p $(OUTPUT_DIR)/webrtc/lib/$(ANDROID_TARGET_ARCH) 262 | cp webrtc/obj/local/$(ANDROID_TARGET_ARCH)/libwebrtc.a $(OUTPUT_DIR)/webrtc/lib/$(ANDROID_TARGET_ARCH) 263 | 264 | libre.a: Makefile 265 | cd re && \ 266 | rm -rf build && rm -rf .cache && mkdir build && cd build && \ 267 | cmake .. \ 268 | $(CMAKE_ANDROID_FLAGS) \ 269 | -DCMAKE_FIND_ROOT_PATH="$(NDK_PATH);$(PWD)/openssl" \ 270 | -DOPENSSL_VERSION_MAJOR=3 \ 271 | -DOPENSSL_ROOT_DIR=$(PWD)/openssl && \ 272 | cmake --build . --target re -j$(CPU_COUNT) 273 | 274 | libbaresip: Makefile amr g729 codec2 g7221 gzrtp openssl opus sndfile spandsp webrtc libre.a 275 | cd baresip && \ 276 | rm -rf build && rm -rf .cache && mkdir build && cd build && \ 277 | cmake .. \ 278 | $(CMAKE_ANDROID_FLAGS) \ 279 | -DCMAKE_FIND_ROOT_PATH="$(PWD)/amr;$(PWD)/vo-amrwbenc;$(PWD)/openssl" \ 280 | -DSTATIC=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ 281 | -DAAUDIO_INCLUDE_DIR=${TOOLCHAIN}/sysroot/usr/include \ 282 | -DAAUDIO_LIBRARY=${TOOLCHAIN}/sysroot/usr/lib/$(TARGET)/$(API_LEVEL)/libaaudio.so \ 283 | -Dre_DIR=$(PWD)/re/cmake \ 284 | -DRE_LIBRARY=$(PWD)/re/build/libre.a \ 285 | -DRE_INCLUDE_DIR=$(PWD)/re/include \ 286 | -DOPENSSL_ROOT_DIR=$(PWD)/openssl \ 287 | -DG729_INCLUDE_DIR=$(PWD)/bcg729/include \ 288 | -DOPUS_INCLUDE_DIR=$(PWD)/opus/include_opus \ 289 | -DOPUS_LIBRARY=$(OUTPUT_DIR)/opus/lib/$(ANDROID_TARGET_ARCH)/libopus.a \ 290 | -DCODEC2_INCLUDE_DIR=$(PWD)/codec2/build \ 291 | -DCODEC2_LIBRARY=$(OUTPUT_DIR)/codec2/lib/$(ANDROID_TARGET_ARCH)/libcodec2.a \ 292 | -DSPANDSP_INCLUDE_DIR="$(PWD)/spandsp/src;$(PWD)/tiff/libtiff" \ 293 | -DSPANDSP_LIBRARY=$(OUTPUT_DIR)/spandsp/lib/$(ANDROID_TARGET_ARCH)/libspandsp.a \ 294 | -DWEBRTC_AECM_INCLUDE_DIR=$(PWD)/webrtc/include \ 295 | -DWEBRTC_AECM_LIBRARY=$(OUTPUT_DIR)/webrtc/lib/$(ANDROID_TARGET_ARCH)/libwebrtc.a \ 296 | -DG7221_INCLUDE_DIR=$(PWD)/g7221/src \ 297 | -DG7221_LIBRARY=$(OUTPUT_DIR)/g7221/lib/$(ANDROID_TARGET_ARCH)/libg722_1.a \ 298 | -DGZRTP_INCLUDE_DIR=$(PWD)/zrtpcpp \ 299 | -DGZRTP_LIBRARY="$(OUTPUT_DIR)/gzrtp/lib/$(ANDROID_TARGET_ARCH)/libzrtpcppcore.a" \ 300 | -DSNDFILE_INCLUDE_DIR="$(PWD)/sndfile/include" \ 301 | -DSNDFILE_LIBRARIES="$(OUTPUT_DIR)/sndfile/lib/$(ANDROID_TARGET_ARCH)/libsndfile.a" \ 302 | -DCMAKE_C_COMPILER="clang" \ 303 | -DCMAKE_CXX_COMPILER="clang++" \ 304 | -DAPP_MODULES_DIR=$(PWD)/baresip-app-modules \ 305 | -DAPP_MODULES=$(APP_MODULES) \ 306 | -DMODULES=$(MODULES) && \ 307 | cmake --build . --target baresip -j$(CPU_COUNT) 308 | rm -rf $(OUTPUT_DIR)/re/lib/$(ANDROID_TARGET_ARCH) 309 | mkdir -p $(OUTPUT_DIR)/re/lib/$(ANDROID_TARGET_ARCH) 310 | cp re/build/libre.a $(OUTPUT_DIR)/re/lib/$(ANDROID_TARGET_ARCH) 311 | rm -rf $(OUTPUT_DIR)/baresip/lib/$(ANDROID_TARGET_ARCH) 312 | mkdir -p $(OUTPUT_DIR)/baresip/lib/$(ANDROID_TARGET_ARCH) 313 | cp baresip/build/libbaresip.a $(OUTPUT_DIR)/baresip/lib/$(ANDROID_TARGET_ARCH) 314 | rm -rf $(OUTPUT_DIR)/re/include 315 | mkdir -p $(OUTPUT_DIR)/re/include 316 | cp re/include/* $(OUTPUT_DIR)/re/include 317 | rm -rf $(OUTPUT_DIR)/re/cmake 318 | mkdir -p $(OUTPUT_DIR)/re/cmake 319 | cp re/cmake/re-config.cmake $(OUTPUT_DIR)/re/cmake 320 | rm -rf $(OUTPUT_DIR)/baresip/include 321 | mkdir $(OUTPUT_DIR)/baresip/include 322 | cp baresip/include/baresip.h $(OUTPUT_DIR)/baresip/include 323 | 324 | all: 325 | make libbaresip ANDROID_TARGET_ARCH=arm64-v8a 326 | make libbaresip ANDROID_TARGET_ARCH=armeabi-v7a 327 | 328 | debug: all 329 | make libbaresip ANDROID_TARGET_ARCH=x86_64 330 | 331 | .PHONY: download-sources 332 | download-sources: 333 | rm -fr abseil-cpp amr baresip bcg729 codec2 g7221 openssl opus \ 334 | re sndfile spandsp tiff vo-amrwbenc webrtc zrtpcpp 335 | git clone https://github.com/abseil/abseil-cpp.git -b lts_2024_01_16 --single-branch 336 | git clone https://git.code.sf.net/p/opencore-amr/code -b v0.1.6 --single-branch amr 337 | git clone https://github.com/baresip/baresip.git 338 | git clone https://github.com/BelledonneCommunications/bcg729.git -b release/1.1.1 --single-branch 339 | git clone https://github.com/drowe67/codec2.git -b 1.2.0 --single-branch 340 | git clone https://github.com/juha-h/libg7221.git -b master --single-branch g7221 341 | git clone https://github.com/openssl/openssl.git -b openssl-3.5 --single-branch openssl 342 | git clone https://github.com/xiph/opus.git -b v1.4 --single-branch 343 | git clone https://github.com/baresip/re.git 344 | git clone https://github.com/juha-h/libsndfile.git -b master --single-branch sndfile 345 | git clone https://github.com/juha-h/spandsp.git -b 1.0 --single-branch spandsp 346 | git clone https://gitlab.com/libtiff/libtiff.git -b v4.7.0 --single-branch tiff 347 | git clone https://github.com/juha-h/libwebrtc.git -b mobile --single-branch webrtc 348 | git clone https://git.code.sf.net/p/opencore-amr/vo-amrwbenc --single-branch vo-amrwbenc 349 | cp -r abseil-cpp/absl webrtc/jni/src/webrtc 350 | git clone https://github.com/juha-h/ZRTPCPP.git -b master --single-branch zrtpcpp 351 | patch -d re -p1 < re-patch 352 | patch -d tiff -p1 < tiff-patch 353 | 354 | clean: 355 | -make distclean -C amr 356 | make distclean -C baresip 357 | rm -rf codec2/build 358 | -make distclean -C g7221 359 | -make clean -C bcg729 360 | -make distclean -C openssl 361 | -make distclean -C opus 362 | make distclean -C re 363 | rm -rf sndfile/build 364 | -make distclean -C spandsp 365 | -make distclean -C tiff 366 | rm -rf webrtc/obj 367 | rm -rf zrtpcpp/build 368 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | libbaresip-android 2 | ================== 3 | 4 | This project shows how to build libbaresip for Android on Debian 12 using Android NDK. Resulting libbaresip can be used in Baresip based Android (Studio) applications. 5 | 6 | ## Step 0 - prerequisites 7 | 8 | Install the following Debian packages: 9 | ``` 10 | apt install wget cmake make libtool m4 automake pkg-config unzip 11 | ``` 12 | Download and unzip Android NDK for Linux from: 13 | ``` 14 | https://developer.android.com/ndk/downloads 15 | ``` 16 | or use NDK that comes with Android Studio. NDK version must match ndkVersion in baresip-studio/app/build.gradle. 17 | 18 | ## Step 1 - clone libbaresip-android 19 | 20 | Clone libbaresip-android repository: 21 | ``` 22 | $ git clone https://github.com/juha-h/libbaresip-android.git 23 | ``` 24 | This creates libbaresip-android directory containing Makefile. 25 | 26 | Go to libbaresip-android directory and checkout master branch. 27 | 28 | ## Step 2 - edit Makefile 29 | 30 | You need to set (or check) the variables listed in VALUES TO CONFIGURE section. 31 | 32 | ## Step 3 - download source code 33 | 34 | Download source code: 35 | ``` 36 | $ make download-sources 37 | ``` 38 | This will also patch re and baresip as needed by baresip-studio project. 39 | 40 | After that you should have in libbaresip-android directory these source directories: 41 | ``` 42 | abseil-cpp 43 | amr 44 | baresip 45 | bcg729 46 | codec2 47 | g7221 48 | openssl 49 | opus 50 | re 51 | sndfile 52 | spandsp 53 | tiff 54 | vo-amrwbenc 55 | webrtc 56 | zrtpcpp 57 | ``` 58 | 59 | ## Step 4 - build and install libraries 60 | 61 | Build and install the libraries only for a selected architecture with command: 62 | ``` 63 | $ make libbaresip ANDROID_TARGET_ARCH=$ARCH 64 | ``` 65 | by replacing $ARCH with armeabi-v7a, arm64-v8a, or x86_64. 66 | 67 | Or you can build and install the libraries for armeabi-v7a and arm64-v8a architectures with command: 68 | ``` 69 | $ make all 70 | ``` 71 | -------------------------------------------------------------------------------- /baresip-app-modules/g729/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | project(g729) 2 | 3 | set(SRCS g729.c) 4 | 5 | add_library(${PROJECT_NAME} OBJECT ${SRCS}) 6 | 7 | target_include_directories(${PROJECT_NAME} PRIVATE ${G729_INCLUDE_DIR}) 8 | target_link_libraries(${PROJECT_NAME} PRIVATE ${G729_LIBARY}) 9 | target_compile_options(${PROJECT_NAME} PRIVATE -Wno-shorten-64-to-32) 10 | -------------------------------------------------------------------------------- /baresip-app-modules/g729/g729.c: -------------------------------------------------------------------------------- 1 | /** 2 | * @file g729.c G.729 Audio Codec 3 | * 4 | * Copyright (C) 2020 Juha Heinanen 5 | */ 6 | 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | 14 | /** 15 | * @defgroup g729 g729 16 | * 17 | * The G.729 audio codec 18 | */ 19 | 20 | 21 | struct auenc_state { 22 | bcg729EncoderChannelContextStruct* enc; 23 | }; 24 | 25 | struct audec_state { 26 | bcg729DecoderChannelContextStruct* dec; 27 | }; 28 | 29 | 30 | static void encode_destructor(void *data) 31 | { 32 | struct auenc_state *st = data; 33 | 34 | if (st->enc) 35 | closeBcg729EncoderChannel(st->enc); 36 | } 37 | 38 | 39 | static int encode_update(struct auenc_state **aesp, 40 | const struct aucodec *ac, 41 | struct auenc_param *prm, const char *fmtp) 42 | { 43 | struct auenc_state *st; 44 | int err = 0; 45 | (void)prm; 46 | (void)fmtp; 47 | 48 | if (!aesp || !ac) 49 | return EINVAL; 50 | 51 | if (*aesp) 52 | return 0; 53 | 54 | st = mem_zalloc(sizeof(*st), encode_destructor); 55 | if (!st) 56 | return ENOMEM; 57 | 58 | st->enc = initBcg729EncoderChannel(0 /* no VAT/DTX detection */); 59 | if (!st->enc) { 60 | err = ENOMEM; 61 | goto out; 62 | } 63 | 64 | out: 65 | if (err) 66 | mem_deref(st); 67 | else 68 | *aesp = st; 69 | 70 | return err; 71 | } 72 | 73 | 74 | static void decode_destructor(void *data) 75 | { 76 | struct audec_state *st = data; 77 | 78 | if (st->dec) 79 | closeBcg729DecoderChannel(st->dec); 80 | } 81 | 82 | 83 | static int decode_update(struct audec_state **adsp, 84 | const struct aucodec *ac, const char *fmtp) 85 | { 86 | struct audec_state *st; 87 | int err = 0; 88 | (void)fmtp; 89 | 90 | if (!adsp || !ac) 91 | return EINVAL; 92 | 93 | if (*adsp) 94 | return 0; 95 | 96 | st = mem_zalloc(sizeof(*st), decode_destructor); 97 | if (!st) 98 | return ENOMEM; 99 | 100 | st->dec = initBcg729DecoderChannel(); 101 | if (!st->dec) { 102 | err = ENOMEM; 103 | goto out; 104 | } 105 | 106 | out: 107 | if (err) 108 | mem_deref(st); 109 | else 110 | *adsp = st; 111 | 112 | return err; 113 | } 114 | 115 | 116 | static int encode(struct auenc_state *aes, bool *marker, uint8_t *buf, 117 | size_t *len, int fmt, const void *sampv, size_t sampc) 118 | { 119 | unsigned int i, count; 120 | uint8_t olen; 121 | (void)marker; 122 | (void)fmt; 123 | 124 | if (!buf || !len || !sampv) 125 | return EINVAL; 126 | 127 | if ((sampc % 160) != 0) 128 | return EPROTO; 129 | 130 | count = sampc / 80; 131 | 132 | for (i = 0; i < count; i++) 133 | bcg729Encoder(aes->enc, (int16_t*)sampv + i * 80, 134 | (uint8_t*)buf + i * 10, &olen); 135 | 136 | *len = count * 10; 137 | 138 | return 0; 139 | } 140 | 141 | 142 | static int decode(struct audec_state *ads, int fmt, void *sampv, 143 | size_t *sampc, bool marker, const uint8_t *buf, size_t len) 144 | { 145 | unsigned int i; 146 | (void)fmt; 147 | (void)marker; 148 | 149 | if (!sampv || !sampc || !buf) 150 | return EINVAL; 151 | 152 | for (i = 0; i < (len / 10); i++) { 153 | bcg729Decoder(ads->dec, buf + i * 10, 10, 0, 0, 0, 154 | (int16_t *)sampv + i * 80); 155 | } 156 | 157 | *sampc = 80 * (len / 10); 158 | 159 | return 0; 160 | } 161 | 162 | 163 | static struct aucodec g729 = { 164 | .pt = "18", 165 | .name = "G729", 166 | .srate = 8000, 167 | .crate = 8000, 168 | .ch = 1, 169 | .pch = 1, 170 | .encupdh = encode_update, 171 | .ench = encode, 172 | .decupdh = decode_update, 173 | .dech = decode, 174 | }; 175 | 176 | 177 | static int module_init(void) 178 | { 179 | aucodec_register(baresip_aucodecl(), &g729); 180 | 181 | return 0; 182 | } 183 | 184 | 185 | static int module_close(void) 186 | { 187 | aucodec_unregister(&g729); 188 | 189 | return 0; 190 | } 191 | 192 | 193 | EXPORT_SYM const struct mod_export DECL_EXPORTS(g729) = { 194 | "g729", 195 | "audio codec", 196 | module_init, 197 | module_close, 198 | }; 199 | -------------------------------------------------------------------------------- /baresip-app-modules/g729/module.mk: -------------------------------------------------------------------------------- 1 | # 2 | # module.mk 3 | # 4 | # Copyright (C) 2020 Juha Heinanen 5 | # 6 | 7 | MOD := g729 8 | $(MOD)_SRCS += g729.c 9 | 10 | $(MOD)_CFLAGS += -Wno-shorten-64-to-32 11 | $(MOD)_LFLAGS += -lbcg729 12 | 13 | include mk/mod.mk 14 | -------------------------------------------------------------------------------- /re-patch: -------------------------------------------------------------------------------- 1 | diff --git a/src/sip/auth.c b/src/sip/auth.c 2 | index 70681e4..f341312 100644 3 | --- a/src/sip/auth.c 4 | +++ b/src/sip/auth.c 5 | @@ -166,7 +166,9 @@ static bool auth_handler(const struct sip_hdr *hdr, const struct sip_msg *msg, 6 | goto out; 7 | } 8 | else { 9 | - if (!pl_isset(&ch.stale) || pl_strcasecmp(&ch.stale, "true")) { 10 | + /* error if first auth attempt fails */ 11 | + if ((!pl_isset(&ch.stale) || 12 | + pl_strcasecmp(&ch.stale, "true")) && (realm->nc == 2)) { 13 | err = EAUTH; 14 | goto out; 15 | } 16 | -------------------------------------------------------------------------------- /tiff-patch: -------------------------------------------------------------------------------- 1 | diff --git a/autogen.sh b/autogen.sh 2 | index 2e6c6bd0..0d34a5dc 100755 3 | --- a/autogen.sh 4 | +++ b/autogen.sh 5 | @@ -21,10 +21,10 @@ autoconf || retval=$? 6 | for file in config.guess config.sub 7 | do 8 | echo "$0: getting $file..." 9 | - wget -q --timeout=5 -O config/$file.tmp \ 10 | + wget -q --timeout=15 -O config/$file.tmp \ 11 | "https://git.savannah.gnu.org/cgit/config.git/plain/${file}" \ 12 | && mv -f config/$file.tmp config/$file \ 13 | - && chmod a+x config/$file || retval=$? 14 | + && chmod a+x config/$file # || retval=$? 15 | rm -f config/$file.tmp 16 | done 17 | 18 | --------------------------------------------------------------------------------