마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 ffmpeg관련 질문입니다

0 추천
안녕하세여

ffmpeg 빌드해서 테스트 해보고있는데여 갤럭시 s4 g2 넥서스등은 잘되는데

갤럭시 s3만 돌리면  ffmpeg라이브러리 로드 할때 Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 10738 (ple.ffmpegbasic) 오류가 나는데요

빌드할때 https://github.com/appunite/AndroidFFmpeg/blob/master/FFmpegLibrary/jni/build_android.sh

여기 소스를 보고 햇습니다
후덜덜!!! (150 포인트) 님이 2014년 6월 17일 질문

1개의 답변

0 추천
 
채택된 답변
단말이 없어 정확히 어떤 문제인지는 모르겠지만. ffmpeg 때문에 삽질을 오래 해 본 결과로는

FAST 옵션을 넣을 경우  문제가 생기는 단말이 있는 것으로 알고 있습니다.

특히  HAVE_FAST_UNALIGNED이 문제가 될 가능성이 높더군요...

configure를 실행해 생성 되는 config.mak config.h 파일에서 HAVE_FAST_UNALIGNED, HAVE_FAST_CLZ 같은게 사용 안되게 변경 해서 so를 빌드 해 보세요..
사악미소 (65,330 포인트) 님이 2014년 6월 19일 답변
후덜덜!!!님이 2014년 6월 19일 채택됨
사악악마님 답변 감사드립니다 말씀해주신대로 한번 그부분 체크해볼께용

HAVE_FAST_UNALIGNED, HAVE_FAST_CLZ  이부분 삭제해주는게 나을까여? 아님 1로 변경해주는게 나은가영?
둘다 0으로 변경하고 config.mak의 경우 앞에 !를 붙여 주석처리 해 줘야 합니다.  
config.h에 둘다  0으로 선언되어 있고  config.mak에 둘다 !로 주석 처리가 되어 있다면, 그 문제가 아니니. 다른 FAST 옵션도 바꿔 보세요.. 그래도 안되면 일부 로그가 아닌 전체 로그를 첨부해 주시면 살펴 보겠습니다.
흠 이미 다되어있더라고요 FAST로 검색해보면 0 아니면! 이걸로 이미처리 되어있어여 그리고 로그캣에 다른건 없고
06-19 16:49:12.945: D/dalvikvm(9722): Trying to load lib /data/data/com.example.ffmpegbasic/lib/libnativetester-jni.so 0x42250e80
06-19 16:49:12.945: D/dalvikvm(9722): Added shared lib /data/data/com.example.ffmpegbasic/lib/libnativetester-jni.so 0x42250e80
06-19 16:49:12.945: D/dalvikvm(9722): Trying to load lib /data/data/com.example.ffmpegbasic/lib/libffmpeg-neon.so 0x42250e80
06-19 16:49:12.950: A/libc(9722): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 9722 (ple.ffmpegbasic)

