VoiSmart / pjsip-android-builder

Complete Android build environment for PJSIP with OpenSSL, OpenH264, Opus and G.729
223 stars 136 forks source link

Add support for G.729 codec without Intel IPP #9

Closed alexbbb closed 8 years ago

alexbbb commented 8 years ago

Add G.729 codec support for PJSIP 2.4.5, without using the Intel IPP library

alexbbb commented 8 years ago

With commit https://github.com/alexbbb/pjsip-android-builder/commit/0337921f81b3e30da05dc1a019d60d8822be73ec, now it's possible to compile PJSIP with G.729 for target arch armeabi-v7a, but if you try to compile it for other archs, such as armeabi, x86 or mips, by executing the ./build-with-g729 script, the compilation fails due to some assembler errors, which I've reported here:

armeabi

make[3]: Entering directory `/tmp/pjsip/third_party/build/g729'
mkdir -p output/libg729codec-arm-unknown-linux-androideabi/Sources
/pjsip-android-builder/android-ndk-r10e/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -c -Wall -DPJ_AUTOCONF=1 -I/pjsip-android-builder/libyuv-android/jni/include -I/pjsip-android-builder/openh264-build-output/libs/armeabi/include  -fpic -ffunction-sections -funwind-tables -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -mthumb -Os -g -DNDEBUG -fomit-frame-pointer -finline-limit=64 -O0 -UNDEBUG -marm -fno-omit-frame-pointer -Ijni -DANDROID -Wa,--noexecstack -Wformat -Werror=format-security -I/pjsip-android-builder/android-ndk-r10e/platforms/android-21/arch-arm/usr/include  -I/pjsip-android-builder/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.9/include -I/pjsip-android-builder/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi/include -DPJ_IS_BIG_ENDIAN=0 -DPJ_IS_LITTLE_ENDIAN=1 -I/pjsip-android-builder/openssl-build-output/libs/armeabi/include    -I../.. -I../../g729/Headers -I../../../pjlib/include \
        -o output/libg729codec-arm-unknown-linux-androideabi/Sources/acelp_ca.o \
        ../../g729/Sources/acelp_ca.c 
In file included from ../../g729/Sources/acelp_ca.c:35:0:
../../g729/Headers/basic_op.h: In function 'sature':
../../g729/Headers/basic_op.h:400:9: warning: variable 'Overflow' set but not used [-Wunused-but-set-variable]
    Flag Overflow =0;
         ^
../../g729/Sources/acelp_ca.c: In function 'D4i40_17_fast':
../../g729/Sources/acelp_ca.c:522:10: warning: operation on 'p0' may be undefined [-Wsequence-point]
       *p0++ = mult(*p0, psign[i1]);
          ^
../../g729/Sources/acelp_ca.c:523:10: warning: operation on 'p1' may be undefined [-Wsequence-point]
       *p1++ = mult(*p1, psign[i1+1]);
          ^
../../g729/Sources/acelp_ca.c:524:10: warning: operation on 'p2' may be undefined [-Wsequence-point]
       *p2++ = mult(*p2, psign[i1+2]);
          ^
../../g729/Sources/acelp_ca.c:525:10: warning: operation on 'p3' may be undefined [-Wsequence-point]
       *p3++ = mult(*p3, psign[i1+3]);
          ^
../../g729/Sources/acelp_ca.c:540:10: warning: operation on 'p0' may be undefined [-Wsequence-point]
       *p0++ = mult(*p0, psign[i2]);
          ^
../../g729/Sources/acelp_ca.c:541:10: warning: operation on 'p1' may be undefined [-Wsequence-point]
       *p1++ = mult(*p1, psign[i2+1]);
          ^
../../g729/Sources/acelp_ca.c:542:10: warning: operation on 'p2' may be undefined [-Wsequence-point]
       *p2++ = mult(*p2, psign[i2+2]);
          ^
../../g729/Sources/acelp_ca.c:556:10: warning: operation on 'p0' may be undefined [-Wsequence-point]
       *p0++ = mult(*p0, psign[i3]);
          ^
../../g729/Sources/acelp_ca.c:557:10: warning: operation on 'p1' may be undefined [-Wsequence-point]
       *p1++ = mult(*p1, psign[i3+1]);
          ^
/tmp/ccWajDEd.s: Assembler messages:
/tmp/ccWajDEd.s:375: Error: selected processor does not support ARM mode `qadd16 r3,r4,r5'
/tmp/ccWajDEd.s:427: Error: selected processor does not support ARM mode `qsub16 r3,r4,r5'
make[3]: *** [output/libg729codec-arm-unknown-linux-androideabi/Sources/acelp_ca.o] Error 1
make[3]: Leaving directory `/tmp/pjsip/third_party/build/g729'
make[2]: *** [libg729codec-arm-unknown-linux-androideabi.a] Error 2
make[2]: Leaving directory `/tmp/pjsip/third_party/build/g729'
make[1]: *** [all] Error 1
make[1]: Leaving directory `/tmp/pjsip/third_party/build'
make: *** [all] Error 1