딱이렇게만 찍히네여 ㅠㅠ
밑에 stack trace 로그는  없나요? 로그상은 libc에서 잘 못된 부분을 엑세스 했다는데 stack trace 로그가 있음 어느 함수에서 문제인지 파악이 가능할 수도 있거든요
********** Crash dump: **********
Build fingerprint: 'samsung/c1ktt/c1ktt:4.1.2/JZO54K/E210KKKJMK1:user/release-ke
ys'
pid: 15517, tid: 15517, name: ple.ffmpegbasic  >>> com.example.ffmpegbasic <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
Stack frame I/DEBUG   ( 1929):     #00  pc 000182fe  /system/lib/libc.so
Stack frame I/DEBUG   ( 1929):     #01  pc 0000dc04  /system/lib/libc.so (abort+
4)
Stack frame I/DEBUG   ( 1929):     #02  pc 00651678  /data/data/com.example.ffmp
egbasic/lib/libffmpeg-neon.so: Routine ??
??:0
Stack frame I/DEBUG   ( 1929):     #03  pc 00003753  /system/bin/linker
Stack frame I/DEBUG   ( 1929):     #04  pc 00005c4b  /system/bin/linker
Stack frame I/DEBUG   ( 1929):     #05  pc 0004f65b  /system/lib/libdvm.so (dvmL
oadNativeCode(char const*, Object*, char**)+186)
Stack frame I/DEBUG   ( 1929):     #06  pc 000660f5  /system/lib/libdvm.so
Stack frame I/DEBUG   ( 1929):     #07  pc 00027360  /system/lib/libdvm.so
Stack frame I/DEBUG   ( 1929):     #08  pc 0002bc68  /system/lib/libdvm.so (dvmI
nterpret(Thread*, Method const*, JValue*)+180)
Stack frame I/DEBUG   ( 1929):     #09  pc 0005f8f1  /system/lib/libdvm.so (dvmC
allMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+272)
Stack frame I/DEBUG   ( 1929):     #10  pc 0005f91b  /system/lib/libdvm.so (dvmC
allMethod(Thread*, Method const*, Object*, JValue*, ...)+20)
Stack frame I/DEBUG   ( 1929):     #11  pc 0006a5fd  /system/lib/libdvm.so (dvmI
nitClass+1036)
Stack frame I/DEBUG   ( 1929):     #12  pc 0002225c  /system/lib/libdvm.so (dvmA
smSisterStart+412)
Stack frame I/DEBUG   ( 1929):     #13  pc 0002bc68  /system/lib/libdvm.so (dvmI
nterpret(Thread*, Method const*, JValue*)+180)
Stack frame I/DEBUG   ( 1929):     #14  pc 0005fbb7  /system/lib/libdvm.so (dvmI
nvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bo
ol)+374)
Stack frame I/DEBUG   ( 1929):     #15  pc 00067165  /system/lib/libdvm.so
Stack frame I/DEBUG   ( 1929):     #16  pc 00027360  /system/lib/libdvm.so
Stack frame I/DEBUG   ( 1929):     #17  pc 0002bc68  /system/lib/libdvm.so (dvmI
nterpret(Thread*, Method const*, JValue*)+180)
Stack frame I/DEBUG   ( 1929):     #18  pc 0005f8f1  /system/lib/libdvm.so (dvmC
allMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+272)
Stack frame I/DEBUG   ( 1929):     #19  pc 00049773  /system/lib/libdvm.so
Stack frame I/DEBUG   ( 1929):     #20  pc 0004c359  /system/lib/libandroid_runt
ime.so
Stack frame I/DEBUG   ( 1929):     #21  pc 0004d45f  /system/lib/libandroid_runt
ime.so (android::AndroidRuntime::start(char const*, char const*)+390)
Stack frame I/DEBUG   ( 1929):     #22  pc 00000dcf  /system/bin/app_process
사악미소님 이게 맞나여?
네 맞습니다. 그냥 VM에서 so 로드하다 실패 했네요.. 컴파일 옵션 중에서 지원 못하는 부분 있는 듯 합니다.
특히 OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8 -mthumb -D__thumb__ " 이쪽 부분에서
 -mthumb 부분이 의심 스럽네요..
단말에서 thumb 명령어를 지원 못하면 에러가 날 수 있습니다.
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8" 로 변경해서 빌드 해보세요...
그래도 안된다면, SW 디코딩 속도가 늦긴 하겠지만. NEON으로 빌드된 libffmpeg-neon.so  가 아닌 libffmpeg.so 가 로드되게 해 보시는 것도 방법입니다.
일단 neon빼고해봤습니다
********** Crash dump: **********
Build fingerprint: 'samsung/c1ktt/c1ktt:4.3/JSS15J/E210KKKUGND3:user/release-key
s'
pid: 17452, tid: 17452, name: mple.ffmpegplay  >>> com.example.ffmpegplay <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
Stack frame I/DEBUG   ( 1944):     #00  pc 0001e824  /system/lib/libc.so
Stack frame I/DEBUG   ( 1944):     #01  pc 0001c76c  /system/lib/libc.so (abort+
4)
Stack frame I/DEBUG   ( 1944):     #02  pc 002bd2bc  /data/app-lib/com.example.f
fmpegplay-2/libffmpegng.so: Routine __check_for_sync8_kernelhelper at /s/ndk-too
lchain/src/build/../gcc/gcc-4.6/libgcc/../gcc/config/arm/linux-atomic-64bit.c:64