x86

make[2]: Entering directory `/tmp/pjsip/third_party/build/g729'
make -f /tmp/pjsip/build/rules.mak APP=G729_CODEC app=libg729codec ../../lib/libg729codec-x86-unknown-linux-android.a
make[3]: Entering directory `/tmp/pjsip/third_party/build/g729'
mkdir -p output/libg729codec-x86-unknown-linux-android/Sources
/pjsip-android-builder/android-ndk-r10e/toolchains/x86-4.8/prebuilt/linux-x86_64/bin/i686-linux-android-gcc -c -Wall -DPJ_AUTOCONF=1 -I/pjsip-android-builder/libyuv-android/jni/include -I/pjsip-android-builder/openh264-build-output/libs/x86/include  -ffunction-sections -funwind-tables -no-canonical-prefixes -O2 -g -DNDEBUG -fomit-frame-pointer -funswitch-loops -finline-limit=300 -O0 -UNDEBUG -fno-omit-frame-pointer -Ijni -DANDROID -Wa,--noexecstack -Wformat -Werror=format-security -I/pjsip-android-builder/android-ndk-r10e/platforms/android-21/arch-x86/usr/include  -I/pjsip-android-builder/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.9/include -I/pjsip-android-builder/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.9/libs/x86/include -DPJ_IS_BIG_ENDIAN=0 -DPJ_IS_LITTLE_ENDIAN=1 -I/pjsip-android-builder/openssl-build-output/libs/x86/include    -I../.. -I../../g729/Headers -I../../../pjlib/include \
        -o output/libg729codec-x86-unknown-linux-android/Sources/acelp_ca.o \
        ../../g729/Sources/acelp_ca.c 
In file included from ../../g729/Sources/acelp_ca.c:35:0:
../../g729/Headers/basic_op.h: In function 'sature':
../../g729/Headers/basic_op.h:400:9: warning: variable 'Overflow' set but not used [-Wunused-but-set-variable]
    Flag Overflow =0;
         ^
../../g729/Sources/acelp_ca.c: In function 'D4i40_17_fast':
../../g729/Sources/acelp_ca.c:522:10: warning: operation on 'p0' may be undefined [-Wsequence-point]
       *p0++ = mult(*p0, psign[i1]);
          ^
../../g729/Sources/acelp_ca.c:523:10: warning: operation on 'p1' may be undefined [-Wsequence-point]
       *p1++ = mult(*p1, psign[i1+1]);
          ^
../../g729/Sources/acelp_ca.c:524:10: warning: operation on 'p2' may be undefined [-Wsequence-point]
       *p2++ = mult(*p2, psign[i1+2]);
          ^
../../g729/Sources/acelp_ca.c:525:10: warning: operation on 'p3' may be undefined [-Wsequence-point]
       *p3++ = mult(*p3, psign[i1+3]);
          ^
../../g729/Sources/acelp_ca.c:540:10: warning: operation on 'p0' may be undefined [-Wsequence-point]
       *p0++ = mult(*p0, psign[i2]);
          ^
../../g729/Sources/acelp_ca.c:541:10: warning: operation on 'p1' may be undefined [-Wsequence-point]
       *p1++ = mult(*p1, psign[i2+1]);
          ^
../../g729/Sources/acelp_ca.c:542:10: warning: operation on 'p2' may be undefined [-Wsequence-point]
       *p2++ = mult(*p2, psign[i2+2]);
          ^
../../g729/Sources/acelp_ca.c:556:10: warning: operation on 'p0' may be undefined [-Wsequence-point]
       *p0++ = mult(*p0, psign[i3]);
          ^
../../g729/Sources/acelp_ca.c:557:10: warning: operation on 'p1' may be undefined [-Wsequence-point]
       *p1++ = mult(*p1, psign[i3+1]);
          ^
../../g729/Headers/basic_op.h: Assembler messages:
../../g729/Headers/basic_op.h:307: Error: no such instruction: `clz %eax,%eax'
../../g729/Headers/basic_op.h:514: Error: no such instruction: `smulbb %eax,%esi,%edi'
../../g729/Headers/basic_op.h:515: Error: no such instruction: `qadd %eax,%eax,%eax'
../../g729/Headers/basic_op.h:565: Error: no such instruction: `smulbb %eax,%edx,%ecx'
../../g729/Headers/basic_op.h:566: Error: no such instruction: `qdsub %edx,%esi,%eax'
../../g729/Headers/basic_op.h:616: Error: no such instruction: `smulbb %eax,%ecx,%esi'
../../g729/Headers/basic_op.h:617: Error: no such instruction: `qdadd %edx,%edx,%eax'
../../g729/Headers/basic_op.h:663: Error: no such instruction: `qadd16 %eax,%esi,%edi'
../../g729/Headers/basic_op.h:709: Error: no such instruction: `qsub16 %eax,%esi,%edi'
../../g729/Headers/basic_op.h:822: Error: no such instruction: `qadd %eax,%eax,%esi'
../../g729/Headers/basic_op.h:823: Error: number of operands mismatch for `mov'
make[3]: *** [output/libg729codec-x86-unknown-linux-android/Sources/acelp_ca.o] Error 1
make[3]: Leaving directory `/tmp/pjsip/third_party/build/g729'
make[2]: *** [libg729codec-x86-unknown-linux-android.a] Error 2
make[2]: Leaving directory `/tmp/pjsip/third_party/build/g729'
make[1]: *** [all] Error 1
make[1]: Leaving directory `/tmp/pjsip/third_party/build'
make: *** [all] Error 1

mips

make[2]: Entering directory `/tmp/pjsip/third_party/build/g729'
make -f /tmp/pjsip/build/rules.mak APP=G729_CODEC app=libg729codec ../../lib/libg729codec-mipsel-unknown-linux-android.a
make[3]: Entering directory `/tmp/pjsip/third_party/build/g729'
mkdir -p output/libg729codec-mipsel-unknown-linux-android/Sources
/pjsip-android-builder/android-ndk-r10e/toolchains/mipsel-linux-android-4.8/prebuilt/linux-x86_64/bin/mipsel-linux-android-gcc -c -Wall -DPJ_AUTOCONF=1 -I/pjsip-android-builder/libyuv-android/jni/include  -fpic -finline-functions -ffunction-sections -funwind-tables -fmessage-length=0 -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers -no-canonical-prefixes -O0 -g -fno-omit-frame-pointer -Ijni -DANDROID -Wa,--noexecstack -Wformat -Werror=format-security -I/pjsip-android-builder/android-ndk-r10e/platforms/android-21/arch-mips/usr/include  -I/pjsip-android-builder/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.9/include -I/pjsip-android-builder/android-ndk-r10e/sources/cxx-stl/gnu-libstdc++/4.9/libs/mips/include -DPJ_IS_BIG_ENDIAN=0 -DPJ_IS_LITTLE_ENDIAN=1 -I/pjsip-android-builder/openssl-build-output/libs/mips/include    -I../.. -I../../g729/Headers -I../../../pjlib/include \
        -o output/libg729codec-mipsel-unknown-linux-android/Sources/acelp_ca.o \
        ../../g729/Sources/acelp_ca.c 