Stack frame I/DEBUG   ( 1944):     #03  pc 000026a5  /system/bin/linker
Stack frame I/DEBUG   ( 1944):     #04  pc 0000277b  /system/bin/linker
Stack frame I/DEBUG   ( 1944):     #05  pc 000028cd  /system/bin/linker
Stack frame I/DEBUG   ( 1944):     #06  pc 0000288d  /system/bin/linker
Stack frame I/DEBUG   ( 1944):     #07  pc 0000294b  /system/bin/linker
Stack frame I/DEBUG   ( 1944):     #08  pc 00000f0b  /system/bin/linker
Stack frame I/DEBUG   ( 1944):     #09  pc 00050821  /system/lib/libdvm.so (dvmL
oadNativeCode(char const*, Object*, char**)+180)
Stack frame I/DEBUG   ( 1944):     #10  pc 00067905  /system/lib/libdvm.so
Stack frame I/DEBUG   ( 1944):     #11  pc 000278e0  /system/lib/libdvm.so
Stack frame I/DEBUG   ( 1944):     #12  pc 0002be80  /system/lib/libdvm.so (dvmI
nterpret(Thread*, Method const*, JValue*)+184)
Stack frame I/DEBUG   ( 1944):     #13  pc 00060afd  /system/lib/libdvm.so (dvmC
allMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+292)
Stack frame I/DEBUG   ( 1944):     #14  pc 00060b27  /system/lib/libdvm.so (dvmC
allMethod(Thread*, Method const*, Object*, JValue*, ...)+20)
Stack frame I/DEBUG   ( 1944):     #15  pc 0006be71  /system/lib/libdvm.so (dvmI
nitClass+1020)
Stack frame I/DEBUG   ( 1944):     #16  pc 000672cf  /system/lib/libdvm.so
Stack frame I/DEBUG   ( 1944):     #17  pc 000278e0  /system/lib/libdvm.so
Stack frame I/DEBUG   ( 1944):     #18  pc 0002be80  /system/lib/libdvm.so (dvmI
nterpret(Thread*, Method const*, JValue*)+184)
Stack frame I/DEBUG   ( 1944):     #19  pc 00060dbb  /system/lib/libdvm.so (dvmI
nvokeMethod(Object*, Method const*, ArrayObject*, ArrayObject*, ClassObject*, bo
ol)+350)
Stack frame I/DEBUG   ( 1944):     #20  pc 00068a7f  /system/lib/libdvm.so
Stack frame I/DEBUG   ( 1944):     #21  pc 000278e0  /system/lib/libdvm.so
Stack frame I/DEBUG   ( 1944):     #22  pc 0002be80  /system/lib/libdvm.so (dvmI
nterpret(Thread*, Method const*, JValue*)+184)
Stack frame I/DEBUG   ( 1944):     #23  pc 00060afd  /system/lib/libdvm.so (dvmC
allMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+292)
Stack frame I/DEBUG   ( 1944):     #24  pc 0004a57b  /system/lib/libdvm.so
Stack frame I/DEBUG   ( 1944):     #25  pc 00054e63  /system/lib/libandroid_runt
ime.so
Stack frame I/DEBUG   ( 1944):     #26  pc 0005638b  /system/lib/libandroid_runt
ime.so (android::AndroidRuntime::start(char const*, char const*)+378)
Stack frame I/DEBUG   ( 1944):     #27  pc 0000105b  /system/bin/app_process
Stack frame I/DEBUG   ( 1944):     #28  pc 0000dc4f  /system/lib/libc.so (__libc
_init+50)
Stack frame I/DEBUG   ( 1944):     #29  pc 00000d7c  /system/bin/app_process
Crash dump is completed

그리고 이건 빌드 할때 사용한겁니다
#!/bin/bash
#
# build_android.sh
# Copyright (c) 2012 Jacek Marchwicki
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

export NDK=$ANDROID_NDK_ROOT

if [ "$NDK" = "" ]; then
    echo NDK variable not set, exiting
    echo "Use: export NDK=/your/path/to/android-ndk"
    exit 1
fi