In file included from ../../g729/Sources/acelp_ca.c:35:0:
../../g729/Headers/basic_op.h: In function 'sature':
../../g729/Headers/basic_op.h:400:9: warning: variable 'Overflow' set but not used [-Wunused-but-set-variable]
    Flag Overflow =0;
         ^
../../g729/Sources/acelp_ca.c: In function 'D4i40_17_fast':
../../g729/Sources/acelp_ca.c:522:10: warning: operation on 'p0' may be undefined [-Wsequence-point]
       *p0++ = mult(*p0, psign[i1]);
          ^
../../g729/Sources/acelp_ca.c:523:10: warning: operation on 'p1' may be undefined [-Wsequence-point]
       *p1++ = mult(*p1, psign[i1+1]);
          ^
../../g729/Sources/acelp_ca.c:524:10: warning: operation on 'p2' may be undefined [-Wsequence-point]
       *p2++ = mult(*p2, psign[i1+2]);
          ^
../../g729/Sources/acelp_ca.c:525:10: warning: operation on 'p3' may be undefined [-Wsequence-point]
       *p3++ = mult(*p3, psign[i1+3]);
          ^
../../g729/Sources/acelp_ca.c:540:10: warning: operation on 'p0' may be undefined [-Wsequence-point]
       *p0++ = mult(*p0, psign[i2]);
          ^
../../g729/Sources/acelp_ca.c:541:10: warning: operation on 'p1' may be undefined [-Wsequence-point]
       *p1++ = mult(*p1, psign[i2+1]);
          ^
../../g729/Sources/acelp_ca.c:542:10: warning: operation on 'p2' may be undefined [-Wsequence-point]
       *p2++ = mult(*p2, psign[i2+2]);
          ^
../../g729/Sources/acelp_ca.c:556:10: warning: operation on 'p0' may be undefined [-Wsequence-point]
       *p0++ = mult(*p0, psign[i3]);
          ^
../../g729/Sources/acelp_ca.c:557:10: warning: operation on 'p1' may be undefined [-Wsequence-point]
       *p1++ = mult(*p1, psign[i3+1]);
          ^
/tmp/ccN9XHZu.s: Assembler messages:
/tmp/ccN9XHZu.s:252: Error: unrecognized opcode `smulbb $2,$16,$17'
/tmp/ccN9XHZu.s:253: Error: unrecognized opcode `qadd $2,$2,$2'
/tmp/ccN9XHZu.s:303: Error: unrecognized opcode `smulbb $2,$3,$4'
/tmp/ccN9XHZu.s:304: Error: unrecognized opcode `qdsub $3,$7,$2'
/tmp/ccN9XHZu.s:351: Error: unrecognized opcode `smulbb $2,$4,$5'
/tmp/ccN9XHZu.s:352: Error: unrecognized opcode `qdadd $3,$3,$2'
/tmp/ccN9XHZu.s:405: Error: unrecognized opcode `qadd16 $2,$16,$17'
/tmp/ccN9XHZu.s:462: Error: unrecognized opcode `qsub16 $2,$16,$17'
/tmp/ccN9XHZu.s:512: Error: unrecognized opcode `qadd $2,$2,$16'
/tmp/ccN9XHZu.s:513: Error: unrecognized opcode `mov $2,$2,ASR'
make[3]: *** [output/libg729codec-mipsel-unknown-linux-android/Sources/acelp_ca.o] Error 1
make[3]: Leaving directory `/tmp/pjsip/third_party/build/g729'
make[2]: *** [libg729codec-mipsel-unknown-linux-android.a] Error 2
make[2]: Leaving directory `/tmp/pjsip/third_party/build/g729'
make[1]: *** [all] Error 1
make[1]: Leaving directory `/tmp/pjsip/third_party/build'
make: *** [all] Error 1

Full build logs here: armeabi-log.txt x86-log.txt mips-log.txt