OS=`uname -s | tr '[A-Z]' '[a-z]'`
function build_ffmpeg
{
    PLATFORM=$NDK/platforms/$PLATFORM_VERSION/arch-$ARCH/
    CC=$PREBUILT/bin/$EABIARCH-gcc
    CROSS_PREFIX=$PREBUILT/bin/$EABIARCH-
    PKG_CONFIG=${CROSS_PREFIX}pkg-config
    if [ ! -f $PKG_CONFIG ];
    then
        cat > $PKG_CONFIG << EOF
#!/bin/bash
pkg-config \$*
EOF
        chmod u+x $PKG_CONFIG
    fi
    NM=$PREBUILT/bin/$EABIARCH-nm
    cd ffmpeg
    export PKG_CONFIG_LIBDIR=$(pwd)/$PREFIX/lib/pkgconfig/
    export PKG_CONFIG_PATH=$(pwd)/$PREFIX/lib/pkgconfig/
     ./configure --target-os=linux \
      --prefix=$PREFIX \
       --enable-cross-compile \
        --extra-libs="-lgcc" \
        --arch=$ARCH \
        --cc=$CC \
        --cross-prefix=$CROSS_PREFIX \
        --nm=$NM \
        --sysroot=$PLATFORM \
          --extra-cflags=" -O3 -DANDROID -DHAVE_SYS_UIO_H=1 -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -finline-limit=300 $OPTIMIZE_CFLAGS " \
        --disable-shared \
        --enable-static \
        --enable-runtime-cpudetect \
        --extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib  -nostdlib -lc -lm -ldl -llog -L$PREFIX/lib" \
        --extra-cflags="-I$PREFIX/include" \
          --disable-everything \
    --enable-demuxer=mov \
    --enable-demuxer=h264 \
    --disable-ffplay \
    --enable-protocol=file \
    --enable-avformat \
    --enable-avcodec \
    --enable-decoder=rawvideo \
    --enable-decoder=mjpeg \
    --enable-decoder=h263 \
    --enable-decoder=mpeg4 \
    --enable-decoder=h264 \
    --enable-parser=h264 \
    --disable-network \
    --enable-zlib \
    --disable-avfilter \
    --disable-avdevice \
    --enable-pthreads \
        $ADDITIONAL_CONFIGURE_FLAG \
        || exit 1
    make clean || exit 1
    make -j4 install || exit 1

    cd ..
}

function build_one {
    cd ffmpeg
    PLATFORM=$NDK/platforms/$PLATFORM_VERSION/arch-$ARCH/
    #$PREBUILT/bin/$EABIARCH-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$PREFIX/lib  -soname $SONAME -shared -nostdlib  -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o $OUT_LIBRARY -lavcodec -lavformat -lavresample -lavutil -lswresample -lass -lfreetype -lfribidi -lswscale -lvo-aacenc -lvo-amrwbenc -lc -lm -lz -ldl -llog  --warn-once  --dynamic-linker=/system/bin/linker -zmuldefs $PREBUILT/lib/gcc/$EABIARCH/4.6/libgcc.a || exit 1
    $PREBUILT/bin/$EABIARCH-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$PREFIX/lib  -soname $SONAME -shared -nostdlib -z noexecstack -Bsymbolic --whole-archive --no-undefined -o $OUT_LIBRARY -lavcodec -lavformat -lavutil -lswresample -lswscale -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker -zmuldefs $PREBUILT/lib/gcc/$EABIARCH/4.6/libgcc.a || exit 1
    cd ..
}

#arm v5
EABIARCH=arm-linux-androideabi
ARCH=arm
CPU=armv5
OPTIMIZE_CFLAGS="-marm -march=$CPU"
PREFIX=../ffmpeg-build/armeabi
OUT_LIBRARY=$PREFIX/libffmpegng.so
ADDITIONAL_CONFIGURE_FLAG=
SONAME=libffmpegng.so
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/$OS-x86_64
PLATFORM_VERSION=android-9
build_ffmpeg
build_one
분명 최적화 옵션이 문제일텐데.. 정확히 어떤 것인지 알 수가 없없네요..extra-cflags 의  -O3 -Dipv6mr_interface=ipv6mr_ifindex -fasm -Wno-psabi -fno-short-enums -finline-limit=300  같은 것 중 한개가 문제일 수도 있을 듯 합니다. 제거해서 빌드 해보시고 마찬가지라면,
다른 ffmpeg 빌드 코드를 가져와 옵션을 비교 해 보실 수 밖에 없을 듯 합니다.

아래 URL이 각각 Rockplayer, MX Player, DicePlayer쪽 ffmpeg 빌드  정보입니다. 보시고 컴파일 옵션을 맞춰 보세요.
http://www.rockplayer.com/rp2/opensource.html
https://sites.google.com/site/mxvpen/ffmpeg
http://diceplayer.inisoft.co.kr/technical-note
...